/*----------------------------------------------------------------------------------------- * * Computational and optimization stuff : * * -----------------------------------------------------------------------------------------*/ /// <summary> /// Defragmentates mesh subsets with same materials /// </summary> public void DefragmentSubsets(Scene scene, bool takeFromTriangleMtrlIndices) { // if there are not shading groups, // take them from per triangle material indices if (!Subsets.Any() || takeFromTriangleMtrlIndices) { for (int i = 0; i < Triangles.Count; i++) { MeshSubset sg = new MeshSubset(); sg.MaterialIndex = Triangles[i].MaterialIndex; sg.StartPrimitive = i; sg.PrimitiveCount = 1; Subsets.Add(sg); //Console.Write( "*{0}", Triangles[i].MaterialIndex ); } } if (Subsets.Count == 1) { return; } List <List <MeshTriangle> > perMtrlTris = new List <List <MeshTriangle> >(); foreach (var mtrl in scene.Materials) { perMtrlTris.Add(new List <MeshTriangle>()); } foreach (var sg in Subsets) { for (int i = sg.StartPrimitive; i < sg.StartPrimitive + sg.PrimitiveCount; i++) { perMtrlTris[sg.MaterialIndex].Add(Triangles[i]); } } Subsets.Clear(); Triangles.Clear(); for (int i = 0; i < perMtrlTris.Count; i++) { var sg = new MeshSubset(); sg.MaterialIndex = i; sg.StartPrimitive = Triangles.Count; sg.PrimitiveCount = perMtrlTris[i].Count; if (sg.PrimitiveCount == 0) { continue; } Triangles.AddRange(perMtrlTris[i]); Subsets.Add(sg); } }
public void AddTriangles(IEnumerable <Triangle> _Triangles) { if (Triangles == null) { Triangles = new List <Triangle>(); } Triangles.AddRange(_Triangles); }
public void Calculate(int index = 0) { Vertices.Clear(); Triangles.Clear(); UVs.Clear(); var s = Size / 2f; Vector3[] p = new Vector3[] { new Vector3(-s, -s, -s) + Position, // 0 0 new Vector3(-s, s, -s) + Position, // 1 1 new Vector3(s, s, -s) + Position, // 2 2 new Vector3(s, -s, -s) + Position, // 3 3 new Vector3(-s, -s, s) + Position, // 4 0 new Vector3(-s, s, s) + Position, // 5 1 new Vector3(s, s, s) + Position, // 6 2 new Vector3(s, -s, s) + Position, // 7 3 }; for (int i = 0; i < Faces.Length; i++) { if (Faces[i]) { Triangles.AddRange(AddTriangles(index + Vertices.Count)); UVs.AddRange(UVPacker.GetCubeUVs(i, CubeTypes[type])); switch (i) { case 0: Vertices.AddRange(new Vector3[] { p[0], p[1], p[2], p[3] }); break; case 1: Vertices.AddRange(new Vector3[] { p[3], p[2], p[6], p[7] }); break; case 2: Vertices.AddRange(new Vector3[] { p[7], p[6], p[5], p[4] }); break; case 3: Vertices.AddRange(new Vector3[] { p[4], p[5], p[1], p[0] }); break; case 4: Vertices.AddRange(new Vector3[] { p[1], p[5], p[6], p[2] }); break; case 5: Vertices.AddRange(new Vector3[] { p[4], p[0], p[3], p[7] }); break; default: break; } } } this.Calculated = true; }
///<summary> /// Close the line with given color ///</summary> void CloseLine(Color32 color) { if (vertices.Count == 0) { return; } int offset = Vertices.Count; int triangleCount = vertices.Count - 2; List <int> triangles = new List <int>(); for (int i = 0; i < triangleCount / 2; i++) { triangles.Add(offset + i * 2); triangles.Add(offset + i * 2 + 2); triangles.Add(offset + i * 2 + 1); triangles.Add(offset + i * 2 + 2); triangles.Add(offset + i * 2 + 3); triangles.Add(offset + i * 2 + 1); } for (int i = 0; i < vertices.Count; i++) { VertexColors.Add(color); } if (mode_3d) { List <Vector3> v2 = new List <Vector3>(); List <int> t2 = new List <int>(); for (int i = 0; i < vertices.Count; i++) { v2.Add(new Vector3(vertices[i].x, vertices[i].y, z1)); VertexColors.Add(color); } for (int i = 0; i < triangleCount * 3; i += 3) { t2.Add(triangles[i] + vertices.Count); t2.Add(triangles[i + 2] + vertices.Count); t2.Add(triangles[i + 1] + vertices.Count); } for (int i = 0; i < triangles.Count; i += 6) { t2.Add(triangles[i + 4]); t2.Add(t2[i + 1]); t2.Add(triangles[i + 2]); t2.Add(triangles[i + 4]); t2.Add(t2[i + 5]); t2.Add(t2[i + 1]); t2.Add(triangles[i]); t2.Add(t2[i]); t2.Add(t2[i + 2]); t2.Add(triangles[i + 1]); t2.Add(triangles[i]); t2.Add(t2[i + 2]); } t2.Add(offset); t2.Add(offset + 1); t2.Add(offset + vertices.Count); t2.Add(offset + vertices.Count + 1); t2.Add(offset + vertices.Count); t2.Add(offset + 1); t2.Add(offset + vertices.Count - 2); t2.Add(offset + vertices.Count * 2 - 1); t2.Add(offset + vertices.Count - 1); t2.Add(offset + vertices.Count * 2 - 1); t2.Add(offset + vertices.Count - 2); t2.Add(offset + vertices.Count * 2 - 2); vertices.AddRange(v2); triangles.AddRange(t2); } Vertices.AddRange(vertices); Triangles.AddRange(triangles); vertices.Clear(); }