コード例 #1
0
        private void ParseStrips(NiTriStrips strips)
        {
            List <string> export = new List <string>();

            NiTriStripsData geometry = (NiTriStripsData)strips.Data.Object;

            List <Triangle> triangles = new List <Triangle>();

            foreach (ushort[] points in geometry.Points)
            {
                bool t = false;
                int  j = 1;

                ushort p1 = points[0];
                ushort p2 = points[1];

                while (j < points.Length - 1)
                {
                    ushort p3 = points[j + 1];

                    if (p1 != p2 && p1 != p3 && p2 != p3)
                    {
                        if (t)
                        {
                            triangles.Add(new Triangle(p1, p3, p2));
                        }
                        else
                        {
                            triangles.Add(new Triangle(p1, p2, p3));
                        }
                    }

                    j  = j + 1;
                    p1 = p2;
                    p2 = p3;
                    t  = !t;
                }
            }

            // Verticles (v)
            if (geometry.HasVertices && geometry.NumVertices >= 3)
            {
                Matrix transformationMatrix = ComputeWorldMatrix(strips);
                computePolys(triangles.ToArray(), geometry.Vertices, transformationMatrix);
            }
        }
コード例 #2
0
        public static TriangleCollection GetTrianglesFromGeometryStrips(this NiTriStripsData stripsData, Matrix transformationMatrix)
        {
            var stripsLength = stripsData.Points.Length;
            var indices      = stripsData.Points.Select(strip =>
            {
                var points       = strip;
                var pointsLength = points.Length;
                if (pointsLength > 2)
                {
                    var tris = new List <TriangleIndex>();
                    var a    = points[0];
                    var b    = a;
                    var c    = points[1];

                    for (int pts = 2; pts < pointsLength; pts++)
                    {
                        a = b;
                        b = c;
                        c = points[pts];

                        if (a != b && b != c && c != a)
                        {
                            tris.Add(pts % 2 == 0 ? new TriangleIndex {
                                A = a, B = b, C = c
                            } : new TriangleIndex {
                                A = a, B = c, C = b
                            });
                        }
                    }

                    return(tris);
                }
                return(new List <TriangleIndex>());
            });

            return(new TriangleCollection
            {
                Vertices = stripsData.Vertices.Select(vert => { Vector3 trans; Vector3.Transform(ref vert, ref transformationMatrix, out trans); return trans; }).ToArray(),
                Indices = indices.SelectMany(tri => tri).ToArray()
            });
        }
コード例 #3
0
        private string ParseStrips(NiTriStrips strips)
        {
            if (!strips.Data.IsValid())
            {
                return("");
            }

            NiTriStripsData geometry = (NiTriStripsData)strips.Data.Object;

            Matrix transformationMatrix = ComputeWorldMatrix(strips);

            // The final text
            List <string> export = new List <string>();

            // Set Object name
            export.Add("g Strip " + strips.Name + Environment.NewLine);

            // Verticles (v)
            if (geometry.HasVertices && geometry.NumVertices >= 3)
            {
                export.Add(printVertices(geometry.Vertices, transformationMatrix));
            }

            // Texture coordinates (vt)
            if (geometry.UVSets.Length > 0)
            {
                export.Add(printUvSets(geometry.UVSets));
            }

            // Normals (vn)
            if (geometry.HasNormals)
            {
                export.Add(printNormals(geometry.Normals, transformationMatrix));
            }

            if (geometry.Points.Length > 0)
            {
                List <Triangle> triangles = new List <Triangle>();

                foreach (ushort[] points in geometry.Points)
                {
                    bool t = false;
                    int  j = 1;

                    ushort p1 = points[0];
                    ushort p2 = points[1];

                    while (j < points.Length - 1)
                    {
                        ushort p3 = points[j + 1];

                        if (p1 != p2 && p1 != p3 && p2 != p3)
                        {
                            if (t)
                            {
                                triangles.Add(new Triangle(p1, p3, p2));
                            }
                            else
                            {
                                triangles.Add(new Triangle(p1, p2, p3));
                            }
                        }

                        j  = j + 1;
                        p1 = p2;
                        p2 = p3;
                        t  = !t;
                    }
                }

                export.Add(printTriangles(triangles.ToArray(), (geometry.UVSets.Length > 0)));
            }

            return(string.Join(Environment.NewLine, export));
        }