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); }
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()); }
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); }