private static List <StaticObjectSubmesh> CreateSubmeshes(List <Vector3> vertices, List <ColorRGBA4B> vertexColors, List <StaticObjectFace> faces) { bool hasVertexColors = vertexColors.Count != 0; Dictionary <string, List <StaticObjectFace> > submeshMap = CreateSubmeshMap(faces); List <StaticObjectSubmesh> submeshes = new List <StaticObjectSubmesh>(); foreach (KeyValuePair <string, List <StaticObjectFace> > mappedSubmesh in submeshMap) { //Collect all indices and build UV map List <uint> indices = new List <uint>(mappedSubmesh.Value.Count * 3); Dictionary <uint, Vector2> uvMap = new Dictionary <uint, Vector2>(mappedSubmesh.Value.Count * 3); foreach (StaticObjectFace face in mappedSubmesh.Value) { for (int i = 0; i < 3; i++) { uint index = face.Indices[i]; indices.Add(index); if (!uvMap.ContainsKey(index)) { uvMap.Add(index, face.UVs[i]); } } } //Get Vertex range from indices uint minVertex = indices.Min(); uint maxVertex = indices.Max(); //Build vertex list uint vertexCount = maxVertex - minVertex; List <StaticObjectVertex> submeshVertices = new List <StaticObjectVertex>((int)vertexCount); for (uint i = minVertex; i < maxVertex + 1; i++) { Vector2 uv = uvMap[i]; ColorRGBA4B color = hasVertexColors ? vertexColors[(int)i] : null; submeshVertices.Add(new StaticObjectVertex(vertices[(int)i], uv, color)); } //Normalize indices for (int i = 0; i < indices.Count; i++) { indices[i] -= minVertex; } submeshes.Add(new StaticObjectSubmesh(mappedSubmesh.Key, submeshVertices, indices)); } return(submeshes); }
public StaticObjectVertex(Vector3 position, Vector2 uv, ColorRGBA4B color) : this(position, uv) { this.Color = color; }