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;
                }
            }
        }
Example #2
0
        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);
        }