diff --git a/index.html b/index.html
index 6b1485aa2e4a37047177fd7be11272aeafeedd89..11de474367426331f510a790a3a8ac753633c5a1 100755
--- a/index.html
+++ b/index.html
@@ -164,6 +164,12 @@
             return texture2D(tex, scaledIndex);
         }
 
+        vec3 getPosition(float index1D){
+            vec2 index = vec2(mod(index1D, u_textureDim.x)+0.5, floor(index1D/u_textureDim.x)+0.5);
+            vec2 scaledIndex = index/u_textureDim;
+            return texture2D(u_lastPosition, scaledIndex).xyz + texture2D(u_originalPosition, scaledIndex).xyz;
+        }
+
         void main(){
             vec2 fragCoord = gl_FragCoord.xy;
             vec2 scaledFragCoord = fragCoord/u_textureDim;
@@ -266,24 +272,50 @@
                 if (j >= int(meta2[1])) break;
 
                 vec4 faceMeta = getFromArray(meta2[0]+float(j), u_textureDimNodeFaces, u_nodeFaceMeta);//[face index, a, b, c]
-                vec3 nominalAngles = getFromArray(faceMeta.x, u_textureDimFaces, u_nominalTriangles).xyz;//[angA, angB, angC]
+                vec3 nominalAngles = getFromArray(faceMeta[0], u_textureDimFaces, u_nominalTriangles).xyz;//[angA, angB, angC]
+
+                int faceIndex = 0;
+                if (faceMeta[2] < 0.0) faceIndex = 1;
+                if (faceMeta[3] < 0.0) faceIndex = 2;
 
                 //get node positions
-                vec3 a = getFromArray(faceMeta[1], u_textureDim, u_lastPosition).xyz;
-                vec3 b = getFromArray(faceMeta[2], u_textureDim, u_lastPosition).xyz;
-                vec3 c = getFromArray(faceMeta[3], u_textureDim, u_lastPosition).xyz;
+                vec3 a = faceIndex == 0 ? lastPosition+originalPosition : getPosition(faceMeta[1]);
+                vec3 b = faceIndex == 1 ? lastPosition+originalPosition : getPosition(faceMeta[2]);
+                vec3 c = faceIndex == 2 ? lastPosition+originalPosition : getPosition(faceMeta[3]);
 
                 //calc angles
-                vec3 ab = normalize(b-a);
-                vec3 ac = normalize(c-a);
-                vec3 bc = normalize(b-b);
+                vec3 ab = b-a;
+                vec3 ac = c-a;
+                vec3 bc = c-b;
 
-                float angA = acos(dot(ab, ac));
-                float angB = acos(-1.0*dot(ab, bc));
-                float angC = acos(dot(ac, bc));
+                float lengthABsq = length(ab);
+                float lengthACsq = length(ac);
+                float lengthBCsq = length(bc);
+                lengthABsq *= lengthABsq;
+                lengthACsq *= lengthACsq;
+                lengthBCsq *= lengthBCsq;
 
-                //calc forces
+                vec3 angles = vec3(acos(dot(ab, ac)), acos(-1.0*dot(ab, bc)), acos(dot(ac, bc)));
+                vec3 anglesDiff = nominalAngles-angles;
+
+                vec3 normal = getFromArray(faceMeta[0], u_textureDimFaces, u_normals).xyz;
 
+                //calc forces
+                float triangleStiffness = 0.1;
+                anglesDiff *= triangleStiffness;
+                if (faceIndex == 0){//a
+                    force -= anglesDiff[0]*(cross(ac, normal)/lengthACsq - cross(ab, normal)/lengthABsq);
+                    force += anglesDiff[1]*cross(-ab, normal)/lengthABsq;
+                    force -= anglesDiff[2]*cross(-ac, normal)/lengthACsq;
+                } else if (faceIndex == 1){
+                    force -= anglesDiff[0]*cross(ab, normal)/lengthABsq;
+                    force -= anglesDiff[1]*(cross(-ab, normal)/lengthABsq - cross(bc, normal)/lengthBCsq);
+                    force += anglesDiff[2]*cross(-bc, normal)/lengthBCsq;
+                } else if (faceIndex == 2){
+                    force += anglesDiff[0]*cross(ac, normal)/lengthACsq;
+                    force -= anglesDiff[1]*cross(bc, normal)/lengthBCsq;
+                    force -= anglesDiff[2]*(cross(-bc, normal)/lengthBCsq - cross(-ac, normal)/lengthACsq);
+                }
 
             }
 
