From 3fdabc260f24e651c4c963de056bbd9679b04555 Mon Sep 17 00:00:00 2001
From: amandaghassaei <amandaghassaei@gmail.com>
Date: Sun, 2 Apr 2017 22:18:56 -0400
Subject: [PATCH] compute pressure

---
 index.html | 41 +++++++++++++++++++++++++++++++++--------
 main.js    | 43 +++++++++++++++++++++++++++++--------------
 2 files changed, 62 insertions(+), 22 deletions(-)

diff --git a/index.html b/index.html
index 373a119..6220bad 100644
--- a/index.html
+++ b/index.html
@@ -29,6 +29,30 @@
         }
     </script>
 
+    <script id="divergenceShader" type="x-shader/x-fragment">
+        precision mediump float;
+
+        uniform sampler2D u_velocity;
+
+        uniform vec2 u_textureSize;
+
+        uniform float u_halfReciprocalDx;
+
+        void main() {
+
+            vec2 fragCoord = gl_FragCoord.xy;
+
+            //finite difference formulation of divergence
+
+            float n = texture2D(u_velocity, (fragCoord+vec2(0.0, 1.0))/u_textureSize).y;
+            float s = texture2D(u_velocity, (fragCoord+vec2(0.0, -1.0))/u_textureSize).y;
+            float e = texture2D(u_velocity, (fragCoord+vec2(1.0, 0.0))/u_textureSize).x;
+            float w = texture2D(u_velocity, (fragCoord+vec2(-1.0, 0.0))/u_textureSize).x;
+
+            gl_FragColor = vec4(u_halfReciprocalDx*(e-w + n-s), 0, 0, 0);
+        }
+    </script>
+
     <script id="forceShader" type="x-shader/x-fragment">
         precision mediump float;
 
@@ -59,10 +83,11 @@
         }
     </script>
 
-     <script id="diffuseShader" type="x-shader/x-fragment">
+    <script id="jacobiShader" type="x-shader/x-fragment">
         precision mediump float;
 
-        uniform sampler2D u_material;
+        uniform sampler2D u_b;
+        uniform sampler2D u_x;
 
         uniform vec2 u_textureSize;
 
@@ -73,20 +98,20 @@
 
             vec2 fragCoord = gl_FragCoord.xy;
 
-            vec2 currentState = texture2D(u_material, fragCoord/u_textureSize).xy;
+            vec2 currentState = texture2D(u_b, fragCoord/u_textureSize).xy;
 
             //implicitly solve diffusion via jacobi iteration
 
-            vec2 n = texture2D(u_material, (fragCoord+vec2(0.0, 1.0))/u_textureSize).xy;
-            vec2 s = texture2D(u_material, (fragCoord+vec2(0.0, -1.0))/u_textureSize).xy;
-            vec2 e = texture2D(u_material, (fragCoord+vec2(1.0, 0.0))/u_textureSize).xy;
-            vec2 w = texture2D(u_material, (fragCoord+vec2(-1.0, 0.0))/u_textureSize).xy;
+            vec2 n = texture2D(u_x, (fragCoord+vec2(0.0, 1.0))/u_textureSize).xy;
+            vec2 s = texture2D(u_x, (fragCoord+vec2(0.0, -1.0))/u_textureSize).xy;
+            vec2 e = texture2D(u_x, (fragCoord+vec2(1.0, 0.0))/u_textureSize).xy;
+            vec2 w = texture2D(u_x, (fragCoord+vec2(-1.0, 0.0))/u_textureSize).xy;
 
             vec2 nextState = (n + s + e + w + u_alpha * currentState) * u_reciprocalBeta;
 
             gl_FragColor = vec4(nextState, 0, 0);
         }
-    </script>
+   </script>
 
     <script id="advectShader" type="x-shader/x-fragment">
         precision mediump float;
