Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct PS_INPUT {
- float2 uv: TEXCOORD0;
- };
- struct PS_OUTPUT {
- float4 color_0: SV_TARGET0;
- };
- uniform sampler2D texture_world;
- uniform sampler2D texture_material;
- uniform float2 acceleration;
- uniform float2 texel_size;
- uniform float time_step;
- uniform float maccormack_amount;
- uniform float dissipation;
- uniform float mode;
- float2 unpack_velocity(float4 data) {return float2(data.x + (data.y / 255.0), data.z + (data.w / 255.0));}
- float4 pack_velocity(float2 data) {return float4(floor(data.x * 255.0) / 255.0, frac(data.x * 255.0), floor(data.y * 255.0) / 255.0, frac(data.y * 255.0));}
- float unpack_density(float4 data) {return data.x + (data.y / 255.0) + (data.z / (255.0 * 255.0)) + (data.w / (255.0 * 255.0 * 255.0));}
- float4 pack_density(float data) {return float4(floor(data * 255.0) / 255.0, frac(data * 255.0), frac(data * 255.0 * 255.0), frac(data * 255.0 * 255.0 * 255.0));}
- void main(in PS_INPUT IN, out PS_OUTPUT OUT) {
- float velocity_range = 10.0;
- float2 velocity = (unpack_velocity(tex2D(gm_BaseTexture, IN.uv)) - 128.0 / 255.0) * velocity_range;
- float2 was = IN.uv - time_step * texel_size * velocity;
- float2 phi_hat_next = (unpack_velocity(tex2D(gm_BaseTexture, was)) - 128.0 / 255.0) * velocity_range;
- float2 phi_hat_now = (unpack_velocity(tex2D(gm_BaseTexture, IN.uv + time_step * texel_size * phi_hat_next)) - 128.0 / 255.0) * velocity_range;
- float2 phi_next = phi_hat_next + 0.5 * (velocity - phi_hat_now) * maccormack_amount;
- velocity = phi_next;
- // Clamps velocity.
- float2 coord = round(was / texel_size) * texel_size;
- float2 top_left = (unpack_velocity(tex2D(gm_BaseTexture, coord - 0.5 * texel_size)) - 128.0 / 255.0) * velocity_range;
- float2 bottom_right = (unpack_velocity(tex2D(gm_BaseTexture, coord + 0.5 * texel_size)) - 128.0 / 255.0) * velocity_range;
- float2 top_right = (unpack_velocity(tex2D(gm_BaseTexture, coord + float2(0.5 * texel_size.x, -0.5 * texel_size.y))) - 128.0 / 255.0) * velocity_range;
- float2 bottom_left = (unpack_velocity(tex2D(gm_BaseTexture, coord + float2(-0.5 * texel_size.x, 0.5 * texel_size.y))) - 128.0 / 255.0) * velocity_range;
- velocity.x = clamp(velocity.x, min(min(min(top_left.x, top_right.x), bottom_left.x), bottom_right.x), max(max(max(top_left.x, top_right.x), bottom_left.x), bottom_right.x));
- velocity.y = clamp(velocity.y, min(min(min(top_left.y, top_right.y), bottom_left.y), bottom_right.y), max(max(max(top_left.y, top_right.y), bottom_left.y), bottom_right.y));
- velocity *= dissipation;
- if (mode == 2.0) {
- velocity += float2(0.0, -0.3) * (tex2D(texture_material, IN.uv).w) * (tex2D(texture_material, IN.uv).w - 0.2);
- }
- if (tex2D(texture_world, IN.uv).w != 0.0) velocity = float2(0.0, 0.0);
- OUT.color_0 = pack_velocity(saturate(velocity / velocity_range + 128.0 / 255.0));
- }
Add Comment
Please, Sign In to add comment