@@ -412,7 +444,7 @@
             vec3 node3 = getPosition(creaseMeta[2]);
             vec3 node4 = getPosition(creaseMeta[3]);
 
-            float tol = 0.01;
+            float tol = 0.000001;
 
             vec3 creaseVector = node4-node3;
             float creaseLength = length(creaseVector);
@@ -633,6 +665,10 @@
                 <span class="label-slider">Axial Strength : </span><div class="flat-slider ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-content"></div>
                 <input value="" placeholder="" class="form-control" type="text">
             </div>
+            <div class="sliderInput paddingBottom" id="triStiffness">
+                <span class="label-slider">Triangle Strength : </span><div class="flat-slider ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-content"></div>
+                <input value="" placeholder="" class="form-control" type="text">
+            </div>
             <div class="sliderInput" id="creaseStiffness">
                 <span class="label-slider">Fold Strength : </span><div class="flat-slider ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-content"></div>
                 <input value="" placeholder="" class="form-control" type="text">
diff --git a/js/controls.js b/js/controls.js
index 7a0f5e8502426d1470c5c305af93f534f3f846dc..1fa8a130e994d8dbfff29294a497c575147428f5 100755
--- a/js/controls.js
+++ b/js/controls.js
@@ -179,6 +179,11 @@ function initControls(globals){
         globals.materialHasChanged = true;
     });
 
+    setSliderInput("#triStiffness", globals.triStiffness, 0, 10, 0.01, function(val){
+        globals.triStiffness = val;//todo update
+        // globals.materialHasChanged = true;
+    });
+
     setSliderInput("#creaseStiffness", globals.creaseStiffness, 0, 3, 0.01, function(val){
         globals.creaseStiffness = val;
         globals.creaseMaterialHasChanged = true;
diff --git a/js/dynamic/dynamicSolver.js b/js/dynamic/dynamicSolver.js
index 96158cf350d3498a60df949f2c46b1e777319c4b..3c96830bfa8d0ebaa17fc614bae4a12cf1770b41 100755
--- a/js/dynamic/dynamicSolver.js
+++ b/js/dynamic/dynamicSolver.js
@@ -556,9 +556,9 @@ function initDynamicSolver(globals){
                 var _index = (index+j)*4;
                 var face = faces[nodeFaces[i][j]];
                 nodeFaceMeta[_index] = nodeFaces[i][j];
-                nodeFaceMeta[_index+1] = face[0];
-                nodeFaceMeta[_index+2] = face[1];
-                nodeFaceMeta[_index+3] = face[2];
+                nodeFaceMeta[_index+1] = face[0] == i ? -1 : face[0];
+                nodeFaceMeta[_index+2] = face[1] == i ? -1 : face[1];
+                nodeFaceMeta[_index+3] = face[2] == i ? -1 : face[2];
             }
             index+=num;
         }
diff --git a/js/globals.js b/js/globals.js
index 9163d4d528675b7de9915525478547d4df687fc7..31925f9de5987a57b92d1d1dd5f14b057ebf129b 100755
--- a/js/globals.js
+++ b/js/globals.js
@@ -46,6 +46,7 @@ function initGlobals(){
         axialStiffness: 20,
         creaseStiffness: 0.7,
         panelStiffness: 0.7,
+        triStiffness: 1,
 
         //dynamic sim settings
         percentDamping: 0.5,