55 lines
1.8 KiB
Plaintext
55 lines
1.8 KiB
Plaintext
import FluidGridData;
|
|||
|
|
|
||
|
|
struct Params
|
||
|
|
{
|
||
|
|
// read-write
|
||
|
|
FluidGridData<float> density;
|
||
|
|
// read-only
|
||
|
|
FluidGridData<float> density0;
|
||
|
|
// read-only
|
||
|
|
FluidGridData<float> velocityX;
|
||
|
|
// read-only
|
||
|
|
FluidGridData<float> velocityY;
|
||
|
|
// read-only
|
||
|
|
FluidGridData<float> velocityZ;
|
||
|
|
float dt;
|
||
|
|
};
|
||
|
|
ParameterBlock<Params> params;
|
||
|
|
|
||
|
|
[shader("compute")]
|
||
|
|
[numthreads(32, 8, 1)]
|
||
|
|
void advect(uint3 dispatchThreadID : SV_DispatchThreadID)
|
||
|
|
{
|
||
|
|
FluidGridData<float> density = params.density;
|
||
|
|
FluidGridData<float> density0 = params.density0;
|
||
|
|
FluidGridData<float> velocityX = params.velocityX;
|
||
|
|
FluidGridData<float> velocityY = params.velocityY;
|
||
|
|
FluidGridData<float> velocityZ = params.velocityZ;
|
||
|
|
float dt = params.dt;
|
||
|
|
|
||
|
|
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;
|
||
|
|
|
||
|
|
float dt0x = dt * (gridSize.x - 2);
|
||
|
|
float dt0y = dt * (gridSize.y - 2);
|
||
|
|
float dt0z = dt * (gridSize.z - 2);
|
||
|
|
|
||
|
|
float3 pos = float3(x - dt0x * velocityX[x, y, z], y - dt0y * velocityY[x, y, z], z - dt0z * velocityZ[x, y, z]);
|
||
|
|
pos.x = clamp(pos.x, 0.5f, gridSize.x - 1.5f);
|
||
|
|
pos.y = clamp(pos.y, 0.5f, gridSize.y - 1.5f);
|
||
|
|
pos.z = clamp(pos.z, 0.5f, gridSize.z - 1.5f);
|
||
|
|
|
||
|
|
int3 i0 = int3(pos);
|
||
|
|
int3 i1 = i0 + int3(1, 1, 1);
|
||
|
|
|
||
|
|
float3 s1 = pos - i0;
|
||
|
|
float3 s0 = 1 - s1;
|
||
|
|
|
||
|
|
density[x, y, z] =
|
||
|
|
s0.x * (s0.y * (s0.z * density0[i0.x, i0.y, i0.z] + s1.z * density0[i0.x, i0.y, i1.z]) +
|
||
|
|
s1.y * (s0.z * density0[i0.x, i1.y, i0.z] + s1.z * density0[i0.x, i1.y, i1.z])) +
|
||
|
|
s1.x * (s0.y * (s0.z * density0[i1.x, i0.y, i0.z] + s1.z * density0[i1.x, i0.y, i1.z]) +
|
||
|
|
s1.y * (s0.z * density0[i1.x, i1.y, i0.z] + s1.z * density0[i1.x, i1.y, i1.z]));
|
||
|
|
}
|