diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index ecd57e12afcd54da58faa7b8e1d6797cf843d894..acf72765aa2b1504f2ff9e931599af1c47cb9c1e 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -17,19 +17,29 @@ void main()	{
     memoryBarrierImage();
 
     if (gl_GlobalInvocationID.x < particles.length()) {
-        vec3 position = particles[gl_GlobalInvocationID.x].minimal.position;
-        float mass = particles[gl_GlobalInvocationID.x].minimal.mass;
+        ParticleMinimal minimal = particles[gl_GlobalInvocationID.x].minimal;
 
-        vec3 offset = position;
+        ivec3 gridResolution = textureSize(sampler3D(gridImage, gridSampler), 0);
+        ivec3 gridWindow = ivec3(minimal.size * 2.0f * gridResolution);
 
-        vec4 gridSample = texture(sampler3D(gridImage, gridSampler), offset);
+        vec3 velocity_pic = vec3(0.0f);
+        uint i, j, k;
 
-        vec3 gridVelocity = gridSample.xyz;
-        float gridMass = gridSample.w;
+        for (i = -gridWindow.x; i <= gridWindow.x; i++) {
+            for (j = -gridWindow.y; j <= gridWindow.y; j++) {
+                for (k = -gridWindow.z; k <= gridWindow.z; k++) {
+                    vec3 voxel = minimal.position + vec3(i, j, k) / gridResolution;
 
-        if (gridMass > 0.0f) {
-            particles[gl_GlobalInvocationID.x].minimal.velocity = gridVelocity * mass / gridMass;
+                    if (distance(voxel, minimal.position) < minimal.size * 2.0f) {
+                        vec4 gridSample = texture(sampler3D(gridImage, gridSampler), voxel);
+
+                        velocity_pic += voxel_particle_weight(voxel, minimal) * gridSample.xyz;
+                    }
+                }
+            }
         }
+
+        particles[gl_GlobalInvocationID.x].minimal.velocity = velocity_pic;
     }
 
     memoryBarrierBuffer();