예제 #1
0
        public override DensityData GenerateDensityGridGpu(Vector3Int gridSize, Vector3 boxSize, Vector3 rendererPos)
        {
            var densityData = new DensityData(gridSize);

            var size = gridSize.x * gridSize.y * gridSize.z;
            var tgX  = Mathf.CeilToInt(gridSize.x / (float)ThreadGroupSize);
            var tgY  = Mathf.CeilToInt(gridSize.y / (float)ThreadGroupSize);
            var tgZ  = Mathf.CeilToInt(gridSize.z / (float)ThreadGroupSize);

            var buffer = new ComputeBuffer(size, sizeof(float));

            buffer.SetData(densityData.Data);

            computeShader.SetBuffer(0, "points", buffer);

            computeShader.SetFloat("radius", radius);
            computeShader.SetInt("sizeX", gridSize.x);
            computeShader.SetInt("sizeY", gridSize.y);
            computeShader.SetInt("sizeZ", gridSize.z);
            computeShader.SetVector("size", boxSize);
            computeShader.SetVector("position", rendererPos);
            computeShader.SetVector("sphereCenter", transform.position);

            computeShader.Dispatch(0, tgX, tgY, tgZ);

            buffer.GetData(densityData.Data);
            buffer.Release();

            return(densityData);
        }
예제 #2
0
        public override DensityData GenerateDensityGridGpu(Vector3Int gridSize, Vector3 boxSize, Vector3 rendererPos)
        {
            var densityData = new DensityData(gridSize);

            var size           = gridSize.x * gridSize.y * gridSize.z;
            var threadsGroupsX = Mathf.CeilToInt(gridSize.x / (float)ThreadGroupSize);
            var threadGroupsY  = Mathf.CeilToInt(gridSize.y / (float)ThreadGroupSize);
            var threadGroupsZ  = Mathf.CeilToInt(gridSize.z / (float)ThreadGroupSize);

            var buffer = new ComputeBuffer(size, sizeof(float));

            buffer.SetData(densityData.Data);

            computeShader.SetBuffer(0, "points", buffer);

            // Standard variables
            computeShader.SetInt("sizeX", gridSize.x);
            computeShader.SetInt("sizeY", gridSize.y);
            computeShader.SetInt("sizeZ", gridSize.z);
            computeShader.SetVector("size", boxSize);
            computeShader.SetVector("position", rendererPos);

            // Specific variables
            var offsets       = CreateOffsets();
            var offsetsBuffer = new ComputeBuffer(offsets.Length, sizeof(float) * 3);

            offsetsBuffer.SetData(offsets);

            computeShader.SetBuffer(0, "offsets", offsetsBuffer);
            computeShader.SetInt("octaves", octaves);
            computeShader.SetFloat("noiseScale", noiseScale);
            computeShader.SetFloat("noiseWeight", noiseWeight);
            computeShader.SetFloat("persistence", persistence);
            computeShader.SetFloat("weightMultiplier", weightMultiplier);
            computeShader.SetFloat("lacunarity", lacunarity);

            // Launch kernels
            computeShader.Dispatch(0, threadsGroupsX, threadGroupsY, threadGroupsZ);

            // Get results
            buffer.GetData(densityData.Data);
            buffer.Release();
            offsetsBuffer.Release();

            return(densityData);
        }
예제 #3
0
        public DensityData GenerateDensityGridCpu(Vector3Int gridSize, Vector3 boxSize, Vector3 rendererPos)
        {
            var densityGrid = new DensityData(gridSize);

            for (var xi = 0; xi < gridSize.x; xi++)
            {
                for (var yi = 0; yi < gridSize.y; yi++)
                {
                    for (var zi = 0; zi < gridSize.z; zi++)
                    {
                        var posInGrid = new Vector3(
                            (xi / (gridSize.x - 1f)) * boxSize.x,
                            (yi / (gridSize.y - 1f)) * boxSize.y,
                            (zi / (gridSize.z - 1f)) * boxSize.z
                            );
                        var densityPosition = rendererPos + posInGrid - (boxSize / 2f);
                        var density         = Get(densityPosition);
                        densityGrid[xi, yi, zi] = density;
                    }
                }
            }

            return(densityGrid);
        }
