From 38cba28a5f91b6d689f680f2be8f5e36a1ccaecf Mon Sep 17 00:00:00 2001
From: Amira Abdel-Rahman <amira-rahman@aucegypt.edu>
Date: Sun, 24 Nov 2019 18:09:00 -0500
Subject: [PATCH] try to enclose threejs

---
 .../assembly/main.js                          |  17 +-
 .../physical_computing_interface/index.html   |   2 +-
 .../threejs/main.js                           | 366 +++++++++---------
 3 files changed, 199 insertions(+), 186 deletions(-)

diff --git a/01_Code/physical_computing_interface/assembly/main.js b/01_Code/physical_computing_interface/assembly/main.js
index 3ba2c18..d9be7bb 100644
--- a/01_Code/physical_computing_interface/assembly/main.js
+++ b/01_Code/physical_computing_interface/assembly/main.js
@@ -782,14 +782,6 @@ function updateAngles(robotIndex){
 
 }
 
-
-function ik_2d(x, y, d1, d2) {
-	let dist = Math.sqrt(x ** 2 + y ** 2);
-	let theta1 = Math.atan2(y, x) - Math.acos((dist ** 2 + d1 ** 2 - d2 ** 2) / (2 * d1 * dist));
-	let theta2 = Math.atan2(y - d1 * Math.sin(theta1), x - d1 * Math.cos(theta1));
-	return {theta1, theta2};
-}
-
 function getNormalAdjustment(robotIndex,n,vnormal,forward){//n is normal degree
 
 	var result=new THREE.Vector3(0,0,0);
@@ -909,11 +901,11 @@ function createPath(robotIndex,start,end){
 	var enormal=new THREE.Vector3(0,0,1);
 	var robotUp=new THREE.Vector3(0,0,1);
 	var p1=start.clone();
-	p1.add(snormal.clone().multiplyScalar(1));
+	p1.add(snormal.clone().multiplyScalar(0));
 	var p2=new THREE.Vector3(0,0,0);
 	var p3=new THREE.Vector3(0,0,0);
 	var p4=end.clone();
-	p4.add(enormal.clone().multiplyScalar(1));
+	p4.add(enormal.clone().multiplyScalar(0));
 
 	var nor = snormal.clone();
 	nor.add(enormal);
@@ -2195,6 +2187,9 @@ function buildHelperMeshes(robotIndex){
 	var material = new THREE.MeshLambertMaterial({ color:0xff7171,});
 	var geometry = new THREE.SphereGeometry(0.5, 0.5, 0.5);
 	targetPositionMesh[robotIndex] = new THREE.Mesh(geometry, material);
+	targetPositionMesh[robotIndex].scale.x=0.8;
+	targetPositionMesh[robotIndex].scale.y=0.8;
+	targetPositionMesh[robotIndex].scale.z=0.8;
 	scene.add(targetPositionMesh[robotIndex]);
 
 	for (var count=0; count<startLocations.length;count++)
@@ -2215,7 +2210,7 @@ function showTargetPosition(robotIndex,targetPos,show){
 		
 		targetPositionMesh[robotIndex].position.x=targetPos.x;
 		targetPositionMesh[robotIndex].position.y=targetPos.y;
-		targetPositionMesh[robotIndex].position.z=targetPos.z;
+		targetPositionMesh[robotIndex].position.z=targetPos.z+voxelSpacing/2;
 		carriedVoxel[robotIndex].visible=true;
 		targetPositionMesh[robotIndex].visible=true;
 		
diff --git a/01_Code/physical_computing_interface/index.html b/01_Code/physical_computing_interface/index.html
index 825190e..d84376c 100644
--- a/01_Code/physical_computing_interface/index.html
+++ b/01_Code/physical_computing_interface/index.html
@@ -108,7 +108,7 @@
 <!-- code -->
 <script src="./main.js"></script> <!-- event handling and main json structure -->
 <script src="./threejs/assembly.js"></script><!-- assembly and timestep handling -->
-<script src="./threejs/grid.js"></script><!-- threejs visualization -->
+<script src="./threejs/main.js"></script><!-- threejs visualization -->
 <script src="./graph/main.js"></script><!-- graph flow visualization-->
 <script src="./json/main.js"></script><!-- json -->
 
diff --git a/01_Code/physical_computing_interface/threejs/main.js b/01_Code/physical_computing_interface/threejs/main.js
index dde1a78..b9714c9 100644
--- a/01_Code/physical_computing_interface/threejs/main.js
+++ b/01_Code/physical_computing_interface/threejs/main.js
@@ -1,194 +1,212 @@
 function threejs(){
-    var camera, scene, renderer;
-    var plane;
-    var mouse, raycaster, isShiftDown = false;
-    var rollOverMesh, rollOverMaterial;
-    var cubeGeo, cubeMaterial;
-    var objects = [];
-    var container = document.getElementById( 'webgl' );
-    var container1 = document.getElementById( 'threejs' );
-    var controls;
+    this.camera=[];
+    this.scene=[];
+    this.renderer=[];
+    this.plane=[];
+    this.mouse=[];
+    this.raycaster=[];
+    this.isShiftDown = false;
+    this.rollOverMesh=[];
+    this.rollOverMaterial;
+    this.cubeGeo=[];
+    this.cubeMaterial=[];
+    this.objects = [];
+    this.container = document.getElementById( 'webgl' );
+    this.container1 = document.getElementById( 'threejs' );
+    this.controls=[];
+}
     
-    init();
-    // render();
-    function init() {
-        camera = new THREE.PerspectiveCamera( 45, getWidth()  / getHeight() , 1, 10000 );
-        camera.position.set( 500, 800, 1300 );
-        camera.lookAt( 0, 0, 0 );
-        scene = new THREE.Scene();
-        scene.background = new THREE.Color( 0xffffff );
-        // roll-over helpers
-        var rollOverGeo = new THREE.BoxBufferGeometry( 50, 50, 50 );
-        rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
-        rollOverMesh = new THREE.Mesh( rollOverGeo, rollOverMaterial );
-        scene.add( rollOverMesh );
-        // cubes
-        cubeGeo = new THREE.BoxBufferGeometry( 50, 50, 50 );
-        cubeMaterial = new THREE.MeshPhongMaterial( { color: 0x1c5c61 } );
-        // grid
-        var gridHelper = new THREE.GridHelper( 1000, 20 );
-        scene.add( gridHelper );
-        //
-        raycaster = new THREE.Raycaster();
-        mouse = new THREE.Vector2();
-        var geometry = new THREE.PlaneBufferGeometry( 1000, 1000 );
-        geometry.rotateX( - Math.PI / 2 );
-        plane = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { visible: false } ) );
-        scene.add( plane );
-        objects.push( plane );
-        // lights
-        var ambientLight = new THREE.AmbientLight( 0x606060 );
-        scene.add( ambientLight );
-        var directionalLight = new THREE.DirectionalLight( 0xffffff );
-        directionalLight.position.set( 1, 0.75, 0.5 ).normalize();
-        scene.add( directionalLight );
-        renderer = new THREE.WebGLRenderer( { antialias: true } );
-        renderer.setPixelRatio( window.devicePixelRatio );
-        // renderer.setSize( window.innerWidth, window.innerHeight );
-        renderer.setSize(getWidth(),getHeight());
-
-        renderer = new THREE.WebGLRenderer();
-        
-        container.appendChild( renderer.domElement );
-        controls = new THREE.OrbitControls( camera, renderer.domElement );
-        controls.update();
-        // document.body.appendChild( renderer.domElement );
-        onWindowResize();
-        container.addEventListener( 'mousemove', onDocumentMouseMove, false );
-        container.addEventListener( 'mousedown', onDocumentMouseDown, false );
-        window.addEventListener( 'keydown', onDocumentKeyDown, false );
-        window.addEventListener( 'keyup', onDocumentKeyUp, false );
-        //
-        window.addEventListener( 'mouseup', onWindowResize, false );
-        window.addEventListener( 'resize', onWindowResize, false );
-        animate();
-
-
-        
-    }
-    function animate() {
+// init();
+// render();
+
+
+threejs.prototype.animate=function() {
+
+    requestAnimationFrame(this.animate.bind(this));
 
-        requestAnimationFrame( animate );
+    this.render();
+}
+
+
+
+threejs.prototype.render=function() {
+    this.renderer.render( this.scene, this.camera );
+    this.controls.update();
+}
+
+threejs.prototype.getWidth=function(){
+    // return container.style.width;
+    return $('#threejs').width() ;
+}
+
+threejs.prototype.getHeight=function(){
+    // return container.style.height;
+    return $('#threejs').height() ;
+}
+
+
+
+threejs.prototype.init=function() {
+    this.camera = new THREE.PerspectiveCamera( 45, this.getWidth()  / this.getHeight() , 1, 10000 );
+    this.camera.position.set( 500, 800, 1300 );
+    this.camera.lookAt( 0, 0, 0 );
+    this.scene = new THREE.Scene();
+    this.scene.background = new THREE.Color( 0xffffff );
+    // roll-over helpers
+    var rollOverGeo = new THREE.BoxBufferGeometry( 50, 50, 50 );
+    this.rollOverMaterial = new THREE.MeshBasicMaterial( { color: 0xff0000, opacity: 0.5, transparent: true } );
+    this.rollOverMesh = new THREE.Mesh( rollOverGeo, this.rollOverMaterial );
+    this.scene.add( this.rollOverMesh );
+    // cubes
+    this.cubeGeo = new THREE.BoxBufferGeometry( 50, 50, 50 );
+    this.cubeMaterial = new THREE.MeshPhongMaterial( { color: 0x1c5c61 } );
+    // grid
+    var gridHelper = new THREE.GridHelper( 1000, 20 );
+    this.scene.add( gridHelper );
+    //
+    this.raycaster = new THREE.Raycaster();
+    this.mouse = new THREE.Vector2();
+    var geometry = new THREE.PlaneBufferGeometry( 1000, 1000 );
+    geometry.rotateX( - Math.PI / 2 );
+    this.plane = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { visible: false } ) );
+    this.scene.add( this.plane );
+    this.objects.push( this.plane );
+    // lights
+    var ambientLight = new THREE.AmbientLight( 0x606060 );
+    this.scene.add( ambientLight );
+    var directionalLight = new THREE.DirectionalLight( 0xffffff );
+    directionalLight.position.set( 1, 0.75, 0.5 ).normalize();
+    this.scene.add( directionalLight );
+    this.renderer = new THREE.WebGLRenderer( { antialias: true } );
+    this.renderer.setPixelRatio( window.devicePixelRatio );
+    // renderer.setSize( window.innerWidth, window.innerHeight );
+    this.renderer.setSize(this.getWidth(),this.getHeight());
+
+    this.renderer = new THREE.WebGLRenderer();
     
-        render();
-    }
+    this.container.appendChild( this.renderer.domElement );
+    this.controls = new THREE.OrbitControls( this.camera, this.renderer.domElement );
+    this.controls.update();
+    // document.body.appendChild( renderer.domElement );
+    onWindowResizeThree();
+    this.container.addEventListener( 'mousemove', onDocumentMouseMoveThree, false );
+    this.container.addEventListener( 'mousedown', onDocumentMouseDownThree, false );
+    window.addEventListener( 'keydown', onDocumentKeyDownThree, false );
+    window.addEventListener( 'keyup', onDocumentKeyUpThree, false );
+    //
+    window.addEventListener( 'mouseup', onWindowResizeThree, false );
+    window.addEventListener( 'resize', onWindowResizeThree, false );
+    this.animate();
+    // requestAnimationFrame( this.animate );
 
-    function onWindowResize() {
-        camera.aspect = getWidth() / getHeight();
-        camera.updateProjectionMatrix();
-        renderer.setSize( getWidth() , getHeight() );
-    }
 
-    function onDocumentMouseMove( event ) {
-        event.preventDefault();
-        mouse.set( ( event.clientX / getWidth() ) * 2 - 1, - ( event.clientY / getHeight() ) * 2 + 1 );
-        raycaster.setFromCamera( mouse, camera );
-        var intersects = raycaster.intersectObjects( objects );
-        if ( intersects.length > 0 ) {
-            var intersect = intersects[ 0 ];
-            rollOverMesh.position.copy( intersect.point ).add( intersect.face.normal );
-            rollOverMesh.position.divideScalar( voxelSpacing ).floor().multiplyScalar( voxelSpacing ).addScalar( voxelSpacing/2 );
-        }
-        render();
+    
+}
+
+
+var three=new threejs();
+three.init();
+
+function onDocumentMouseMoveThree( event ) {
+    // console.log(three.mouse)
+    // three.mouse = new THREE.Vector2();
+    event.preventDefault();
+    three.mouse.set( ( event.clientX / three.getWidth() ) * 2 - 1, - ( event.clientY / three.getHeight() ) * 2 + 1 );
+    three.raycaster.setFromCamera( three.mouse, three.camera );
+    var intersects = three.raycaster.intersectObjects( three.objects );
+    if ( intersects.length > 0 ) {
+        var intersect = intersects[ 0 ];
+        three.rollOverMesh.position.copy( intersect.point ).add( intersect.face.normal );
+        three.rollOverMesh.position.divideScalar( voxelSpacing ).floor().multiplyScalar( voxelSpacing ).addScalar( voxelSpacing/2 );
     }
+    three.render();
+}
 
-    function onDocumentMouseDown( event ) {
-        event.preventDefault();
-        mouse.set( ( event.clientX / getWidth() ) * 2 - 1, - ( event.clientY / getHeight() ) * 2 + 1 );
-        raycaster.setFromCamera( mouse, camera );
-        var intersects = raycaster.intersectObjects( objects );
-        if ( intersects.length > 0 ) {
-            var intersect = intersects[ 0 ];
-            // delete cube
-            if ( isShiftDown ) {
-                // console.log("shiftt iss dowwn");
-                if ( intersect.object !== plane ) {
-                    // scene.remove( intersect.object );
-                    // console.log(intersect.object.name);
-                    var pos=getXYZfromName(intersect.object.name);
-                    removeNode(pos.x,pos.y,pos.z);
-                    // objects.splice( objects.indexOf( intersect.object ), 1 );
-                }
-                // create cube
-            } else {
-                var voxel = new THREE.Mesh( cubeGeo, cubeMaterial );
-                
-
-                voxel.position.copy( intersect.point ).add( intersect.face.normal );
-
-                var x=Math.floor(voxel.position.x/voxelSpacing)+gridSize/2;
-                var y=Math.floor(voxel.position.y/voxelSpacing);
-                var z=Math.floor(voxel.position.z/voxelSpacing)+gridSize/2;
-                if(y<0){
-                    y=0;
-                }
-
-                addNode (x,z ,y); //y is up
-                // voxel.name='[' +x +"," +z+","+y+']';
-
-                // voxel.position.divideScalar( voxelSpacing ).floor().multiplyScalar( voxelSpacing ).addScalar( voxelSpacing/2 );
-                // scene.add( voxel );
-                // objects.push( voxel );
-                
-                
+function onDocumentMouseDownThree( event ) {
+    event.preventDefault();
+    three.mouse = new THREE.Vector2();
+    three.mouse.set( ( event.clientX / three.getWidth() ) * 2 - 1, - ( event.clientY / three.getHeight() ) * 2 + 1 );
+    three.raycaster.setFromCamera( three.mouse, three.camera );
+    var intersects = three.raycaster.intersectObjects( three.objects );
+    if ( intersects.length > 0 ) {
+        var intersect = intersects[ 0 ];
+        // delete cube
+        if ( three.isShiftDown ) {
+            // console.log("shiftt iss dowwn");
+            if ( intersect.object !== three.plane ) {
+                // scene.remove( intersect.object );
+                // console.log(intersect.object.name);
+                var pos=getXYZfromName(intersect.object.name);
+                removeNode(pos.x,pos.y,pos.z);
+                // objects.splice( objects.indexOf( intersect.object ), 1 );
+            }
+            // create cube
+        } else {
+            var voxel = new THREE.Mesh( three.cubeGeo, three.cubeMaterial );
+            
+
+            voxel.position.copy( intersect.point ).add( intersect.face.normal );
+
+            var x=Math.floor(voxel.position.x/voxelSpacing)+gridSize/2;
+            var y=Math.floor(voxel.position.y/voxelSpacing);
+            var z=Math.floor(voxel.position.z/voxelSpacing)+gridSize/2;
+            if(y<0){
+                y=0;
             }
-            render();
-        }
-    }
 
-    document.addEventListener('addNode', function (e) { 
-        var voxel = new THREE.Mesh( cubeGeo, cubeMaterial );
-                
-        // voxel.position.copy( intersect.point ).add( intersect.face.normal );
-        // var x=Math.floor(voxel.position.x/voxelSpacing)+gridSize/2;
-        // var y=Math.floor(voxel.position.y/voxelSpacing);
-        // var z=Math.floor(voxel.position.z/voxelSpacing)+gridSize/2;
-        voxel.position.x=e.detail.posX;
-        voxel.position.y=e.detail.posZ;
-        voxel.position.z=e.detail.posY;
-
-        voxel.name='[' +e.detail.x +"," +e.detail.y+","+e.detail.z+']';
-        // voxel.position.divideScalar( voxelSpacing ).floor().multiplyScalar( voxelSpacing ).addScalar( voxelSpacing/2 );
-        scene.add( voxel );
-        objects.push( voxel );
-        
-    }, false);
-
-    document.addEventListener('removeNode', function (e) { 
-        var name='[' +e.detail.x +"," +e.detail.y+","+e.detail.z+']';
-        var object = scene.getObjectByName( name );
-        scene.remove( object );
-        objects.splice( objects.indexOf( object ), 1 );
-        
-    }, false);
-
-    function onDocumentKeyDown( event ) {
-        switch ( event.keyCode ) {
-            case 16: isShiftDown = true; break;
-        }
-    }
+            addNode (x,z ,y); //y is up
+            // voxel.name='[' +x +"," +z+","+y+']';
 
-    function onDocumentKeyUp( event ) {
-        switch ( event.keyCode ) {
-            case 16: isShiftDown = false; break;
+            // voxel.position.divideScalar( voxelSpacing ).floor().multiplyScalar( voxelSpacing ).addScalar( voxelSpacing/2 );
+            // scene.add( voxel );
+            // objects.push( voxel );
+            
+            
         }
+        three.render();
     }
+}
 
-    function render() {
-        renderer.render( scene, camera );
-        controls.update();
-    }
+document.addEventListener('addNode', function (e) { 
+    var voxel = new THREE.Mesh( three.cubeGeo, three.cubeMaterial );
+            
+    // voxel.position.copy( intersect.point ).add( intersect.face.normal );
+    // var x=Math.floor(voxel.position.x/voxelSpacing)+gridSize/2;
+    // var y=Math.floor(voxel.position.y/voxelSpacing);
+    // var z=Math.floor(voxel.position.z/voxelSpacing)+gridSize/2;
+    voxel.position.x=e.detail.posX;
+    voxel.position.y=e.detail.posZ;
+    voxel.position.z=e.detail.posY;
+
+    voxel.name='[' +e.detail.x +"," +e.detail.y+","+e.detail.z+']';
+    // voxel.position.divideScalar( voxelSpacing ).floor().multiplyScalar( voxelSpacing ).addScalar( voxelSpacing/2 );
+    three.scene.add( voxel );
+    three.objects.push( voxel );
+    
+}, false);
 
-    function getWidth(){
-        // return container.style.width;
-        return $('#threejs').width() ;
-    }
+document.addEventListener('removeNode', function (e) { 
+    var name='[' +e.detail.x +"," +e.detail.y+","+e.detail.z+']';
+    var object = scene.getObjectByName( name );
+    three.scene.remove( object );
+    three.objects.splice( objects.indexOf( object ), 1 );
+    
+}, false);
 
-    function getHeight(){
-        // return container.style.height;
-        return $('#threejs').height() ;
+function onDocumentKeyDownThree( event ) {
+    switch ( event.keyCode ) {
+        case 16: three.isShiftDown = true; break;
     }
+}
 
+function onDocumentKeyUpThree( event ) {
+    switch ( event.keyCode ) {
+        case 16: three.isShiftDown = false; break;
+    }
 }
-threejs();
 
+function onWindowResizeThree(){
+    three.camera.aspect = three.getWidth() / three.getHeight();
+    three.camera.updateProjectionMatrix();
+    three.renderer.setSize( three.getWidth() , three.getHeight() );
+}
-- 
GitLab