From f040ca36b238437685734b78792f07ab78f66c53 Mon Sep 17 00:00:00 2001
From: amandaghassaei <amandaghassaei@gmail.com>
Date: Mon, 6 Mar 2017 02:09:07 -0500
Subject: [PATCH] added in crease reaction

---
 index.html         | 52 +++++++++++++++++++++++++++++++++-------------
 js/controls.js     |  2 +-
 js/crease.js       | 19 ++++++++++++++++-
 js/dynamicModel.js | 23 ++++++++++++++------
 js/node.js         | 12 +++++++++++
 5 files changed, 86 insertions(+), 22 deletions(-)

diff --git a/index.html b/index.html
index 46cc853..0d81137 100644
--- a/index.html
+++ b/index.html
@@ -165,7 +165,7 @@
                 float nodeCreaseIndex1D = meta[2]+float(j);
                 vec2 nodeCreaseIndex = vec2(mod(nodeCreaseIndex1D, u_textureDimNodeCreases.x)+0.5, floor(nodeCreaseIndex1D/u_textureDimNodeCreases.x)+0.5);
                 vec2 scaledNodeCreaseIndex = nodeCreaseIndex/u_textureDimNodeCreases;
-                vec4 creaseMeta2 = texture2D(u_creaseMeta2, scaledNodeCreaseIndex);//[creaseIndex, length to node, nodeIndex (1/2)]
+                vec4 creaseMeta2 = texture2D(u_creaseMeta2, scaledNodeCreaseIndex);//[creaseIndex, length to node, nodeType (1 or 2), isReaction]
 
                 float creaseIndex1D = creaseMeta2[0];
                 vec2 creaseIndex = vec2(mod(creaseIndex1D, u_textureDimCreases.x)+0.5, floor(creaseIndex1D/u_textureDimCreases.x)+0.5);
@@ -174,21 +174,45 @@
                 vec4 thetas = texture2D(u_theta, scaledCreaseIndex);
                 vec3 creaseMeta = texture2D(u_creaseMeta, scaledCreaseIndex).xyz;//[k, d, targetTheta]
 
-                float nodeNum = creaseMeta2[2];
-                float normalIndex1D = thetas[2];//node #1
-                float targetTheta = creaseMeta[2] * u_creasePercent;
-                if (nodeNum > 1.1) {
-                    normalIndex1D = thetas[3];//node #2
+                if (creaseMeta2[3] < 0.0){//crease reaction
+                    float nodeNum = creaseMeta2[2];
+
+                    //node #1
+                    float normalIndex1D = thetas[2];
+                    vec2 normalsIndex = vec2(mod(normalIndex1D, u_textureDimFaces.x)+0.5, floor(normalIndex1D/u_textureDimFaces.x)+0.5);
+                    vec2 scaledNormalsIndex = normalsIndex/u_textureDimFaces;
+                    vec3 normal1 = texture2D(u_normals, scaledNormalsIndex).xyz;
+
+                    //node #2
+                    normalIndex1D = thetas[3];
+                    normalsIndex = vec2(mod(normalIndex1D, u_textureDimFaces.x)+0.5, floor(normalIndex1D/u_textureDimFaces.x)+0.5);
+                    scaledNormalsIndex = normalsIndex/u_textureDimFaces;
+                    vec3 normal2 = texture2D(u_normals, scaledNormalsIndex).xyz;
+
+                    float targetTheta = creaseMeta[2] * u_creasePercent;
+
+                    float angForce = creaseMeta[0]*(targetTheta-thetas[0]);// + creaseMeta[1]*thetas[1];
+
+                    vec3 _force = -0.5*(angForce/creaseMeta2[1]*normal1 + angForce/creaseMeta2[2]*normal2);
+                    force += _force;
+                } else {
+                    float nodeNum = creaseMeta2[2];
+                    float normalIndex1D = thetas[2];//node #1
+                    float targetTheta = creaseMeta[2] * u_creasePercent;
+                    if (nodeNum > 1.1) {
+                        normalIndex1D = thetas[3];//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 angForce = creaseMeta[0]*(targetTheta-thetas[0]);// + creaseMeta[1]*thetas[1];
+                    float momentArm = creaseMeta2[1];
+
+                    vec3 _force = angForce/momentArm*normal;
+                    force += _force;
                 }
-                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 angForce = creaseMeta[0]*(targetTheta-thetas[0]);// + creaseMeta[1]*thetas[1];
-                float momentArm = creaseMeta2[1];
-
-                vec3 _force = angForce/momentArm*normal;
-                force += _force;
             }
 
             vec3 velocity = force*u_dt/mass[0] + lastVelocity;
diff --git a/js/controls.js b/js/controls.js
index 25c3bc7..a3d1e2e 100644
--- a/js/controls.js
+++ b/js/controls.js
@@ -68,7 +68,7 @@ function initControls(globals){
         globals.shouldResetDynamicSim = true;
     });
 
