]> git.tdb.fi Git - libs/gl.git/blob - demos/forestpond/data/fluidsim_integrate.glsl
da3e8c18721a065ed671078649e1bdbba18b1238
[libs/gl.git] / demos / forestpond / data / fluidsim_integrate.glsl
1 import fluidsim;
2
3 #pragma MSP stage(compute)
4 void main()
5 {
6         ivec2 size = imageSize(surface_out);
7         ivec2 coord = ivec2(gl_GlobalInvocationID.xy)+1;
8         if(coord.x>=size.x-1 || coord.y>=size.y-1)
9                 return;
10
11         vec4 data = get_data(coord);
12         vec4 right_data = get_data(coord+ivec2(1, 0));
13         vec4 up_data = get_data(coord+ivec2(0, 1));
14         vec4 left_data = get_data(coord-ivec2(1, 0));
15         vec4 down_data = get_data(coord-ivec2(0, 1));
16
17         float ul_vx = texelFetch(velocity_in, coord+ivec2(-1, 1), 0).x;
18         float left2_vx = texelFetch(velocity_in, coord-ivec2(2, 0), 0).x;
19         vec2 dl_velocity = texelFetch(velocity_in, coord-ivec2(1, 1), 0).xy;
20         float down2_vy = texelFetch(velocity_in, coord-ivec2(0, 2), 0).y;
21         float dr_vy = texelFetch(velocity_in, coord+ivec2(1, -1), 0).y;
22
23         float clamping = get_clamping(data.w, data.x, data.y, left_data.x, down_data.y);
24         float right_cl = get_clamping(right_data.w, right_data.x, right_data.y, data.x, dr_vy);
25         float up_cl = get_clamping(up_data.w, up_data.x, up_data.y, ul_vx, data.y);
26         float left_cl = get_clamping(left_data.w, left_data.x, left_data.y, left2_vx, dl_velocity.y);
27         float down_cl = get_clamping(down_data.w, down_data.x, down_data.y, dl_velocity.x, down2_vy);
28
29         // Integration step: change surface level based on velocities
30         float total_flow_out = data.x*mix(data.w*clamping, right_data.w*right_cl, data.x<0)+
31                 data.y*mix(data.w*clamping, up_data.w*up_cl, data.y<0)-
32                 left_data.x*mix(data.w*clamping, left_data.w*left_cl, left_data.x>0)-
33                 down_data.y*mix(data.w*clamping, down_data.w*down_cl, down_data.y>0);
34         float new_surface = data.z-total_flow_out*delta_time;
35
36         imageStore(surface_out, coord, vec4(new_surface, 0.0, 0.0, 0.0));
37 }