From 7dd459e6f4a5db58c8b0c12fb19aa42c84e32459 Mon Sep 17 00:00:00 2001 From: amandaghassaei <amandaghassaei@gmail.com> Date: Thu, 1 Jun 2017 02:53:45 -0400 Subject: [PATCH] adding code --- index.html | 57 ++++++++++++++++++++++++------------- js/dynamic/dynamicSolver.js | 2 ++ 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/index.html b/index.html index f496805..9565c3f 100755 --- a/index.html +++ b/index.html @@ -139,6 +139,7 @@ uniform vec2 u_textureDimFaces; uniform vec2 u_textureDimCreases; uniform vec2 u_textureDimNodeCreases; + uniform vec2 u_textureDimNodeFaces; uniform float u_creasePercent; uniform float u_dt; uniform sampler2D u_lastPosition; @@ -157,6 +158,12 @@ uniform sampler2D u_nodeFaceMeta;//[faceIndex, a, b, c] uniform sampler2D u_nominalTriangles;//[angleA, angleB, angleC] + vec4 getFromArray(float index1D, vec2 dimensions, sampler2D tex){ + vec2 index = vec2(mod(index1D, dimensions.x)+0.5, floor(index1D/dimensions.x)+0.5); + vec2 scaledIndex = index/dimensions; + return texture2D(tex, scaledIndex); + } + void main(){ vec2 fragCoord = gl_FragCoord.xy; vec2 scaledFragCoord = fragCoord/u_textureDim; @@ -173,16 +180,14 @@ vec4 neighborIndices = texture2D(u_meta, scaledFragCoord); vec4 meta = texture2D(u_meta, scaledFragCoord); + vec2 meta2 = texture2D(u_meta2, scaledFragCoord).xy; float nodeError = 0.0; 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; - float beamIndex1D = meta[0]+float(j); - vec2 beamIndex = vec2(mod(beamIndex1D, u_textureDimEdges.x)+0.5, floor(beamIndex1D/u_textureDimEdges.x)+0.5); - vec2 scaledBeamIndex = beamIndex/u_textureDimEdges; - vec4 beamMeta = texture2D(u_beamMeta, scaledBeamIndex); + vec4 beamMeta = getFromArray(meta[0]+float(j), u_textureDimEdges, u_beamMeta); float neighborIndex1D = beamMeta[3]; vec2 neighborIndex = vec2(mod(neighborIndex1D, u_textureDim.x)+0.5, floor(neighborIndex1D/u_textureDim.x)+0.5); @@ -206,10 +211,7 @@ 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 nodeCreaseMeta = texture2D(u_nodeCreaseMeta, scaledNodeCreaseIndex);//[creaseIndex, length to node, nodeType (1 or 2), isReaction] + vec4 nodeCreaseMeta = getFromArray(meta[2]+float(j), u_textureDimNodeCreases, u_nodeCreaseMeta); float creaseIndex1D = nodeCreaseMeta[0]; vec2 creaseIndex = vec2(mod(creaseIndex1D, u_textureDimCreases.x)+0.5, floor(creaseIndex1D/u_textureDimCreases.x)+0.5); @@ -228,16 +230,10 @@ if (nodeNum > 2.0){//crease reaction, node is on a crease //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; + vec3 normal1 = getFromArray(thetas[2], u_textureDimFaces, u_normals).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; + vec3 normal2 = getFromArray(thetas[3], u_textureDimFaces, u_normals).xyz; float coef1 = creaseGeo[2]; float coef2 = creaseGeo[3]; @@ -258,13 +254,36 @@ normalIndex1D = thetas[3];//node #2 momentArm = creaseGeo[1];//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; + + vec3 normal = getFromArray(normalIndex1D, u_textureDimFaces, u_normals).xyz; vec3 _force = angForce/momentArm*normal; force += _force; } + } + + for (int j=0;j<100;j++){//for all faces (up to 100, had to put a const int in here) + 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] + + //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; + + //calc angles + vec3 ab = normalize(b-a); + vec3 ac = normalize(c-a); + vec3 bc = normalize(b-b); + + float angA = acos(dot(ab, ac)); + float angB = acos(-1.0*dot(ab, bc)); + float angC = acos(dot(ac, bc)); + + //calc forces + } diff --git a/js/dynamic/dynamicSolver.js b/js/dynamic/dynamicSolver.js index f86a7c2..96158cf 100755 --- a/js/dynamic/dynamicSolver.js +++ b/js/dynamic/dynamicSolver.js @@ -277,6 +277,7 @@ function initDynamicSolver(globals){ gpuMath.initTextureFromData("u_creaseGeo", textureDimCreases, textureDimCreases, "FLOAT", creaseGeo, true); gpuMath.initFrameBufferForTexture("u_creaseGeo", true); gpuMath.initTextureFromData("u_faceVertexIndices", textureDimFaces, textureDimFaces, "FLOAT", faceVertexIndices, true); + gpuMath.initTextureFromData("u_nominalTriangles", textureDimFaces, textureDimFaces, "FLOAT", nominalTriangles, true); gpuMath.createProgram("positionCalc", vertexShader, document.getElementById("positionCalcShader").text); gpuMath.setUniformForProgram("positionCalc", "u_velocity", 0, "1i"); @@ -305,6 +306,7 @@ function initDynamicSolver(globals){ 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.setUniformForProgram("velocityCalc", "u_textureDimNodeFaces", [textureDimNodeFaces, textureDimNodeFaces], "2f"); gpuMath.setUniformForProgram("velocityCalc", "u_creasePercent", globals.creasePercent, "1f"); gpuMath.createProgram("thetaCalc", vertexShader, document.getElementById("thetaCalcShader").text); -- GitLab