From bdf2da9a19881e66cada8fb2be001378fce1a0a9 Mon Sep 17 00:00:00 2001
From: amandaghassaei <amandaghassaei@gmail.com>
Date: Tue, 2 May 2017 01:21:03 -0400
Subject: [PATCH] reorganizing

---
 index.html                 | 23 +++++++++++
 js/controls.js             | 15 ++++++-
 js/dynamic/dynamicModel.js | 83 ++++++++++++++++++--------------------
 js/globals.js              |  9 +++--
 js/model.js                | 83 ++++++++++++++++++++++++--------------
 js/pattern.js              |  1 +
 6 files changed, 136 insertions(+), 78 deletions(-)

diff --git a/index.html b/index.html
index eacd77c..809b245 100644
--- a/index.html
+++ b/index.html
@@ -410,6 +410,29 @@
     <div id="svgViewer"></div>
     <div class="extraSpace"></div>
 </div>
+
+<div id="controlsLeft" class="flipped">
+    <div>
+        <b>View Settings:</b><br/><br/>
+        <div class="indent">
+            Mesh Material:
+            <div class="indent">
+                <label class="radio">
+                    <input name="colorMode" value="color" data-toggle="radio" class="custom-radio" type="radio"><span class="icons"><span class="icon-unchecked"></span><span class="icon-checked"></span></span>
+                    Colored Material
+                </label>
+                <div id="coloredMaterialOptions" class="indent">
+                    <label>Frontside Color (rgb hex): </label><input value="" placeholder="" class="form-control" type="text"><br/>
+                    <label>Backside Color (rgb hex): </label><input value="" placeholder="" class="form-control" type="text"><br/>
+                </div>
+                <label class="radio">
+                    <input name="colorMode" value="normal" data-toggle="radio" class="custom-radio" type="radio"><span class="icons"><span class="icon-unchecked"></span><span class="icon-checked"></span></span>
+                    Face Normals Material
+                </label>
+            </div><br/>
+        </div>
+    </div>
+</div>
 <div class="modal fade" id="aboutModal" tabindex="-1" role="dialog">
     <div class="modal-dialog modal-lg">
         <div class="modal-content">
diff --git a/js/controls.js b/js/controls.js
index a3d1e2e..cfd2447 100644
--- a/js/controls.js
+++ b/js/controls.js
@@ -46,7 +46,7 @@ function initControls(globals){
         globals.schematicVisible = val;
     });
 
