Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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;
        }
Example #5
0
        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);
        }