-    setSliderInput("#creasePercent", globals.creasePercent, 0, 1, 0.01, function(val){
+    setSliderInput("#creasePercent", globals.creasePercent, -1, 1, 0.01, function(val){
         globals.creasePercent = val;
         globals.shouldChangeCreasePercent = true;
     });
diff --git a/js/crease.js b/js/crease.js
index 74d0e9f..cee922a 100644
--- a/js/crease.js
+++ b/js/crease.js
@@ -2,10 +2,14 @@
  * Created by amandaghassaei on 2/25/17.
  */
 
-function Crease(edge, face1Index, face2Index, targetTheta, type, node1, node2, index){//type = 0 panel, 1 crease
+function Crease(edge, face1Index, face2Index, targetTheta, type, node1, node2, index){
+    //type = 0 panel, 1 crease
 
     //face1 corresponds to node1, face2 to node2
     this.edge = edge;
+    for (var i=0;i<edge.nodes.length;i++){
+        edge.nodes[i].addInvCrease(this);
+    }
     this.face1Index = face1Index;
     this.face2Index = face2Index;
     this.targetTheta = targetTheta;
@@ -51,6 +55,14 @@ Crease.prototype.getIndex = function(){
     return this.index;
 };
 
+Crease.prototype.getLengthToNode1 = function(){
+    return this.getLengthTo(this.node1);
+};
+
+Crease.prototype.getLengthToNode2 = function(){
+    return this.getLengthTo(this.node2);
+};
+
 Crease.prototype.getLengthTo = function(node){
     var vector1 = this.getVector().normalize();
     var nodePosition = node.getOriginalPosition();
@@ -69,6 +81,11 @@ Crease.prototype.getNodeIndex = function(node){
 Crease.prototype.destroy = function(){
     this.node1.removeCrease(this);
     this.node2.removeCrease(this);
+    if (this.edge && this.edge.nodes){
+        for (var i=0;i<this.edge.nodes.length;i++){
+            this.edge.nodes[i].removeInvCrease(this);
+        }
+    }
     this.edge = null;
     this.face1Index = null;
     this.face2Index = null;
diff --git a/js/dynamicModel.js b/js/dynamicModel.js
index 84ea445..a7c010b 100644
--- a/js/dynamicModel.js
+++ b/js/dynamicModel.js
@@ -28,7 +28,8 @@ function initDynamicModel(globals){
 
     var normals;
     var creaseMeta;//[k, d, targetTheta]
-    var creaseMeta2;//[creaseIndex, length to node, nodeIndex (1/2)]
+    var creaseMeta2;//[creaseIndex (thetaIndex), length to node, nodeIndex (1/2), ]
+                    //[creaseIndex (thetaIndex), length to node1, length to node2, -1]
     var creaseVectors;//vectors of oriented edges in crease
     var theta;//[theta, w, normalIndex1, normalIndex2]
     var lastTheta;//[theta, w, normalIndex1, normalIndex2]
@@ -408,18 +409,19 @@ function initDynamicModel(globals){
         }
         textureDimEdges = calcTextureSize(numEdges);
 
+        var numCreases = creases.length;
+        textureDimCreases = calcTextureSize(numCreases);
+
         var numNodeCreases = 0;
         for (var i=0;i<nodes.length;i++){
             numNodeCreases += nodes[i].numCreases();
         }
+        numNodeCreases += numCreases*2;
         textureDimNodeCreases = calcTextureSize(numNodeCreases);
 
         var numFaces = geometry.faces.length;
         textureDimFaces = calcTextureSize(numFaces);
 
-        var numCreases = creases.length;
-        textureDimCreases = calcTextureSize(numCreases);
-
         originalPosition = new Float32Array(textureDim*textureDim*4);
         position = new Float32Array(textureDim*textureDim*4);
         lastPosition = new Float32Array(textureDim*textureDim*4);
@@ -459,11 +461,20 @@ function initDynamicModel(globals){
         for (var i=0;i<nodes.length;i++){
             meta[i*4+2] = index;
             var nodeCreases = nodes[i].creases;
-            meta[i*4+3] = nodeCreases.length;
+            var nodeInvCreases = nodes[i].invCreases;
+            // console.log(nodeInvCreases);
+            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]);
+                creaseMeta2[index*4+2] = nodeCreases[j].getNodeIndex(nodes[i]);//type 1 or 2
+                index++;
+            }
+            for (var j=0;j<nodeInvCreases.length;j++){
+                creaseMeta2[index*4] = nodeInvCreases[j].getIndex();
+                creaseMeta2[index*4+1] = nodeInvCreases[j].getLengthToNode1();
+                creaseMeta2[index*4+2] = nodeInvCreases[j].getLengthToNode2();
+                creaseMeta2[index*4+3] = -1;
                 index++;
             }
         }
diff --git a/js/node.js b/js/node.js
index 9f76400..959d0f5 100644
--- a/js/node.js
+++ b/js/node.js
@@ -22,6 +22,7 @@ function Node(position, index){
 
     this.beams = [];
     this.creases = [];
+    this.invCreases = [];
     this.externalForce = null;
     this.fixed = false;
 
@@ -92,6 +93,16 @@ Node.prototype.removeCrease = function(crease){
     if (index>=0) this.creases.splice(index, 1);
 };
 
+Node.prototype.addInvCrease = function(crease){
+    this.invCreases.push(crease);
+};
+
+Node.prototype.removeInvCrease = function(crease){
+    if (this.invCreases === null) return;
+    var index = this.invCreases.indexOf(crease);
+    if (index>=0) this.invCreases.splice(index, 1);
+};
+
 
 Node.prototype.addBeam = function(beam){
     this.beams.push(beam);
@@ -187,5 +198,6 @@ Node.prototype.destroy = function(){
     this.object3D = null;
     this.beams = null;
     this.creases = null;
+    this.invCreases = null;
     this.externalForce = null;
 };
\ No newline at end of file
-- 
GitLab