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); }
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); }
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); }
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); }
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); }