/// <summary> /// In Build mode we store Mesh data in lists (not arrays) allowing to add vertices /// </summary> public void StartBuilding() { if (content.HasPosition()) { positions = new List <Vector>(); } if (content.HasNormal()) { normals = new List <Vector>(); } if (content.HasTangent()) { tangents = new List <Vector>(); } if (content.HasUV0()) { uvs0 = new List <Vector2>(); } if (content.HasUV1()) { uvs1 = new List <Vector2>(); } if (content.HasUV2()) { uvs2 = new List <Vector2>(); } if (content.HasUV3()) { uvs3 = new List <Vector2>(); } posIndices = new List <int>(); buildMode = true; }
public Vertex GetVertex(int vi, VertexContent mask = VertexContent.full) { VertexContent c = content & mask; int pi = posIndices[vi]; Vertex v = new Vertex(); v.posIndex = pi; // always set if (c.HasPosition()) { v.position = positions[pi]; } if (c.HasNormal()) { v.normal = normals[normalPerPosition ? pi : vi]; } if (c.HasTangent()) { v.tangent = tangents[vi]; } if (c.HasUV0()) { v.uv0 = uvs0[vi]; } if (c.HasUV1()) { v.uv1 = uvs1[vi]; } if (c.HasUV2()) { v.uv2 = uvs2[vi]; } if (c.HasUV3()) { v.uv3 = uvs3[vi]; } return(v); }
private static Vertex AverageVertices(Vertex[] vs, VertexContent c, float[] weights = null) { Vertex r = new Vertex(); float ws = 0; for (int i = 0; i < vs.Length; ++i) { Vertex v = vs[i]; float w = weights != null ? weights[i] : 1f; if (c.HasPosition()) { r.position += w * v.position; } if (c.HasNormal()) { r.normal += w * v.normal; } if (c.HasTangent()) { r.tangent += w * v.tangent; } if (c.HasUV0()) { r.uv0 += w * v.uv0; } if (c.HasUV1()) { r.uv1 += w * v.uv1; } if (c.HasUV2()) { r.uv2 += w * v.uv2; } if (c.HasUV3()) { r.uv3 += w * v.uv3; } ws += w; } if (c.HasPosition()) { r.position /= ws; } if (c.HasNormal()) { r.normal.Normalize(); } if (c.HasTangent()) { r.tangent.Normalize(); } if (c.HasUV0()) { r.uv0 /= ws; } if (c.HasUV1()) { r.uv1 /= ws; } if (c.HasUV2()) { r.uv2 /= ws; } if (c.HasUV3()) { r.uv3 /= ws; } r.posIndex = -1; return(r); }
public MeshX(Mesh mesh) { // set vertex content content = GetMeshVertexContent(mesh); // init positions var poses = new List <Vector>(); posIndices = new int[mesh.vertexCount]; for (int i = 0; i < mesh.vertexCount; ++i) { Vector pos = mesh.vertices[i]; int posIndex = poses.IndexOf(pos); //!!! use threshold? if (posIndex == -1) { poses.Add(pos); posIndex = poses.Count - 1; } posIndices[i] = posIndex; } positions = poses.ToArray(); // init vertex content if (content.HasNormal()) { normals = mesh.normals; normalPerPosition = false; } if (content.HasTangent()) { tangents = new Vector[mesh.vertexCount]; for (int i = 0; i < mesh.vertexCount; ++i) { tangents[i] = (Vector)mesh.tangents[i]; } } if (content.HasUV0()) { uvs0 = mesh.uv; } if (content.HasUV1()) { uvs1 = mesh.uv2; } if (content.HasUV2()) { uvs2 = mesh.uv3; } if (content.HasUV3()) { uvs3 = mesh.uv4; } // set faces int submeshCount = mesh.subMeshCount; submeshes = new Submesh[submeshCount]; for (int s = 0; s < submeshCount; ++s) { int[][] faces = MeshX.TrianglesToFaces(mesh.GetTriangles(s)); submeshes[s] = new Submesh { faces = faces }; } // copy name this.name = mesh.name; }