32 lines
944 B
Plaintext
32 lines
944 B
Plaintext
import FluidGridData;
|
|||
|
|
|
||
|
|
struct Params
|
||
|
|
{
|
||
|
|
// read-write
|
||
|
|
FluidGridData<float> next;
|
||
|
|
// read-only
|
||
|
|
FluidGridData<float> current;
|
||
|
|
// read-only
|
||
|
|
FluidGridData<float> grid0;
|
||
|
|
float a;
|
||
|
|
float c;
|
||
|
|
};
|
||
|
|
ParameterBlock<Params> params;
|
||
|
|
|
||
|
|
[shader("compute")]
|
||
|
|
[numthreads(32, 8, 1)]
|
||
|
|
void linearSolve(uint3 dispatchThreadID : SV_DispatchThreadID)
|
||
|
|
{
|
||
|
|
FluidGridData<float> next = params.next;
|
||
|
|
FluidGridData<float> current = params.current;
|
||
|
|
FluidGridData<float> grid0 = params.grid0;
|
||
|
|
float a = params.a;
|
||
|
|
float cRecip = 1.0f / params.c;
|
||
|
|
|
||
|
|
int x = dispatchThreadID.x + 1;
|
||
|
|
int y = dispatchThreadID.y + 1;
|
||
|
|
int z = dispatchThreadID.z + 1;
|
||
|
|
if(x >= gridSize.x - 1 || y >= gridSize.y - 1 || z >= gridSize.z - 1) return;
|
||
|
|
|
||
|
|
next[x, y, z] = (grid0[x, y, z] + a * (current[x + 1, y, z] + current[x - 1, y, z] + current[x, y + 1, z] + current[x, y - 1, z] + current[x, y, z + 1] + current[x, y, z - 1])) * cRecip;
|
||
|
|
}
|