47 lines
1.2 KiB
Plaintext
47 lines
1.2 KiB
Plaintext
import FluidGridData;
|
|
|
|
struct Parameter
|
|
{
|
|
float iso;
|
|
FluidGridData<float> density;
|
|
RWStructuredBuffer<float3> vertices;
|
|
RWStructuredBuffer<uint> indices;
|
|
RWStructuredBuffer<uint> surfaceCount;
|
|
RWStructuredBuffer<uint> vertexCount;
|
|
};
|
|
ParameterBlock<Parameter> params;
|
|
|
|
float getDensity(uint x, uint y, uint z)
|
|
{
|
|
return params.density[x + gridSize.x * y + gridSize.x * gridSize.y * z];
|
|
}
|
|
|
|
[shader("compute")]
|
|
[numthreads(32, 8, 1)]
|
|
void main(uint3 dispatchThreadID : SV_DispatchThreadID)
|
|
{
|
|
uint x = dispatchThreadID.x+1;
|
|
uint y = dispatchThreadID.y+1;
|
|
uint z = dispatchThreadID.z+1;
|
|
FluidGridData<float> density = params.density;
|
|
if(x >= gridSize.x-3 || y >= gridSize.y-3 || z >= gridSize.z-3) return;
|
|
|
|
float phi[8] = {
|
|
getDensity(x, y, z),
|
|
getDensity(x + 1, y, z),
|
|
getDensity(x, y + 1, z),
|
|
getDensity(x + 1, y + 1, z),
|
|
getDensity(x, y, z + 1),
|
|
getDensity(x + 1, y, z + 1),
|
|
getDensity(x, y + 1, z + 1),
|
|
getDensity(x + 1, y + 1, z + 1)
|
|
};
|
|
|
|
uint cubeIndex = 0;
|
|
for (uint i = 0; i < 8; ++i) {
|
|
if (phi[i] < params.iso) {
|
|
cubeIndex |= (1 << i);
|
|
}
|
|
}
|
|
if(cubeIndex == 0 || cubeIndex == 255) return;
|
|
} |