Exemple #1
0
        public MeshData DispatchAndGetChunkMeshData(CompressedMarchingCubeChunk chunk, Action <CompressedMarchingCubeChunk> SetChunkComponents, Action <ComputeBuffer> WorkOnNoise = null)
        {
            ChunkGenerationGPUData gpuData       = pipelinePool.GetItemFromPool();
            NoisePipeline          noise         = new NoisePipeline(gpuData, storedNoiseEdits);
            ChunkPipeline          chunkPipeline = new ChunkPipeline(gpuData, minDegreeBufferPool);

            ComputeBuffer vertsBuffer;
            ComputeBuffer colorBuffer;

            ValidateChunkProperties(chunk);
            noise.TryLoadOrGenerateNoise(chunk);
            bool storeNoise = noise.WorkOnNoiseMap(chunk, WorkOnNoise);
            int  numTris    = chunkPipeline.ComputeMeshDataFromNoise(chunk, out vertsBuffer, out colorBuffer);


            Vector3[] verts;
            Color32[] colors;

            ///read data from gpu
            if (numTris == 0)
            {
                verts  = Array.Empty <Vector3>();
                colors = Array.Empty <Color32>();
            }
            else
            {
                SetChunkComponents?.Invoke(chunk);
                verts  = new Vector3[numTris * 3];
                colors = new Color32[numTris * 3];
                vertsBuffer.GetData(verts);
                colorBuffer.GetData(colors);
                vertsBuffer.Dispose();
                colorBuffer.Dispose();
            }

            if (storeNoise)
            {
                noise.StoreNoise(chunk);
            }
            pipelinePool.ReturnItemToPool(gpuData);
            return(new MeshData(verts, colors, chunk.UseCollider));
        }
Exemple #2
0
        public void DispatchAndGetChunkMeshDataAsync(CompressedMarchingCubeChunk chunk, Action <CompressedMarchingCubeChunk> SetChunkComponents, Action <MeshData> onMeshDataDone)
        {
            ChunkGenerationGPUData gpuData       = pipelinePool.GetItemFromPool();
            NoisePipeline          noise         = new NoisePipeline(gpuData, storedNoiseEdits);
            ChunkPipeline          chunkPipeline = new ChunkPipeline(gpuData, minDegreeBufferPool);

            ValidateChunkProperties(chunk);
            noise.TryLoadOrGenerateNoise(chunk);
            chunkPipeline.DispatchPrepareCubesFromNoise(chunk);


            ComputeBufferExtension.GetLengthOfAppendBufferAsync(gpuData.preparedTrisBuffer, gpuData.triCountBuffer, (numTris) =>
            {
                if (numTris <= 0)
                {
                    pipelinePool.ReturnItemToPool(gpuData);
                    onMeshDataDone(new MeshData(null, null, false));
                }
                else
                {
                    //totalTriBuild += numTris;

                    SetChunkComponents(chunk);
                    ComputeBuffer verts;
                    ComputeBuffer colors;
                    chunkPipeline.BuildMeshFromPreparedCubes(chunk, numTris, out verts, out colors);

                    ///read data from gpu
                    ComputeBufferExtension.ReadBuffersAsync <Vector3, Color32>(verts, colors, (vs, cs) =>
                    {
                        verts.Dispose();
                        colors.Dispose();
                        pipelinePool.ReturnItemToPool(gpuData);
                        onMeshDataDone(new MeshData(vs, cs, chunk.UseCollider));
                        //OnDataDone(new GpuAsyncRequestResult(tris));
                    });
                }
            });
        }