-
Amira Abdel-Rahman authoredAmira Abdel-Rahman authored
main.js 32.28 KiB
// Amira Abdel-Rahman
// (c) Massachusetts Institute of Technology 2019
var color1= 0xffffff; /*white*/
var color2= 0x020227; /*kohly*/
var color3= 0x1c5c61; /*teal*/
var color4= "#fa6e70"; //red/orange
var color5="#380152"; //purple
var color6="#696767"; //grey
var color7="#03dbfc"; //blue
///////////globals (in case of hierarichal)/////////////
var camera;
var gui = new dat.GUI();
var clock = new THREE.Clock();
var timeElapsed = clock.getElapsedTime();
var currTimeStep=0;
var increase=true;
var setupEmpty={//empty
nodes: [
],
edges: [
],
//material properties - AISI 1095 Carbon Steel (Spring Steel)
ndofs : 3*6,
animation : {
showDisplacement : false,
exaggeration : 1000,
speed:3.0
},
viz : {
minStress:10e6,
maxStress: -10e6,
colorMaps:[coolwarm,YlGnBu, winter ,jet],
colorMap:0,
},
};
var setup=JSON.parse(JSON.stringify(setupEmpty));
function animate(){
timeElapsed = clock.getElapsedTime();
requestAnimationFrame(animate);
if(increase){
currTimeStep+=setup.animation.speed*setup.animation.speed*2.0; //todo change to globalSetup
}else{
currTimeStep-=setup.animation.speed*setup.animation.speed*2.0; //todo change to globalSetup
}
}
animate();
///////////////////////////////
////////////threejs object and utils//////////////////////
function threejs(setup,containerName,container1Name,static=true,live=false,empty=false){
// this.line;
this.setup=setup;
this.renderer;
this.scene;
// this.camera;
this.controls;
this.containerName=containerName;
this.container = document.getElementById( this.containerName );
this.container1Name=container1Name;
// this.line1;
this.matLineBasic;
this.matLineDashed;
this.matLineBasicBasic;
this.matLineBasicDashed;
this.static=static;
this.labelRenderer=[];
this.counter=0;
this.numFile=0;
this.live=live;
this.thinLines=false;
this.speed=this.setup.animation.speed;
this.empty=empty;
// viewport
}
threejs.prototype.init=function() {
this.renderer = new THREE.WebGLRenderer( { antialias: true } );
this.renderer.setPixelRatio( window.devicePixelRatio );
this.renderer.setClearColor( color2, 1.0 );
this.renderer.setSize( this.getWidth(), this.getHeight() );
this.container.appendChild( this.renderer.domElement );
this.scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( 60, this.getWidth() / this.getHeight(), 1, 10000 );
camera.position.set( - 40, 40, 60 );
camera = new THREE.OrthographicCamera( this.getWidth() / - 2, this.getWidth() / 2, this.getHeight() / 2, this.getHeight() / - 2, 1, 1000 );
camera.position.set( 0, 125, 0 );
this.controls = new THREE.OrbitControls( camera, this.renderer.domElement );
// this.controls.target.set( this.setup.voxelSize/2.0*this.setup.scale, this.setup.voxelSize*2.0*this.setup.scale, this.setup.voxelSize/2.0*this.setup.scale );
this.controls.minDistance = 1;
this.controls.maxDistance = 500;
var helper = new THREE.GridHelper( 100, 100 );
helper.position.y = -this.setup.voxelSize/2.0;
helper.material.opacity = 0.5;
helper.material.transparent = true;
helper.scale.x=2.0
helper.scale.z=2.0
this.scene.add( helper );
// this.labelRenderer = new THREE.CSS2DRenderer();
// this.labelRenderer.setSize( this.getWidth(), this.getHeight() );
// this.labelRenderer.domElement.style.position = 'absolute';
// this.labelRenderer.domElement.style.top = 0;
// this.container.appendChild( this.labelRenderer.domElement );
// this.controls = new THREE.OrbitControls( camera, this.labelRenderer.domElement );
// draw forces
// draw degrees of freedom
window.addEventListener( 'resize', onWindowResize, false );
onWindowResize();
if(!this.empty){
this.matLineBasic = new THREE.LineMaterial( {
color: 0xffffff,
vertexColors: THREE.VertexColors,
linewidth: 5, // in pixels
//resolution: // to be set by renderer, eventually
dashed: false
} );
this.matLineBasicBasic = new THREE.LineBasicMaterial( {
color: 0xffffff,
vertexColors: THREE.VertexColors,
linewidth: 5, // in pixels
//resolution: // to be set by renderer, eventually
} );
// matLineDashed.defines.USE_DASH = "";
this.matLineDashed = new THREE.LineMaterial( {
color: 0xffffff,
linewidth: 5, // in pixels
vertexColors: THREE.VertexColors,
//resolution: // to be set by renderer, eventually
dashed: false
} );
this.matLineBasicDashed = new THREE.LineBasicMaterial( {
color: 0xffffff,
linewidth: 5, // in pixels
vertexColors: THREE.VertexColors,
} );
this.drawStructure();
this.colorEdges();
this.drawConstraintBoundingBoxes();
if(!this.live){
if(!this.static){//dynamic
// initialize(this.setup);
this.renderEuler();
this.animateEuler()
}else{
this.render();
this.animate();
}
}else{
this.renderLive();
this.animateLive();
}
guiCreate(this);
}else{
this.renderEmpty();
this.animateEmpty();
}
};
threejs.prototype.drawStructure=function() {
//draw edges
for(var i=0;i<this.setup.edges.length;i++){
//this.createEdge(this.setup.nodes[this.setup.edges[i].source].position,this.setup.nodes[this.setup.edges[i].target].position,this.setup.edges[i].id,false);
if(this.live){
this.createEdge(this.setup.nodes[this.setup.edges[i].source].position,this.setup.nodes[this.setup.edges[i].target].position,this.setup.edges[i].id,true,this.setup.edges[i].area);
}else{
this.createEdge(this.setup.nodes[this.setup.edges[i].source].position,this.setup.nodes[this.setup.edges[i].target].position,this.setup.edges[i].id,true);
}
}
// draw nodes
for(var i=0;i<this.setup.nodes.length;i++){
//this.createNode(this.setup.nodes[i].position,this.setup.nodes[i].id,false,this.setup.nodes[i].restrained_degrees_of_freedom[0]);
var loaded=false;
if(this.setup.nodes[i].force.x!=0||this.setup.nodes[i].force.y!=0||this.setup.nodes[i].force.z!=0){
loaded=true;
}
this.createNode(this.setup.nodes[i].position,this.setup.nodes[i].id,true,this.setup.nodes[i].restrained_degrees_of_freedom[0],loaded);
}
this.drawForces();
};
threejs.prototype.createEdge=function(fromPoint,toPoint,name,displacement,lineWidth=1.0) {
fromPoint=toThreeVec(fromPoint);//todo utils
toPoint=toThreeVec(toPoint);//todo utils
var positions = [];
var positionss = [];
var colors = [];
var points =[fromPoint,toPoint];
var spline = new THREE.CatmullRomCurve3( points );
var divisions = Math.round( 2 * points.length );
var color = new THREE.Color();
var colorss = new Float32Array( (divisions+1) * 3 );
var count=0;
for ( var i = 0, l = divisions; i <= l; i ++ ) {
var point = spline.getPoint( i / l );
positionss.push( new THREE.Vector3( point.x, point.y, point.z) );
positions.push( point.x, point.y, point.z );
// color.setHSL( i / l, 1.0, 0.5 );
color=interpolateLinearly(i / l, this.setup.viz.colorMaps[this.setup.viz.colorMap]);
// color=interpolateLinearly(i / l, coolwarm);
colors.push( new THREE.Vector3( color[0], color[1], color[2]));
colorss[count]=color[0]
colorss[count+1]=color[1]
colorss[count+2]=color[2]
count+=3
}
if(this.thinLines){
var geometry = new THREE.BufferGeometry().setFromPoints( positionss );
}else{
var geometry = new THREE.LineGeometry();
geometry.setPositions( positions );
geometry.setColors( colors );
}
var line;
if(displacement){
if(this.thinLines){
line = new THREE.Line( geometry, this.matLineBasicDashed.clone() );
}else{
line = new THREE.Line2( geometry, this.matLineDashed );
}
}else{
if(this.thinLines){
line = new THREE.Line( geometry, this.matLineBasicBasic.clone() );
}else{
line = new THREE.Line2( geometry, this.matLineBasic );
}
}
if(this.thinLines){
line.geometry.setAttribute( 'color',new THREE.BufferAttribute( colorss, 3 ) );
line.geometry.colorsNeedUpdate = true;
line.material.transparent=true;
line.material.opacity=lineWidth;
line.material.needsUpdate=true;
}else{
line.computeLineDistances();
line.scale.set( 1, 1, 1 );
}
if(displacement){
line.name='d'+name;
}else{
line.name=name;
}
this.scene.add( line );
};
threejs.prototype.createNode=function(point,name,displacement,restrained,loaded=false) {
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material;
if(restrained){
material = new THREE.MeshBasicMaterial( {color: color4} );
}else if(loaded){
material = new THREE.MeshBasicMaterial( {color: color7} );
}else {
material = new THREE.MeshBasicMaterial( {color: color3} );
}
if(displacement){
material.transparent=true;
material.opacity=0.7;
}else{
material.transparent=true;
material.opacity=0.0;
}
var cube = new THREE.Mesh( geometry, material );
cube.position.set(point.x, point.y, point.z);
cube.scale.set(0.05*this.setup.voxelSize, 0.05*this.setup.voxelSize,0.05*this.setup.voxelSize);
// console.log(this.setup.voxelSize);
// this.setup.voxelSize=1.5;
if(this.setup.hierarchical){
cube.scale.set(0.9*this.setup.voxelSize, 0.9*this.setup.voxelSize,0.9*this.setup.voxelSize);
}
if(displacement){
cube.name='d'+name;
}else{
cube.name=name;
}
// var earthDiv = document.createElement( 'div' );
// earthDiv.className = 'label';
// earthDiv.textContent = name;
// earthDiv.style.marginTop = '-1em';
// var earthLabel = new THREE.CSS2DObject( earthDiv );
// earthLabel.position.set( point.x*0.1, point.y*0.1, point.z*0.1 );
// cube.add( earthLabel );
this.scene.add( cube );
};
threejs.prototype.editEdge=function(fromPoint,toPoint,name) {
var edge = this.scene.getObjectByName(name);
var positions = [];
var points =[fromPoint,toPoint];
var spline = new THREE.CatmullRomCurve3( points );
var divisions = Math.round( 2 * points.length );
// var color = new THREE.Color();
var positionss = new Float32Array( (divisions+1) * 3 );
var count=0;
for ( var i = 0, l = divisions; i <=l; i ++ ) {
var point = spline.getPoint( i / l );
positions.push( point.x, point.y, point.z );
positionss[count]=point.x
positionss[count+1]=point.y
positionss[count+2]=point.z
count+=3
}
// edge.geometry.setDrawRange( 0, newValue );
// edge.geometry.setPositions( positions );
// edge.geometry.attributes.position.needsUpdate = true;
// edge.geometry.setPositions( positions );
// geometry.setColors( colors );
if(this.thinLines){
edge.geometry.setAttribute( 'position',new THREE.BufferAttribute( positionss, 3 ) );
edge.geometry.attributes.position.needsUpdate = true;
}else{
edge.geometry.setPositions( positions );
}
};
threejs.prototype.drawForces=function() {
for(var i=0;i<this.setup.nodes.length;i++){
var dx=0.1;
var o=toThreeVec(this.setup.nodes[i].position);
o.multiplyScalar(this.setup.scale);
var dir = toThreeVec(this.setup.nodes[i].force);
var length = dir.length ();
dir.normalize();
var scale=0.00002*this.setup.scale;
if(length!=0){
var arrowhelper=new THREE.ArrowHelper( dir, o.sub(dir), scale*length, color7 ,scale*length, scale*length);
// var arrowhelper=new THREE.ArrowHelper( dir, o.sub(dir), scale*length, color7);
arrowhelper.name="f"+i;
this.scene.add(arrowhelper);
}
}
};
threejs.prototype.updateForce1=function(id,o,dir){
var length = dir.length();
dir.normalize();
// var scale=0.2;
var scale=0.00002*this.setup.scale;
if(length!=0){
var arrow = this.scene.getObjectByName("f"+id.substring(1));
if(arrow){
// arrowhelper=new THREE.ArrowHelper( force.normalize(), arrow.position, scale*length, color7 ,scale*length, scale*length);
// arrowhelper.name="f"+id.substring(1);
// arrow.setDirection(force.normalize());
// arrow.setLength(scale*length,scale*length,scale*length);
// arrow=new THREE.ArrowHelper( dir, o.sub(dir), scale*length, color7 ,scale*length, scale*length);
// console.log("here")
var pos=o.sub(dir);
arrow.position.x=pos.x;
arrow.position.y=pos.y;
arrow.position.z=pos.z;
}
}
}
threejs.prototype.updateForce=function(id,f){
// var scale=0.00000001;
var scale=0.00002*this.setup.scale;
var force=new THREE.Vector3(f,0,0);
var length = force.length();
var arrow = this.scene.getObjectByName("f"+id.substring(1));
if(arrow){
// arrowhelper=new THREE.ArrowHelper( force.normalize(), arrow.position, scale*length, color7 ,scale*length, scale*length);
// arrowhelper.name="f"+id.substring(1);
arrow.setDirection(force.normalize());
arrow.setLength(scale*length,scale*length,scale*length);
}
}
///////
threejs.prototype.animateEmpty=function() {
requestAnimationFrame( this.animateEmpty.bind(this));
this.renderEmpty();
};
threejs.prototype.animate=function() {
requestAnimationFrame( this.animate.bind(this));
this.render();
};
threejs.prototype.animateEuler=function() {
requestAnimationFrame( this.animateEuler.bind(this));
this.renderEuler();
};
threejs.prototype.animateLive=function() {
requestAnimationFrame( this.animateLive.bind(this));
this.renderLive();
};
threejs.prototype.renderEmpty=function(){
// main scene
// this.labelRenderer.render( this.scene, camera );
this.renderer.setViewport( 0, 0, this.getWidth(), this.getHeight() );
// renderer will set this eventually
this.renderer.render( this.scene, camera );
};
threejs.prototype.render=function(){
// main scene
// this.labelRenderer.render( this.scene, camera );
this.renderer.setClearColor( color2, 1 );
this.renderer.setViewport( 0, 0, this.getWidth(), this.getHeight() );
// renderer will set this eventually
this.matLineBasic.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.matLineDashed.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.renderer.render( this.scene, camera );
var speed=this.setup.animation.speed;
var exaggeration=this.setup.animation.exaggeration;
// var exaggeration=0.01;
if(this.setup.animation.showDisplacement){
//displacement animation edges
for(var i=0;i<this.setup.edges.length;i++){
var fromPoint=new THREE.Vector3(0,0,0);
var toPoint=new THREE.Vector3(0,0,0);
var node1=this.setup.nodes[this.setup.edges[i].source];
var node2=this.setup.nodes[this.setup.edges[i].target];
fromPoint.x = node1.position.x+node1.displacement.x*exaggeration+ Math.sin(timeElapsed*speed)* node1.displacement.x*exaggeration ;
fromPoint.y = node1.position.y+node1.displacement.y*exaggeration+ Math.sin(timeElapsed*speed)* node1.displacement.y*exaggeration ;
fromPoint.z = node1.position.z+node1.displacement.z*exaggeration+ Math.sin(timeElapsed*speed)* node1.displacement.z*exaggeration ;
var node = this.scene.getObjectByName('d'+node1.id);
node.position.x = fromPoint.x;
node.position.y = fromPoint.y;
node.position.z = fromPoint.z;
node.rotation.x = 0+node1.angle.x*exaggeration+ Math.sin(timeElapsed*speed)* node1.angle.x*exaggeration ;
node.rotation.y = 0+node1.angle.y*exaggeration+ Math.sin(timeElapsed*speed)* node1.angle.y*exaggeration ;
node.rotation.z = 0+node1.angle.z*exaggeration+ Math.sin(timeElapsed*speed)* node1.angle.z*exaggeration ;
toPoint.x = node2.position.x+node2.displacement.x*exaggeration+ Math.sin(timeElapsed*speed)* node2.displacement.x*exaggeration ;
toPoint.y = node2.position.y+node2.displacement.y*exaggeration+ Math.sin(timeElapsed*speed)* node2.displacement.y*exaggeration ;
toPoint.z = node2.position.z+node2.displacement.z*exaggeration+ Math.sin(timeElapsed*speed)* node2.displacement.z*exaggeration ;
node = this.scene.getObjectByName('d'+node2.id);
node.position.x = toPoint.x;
node.position.y = toPoint.y;
node.position.z = toPoint.z;
node.rotation.x = 0+node2.angle.x*exaggeration+ Math.sin(timeElapsed*speed)* node2.angle.x*exaggeration ;
node.rotation.y = 0+node2.angle.y*exaggeration+ Math.sin(timeElapsed*speed)* node2.angle.y*exaggeration ;
node.rotation.z = 0+node2.angle.z*exaggeration+ Math.sin(timeElapsed*speed)* node2.angle.z*exaggeration ;
this.editEdge(fromPoint,toPoint,'d'+this.setup.edges[i].id);
}
}
};
threejs.prototype.renderEuler1=function(){
var dt=0.0251646;
// simulateParallel( this.setup,10,dt,false,2);
doTimeStep(this.setup,dt,false,this.counter,1);
// this.colorEdges();
// simulateParallel(setup1,three.setup.numTimeSteps,dt,static,2);
// main scene
this.renderer.setClearColor( color2, 1 );
this.renderer.setViewport( 0, 0, this.getWidth(), this.getHeight() );
// renderer will set this eventually
this.matLineBasic.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.matLineDashed.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.renderer.render( this.scene, camera );
var speed=this.setup.animation.speed;
var exaggeration=this.setup.animation.exaggeration;
var exaggeration=1.0;
// console.log(this.setup.nodes[0].posTimeSteps)
//todo later change how it's implemented
if(this.setup.nodes[0].posTimeSteps){
var numIntervals=this.setup.nodes[0].posTimeSteps.length;
// if(currTimeStep>=numIntervals){
// currTimeStep=numIntervals-1;
// increase=false;
// }else if(currTimeStep<0){
// currTimeStep=0;
// increase=true;
// }
if(currTimeStep>=numIntervals){
currTimeStep=0;
}
var index=parseInt(currTimeStep);
currTimeStep=this.counter;
index=this.counter;
if(this.setup.animation.showDisplacement){
//displacement animation edges
for(var i=0;i<this.setup.edges.length;i++){
var fromPoint=new THREE.Vector3(0,0,0);
var toPoint=new THREE.Vector3(0,0,0);
var node1=this.setup.nodes[this.setup.edges[i].source];
var node2=this.setup.nodes[this.setup.edges[i].target];
fromPoint.x = node1.position.x+node1.posTimeSteps[index].x*exaggeration ;
fromPoint.y = node1.position.y+node1.posTimeSteps[index].y*exaggeration ;
fromPoint.z = node1.position.z+node1.posTimeSteps[index].z*exaggeration ;
var node = this.scene.getObjectByName('d'+node1.id);
//todo check if this is effecient or ject go thought nodes
node.position.x = fromPoint.x;
node.position.y = fromPoint.y;
node.position.z = fromPoint.z;
node.rotation.x = 0+node1.angTimeSteps[index].x*exaggeration ;
node.rotation.y = 0+node1.angTimeSteps[index].y*exaggeration ;
node.rotation.z = 0+node1.angTimeSteps[index].z*exaggeration ;
var scale=0.1;
this.updateForce(node1.id,getForce(node1.position,currTimeStep).length()*scale);
toPoint.x = node2.position.x+node2.posTimeSteps[index].x*exaggeration ;
toPoint.y = node2.position.y+node2.posTimeSteps[index].y*exaggeration ;
toPoint.z = node2.position.z+node2.posTimeSteps[index].z*exaggeration ;
node = this.scene.getObjectByName('d'+node2.id);
node.position.x = toPoint.x;
node.position.y = toPoint.y;
node.position.z = toPoint.z;
node.rotation.x = 0+node2.angTimeSteps[index].x*exaggeration ;
node.rotation.y = 0+node2.angTimeSteps[index].y*exaggeration ;
node.rotation.z = 0+node2.angTimeSteps[index].z*exaggeration ;
this.updateForce(node2.id,getForce(node2.position,currTimeStep).length()*scale);
this.editEdge(fromPoint,toPoint,'d'+this.setup.edges[i].id);
if(globalSetup.updateStress){
this.colorEdge(this.setup.edges[i].stressTimeSteps[index],'d'+this.setup.edges[i].id);
}
}
}
}
this.counter++;
};
threejs.prototype.renderEuler=function(){
// main scene
this.renderer.setClearColor( color2, 1 );
this.renderer.setViewport( 0, 0, this.getWidth(), this.getHeight() );
// renderer will set this eventually
this.matLineBasic.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.matLineDashed.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.renderer.render( this.scene, camera );
var speed=this.setup.animation.speed;
var exaggeration=this.setup.animation.exaggeration;
// console.log(this.setup.nodes[0].posTimeSteps.length)
//todo later change how it's implemented
if(this.setup.nodes[0].posTimeSteps){
var numIntervals=this.setup.nodes[0].posTimeSteps.length;
// console.log(numIntervals)
// if(currTimeStep>=numIntervals){
// currTimeStep=numIntervals-1;
// increase=false;
// }else if(currTimeStep<0){
// currTimeStep=0;
// increase=true;
// }
if(currTimeStep>=numIntervals){
currTimeStep=0;
}
var index=parseInt(currTimeStep);
if(this.setup.animation.showDisplacement){
// console.log(index)
//displacement animation edges
for(var i=0;i<this.setup.edges.length;i++){
var fromPoint=new THREE.Vector3(0,0,0);
var toPoint=new THREE.Vector3(0,0,0);
var node1=this.setup.nodes[this.setup.edges[i].source];
var node2=this.setup.nodes[this.setup.edges[i].target];
fromPoint.x = node1.position.x+node1.posTimeSteps[index].x*exaggeration ;
fromPoint.y = node1.position.y+node1.posTimeSteps[index].y*exaggeration ;
fromPoint.z = node1.position.z+node1.posTimeSteps[index].z*exaggeration ;
var node = this.scene.getObjectByName('d'+node1.id);
//todo check if this is effecient or ject go thought nodes
node.position.x = fromPoint.x;
node.position.y = fromPoint.y;
node.position.z = fromPoint.z;
node.rotation.x = 0+node1.angTimeSteps[index].x*exaggeration ;
node.rotation.y = 0+node1.angTimeSteps[index].y*exaggeration ;
node.rotation.z = 0+node1.angTimeSteps[index].z*exaggeration ;
var scale=0.1;
// this.updateForce(node1.id,getForce(node1.position,currTimeStep).length()*scale);
toPoint.x = node2.position.x+node2.posTimeSteps[index].x*exaggeration ;
toPoint.y = node2.position.y+node2.posTimeSteps[index].y*exaggeration ;
toPoint.z = node2.position.z+node2.posTimeSteps[index].z*exaggeration ;
node = this.scene.getObjectByName('d'+node2.id);
node.position.x = toPoint.x;
node.position.y = toPoint.y;
node.position.z = toPoint.z;
node.rotation.x = 0+node2.angTimeSteps[index].x*exaggeration ;
node.rotation.y = 0+node2.angTimeSteps[index].y*exaggeration ;
node.rotation.z = 0+node2.angTimeSteps[index].z*exaggeration ;
// this.updateForce(node2.id,getForce(node2.position,currTimeStep).length()*scale);
this.editEdge(fromPoint,toPoint,'d'+this.setup.edges[i].id);
if(this.setup.updateStress){
this.colorEdge(this.setup.edges[i].stressTimeSteps[index],'d'+this.setup.edges[i].id);
}
}
}
}
};
threejs.prototype.renderLive=function(){
// main scene
// this.labelRenderer.render( this.scene, camera );
this.renderer.setClearColor( color2, 1 );
this.renderer.setViewport( 0, 0, this.getWidth(), this.getHeight() );
// renderer will set this eventually
this.matLineBasic.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.matLineDashed.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.renderer.render( this.scene, camera );
var speed=this.speed;
var exaggeration=this.setup.animation.exaggeration;
// var exaggeration=0.01;
if(this.setup.animation.showDisplacement){
//displacement animation edges
for(var i=0;i<this.setup.edges.length;i++){
var fromPoint=new THREE.Vector3(0,0,0);
var toPoint=new THREE.Vector3(0,0,0);
var node1=this.setup.nodes[this.setup.edges[i].source];
var node2=this.setup.nodes[this.setup.edges[i].target];
fromPoint.x = node1.position.x+node1.displacement.x*exaggeration;
fromPoint.y = node1.position.y+node1.displacement.y*exaggeration;
fromPoint.z = node1.position.z+node1.displacement.z*exaggeration;
var node = this.scene.getObjectByName('d'+node1.id);
var dir = toThreeVec(node1.force);
var length = dir.length();
if(length!=0){
this.updateForce1(node1.id,fromPoint.clone(),dir);
}
node.position.x = fromPoint.x;
node.position.y = fromPoint.y;
node.position.z = fromPoint.z;
node.rotation.x = 0+node1.angle.x;
node.rotation.y = 0+node1.angle.y;
node.rotation.z = 0+node1.angle.z;
if(typeof node1.size !== 'undefined'){
node.scale.x = 0.5*node1.size;
node.scale.y = 0.5*node1.size;
node.scale.z = 0.5*node1.size;
}
toPoint.x = node2.position.x+node2.displacement.x*exaggeration;
toPoint.y = node2.position.y+node2.displacement.y*exaggeration;
toPoint.z = node2.position.z+node2.displacement.z*exaggeration;
node = this.scene.getObjectByName('d'+node2.id);
var dir = toThreeVec(node2.force);
var length = dir.length();
if(length!=0){
this.updateForce1(node2.id,toPoint.clone(),dir);
}
node.position.x = toPoint.x;
node.position.y = toPoint.y;
node.position.z = toPoint.z;
node.rotation.x = 0+node2.angle.x;
node.rotation.y = 0+node2.angle.y;
node.rotation.z = 0+node2.angle.z;
if(typeof node2.size !== 'undefined'){
node.scale.x = 0.5*node2.size;
node.scale.y = 0.5*node2.size;
node.scale.z = 0.5*node2.size;
}
// this.editEdge(fromPoint,toPoint,'d'+this.setup.edges[i].id);
this.editEdge(fromPoint,toPoint,'d'+this.setup.edges[i].id);
// uncomment this to make it faster
this.colorEdge(this.setup.edges[i].stress,'d'+this.setup.edges[i].id);
}
this.counter++;
var numFile=this.numFile;
var s=this.setup;
if(this.counter>this.speed*0.5){
//get new setup
// this.colorEdges();
$.getJSON("../json/"+this.folderName+"/"+numFile+".json", function(json) {
// console.log(numFile)
// console.log(json.nodes)
// this.setup.nodes=json.nodes;
s.nodes=json.nodes;
s.edges=json.edges;
s.viz.minStress=json.viz.minStress;
s.viz.maxStress=json.viz.maxStress;
// s=json;
// console.log("opened file:"+ numFile);
});
this.setup=s;
this.numFile++;
if (this.numFile>s.maxNumFiles-1){
this.numFile=0;
}
this.counter=0;
}
}
};
threejs.prototype.renderLast=function(){
// main scene
// this.labelRenderer.render( this.scene, camera );
if(this.live){
this.renderer.setClearColor( color2, 1 );
this.renderer.setViewport( 0, 0, this.getWidth(), this.getHeight() );
// renderer will set this eventually
this.matLineBasic.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.matLineDashed.resolution.set( this.getWidth(), this.getHeight() ); // resolution of the viewport
this.renderer.render( this.scene, camera );
var speed=this.setup.animation.speed;
var exaggeration=this.setup.animation.exaggeration;
var s=this.setup;
var numFile=s.maxNumFiles-1;
//get new setup
// this.colorEdges();
$.getJSON("../json/"+this.folderName+"/"+numFile+".json", function(json) {
// console.log(json.nodes)
// this.setup.nodes=json.nodes;
s.nodes=json.nodes;
s.edges=json.edges;
s.viz.minStress=json.viz.minStress;
s.viz.maxStress=json.viz.maxStress;
// s=json;
// console.log("opened file:"+ numFile);
});
this.setup=s;
this.numFile++;
if (this.numFile>s.maxNumFiles){
this.numFile=0;
}
//displacement animation edges
for(var i=0;i<this.setup.edges.length;i++){
var fromPoint=new THREE.Vector3(0,0,0);
var toPoint=new THREE.Vector3(0,0,0);
var node1=this.setup.nodes[this.setup.edges[i].source];
var node2=this.setup.nodes[this.setup.edges[i].target];
fromPoint.x = node1.position.x+node1.displacement.x*exaggeration;
fromPoint.y = node1.position.y+node1.displacement.y*exaggeration;
fromPoint.z = node1.position.z+node1.displacement.z*exaggeration;
var node = this.scene.getObjectByName('d'+node1.id);
node.position.x = fromPoint.x;
node.position.y = fromPoint.y;
node.position.z = fromPoint.z;
node.rotation.x = 0+node1.angle.x;
node.rotation.y = 0+node1.angle.y;
node.rotation.z = 0+node1.angle.z;
if(typeof node.size !== 'undefined'){
node.scale.x = 0.5*node1.size;
node.scale.y = 0.5*node1.size;
node.scale.z = 0.5*node1.size;
}
toPoint.x = node2.position.x+node2.displacement.x*exaggeration;
toPoint.y = node2.position.y+node2.displacement.y*exaggeration;
toPoint.z = node2.position.z+node2.displacement.z*exaggeration;
node = this.scene.getObjectByName('d'+node2.id);
node.position.x = toPoint.x;
node.position.y = toPoint.y;
node.position.z = toPoint.z;
node.rotation.x = 0+node2.angle.x;
node.rotation.y = 0+node2.angle.y;
node.rotation.z = 0+node2.angle.z;
if(typeof node.size !== 'undefined'){
node.scale.x = 0.5*node2.size;
node.scale.y = 0.5*node2.size;
node.scale.z = 0.5*node2.size;
}
this.editEdge(fromPoint,toPoint,'d'+this.setup.edges[i].id);
}
}
};
//////////////////////////////////////////
threejs.prototype.getWidth=function(){
// return container.style.width;
if(this.container1Name===""){
return window.innerWidth;
}else{
return $('#'+this.container1Name).width() ;
}
};
threejs.prototype.getHeight=function(){
// return container.style.height;
if(this.container1Name===""){
console.log()
return window.innerHeight ;
}else{
return $('#'+this.container1Name).height() ;
}
};
/////events////
//todo change
function onWindowResize() {
if(typeof three !== 'undefined'){
camera.aspect = three.getWidth() / three.getHeight();
camera.updateProjectionMatrix();
three.renderer.setSize( three.getWidth(), three.getHeight() );
}
if(typeof three1 !== 'undefined'){
camera.aspect = three1.getWidth() / three1.getHeight();
camera.updateProjectionMatrix();
three1.renderer.setSize( three1.getWidth(), three1.getHeight() );
}
}
////////////////
threejs.prototype.colorEdges=function() {
for(var ii=0;ii<this.setup.edges.length;ii++){
var element=this.setup.edges[ii];
//this.colorEdge(element.stress,element.id);
this.colorEdge(element.stress,'d'+element.id);
}
};
threejs.prototype.colorEdge=function(val,name) {
var colors = [];
var val=map(val,this.setup.viz.minStress,this.setup.viz.maxStress,1.0,0.0);
var divisions = Math.round( 2 * 2 );
var colorss = new Float32Array( (divisions+1) * 3 );
var count=0;
for ( var i = 0, l = divisions; i <= l; i ++ ) {
color=interpolateLinearly(val, this.setup.viz.colorMaps[this.setup.viz.colorMap]);
colors.push( color[0], color[1], color[2]);
colorss[count]=color[0]
colorss[count+1]=color[1]
colorss[count+2]=color[2]
count+=3
}
var edge = this.scene.getObjectByName(name);
if(this.thinLines){
edge.geometry.setAttribute( 'color',new THREE.BufferAttribute( colorss, 3 ) );
color=interpolateLinearly(val, this.setup.viz.colorMaps[this.setup.viz.colorMap]);
edge.geometry.colorsNeedUpdate = true;
edge.material.needsUpdate=true;
}else{
edge.geometry.setColors( colors );
}
};
threejs.prototype.drawConstraintBoundingBoxes=function() {
let supports=this.setup.supports;
let loads=this.setup.loads;
let mat=this.setup.materials;
let disps=this.setup.fixedDisplacements;
if (supports ) {
for (var i=0;i< supports.length;i++) {
let s=supports[i][0];
this.drawBox1(s.min,s.max,color4);
}
}
if (loads ) {
for (var i=0;i< loads.length;i++) {
let l=loads[i][0];
this.drawBox1(l.min,l.max,color7);
}
}
if (disps ) {
for (var i=0;i< disps.length;i++) {
let l=disps[i][0];
this.drawBox1(l.min,l.max,color7);
}
}
if (mat ) {
for (var i=0;i< mat.length;i++) {
let l=mat[i][0];
// console.log(l)
this.drawBox1(l.min,l.max,color5);
}
}
};
threejs.prototype.drawBox=function(min,max,color) {
var box = new THREE.Box3(new THREE.Vector3(min[0],min[1],min[2]),new THREE.Vector3(max[0],max[1],max[2]));
var helper = new THREE.Box3Helper( box, color );
this.scene.add( helper );
// todo add name??
};
threejs.prototype.drawBox1=function(min,max,color) {
var box = new THREE.Box3(new THREE.Vector3(min.x,min.y,min.z),new THREE.Vector3(max.x,max.y,max.z));
var helper = new THREE.Box3Helper( box, color );
this.scene.add( helper );
// todo add name??
};
/////////////////gui////////////////
function guiCreate (three){
var f1 = gui.addFolder('Displacement Animation '+three.containerName);
f1.add(three.setup.animation, 'showDisplacement');
f1.add(three.setup.animation, 'exaggeration', 0, 1000);
f1.add(three.setup.animation, 'speed', 0, 10);
var f2 = gui.addFolder('Stresses Visualization '+three.containerName);
f2.add(three.setup.viz, 'minStress', -1000, 0).listen();
f2.add(three.setup.viz, 'maxStress', 0, 1000).listen();
f2.add(three.setup.viz, 'colorMap', {coolwarm:0, YlGnBu:1, winter:2,jet:3});
// gui.add(setup, 'solve');
for (j in f2.__controllers) f2.__controllers[j].onChange (updateColors.bind(this)); //todo check three
for (j in f1.__controllers) f1.__controllers[j].onChange (renderLast.bind(this)); //todo check three
}
//todo remove this
function updateColors(){
three.colorEdges();
if(typeof three1 !== 'undefined'){
three1.colorEdges();
}
}
function renderLast(){
three.renderLast();
if(typeof three1 !== 'undefined'){
three1.renderLast();
}
}