//-------------------------------------------------------------------------------------- // Defines //-------------------------------------------------------------------------------------- #define LEFTCELL float3 (input.LR.x, input.texcoords.y, input.texcoords.z) #define RIGHTCELL float3 (input.LR.y, input.texcoords.y, input.texcoords.z) #define BOTTOMCELL float3 (input.texcoords.x, input.BT.x, input.texcoords.z) #define TOPCELL float3 (input.texcoords.x, input.BT.y, input.texcoords.z) #define DOWNCELL float3 (input.texcoords.x, input.texcoords.y, input.DU.x) #define UPCELL float3 (input.texcoords.x, input.texcoords.y, input.DU.y) // 1.73 - voxel diagonal length #define BOX_EXPANSION 1.73 //-------------------------------------------------------------------------------------- // Textures //-------------------------------------------------------------------------------------- Texture3D Texture_velocity0; Texture3D Texture_velocity1; Texture3D Texture_color; Texture3D Texture_obstacles; Texture3D Texture_obstvelocity; Texture3D Texture_pressure; Texture3D Texture_tempscalar; Texture3D Texture_tempvector; //-------------------------------------------------------------------------------------- // Samplers //-------------------------------------------------------------------------------------- sampler samPointClamp; sampler samLinear; //-------------------------------------------------------------------------------------- // Variables //-------------------------------------------------------------------------------------- cbuffer FluidSimConfig { float textureHeight; float textureWidth; float textureDepth; float modulate = 1.0; float epsilon; float timestep; float forward = 1.0; float4 floatVolumeDim; // Actually float3. We don't support float3 and float2 } cbuffer AABBBounds { float4 boxLBDcorner; // float3 float4 boxRTUcorner; // float3 } cbuffer EmitterParams { float size; float4 center; // Actually float3. We don't support float3 and float2 float4 splatColor; } cbuffer OOBBClipPlanes { float4 OOBBClipPlane[6]; // 0 - Top // 1 - Bottom } // For fire simulation. Fuel extinction speed. static const float k = 0.006; ///////////////////////////////////////////////////////////////// // Structs ///////////////////////////////////////////////////////////////// // fluidsim struct v_fluidsim { float3 position : POSITION; // 2D slice vertex coordinates in clip space float3 textureCoords0 : TEXCOORD; // 3D cell coordinates (x,y,z in 0-dimension range) }; struct v2g_fluidsim { float3 cell0 : TEXCOORD0; float3 texcoords : TEXCOORD1; float2 LR : TEXCOORD2; float2 BT : TEXCOORD3; float2 DU : TEXCOORD4; float4 pos : SV_Position; }; struct g2p_fluidsim { float3 cell0 : TEXCOORD0; // 3D cell coordinates (x,y,z in 0-dimension range) float3 texcoords : TEXCOORD1; // 3D cell texcoords (x,y,z in 0-1 range) float2 LR : TEXCOORD2; // 3D cell texcoords for the Left and Right neighbors float2 BT : TEXCOORD3; // 3D cell texcoords for the Bottom and Top neighbors float2 DU : TEXCOORD4; // 3D cell texcoords for the Down and Up neighbors float4 pos : SV_Position; // 2D slice vertex coordinates in homogenous clip space uint RTIndex : SV_RenderTargetArrayIndex; // used to choose the destination slice }; struct p_fluidsim { float3 cell0 : TEXCOORD0; // 3D cell coordinates (x,y,z in 0-dimension range) float3 texcoords : TEXCOORD1; // 3D cell texcoords (x,y,z in 0-1 range) float2 LR : TEXCOORD2; // 3D cell texcoords for the Left and Right neighbors float2 BT : TEXCOORD3; // 3D cell texcoords for the Bottom and Top neighbors float2 DU : TEXCOORD4; // 3D cell texcoords for the Down and Up neighbors }; ///////////////////////////////////////////////////////////////// // fluidsim_clip // TODO: DX10: These structures are used for obstacle rendering. Remove unused fields. struct v2g_fluidsim_clip { float3 cell0 : TEXCOORD0; float3 texcoords : TEXCOORD1; float2 LR : TEXCOORD2; float2 BT : TEXCOORD3; float2 DU : TEXCOORD4; float3 clip0 : SV_ClipDistance0; float3 clip1 : SV_ClipDistance1; float4 pos : SV_Position; }; struct g2p_fluidsim_clip { float3 cell0 : TEXCOORD0; // 3D cell coordinates (x,y,z in 0-dimension range) float3 texcoords : TEXCOORD1; // 3D cell texcoords (x,y,z in 0-1 range) float2 LR : TEXCOORD2; // 3D cell texcoords for the Left and Right neighbors float2 BT : TEXCOORD3; // 3D cell texcoords for the Bottom and Top neighbors float2 DU : TEXCOORD4; // 3D cell texcoords for the Down and Up neighbors float3 clip0 : SV_ClipDistance0; float3 clip1 : SV_ClipDistance1; float4 pos : SV_Position; // 2D slice vertex coordinates in homogenous clip space uint RTIndex : SV_RenderTargetArrayIndex; // used to choose the destination slice }; struct p_fluidsim_clip { float3 cell0 : TEXCOORD0; // 3D cell coordinates (x,y,z in 0-dimension range) float3 texcoords : TEXCOORD1; // 3D cell texcoords (x,y,z in 0-1 range) float2 LR : TEXCOORD2; // 3D cell texcoords for the Left and Right neighbors float2 BT : TEXCOORD3; // 3D cell texcoords for the Bottom and Top neighbors float2 DU : TEXCOORD4; // 3D cell texcoords for the Down and Up neighbors float3 clip0 : SV_ClipDistance0; float3 clip1 : SV_ClipDistance1; }; ///////////////////////////////////////////////////////////////// // fluidsim_clip // TODO: DX10: These structures are used for obstacle rendering. Remove unused fields. struct v2g_fluidsim_dyn_aabb { float3 cell0 : TEXCOORD0; float3 velocity : TEXCOORD1; float3 clip0 : SV_ClipDistance0; float3 clip1 : SV_ClipDistance1; float4 pos : SV_Position; }; struct g2p_fluidsim_dyn_aabb { float3 cell0 : TEXCOORD0; // 3D cell coordinates (x,y,z in 0-dimension range) float3 velocity : TEXCOORD1; // speed of the point in local space float3 clip0 : SV_ClipDistance0; float3 clip1 : SV_ClipDistance1; float4 pos : SV_Position; // 2D slice vertex coordinates in homogenous clip space uint RTIndex : SV_RenderTargetArrayIndex; // used to choose the destination slice }; struct p_fluidsim_dyn_aabb { float3 cell0 : TEXCOORD0; // 3D cell coordinates (x,y,z in 0-dimension range) float3 velocity : TEXCOORD1; float3 clip0 : SV_ClipDistance0; float3 clip1 : SV_ClipDistance1; }; //-------------------------------------------------------------------------------------- // Helper functions //-------------------------------------------------------------------------------------- float4 GetObstVelocity( float3 cellTexCoords ) { return Texture_obstvelocity.SampleLevel(samPointClamp, cellTexCoords, 0); } bool IsNonEmptyCell( float3 cellTexCoords ) { return (Texture_obstacles.SampleLevel(samPointClamp, cellTexCoords, 0).r > 0.0); } bool IsBoundaryCell( float3 cellTexCoords ) { return (Texture_obstacles.SampleLevel(samPointClamp, cellTexCoords, 0).r > 0.9); } float3 GetAdvectedPosTexCoords(p_fluidsim input) { float3 pos = input.cell0; pos -= timestep * forward * Texture_velocity0.SampleLevel( samPointClamp, input.texcoords, 0 ).xyz; return float3(pos.x/textureWidth, pos.y/textureHeight, (pos.z+0.5)/textureDepth); }