From e5bbfd9ca56fbc012f146c67028fbe50660a7a1e Mon Sep 17 00:00:00 2001
From: amandaghassaei <amandaghassaei@gmail.com>
Date: Sun, 28 May 2017 23:47:25 -0400
Subject: [PATCH] update dist to nodes 1 and 2 form crease

---
 css/main.css                |  3 ++
 index.html                  | 65 +++++++++++++++++++++++++++++++++----
 js/crease.js                |  5 +--
 js/dynamic/dynamicSolver.js | 34 ++++++++++++++++---
 js/node.js                  |  4 +--
 5 files changed, 97 insertions(+), 14 deletions(-)

diff --git a/css/main.css b/css/main.css
index 92d6ee2..7ed51cc 100755
--- a/css/main.css
+++ b/css/main.css
@@ -230,6 +230,9 @@ span.modal-close{
 .checkbox input.custom-checkbox[type="checkbox"]:checked + .icons .icon-checked, .radio input.custom-checkbox[type="checkbox"]:checked + .icons .icon-checked, .checkbox input.custom-radio[type="radio"]:checked + .icons .icon-checked, .radio input.custom-radio[type="radio"]:checked + .icons .icon-checked {
     color: #666;
 }
+.checkbox .icon-checked, .radio .icon-checked, .checkbox .icon-unchecked, .radio .icon-unchecked {
+    color: #bdc3c7;
+}
 
 .radio .icon-checked{
     transition-duration: 0s;
diff --git a/index.html b/index.html
index b02601d..9227bc2 100755
--- a/index.html
+++ b/index.html
@@ -140,6 +140,7 @@
         uniform sampler2D u_creaseMeta2;//[creaseIndex, momentArmLength, nodeIndex]
         uniform sampler2D u_normals;
         uniform sampler2D u_theta;//[theta, z, normal1Index, normal2Index]
+        uniform sampler2D u_creaseGeo;//[h1, h2, coef1, coef2]
 
         void main(){
             vec2 fragCoord = gl_FragCoord.xy;
@@ -201,12 +202,14 @@
 
                 vec4 thetas = texture2D(u_theta, scaledCreaseIndex);
                 vec3 creaseMeta = texture2D(u_creaseMeta, scaledCreaseIndex).xyz;//[k, d, targetTheta]
+                vec4 creaseGeo = texture2D(u_creaseGeo, scaledCreaseIndex);//[h1, h2, coef1, coef2]
 
                 float targetTheta = creaseMeta[2] * u_creasePercent;
                 float angForce = creaseMeta[0]*(targetTheta-thetas[0]);// + creaseMeta[1]*thetas[1];
 
+                float nodeNum = creaseMeta2[2];//1, 2, 3, 4
+
                 if (creaseMeta2[3] < 0.0){//crease reaction, node is on a crease
-                    float nodeNum = creaseMeta2[2];
 
                     //node #1
                     float normalIndex1D = thetas[2];
@@ -223,20 +226,26 @@
                     float coef1 = creaseMeta2[1];
                     float coef2 = creaseMeta2[2];
 
-                    vec3 _force = -angForce*(coef1*normal1 + coef2*normal2);
+                    //if (nodeNum == 3.0){
+                     //   coef1 = 1.0-coef1;
+                     //   coef2 = 1.0-coef2;
+                    //}
+
+                    vec3 _force = -angForce*(coef1/creaseGeo[0]*normal1 + coef2/creaseGeo[1]*normal2);
                     force += _force;
+
                 } else {
-                    float nodeNum = creaseMeta2[2];
+
                     float normalIndex1D = thetas[2];//node #1
-                    if (nodeNum > 1.1) {
+                    float momentArm = creaseGeo[0];//node #1
+                    if (nodeNum == 2.0) {
                         normalIndex1D = thetas[3];//node #2
+                        momentArm = creaseGeo[1];//node #2
                     }
                     vec2 normalsIndex = vec2(mod(normalIndex1D, u_textureDimFaces.x)+0.5, floor(normalIndex1D/u_textureDimFaces.x)+0.5);
                     vec2 scaledNormalsIndex = normalsIndex/u_textureDimFaces;
                     vec3 normal = texture2D(u_normals, scaledNormalsIndex).xyz;
 
-                    float momentArm = creaseMeta2[1];
-
                     vec3 _force = angForce/momentArm*normal;
                     force += _force;
                 }
@@ -347,6 +356,50 @@
         }
     </script>
 
+    <script id="updateCreaseGeo" type="x-shader/x-fragment">
+        precision mediump float;
+        uniform vec2 u_textureDim;
+        uniform vec2 u_textureDimCreases;
+        uniform sampler2D u_lastPosition;
+        uniform sampler2D u_originalPosition;
+        uniform sampler2D u_creaseMeta3;
+
+        void main(){
+            vec2 fragCoord = gl_FragCoord.xy;
+            vec2 scaledFragCoord = fragCoord/u_textureDimCreases;
+
+            vec4 creaseMeta = texture2D(u_creaseMeta3, scaledFragCoord);
+
+            vec2 node1Index = vec2(mod(creaseMeta[0], u_textureDim.x)+0.5, floor(creaseMeta[0]/u_textureDim.x)+0.5)/u_textureDim;
+            vec2 node2Index = vec2(mod(creaseMeta[1], u_textureDim.x)+0.5, floor(creaseMeta[1]/u_textureDim.x)+0.5)/u_textureDim;
+            vec2 node3Index = vec2(mod(creaseMeta[2], u_textureDim.x)+0.5, floor(creaseMeta[2]/u_textureDim.x)+0.5)/u_textureDim;
+            vec2 node4Index = vec2(mod(creaseMeta[3], u_textureDim.x)+0.5, floor(creaseMeta[3]/u_textureDim.x)+0.5)/u_textureDim;
+
+            vec3 node1 = texture2D(u_lastPosition, node1Index).xyz + texture2D(u_originalPosition, node1Index).xyz;
+            vec3 node2 = texture2D(u_lastPosition, node2Index).xyz + texture2D(u_originalPosition, node2Index).xyz;
+            vec3 node3 = texture2D(u_lastPosition, node3Index).xyz + texture2D(u_originalPosition, node3Index).xyz;
+            vec3 node4 = texture2D(u_lastPosition, node4Index).xyz + texture2D(u_originalPosition, node4Index).xyz;
+
+            vec3 creaseVector = node4-node3;
+            float creaseLength = length(creaseVector);
+            creaseVector /= creaseLength;
+
+            vec3 vector1 = node1-node3;
+            vec3 vector2 = node2-node3;
+
+            float proj1Length = dot(creaseVector, vector1);
+            float proj2Length = dot(creaseVector, vector2);
+            float dist1 = sqrt(vector1.x*vector1.x+vector1.y*vector1.y+vector1.z*vector1.z-proj1Length*proj1Length);
+            float dist2 = sqrt(vector2.x*vector2.x+vector2.y*vector2.y+vector2.z*vector2.z-proj2Length*proj2Length);
+
+            float tol = 0.0001;
+            if (dist1<tol) dist1 = tol;
+            if (dist2<tol) dist2 = tol;
+
+            gl_FragColor = vec4(dist1, dist2, (proj1Length/creaseLength)/dist1, (proj2Length/creaseLength)/dist2);
+        }
+    </script>
+
     <script type="text/javascript" src="dependencies/jquery-3.1.1.min.js"></script>
     <script type="text/javascript" src="dependencies/jquery-ui.min.js"></script>
     <script type="text/javascript" src="dependencies/flat-ui.min.js"></script>
diff --git a/js/crease.js b/js/crease.js
index c4d7bf3..ccfe6ba 100755
--- a/js/crease.js
+++ b/js/crease.js
@@ -82,7 +82,7 @@ Crease.prototype.getCoef = function(node, edgeNode){
         console.warn("bad moment arm");
         length = 0.001;
     }
-    return (1-projLength/creaseLength)/length;
+    return (1-projLength/creaseLength);
 };
 
 Crease.prototype.getLengthTo = function(node){
@@ -101,7 +101,8 @@ Crease.prototype.getLengthTo = function(node){
 Crease.prototype.getNodeIndex = function(node){
     if (node == this.node1) return 1;
     else if (node == this.node2) return 2;
-    console.warn("no node found");
+    else if (node == this.edge.nodes[0]) return 3;
+    else if (node == this.edge.nodes[1]) return 4;
     return 0;
 };
 
diff --git a/js/dynamic/dynamicSolver.js b/js/dynamic/dynamicSolver.js
index 89c8834..6bd175f 100755
--- a/js/dynamic/dynamicSolver.js
+++ b/js/dynamic/dynamicSolver.js
@@ -28,6 +28,8 @@ function initDynamicSolver(globals){
     var creaseMeta;//[k, d, targetTheta]
     var creaseMeta2;//[creaseIndex (thetaIndex), length to node, nodeIndex (1/2), 0] - this is for nodes which are opposite the crease
                     //[creaseIndex (thetaIndex), coef1, coef2, -1] - this is for nodes which are on the crease
+    var creaseMeta3;//[node1Index, node2Index, node3index, node4index]//nodes 1 and 2 are opposite crease, 3 and 4 are on crease
+    var creaseGeo;//[h1, h2, coef1, coef2]
     var creaseVectors;//indices of crease nodes
     var theta;//[theta, w, normalIndex1, normalIndex2]
     var lastTheta;//[theta, w, normalIndex1, normalIndex2]
@@ -124,10 +126,14 @@ function initDynamicSolver(globals){
         gpuMath.step("thetaCalc", ["u_normals", "u_lastTheta", "u_creaseVectors", "u_lastPosition",
             "u_originalPosition"], "u_theta");
 
+        gpuMath.setProgram("updateCreaseGeo");
+        //already at textureDimCreasesxtextureDimCreases
+        gpuMath.step("updateCreaseGeo", ["u_lastPosition", "u_originalPosition", "u_creaseMeta3"], "u_creaseGeo");
+
         gpuMath.setProgram("velocityCalc");
         gpuMath.setSize(textureDim, textureDim);
         gpuMath.step("velocityCalc", ["u_lastPosition", "u_lastVelocity", "u_originalPosition", "u_externalForces",
-            "u_mass", "u_meta", "u_beamMeta", "u_creaseMeta", "u_creaseMeta2", "u_normals", "u_theta"], "u_velocity");
+            "u_mass", "u_meta", "u_beamMeta", "u_creaseMeta", "u_creaseMeta2", "u_normals", "u_theta", "u_creaseGeo"], "u_velocity");
         gpuMath.step("positionCalc", ["u_velocity", "u_lastPosition", "u_mass"], "u_position");
 
         gpuMath.swapTextures("u_theta", "u_lastTheta");
@@ -261,6 +267,9 @@ function initDynamicSolver(globals){
 
         gpuMath.initTextureFromData("u_meta", textureDim, textureDim, "FLOAT", meta, true);
         gpuMath.initTextureFromData("u_creaseMeta2", textureDimNodeCreases, textureDimNodeCreases, "FLOAT", creaseMeta2, true);
+        gpuMath.initTextureFromData("u_creaseMeta3", textureDimCreases, textureDimCreases, "FLOAT", creaseMeta3, true);
+        gpuMath.initTextureFromData("u_creaseGeo", textureDimCreases, textureDimCreases, "FLOAT", creaseGeo, true);
+        gpuMath.initFrameBufferForTexture("u_creaseGeo", true);
         gpuMath.initTextureFromData("u_faceVertexIndices", textureDimFaces, textureDimFaces, "FLOAT", faceVertexIndices, true);
 
         gpuMath.createProgram("positionCalc", vertexShader, document.getElementById("positionCalcShader").text);
@@ -281,6 +290,7 @@ function initDynamicSolver(globals){
         gpuMath.setUniformForProgram("velocityCalc", "u_creaseMeta2", 8, "1i");
         gpuMath.setUniformForProgram("velocityCalc", "u_normals", 9, "1i");
         gpuMath.setUniformForProgram("velocityCalc", "u_theta", 10, "1i");
+        gpuMath.setUniformForProgram("velocityCalc", "u_creaseGeo", 11, "1i");
         gpuMath.setUniformForProgram("velocityCalc", "u_textureDim", [textureDim, textureDim], "2f");
         gpuMath.setUniformForProgram("velocityCalc", "u_textureDimEdges", [textureDimEdges, textureDimEdges], "2f");
         gpuMath.setUniformForProgram("velocityCalc", "u_textureDimFaces", [textureDimFaces, textureDimFaces], "2f");
@@ -316,6 +326,13 @@ function initDynamicSolver(globals){
         gpuMath.setUniformForProgram("centerTexture", "u_lastPosition", 0, "1i");
         gpuMath.setUniformForProgram("centerTexture", "u_textureDim", [textureDim, textureDim], "2f");
 
+        gpuMath.createProgram("updateCreaseGeo", vertexShader, document.getElementById("updateCreaseGeo").text);
+        gpuMath.setUniformForProgram("updateCreaseGeo", "u_lastPosition", 0, "1i");
+        gpuMath.setUniformForProgram("updateCreaseGeo", "u_originalPosition", 1, "1i");
+        gpuMath.setUniformForProgram("updateCreaseGeo", "u_creaseMeta3", 2, "1i");
+        gpuMath.setUniformForProgram("updateCreaseGeo", "u_textureDim", [textureDim, textureDim], "2f");
+        gpuMath.setUniformForProgram("updateCreaseGeo", "u_textureDimCreases", [textureDimCreases, textureDimCreases], "2f");
+
         gpuMath.setSize(textureDim, textureDim);
 
         programsInited = true;
@@ -437,7 +454,7 @@ function initDynamicSolver(globals){
         for (var i=0;i<nodes.length;i++){
             numNodeCreases += nodes[i].numCreases();
         }
-        numNodeCreases += numCreases*2;
+        numNodeCreases += numCreases*2;//reactions
         textureDimNodeCreases = calcTextureSize(numNodeCreases);
 
         var numFaces = faces.length;
@@ -457,6 +474,8 @@ function initDynamicSolver(globals){
         faceVertexIndices = new Float32Array(textureDimFaces*textureDimFaces*4);
         creaseMeta = new Float32Array(textureDimCreases*textureDimCreases*4);
         creaseMeta2 = new Float32Array(textureDimNodeCreases*textureDimNodeCreases*4);
+        creaseMeta3 = new Float32Array(textureDimCreases*textureDimCreases*4);
+        creaseGeo = new Float32Array(textureDimCreases*textureDimCreases*4);
         creaseVectors = new Float32Array(textureDimCreases*textureDimCreases*4);
         theta = new Float32Array(textureDimCreases*textureDimCreases*4);
         lastTheta = new Float32Array(textureDimCreases*textureDimCreases*4);
@@ -492,8 +511,7 @@ function initDynamicSolver(globals){
             meta[i*4+3] = nodeCreases.length + nodeInvCreases.length;
             for (var j=0;j<nodeCreases.length;j++){
                 creaseMeta2[index*4] = nodeCreases[j].getIndex();
-                creaseMeta2[index*4+1] = nodeCreases[j].getLengthTo(nodes[i]);
-                creaseMeta2[index*4+2] = nodeCreases[j].getNodeIndex(nodes[i]);//type 1 or 2
+                creaseMeta2[index*4+2] = nodeCreases[j].getNodeIndex(nodes[i]);//type 1, 2, 3, 4
                 //creaseMeta2[index*4+2] = 0 tells us that it is a node opposite a crease
                 index++;
             }
@@ -505,6 +523,14 @@ function initDynamicSolver(globals){
                 index++;
             }
         }
+        for (var i=0;i<creases.length;i++){
+            var crease = creases[i];
+            creaseMeta3[i*4] = crease.node1.getIndex();
+            creaseMeta3[i*4+1] = crease.node2.getIndex();
+            creaseMeta3[i*4+2] = crease.edge.nodes[0].getIndex();
+            creaseMeta3[i*4+3] = crease.edge.nodes[1].getIndex();
+            index++;
+        }
 
         updateOriginalPosition();
         updateMaterials(true);
diff --git a/js/node.js b/js/node.js
index e405a35..1d09203 100755
--- a/js/node.js
+++ b/js/node.js
@@ -8,7 +8,7 @@ var nodeMaterialHighlight = new THREE.MeshBasicMaterial({color: 0xffffff, side:T
 var transparentMaterial = new THREE.MeshBasicMaterial({color: 0xffffff, opacity:0.5, transparent:true});
 var transparentVRMaterial = new THREE.MeshBasicMaterial({color: 0xeeeeee, opacity:0.8, transparent:true});
 
-var nodeGeo = new THREE.SphereGeometry(0.04,20);
+var nodeGeo = new THREE.SphereGeometry(0.02,20);
 var nodeFixedGeo = new THREE.CubeGeometry(1, 1, 1);
 
 function Node(position, index){
@@ -150,7 +150,7 @@ Node.prototype.setTransparent = function(){
 
 Node.prototype.setTransparentVR = function(){
     this.object3D.material = transparentVRMaterial;
-    this.object3D.scale.set(0.2, 0.2, 0.2);
+    this.object3D.scale.set(0.4, 0.4, 0.4);
 };
 
 Node.prototype.hide = function(){
-- 
GitLab