X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=demos%2Fforestpond%2Fdata%2Ffluidsim_integrate.glsl;h=70ac923fd94ed9dfe6efb47ce7304640f53a1207;hb=24b76abad71996cb241b56ded239335fd26273cc;hp=f3805e8a8e6d2ea809659b4ecc82ed78e61843c2;hpb=7efe2d35f5d53c0f086a1b85b7d3dea6a6c709ab;p=libs%2Fgl.git diff --git a/demos/forestpond/data/fluidsim_integrate.glsl b/demos/forestpond/data/fluidsim_integrate.glsl index f3805e8a..70ac923f 100644 --- a/demos/forestpond/data/fluidsim_integrate.glsl +++ b/demos/forestpond/data/fluidsim_integrate.glsl @@ -1,6 +1,12 @@ import fluidsim; #pragma MSP stage(compute) +float get_clamping(float depth, float v_right, float v_up, float v_left, float v_down) +{ + float total_out = max(v_right, 0.0)+max(v_up, 0.0)-min(v_left, 0.0)-min(v_down, 0.0); + return min(max_flow_fraction/max(total_out*delta_time, max_flow_fraction), depth/residual_depth); +} + void main() { ivec2 size = imageSize(surface_out); @@ -8,28 +14,30 @@ void main() if(coord.x>=size.x-1 || coord.y>=size.y-1) return; - float surface = texelFetch(surface_in, coord, 0).x; - float bottom = texelFetch(bottom_in, coord, 0).x; - float depth = surface-bottom; - vec2 velocity = texelFetch(velocity_in, coord, 0).xy; - float clamping = texelFetch(clamping_in, coord, 0).x; - float left_depth = get_depth(coord-ivec2(1, 0)); - float left_clamping = texelFetch(clamping_in, coord-ivec2(1, 0), 0).x; - float left_vx = texelFetch(velocity_in, coord-ivec2(1, 0), 0).x; - float right_depth = get_depth(coord+ivec2(1, 0)); - float right_clamping = texelFetch(clamping_in, coord+ivec2(1, 0), 0).x; - float down_depth = get_depth(coord-ivec2(0, 1)); - float down_clamping = texelFetch(clamping_in, coord-ivec2(0, 1), 0).x; - float down_vy = texelFetch(velocity_in, coord-ivec2(0, 1), 0).y; - float up_depth = get_depth(coord+ivec2(0, 1)); - float up_clamping = texelFetch(clamping_in, coord+ivec2(0, 1), 0).x; + vec4 data = get_data(coord); + vec4 right_data = get_data(coord+ivec2(1, 0)); + vec4 up_data = get_data(coord+ivec2(0, 1)); + vec4 left_data = get_data(coord-ivec2(1, 0)); + vec4 down_data = get_data(coord-ivec2(0, 1)); + + float ul_vx = texelFetch(velocity_in, coord+ivec2(-1, 1), 0).x; + float left2_vx = texelFetch(velocity_in, coord-ivec2(2, 0), 0).x; + vec2 dl_velocity = texelFetch(velocity_in, coord-ivec2(1, 1), 0).xy; + float down2_vy = texelFetch(velocity_in, coord-ivec2(0, 2), 0).y; + float dr_vy = texelFetch(velocity_in, coord+ivec2(1, -1), 0).y; + + float clamping = get_clamping(data.w, data.x, data.y, left_data.x, down_data.y); + float right_cl = get_clamping(right_data.w, right_data.x, right_data.y, data.x, dr_vy); + float up_cl = get_clamping(up_data.w, up_data.x, up_data.y, ul_vx, data.y); + float left_cl = get_clamping(left_data.w, left_data.x, left_data.y, left2_vx, dl_velocity.y); + float down_cl = get_clamping(down_data.w, down_data.x, down_data.y, dl_velocity.x, down2_vy); // Integration step: change surface level based on velocities - float total_flow = left_vx*mix(left_depth*left_clamping, depth*clamping, left_vx<0)- - velocity.x*mix(depth*clamping, right_depth*right_clamping, velocity.x<0)+ - down_vy*mix(down_depth*down_clamping, depth*clamping, down_vy<0)- - velocity.y*mix(depth*clamping, up_depth*up_clamping, velocity.y<0); - float new_surface = surface+total_flow*delta_time; + float total_flow_out = data.x*mix(data.w*clamping, right_data.w*right_cl, data.x<0)+ + data.y*mix(data.w*clamping, up_data.w*up_cl, data.y<0)- + left_data.x*mix(data.w*clamping, left_data.w*left_cl, left_data.x>0)- + down_data.y*mix(data.w*clamping, down_data.w*down_cl, down_data.y>0); + float new_surface = data.z-total_flow_out*delta_time; imageStore(surface_out, coord, vec4(new_surface, 0.0, 0.0, 0.0)); }