import FluidGridData; struct Params { // read-write FluidGridData density; // read-only FluidGridData density0; // read-only FluidGridData velocityX; // read-only FluidGridData velocityY; // read-only FluidGridData velocityZ; float dt; }; ParameterBlock params; [shader("compute")] [numthreads(32, 8, 1)] void advect(uint3 dispatchThreadID : SV_DispatchThreadID) { FluidGridData density = params.density; FluidGridData density0 = params.density0; FluidGridData velocityX = params.velocityX; FluidGridData velocityY = params.velocityY; FluidGridData 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])); }