Main.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  1. using System;
  2. using System.Threading.Tasks;
  3. using System.Windows.Forms;
  4. using System.Collections.Generic;
  5. using System.IO.Compression;
  6. using SlimDX;
  7. using SlimDX.D3DCompiler;
  8. using SlimDX.Direct3D11;
  9. using SlimDX.DXGI;
  10. using SlimDX.Windows;
  11. using Device = SlimDX.Direct3D11.Device;
  12. using Resource = SlimDX.Direct3D11.Resource;
  13. using Buffer = SlimDX.Direct3D11.Buffer;
  14. using Everquest2.Util;
  15. using Everquest2.Visualization;
  16. using System.IO;
  17. using SlimDX.DirectInput;
  18. using SlimDX.Direct2D;
  19. using System.Security.Permissions;
  20. namespace EQ2ModelViewer
  21. {
  22. public partial class frmMain : Form
  23. {
  24. private System.Collections.Generic.List<Model> m_Models = new System.Collections.Generic.List<Model>();
  25. private System.Collections.Generic.List<VeRegion> m_Regions = new System.Collections.Generic.List<VeRegion>();
  26. private GraphicClass Graphics = new GraphicClass();
  27. public Model SelectedModel = null;
  28. private string ZoneFile;
  29. private bool Render3DAspect = true;
  30. private bool AutoExportOnLoad = false;
  31. private String AutoLoadFileName = "";
  32. public frmMain()
  33. {
  34. InitializeComponent();
  35. }
  36. private void exitToolStripMenuItem_Click(object sender, EventArgs e)
  37. {
  38. Close();
  39. }
  40. private void CleanUp()
  41. {
  42. foreach (Model model in m_Models)
  43. model.ShutDown();
  44. if (Graphics != null)
  45. Graphics.ShutDown();
  46. }
  47. private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
  48. {
  49. CleanUp();
  50. }
  51. private Key hitKey = Key.NoConvert;
  52. double timestamp = 0;
  53. private CameraClass camera;
  54. int region_nodes = 0;
  55. private void frmMain_Load(object sender, EventArgs e)
  56. {
  57. this.WindowState = FormWindowState.Maximized;
  58. Graphics.Initialize(pGraphics);
  59. /*LightShaderClass lightShader = new LightShaderClass();
  60. lightShader.Initialize(Graphics.Device);*/
  61. camera = new CameraClass();
  62. // Initialize a base view matrix for 2D rendering
  63. camera.SetPosition(0.0f, 0.0f, -1.0f);
  64. camera.Render();
  65. Matrix baseViewMatrix = camera.GetViewMatrix();
  66. // now set the cameras starting position
  67. camera.SetPosition(0.0f, 1.50f, -3.0f);
  68. PositionClass position = new PositionClass();
  69. position.SetPosition(0.0f, 1.50f, -3.0f);
  70. InputClass input = new InputClass();
  71. input.Initialize(this);
  72. TimerClass timer = new TimerClass();
  73. timer.Initialize();
  74. FPSClass fps = new FPSClass();
  75. fps.Initialize();
  76. TextClass text = new TextClass();
  77. text.Initialize(Graphics.Device, Graphics.Context, pGraphics.ClientSize.Width, pGraphics.ClientSize.Height, baseViewMatrix);
  78. BitmapClass bmp = new BitmapClass();
  79. bmp.Initialize(Graphics.Device, pGraphics.ClientSize.Width, pGraphics.ClientSize.Height, "Background.bmp", 145, 220, baseViewMatrix);
  80. string[] args = Environment.GetCommandLineArgs();
  81. if (args.Length > 1)
  82. {
  83. for (int i = 1; i < args.Length; i++)
  84. {
  85. string cmd = args[i].ToLower();
  86. if (cmd.Equals("norender"))
  87. {
  88. Render3DAspect = false;
  89. }
  90. else if (cmd.Equals("export"))
  91. {
  92. AutoExportOnLoad = true;
  93. }
  94. else
  95. {
  96. AutoLoadFileName = args[i];
  97. break;
  98. }
  99. }
  100. }
  101. if (AutoLoadFileName.Length > 0)
  102. LoadZoneFile(AutoLoadFileName);
  103. if (AutoExportOnLoad)
  104. exportToolStripMenuItem_Click(null, EventArgs.Empty);
  105. if (!Render3DAspect)
  106. {
  107. Application.Exit();
  108. return;
  109. }
  110. // FrustumClass frustum = new FrustumClass();
  111. try
  112. {
  113. MessagePump.Run(this, () =>
  114. {
  115. if (!Graphics.SwapChain.Disposed) {
  116. timer.Frame();
  117. fps.Frame();
  118. // Input code
  119. input.Frame();
  120. position.SetFrameTime(timer.GetTime());
  121. if (this.Focused)
  122. {
  123. if (input.IsKeyPressed(SlimDX.DirectInput.Key.LeftShift) ||
  124. input.IsKeyPressed(SlimDX.DirectInput.Key.RightShift))
  125. position.m_ShiftDown = true;
  126. else
  127. position.m_ShiftDown = false;
  128. position.TurnLeft(input.IsLeftPressed());
  129. position.TurnRight(input.IsRightPressed());
  130. position.MoveForward(input.IsUpPressed());
  131. position.MoveBackward(input.IsDownPressed());
  132. position.MoveUpward(input.IsAPressed());
  133. position.MoveDownward(input.IsZPressed());
  134. position.LookUpward(input.IsPgUpPressed());
  135. position.LookDownward(input.IsPgDownPressed());
  136. if (input.IsLeftMousePressed())
  137. {
  138. TestIntersection(input.GetMouseX(), input.GetMouseY());
  139. }
  140. if (SelectedModel != null)
  141. {
  142. if (input.IsKeyPressed(SlimDX.DirectInput.Key.Delete))
  143. {
  144. m_Models.Remove(SelectedModel);
  145. SelectedModel = null;
  146. }
  147. else if (input.IsKeyPressed(SlimDX.DirectInput.Key.Escape))
  148. {
  149. SelectedModel = null;
  150. }
  151. if (input.IsKeyPressed(SlimDX.DirectInput.Key.LeftControl))
  152. {
  153. if (hitKey == Key.NoConvert)
  154. {
  155. if (input.IsKeyPressed(SlimDX.DirectInput.Key.R))
  156. hitKey = Key.R;
  157. else if (input.IsKeyPressed(SlimDX.DirectInput.Key.T))
  158. hitKey = Key.T;
  159. else if (input.IsKeyPressed(SlimDX.DirectInput.Key.Y))
  160. hitKey = Key.Y;
  161. }
  162. double curTime = (DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;
  163. if ((curTime - timestamp) > 50)
  164. {
  165. if (hitKey == Key.R)
  166. {
  167. if (input.IsKeyReleased(SlimDX.DirectInput.Key.R))
  168. hitKey = Key.NoConvert;
  169. SelectedModel.Rotation += new Vector3(0.01f, 0.0f, 0.0f);
  170. timestamp = curTime;
  171. }
  172. else if (hitKey == Key.T)
  173. {
  174. if (input.IsKeyReleased(SlimDX.DirectInput.Key.T))
  175. hitKey = Key.NoConvert;
  176. SelectedModel.Rotation += new Vector3(0.0f, 0.01f, 0.0f);
  177. timestamp = curTime;
  178. }
  179. else if (hitKey == Key.Y)
  180. {
  181. if (input.IsKeyReleased(SlimDX.DirectInput.Key.Y))
  182. hitKey = Key.NoConvert;
  183. SelectedModel.Rotation += new Vector3(0.0f, 0.0f, 0.01f);
  184. timestamp = curTime;
  185. }
  186. if (SelectedModel.Rotation.X > 360.0f)
  187. SelectedModel.Rotation.X = 0.0f;
  188. if (SelectedModel.Rotation.Y > 360.0f)
  189. SelectedModel.Rotation.Y = 0.0f;
  190. if (SelectedModel.Rotation.Z > 360.0f)
  191. SelectedModel.Rotation.Z = 0.0f;
  192. }
  193. }
  194. }
  195. }
  196. camera.SetPosition(position.GetPosition());
  197. camera.SetRotation(position.GetRotation());
  198. // Render Code
  199. Graphics.BeginScene();
  200. // 3D
  201. // View matrix
  202. camera.Render();
  203. //frustum.ConstructFrustum(1000.0f, Graphics.GetProjectionMatrix(), camera.GetViewMatrix());
  204. foreach (Model model in m_Models) {
  205. //if (frustum.CheckSphere(model.Position.X, model.Position.Y, model.Position.Z, 10.0f))
  206. //{
  207. /*Matrix temp = Matrix.Multiply(Graphics.GetWorldMatrix(), Matrix.Scaling(model.Scale, model.Scale, model.Scale));
  208. temp = Matrix.Multiply(temp, Matrix.RotationYawPitchRoll(model.Rotation.X, model.Rotation.Y, model.Rotation.Z));
  209. temp = Matrix.Multiply(temp, Matrix.Translation(model.Position.X, model.Position.Y, model.Position.Z));*/
  210. model.Render(Graphics, camera, (model == SelectedModel)/*Graphics.Context*/);
  211. //lightShader.Render(Graphics.Context, model.GetIndexCount(), temp, camera.GetViewMatrix(), Graphics.GetProjectionMatrix(), model.GetTexture(), new Vector3(0.0f, 0.0f, 0.0f), new Vector4(1.0f, 1.0f, 1.0f, 1.0f), new Vector4(0.0f, 0.0f, 0.0f, 0.0f), camera.GetPosition(), new Vector4(0.0f, 0.0f, 0.0f, 0.0f), 0.0f);
  212. //}
  213. }
  214. // 2D
  215. Graphics.TurnZBufferOff();
  216. Graphics.TurnOnAlphaBlending();
  217. bmp.Render(Graphics, 10, 10);
  218. text.SetFPS(fps.GetFPS(), Graphics.Context);
  219. text.SetPosition(position.GetPosition(), Graphics.Context);
  220. text.SetSelectedModel(SelectedModel, Graphics.Context);
  221. text.Render(Graphics.Context, Graphics.GetWorldMatrix(), Graphics.GetOrthoMatrix());
  222. Graphics.TurnOffAlphaBlending();
  223. Graphics.TurnZBufferOn();
  224. Graphics.EndScene();
  225. }
  226. });
  227. }
  228. catch (Exception exception) { }
  229. }
  230. public bool TestIntersection(int mouseX, int mouseY) {
  231. float pointX, pointY;
  232. Matrix projectionMatrix, viewMatrix, inverseViewMatrix;
  233. projectionMatrix = Graphics.GetProjectionMatrix();
  234. pointX = (2.0F * (float)mouseX / (float)pGraphics.ClientSize.Width - 1.0f) / projectionMatrix.M11;
  235. pointY = (-2.0f * (float)mouseY / (float)pGraphics.ClientSize.Height + 1.0f) / projectionMatrix.M22;
  236. Ray ray = new Ray(new Vector3(), new Vector3(pointX, pointY, 1.0f));
  237. viewMatrix = camera.GetViewMatrix();
  238. inverseViewMatrix = Matrix.Invert(viewMatrix);
  239. ray = new Ray(Vector3.TransformCoordinate(ray.Position, inverseViewMatrix), Vector3.TransformNormal(ray.Direction, inverseViewMatrix));
  240. ray.Direction.Normalize();
  241. float selectionDistance = 0.0f;
  242. foreach (Model model in m_Models) {
  243. float distance = model.TestIntersection(ray, Graphics);
  244. if (distance > 0.0f && (selectionDistance == 0.0f || distance < selectionDistance)) {
  245. selectionDistance = distance;
  246. SelectedModel = model;
  247. }
  248. }
  249. return false;
  250. }
  251. public static void AppendLoadFile(String txt)
  252. {
  253. StreamWriter sw = File.AppendText("loaded.txt");
  254. sw.WriteLine(txt);
  255. sw.Close();
  256. }
  257. private void loadZoneToolStripMenuItem_Click(object sender, EventArgs e)
  258. {
  259. LoadZoneFile();
  260. }
  261. public String DirName = "";
  262. private void LoadZoneFile(String filename="")
  263. {
  264. bool isDrawFile = false;
  265. string fullName = "";
  266. DirName = "";
  267. if (filename.Length < 1)
  268. {
  269. OpenFileDialog fd = new OpenFileDialog();
  270. fd.Filter = "lut/draw files (*.lut;*.draw)|*.lut;*.draw|lut files (*.lut)|*.lut|draw files (*.draw)|*.draw";
  271. if (fd.ShowDialog() == DialogResult.OK)
  272. {
  273. AppendLoadFile("===================================================");
  274. AppendLoadFile("Loading " + fd.FileName);
  275. if (fd.FileName.EndsWith(".draw"))
  276. {
  277. isDrawFile = true;
  278. string temp = fd.FileName.Substring(0, fd.FileName.LastIndexOf("\\"));
  279. ZoneFile = fd.SafeFileName.Substring(0, fd.SafeFileName.IndexOf(".draw"));
  280. fullName = ZoneFile;
  281. DirName = temp;
  282. filename = fd.FileName;
  283. }
  284. else
  285. {
  286. string temp = fd.FileName.Substring(0, fd.FileName.IndexOf("zones"));
  287. ZoneFile = fd.SafeFileName.Substring(0, fd.SafeFileName.IndexOf(".lut"));
  288. fullName = ZoneFile;
  289. DirName = temp;
  290. filename = fd.FileName;
  291. }
  292. }
  293. }
  294. else
  295. {
  296. if (filename.EndsWith(".draw"))
  297. {
  298. isDrawFile = true;
  299. string temp = filename.Substring(0, filename.LastIndexOf("\\"));
  300. ZoneFile = filename.Substring(0, filename.IndexOf(".draw"));
  301. fullName = filename;
  302. DirName = temp;
  303. }
  304. else
  305. {
  306. string temp = filename.Substring(0, filename.IndexOf("zones"));
  307. ZoneFile = filename.Substring(0, filename.IndexOf(".lut"));
  308. fullName = filename;
  309. DirName = temp;
  310. }
  311. }
  312. if (isDrawFile)
  313. {
  314. Model tmpModel = new Model();
  315. string[] textures = new string[1];
  316. textures[0] = "goblin_ice.dds";
  317. tmpModel.Initialize(Graphics.Device, filename, textures);
  318. tmpModel.Position.X = 0;
  319. tmpModel.Position.Y = 0;
  320. tmpModel.Position.Z = 0;
  321. tmpModel.Rotation.X = 0;
  322. tmpModel.Rotation.Y = 0;
  323. tmpModel.Rotation.Z = 0;
  324. tmpModel.Scale = 1;
  325. tmpModel.WidgetID = 1;
  326. tmpModel.GridID = 1;
  327. m_Models.Add(tmpModel);
  328. return;
  329. }
  330. if (fullName.Length < 1)
  331. {
  332. MessageBox.Show("No filename provided for loading a zonefile!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
  333. return;
  334. }
  335. region_nodes = 0;
  336. System.IO.BinaryReader reader2 = new System.IO.BinaryReader(new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read));
  337. // Image(2020): Was ReadUint32, qey_harbor.lut however has 00 1F 00 7A, so that as an int32 is a very large number!
  338. reader2.ReadUInt32();
  339. do
  340. {
  341. if (reader2.BaseStream.Position + 2 >= reader2.BaseStream.Length)
  342. {
  343. break;
  344. }
  345. UInt16 size = reader2.ReadUInt16();
  346. string file = new string(reader2.ReadChars(size));
  347. // was duplicating drive name
  348. file = file.Replace("/", "\\");
  349. file = DirName + file;
  350. AppendLoadFile("VOC Loading: " + file);
  351. if ( file.Contains("qey_harbor_qey_terrain_harbor_geo05_rmob_0"))
  352. {
  353. int test = 0;
  354. }
  355. Eq2Reader reader = new Eq2Reader(new System.IO.FileStream(file, System.IO.FileMode.Open, System.IO.FileAccess.Read));
  356. VeNode venode = reader.ReadNodeObject();
  357. CheckNode(DirName, venode, false, null, null);
  358. //MessageBox.Show("Done!");
  359. // 16 bytes between file names, grid id's maybe?
  360. reader2.ReadBytes(16);
  361. } while (true);
  362. }
  363. float x, y, z = 0;
  364. float yaw, pitch, roll = 0;
  365. float scale = 0;
  366. UInt32 widgetID;
  367. UInt32 regionMapVersion = 1;
  368. private void toolStripMenuItemExportWater_Click(object sender, EventArgs e)
  369. {
  370. StreamWriter swfile = new StreamWriter(ZoneFile + ".regionread");
  371. using (BinaryWriter file = new BinaryWriter(File.Open(ZoneFile + ".EQ2Region", FileMode.Create)))
  372. {
  373. file.Write(ZoneFile);
  374. file.Write(regionMapVersion);
  375. file.Write(m_Regions.Count);
  376. Int32 regionNum = 0;
  377. foreach (VeRegion region in m_Regions)
  378. {
  379. file.Write(regionNum);
  380. regionNum += 1;
  381. Int32 node = 0;
  382. file.Write(region.region_type);
  383. file.Write(region.unk4[0]);
  384. file.Write(region.unk4[1]);
  385. file.Write(region.unk4[2]);
  386. file.Write(region.unk5);
  387. file.Write(region.vert_count);
  388. swfile.WriteLine();
  389. swfile.WriteLine("REGION: " + region.unk4[0] + " " + region.unk4[1] + " " + region.unk4[2] + " " + region.unk5 + " - RegionType: " + region.region_type);
  390. for (ushort i = 0; i < region.vert_count; ++i)
  391. {
  392. Int32 regiontype = 1;
  393. Int32 special = 0;
  394. swfile.WriteLine(node + " " + region.m_normals[i, 0] + " " + region.m_normals[i, 1] + " " +
  395. region.m_normals[i, 2] + " " + region.m_distance[i] + " " + regiontype + " " + special + " " +
  396. region.m_childindex[i, 0] + " " + region.m_childindex[i, 1]);
  397. file.Write(node);
  398. node += 1;
  399. file.Write(region.m_normals[i, 0]);
  400. file.Write(region.m_normals[i, 1]);
  401. file.Write(region.m_normals[i, 2]);
  402. file.Write(region.m_distance[i]);
  403. file.Write(regiontype);
  404. file.Write(special);
  405. file.Write((Int32)region.m_childindex[i, 0]);
  406. file.Write((Int32)region.m_childindex[i, 1]);
  407. }
  408. }
  409. file.Close();
  410. }
  411. swfile.Close();
  412. }
  413. UInt32 GridID;
  414. private void CheckNode(string temp, object item, bool parentXform, object next, object parentNode)
  415. {
  416. if (item is VeMeshGeometryNode)
  417. {
  418. widgetID = ((VeNode)item).WidgetID;
  419. // testing antonica spires which are not oriented correctly
  420. //if ( widgetID == 2990295910 )
  421. // testing tutorial_island02 boat
  422. //if (== 1253219127)
  423. // tutorial_island02 water
  424. if(widgetID == 337652899)
  425. {
  426. int test = 0;
  427. }
  428. if(widgetID == 625647901)
  429. {
  430. int test = 0;
  431. }
  432. Model model = new Model();
  433. model.Initialize(Graphics.Device, (VeMeshGeometryNode)item, temp);
  434. model.Position.X = x;
  435. model.Position.Y = y;
  436. model.Position.Z = z;
  437. model.Rotation.X = yaw;
  438. model.Rotation.Y = pitch;
  439. model.Rotation.Z = roll;
  440. model.Scale = scale;
  441. model.WidgetID = widgetID;
  442. model.GridID = GridID;
  443. m_Models.Add(model);
  444. }
  445. else
  446. {
  447. if (widgetID == 2720558016)
  448. {
  449. int test = 0;
  450. }
  451. float x1 = 0.0f;
  452. float y1 = 0.0f;
  453. float z1 = 0.0f;
  454. if (item is VeEnvironmentNode)
  455. {
  456. VeEnvironmentNode env = (VeEnvironmentNode)item;
  457. if (env.regionDefinitionFile != null && env.regionDefinitionFile.Length > 0)
  458. {
  459. bool watervol = env.regionDefinitionFile.Contains("watervol");
  460. bool waterregion = env.regionDefinitionFile.Contains("waterregion");
  461. bool waterregion2 = env.regionDefinitionFile.Contains("water_region");
  462. bool iswater = env.regionDefinitionFile.Contains("water");
  463. bool isocean = env.regionDefinitionFile.Contains("ocean");
  464. if (watervol || waterregion || waterregion2 || iswater || isocean)
  465. {
  466. Eq2Reader reader2 = new Eq2Reader(new System.IO.FileStream(DirName + env.regionDefinitionFile, System.IO.FileMode.Open, System.IO.FileAccess.Read));
  467. VeRegion region = (VeRegion)reader2.ReadObject();
  468. region.parentNode = env;
  469. region.region_type = 0; // default water volume
  470. if (waterregion) // 'sea'/ocean/waterregion in tutorial_island02 / qeynos_harbor
  471. region.region_type = 1;
  472. else if (waterregion2)
  473. region.region_type = 2;
  474. else if (isocean && !iswater) // ocean in frostfang(halas)
  475. region.region_type = 3;
  476. else if (isocean && iswater) // caves in frostfang(halas)
  477. region.region_type = 4;
  478. MeshClass tmpMesh = new MeshClass();
  479. region_nodes += region.vert_count;
  480. m_Regions.Add(region);
  481. }
  482. }
  483. }
  484. else if (item is VeRoomItemNode)
  485. {
  486. yaw = ((VeRoomItemNode)item).orientation[0];
  487. pitch = ((VeRoomItemNode)item).orientation[1];
  488. roll = ((VeRoomItemNode)item).orientation[2];
  489. GridID = ((VeRoomItemNode)item).myId_grid;
  490. }
  491. else if (item is VeXformNode)
  492. {
  493. VeXformNode tmp = (VeXformNode)item;
  494. x1 = ((VeXformNode)item).position[0];
  495. y1 = ((VeXformNode)item).position[1];
  496. z1 = ((VeXformNode)item).position[2];
  497. if ( x1 < -16.39 && x1 > -16.41)
  498. {
  499. int test = 0;
  500. }
  501. if (parentXform)
  502. {
  503. yaw += (((VeXformNode)item).orientation[0]) * (3.141592654f / 180.0f);
  504. pitch += (((VeXformNode)item).orientation[1]) * (3.141592654f / 180.0f);
  505. roll += (((VeXformNode)item).orientation[2]) * (3.141592654f / 180.0f);
  506. }
  507. else
  508. {
  509. yaw = (((VeXformNode)item).orientation[0]) * (3.141592654f / 180.0f);
  510. pitch = (((VeXformNode)item).orientation[1]) * (3.141592654f / 180.0f);
  511. roll = (((VeXformNode)item).orientation[2]) * (3.141592654f / 180.0f);
  512. }
  513. scale = ((VeXformNode)item).scale;
  514. x += x1;
  515. y += y1;
  516. z += z1;
  517. }
  518. if (item != null)
  519. {
  520. float old_x = x, old_y = y, old_z = z;
  521. float old_yaw = yaw, old_pitch = pitch, old_roll = roll;
  522. float old_scale = scale;
  523. System.Collections.IEnumerator enumerator = ((VeNode)item).EnumerateChildren();
  524. bool parentBool = item is VeXformNode;
  525. if (enumerator.MoveNext())
  526. {
  527. object prevNode = null;
  528. do
  529. {
  530. object curNode = enumerator.Current;
  531. object nextNode = null;
  532. object newParentNode = parentNode;
  533. if (item is VeXformNode)
  534. newParentNode = item;
  535. else if ((item is VeSelectNode))
  536. newParentNode = item;
  537. if (enumerator.MoveNext())
  538. nextNode = enumerator.Current;
  539. if (prevNode != null && prevNode is VeXformNode)
  540. parentBool = false;
  541. CheckNode(temp, curNode, parentBool, nextNode, newParentNode);
  542. prevNode = curNode;
  543. if (nextNode == null)
  544. break;
  545. } while (true);
  546. }
  547. if (parentNode is VeSelectNode && parentBool && !parentXform)
  548. {
  549. x = old_x;
  550. y = old_y;
  551. z = old_z;
  552. yaw = old_yaw;
  553. pitch = old_pitch;
  554. roll = old_roll;
  555. x -= x1;
  556. y -= y1;
  557. z -= z1;
  558. }
  559. else if(parentNode is VeSelectNode && next == null)
  560. {
  561. x = 0;
  562. y = 0;
  563. z = 0;
  564. yaw = 0;
  565. pitch = 0;
  566. roll = 0;
  567. }
  568. else if(parentBool && next != null)
  569. {
  570. x = old_x;
  571. y = old_y;
  572. z = old_z;
  573. if (((VeNode)next).WidgetID != ((VeNode)item).WidgetID)
  574. {
  575. yaw = 0;
  576. pitch = 0;
  577. roll = 0;
  578. }
  579. else
  580. {
  581. yaw = old_yaw;
  582. pitch = old_pitch;
  583. roll = old_roll;
  584. }
  585. x -= x1;
  586. y -= y1;
  587. z -= z1;
  588. }
  589. else
  590. {
  591. x = old_x;
  592. y = old_y;
  593. z = old_z;
  594. yaw = old_yaw;
  595. pitch = old_pitch;
  596. roll = old_roll;
  597. x -= x1;
  598. y -= y1;
  599. z -= z1;
  600. }
  601. }
  602. }
  603. }
  604. public static string[] GetTextureFile(string[] spPath, string basePath)
  605. {
  606. string ret = "goblin_ice.dds";
  607. System.Collections.Generic.List<string> strings = new System.Collections.Generic.List<string>();
  608. int i = 0;
  609. while (i < spPath.Length /*&& ret == "goblin_ice.dds"*/)
  610. {
  611. Eq2Reader reader = new Eq2Reader(new System.IO.FileStream(basePath + spPath[i], System.IO.FileMode.Open, System.IO.FileAccess.Read));
  612. VeBase sp = reader.ReadObject();
  613. reader.Close();
  614. if (sp is VeShaderPalette)
  615. {
  616. bool found = false;
  617. for (int s = 0; s < ((VeShaderPalette)sp).shaderNames.Length; s++)
  618. {
  619. String fileName = basePath + ((VeShaderPalette)sp).shaderNames[s];
  620. fileName = fileName.Replace("/", "\\");
  621. System.IO.StreamReader reader2 = new System.IO.StreamReader(fileName);
  622. while (!reader2.EndOfStream)
  623. {
  624. string lineOrig = reader2.ReadLine();
  625. if (lineOrig.Contains("name = \"@tex") && !lineOrig.Contains("Blend") && !lineOrig.Contains("UVSet"))
  626. {
  627. String line = reader2.ReadLine();
  628. while (line.Length < 1)
  629. line = reader2.ReadLine();
  630. line = line.Substring(line.IndexOf('"') + 1);
  631. line = line.Substring(0, line.Length - 1);
  632. ret = basePath + line;
  633. strings.Add(ret);
  634. found = true;
  635. break;
  636. //break;
  637. }
  638. if (found)
  639. break;
  640. }
  641. reader2.Close();
  642. }
  643. }
  644. i++;
  645. }
  646. if (strings.Count == 0)
  647. strings.Add(ret);
  648. return strings.ToArray();
  649. }
  650. private void exportToolStripMenuItem_Click(object sender, EventArgs e)
  651. {
  652. //List<Vector3> MasterVertexList = new List<Vector3>();
  653. Dictionary<UInt32, List<Vector3>> MasterVertexList = new Dictionary<UInt32, List<Vector3>>();
  654. foreach (Model model in m_Models)
  655. {
  656. if (model.WidgetID == 1253219127)
  657. {
  658. int test = 0;
  659. }
  660. List<Vector3> VertexList = model.GetVertices();
  661. UInt32 grid = model.GridID;
  662. if (!MasterVertexList.ContainsKey(grid))
  663. MasterVertexList[grid] = new List<Vector3>();
  664. List<Vector3> convertedVertices = new List<Vector3>();
  665. foreach(Vector3 vect in VertexList)
  666. {
  667. Quaternion rotation = Quaternion.RotationYawPitchRoll(model.Rotation.X, model.Rotation.Y, model.Rotation.Z);
  668. var matrix = Matrix.Identity;
  669. Matrix.RotationQuaternion(ref rotation, out matrix);
  670. Matrix scaled = Matrix.Multiply(matrix, Matrix.Scaling(model.Scale, model.Scale, model.Scale));
  671. Vector3 result = Vector3.Add(Vector3.TransformNormal(vect, scaled), model.Position);
  672. convertedVertices.Add(result);
  673. }
  674. MasterVertexList[grid].AddRange(convertedVertices);
  675. }
  676. float minX = float.NaN;
  677. float minZ = float.NaN;
  678. float maxX = float.NaN;
  679. float maxZ = float.NaN;
  680. foreach (KeyValuePair<UInt32, List<Vector3>> entry in MasterVertexList)
  681. {
  682. foreach (Vector3 v in entry.Value)
  683. {
  684. if (float.IsNaN(minX))
  685. {
  686. minX = v.X;
  687. maxX = v.X;
  688. minZ = v.Z;
  689. maxZ = v.Z;
  690. }
  691. else
  692. {
  693. if (v.X < minX)
  694. minX = v.X;
  695. if (v.X > maxX)
  696. maxX = v.X;
  697. if (v.Z < minZ)
  698. minZ = v.Z;
  699. if (v.Z > maxZ)
  700. maxZ = v.Z;
  701. }
  702. }
  703. }
  704. using (StreamWriter file = new StreamWriter(ZoneFile + ".obj"))
  705. {
  706. // file.WriteLine(ZoneFile);
  707. // file.WriteLine("Min");
  708. // file.WriteLine(minX + " " + minZ);
  709. // file.WriteLine("Max");
  710. // file.WriteLine(maxX + " " + maxZ);
  711. // file.WriteLine("Grid count");
  712. // file.WriteLine(MasterVertexList.Count);
  713. // file.WriteLine();
  714. List<string> indices = new List<string>();
  715. int count = 0;
  716. string buildStr = "";
  717. int curcount = 0;
  718. foreach (KeyValuePair<UInt32, List<Vector3>> entry in MasterVertexList)
  719. {
  720. buildStr = "f ";
  721. // file.WriteLine("Grid");
  722. // file.WriteLine(entry.Key);
  723. // file.WriteLine("Face count");
  724. // file.WriteLine(entry.Value.Count);
  725. foreach (Vector3 v in entry.Value)
  726. {
  727. if (curcount > 2)
  728. {
  729. buildStr += count;
  730. indices.Add(buildStr);
  731. buildStr = "f ";
  732. curcount = 0;
  733. }
  734. else
  735. buildStr += count + " ";
  736. file.WriteLine("v " + v.X.ToString() + " " + v.Y.ToString()
  737. + " " + v.Z.ToString());
  738. count++;
  739. curcount++;
  740. }
  741. }
  742. foreach (string str in indices)
  743. {
  744. file.WriteLine(str);
  745. }
  746. file.Close();
  747. }
  748. using (BinaryWriter file = new BinaryWriter(File.Open(ZoneFile + ".EQ2Map", FileMode.Create)))
  749. {
  750. file.Write(ZoneFile);
  751. file.Write(minX);
  752. file.Write(minZ);
  753. file.Write(maxX);
  754. file.Write(maxZ);
  755. file.Write(MasterVertexList.Count);
  756. foreach (KeyValuePair<UInt32, List<Vector3>> entry in MasterVertexList)
  757. {
  758. file.Write(entry.Key);
  759. file.Write(entry.Value.Count);
  760. foreach (Vector3 v in entry.Value)
  761. {
  762. file.Write(v.X);
  763. file.Write(v.Y);
  764. file.Write(v.Z);
  765. }
  766. }
  767. file.Close();
  768. }
  769. FileInfo fileToCompress = new FileInfo(ZoneFile + ".EQ2Map");
  770. using (FileStream originalFileStream = fileToCompress.OpenRead())
  771. {
  772. if ((File.GetAttributes(fileToCompress.FullName) &
  773. FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz")
  774. {
  775. using (FileStream compressedFileStream = File.Create(ZoneFile + ".EQ2MapDeflated"))
  776. {
  777. using (GZipStream compressionStream = new GZipStream(compressedFileStream,
  778. CompressionMode.Compress))
  779. {
  780. originalFileStream.CopyTo(compressionStream);
  781. }
  782. }
  783. FileInfo info = new FileInfo(ZoneFile + ".EQ2MapDeflated");
  784. Console.WriteLine($"Compressed {fileToCompress.Name} from {fileToCompress.Length.ToString()} to {info.Length.ToString()} bytes.");
  785. }
  786. }
  787. if (sender != null)
  788. MessageBox.Show("Export Complete!");
  789. }
  790. }
  791. }