Exemple #1
0
        private void ConstructMesh(
            MapInfoComponent mapInfo,
            MeshParametersComponent meshParameters,
            ErosionParametersComponent erosionParameters)
        {
            var mapSize     = meshParameters.MapResolution;
            var brushRadius = erosionParameters.ErosionBrushRadius;
            var verts       = new Vector3[mapSize * mapSize];
            var triangles   = new int[(mapSize - 1) * (mapSize - 1) * 6];

            for (var i = 0; i < mapSize * mapSize; i++)
            {
                var x = i % mapSize;
                var y = i / mapSize;
                var borderedMapIndex = (y + brushRadius) * mapInfo.MapSizeWithBorder + x + brushRadius;
                var meshMapIndex     = y * mapSize + x;

                var percent = new Vector2(x / (mapSize - 1f), y / (mapSize - 1f));
                var pos     = new Vector3(percent.x * 2 - 1, 0, percent.y * 2 - 1) * meshParameters.Scale;

                var normalizedHeight = mapInfo.Map[borderedMapIndex];
                pos += Vector3.up * normalizedHeight * meshParameters.ElevationScale;
                verts[meshMapIndex] = pos;

                if (ConstructMeshHelper.IsInside(mapSize, x, y))
                {
                    ConstructMeshHelper.ConstructTriangles(x, y, mapSize, meshMapIndex, triangles);
                }
            }

            if (mapInfo.Mesh == null)
            {
                mapInfo.Mesh = new Mesh();
            }
            else
            {
                mapInfo.Mesh.Clear();
            }

            mapInfo.Mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
            mapInfo.Mesh.vertices    = verts;
            mapInfo.Mesh.triangles   = triangles;
            mapInfo.Mesh.RecalculateNormals();

            var(meshFilter, meshRenderer) = AssignMeshComponents();
            meshFilter.sharedMesh         = mapInfo.Mesh;
            meshRenderer.sharedMaterial   = meshParameters.Material;
        }
Exemple #2
0
        private void Erode(
            ErosionParametersComponent erosionParameters,
            MeshParametersComponent meshParameters,
            MapInfoComponent mapInfo)
        {
            const int maxThreadCount = 65535;

            var brush       = GeneralHelper.CreateBrush(erosionParameters, meshParameters.MapResolution);
            var brushShader = new BrushShader()
            {
                IndexBuffer = GeneralHelper.GetBufferFor(brush.IndexOffsets, erosionParameters.Erosion,
                                                         "brushIndices"),
                WeightBuffer =
                    GeneralHelper.GetBufferFor(brush.Weights, erosionParameters.Erosion, "brushWeights")
            };
            var randomIndices = GeneralHelper.GenerateIndices(
                erosionParameters.ErosionIterationCount,
                erosionParameters.ErosionBrushRadius,
                meshParameters.MapResolution);
            var randomIndexBuffer = GeneralHelper.GetBufferFor(randomIndices, erosionParameters.Erosion, "randomIndices");
            var mapBuffer         = GeneralHelper.GetBufferFor(mapInfo.Map, erosionParameters.Erosion, "map");

            SetErosionParameters(erosionParameters, mapInfo, brush);

            erosionParameters.Erosion.Dispatch(
                0,
                Math.Min(erosionParameters.ErosionIterationCount / 1024, maxThreadCount),
                1,
                1);
            mapBuffer.GetData(mapInfo.Map);

            GeneralHelper.ReleaseBuffers(new List <ComputeBuffer>()
            {
                brushShader.IndexBuffer,
                brushShader.WeightBuffer,
                mapBuffer,
                randomIndexBuffer
            });
        }