public void RecompileVertices(GXVertexDecompressor decompressor, GXVertexCompressor compressor) { if (VertsToImport != null) { for (int p = 0; p < VertsToImport.Count; p++) { if (p >= DOBJ.Polygons.Count) { MessageBox.Show("Error injecting vertices into DOBJ: Not enough polygons"); return; } DatPolygon poly = DOBJ.Polygons[p]; List <GXDisplayList> newDL = new List <GXDisplayList>(); // maximize vertex groups int size = 3; for (int i = 0; i < VertsToImport[p].Length; i += size) { List <GXVertex> VertList = new List <GXVertex>(); for (int j = 0; j < size; j += 3) { VertList.AddRange(new GXVertex[] { VertsToImport[p][i + j + 2], VertsToImport[p][i + j + 1], VertsToImport[p][i + j] }); } newDL.Add(compressor.CompressDisplayList( VertList.ToArray(), GXPrimitiveType.Triangles, poly.AttributeGroup)); } poly.DisplayLists = newDL; } VertsToImport = null; } else { foreach (DatPolygon p in DOBJ.Polygons) { List <GXDisplayList> newDL = new List <GXDisplayList>(); foreach (GXDisplayList dl in p.DisplayLists) { newDL.Add(compressor.CompressDisplayList( decompressor.GetFormattedVertices(dl, p), dl.PrimitiveType, p.AttributeGroup)); } p.DisplayLists = newDL; } } }
private void buttonImport_Click(object sender, EventArgs e) { Smd smd = new Smd(ModelSrc); DatJOBJ[] Bones = DOBJ.GetRoot().Root.GetJOBJinOrder(); VBN RenderBones = DOBJ.GetRoot().RenderBones; RenderBones.reset(); RenderBones.update(); VBN ImportedBones = smd.bones; GXAttribGroup AttrGroup = null; if (listBox1.SelectedIndex != -1) { AttrGroup = DOBJ.GetRoot().Root.Attributes[listBox1.SelectedIndex]; } else { MessageBox.Show("Please select an attribute group"); return; } DOBJ.ClearPolygons(null, null); int Flags = 0x8000; if (comboBoxBoneType.SelectedIndex == 0) { MessageBox.Show("Warning: no binds"); } if (comboBoxBoneType.SelectedIndex == 1) { Flags = 0xA001; } if (comboBoxBoneType.SelectedIndex == 2) // Rigged - needs to create bonelist { Flags = 0xA001; } DatPolygon p = new DatPolygon(); p.AttributeGroup = AttrGroup; p.Flags = Flags; p.ParentDOBJ = DOBJ.DOBJ; DOBJ.VertsToImport = new List <GXVertex[]>(); List <GXVertex> vert = new List <GXVertex>(); DatJOBJ parent = DOBJ.DOBJ.Parent; if (comboBoxBoneType.SelectedIndex == 1) { ImportedBones = RenderBones; } foreach (SmdTriangle t in smd.triangles) { if (comboBoxBoneType.SelectedIndex == 1) { // single bind t.v1.bones = new int[] { CBBone.SelectedIndex }; t.v1.weights = new float[] { 1 }; t.v2.bones = new int[] { CBBone.SelectedIndex }; t.v2.weights = new float[] { 1 }; t.v3.bones = new int[] { CBBone.SelectedIndex }; t.v3.weights = new float[] { 1 }; } List <DatBoneWeight> bwl1 = CreateWeightList(t.v1.bones, t.v1.weights, Bones, ImportedBones); List <DatBoneWeight> bwl2 = CreateWeightList(t.v2.bones, t.v2.weights, Bones, ImportedBones); List <DatBoneWeight> bwl3 = CreateWeightList(t.v3.bones, t.v3.weights, Bones, ImportedBones); int bid1 = GetWeightListIndex(p.BoneWeightList, bwl1); int bid2 = GetWeightListIndex(p.BoneWeightList, bwl2); int bid3 = GetWeightListIndex(p.BoneWeightList, bwl3); int wc = p.BoneWeightList.Count; if (bid1 == -1) { wc++; } if (bid2 == -1) { wc++; } if (bid3 == -1) { wc++; } if (wc >= 10) // need new polygon { DOBJ.VertsToImport.Add(vert.ToArray()); vert.Clear(); p = new DatPolygon(); p.AttributeGroup = AttrGroup; p.Flags = Flags; p.ParentDOBJ = DOBJ.DOBJ; } bid1 = GetWeightListIndex(p.BoneWeightList, bwl1); bid2 = GetWeightListIndex(p.BoneWeightList, bwl2); bid3 = GetWeightListIndex(p.BoneWeightList, bwl3); if (bid1 == -1) { p.BoneWeightList.Add(bwl1); } if (bid2 == -1) { p.BoneWeightList.Add(bwl2); } if (bid3 == -1) { p.BoneWeightList.Add(bwl3); } bid1 = GetWeightListIndex(p.BoneWeightList, bwl1); bid2 = GetWeightListIndex(p.BoneWeightList, bwl2); bid3 = GetWeightListIndex(p.BoneWeightList, bwl3); GXVertex v = SMDVertexToGXVertex(t.v1); v.PMXID = GetWeightListIndex(p.BoneWeightList, bwl1); RigVertex(ref v, RenderBones, p.BoneWeightList[v.PMXID / 3], Bones, parent); GXVertex v2 = SMDVertexToGXVertex(t.v2); v2.PMXID = GetWeightListIndex(p.BoneWeightList, CreateWeightList(t.v2.bones, t.v2.weights, Bones, ImportedBones)); RigVertex(ref v2, RenderBones, p.BoneWeightList[v2.PMXID / 3], Bones, parent); GXVertex v3 = SMDVertexToGXVertex(t.v3); v3.PMXID = GetWeightListIndex(p.BoneWeightList, CreateWeightList(t.v3.bones, t.v3.weights, Bones, ImportedBones)); RigVertex(ref v3, RenderBones, p.BoneWeightList[v3.PMXID / 3], Bones, parent); vert.Add(v); vert.Add(v2); vert.Add(v3); } DOBJ.VertsToImport.Add(vert.ToArray()); exitStatus = ExitStatus.Opened; Close(); }
private static void AddVertexContainer(GXVertexDecompressor decom, List <IndexedVertexData <MeleeVertex> > vertexContainers, DatPolygon polygon, GXDisplayList displayList) { List <MeleeVertex> vertices = new List <MeleeVertex>(); List <int> vertexIndices = new List <int>(); for (int i = 0; i < displayList.Indices.Length; i++) { vertexIndices.Add(i); } vertices.AddRange(ConvertVerts(decom.GetFormattedVertices(displayList, polygon))); PrimitiveType primitiveType = MeleeDatToOpenGL.GetGLPrimitiveType(displayList.PrimitiveType); var vertexContainer = new IndexedVertexData <MeleeVertex>(vertices, vertexIndices, primitiveType); vertexContainers.Add(vertexContainer); }