private TerrainChunkMeshData GetInterpolatedDataLod(int lodLevel, int[] neighbors) { var lod = Consts.LodsAmount - lodLevel - _maxDataLod; var amount = (HeigthData.GetLength(0) - 1) * ((int)Mathf.Pow(2, lod)) + 1; var matrix = Assistant.CreateVerticesMatrix(amount, Consts.UnitSize); for (int i = 0; i < HeigthData.GetLength(0) - 1; i++) { for (int j = 0; j < HeigthData.GetLength(1) - 1; j++) { var interpolatedData = GetInterpolatedData(new Int2(i + 1, j), (int)Mathf.Pow(2, lod) - 1); for (int k = 0; k < interpolatedData.GetLength(0); k++) { for (int l = 0; l < interpolatedData.GetLength(1); l++) { matrix[i * (interpolatedData.GetLength(0) - 1) + k, j *(interpolatedData.GetLength(0) - 1) + l].y = interpolatedData[k, interpolatedData.GetLength(1) - 1 - l] * MaxHeight; } } } } var verts = Assistant.CheckNeighbors(matrix, lodLevel, neighbors).ToArray(); var data = new TerrainChunkMeshData() { Vertices = verts, Colors32 = Assistant.CreateColorsFromVerticies(verts), Triangles = Assistant.CreateTriangles(amount), UVs = Assistant.CreateUvs(amount), Lod = lodLevel }; PostProcessChunkMeshData(ref data); return(data); }
private TerrainChunkMeshData GetBaseDataLod(int lodLevel, int[] neighbors) { var amount = (HeigthData.GetLength(0)); var verts = Assistant.CheckNeighbors(PickDataVertices(1), lodLevel, neighbors).ToArray(); var data = new TerrainChunkMeshData() { Vertices = verts, Colors32 = Assistant.CreateColorsFromVerticies(verts), Triangles = Assistant.CreateTriangles(amount), UVs = Assistant.CreateUvs(amount), Lod = lodLevel }; PostProcessChunkMeshData(ref data); return(data); }
private TerrainChunkMeshData GetSeaBottomData(int lodLevel) { var amount = 2; var verts = PickDataVertices(HeigthData.GetLength(0) - 1).ToArray(); var data = new TerrainChunkMeshData() { Vertices = verts, Colors32 = Assistant.CreateColorsFromVerticies(verts), Triangles = Assistant.CreateTriangles(amount), UVs = Assistant.CreateUvs(amount), Lod = lodLevel }; PostProcessChunkMeshData(ref data); return(data); }
private void PostProcessChunkMeshData(ref TerrainChunkMeshData data) { if (data.Lod > _maxDataLod) { return; } var newVertices = new Vector3[data.Triangles.Length]; var newUv = new Vector2[data.Triangles.Length]; var newTriangles = new int[data.Triangles.Length]; var newColors = new Color32[data.Triangles.Length]; var newNormals = new Vector3[data.Triangles.Length]; var trCount = 0; for (var i = 0; i < data.Triangles.Length; i++) { newVertices[i] = data.Vertices[data.Triangles[i]]; newUv[i] = data.UVs[data.Triangles[i]]; newTriangles[i] = i; if (trCount == 0) { newNormals[i] = newNormals[i + 1] = newNormals[i + 2] = CalculateNormal(data.Vertices[data.Triangles[i]], data.Vertices[data.Triangles[i + 1]], data.Vertices[data.Triangles[i + 2]]); newColors[i] = newColors[i + 1] = newColors[i + 2] = data.Colors32[data.Triangles[i]]; } trCount++; if (trCount == 3) { trCount = 0; } } data.Vertices = newVertices; data.UVs = newUv; data.Triangles = newTriangles; //data.Colors32 = newColors; data.Colors32 = Assistant.CreateColorsFromVerticies(data.Vertices, data.Normals); data.Normals = newNormals; }
private TerrainChunkMeshData GetDataLod(int lodLevel, int[] neighbors) { var lod = Consts.LodsAmount - lodLevel; if (lod > _maxDataLod - 1) { lod = _maxDataLod - 1; } var length = HeigthData.GetLength(0); var step = (length - 1) / (int)Mathf.Pow(2, lod); var amount = (length - 1) / step + 1; var verts = Assistant.CheckNeighbors(PickDataVertices(step), lodLevel, neighbors).ToArray(); var data = new TerrainChunkMeshData() { Vertices = verts, Colors32 = Assistant.CreateColorsFromVerticies(verts), Triangles = Assistant.CreateTriangles(amount), UVs = Assistant.CreateUvs(amount), Lod = lodLevel }; PostProcessChunkMeshData(ref data); return(data); }