-    setSliderInput("#axialStiffness", globals.axialStiffness, 100, 1000, 1, function(val){
+    setSliderInput("#axialStiffness", globals.axialStiffness, 500, 4000, 1, function(val){
         globals.axialStiffness = val;
         globals.materialHasChanged = true;
     });
@@ -86,6 +86,19 @@ function initControls(globals){
         $(e.target).blur();
     });
 
+    if (globals.colorMode == "color") $("#coloredMaterialOptions").show();
+    else $("#coloredMaterialOptions").hide();
+    setRadio("colorMode", globals.colorMode, function(val){
+        globals.colorMode = val;
+        if (val == "color") {
+            $("#coloredMaterialOptions").show();
+            globals.dynamicModel.setMeshMaterial();
+        }
+        else $("#coloredMaterialOptions").hide();
+
+
+    });
+
     function setButtonGroup(id, callback){
         $(id+" a").click(function(e){
             e.preventDefault();
diff --git a/js/dynamic/dynamicModel.js b/js/dynamic/dynamicModel.js
index 10a08d4..0f556d6 100644
--- a/js/dynamic/dynamicModel.js
+++ b/js/dynamic/dynamicModel.js
@@ -5,6 +5,15 @@
 function initDynamicModel(globals){
 
     var material = new THREE.MeshNormalMaterial({shading: THREE.FlatShading, side: THREE.DoubleSide});
+    function setMeshMaterial(){
+        material = THREE.MeshFaceMaterial([
+            new THREE.MeshLambertMaterial({shading:THREE.FlatShading, color:0xff0000, side:THREE.FrontSide}),
+            new THREE.MeshLambertMaterial({shading:THREE.FlatShading, color:0x0000ff, side:THREE.BackSide})
+        ]);
+        object3D.material = material;
+    }
+
+
     var geometry = new THREE.Geometry();
     geometry.dynamic = true;
     var object3D = new THREE.Mesh(geometry, material);
@@ -37,6 +46,8 @@ function initDynamicModel(globals){
     var theta;//[theta, w, normalIndex1, normalIndex2]
     var lastTheta;//[theta, w, normalIndex1, normalIndex2]
 
+    var inited = false;
+
     function syncNodesAndEdges(firstTime){
         nodes = globals.model.getNodes();
         edges = globals.model.getEdges();
@@ -56,6 +67,14 @@ function initDynamicModel(globals){
         geometry.computeBoundingBox();
         geometry.computeBoundingSphere();
 
+        // for ( var face in geometry.faces ) {
+        //     if (face<geometry.faces.length/2) {
+        //         geometry.faces[ face ].materialIndex = 1;
+        //         console.log(face);
+        //     }
+        //     else geometry.faces[ face ].materialIndex = 0;
+        // }
+
         var bounds = geometry.boundingBox;
         var avg = (bounds.min.add(bounds.max)).multiplyScalar(-0.5);
         // object3D.position.set(avg.x, 0, avg.z);
@@ -67,7 +86,7 @@ function initDynamicModel(globals){
         initTexturesAndPrograms(globals.gpuMath, firstTime);
         steps = parseInt(setSolveParams());
 
-        if(firstTime) runSolver();
+        inited = true;
     }
 
     var steps;
@@ -91,28 +110,9 @@ function initDynamicModel(globals){
         // }
     }
 
-    function runSolver(){
-        globals.threeView.startAnimation(function(){
-            if (!globals.dynamicSimVisible) {
-                return;
-            }
-            // steps = 1;
-            for (var j=0;j<steps;j++){
-                solveStep();
-            }
-            render();
-        });
-    }
-
-    function setVisibility(state){
-        object3D.visible = state;
-        globals.threeView.render();
-    }
-
-    function solveStep(){
-
+    function solve(){
         if (globals.shouldSyncWithModel){
-            syncNodesAndEdges();
+            syncNodesAndEdges(true);
             // reset();
             globals.shouldSyncWithModel = false;
         } else {
@@ -146,6 +146,19 @@ function initDynamicModel(globals){
             }
         }
 
+        for (var j=0;j<steps;j++){
+            solveStep();
+        }
+        render();
+    }
+
+    function setVisibility(state){
+        object3D.visible = state;
+        globals.threeView.render();
+    }
+
+    function solveStep(){
+
         var gpuMath = globals.gpuMath;
 
         gpuMath.setProgram("normalCalc");
@@ -214,8 +227,6 @@ function initDynamicModel(globals){
         } else {
             console.log("here");
         }
-
-        //globals.gpuMath.setSize(textureDim, textureDim);
     }
 
     function setSolveParams(){
@@ -387,9 +398,6 @@ function initDynamicModel(globals){
             // this.vertices[1].clone().sub(this.vertices[0]);
             creaseVectors[rgbaIndex] = nodes[0].getIndex();
             creaseVectors[rgbaIndex+1] = nodes[1].getIndex();
-            // creaseVectors[rgbaIndex] = -vector.x;
-            // creaseVectors[rgbaIndex+1] = -vector.y;
-            // creaseVectors[rgbaIndex+2] = -vector.z;
         }
         globals.gpuMath.initTextureFromData("u_creaseVectors", textureDimCreases, textureDimCreases, "FLOAT", creaseVectors, true);
     }
@@ -440,7 +448,7 @@ function initDynamicModel(globals){
         numNodeCreases += numCreases*2;
         textureDimNodeCreases = calcTextureSize(numNodeCreases);
 
-        var numFaces = geometry.faces.length;
+        var numFaces = geometry.faces.length/2;
         textureDimFaces = calcTextureSize(numFaces);
 
         originalPosition = new Float32Array(textureDim*textureDim*4);
@@ -472,10 +480,6 @@ function initDynamicModel(globals){
             mass[4*i+1] = 1;//set all fixed by default
         }
 
-        _.each(nodes, function(node, index){
-            mass[4*index] = node.getSimMass();//todo move into bottom loop?
-        });
-
         for (var i=0;i<textureDimCreases*textureDimCreases;i++){
             if (i >= numCreases){
                 lastTheta[i*4+2] = -1;
@@ -488,6 +492,7 @@ function initDynamicModel(globals){
 
         var index = 0;
         for (var i=0;i<nodes.length;i++){
+            mass[4*i] = nodes[i].getSimMass();
             meta[i*4+2] = index;
             var nodeCreases = nodes[i].creases;
             var nodeInvCreases = nodes[i].invCreases;
@@ -516,19 +521,11 @@ function initDynamicModel(globals){
         updateCreaseVectors();
     }
 
-    function pause(){
-        globals.threeView.pauseAnimation();
-    }
-
-    function resume(){
-        runSolver();
-    }
-
     return {
         syncNodesAndEdges: syncNodesAndEdges,
-        pause: pause,
-        resume: resume,
         setVisibility: setVisibility,
-        updateFixed: updateFixed
+        updateFixed: updateFixed,
+        setMeshMaterial: setMeshMaterial,
+        solve: solve
     }
 }
\ No newline at end of file
diff --git a/js/globals.js b/js/globals.js
index 49f7971..1c188e0 100644
--- a/js/globals.js
+++ b/js/globals.js
@@ -7,6 +7,9 @@ function initGlobals(){
 
     var _globals = {
 
+        //view
+        colorMode: "normal",
+
         //flags
         fixedHasChanged: false,
         forceHasChanged: false,
@@ -14,13 +17,11 @@ function initGlobals(){
         creaseMaterialHasChanged: false,
         shouldResetDynamicSim: false,
         shouldChangeCreasePercent: false,
-        shouldSyncWithModel: false,
+        shouldSyncWithModel: true,
         nodePositionHasChanged: false,
 
         //3d vis
-        dynamicSimVisible: true,
-        staticSimVisible: false,
-        schematicVisible: true,
+        simType: "dynamic",
 
         //sim settings
         creasePercent: 0,
diff --git a/js/model.js b/js/model.js
index fb76f27..38e7038 100644
--- a/js/model.js
+++ b/js/model.js
@@ -8,11 +8,11 @@ function initModel(globals){
     var allNodeObject3Ds = [];
 
     var nodes = [];
-    nodes.push(new Node(new THREE.Vector3(0,0,0), nodes.length));
-    nodes.push(new Node(new THREE.Vector3(0,0,10), nodes.length));
-    nodes.push(new Node(new THREE.Vector3(10,0,0), nodes.length));
-    nodes.push(new Node(new THREE.Vector3(0,0,-10), nodes.length));
-    nodes.push(new Node(new THREE.Vector3(10,0,-10), nodes.length));
+    // nodes.push(new Node(new THREE.Vector3(0,0,0), nodes.length));
+    // nodes.push(new Node(new THREE.Vector3(0,0,10), nodes.length));
+    // nodes.push(new Node(new THREE.Vector3(10,0,0), nodes.length));
+    // nodes.push(new Node(new THREE.Vector3(0,0,-10), nodes.length));
+    // nodes.push(new Node(new THREE.Vector3(10,0,-10), nodes.length));
 
     // nodes.push(new Node(new THREE.Vector3(-10,0,0), nodes.length));
 
@@ -21,44 +21,66 @@ function initModel(globals){
     // nodes[2].setFixed(true);
 
     var edges = [];
-    edges.push(new Beam([nodes[1], nodes[0]]));
-    edges.push(new Beam([nodes[1], nodes[2]]));
-    edges.push(new Beam([nodes[2], nodes[0]]));
-    edges.push(new Beam([nodes[3], nodes[0]]));
-    edges.push(new Beam([nodes[3], nodes[2]]));
-    edges.push(new Beam([nodes[3], nodes[4]]));
-    edges.push(new Beam([nodes[2], nodes[4]]));
+    // edges.push(new Beam([nodes[1], nodes[0]]));
+    // edges.push(new Beam([nodes[1], nodes[2]]));
+    // edges.push(new Beam([nodes[2], nodes[0]]));
+    // edges.push(new Beam([nodes[3], nodes[0]]));
+    // edges.push(new Beam([nodes[3], nodes[2]]));
+    // edges.push(new Beam([nodes[3], nodes[4]]));
+    // edges.push(new Beam([nodes[2], nodes[4]]));
 
     // edges.push(new Beam([nodes[4], nodes[0]]));
     // edges.push(new Beam([nodes[4], nodes[1]]));
     // edges.push(new Beam([nodes[3], nodes[4]]));
 
     var faces = [];
-    faces.push(new THREE.Face3(0,1,2));
-    faces.push(new THREE.Face3(0,2,3));
-    faces.push(new THREE.Face3(4,3,2));
+    // faces.push(new THREE.Face3(0,1,2));
+    // faces.push(new THREE.Face3(0,2,3));
+    // faces.push(new THREE.Face3(4,3,2));
 
     // faces.push(new THREE.Face3(4,1,0));
     // faces.push(new THREE.Face3(3,4,0));
 
     var creases = [];
-    creases.push(new Crease(edges[2], 0, 1, Math.PI, 1, nodes[1], nodes[3], 0));
-    creases.push(new Crease(edges[4], 2, 1, -Math.PI, 1, nodes[4], nodes[0], 1));
+    // creases.push(new Crease(edges[2], 0, 1, Math.PI, 1, nodes[1], nodes[3], 0));
+    // creases.push(new Crease(edges[4], 2, 1, -Math.PI, 1, nodes[4], nodes[0], 1));
 
     // creases.push(new Crease(edges[5], 3, 2, -Math.PI, 1, nodes[3], nodes[1], 1));
     // creases.push(new Crease(edges[0], 3, 0, Math.PI, 1, nodes[4], nodes[2], 2));
 
 
-    var _allNodeObject3Ds  = [];
-    _.each(nodes, function(node){
-        var obj3D = node.getObject3D();
-        _allNodeObject3Ds.push(obj3D);
-        globals.threeView.sceneAddModel(obj3D);
-    });
-    allNodeObject3Ds = _allNodeObject3Ds;
-    _.each(edges, function(edge){
-        globals.threeView.sceneAddModel(edge.getObject3D());
-    });
+    // var _allNodeObject3Ds  = [];
+    // _.each(nodes, function(node){
+    //     var obj3D = node.getObject3D();
+    //     _allNodeObject3Ds.push(obj3D);
+    //     globals.threeView.sceneAddModel(obj3D);
+    // });
+    // allNodeObject3Ds = _allNodeObject3Ds;
+    // _.each(edges, function(edge){
+    //     globals.threeView.sceneAddModel(edge.getObject3D());
+    // });
+
+    function pause(){
+        globals.threeView.pauseAnimation();
+    }
+
+    function resume(){
+        startSolver();
+    }
+
+    var inited = false;
+    startSolver();
+
+    function startSolver(){
+        globals.threeView.startAnimation(function(){
+            if (!inited) return;
+            if (globals.simType == "dynamic"){
+                globals.dynamicModel.solve();
+            } else {
+                console.log("static");
+            }
+        });
+    }
 
     function buildModel(_faces, _vertices, _allEdges, allCreaseParams){
 
@@ -103,8 +125,6 @@ function initModel(globals){
         faces = _faces;
         creases = _creases;
 
-        globals.shouldSyncWithModel = true;
-
         for (var i=0;i<oldNodes.length;i++){
             oldNodes[i].destroy();
         }
@@ -120,7 +140,8 @@ function initModel(globals){
         }
         oldCreases = null;
 
-        globals.dynamicModel.syncNodesAndEdges(true);
+        globals.shouldSyncWithModel = true;
+        inited = true;
         // globals.staticSolver.syncNodesAndEdges();
     }
 
@@ -145,6 +166,8 @@ function initModel(globals){
     }
 
     return {
+        pause: pause,
+        resume: resume,
         getNodes: getNodes,
         getEdges: getEdges,
         getFaces: getFaces,
diff --git a/js/pattern.js b/js/pattern.js
index 5b2de6d..fa5ad9a 100644
--- a/js/pattern.js
+++ b/js/pattern.js
@@ -614,6 +614,7 @@ function initPattern(globals){
     }
 
     function drawPattern(faces){
+        console.log("draw pattern");
         object3D.children = [];
 
         var geo = new THREE.Geometry();
-- 
GitLab