diff --git a/projects/fire_works/shaders/add.comp b/projects/fire_works/shaders/add.comp
index 365919852135ca0cfb2e6803e524a5468b5ba103..737a1f3fd69e237f7692be8a6b36b1e14f1fd50a 100644
--- a/projects/fire_works/shaders/add.comp
+++ b/projects/fire_works/shaders/add.comp
@@ -20,7 +20,18 @@ layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
 
 #define NUM_VOXEL_SAMPLES 32
 
+shared vec2 sc_data [NUM_VOXEL_SAMPLES];
+
 void main() {
+    const float localRadian = 0.25f * pi * randomData[gl_LocalInvocationIndex % randomData.length()];
+
+    sc_data[gl_LocalInvocationIndex % NUM_VOXEL_SAMPLES] = vec2(
+        sin(localRadian), cos(localRadian)
+    );
+
+    memoryBarrierShared();
+    barrier();
+
     const ivec2 res = imageSize(outImage);
 
     if(any(greaterThanEqual(gl_GlobalInvocationID.xy, res))){
@@ -34,34 +45,15 @@ void main() {
     vec4 outTrails = imageLoad(inTrails, uv);
 
     vec2 pos = (vec2(uv) + vec2(0.5f)) / vec2(res);
-    vec2 size = vec2(textureSize(sampler2D(voxelTexture, voxelSampler), 0));
-
-    vec4 outSamples = vec4(0.0f);
-
-    const uint globalID = uv.y + uv.x * res.y;
-
-    for (uint i = 0; i < NUM_VOXEL_SAMPLES; i++) {
-        vec2 noise = vec2(
-            randomData[(globalID * NUM_VOXEL_SAMPLES * 2 + i * 2 + 0) % randomData.length()],
-            randomData[(globalID * NUM_VOXEL_SAMPLES * 2 + i * 2 + 1) % randomData.length()]
-        );
-
-        float noiseF = max(0.0f, 1.0f - length(noise));
-
-        outSamples += texture(
-            sampler2D(voxelTexture, voxelSampler),
-            pos + noise * (NUM_VOXEL_SAMPLES - 1.0f) / size
-        ) * (noiseF * noiseF);
-    }
 
-    outSamples /= NUM_VOXEL_SAMPLES;
+    vec4 outSamples = texture(sampler2D(voxelTexture, voxelSampler), pos);
 
     vec4 result = vec4(0.0f);
 
     result = smokeBlend(result, outParticles);
     result = smokeBlend(result, outTrails);
     result = smokeBlend(result, outSmoke);
-    result = smokeBlend(result, outSamples);
+    result = smokeBlend(result, outSamples * 0.1f);
 
     result.r = clamp(result.r, 0, 1);
     result.g = clamp(result.g, 0, 1);
diff --git a/projects/fire_works/shaders/fluid.comp b/projects/fire_works/shaders/fluid.comp
index fc382f33866ae101a1ce94fa29a0176b7ce55f0c..076a280739e542c0579a7b80eaeaf4993df13edf 100644
--- a/projects/fire_works/shaders/fluid.comp
+++ b/projects/fire_works/shaders/fluid.comp
@@ -37,11 +37,12 @@ vec4 loadCachedData(vec3 position, ivec3 offset, ivec3 size) {
     uvec3 localId = gl_LocalInvocationID;
     ivec3 index = ivec3(localId) + offset;
 
-    if ((any(lessThan(index, ivec3(0)))) || (any(greaterThan(index, ivec3(gl_WorkGroupSize))))) {
-        return getDataFrom(position, vec3(offset) / vec3(size));
-    } else {
-        return cachedData[index.x][index.y][index.z];
-    }
+    // TOO SPECIAL FOR GPU TO WORK..!
+    //if ((any(lessThan(index, ivec3(0)))) || (any(greaterThan(index, ivec3(gl_WorkGroupSize))))) {
+    return getDataFrom(position, vec3(offset) / vec3(size));
+    //} else {
+    //    return cachedData[index.x][index.y][index.z];
+    //}
 }
 
 void main() {
diff --git a/projects/fire_works/shaders/voxel.inc b/projects/fire_works/shaders/voxel.inc
index 8097da994756313328509eb9ce0ccfbb12cb733b..9e2c895e4a0c688262de7404039aefe6650191bd 100644
--- a/projects/fire_works/shaders/voxel.inc
+++ b/projects/fire_works/shaders/voxel.inc
@@ -8,4 +8,11 @@
 #define voxel_write(img, pos, value) imageStore(img, pos, uvec4(VOXEL_NORM_VALUE * value));
 #define voxel_read(img, pos) imageLoad(img, pos).r / float(VOXEL_NORM_VALUE);
 
+// https://stackoverflow.com/questions/51108596/linearize-depth
+float linearize_depth(float d,float zNear,float zFar) {
+    return zNear * zFar / (zFar + d * (zNear - zFar));
+}
+
+#define voxel_pos(pos) vec3((pos.xy + vec2(1.0f)) * 0.5f, linearize_depth(pos.y, 0.1f, 50.0f))
+
 #endif // VOXEL_INC
\ No newline at end of file
diff --git a/projects/fire_works/shaders/voxel_particle.comp b/projects/fire_works/shaders/voxel_particle.comp
index 301c4c9d4fb0b6715dae61bd7625688fe8dd8584..12b68eed09746f38286a5b1f1b4e9e56d4bfe105 100644
--- a/projects/fire_works/shaders/voxel_particle.comp
+++ b/projects/fire_works/shaders/voxel_particle.comp
@@ -43,7 +43,7 @@ void main() {
     }
 
     vec3 ndc_pos = cs_pos.xyz / cs_pos.w;
-    vec3 pos = (ndc_pos + vec3(1, 1, 0)) * vec3(0.5f, 0.5f, 1.0f);
+    vec3 pos = voxel_pos(ndc_pos);
 
     if ((any(greaterThanEqual(pos, vec3(1.5f)))) || (any(lessThanEqual(pos, vec3(-0.5f))))) {
         return;
diff --git a/projects/fire_works/shaders/voxel_smoke.comp b/projects/fire_works/shaders/voxel_smoke.comp
index f399eba77efcf4e4745076dcca6807d67f1e9f12..de216ab29a6671e1547600d072edaf510b775154 100644
--- a/projects/fire_works/shaders/voxel_smoke.comp
+++ b/projects/fire_works/shaders/voxel_smoke.comp
@@ -52,7 +52,7 @@ void main() {
                 }
 
                 vec3 ndc_pos = cs_pos.xyz / cs_pos.w;
-                vec3 pos = (ndc_pos + vec3(1, 1, 0)) * vec3(0.5f, 0.5f, 1.0f);
+                vec3 pos = voxel_pos(ndc_pos);
 
                 if ((any(greaterThanEqual(pos, vec3(1.5f)))) || (any(lessThanEqual(pos, vec3(-0.5f))))) {
                     return;
diff --git a/projects/fire_works/shaders/voxel_trail.comp b/projects/fire_works/shaders/voxel_trail.comp
index 667e402c9077a51d481bc72e6d3bead2638d8230..56971a1719075e0dd9a6a5bb6b52e89c11f8489c 100644
--- a/projects/fire_works/shaders/voxel_trail.comp
+++ b/projects/fire_works/shaders/voxel_trail.comp
@@ -73,7 +73,7 @@ void main() {
         }
 
         vec3 ndc_pos = cs_pos.xyz / cs_pos.w;
-        vec3 pos = (ndc_pos + vec3(1, 1, 0)) * vec3(0.5f, 0.5f, 1.0f);
+        vec3 pos = voxel_pos(ndc_pos);
 
         if ((any(greaterThanEqual(pos, vec3(1.5f)))) || (any(lessThanEqual(pos, vec3(-0.5f))))) {
             continue;