예제 #1
0
        public static PreparedMesh CreateFromArrays(Vector3[] verts, Vector2[] uvs, Vector2[] uv2s, int[] indices, string name, string materialName, DoubleVector3 originECEF)
        {
            var preparedMesh = new PreparedMesh();

            preparedMesh.m_verts   = verts;
            preparedMesh.m_uvs     = uvs;
            preparedMesh.m_uv2s    = uv2s;
            preparedMesh.m_indices = indices;
            preparedMesh.m_name    = name;

            bool isTree    = materialName.StartsWith("tr");
            bool isTerrain = (name[0] == 'L' && !isTree);

            if (isTerrain)
            {
                Vector3 upECEF = originECEF.normalized.ToSingleVector();
                preparedMesh.m_normals = CalculateTerrainNormals(verts, indices, upECEF);
            }
            else if (materialName.StartsWith("Raster"))
            {
                preparedMesh.m_normals = CalculateRasterTerrainNormals(verts, indices, originECEF);
            }
            else
            {
                preparedMesh.m_normals = CalculateNormals(verts, indices);
            }

            return(preparedMesh);
        }
예제 #2
0
파일: MeshBuilder.cs 프로젝트: hadipp/flyVR
        public static PreparedMesh[] CreatePreparedMeshes(Vector3[] verts, Vector2[] uvs, Vector2[] uv2s, Vector3[] normals, Color32[] colors, int[] indices, string name, string materialName, DoubleVector3 originECEF, int maxVerticesPerMesh)
        {
            var meshes = new List <PreparedMesh>();

            if (verts.Length <= maxVerticesPerMesh)
            {
                meshes.Add(PreparedMesh.CreateFromArrays(verts, uvs, uv2s, normals, colors, indices, name, materialName, originECEF));
            }
            else
            {
                // there's probably a lot to be done to optimize this, but we're still to meet about re-chunking etc.
                int triangleCount = indices.Length / 3;

                for (int startingTriangleIndex = 0; startingTriangleIndex < triangleCount;)
                {
                    var indexRemapper = new Dictionary <int, int>();
                    int triangleIndex = startingTriangleIndex;

                    for (; triangleIndex < triangleCount; ++triangleIndex)
                    {
                        if ((indexRemapper.Count + 3) > maxVerticesPerMesh)
                        {
                            break;
                        }

                        for (int vertexIndex = 0; vertexIndex < 3; ++vertexIndex)
                        {
                            int originalIndex = indices[triangleIndex * 3 + vertexIndex];

                            if (!indexRemapper.ContainsKey(originalIndex))
                            {
                                indexRemapper.Add(originalIndex, indexRemapper.Count);
                            }
                        }
                    }

                    var reversedRemapping = indexRemapper.ToDictionary(_x => _x.Value, _x => _x.Key);

                    var remappedVerts   = Enumerable.Range(0, reversedRemapping.Count).Select(_i => verts[reversedRemapping[_i]]).ToArray();
                    var remappedUVs     = Enumerable.Range(0, reversedRemapping.Count).Select(_i => uvs[reversedRemapping[_i]]).ToArray();
                    var remappedUV2s    = Enumerable.Range(0, reversedRemapping.Count).Select(_i => uv2s[reversedRemapping[_i]]).ToArray();
                    var remappedNormals = Enumerable.Range(0, reversedRemapping.Count).Select(_i => normals[reversedRemapping[_i]]).ToArray();
                    var remappedColors  = Enumerable.Range(0, reversedRemapping.Count).Select(_i => colors[reversedRemapping[_i]]).ToArray();
                    var remappedIndices = indices.Skip(startingTriangleIndex * 3).Take((triangleIndex - startingTriangleIndex) * 3).Select(_i => indexRemapper[_i]).ToArray();

                    // use the remapped indices
                    meshes.Add(PreparedMesh.CreateFromArrays(remappedVerts, remappedUVs, remappedUV2s, remappedNormals, remappedColors, remappedIndices, name, materialName, originECEF));
                    startingTriangleIndex = triangleIndex;
                }
            }

            return(meshes.ToArray());
        }
예제 #3
0
        public static PreparedMesh CreateFromArrays(Vector3[] verts, Vector2[] uvs, Vector2[] uv2s, Vector3[] normals, Color32[] colors, int[] indices, string name, string materialName, DoubleVector3 originECEF)
        {
            var preparedMesh = new PreparedMesh();

            preparedMesh.m_verts   = verts;
            preparedMesh.m_uvs     = uvs;
            preparedMesh.m_uv2s    = uv2s;
            preparedMesh.m_colors  = colors;
            preparedMesh.m_indices = indices;
            preparedMesh.m_name    = name;

            bool isInstancedIndoorMesh = name.StartsWith("InteriorInstance");

            if (isInstancedIndoorMesh)
            {
                for (int i = 0; i < preparedMesh.m_indices.Length; i += 3)
                {
                    int temp = preparedMesh.m_indices[i + 0];
                    preparedMesh.m_indices[i + 0] = preparedMesh.m_indices[i + 1];
                    preparedMesh.m_indices[i + 1] = temp;
                }

                preparedMesh.m_normals = CalculateNormals(verts, indices);
            }
            else if (normals != null && normals.Length > 0)
            {
                preparedMesh.m_normals = normals;
            }
            else
            {
                bool isTree    = materialName.StartsWith("tr");
                bool isTerrain = (name[0] == 'L' && !isTree);

                if (isTerrain)
                {
                    Vector3 upECEF = originECEF.normalized.ToSingleVector();
                    preparedMesh.m_normals = CalculateTerrainNormals(verts, indices, upECEF);
                }
                else if (materialName.StartsWith("Raster"))
                {
                    preparedMesh.m_normals = CalculateRasterTerrainNormals(verts, indices, originECEF);
                }
                else
                {
                    preparedMesh.m_normals = CalculateNormals(verts, indices);
                }
            }

            return(preparedMesh);
        }