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