Main.cs 38 KB

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