diff --git a/main.js b/main.js
index bda07e2..f19f610 100755
--- a/main.js
+++ b/main.js
@@ -46,17 +46,23 @@ function initGL() {
     GPU.setUniformForProgram("advect", "u_velocity", 0, "1i");
     GPU.setUniformForProgram("advect", "u_material", 1, "1i");
 
+    GPU.createProgram("diverge", "2d-vertex-shader", "divergenceShader");
+    GPU.setUniformForProgram("diverge" ,"u_textureSize", [width, height], "2f");
+    GPU.setUniformForProgram("diverge", "u_halfReciprocalDx", 1/(2*dx), "1f");
+    GPU.setUniformForProgram("diverge", "u_velocity", 0, "1i");
+
     GPU.createProgram("force", "2d-vertex-shader", "forceShader");
     GPU.setUniformForProgram("force" ,"u_textureSize", [width, height], "2f");
     GPU.setUniformForProgram("force", "u_dt", dt, "1f");
     GPU.setUniformForProgram("force", "u_velocity", 0, "1i");
 
-    GPU.createProgram("diffuse", "2d-vertex-shader", "diffuseShader");
-    GPU.setUniformForProgram("diffuse" ,"u_textureSize", [width, height], "2f");
+    GPU.createProgram("jacobi", "2d-vertex-shader", "jacobiShader");
+    GPU.setUniformForProgram("jacobi" ,"u_textureSize", [width, height], "2f");
     var alpha = dx*dx/(nu*dt);
-    GPU.setUniformForProgram("diffuse", "u_alpha", alpha, "1f");
-    GPU.setUniformForProgram("diffuse", "u_reciprocalBeta", 1/(4+alpha), "1f");
-    GPU.setUniformForProgram("diffuse", "u_material", 0, "1i");
+    GPU.setUniformForProgram("jacobi", "u_alpha", alpha, "1f");
+    GPU.setUniformForProgram("jacobi", "u_reciprocalBeta", 1/(4+alpha), "1f");
+    GPU.setUniformForProgram("jacobi", "u_b", 0, "1i");
+    GPU.setUniformForProgram("jacobi", "u_x", 1, "1i");
 
     GPU.createProgram("render", "2d-vertex-shader", "2d-render-shader");
     GPU.setUniformForProgram("render" ,"u_textureSize", [width, height], "2f");
@@ -83,8 +89,8 @@ function render(){
         GPU.step("advect", ["velocity", "velocity"], "nextVelocity");//advect velocity
         GPU.swapTextures("velocity", "nextVelocity");
         for (var i=0;i<1;i++){
-            GPU.step("diffuse", ["velocity"], "nextVelocity");//diffuse velocity
-            GPU.step("diffuse", ["nextVelocity"], "velocity");//diffuse velocity
+            GPU.step("jacobi", ["velocity", "velocity"], "nextVelocity");//diffuse velocity
+            GPU.step("jacobi", ["nextVelocity", "nextVelocity"], "velocity");//diffuse velocity
         }
         GPU.setProgram("force");
         if (mouseEnable){
@@ -98,6 +104,14 @@ function render(){
         GPU.step("force", ["velocity"], "nextVelocity");
         GPU.swapTextures("velocity", "nextVelocity");
 
+        //compute pressure
+        GPU.step("diverge", ["velocity"], "velocityDivergence");//calc velocity divergence
+        for (var i=0;i<3;i++){
+            GPU.step("jacobi", ["velocityDivergence", "pressure"], "nextPressure");//diffuse velocity
+            GPU.step("jacobi", ["velocityDivergence", "nextPressure"], "pressure");//diffuse velocity
+        }
+
+        //subtract pressure gradient
 
         // GPU.step("diffuse", ["material"], "nextMaterial");
         GPU.step("advect", ["velocity", "material"], "nextMaterial");
@@ -130,17 +144,18 @@ function resetWindow(){
     GPU.setSize(width, height);
 
     var velocity = new Float32Array(width*height*4);
-    for (var i=0;i<height;i++){
-        for (var j=0;j<width;j++){
-            var index = 4*(i*width+j);
-            // velocity[index] = i/1000;
-            // velocity[index+1] = j/1000;
-        }
-    }
     GPU.initTextureFromData("velocity", width, height, "FLOAT", velocity, true);
     GPU.initFrameBufferForTexture("velocity");
     GPU.initTextureFromData("nextVelocity", width, height, "FLOAT", new Float32Array(width*height*4), true);
     GPU.initFrameBufferForTexture("nextVelocity");
+
+    GPU.initTextureFromData("velocityDivergence", width, height, "FLOAT", new Float32Array(width*height*4), true);
+    GPU.initFrameBufferForTexture("velocityDivergence");
+    GPU.initTextureFromData("pressure", width, height, "FLOAT", new Float32Array(width*height*4), true);
+    GPU.initFrameBufferForTexture("pressure");
+    GPU.initTextureFromData("nextPressure", width, height, "FLOAT", new Float32Array(width*height*4), true);
+    GPU.initFrameBufferForTexture("nextPressure");
+
     var material = new Float32Array(width*height*4);
     for (var i=0;i<height;i++){
         for (var j=0;j<width;j++){
-- 
GitLab