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); } }
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() }); }
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)); }