예제 #4
0
        private (List <Vector3>, Dictionary <Vector3Int, int>) GetVertices(DensityData densityData)
        {
            _verticesBuffer.Clear();
            _verticesIndicesBuffer.Clear();

            for (var xi = 0; xi < gridSize.x - 1; xi++)
            {
                for (var yi = 0; yi < gridSize.y - 1; yi++)
                {
                    for (var zi = 0; zi < gridSize.z - 1; zi++)
                    {
                        var vertexPos = Vector3.zero;
                        var counter   = 0;

                        // Search sign changes
                        for (var dx = 0; dx <= 1; dx++)
                        {
                            for (var dy = 0; dy <= 1; dy++)
                            {
                                if ((densityData[xi + dx, yi + dy, zi + 0] > 0f) !=
                                    (densityData[xi + dx, yi + dy, zi + 1] > 0f))
                                {
                                    var change = new Vector3(
                                        dx,
                                        dy,
                                        Adapt(densityData[xi + dx, yi + dy, zi + 0],
                                              densityData[xi + dx, yi + dy, zi + 1])
                                        );

                                    change     = Vector3.Scale(change, UnitVector);
                                    vertexPos += change;
                                    counter++;
                                }
                            }
                        }

                        for (var dx = 0; dx <= 1; dx++)
                        {
                            for (var dz = 0; dz <= 1; dz++)
                            {
                                if ((densityData[xi + dx, yi + 0, zi + dz] > 0f) !=
                                    (densityData[xi + dx, yi + 1, zi + dz] > 0f))
                                {
                                    var change = new Vector3(
                                        dx,
                                        Adapt(densityData[xi + dx, yi + 0, zi + dz],
                                              densityData[xi + dx, yi + 1, zi + dz]),
                                        dz
                                        );

                                    change     = Vector3.Scale(change, UnitVector);
                                    vertexPos += change;
                                    counter++;
                                }
                            }
                        }

                        for (var dy = 0; dy <= 1; dy++)
                        {
                            for (var dz = 0; dz <= 1; dz++)
                            {
                                if ((densityData[xi + 0, yi + dy, zi + dz] > 0f) !=
                                    (densityData[xi + 1, yi + dy, zi + dz] > 0f))
                                {
                                    var change =
                                        new Vector3(
                                            Adapt(densityData[xi + 0, yi + dy, zi + dz],
                                                  densityData[xi + 1, yi + dy, zi + dz]),
                                            dy,
                                            dz
                                            );

                                    change     = Vector3.Scale(change, UnitVector);
                                    vertexPos += change;
                                    counter++;
                                }
                            }
                        }

                        if (counter != 0)
                        {
                            vertexPos /= (float)counter;
                            _verticesIndicesBuffer.Add(new Vector3Int(xi, yi, zi), _verticesBuffer.Count);
                            _verticesBuffer.Add(vertexPos + GetDensityPosition(xi, yi, zi));
                        }
                    }
                }
            }

            return(_verticesBuffer, _verticesIndicesBuffer);
        }
예제 #5
0
        private List <int> GetTriangles(IEnumerable <Vector3> vertices, Dictionary <Vector3Int, int> indexes, DensityData densityData)
        {
            _trianglesBuffer.Clear();

            for (var xi = 0; xi < gridSize.x - 1; xi++)
            {
                for (var yi = 0; yi < gridSize.y - 1; yi++)
                {
                    for (var zi = 0; zi < gridSize.z - 1; zi++)
                    {
                        if (xi > 0 && yi > 0)
                        {
                            //var solid1 = density.Get(position + GetDensityPosition(xi, yi, zi + 0)) > 0f;
                            //var solid2 = density.Get(position + GetDensityPosition(xi, yi, zi + 1)) > 0f;
                            var solid1 = densityData[xi, yi, zi + 0] > 0f;
                            var solid2 = densityData[xi, yi, zi + 1] > 0f;
                            if (solid1 != solid2)
                            {
                                if (solid1)
                                {
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi - 1, zi)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi - 0, zi)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi - 1, zi)]);

                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi - 0, zi)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi - 0, zi)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi - 1, zi)]);
                                }
                                else
                                {
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi - 1, zi)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi - 0, zi)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi - 1, zi)]);

                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi - 0, zi)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi - 1, zi)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi - 0, zi)]);
                                }
                            }
                        }

                        if (xi > 0 && zi > 0)
                        {
                            //var solid1 = density.Get(position + GetDensityPosition(xi, yi + 0, zi)) > 0f;
                            //var solid2 = density.Get(position + GetDensityPosition(xi, yi + 1, zi)) > 0f;
                            var solid1 = densityData[xi, yi + 0, zi] > 0f;
                            var solid2 = densityData[xi, yi + 1, zi] > 0f;
                            if (solid1 != solid2)
                            {
                                if (solid1)
                                {
                                    //t1
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi, zi - 1)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi, zi - 1)]);
                                    //t2
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi, zi - 1)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi, zi - 0)]);
                                }
                                else
                                {
                                    //t1
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi, zi - 1)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi, zi - 1)]);
                                    //t2
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 0, yi, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi - 1, yi, zi - 1)]);
                                }
                            }
                        }

                        if (yi > 0 && zi > 0)
                        {
                            //var solid1 = density.Get(position + GetDensityPosition(xi + 0, yi, zi)) > 0f;
                            //var solid2 = density.Get(position + GetDensityPosition(xi + 1, yi, zi)) > 0f;
                            var solid1 = densityData[xi + 0, yi, zi] > 0f;
                            var solid2 = densityData[xi + 1, yi, zi] > 0f;

                            if (solid1 != solid2)
                            {
                                if (solid2)
                                {
                                    //t1
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 0, zi - 1)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 0, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 1, zi - 1)]);
                                    //t2
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 1, zi - 1)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 0, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 1, zi - 0)]);
                                }
                                else
                                {
                                    //t1
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 1, zi - 1)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 0, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 0, zi - 1)]);
                                    //t2
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 1, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 0, zi - 0)]);
                                    _trianglesBuffer.Add(indexes[new Vector3Int(xi, yi - 1, zi - 1)]);
                                }
                            }
                        }
                    }
                }
            }

            return(_trianglesBuffer);
        }