// ========================================= // ============= Build by Shape ============ public void BuildFromExtents(MeshExtents box) { Verts.Add(new Vector3(box.Min.X, box.Min.Y, box.Max.Z)); Verts.Add(new Vector3(box.Max.X, box.Min.Y, box.Max.Z)); Verts.Add(new Vector3(box.Max.X, box.Max.Y, box.Max.Z)); Verts.Add(new Vector3(box.Min.X, box.Max.Y, box.Max.Z)); Verts.Add(new Vector3(box.Min.X, box.Min.Y, box.Min.Z)); Verts.Add(new Vector3(box.Max.X, box.Min.Y, box.Min.Z)); Verts.Add(new Vector3(box.Max.X, box.Max.Y, box.Min.Z)); Verts.Add(new Vector3(box.Min.X, box.Max.Y, box.Min.Z)); UVs.Add(new Vector2(0.0001f, 0.9999f)); UVs.Add(new Vector2(0.9999f, 0.9999f)); UVs.Add(new Vector2(0.9999f, 0.9999f)); UVs.Add(new Vector2(0.0001f, 0.9999f)); UVs.Add(new Vector2(0.0001f, 0.0001f)); UVs.Add(new Vector2(0.9999f, 0.0001f)); UVs.Add(new Vector2(0.9999f, 0.0001f)); UVs.Add(new Vector2(0.0001f, 0.0001f)); AddFace(3, 4, 0); AddFace(0, 2, 3); AddFace(0, 1, 2); AddFace(1, 5, 6); AddFace(1, 6, 2); AddFace(3, 7, 4); AddFace(2, 7, 3); AddFace(2, 6, 7); AddFace(0, 5, 1); AddFace(4, 7, 6); AddFace(0, 4, 5); AddFace(4, 6, 5); }
private void UpdateVertsAndUVs() { Mesh.Clear(); for (int i = 0; i < Config.VertsPerLoop; i++) { Verts.Add(LoopOrientMatrix * LoopVerts[i]); UVs.Add(new Vector2((float)i / (Config.VertsPerLoop - 1), Mathf.Clamp01(currentSegmentLength / Config.SegmentLength))); } Mesh.SetVertices(Verts); Mesh.SetUVs(0, UVs); }
// ========================================= // ============ Build by Values ============ public void AddFace(Vector3 v1, Vector3 v2, Vector3 v3) { if (!Verts.Contains(v1)) { Verts.Add(v1); } if (!Verts.Contains(v2)) { Verts.Add(v2); } if (!Verts.Contains(v3)) { Verts.Add(v3); } AddFace(Verts.IndexOf(v1), Verts.IndexOf(v2), Verts.IndexOf(v3), 0); }
public void Optimise() { List <C2Vertex> points = new List <C2Vertex>(); List <Vector3> verts = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); for (int i = 0; i < Verts.Count; i++) { C2Vertex p = new C2Vertex(Verts[i], UVs[i]); //Console.WriteLine("Vert " + i); int newID = points.IndexOf(p); //int newID = verts.IndexOf(Verts[i]); if (newID == -1) { //Console.WriteLine("Adding " + p.ToString()); points.Add(p); verts.Add(Verts[i]); uvs.Add(UVs[i]); newID = verts.Count - 1; } for (int j = 0; j < Faces.Count; j++) { Faces[j].ReplaceVertID(i, newID); } } //Console.WriteLine("Reduced Vert count from " + Verts.Count + " to " + verts.Count); //Console.WriteLine("Reduced UV count from " + UVs.Count + " to " + uvs.Count); Verts.Clear(); for (int i = 0; i < verts.Count; i++) { Verts.Add(verts[i]); } UVs.Clear(); for (int i = 0; i < uvs.Count; i++) { UVs.Add(uvs[i]); } }
public void AddFace(Vector3 v1, Vector3 v2, Vector3 v3, Vector2 uv1, Vector2 uv2, Vector2 uv3, int matID) { int iv1, iv2, iv3, iuv1, iuv2, iuv3; Verts.Add(v1); iv1 = Verts.Count - 1; Verts.Add(v2); iv2 = Verts.Count - 1; Verts.Add(v3); iv3 = Verts.Count - 1; UVs.Add(uv1); iuv1 = UVs.Count - 1; UVs.Add(uv2); iuv2 = UVs.Count - 1; UVs.Add(uv3); iuv3 = UVs.Count - 1; AddFace(iv1, iv2, iv3, iuv1, iuv2, iuv3, matID); }
public ushort CreateFreshSubMesh(ushort vertsToReserve, ushort trisToReserve) { // create custom List<> implementation with NativeArray that supports growth without assignment! SubMesh subMesh = new SubMesh((ushort)Verts.Count, (ushort)Tris.Count, vertsToReserve, trisToReserve); lastVert += vertsToReserve; lastTri += trisToReserve; SubMeshes.Add(subMesh); for (int i = 0; i < vertsToReserve; i++) { Verts.Add(Vector3.zero); // this is multiple assignment! BAD! Normals.Add(Vector3.up); TextureUVs.Add(Vector2.zero); SubmaterialUVs.Add(Vector2.zero); } for (int i = 0; i < trisToReserve; i++) { Tris.Add(0); // more evil multiple assignment! } return((ushort)(SubMeshes.Count + SubMeshBaseIdx - 1)); }
public void AddListVertex(float x, float y, float z) { Verts.Add(new Vector3(x, y, z)); }
// ============= Build by List ============= public void AddListVertex(Vector3 v) { Verts.Add(v); }
public void addVert(Position vert) { Verts.Add(vert); }