Beispiel #1
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
            });
        }