Commit 7dd459e6 authored by amandaghassaei's avatar amandaghassaei
Browse files

adding code

parent 4cac5e41
...@@ -139,6 +139,7 @@ ...@@ -139,6 +139,7 @@
uniform vec2 u_textureDimFaces; uniform vec2 u_textureDimFaces;
uniform vec2 u_textureDimCreases; uniform vec2 u_textureDimCreases;
uniform vec2 u_textureDimNodeCreases; uniform vec2 u_textureDimNodeCreases;
uniform vec2 u_textureDimNodeFaces;
uniform float u_creasePercent; uniform float u_creasePercent;
uniform float u_dt; uniform float u_dt;
uniform sampler2D u_lastPosition; uniform sampler2D u_lastPosition;
...@@ -157,6 +158,12 @@ ...@@ -157,6 +158,12 @@
uniform sampler2D u_nodeFaceMeta;//[faceIndex, a, b, c] uniform sampler2D u_nodeFaceMeta;//[faceIndex, a, b, c]
uniform sampler2D u_nominalTriangles;//[angleA, angleB, angleC] 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(){ void main(){
vec2 fragCoord = gl_FragCoord.xy; vec2 fragCoord = gl_FragCoord.xy;
vec2 scaledFragCoord = fragCoord/u_textureDim; vec2 scaledFragCoord = fragCoord/u_textureDim;
...@@ -173,16 +180,14 @@ ...@@ -173,16 +180,14 @@
vec4 neighborIndices = texture2D(u_meta, scaledFragCoord); vec4 neighborIndices = texture2D(u_meta, scaledFragCoord);
vec4 meta = texture2D(u_meta, scaledFragCoord); vec4 meta = texture2D(u_meta, scaledFragCoord);
vec2 meta2 = texture2D(u_meta2, scaledFragCoord).xy;
float nodeError = 0.0; 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) 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; if (j >= int(meta[1])) break;
float beamIndex1D = meta[0]+float(j); vec4 beamMeta = getFromArray(meta[0]+float(j), u_textureDimEdges, u_beamMeta);
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);
float neighborIndex1D = beamMeta[3]; float neighborIndex1D = beamMeta[3];
vec2 neighborIndex = vec2(mod(neighborIndex1D, u_textureDim.x)+0.5, floor(neighborIndex1D/u_textureDim.x)+0.5); vec2 neighborIndex = vec2(mod(neighborIndex1D, u_textureDim.x)+0.5, floor(neighborIndex1D/u_textureDim.x)+0.5);
...@@ -206,10 +211,7 @@ ...@@ -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) 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; if (j >= int(meta[3])) break;
float nodeCreaseIndex1D = meta[2]+float(j); vec4 nodeCreaseMeta = getFromArray(meta[2]+float(j), u_textureDimNodeCreases, u_nodeCreaseMeta);
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]
float creaseIndex1D = nodeCreaseMeta[0]; float creaseIndex1D = nodeCreaseMeta[0];
vec2 creaseIndex = vec2(mod(creaseIndex1D, u_textureDimCreases.x)+0.5, floor(creaseIndex1D/u_textureDimCreases.x)+0.5); vec2 creaseIndex = vec2(mod(creaseIndex1D, u_textureDimCreases.x)+0.5, floor(creaseIndex1D/u_textureDimCreases.x)+0.5);
...@@ -228,16 +230,10 @@ ...@@ -228,16 +230,10 @@
if (nodeNum > 2.0){//crease reaction, node is on a crease if (nodeNum > 2.0){//crease reaction, node is on a crease
//node #1 //node #1
float normalIndex1D = thetas[2]; vec3 normal1 = getFromArray(thetas[2], u_textureDimFaces, u_normals).xyz;
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;
//node #2 //node #2
normalIndex1D = thetas[3]; vec3 normal2 = getFromArray(thetas[3], u_textureDimFaces, u_normals).xyz;
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;
float coef1 = creaseGeo[2]; float coef1 = creaseGeo[2];
float coef2 = creaseGeo[3]; float coef2 = creaseGeo[3];
...@@ -258,13 +254,36 @@ ...@@ -258,13 +254,36 @@
normalIndex1D = thetas[3];//node #2 normalIndex1D = thetas[3];//node #2
momentArm = creaseGeo[1];//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 = getFromArray(normalIndex1D, u_textureDimFaces, u_normals).xyz;
vec3 normal = texture2D(u_normals, scaledNormalsIndex).xyz;
vec3 _force = angForce/momentArm*normal; vec3 _force = angForce/momentArm*normal;
force += _force; 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
} }
......
...@@ -277,6 +277,7 @@ function initDynamicSolver(globals){ ...@@ -277,6 +277,7 @@ function initDynamicSolver(globals){
gpuMath.initTextureFromData("u_creaseGeo", textureDimCreases, textureDimCreases, "FLOAT", creaseGeo, true); gpuMath.initTextureFromData("u_creaseGeo", textureDimCreases, textureDimCreases, "FLOAT", creaseGeo, true);
gpuMath.initFrameBufferForTexture("u_creaseGeo", true); gpuMath.initFrameBufferForTexture("u_creaseGeo", true);
gpuMath.initTextureFromData("u_faceVertexIndices", textureDimFaces, textureDimFaces, "FLOAT", faceVertexIndices, 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.createProgram("positionCalc", vertexShader, document.getElementById("positionCalcShader").text);
gpuMath.setUniformForProgram("positionCalc", "u_velocity", 0, "1i"); gpuMath.setUniformForProgram("positionCalc", "u_velocity", 0, "1i");
...@@ -305,6 +306,7 @@ function initDynamicSolver(globals){ ...@@ -305,6 +306,7 @@ function initDynamicSolver(globals){
gpuMath.setUniformForProgram("velocityCalc", "u_textureDimFaces", [textureDimFaces, textureDimFaces], "2f"); gpuMath.setUniformForProgram("velocityCalc", "u_textureDimFaces", [textureDimFaces, textureDimFaces], "2f");
gpuMath.setUniformForProgram("velocityCalc", "u_textureDimCreases", [textureDimCreases, textureDimCreases], "2f"); gpuMath.setUniformForProgram("velocityCalc", "u_textureDimCreases", [textureDimCreases, textureDimCreases], "2f");
gpuMath.setUniformForProgram("velocityCalc", "u_textureDimNodeCreases", [textureDimNodeCreases, textureDimNodeCreases], "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.setUniformForProgram("velocityCalc", "u_creasePercent", globals.creasePercent, "1f");
gpuMath.createProgram("thetaCalc", vertexShader, document.getElementById("thetaCalcShader").text); gpuMath.createProgram("thetaCalc", vertexShader, document.getElementById("thetaCalcShader").text);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment