Exemple #1
0
        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);
        }
Exemple #2
0
 public StaticObjectVertex(Vector3 position, Vector2 uv, ColorRGBA4B color) : this(position, uv)
 {
     this.Color = color;
 }