// Index to vert property public static Vector3 FindVertex(GPUVertices vert, int i) { switch (i) { case 0: return(vert.V0); case 1: return(vert.V1); case 2: return(vert.V2); case 3: return(vert.V3); case 4: return(vert.V4); case 5: return(vert.V5); case 6: return(vert.V6); case 7: return(vert.V7); case 8: return(vert.V8); case 9: return(vert.V9); case 10: return(vert.V10); case 11: return(vert.V11); default: break; } throw new System.ArgumentException("Vertex index must be 0-11", "i"); }
private void updateVertices(GPUVertices vert) { int cubeIndex = vert.Index; for (int k = 0; triTable[cubeIndex][k] != -1; k += 3) { Vertices.Add(GridUtils.FindVertex(vert, triTable[cubeIndex][k])); Vertices.Add(GridUtils.FindVertex(vert, triTable[cubeIndex][k + 2])); Vertices.Add(GridUtils.FindVertex(vert, triTable[cubeIndex][k + 1])); } }
// ============================================================================================ // Metaball Algorithm Functions --------------------------------------------------------------- // ============================================================================================ private GPUVertices[] runComputeShader(GPUBlob[] gpuBlobs) { // Pass Data gpuBuffers.BlobBuffer.SetData(gpuBlobs); shader.SetInt("numBlobs", gpuBlobs.Length); shader.SetInt("xCubes", XCubes); shader.SetInt("yCubes", YCubes); shader.SetFloat("threshold", container.Threshold); int xThreads = XCubes / 8 >= 8 ? XCubes / 8 : 8; int yThreads = YCubes / 8 >= 8 ? YCubes / 8 : 8; int zThreads = ZCubes / 8 >= 8 ? ZCubes / 8 : 8; // Why waste time with many instruction to many data when few instruction do trick shader.Dispatch(shaderKernel, xThreads, yThreads, zThreads); GPUVertices[] output = new GPUVertices[gpuBuffers.VertBuffer.count]; gpuBuffers.VertBuffer.GetData(output); return(output); }