diff --git a/index.html b/index.html
index 94c72895096246360b87634150dfe8de3b656152..3eb965ed457baeaf2dd4334338109d8db71c4f3d 100644
--- a/index.html
+++ b/index.html
@@ -98,14 +98,21 @@
precision mediump float;
uniform vec2 u_textureDim;
uniform vec2 u_textureDimEdges;
+ uniform vec2 u_textureDimFaces;
+ uniform vec2 u_textureDimCreases;
+ uniform vec2 u_textureDimNodeCreases;
uniform float u_dt;
uniform sampler2D u_lastPosition;
uniform sampler2D u_lastVelocity;
uniform sampler2D u_originalPosition;
uniform sampler2D u_externalForces;
uniform sampler2D u_mass;
- uniform sampler2D u_meta;//[beamsIndex, numBeams]
+ uniform sampler2D u_meta;//[beamsIndex, numBeam, creaseMeta2Index, numCreases]
uniform sampler2D u_beamMeta;//[k, d, length, otherNodeIndex]
+ uniform sampler2D u_creaseMeta;//[k, d, targetTheta]
+ uniform sampler2D u_creaseMeta2;//[creaseIndex, momentArmLength, nodeIndex]
+ uniform sampler2D u_normals;
+ uniform sampler2D u_theta;//[theta, z, normal1Index, normal2Index]
void main(){
vec2 fragCoord = gl_FragCoord.xy;
@@ -123,7 +130,7 @@
vec3 originalPosition = texture2D(u_originalPosition, scaledFragCoord).xyz;
vec4 neighborIndices = texture2D(u_meta, scaledFragCoord);
- vec2 meta = texture2D(u_meta, scaledFragCoord).xy;
+ vec4 meta = texture2D(u_meta, scaledFragCoord);
for (int j=0;j<100;j++){//for all beams (up to 100, had to put a const int in here)
if (j >= int(meta[1])) break;
@@ -148,6 +155,36 @@
vec3 _force = deltaP*beamMeta[0] + deltaV*beamMeta[1];
force += _force;
}
+
+ for (int j=0;j<100;j++){//for all creases (up to 100, had to put a const int in here)
+ if (j >= int(meta[3])) break;
+
+ 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);
+
+ float creaseIndex1D = creaseMeta2[0];
+ vec2 creaseIndex = vec2(mod(creaseIndex1D, u_textureDimCreases.x)+0.5, floor(creaseIndex1D/u_textureDimCreases.x)+0.5);
+ vec2 scaledCreaseIndex = creaseIndex/u_textureDimCreases;
+
+ vec4 thetas = texture2D(u_theta, scaledCreaseIndex);
+ vec3 creaseMeta = texture2D(u_creaseMeta, scaledCreaseIndex).xyz;//[k, d, targetTheta]
+
+ float nodeNum = creaseMeta2[2];
+ float normalIndex1D = thetas[2];
+ if (nodeNum > 1.1) normalIndex1D = thetas[3];
+ 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]*(creaseMeta[2]-thetas[0]);
+ float momentArm = creaseMeta2[1];
+
+ vec3 _force = angForce/momentArm*normal;
+ force += _force;
+ }
+
vec3 velocity = force*u_dt/mass.x + lastVelocity;
gl_FragColor = vec4(velocity,0.0);
}
diff --git a/js/controls.js b/js/controls.js
index c639557749723c6199847ae2306afe266d035206..e99af0309b9018724d946b8b3422c5e296fc1769 100644
--- a/js/controls.js
+++ b/js/controls.js
@@ -53,10 +53,12 @@ function initControls(globals){
setSliderInput("#creaseStiffness", globals.creaseStiffness, 1, 1000, 1, function(val){
globals.creaseStiffness = val;
+ globals.dynamicModel.updateCreasesMeta();
});
setSliderInput("#panelStiffness", globals.panelStiffness, 1, 1000, 1, function(val){
globals.panelStiffness = val;
+ globals.dynamicModel.updateCreasesMeta();
});
setSlider("#damping", globals.percentDamping, 0, 1, 0.01, function(val){
diff --git a/js/crease.js b/js/crease.js
index e313a86bbd62023f8396873a4d0162c017b46704..74d0e9fa8cb0d3281da0b604eeb8f84fa54a8d71 100644
--- a/js/crease.js
+++ b/js/crease.js
@@ -2,7 +2,7 @@
* Created by amandaghassaei on 2/25/17.
*/
-function Crease(edge, face1Index, face2Index, targetTheta, type, node1, node2){//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;
@@ -12,6 +12,7 @@ function Crease(edge, face1Index, face2Index, targetTheta, type, node1, node2){/
this.type = type;
this.node1 = node1;
this.node2 = node2;
+ this.index = index;
node1.addCrease(this);
node2.addCrease(this);
}
@@ -46,6 +47,25 @@ Crease.prototype.getD = function(){
return globals.percentDamping*2*Math.sqrt(this.getK());
};
+Crease.prototype.getIndex = function(){
+ return this.index;
+};
+
+Crease.prototype.getLengthTo = function(node){
+ var vector1 = this.getVector().normalize();
+ var nodePosition = node.getOriginalPosition();
+ var vector2 = nodePosition.sub(this.edge.nodes[1].getOriginalPosition());
+ var projLength = vector1.dot(vector2);
+ return Math.sqrt(vector2.lengthSq()-projLength*projLength);
+};
+
+Crease.prototype.getNodeIndex = function(node){
+ if (node == this.node1) return 1;
+ else if (node == this.node2) return 2;
+ console.warn("no node found");
+ return 0;
+};
+
Crease.prototype.destroy = function(){
this.node1.removeCrease(this);
this.node2.removeCrease(this);
@@ -56,4 +76,5 @@ Crease.prototype.destroy = function(){
this.type = null;
this.node1 = null;
this.node2 = null;
+ this.index = null;
};
\ No newline at end of file
diff --git a/js/dynamicModel.js b/js/dynamicModel.js
index 375698a413a75f52032a9810c7cd169ac5adff86..76a4236455c0b7c73e4663d9251f2934eee6db6a 100644
--- a/js/dynamicModel.js
+++ b/js/dynamicModel.js
@@ -25,7 +25,8 @@ function initDynamicModel(globals){
var beamMeta;//[K, D, length, otherNodeIndex]
var normals;
- var creaseMeta;//[k, d, targetTheta, length (to node)]
+ var creaseMeta;//[k, d, targetTheta]
+ var creaseMeta2;//[creaseIndex, length to node, nodeIndex (1/2)]
var creaseVectors;//vectors of oriented edges in crease
var theta;//[theta, w, normalIndex1, normalIndex2]
var lastTheta;//[theta, w, normalIndex1, normalIndex2]
@@ -56,6 +57,7 @@ function initDynamicModel(globals){
var textureDimEdges = 0;
var textureDimFaces = 0;
var textureDimCreases = 0;
+ var textureDimNodeCreases = 0;
syncNodesAndEdges();
initTexturesAndPrograms(globals.gpuMath);
steps = parseInt(setSolveParams());
@@ -119,7 +121,7 @@ function initDynamicModel(globals){
gpuMath.step("thetaCalc", ["u_normals", "u_lastTheta", "u_creaseVectors"], "u_theta");
gpuMath.step("velocityCalc", ["u_lastPosition", "u_lastVelocity", "u_originalPosition", "u_externalForces",
- "u_mass", "u_meta", "u_beamMeta"], "u_velocity");
+ "u_mass", "u_meta", "u_beamMeta", "u_creaseMeta", "u_creaseMeta2", "u_normals", "u_theta"], "u_velocity");
gpuMath.step("positionCalc", ["u_velocity", "u_lastPosition", "u_mass"], "u_position");
gpuMath.swapTextures("u_theta", "u_lastTheta");
@@ -216,6 +218,7 @@ function initDynamicModel(globals){
gpuMath.initFrameBufferForTexture("u_lastTheta");
gpuMath.initTextureFromData("u_meta", textureDim, textureDim, "FLOAT", meta);
+ gpuMath.initTextureFromData("u_creaseMeta2", textureDimNodeCreases, textureDimNodeCreases, "FLOAT", creaseMeta2);
gpuMath.createProgram("positionCalc", vertexShader, document.getElementById("positionCalcShader").text);
gpuMath.setUniformForProgram("positionCalc", "u_velocity", 0, "1i");
@@ -231,8 +234,15 @@ function initDynamicModel(globals){
gpuMath.setUniformForProgram("velocityCalc", "u_mass", 4, "1i");
gpuMath.setUniformForProgram("velocityCalc", "u_meta", 5, "1i");
gpuMath.setUniformForProgram("velocityCalc", "u_beamMeta", 6, "1i");
+ gpuMath.setUniformForProgram("velocityCalc", "u_creaseMeta", 7, "1i");
+ 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_textureDim", [textureDim, textureDim], "2f");
gpuMath.setUniformForProgram("velocityCalc", "u_textureDimEdges", [textureDimEdges, textureDimEdges], "2f");
+ gpuMath.setUniformForProgram("velocityCalc", "u_textureDimFaces", [textureDimFaces, textureDimFaces], "2f");
+ gpuMath.setUniformForProgram("velocityCalc", "u_textureDimCreases", [textureDimCreases, textureDimCreases], "2f");
+ gpuMath.setUniformForProgram("velocityCalc", "u_textureDimNodeCreases", [textureDimNodeCreases, textureDimNodeCreases], "2f");
gpuMath.createProgram("thetaCalc", vertexShader, document.getElementById("thetaCalcShader").text);
gpuMath.setUniformForProgram("thetaCalc", "u_normals", 0, "1i");
@@ -357,6 +367,12 @@ function initDynamicModel(globals){
}
textureDimEdges = calcTextureSize(numEdges);
+ var numNodeCreases = 0;
+ for (var i=0;i