Guest User

Untitled

a guest
Dec 29th, 2016
715
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. struct PS_INPUT {
  2. float2 uv: TEXCOORD0;
  3. };
  4.  
  5. struct PS_OUTPUT {
  6. float4 color_0: SV_TARGET0;
  7. };
  8.  
  9. uniform sampler2D texture_world;
  10. uniform sampler2D texture_material;
  11. uniform float2 acceleration;
  12. uniform float2 texel_size;
  13. uniform float time_step;
  14. uniform float maccormack_amount;
  15. uniform float dissipation;
  16. uniform float mode;
  17.  
  18. float2 unpack_velocity(float4 data) {return float2(data.x + (data.y / 255.0), data.z + (data.w / 255.0));}
  19. 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));}
  20. 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));}
  21. 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));}
  22.  
  23. void main(in PS_INPUT IN, out PS_OUTPUT OUT) {
  24. float velocity_range = 10.0;
  25.  
  26. float2 velocity = (unpack_velocity(tex2D(gm_BaseTexture, IN.uv)) - 128.0 / 255.0) * velocity_range;
  27.  
  28. float2 was = IN.uv - time_step * texel_size * velocity;
  29. float2 phi_hat_next = (unpack_velocity(tex2D(gm_BaseTexture, was)) - 128.0 / 255.0) * velocity_range;
  30. float2 phi_hat_now = (unpack_velocity(tex2D(gm_BaseTexture, IN.uv + time_step * texel_size * phi_hat_next)) - 128.0 / 255.0) * velocity_range;
  31. float2 phi_next = phi_hat_next + 0.5 * (velocity - phi_hat_now) * maccormack_amount;
  32. velocity = phi_next;
  33.  
  34. // Clamps velocity.
  35. float2 coord = round(was / texel_size) * texel_size;
  36. float2 top_left = (unpack_velocity(tex2D(gm_BaseTexture, coord - 0.5 * texel_size)) - 128.0 / 255.0) * velocity_range;
  37. float2 bottom_right = (unpack_velocity(tex2D(gm_BaseTexture, coord + 0.5 * texel_size)) - 128.0 / 255.0) * velocity_range;
  38. 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;
  39. 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;
  40. 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));
  41. 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));
  42.  
  43. velocity *= dissipation;
  44.  
  45. if (mode == 2.0) {
  46. velocity += float2(0.0, -0.3) * (tex2D(texture_material, IN.uv).w) * (tex2D(texture_material, IN.uv).w - 0.2);
  47. }
  48.  
  49. if (tex2D(texture_world, IN.uv).w != 0.0) velocity = float2(0.0, 0.0);
  50.  
  51. OUT.color_0 = pack_velocity(saturate(velocity / velocity_range + 128.0 / 255.0));
  52. }
Add Comment
Please, Sign In to add comment