コード例 #1
0
        public void GetVerticesAsTriangles(out int[] indices, out List <GXVertex> Verts)
        {
            Verts = new List <GXVertex>();
            List <int> ind = new List <int>();

            VBN Bones = GetRoot().RenderBones;
            GXVertexDecompressor decompressor = new GXVertexDecompressor(GetRoot().Root);

            int index = 0;

            foreach (DatPolygon p in DOBJ.Polygons)
            {
                foreach (GXDisplayList dl in p.DisplayLists)
                {
                    GXVertex[] verts = decompressor.GetFormattedVertices(dl, p);
                    for (int i = 0; i < verts.Length; i++)
                    {
                        if (verts[i].N != null && verts[i].N.Length == 1)
                        {
                            /*Vector3 ToTransform = Vector3.TransformPosition(new Vector3(verts[i].Pos.X, verts[i].Pos.Y, verts[i].Pos.Z), Bones.bones[verts[i].N[0]].transform);
                             * verts[i].Pos.X = ToTransform.X;
                             * verts[i].Pos.Y = ToTransform.Y;
                             * verts[i].Pos.Z = ToTransform.Z;
                             * Vector3 ToTransformN = Vector3.TransformNormal(new Vector3(verts[i].Nrm.X, verts[i].Nrm.Y, verts[i].Nrm.Z), Bones.bones[verts[i].N[0]].transform);
                             * verts[i].Nrm.X = ToTransformN.X;
                             * verts[i].Nrm.Y = ToTransformN.Y;
                             * verts[i].Nrm.Z = ToTransformN.Z;*/
                        }
                        // TODO: Transform by attached jobj
                    }
                    Verts.AddRange(verts);

                    List <int> indi = new List <int>();
                    for (int i = 0; i < dl.Indices.Length; i++)
                    {
                        indi.Add(index + i);
                    }
                    switch (dl.PrimitiveType)
                    {
                    case GXPrimitiveType.TriangleStrip: ind.AddRange(TriangleTools.fromTriangleStrip(indi)); break;

                    case GXPrimitiveType.Quads: ind.AddRange(TriangleTools.fromQuad(indi)); break;

                    case GXPrimitiveType.Triangles: ind.AddRange(indi); break;

                    default:
                        Console.WriteLine("Warning: unsupported primitive type " + dl.PrimitiveType.ToString());
                        ind.AddRange(indi);
                        break;
                    }
                    index += indi.Count;
                }
            }

            indices = ind.ToArray();
        }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
        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);
        }