private void SelectSkeleton() { int n = toolStripComboBox2.SelectedIndex; if (n == -1) { return; } EBX ebx; switch (n) { case 0: skeleton = null; if (DXHelper.objects.Count > 1) { DXHelper.objects.Remove(DXHelper.objects[1]); } break; case 1: try { OpenFileDialog openSkelFileDialog = new OpenFileDialog(); openSkelFileDialog.Title = "Select skeleton file"; openSkelFileDialog.Filter = "*.bin|*.bin"; if (openSkelFileDialog.ShowDialog() == DialogResult.OK) { ebx = new EBX(new MemoryStream(File.ReadAllBytes(openSkelFileDialog.FileName))); skeleton = new SkeletonAsset(ebx); RenderObject skel = MakeSkeletonMesh(skeleton); for (int i = 0; i < skel.vertices.Length; i++) { skel.vertices[i].X -= mid.X; skel.vertices[i].Y -= mid.Y; skel.vertices[i].Z -= mid.Z; } skel.InitGeometry(); if (DXHelper.objects.Count == 2) { DXHelper.objects[1] = skel; } else { DXHelper.objects.Add(skel); } } } catch { } break; default: try { string sha1 = skeletons[toolStripComboBox2.Items[n].ToString()]; ebx = new EBX(new MemoryStream(main.Host.getDataBySha1(Helpers.HexStringToByteArray(sha1)))); skeleton = new SkeletonAsset(ebx); RenderObject skel = MakeSkeletonMesh(skeleton); for (int i = 0; i < skel.vertices.Length; i++) { skel.vertices[i].X -= mid.X; skel.vertices[i].Y -= mid.Y; skel.vertices[i].Z -= mid.Z; } skel.InitGeometry(); if (DXHelper.objects.Count == 2) { DXHelper.objects[1] = skel; } else { DXHelper.objects.Add(skel); } } catch { } break; } }
private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e) { int n = toolStripComboBox1.SelectedIndex; byte[] id = mesh.lods[n].chunkID; string sid = Helpers.ByteArrayToHexString(id); rawLodBuffer = null; hb2.ByteProvider = new DynamicByteProvider(new byte[0]); foreach (ChunkInfo chunk in chunks) { if (chunk.id == sid) { rawLodBuffer = main.Host.getDataBySha1(chunk.sha1); hb2.ByteProvider = new DynamicByteProvider(rawLodBuffer); break; } } if (rawLodBuffer != null) { mesh.lods[n].LoadVertexData(new MemoryStream(rawLodBuffer)); timer1.Enabled = false; List <RawVector3> verts = new List <RawVector3>(); for (int i = 0; i < mesh.lods[n].sections.Count; i++) { MeshLodSection sec = mesh.lods[n].sections[i]; foreach (ushort idx in sec.indicies) { Vertex v = sec.vertices[idx]; if (v.position.members.Length == 3) { verts.Add(new RawVector3(v.position.members[0], v.position.members[1], v.position.members[2])); } } } RawVector3 min = new RawVector3(10000, 10000, 10000); RawVector3 max = new RawVector3(-10000, -10000, -10000); foreach (RawVector3 v in verts) { if (v.X < min.X) { min.X = v.X; } if (v.Y < min.Y) { min.Y = v.Y; } if (v.Z < min.Z) { min.Z = v.Z; } if (v.X > max.X) { max.X = v.X; } if (v.Y > max.Y) { max.Y = v.Y; } if (v.Z > max.Z) { max.Z = v.Z; } } mid = new RawVector3((min.X + max.X) / 2f, (min.Y + max.Y) / 2f, (min.Z + max.Z) / 2f); DXHelper.CamDis = (float)Math.Sqrt(Math.Pow(max.X - mid.X, 2) + Math.Pow(max.Y - mid.Y, 2) + Math.Pow(max.Z - mid.Z, 2)) * 1.5f; if (DXHelper.CamDis < 1f) { DXHelper.CamDis = 1f; } for (int i = 0; i < verts.Count; i++) { RawVector3 v = verts[i]; v.X -= mid.X; v.Y -= mid.Y; v.Z -= mid.Z; verts[i] = v; } RenderObject ro = new RenderObject(DXHelper.device, RenderObject.RenderType.TriListWire, DXHelper.pixelShader); ro.vertices = verts.ToArray(); ro.InitGeometry(); DXHelper.objects = new List <RenderObject>(); DXHelper.objects.Add(ro); if (skeleton != null) { RenderObject skel = MakeSkeletonMesh(skeleton); for (int i = 0; i < skel.vertices.Length; i++) { skel.vertices[i].X -= mid.X; skel.vertices[i].Y -= mid.Y; skel.vertices[i].Z -= mid.Z; } skel.InitGeometry(); DXHelper.objects.Add(skel); } timer1.Enabled = true; } }