Separate prototype in classes in multiple files, and merged two versions
This commit is contained in:
		
							parent
							
								
									453cc401d1
								
							
						
					
					
						commit
						1d6dbc0522
					
				
							
								
								
									
										4
									
								
								controllers/prototype/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								controllers/prototype/index.js
									
									
									
									
										vendored
									
									
								
							| @ -10,7 +10,7 @@ module.exports.index = function(req, res) { | |||||||
| module.exports.arrows = function(req, res) { | module.exports.arrows = function(req, res) { | ||||||
|     res.setHeader('Content-Type', 'text/html'); |     res.setHeader('Content-Type', 'text/html'); | ||||||
| 
 | 
 | ||||||
|     res.locals.extrajs = '<script src="/static/js/prototype/arrows/main.js"></script>'; |     res.locals.cameraStyle = 'arrows'; | ||||||
| 
 | 
 | ||||||
|     res.render('prototype.jade', res.locals, function(err, result) { |     res.render('prototype.jade', res.locals, function(err, result) { | ||||||
|         console.log(err); |         console.log(err); | ||||||
| @ -21,7 +21,7 @@ module.exports.arrows = function(req, res) { | |||||||
| module.exports.viewports = function(req, res) { | module.exports.viewports = function(req, res) { | ||||||
|     res.setHeader('Content-Type', 'text/html'); |     res.setHeader('Content-Type', 'text/html'); | ||||||
| 
 | 
 | ||||||
|     res.locals.extrajs = '<script src="/static/js/prototype/viewports/main.js"></script>'; |     res.locals.cameraStyle = 'viewports'; | ||||||
| 
 | 
 | ||||||
|     res.render('prototype.jade', res.locals, function(err, result) { |     res.render('prototype.jade', res.locals, function(err, result) { | ||||||
|         res.send(result); |         res.send(result); | ||||||
|  | |||||||
| @ -4,7 +4,15 @@ block title | |||||||
|     title #{title} - Prototype |     title #{title} - Prototype | ||||||
| 
 | 
 | ||||||
| block extrajs | block extrajs | ||||||
|     #{extrajs} |     script(src="/static/js/prototype/initScene.js") | ||||||
|  |     script(src="/static/js/prototype/raycasterTools.js") | ||||||
|  |     script(src="/static/js/prototype/Previewer.js") | ||||||
|  |     script(src="/static/js/prototype/ButtonManager.js") | ||||||
|  |     if cameraStyle == 'arrows' | ||||||
|  |         script Recommendation = FixedCamera; | ||||||
|  |     else if cameraStyle == 'viewports' | ||||||
|  |         script Recommendation = OldFixedCamera; | ||||||
|  |     script(src="/static/js/prototype/main.js") | ||||||
| 
 | 
 | ||||||
| block extrahead | block extrahead | ||||||
|     link(rel="stylesheet" href="/static/css/prototype.css") |     link(rel="stylesheet" href="/static/css/prototype.css") | ||||||
|  | |||||||
| @ -1,5 +1,13 @@ | |||||||
| var CameraContainer = function () { | var CameraContainer = function (pointerCamera, cameras) { | ||||||
|     this.cameras = new Array(); |     if (cameras !== undefined) { | ||||||
|  |         this.cameras = cameras; | ||||||
|  |     } else { | ||||||
|  |         this.cameras = []; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (pointerCamera !== undefined) { | ||||||
|  |         this.push(pointerCamera); | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| CameraContainer.prototype.mainCamera = function(id) { | CameraContainer.prototype.mainCamera = function(id) { | ||||||
|  | |||||||
| @ -86,6 +86,7 @@ var OldFixedCamera = function(arg1, arg2, arg3, arg4, position, target) { | |||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     this.mesh = new THREE.Mesh(geometry, material); |     this.mesh = new THREE.Mesh(geometry, material); | ||||||
|  |     this.mesh.raycastable = true; | ||||||
| } | } | ||||||
| OldFixedCamera.prototype = Object.create(THREE.PerspectiveCamera.prototype); | OldFixedCamera.prototype = Object.create(THREE.PerspectiveCamera.prototype); | ||||||
| OldFixedCamera.prototype.constructor = OldFixedCamera; | OldFixedCamera.prototype.constructor = OldFixedCamera; | ||||||
|  | |||||||
							
								
								
									
										51
									
								
								static/js/prototype/ButtonManager.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								static/js/prototype/ButtonManager.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | |||||||
|  | var ButtonManager = function(cameras) { | ||||||
|  |     this.cameras = cameras; | ||||||
|  | 
 | ||||||
|  |     this.showArrows = true; | ||||||
|  |     this.beenFullscreen = false; | ||||||
|  | 
 | ||||||
|  |     this.fullscreenElement = document.getElementById('full'); | ||||||
|  |     this.fullElement = document.getElementById('fullarrow'); | ||||||
|  |     this.resetElement = document.getElementById('reset'); | ||||||
|  |     this.undoElement = document.getElementById('undo'); | ||||||
|  |     this.redoElement = document.getElementById('redo'); | ||||||
|  | 
 | ||||||
|  |     this.collisionElement = document.getElementById('collisions'); | ||||||
|  |     this.showarrowsElement = document.getElementById('showarrows'); | ||||||
|  | 
 | ||||||
|  |     this.fullscreenElement.onclick = function() {}; | ||||||
|  |     this.resetElement.onclick = cameras.mainCamera().reset(); | ||||||
|  | 
 | ||||||
|  |     (function(self) { | ||||||
|  |         self.undoElement.onclick = function() {cameras.mainCamera().undo(); self.updateElements();} | ||||||
|  |         self.redoElement.onclick = function() {cameras.mainCamera().redo(); self.updateElements();} | ||||||
|  | 
 | ||||||
|  |         self.fullElement.onclick = function() { | ||||||
|  |         cameras.map(function(camera) { | ||||||
|  |             if (!(camera instanceof PointerCamera)) { | ||||||
|  |                 camera.fullArrow = self.fullElement.checked; | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         self.collisionElement.onchange = function() {cameras.mainCamera().collisions = self.collisionElement.checked;} | ||||||
|  |         self.showarrowsElement.onchange = function() {self.showArrows = self.showarrowsElement.checked;} | ||||||
|  |         }; | ||||||
|  |     })(this); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ButtonManager.prototype.updateElements = function() { | ||||||
|  |     // Update icon
 | ||||||
|  |     if (!this.cameras.mainCamera().undoable()) { | ||||||
|  |         this.undoElement.className = "btn btn-default"; | ||||||
|  |     } else { | ||||||
|  |         this.undoElement.className = "btn btn-primary"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!this.cameras.mainCamera().redoable()) { | ||||||
|  |         this.redoElement.className = "btn btn-default"; | ||||||
|  |     } else { | ||||||
|  |         this.redoElement.className = "btn btn-primary"; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										52
									
								
								static/js/prototype/Previewer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								static/js/prototype/Previewer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,52 @@ | |||||||
|  | var Previewer = function(renderer) { | ||||||
|  |     this.domElement = document.createElement('canvas'); | ||||||
|  |     this.ctx = this.domElement.getContext('2d'); | ||||||
|  |     this.renderer = renderer; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Previewer.prototype.render = function(prev, container_width, container_height) { | ||||||
|  |     var width = container_width / 5; | ||||||
|  |     var height = container_height / 5; | ||||||
|  |     var left = prev.x - width/2; | ||||||
|  |     var bottom =  renderer.domElement.height - prev.y + height/5; | ||||||
|  | 
 | ||||||
|  |     if (prev.go) { | ||||||
|  |         width  = Math.floor(container_width / 5); | ||||||
|  |         height = Math.floor(container_height / 5); | ||||||
|  |         left   = Math.floor(prev.x - width/2); | ||||||
|  |         bottom = Math.floor(renderer.domElement.height - prev.y + height/5); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         // Draw border
 | ||||||
|  |         var can_bottom = container_height - bottom - height ; | ||||||
|  |         this.ctx.strokeStyle = "#ffffff"; | ||||||
|  |         this.ctx.beginPath(); | ||||||
|  |         this.ctx.moveTo(left-1, can_bottom); | ||||||
|  |         this.ctx.lineTo(left-1, can_bottom + height); | ||||||
|  |         this.ctx.lineTo(left + width-1, can_bottom + height); | ||||||
|  |         this.ctx.lineTo(left + width-1, can_bottom); | ||||||
|  |         this.ctx.closePath(); | ||||||
|  |         this.ctx.stroke(); | ||||||
|  | 
 | ||||||
|  |         this.ctx.strokeStyle = "#000000"; | ||||||
|  |         this.ctx.beginPath(); | ||||||
|  |         this.ctx.moveTo(left, can_bottom + 1); | ||||||
|  |         this.ctx.lineTo(left, can_bottom + height - 1); | ||||||
|  |         this.ctx.lineTo(left + width - 2 , can_bottom + height-1); | ||||||
|  |         this.ctx.lineTo(left + width - 2, can_bottom+1); | ||||||
|  |         this.ctx.closePath(); | ||||||
|  |         this.ctx.stroke(); | ||||||
|  | 
 | ||||||
|  |         // Do render in previsualization
 | ||||||
|  |         prev.camera.look(); | ||||||
|  |         renderer.setScissor(left, bottom, width, height); | ||||||
|  |         renderer.enableScissorTest (true); | ||||||
|  |         renderer.setViewport(left, bottom, width, height); | ||||||
|  |         renderer.render(scene, prev.camera); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Previewer.prototype.clear = function() { | ||||||
|  |     this.domElement.width = this.domElement.width; | ||||||
|  | } | ||||||
							
								
								
									
										550
									
								
								static/js/prototype/arrows/main.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										550
									
								
								static/js/prototype/arrows/main.js
									
									
									
									
										vendored
									
									
								
							| @ -1,550 +0,0 @@ | |||||||
| var mesh_number = 25; |  | ||||||
| var renderer, scene, controls, cube, container, plane, mouse= {x:0, y:0}; |  | ||||||
| var bigmesh; |  | ||||||
| var raycaster; |  | ||||||
| var objects = []; |  | ||||||
| var cameras = new CameraContainer(); |  | ||||||
| var spheres = new Array(mesh_number); |  | ||||||
| var visible = 0; |  | ||||||
| var stats; |  | ||||||
| var canvas; |  | ||||||
| var ctx2d; |  | ||||||
| 
 |  | ||||||
| var loader; |  | ||||||
| 
 |  | ||||||
| var main_section = document.getElementById('main-section'); |  | ||||||
| var offset = function() { |  | ||||||
|     return |  | ||||||
|         document.getElementById('nav').offsetHeight |  | ||||||
|         + document.getElementById('main-div').offsetHeight; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| console.log(document.getElementById('main-div').offsetHeight); |  | ||||||
| var container_size = { |  | ||||||
|     width: function() { return main_section.clientWidth; }, |  | ||||||
|     height: function() { |  | ||||||
|         return main_section.clientHeight |  | ||||||
|             - document.getElementById('nav').offsetHeight |  | ||||||
|             - document.getElementById('main-div').offsetHeight; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| console.log(container_size.width(), container_size.height()); |  | ||||||
| 
 |  | ||||||
| var prev = {x:0, y:0, go:false}; |  | ||||||
| var showArrows = true; |  | ||||||
| var beenFullscreen = false; |  | ||||||
| 
 |  | ||||||
| var undoElement = document.getElementById('undo'); |  | ||||||
| var redoElement = document.getElementById('redo'); |  | ||||||
| 
 |  | ||||||
| function updateElements() { |  | ||||||
|     // Update icon
 |  | ||||||
|     if (!cameras.mainCamera().undoable()) { |  | ||||||
|         undoElement.className = "btn btn-default"; |  | ||||||
|     } else { |  | ||||||
|         undoElement.className = "btn btn-primary"; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!cameras.mainCamera().redoable()) { |  | ||||||
|         redoElement.className = "btn btn-default"; |  | ||||||
|     } else { |  | ||||||
|         redoElement.className = "btn btn-primary"; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| init(); |  | ||||||
| animate(); |  | ||||||
| 
 |  | ||||||
| function init() { |  | ||||||
|     // Collidable objects to prevent camera from traversing objects
 |  | ||||||
|     var collidableObjects = new Array(); |  | ||||||
| 
 |  | ||||||
|     document.getElementById('full').onclick = fullscreen; |  | ||||||
| 
 |  | ||||||
|     // Add the listener on the button
 |  | ||||||
|     document.getElementById('reset').onclick = function() { cameras.mainCamera().reset(); }; |  | ||||||
|     var fullarrow = document.getElementById('fullarrow'); |  | ||||||
|     fullarrow.onchange = function() { |  | ||||||
|         cameras.map(function(camera) { |  | ||||||
|             if (camera instanceof FixedCamera) { |  | ||||||
|                 camera.fullArrow = fullarrow.checked; |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var collisions = document.getElementById('collisions'); |  | ||||||
|     collisions.onchange = function() { |  | ||||||
|         cameras.mainCamera().collisions = collisions.checked; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var showarrows = document.getElementById('showarrows'); |  | ||||||
|     showarrows.onchange = function() { |  | ||||||
|         showArrows = showarrows.checked; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     undoElement.onclick = function() { |  | ||||||
|         cameras.mainCamera().undo(); |  | ||||||
|         updateElements(); |  | ||||||
| 
 |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     redoElement.onclick = function() { |  | ||||||
|         cameras.mainCamera().redo(); |  | ||||||
|         updateElements(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // on initialise le moteur de rendu
 |  | ||||||
|     container = document.getElementById('container'); |  | ||||||
|     container.style.height = container_size.height() + 'px'; |  | ||||||
|     container.style.width = container_size.width() + 'px'; |  | ||||||
|     renderer = new THREE.WebGLRenderer({alpha:true, antialias:true}); |  | ||||||
|     renderer.setSize(container_size.width(), container_size.height()); |  | ||||||
|     // renderer.setSize(container_size.width(), container_size.height());
 |  | ||||||
|     renderer.shadowMapEnabled = true; |  | ||||||
|     renderer.setClearColor(0x87ceeb); |  | ||||||
| 
 |  | ||||||
|     canvas = document.createElement('canvas'); |  | ||||||
|     canvas.style.position ="absolute"; |  | ||||||
|     canvas.style.cssFloat = 'top-left'; |  | ||||||
|     canvas.width = container_size.width(); |  | ||||||
|     canvas.height = container_size.height(); |  | ||||||
|     ctx2d = canvas.getContext('2d'); |  | ||||||
|     ctx2d.lineWidth = 1; |  | ||||||
| 
 |  | ||||||
|     // on initialise la scène
 |  | ||||||
|     scene = new THREE.Scene(); |  | ||||||
|     raycaster = new THREE.Raycaster(); |  | ||||||
| 
 |  | ||||||
|     // Create stats counter
 |  | ||||||
|     stats = new Stats(); |  | ||||||
|     stats.setMode(0); |  | ||||||
| 
 |  | ||||||
|     stats.domElement.style.position = 'absolute'; |  | ||||||
|     stats.domElement.style.cssFloat = "top-left"; |  | ||||||
|     container.appendChild( stats.domElement ); |  | ||||||
|     container.appendChild(canvas); |  | ||||||
|     container.appendChild(renderer.domElement); |  | ||||||
| 
 |  | ||||||
|     // init light
 |  | ||||||
|     var directional_light = new THREE.DirectionalLight(0xdddddd); |  | ||||||
|     directional_light.position.set(1, 2.5, 1).normalize(); |  | ||||||
|     directional_light.castShadow = false; |  | ||||||
|     scene.add(directional_light); |  | ||||||
| 
 |  | ||||||
|     var ambient_light = new THREE.AmbientLight(0x444444); |  | ||||||
|     scene.add(ambient_light); |  | ||||||
| 
 |  | ||||||
|     // on initialise la camera que l’on place ensuite sur la scène
 |  | ||||||
|     var camera1 = new PointerCamera(50, container_size.width() / container_size.height(), 0.01, 100000, container); |  | ||||||
|     camera1.speed = 0.001; |  | ||||||
|     camera1.reset(); |  | ||||||
|     camera1.save(); |  | ||||||
|     scene.add(camera1); |  | ||||||
|     cameras.push(camera1); |  | ||||||
| 
 |  | ||||||
|     var loader = new THREE.OBJMTLLoader(); |  | ||||||
| 
 |  | ||||||
|     var onProgress = function ( xhr ) { |  | ||||||
|         if ( xhr.lengthComputable ) { |  | ||||||
|             var percentComplete = xhr.loaded / xhr.total * 100; |  | ||||||
|             console.log( Math.round(percentComplete, 2) + '% downloaded' ); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     var onError = function ( xhr ) { |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     // THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );
 |  | ||||||
|     var loader = new THREE.OBJMTLLoader(); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     loader.load( static_path + 'data/castle/princess peaches castle (outside).obj', |  | ||||||
|                  static_path + 'data/castle/princess peaches castle (outside).mtl', |  | ||||||
|     function ( object ) { |  | ||||||
|         object.up = new THREE.Vector3(0,0,1); |  | ||||||
|         scene.add(object); |  | ||||||
|         collidableObjects.push(object); |  | ||||||
|         object.traverse(function (object) { |  | ||||||
|             if (object instanceof THREE.Mesh) { |  | ||||||
|                 object.geometry.mergeVertices(); |  | ||||||
|                 object.geometry.computeVertexNormals(); |  | ||||||
|                 object.material.side = THREE.DoubleSide; |  | ||||||
|                 object.raycastable = true; |  | ||||||
|                 if (object.material.name === 'Material.103_princess_peaches_cast') { |  | ||||||
|                     object.material.transparent = true; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     }, onProgress, onError ); |  | ||||||
| 
 |  | ||||||
|     loader.load( static_path + 'data/first/Floor 1.obj', |  | ||||||
|                  static_path + 'data/first/Floor 1.mtl', |  | ||||||
|     function ( object ) { |  | ||||||
|         object.position.z -= 10.9; |  | ||||||
|         object.position.y += 0.555; |  | ||||||
|         object.position.x += 3.23; |  | ||||||
| 
 |  | ||||||
|         var theta = 0.27; |  | ||||||
|         object.rotation.y = Math.PI - theta; |  | ||||||
| 
 |  | ||||||
|         object.up = new THREE.Vector3(0,0,1); |  | ||||||
|         scene.add(object); |  | ||||||
|         collidableObjects.push(object); |  | ||||||
|         object.traverse(function (object) { |  | ||||||
|             if (object instanceof THREE.Mesh) { |  | ||||||
|                 object.material.side = THREE.DoubleSide; |  | ||||||
|                 // object.geometry.mergeVertices();
 |  | ||||||
|                 // object.geometry.computeVertexNormals();
 |  | ||||||
|                 object.raycastable = true; |  | ||||||
|                 if (object.material.name === 'Material.054_777F0E0B_c.bmp' || |  | ||||||
|                     object.material.name === 'Material.061_5C3492AB_c.bmp'   ) { |  | ||||||
|                     object.material.transparent = true; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     }, onProgress, onError ); |  | ||||||
| 
 |  | ||||||
|     // loader.load( static_path + 'data/bobomb/bobomb battlefeild.obj',
 |  | ||||||
|     //              static_path + 'data/bobomb/bobomb battlefeild.mtl',
 |  | ||||||
|     //         function ( object ) {
 |  | ||||||
|     //             // object.position.z -= 10.9;
 |  | ||||||
|     //             // object.position.y += 0.555;
 |  | ||||||
|     //             // object.position.x += 3.23;
 |  | ||||||
| 
 |  | ||||||
|     //             var theta = 0.27;
 |  | ||||||
|     //             object.rotation.y = Math.PI - theta;
 |  | ||||||
| 
 |  | ||||||
|     //             object.up = new THREE.Vector3(0,0,1);
 |  | ||||||
|     //             collidableObjects.push(object);
 |  | ||||||
|     //             scene.add(object);
 |  | ||||||
|     //             object.traverse(function (object) {
 |  | ||||||
|     //                 if (object instanceof THREE.Mesh) {
 |  | ||||||
|     //                     object.material.side = THREE.DoubleSide;
 |  | ||||||
|     //                     console.log(object.geometry.vertices.length);
 |  | ||||||
|     //                     object.geometry.mergeVertices();
 |  | ||||||
|     //                     object.geometry.computeVertexNormals();
 |  | ||||||
|     //                     if (object.material.name === 'Material.071_574B138E_c.bmp' ||
 |  | ||||||
|     //                         object.material.name === 'Material.070_41A41EE3_c.bmp') {
 |  | ||||||
|     //                         object.material.transparent = true;
 |  | ||||||
|     //                     }
 |  | ||||||
| 
 |  | ||||||
|     //                 }
 |  | ||||||
|     //             });
 |  | ||||||
|     //         }, onProgress, onError );
 |  | ||||||
| 
 |  | ||||||
|     // loader.load( static_path + 'data/star/GrandStar.obj',
 |  | ||||||
|     //              static_path + 'data/star/GrandStar.mtl',
 |  | ||||||
|     // function ( object ) {
 |  | ||||||
|     //     object.position.z -= 10.9;
 |  | ||||||
|     //     object.position.y += 0.555;
 |  | ||||||
|     //     object.position.x += 3.23;
 |  | ||||||
| 
 |  | ||||||
|     //     var theta = 0.27;
 |  | ||||||
|     //     object.rotation.y = Math.PI - theta;
 |  | ||||||
| 
 |  | ||||||
|     //     object.up = new THREE.Vector3(0,0,1);
 |  | ||||||
|     //     scene.add(object);
 |  | ||||||
|     //     collidableObjects.push(object);
 |  | ||||||
|     //     object.traverse(function (object) {
 |  | ||||||
|     //         if (object instanceof THREE.Mesh) {
 |  | ||||||
|     //             object.scale.set(0.005,0.005,0.005);
 |  | ||||||
|     //             object.position.x = 13;
 |  | ||||||
|     //             object.position.z = -35;
 |  | ||||||
|     //             object.position.y = 30;
 |  | ||||||
| 
 |  | ||||||
|     //             object.rotation.z = Math.PI/2;
 |  | ||||||
|     //             object.rotation.x = Math.PI/2;
 |  | ||||||
|     //             object.rotation.y = Math.PI;
 |  | ||||||
|     //             object.material.side = THREE.DoubleSide;
 |  | ||||||
|     //             object.geometry.mergeVertices();
 |  | ||||||
|     //             object.geometry.computeVertexNormals();
 |  | ||||||
|     //             object.raycastable = true;
 |  | ||||||
|     //         }
 |  | ||||||
|     //     });
 |  | ||||||
|     // }, onProgress, onError );
 |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(-3.349895207953063, 5.148106346852601, 0.3365943929701533), |  | ||||||
|             new THREE.Vector3(13.114421714865292, -7.783476327687569, -33.74713248359852) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(4.659399030971226, 1.018674883050052597, -2.578139604982815), |  | ||||||
|             new THREE.Vector3(-16.08800293200113, -28.8795632312717, -19.165379404919797) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(2.625389073616235, 1.2252620948239699, -4.818718135555419), |  | ||||||
|             new THREE.Vector3(-19.756833131355208, -16.20027570329664, -33.02132017177813) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(1.3304975149911331, 0.4836093721106701, -8.60618907952783), |  | ||||||
|             new THREE.Vector3(-1.7713635815431914, 6.271997833695163, -48.06341930106774) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(1.2976081760482443, 1.1520399813234647, -10.258148122402845), |  | ||||||
|             new THREE.Vector3(-26.00651734173549, -9.19681009597505, -37.596510029925945) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(0.15727187830660858, 2.7251137440572855, -5.84333603646124), |  | ||||||
|             new THREE.Vector3(19.33738702531091, -13.614383891308975, -36.91010284556961) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     window.addEventListener('resize', onWindowResize, false); |  | ||||||
| 
 |  | ||||||
|     container.addEventListener('mousedown', function(event) { if (event.which == 1) click(event); }, false); |  | ||||||
|     container.addEventListener('mousemove', updateMouse, false); |  | ||||||
|     document.addEventListener('keydown', function(event) { if (event.keyCode == 27) { stopFullscreen();} }, false); |  | ||||||
| 
 |  | ||||||
|     camera1.collidableObjects = collidableObjects; |  | ||||||
| 
 |  | ||||||
|     // Load the scene
 |  | ||||||
|     loadScene(); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function fullscreen() { |  | ||||||
| 
 |  | ||||||
|     if (!beenFullscreen) { |  | ||||||
|         beenFullscreen = true; |  | ||||||
|         alert('To quit fullscren mode, type ESC key'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     container.style.position = "absolute"; |  | ||||||
|     container.style.cssFloat = "top-left"; |  | ||||||
|     container.style.top = "0px"; |  | ||||||
|     container.style.bottom = "0px"; |  | ||||||
|     container.style.left = "0px"; |  | ||||||
|     container.style.right = "0px"; |  | ||||||
|     container.style.width=""; |  | ||||||
|     container.style.height=""; |  | ||||||
|     container.style.overflow = "hidden"; |  | ||||||
| 
 |  | ||||||
|     canvas.style.position = "absolute"; |  | ||||||
|     canvas.style.cssFloat = "top-left"; |  | ||||||
|     canvas.style.top = "0px"; |  | ||||||
|     canvas.style.bottom = "0px"; |  | ||||||
|     canvas.style.left = "0px"; |  | ||||||
|     canvas.style.right = "0px"; |  | ||||||
|     canvas.width=window.innerWidth; |  | ||||||
|     canvas.height=window.innerHeight; |  | ||||||
|     canvas.style.overflow = "hidden"; |  | ||||||
| 
 |  | ||||||
|     onWindowResize(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function stopFullscreen() { |  | ||||||
|     container.style.position = ""; |  | ||||||
|     container.style.cssFloat = ""; |  | ||||||
|     container.style.width = container_size.width() + "px"; |  | ||||||
|     container.style.height = container_size.height() + "px"; |  | ||||||
|     container.style.overflow = ""; |  | ||||||
| 
 |  | ||||||
|     // canvas.style.position = "";
 |  | ||||||
|     // canvas.style.cssFloat = "";
 |  | ||||||
|     canvas.style.top = ""; |  | ||||||
|     canvas.style.bottom = ""; |  | ||||||
|     canvas.style.left = ""; |  | ||||||
|     canvas.style.right = ""; |  | ||||||
|     canvas.width = container_size.width(); |  | ||||||
|     canvas.height = container_size.height(); |  | ||||||
|     // canvas.style.overflow = "";
 |  | ||||||
| 
 |  | ||||||
|     onWindowResize(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function log() { |  | ||||||
|     console.log(container.style.width); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function createCamera(position, target) { |  | ||||||
|     var camera = new FixedCamera( |  | ||||||
|             50, |  | ||||||
|             container_size.width() / container_size.height(), |  | ||||||
|             1, |  | ||||||
|             100000, |  | ||||||
|             position, |  | ||||||
|             target |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     camera.addToScene(scene); |  | ||||||
|     cameras.push(camera); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function loadScene() { |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function render() { |  | ||||||
|     updateMouse(); |  | ||||||
| 
 |  | ||||||
|     var transform = showArrows ? show : hide; |  | ||||||
|     cameras.map(function(camera) { |  | ||||||
|         if (camera instanceof FixedCamera) { |  | ||||||
|             transform(camera); |  | ||||||
| 
 |  | ||||||
|             camera.traverse(function(elt) { |  | ||||||
|                 elt.raycastable = showArrows; |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     cameras.updateMainCamera(); |  | ||||||
|     cameras.update(cameras.mainCamera()); |  | ||||||
|     cameras.look(); |  | ||||||
| 
 |  | ||||||
|     var left = 0, bottom = 0, width = container_size.width(), height = container_size.height(); |  | ||||||
|     renderer.setScissor(left, bottom, width, height); |  | ||||||
|     renderer.enableScissorTest(true); |  | ||||||
|     renderer.setViewport(left, bottom, width, height); |  | ||||||
|     renderer.render(scene, cameras.mainCamera()); |  | ||||||
| 
 |  | ||||||
|     // Clear canvas
 |  | ||||||
|     canvas.width = canvas.width; |  | ||||||
| 
 |  | ||||||
|     width = container_size.width() / 5; |  | ||||||
|     height = container_size.height() / 5; |  | ||||||
|     left = prev.x - width/2; |  | ||||||
|     bottom =  renderer.domElement.height - prev.y + height/5; |  | ||||||
| 
 |  | ||||||
|     if (prev.go) { |  | ||||||
|         // Hide arrows
 |  | ||||||
|         cameras.map(function(camera) { if (camera instanceof FixedCamera) hide(camera); }); |  | ||||||
| 
 |  | ||||||
|         width  = Math.floor(container_size.width() / 5); |  | ||||||
|         height = Math.floor(container_size.height() / 5); |  | ||||||
|         left   = Math.floor(prev.x - width/2); |  | ||||||
|         bottom = Math.floor(renderer.domElement.height - prev.y + height/5); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         // Draw border
 |  | ||||||
|         var can_bottom = container_size.height() - bottom - height ; |  | ||||||
|         ctx2d.strokeStyle = "#ffffff"; |  | ||||||
|         ctx2d.beginPath(); |  | ||||||
|         ctx2d.moveTo(left-1, can_bottom); |  | ||||||
|         ctx2d.lineTo(left-1, can_bottom + height); |  | ||||||
|         ctx2d.lineTo(left + width-1, can_bottom + height); |  | ||||||
|         ctx2d.lineTo(left + width-1, can_bottom); |  | ||||||
|         ctx2d.closePath(); |  | ||||||
|         ctx2d.stroke(); |  | ||||||
| 
 |  | ||||||
|         ctx2d.strokeStyle = "#000000"; |  | ||||||
|         ctx2d.beginPath(); |  | ||||||
|         ctx2d.moveTo(left, can_bottom + 1); |  | ||||||
|         ctx2d.lineTo(left, can_bottom + height - 1); |  | ||||||
|         ctx2d.lineTo(left + width - 2 , can_bottom + height-1); |  | ||||||
|         ctx2d.lineTo(left + width - 2, can_bottom+1); |  | ||||||
|         ctx2d.closePath(); |  | ||||||
|         ctx2d.stroke(); |  | ||||||
| 
 |  | ||||||
|         // Do render in previsualization
 |  | ||||||
|         prev.camera.look(); |  | ||||||
|         renderer.setScissor(left, bottom, width, height); |  | ||||||
|         renderer.enableScissorTest (true); |  | ||||||
|         renderer.setViewport(left, bottom, width, height); |  | ||||||
|         renderer.render(scene, prev.camera); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function animate() { |  | ||||||
|     // on appelle la fonction animate() récursivement à chaque frame
 |  | ||||||
|     requestAnimationFrame(animate); |  | ||||||
| 
 |  | ||||||
|     stats.begin(); |  | ||||||
|     render(); |  | ||||||
|     stats.end(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function onWindowResize() { |  | ||||||
| 
 |  | ||||||
|     container.style.width = container_size.width() + "px"; |  | ||||||
|     container.style.height = container_size.height() + "px"; |  | ||||||
| 
 |  | ||||||
|     canvas.width = container_size.width(); |  | ||||||
|     canvas.height = container_size.height(); |  | ||||||
| 
 |  | ||||||
|     renderer.setSize(container_size.width(), container_size.height()); |  | ||||||
|     cameras.forEach(function(camera) {camera.aspect = container_size.width() / container_size.height();}); |  | ||||||
|     cameras.forEach(function(camera) {camera.updateProjectionMatrix();}); |  | ||||||
|     render(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function hide(object) { |  | ||||||
|     object.traverse(function(object) {object.visible = false;}); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function show(object) { |  | ||||||
|     object.traverse(function(object) {object.visible = true;}); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function updateMouse(event) { |  | ||||||
| 
 |  | ||||||
|     if (event !== undefined) { |  | ||||||
|         mouse.x = event.offsetX == undefined ? event.layerX : event.offsetX; |  | ||||||
|         mouse.y = event.offsetY == undefined ? event.layerY : event.offsetY; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var hovered = pointedCamera(event); |  | ||||||
| 
 |  | ||||||
|     if (hovered !== undefined) { |  | ||||||
|         prev.x = mouse.x; |  | ||||||
|         prev.y = mouse.y; |  | ||||||
|         prev.camera = hovered; |  | ||||||
|         prev.go = true; |  | ||||||
|     } else { |  | ||||||
|         prev.go = false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function click(event) { |  | ||||||
|     var newCamera = pointedCamera(event); |  | ||||||
|     if (newCamera !== undefined) { |  | ||||||
|         cameras.mainCamera().moveHermite(newCamera); |  | ||||||
|         updateElements(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function pointedCamera(event) { |  | ||||||
|     var returnCamera; |  | ||||||
| 
 |  | ||||||
|     var x = ( mouse.x / renderer.domElement.width ) * 2 - 1; |  | ||||||
|     var y = - (mouse.y / renderer.domElement.height) * 2 + 1; |  | ||||||
| 
 |  | ||||||
|     var camera = cameras.mainCamera(); |  | ||||||
| 
 |  | ||||||
|     var vector = new THREE.Vector3(x, y, 0.5); |  | ||||||
|     vector.unproject(camera); |  | ||||||
| 
 |  | ||||||
|     raycaster.set(camera.position, vector.sub(camera.position).normalize()); |  | ||||||
| 
 |  | ||||||
|     var intersects = raycaster.intersectObjects(scene.children, true); |  | ||||||
| 
 |  | ||||||
|     if ( intersects.length > 0 ) { |  | ||||||
|         var minDistance; |  | ||||||
|         var bestIndex; |  | ||||||
| 
 |  | ||||||
|         // Looking for cameras
 |  | ||||||
|         for (i in intersects) { |  | ||||||
|             if (intersects[i].object.raycastable) { |  | ||||||
|                 if ((intersects[i].distance > 0.5 && minDistance === undefined) || (intersects[i].distance < minDistance )) { |  | ||||||
|                     if (!(intersects[i].object instanceof THREE.Mesh && intersects[i].object.material.opacity < 0.1)) { |  | ||||||
|                         minDistance = intersects[i].distance; |  | ||||||
|                         bestIndex = i; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (bestIndex !== undefined) { |  | ||||||
|             if (cameras.getById(intersects[bestIndex].object.parent.id) !== undefined) { |  | ||||||
|                 return cameras.getById(intersects[bestIndex].object.parent.id); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
							
								
								
									
										187
									
								
								static/js/prototype/initScene.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								static/js/prototype/initScene.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,187 @@ | |||||||
|  | // Define Recommendation if not defined
 | ||||||
|  | var Recommendation = Recommendation || FixedCamera; | ||||||
|  | 
 | ||||||
|  | function initPeachCastle(scene, collidableObjects, loader, static_path) { | ||||||
|  |     // Create loader if not already done
 | ||||||
|  |     if (loader === undefined) { | ||||||
|  |         loader = new THREE.OBJMTLLoader(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Try to guess the path to static files
 | ||||||
|  |     if (static_path === undefined) { | ||||||
|  |         static_path = "/static/"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     loader.load( | ||||||
|  |         static_path + 'data/castle/princess peaches castle (outside).obj', | ||||||
|  |         static_path + 'data/castle/princess peaches castle (outside).mtl', | ||||||
|  |         function ( object ) { | ||||||
|  |             object.up = new THREE.Vector3(0,0,1); | ||||||
|  |             scene.add(object); | ||||||
|  |             collidableObjects.push(object); | ||||||
|  |             object.traverse(function (object) { | ||||||
|  |                 if (object instanceof THREE.Mesh) { | ||||||
|  |                     object.geometry.mergeVertices(); | ||||||
|  |                     object.geometry.computeVertexNormals(); | ||||||
|  |                     object.material.side = THREE.DoubleSide; | ||||||
|  |                     object.raycastable = true; | ||||||
|  |                     if (object.material.name === 'Material.103_princess_peaches_cast') { | ||||||
|  |                         object.material.transparent = true; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     loader.load( | ||||||
|  |         static_path + 'data/first/Floor 1.obj', | ||||||
|  |         static_path + 'data/first/Floor 1.mtl', | ||||||
|  |         function ( object ) { | ||||||
|  |             object.position.z -= 10.9; | ||||||
|  |             object.position.y += 0.555; | ||||||
|  |             object.position.x += 3.23; | ||||||
|  | 
 | ||||||
|  |             var theta = 0.27; | ||||||
|  |             object.rotation.y = Math.PI - theta; | ||||||
|  | 
 | ||||||
|  |             object.up = new THREE.Vector3(0,0,1); | ||||||
|  |             scene.add(object); | ||||||
|  |             collidableObjects.push(object); | ||||||
|  |             object.traverse(function (object) { | ||||||
|  |                 if (object instanceof THREE.Mesh) { | ||||||
|  |                     object.material.side = THREE.DoubleSide; | ||||||
|  |                     object.geometry.mergeVertices(); | ||||||
|  |                     object.geometry.computeVertexNormals(); | ||||||
|  |                     object.raycastable = true; | ||||||
|  |                     if (object.material.name === 'Material.054_777F0E0B_c.bmp' || | ||||||
|  |                         object.material.name === 'Material.061_5C3492AB_c.bmp'   ) { | ||||||
|  |                         object.material.transparent = true; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | function createPeachCameras(width, height) { | ||||||
|  |     var cams = []; | ||||||
|  | 
 | ||||||
|  |     var createCamera = function(position, target) { | ||||||
|  |         return new Recommendation( | ||||||
|  |             50, | ||||||
|  |             width / height, | ||||||
|  |             1, | ||||||
|  |             100000, | ||||||
|  |             position, | ||||||
|  |             target | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     cams.push(createCamera( | ||||||
|  |             new THREE.Vector3(-3.349895207953063, 5.148106346852601, 0.3365943929701533), | ||||||
|  |             new THREE.Vector3(13.114421714865292, -7.783476327687569, -33.74713248359852) | ||||||
|  |     )); | ||||||
|  | 
 | ||||||
|  |     cams.push(createCamera( | ||||||
|  |             new THREE.Vector3(4.659399030971226, 1.018674883050052597, -2.578139604982815), | ||||||
|  |             new THREE.Vector3(-16.08800293200113, -28.8795632312717, -19.165379404919797) | ||||||
|  |     )); | ||||||
|  | 
 | ||||||
|  |     cams.push(createCamera( | ||||||
|  |             new THREE.Vector3(2.625389073616235, 1.2252620948239699, -4.818718135555419), | ||||||
|  |             new THREE.Vector3(-19.756833131355208, -16.20027570329664, -33.02132017177813) | ||||||
|  |     )); | ||||||
|  | 
 | ||||||
|  |     cams.push(createCamera( | ||||||
|  |             new THREE.Vector3(1.3304975149911331, 0.4836093721106701, -8.60618907952783), | ||||||
|  |             new THREE.Vector3(-1.7713635815431914, 6.271997833695163, -48.06341930106774) | ||||||
|  |     )); | ||||||
|  | 
 | ||||||
|  |     cams.push(createCamera( | ||||||
|  |             new THREE.Vector3(1.2976081760482443, 1.1520399813234647, -10.258148122402845), | ||||||
|  |             new THREE.Vector3(-26.00651734173549, -9.19681009597505, -37.596510029925945) | ||||||
|  |     )); | ||||||
|  | 
 | ||||||
|  |     cams.push(createCamera( | ||||||
|  |             new THREE.Vector3(0.15727187830660858, 2.7251137440572855, -5.84333603646124), | ||||||
|  |             new THREE.Vector3(19.33738702531091, -13.614383891308975, -36.91010284556961) | ||||||
|  |     )); | ||||||
|  | 
 | ||||||
|  |     return cams; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function initBobombScene(scene, loader, static_path) { | ||||||
|  |     // Create loader if not already done
 | ||||||
|  |     if (loader === undefined) { | ||||||
|  |         loader = new THREE.OBJMTLLoader(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Try to guess the path to static files
 | ||||||
|  |     if (static_path === undefined) { | ||||||
|  |         static_path = "/static/"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     loader.load( | ||||||
|  |         static_path + 'data/bobomb/bobomb battlefeild.obj', | ||||||
|  |         static_path + 'data/bobomb/bobomb battlefeild.mtl', | ||||||
|  |         function ( object ) { | ||||||
|  |             // object.position.z -= 10.9;
 | ||||||
|  |             // object.position.y += 0.555;
 | ||||||
|  |             // object.position.x += 3.23;
 | ||||||
|  | 
 | ||||||
|  |             var theta = 0.27; | ||||||
|  |             object.rotation.y = Math.PI - theta; | ||||||
|  | 
 | ||||||
|  |             object.up = new THREE.Vector3(0,0,1); | ||||||
|  |             collidableObjects.push(object); | ||||||
|  |             scene.add(object); | ||||||
|  |             object.traverse(function (object) { | ||||||
|  |                 if (object instanceof THREE.Mesh) { | ||||||
|  |                     object.material.side = THREE.DoubleSide; | ||||||
|  |                     console.log(object.geometry.vertices.length); | ||||||
|  |                     object.geometry.mergeVertices(); | ||||||
|  |                     object.geometry.computeVertexNormals(); | ||||||
|  |                     if (object.material.name === 'Material.071_574B138E_c.bmp' || | ||||||
|  |                         object.material.name === 'Material.070_41A41EE3_c.bmp') { | ||||||
|  |                         object.material.transparent = true; | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     loader.load( | ||||||
|  |         static_path + 'data/star/GrandStar.obj', | ||||||
|  |         static_path + 'data/star/GrandStar.mtl', | ||||||
|  |         function ( object ) { | ||||||
|  |             object.position.z -= 10.9; | ||||||
|  |             object.position.y += 0.555; | ||||||
|  |             object.position.x += 3.23; | ||||||
|  | 
 | ||||||
|  |             var theta = 0.27; | ||||||
|  |             object.rotation.y = Math.PI - theta; | ||||||
|  | 
 | ||||||
|  |             object.up = new THREE.Vector3(0,0,1); | ||||||
|  |             scene.add(object); | ||||||
|  |             collidableObjects.push(object); | ||||||
|  |             object.traverse(function (object) { | ||||||
|  |                 if (object instanceof THREE.Mesh) { | ||||||
|  |                     object.scale.set(0.005,0.005,0.005); | ||||||
|  |                     object.position.x = 13; | ||||||
|  |                     object.position.z = -35; | ||||||
|  |                     object.position.y = 30; | ||||||
|  | 
 | ||||||
|  |                     object.rotation.z = Math.PI/2; | ||||||
|  |                     object.rotation.x = Math.PI/2; | ||||||
|  |                     object.rotation.y = Math.PI; | ||||||
|  |                     object.material.side = THREE.DoubleSide; | ||||||
|  |                     object.geometry.mergeVertices(); | ||||||
|  |                     object.geometry.computeVertexNormals(); | ||||||
|  |                     object.raycastable = true; | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |    ); | ||||||
|  | } | ||||||
							
								
								
									
										253
									
								
								static/js/prototype/main.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								static/js/prototype/main.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,253 @@ | |||||||
|  | var mesh_number = 25; | ||||||
|  | var renderer, scene, controls, cube, container, plane, mouse= {x:0, y:0}; | ||||||
|  | var bigmesh; | ||||||
|  | var raycaster; | ||||||
|  | var objects = []; | ||||||
|  | var cameras, cameraSelecter; | ||||||
|  | var spheres = new Array(mesh_number); | ||||||
|  | var visible = 0; | ||||||
|  | var stats; | ||||||
|  | var previewer; | ||||||
|  | 
 | ||||||
|  | var loader; | ||||||
|  | 
 | ||||||
|  | var main_section = document.getElementById('main-section'); | ||||||
|  | var offset = function() { | ||||||
|  |     return | ||||||
|  |         document.getElementById('nav').offsetHeight | ||||||
|  |         + document.getElementById('main-div').offsetHeight; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | console.log(document.getElementById('main-div').offsetHeight); | ||||||
|  | var container_size = { | ||||||
|  |     width: function() { return main_section.clientWidth; }, | ||||||
|  |     height: function() { | ||||||
|  |         return main_section.clientHeight | ||||||
|  |             - document.getElementById('nav').offsetHeight | ||||||
|  |             - document.getElementById('main-div').offsetHeight; | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | console.log(container_size.width(), container_size.height()); | ||||||
|  | 
 | ||||||
|  | init(); | ||||||
|  | animate(); | ||||||
|  | 
 | ||||||
|  | function init() { | ||||||
|  |     // Collidable objects to prevent camera from traversing objects
 | ||||||
|  |     var collidableObjects = new Array(); | ||||||
|  | 
 | ||||||
|  |     // Initialize renderer
 | ||||||
|  |     container = document.getElementById('container'); | ||||||
|  |     container.style.height = container_size.height() + 'px'; | ||||||
|  |     container.style.width = container_size.width() + 'px'; | ||||||
|  |     renderer = new THREE.WebGLRenderer({alpha:true, antialias:true}); | ||||||
|  |     renderer.setSize(container_size.width(), container_size.height()); | ||||||
|  |     // renderer.setSize(container_size.width(), container_size.height());
 | ||||||
|  |     renderer.shadowMapEnabled = true; | ||||||
|  |     renderer.setClearColor(0x87ceeb); | ||||||
|  | 
 | ||||||
|  |     // Initialize previewer
 | ||||||
|  |     previewer = new Previewer(renderer); | ||||||
|  |     previewer.domElement.style.position ="absolute"; | ||||||
|  |     previewer.domElement.style.cssFloat = 'top-left'; | ||||||
|  |     previewer.domElement.width = container_size.width(); | ||||||
|  |     previewer.domElement.height = container_size.height(); | ||||||
|  | 
 | ||||||
|  |     // Initialize scene
 | ||||||
|  |     scene = new THREE.Scene(); | ||||||
|  | 
 | ||||||
|  |     // Initialize stats counter
 | ||||||
|  |     stats = new Stats(); | ||||||
|  |     stats.setMode(0); | ||||||
|  |     stats.domElement.style.position = 'absolute'; | ||||||
|  |     stats.domElement.style.cssFloat = "top-left"; | ||||||
|  | 
 | ||||||
|  |     // Add elements to page
 | ||||||
|  |     container.appendChild( stats.domElement ); | ||||||
|  |     container.appendChild(previewer.domElement); | ||||||
|  |     container.appendChild(renderer.domElement); | ||||||
|  | 
 | ||||||
|  |     // init light
 | ||||||
|  |     var directional_light = new THREE.DirectionalLight(0xdddddd); | ||||||
|  |     directional_light.position.set(1, 2.5, 1).normalize(); | ||||||
|  |     directional_light.castShadow = false; | ||||||
|  |     scene.add(directional_light); | ||||||
|  | 
 | ||||||
|  |     var ambient_light = new THREE.AmbientLight(0x444444); | ||||||
|  |     scene.add(ambient_light); | ||||||
|  | 
 | ||||||
|  |     // Initialize pointer camera
 | ||||||
|  |     var camera1 = new PointerCamera(50, container_size.width() / container_size.height(), 0.01, 100000, container); | ||||||
|  |     camera1.speed = 0.001; | ||||||
|  |     camera1.reset(); | ||||||
|  |     camera1.save(); | ||||||
|  |     scene.add(camera1); | ||||||
|  | 
 | ||||||
|  |     // Collisions
 | ||||||
|  |     camera1.collidableObjects = collidableObjects; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     // Initialize recommendations
 | ||||||
|  |     var otherCams = createPeachCameras(container_size.width(), container_size.height()); | ||||||
|  |     cameras = new CameraContainer(camera1, otherCams); | ||||||
|  |     otherCams.forEach(function(cam) { cam.addToScene(scene); }); | ||||||
|  | 
 | ||||||
|  |     // Initalize loader
 | ||||||
|  |     var loader = new THREE.OBJMTLLoader(); | ||||||
|  | 
 | ||||||
|  |     // Load scene
 | ||||||
|  |     initPeachCastle(scene, collidableObjects, loader, static_path); | ||||||
|  | 
 | ||||||
|  |     // Add listeners
 | ||||||
|  |     initListeners(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function initListeners() { | ||||||
|  |     window.addEventListener('resize', onWindowResize, false); | ||||||
|  | 
 | ||||||
|  |     // Transmit click event to camera selecter
 | ||||||
|  |     container.addEventListener('mousedown', function(event) { | ||||||
|  |         if (event.which == 1) | ||||||
|  |             cameraSelecter.click(event); | ||||||
|  |         }, false | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     // Update camera selecter when mouse moved
 | ||||||
|  |     container.addEventListener('mousemove', function(event) { | ||||||
|  |             cameraSelecter.update(event); | ||||||
|  |         }, false | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     // Escape key to exit fullscreen mode
 | ||||||
|  |     document.addEventListener('keydown', function(event) { if (event.keyCode == 27) { stopFullscreen();} }, false); | ||||||
|  | 
 | ||||||
|  |     // HTML Bootstrap buttons
 | ||||||
|  |     buttonManager = new ButtonManager(cameras); | ||||||
|  | 
 | ||||||
|  |     // Camera selecter for hover and clicking recommendations
 | ||||||
|  |     cameraSelecter = new CameraSelecter(renderer, cameras, buttonManager); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function fullscreen() { | ||||||
|  | 
 | ||||||
|  |     if (!beenFullscreen) { | ||||||
|  |         beenFullscreen = true; | ||||||
|  |         alert('To quit fullscren mode, type ESC key'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     container.style.position = "absolute"; | ||||||
|  |     container.style.cssFloat = "top-left"; | ||||||
|  |     container.style.top = "0px"; | ||||||
|  |     container.style.bottom = "0px"; | ||||||
|  |     container.style.left = "0px"; | ||||||
|  |     container.style.right = "0px"; | ||||||
|  |     container.style.width=""; | ||||||
|  |     container.style.height=""; | ||||||
|  |     container.style.overflow = "hidden"; | ||||||
|  | 
 | ||||||
|  |     canvas.style.position = "absolute"; | ||||||
|  |     canvas.style.cssFloat = "top-left"; | ||||||
|  |     canvas.style.top = "0px"; | ||||||
|  |     canvas.style.bottom = "0px"; | ||||||
|  |     canvas.style.left = "0px"; | ||||||
|  |     canvas.style.right = "0px"; | ||||||
|  |     canvas.width=window.innerWidth; | ||||||
|  |     canvas.height=window.innerHeight; | ||||||
|  |     canvas.style.overflow = "hidden"; | ||||||
|  | 
 | ||||||
|  |     onWindowResize(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function stopFullscreen() { | ||||||
|  |     container.style.position = ""; | ||||||
|  |     container.style.cssFloat = ""; | ||||||
|  |     container.style.width = container_size.width() + "px"; | ||||||
|  |     container.style.height = container_size.height() + "px"; | ||||||
|  |     container.style.overflow = ""; | ||||||
|  | 
 | ||||||
|  |     // canvas.style.position = "";
 | ||||||
|  |     // canvas.style.cssFloat = "";
 | ||||||
|  |     canvas.style.top = ""; | ||||||
|  |     canvas.style.bottom = ""; | ||||||
|  |     canvas.style.left = ""; | ||||||
|  |     canvas.style.right = ""; | ||||||
|  |     canvas.width = container_size.width(); | ||||||
|  |     canvas.height = container_size.height(); | ||||||
|  |     // canvas.style.overflow = "";
 | ||||||
|  | 
 | ||||||
|  |     onWindowResize(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function render() { | ||||||
|  |     cameraSelecter.update(); | ||||||
|  | 
 | ||||||
|  |     // Update recommendations (set raycastable if shown)
 | ||||||
|  |     var transform = buttonManager.showArrows ? show : hide; | ||||||
|  |     cameras.map(function(camera) { | ||||||
|  |         if (camera instanceof Recommendation) { | ||||||
|  |             transform(camera); | ||||||
|  | 
 | ||||||
|  |             camera.traverse(function(elt) { | ||||||
|  |                 elt.raycastable = buttonManager.showArrows; | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     // Update main camera
 | ||||||
|  |     cameras.updateMainCamera(); | ||||||
|  | 
 | ||||||
|  |     // Update the recommendations
 | ||||||
|  |     cameras.update(cameras.mainCamera()); | ||||||
|  | 
 | ||||||
|  |     // Set current position of camera
 | ||||||
|  |     cameras.look(); | ||||||
|  | 
 | ||||||
|  |     var left = 0, bottom = 0, width = container_size.width(), height = container_size.height(); | ||||||
|  |     renderer.setScissor(left, bottom, width, height); | ||||||
|  |     renderer.enableScissorTest(true); | ||||||
|  |     renderer.setViewport(left, bottom, width, height); | ||||||
|  |     renderer.render(scene, cameras.mainCamera()); | ||||||
|  | 
 | ||||||
|  |     // Remove borders of preview
 | ||||||
|  |     previewer.clear(); | ||||||
|  | 
 | ||||||
|  |     // Hide arrows in recommendation
 | ||||||
|  |     cameras.map(function(camera) { if (camera instanceof Recommendation) hide(camera); }); | ||||||
|  | 
 | ||||||
|  |     // Render preview
 | ||||||
|  |     previewer.render(cameraSelecter.prev, container_size.width(), container_size.height()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function animate() { | ||||||
|  |     // Render each frame
 | ||||||
|  |     requestAnimationFrame(animate); | ||||||
|  | 
 | ||||||
|  |     // stats count the number of frames per second
 | ||||||
|  |     stats.begin(); | ||||||
|  |     render(); | ||||||
|  |     stats.end(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function onWindowResize() { | ||||||
|  | 
 | ||||||
|  |     container.style.width = container_size.width() + "px"; | ||||||
|  |     container.style.height = container_size.height() + "px"; | ||||||
|  | 
 | ||||||
|  |     previewer.domElement.width = container_size.width(); | ||||||
|  |     previewer.domElement.height = container_size.height(); | ||||||
|  | 
 | ||||||
|  |     renderer.setSize(container_size.width(), container_size.height()); | ||||||
|  |     cameras.forEach(function(camera) {camera.aspect = container_size.width() / container_size.height();}); | ||||||
|  |     cameras.forEach(function(camera) {camera.updateProjectionMatrix();}); | ||||||
|  |     render(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function hide(object) { | ||||||
|  |     object.traverse(function(object) {object.visible = false;}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function show(object) { | ||||||
|  |     object.traverse(function(object) {object.visible = true;}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										80
									
								
								static/js/prototype/raycasterTools.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								static/js/prototype/raycasterTools.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | |||||||
|  | var CameraSelecter = function(renderer, cameras, buttonManager) { | ||||||
|  |     this.raycaster = new THREE.Raycaster(); | ||||||
|  |     this.renderer = renderer; | ||||||
|  |     this.mouse = {}; | ||||||
|  |     this.cameras = cameras; | ||||||
|  |     this.prev = {}; | ||||||
|  |     this.buttonManager = buttonManager; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CameraSelecter.prototype.pointedCamera = function() { | ||||||
|  |     var returnCamera; | ||||||
|  | 
 | ||||||
|  |     var x = ( this.mouse.x / renderer.domElement.width ) * 2 - 1; | ||||||
|  |     var y = - (this.mouse.y / renderer.domElement.height) * 2 + 1; | ||||||
|  | 
 | ||||||
|  |     var camera = this.cameras.mainCamera(); | ||||||
|  | 
 | ||||||
|  |     var vector = new THREE.Vector3(x, y, 0.5); | ||||||
|  |     vector.unproject(camera); | ||||||
|  | 
 | ||||||
|  |     this.raycaster.set(camera.position, vector.sub(camera.position).normalize()); | ||||||
|  | 
 | ||||||
|  |     var intersects = this.raycaster.intersectObjects(scene.children, true); | ||||||
|  | 
 | ||||||
|  |     if ( intersects.length > 0 ) { | ||||||
|  |         var minDistance; | ||||||
|  |         var bestIndex; | ||||||
|  | 
 | ||||||
|  |         // Looking for cameras
 | ||||||
|  |         for (i in intersects) { | ||||||
|  |             if (intersects[i].object.raycastable && !(intersects[i].object instanceof THREE.Line)) { | ||||||
|  |                 if ((intersects[i].distance > 0.5 && minDistance === undefined) || (intersects[i].distance < minDistance )) { | ||||||
|  |                     if (!(intersects[i].object instanceof THREE.Mesh && intersects[i].object.material.opacity < 0.1)) { | ||||||
|  |                         minDistance = intersects[i].distance; | ||||||
|  |                         bestIndex = i; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (bestIndex !== undefined) { | ||||||
|  |             // if (this.cameras.getById(intersects[bestIndex].object.parent.id) !== undefined) {
 | ||||||
|  |                 var obj = intersects[bestIndex].object; | ||||||
|  |                 if (Recommendation === FixedCamera) { | ||||||
|  |                     console.log("toto"); | ||||||
|  |                     return this.cameras.getById(intersects[bestIndex].object.parent.id); | ||||||
|  |                 } else { | ||||||
|  |                     return this.cameras.getById(intersects[bestIndex].object.id); | ||||||
|  |                     console.log('tata'); | ||||||
|  |                 } | ||||||
|  |             // }
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CameraSelecter.prototype.update = function(event) { | ||||||
|  |     if (event !== undefined) { | ||||||
|  |         this.mouse.x = event.offsetX == undefined ? event.layerX : event.offsetX; | ||||||
|  |         this.mouse.y = event.offsetY == undefined ? event.layerY : event.offsetY; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     var hovered = this.pointedCamera(event); | ||||||
|  | 
 | ||||||
|  |     if (hovered !== undefined) { | ||||||
|  |         this.prev.x = this.mouse.x; | ||||||
|  |         this.prev.y = this.mouse.y; | ||||||
|  |         this.prev.camera = hovered; | ||||||
|  |         this.prev.go = true; | ||||||
|  |     } else { | ||||||
|  |         this.prev.go = false; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | CameraSelecter.prototype.click = function(event) { | ||||||
|  |     var newCamera = this.pointedCamera(event); | ||||||
|  |     if (newCamera !== undefined) { | ||||||
|  |         this.cameras.mainCamera().moveHermite(newCamera); | ||||||
|  |         buttonManager.updateElements(); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										553
									
								
								static/js/prototype/viewports/main.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										553
									
								
								static/js/prototype/viewports/main.js
									
									
									
									
										vendored
									
									
								
							| @ -1,553 +0,0 @@ | |||||||
| var mesh_number = 25; |  | ||||||
| var renderer, scene, controls, cube, container, plane, mouse= {x:0, y:0}; |  | ||||||
| var bigmesh; |  | ||||||
| var raycaster; |  | ||||||
| var objects = []; |  | ||||||
| var cameras = new CameraContainer(); |  | ||||||
| var spheres = new Array(mesh_number); |  | ||||||
| var visible = 0; |  | ||||||
| var stats; |  | ||||||
| var canvas; |  | ||||||
| var ctx2d; |  | ||||||
| 
 |  | ||||||
| var loader; |  | ||||||
| 
 |  | ||||||
| var main_section = document.getElementById('main-section'); |  | ||||||
| var offset = function() { |  | ||||||
|     return |  | ||||||
|         document.getElementById('nav').offsetHeight |  | ||||||
|         + document.getElementById('main-div').offsetHeight; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| console.log(document.getElementById('main-div').offsetHeight); |  | ||||||
| var container_size = { |  | ||||||
|     width: function() { return main_section.clientWidth; }, |  | ||||||
|     height: function() { |  | ||||||
|         return main_section.clientHeight |  | ||||||
|             - document.getElementById('nav').offsetHeight |  | ||||||
|             - document.getElementById('main-div').offsetHeight; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| console.log(container_size.width(), container_size.height()); |  | ||||||
| 
 |  | ||||||
| var prev = {x:0, y:0, go:false}; |  | ||||||
| var showArrows = true; |  | ||||||
| var beenFullscreen = false; |  | ||||||
| 
 |  | ||||||
| var undoElement = document.getElementById('undo'); |  | ||||||
| var redoElement = document.getElementById('redo'); |  | ||||||
| 
 |  | ||||||
| function updateElements() { |  | ||||||
|     // Update icon
 |  | ||||||
|     if (!cameras.mainCamera().undoable()) { |  | ||||||
|         undoElement.className = "btn btn-default"; |  | ||||||
|     } else { |  | ||||||
|         undoElement.className = "btn btn-primary"; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!cameras.mainCamera().redoable()) { |  | ||||||
|         redoElement.className = "btn btn-default"; |  | ||||||
|     } else { |  | ||||||
|         redoElement.className = "btn btn-primary"; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| init(); |  | ||||||
| animate(); |  | ||||||
| 
 |  | ||||||
| function init() { |  | ||||||
|     // Collidable objects to prevent camera from traversing objects
 |  | ||||||
|     var collidableObjects = new Array(); |  | ||||||
| 
 |  | ||||||
|     document.getElementById('full').onclick = fullscreen; |  | ||||||
| 
 |  | ||||||
|     // Add the listener on the button
 |  | ||||||
|     document.getElementById('reset').onclick = function() { cameras.mainCamera().reset(); }; |  | ||||||
|     var fullarrow = document.getElementById('fullarrow'); |  | ||||||
|     fullarrow.onchange = function() { |  | ||||||
|         cameras.map(function(camera) { |  | ||||||
|             if (camera instanceof OldFixedCamera) { |  | ||||||
|                 camera.fullArrow = fullarrow.checked; |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var collisions = document.getElementById('collisions'); |  | ||||||
|     collisions.onchange = function() { |  | ||||||
|         cameras.mainCamera().collisions = collisions.checked; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var showarrows = document.getElementById('showarrows'); |  | ||||||
|     showarrows.onchange = function() { |  | ||||||
|         showArrows = showarrows.checked; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     undoElement.onclick = function() { |  | ||||||
|         cameras.mainCamera().undo(); |  | ||||||
|         updateElements(); |  | ||||||
| 
 |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     redoElement.onclick = function() { |  | ||||||
|         cameras.mainCamera().redo(); |  | ||||||
|         updateElements(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // on initialise le moteur de rendu
 |  | ||||||
|     container = document.getElementById('container'); |  | ||||||
|     container.style.height = container_size.height() + 'px'; |  | ||||||
|     container.style.width = container_size.width() + 'px'; |  | ||||||
|     renderer = new THREE.WebGLRenderer({alpha:true, antialias:true}); |  | ||||||
|     renderer.setSize(container_size.width(), container_size.height()); |  | ||||||
|     // renderer.setSize(container_size.width(), container_size.height());
 |  | ||||||
|     renderer.shadowMapEnabled = true; |  | ||||||
|     renderer.setClearColor(0x87ceeb); |  | ||||||
| 
 |  | ||||||
|     canvas = document.createElement('canvas'); |  | ||||||
|     canvas.style.position ="absolute"; |  | ||||||
|     canvas.style.cssFloat = 'top-left'; |  | ||||||
|     canvas.width = container_size.width(); |  | ||||||
|     canvas.height = container_size.height(); |  | ||||||
|     ctx2d = canvas.getContext('2d'); |  | ||||||
|     ctx2d.lineWidth = 1; |  | ||||||
| 
 |  | ||||||
|     // on initialise la scène
 |  | ||||||
|     scene = new THREE.Scene(); |  | ||||||
|     raycaster = new THREE.Raycaster(); |  | ||||||
| 
 |  | ||||||
|     // Create stats counter
 |  | ||||||
|     stats = new Stats(); |  | ||||||
|     stats.setMode(0); |  | ||||||
| 
 |  | ||||||
|     stats.domElement.style.position = 'absolute'; |  | ||||||
|     stats.domElement.style.cssFloat = "top-left"; |  | ||||||
|     container.appendChild( stats.domElement ); |  | ||||||
|     container.appendChild(canvas); |  | ||||||
|     container.appendChild(renderer.domElement); |  | ||||||
| 
 |  | ||||||
|     // init light
 |  | ||||||
|     var directional_light = new THREE.DirectionalLight(0xdddddd); |  | ||||||
|     directional_light.position.set(1, 2.5, 1).normalize(); |  | ||||||
|     directional_light.castShadow = false; |  | ||||||
|     scene.add(directional_light); |  | ||||||
| 
 |  | ||||||
|     var ambient_light = new THREE.AmbientLight(0x444444); |  | ||||||
|     scene.add(ambient_light); |  | ||||||
| 
 |  | ||||||
|     // on initialise la camera que l’on place ensuite sur la scène
 |  | ||||||
|     var camera1 = new PointerCamera(50, container_size.width() / container_size.height(), 0.01, 100000, container); |  | ||||||
|     camera1.speed = 0.001; |  | ||||||
|     camera1.reset(); |  | ||||||
|     camera1.save(); |  | ||||||
|     scene.add(camera1); |  | ||||||
|     cameras.push(camera1); |  | ||||||
| 
 |  | ||||||
|     var loader = new THREE.OBJMTLLoader(); |  | ||||||
| 
 |  | ||||||
|     var onProgress = function ( xhr ) { |  | ||||||
|         if ( xhr.lengthComputable ) { |  | ||||||
|             var percentComplete = xhr.loaded / xhr.total * 100; |  | ||||||
|             console.log( Math.round(percentComplete, 2) + '% downloaded' ); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     var onError = function ( xhr ) { |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     // THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );
 |  | ||||||
|     var loader = new THREE.OBJMTLLoader(); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     loader.load( static_path + 'data/castle/princess peaches castle (outside).obj', |  | ||||||
|                  static_path + 'data/castle/princess peaches castle (outside).mtl', |  | ||||||
|     function ( object ) { |  | ||||||
|         object.up = new THREE.Vector3(0,0,1); |  | ||||||
|         scene.add(object); |  | ||||||
|         collidableObjects.push(object); |  | ||||||
|         object.traverse(function (object) { |  | ||||||
|             if (object instanceof THREE.Mesh) { |  | ||||||
|                 object.geometry.mergeVertices(); |  | ||||||
|                 object.geometry.computeVertexNormals(); |  | ||||||
|                 object.material.side = THREE.DoubleSide; |  | ||||||
|                 object.raycastable = true; |  | ||||||
|                 if (object.material.name === 'Material.103_princess_peaches_cast') { |  | ||||||
|                     object.material.transparent = true; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     }, onProgress, onError ); |  | ||||||
| 
 |  | ||||||
|     loader.load( static_path + 'data/first/Floor 1.obj', |  | ||||||
|                  static_path + 'data/first/Floor 1.mtl', |  | ||||||
|     function ( object ) { |  | ||||||
|         object.position.z -= 10.9; |  | ||||||
|         object.position.y += 0.555; |  | ||||||
|         object.position.x += 3.23; |  | ||||||
| 
 |  | ||||||
|         var theta = 0.27; |  | ||||||
|         object.rotation.y = Math.PI - theta; |  | ||||||
| 
 |  | ||||||
|         object.up = new THREE.Vector3(0,0,1); |  | ||||||
|         scene.add(object); |  | ||||||
|         collidableObjects.push(object); |  | ||||||
|         object.traverse(function (object) { |  | ||||||
|             if (object instanceof THREE.Mesh) { |  | ||||||
|                 object.material.side = THREE.DoubleSide; |  | ||||||
|                 // object.geometry.mergeVertices();
 |  | ||||||
|                 // object.geometry.computeVertexNormals();
 |  | ||||||
|                 object.raycastable = true; |  | ||||||
|                 if (object.material.name === 'Material.054_777F0E0B_c.bmp' || |  | ||||||
|                     object.material.name === 'Material.061_5C3492AB_c.bmp'   ) { |  | ||||||
|                     object.material.transparent = true; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     }, onProgress, onError ); |  | ||||||
| 
 |  | ||||||
|     // loader.load( static_path + 'data/bobomb/bobomb battlefeild.obj',
 |  | ||||||
|     //              static_path + 'data/bobomb/bobomb battlefeild.mtl',
 |  | ||||||
|     //         function ( object ) {
 |  | ||||||
|     //             // object.position.z -= 10.9;
 |  | ||||||
|     //             // object.position.y += 0.555;
 |  | ||||||
|     //             // object.position.x += 3.23;
 |  | ||||||
| 
 |  | ||||||
|     //             var theta = 0.27;
 |  | ||||||
|     //             object.rotation.y = Math.PI - theta;
 |  | ||||||
| 
 |  | ||||||
|     //             object.up = new THREE.Vector3(0,0,1);
 |  | ||||||
|     //             collidableObjects.push(object);
 |  | ||||||
|     //             scene.add(object);
 |  | ||||||
|     //             object.traverse(function (object) {
 |  | ||||||
|     //                 if (object instanceof THREE.Mesh) {
 |  | ||||||
|     //                     object.material.side = THREE.DoubleSide;
 |  | ||||||
|     //                     console.log(object.geometry.vertices.length);
 |  | ||||||
|     //                     object.geometry.mergeVertices();
 |  | ||||||
|     //                     object.geometry.computeVertexNormals();
 |  | ||||||
|     //                     if (object.material.name === 'Material.071_574B138E_c.bmp' ||
 |  | ||||||
|     //                         object.material.name === 'Material.070_41A41EE3_c.bmp') {
 |  | ||||||
|     //                         object.material.transparent = true;
 |  | ||||||
|     //                     }
 |  | ||||||
| 
 |  | ||||||
|     //                 }
 |  | ||||||
|     //             });
 |  | ||||||
|     //         }, onProgress, onError );
 |  | ||||||
| 
 |  | ||||||
|     // loader.load( static_path + 'data/star/GrandStar.obj',
 |  | ||||||
|     //              static_path + 'data/star/GrandStar.mtl',
 |  | ||||||
|     // function ( object ) {
 |  | ||||||
|     //     object.position.z -= 10.9;
 |  | ||||||
|     //     object.position.y += 0.555;
 |  | ||||||
|     //     object.position.x += 3.23;
 |  | ||||||
| 
 |  | ||||||
|     //     var theta = 0.27;
 |  | ||||||
|     //     object.rotation.y = Math.PI - theta;
 |  | ||||||
| 
 |  | ||||||
|     //     object.up = new THREE.Vector3(0,0,1);
 |  | ||||||
|     //     scene.add(object);
 |  | ||||||
|     //     collidableObjects.push(object);
 |  | ||||||
|     //     object.traverse(function (object) {
 |  | ||||||
|     //         if (object instanceof THREE.Mesh) {
 |  | ||||||
|     //             object.scale.set(0.005,0.005,0.005);
 |  | ||||||
|     //             object.position.x = 13;
 |  | ||||||
|     //             object.position.z = -35;
 |  | ||||||
|     //             object.position.y = 30;
 |  | ||||||
| 
 |  | ||||||
|     //             object.rotation.z = Math.PI/2;
 |  | ||||||
|     //             object.rotation.x = Math.PI/2;
 |  | ||||||
|     //             object.rotation.y = Math.PI;
 |  | ||||||
|     //             object.material.side = THREE.DoubleSide;
 |  | ||||||
|     //             object.geometry.mergeVertices();
 |  | ||||||
|     //             object.geometry.computeVertexNormals();
 |  | ||||||
|     //             object.raycastable = true;
 |  | ||||||
|     //         }
 |  | ||||||
|     //     });
 |  | ||||||
|     // }, onProgress, onError );
 |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(-3.349895207953063, 5.148106346852601, 0.3365943929701533), |  | ||||||
|             new THREE.Vector3(13.114421714865292, -7.783476327687569, -33.74713248359852) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(4.659399030971226, 1.018674883050052597, -2.578139604982815), |  | ||||||
|             new THREE.Vector3(-16.08800293200113, -28.8795632312717, -19.165379404919797) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(2.625389073616235, 1.2252620948239699, -4.818718135555419), |  | ||||||
|             new THREE.Vector3(-19.756833131355208, -16.20027570329664, -33.02132017177813) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(1.3304975149911331, 0.4836093721106701, -8.60618907952783), |  | ||||||
|             new THREE.Vector3(-1.7713635815431914, 6.271997833695163, -48.06341930106774) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(1.2976081760482443, 1.1520399813234647, -10.258148122402845), |  | ||||||
|             new THREE.Vector3(-26.00651734173549, -9.19681009597505, -37.596510029925945) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     createCamera( |  | ||||||
|             new THREE.Vector3(0.15727187830660858, 2.7251137440572855, -5.84333603646124), |  | ||||||
|             new THREE.Vector3(19.33738702531091, -13.614383891308975, -36.91010284556961) |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     window.addEventListener('resize', onWindowResize, false); |  | ||||||
| 
 |  | ||||||
|     container.addEventListener('mousedown', function(event) { if (event.which == 1) click(event); }, false); |  | ||||||
|     container.addEventListener('mousemove', updateMouse, false); |  | ||||||
|     document.addEventListener('keydown', function(event) { if (event.keyCode == 27) { stopFullscreen();} }, false); |  | ||||||
| 
 |  | ||||||
|     camera1.collidableObjects = collidableObjects; |  | ||||||
| 
 |  | ||||||
|     // Load the scene
 |  | ||||||
|     loadScene(); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function fullscreen() { |  | ||||||
| 
 |  | ||||||
|     if (!beenFullscreen) { |  | ||||||
|         beenFullscreen = true; |  | ||||||
|         alert('To quit fullscren mode, type ESC key'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     container.style.position = "absolute"; |  | ||||||
|     container.style.cssFloat = "top-left"; |  | ||||||
|     container.style.top = "0px"; |  | ||||||
|     container.style.bottom = "0px"; |  | ||||||
|     container.style.left = "0px"; |  | ||||||
|     container.style.right = "0px"; |  | ||||||
|     container.style.width=""; |  | ||||||
|     container.style.height=""; |  | ||||||
|     container.style.overflow = "hidden"; |  | ||||||
| 
 |  | ||||||
|     canvas.style.position = "absolute"; |  | ||||||
|     canvas.style.cssFloat = "top-left"; |  | ||||||
|     canvas.style.top = "0px"; |  | ||||||
|     canvas.style.bottom = "0px"; |  | ||||||
|     canvas.style.left = "0px"; |  | ||||||
|     canvas.style.right = "0px"; |  | ||||||
|     canvas.width=window.innerWidth; |  | ||||||
|     canvas.height=window.innerHeight; |  | ||||||
|     canvas.style.overflow = "hidden"; |  | ||||||
| 
 |  | ||||||
|     onWindowResize(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function stopFullscreen() { |  | ||||||
|     container.style.position = ""; |  | ||||||
|     container.style.cssFloat = ""; |  | ||||||
|     container.style.width = container_size.width() + "px"; |  | ||||||
|     container.style.height = container_size.height() + "px"; |  | ||||||
|     container.style.overflow = ""; |  | ||||||
| 
 |  | ||||||
|     // canvas.style.position = "";
 |  | ||||||
|     // canvas.style.cssFloat = "";
 |  | ||||||
|     canvas.style.top = ""; |  | ||||||
|     canvas.style.bottom = ""; |  | ||||||
|     canvas.style.left = ""; |  | ||||||
|     canvas.style.right = ""; |  | ||||||
|     canvas.width = container_size.width(); |  | ||||||
|     canvas.height = container_size.height(); |  | ||||||
|     // canvas.style.overflow = "";
 |  | ||||||
| 
 |  | ||||||
|     onWindowResize(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function log() { |  | ||||||
|     console.log(container.style.width); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function createCamera(position, target) { |  | ||||||
|     var camera = new OldFixedCamera( |  | ||||||
|             50, |  | ||||||
|             container_size.width() / container_size.height(), |  | ||||||
|             1, |  | ||||||
|             100000, |  | ||||||
|             position, |  | ||||||
|             target |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     camera.addToScene(scene); |  | ||||||
|     cameras.push(camera); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function loadScene() { |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function render() { |  | ||||||
|     updateMouse(); |  | ||||||
| 
 |  | ||||||
|     var transform = showArrows ? show : hide; |  | ||||||
|     cameras.map(function(camera) { |  | ||||||
|         if (camera instanceof OldFixedCamera) { |  | ||||||
|             transform(camera); |  | ||||||
| 
 |  | ||||||
|             camera.traverse(function(elt) { |  | ||||||
|                 elt.raycastable = showArrows; |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     cameras.updateMainCamera(); |  | ||||||
|     cameras.update(cameras.mainCamera()); |  | ||||||
|     cameras.look(); |  | ||||||
| 
 |  | ||||||
|     var left = 0, bottom = 0, width = container_size.width(), height = container_size.height(); |  | ||||||
|     renderer.setScissor(left, bottom, width, height); |  | ||||||
|     renderer.enableScissorTest(true); |  | ||||||
|     renderer.setViewport(left, bottom, width, height); |  | ||||||
|     renderer.render(scene, cameras.mainCamera()); |  | ||||||
| 
 |  | ||||||
|     // Clear canvas
 |  | ||||||
|     canvas.width = canvas.width; |  | ||||||
| 
 |  | ||||||
|     width = container_size.width() / 5; |  | ||||||
|     height = container_size.height() / 5; |  | ||||||
|     left = prev.x - width/2; |  | ||||||
|     bottom =  renderer.domElement.height - prev.y + height/5; |  | ||||||
| 
 |  | ||||||
|     if (prev.go) { |  | ||||||
|         // Hide arrows
 |  | ||||||
|         cameras.map(function(camera) { if (camera instanceof OldFixedCamera) hide(camera); }); |  | ||||||
| 
 |  | ||||||
|         width  = Math.floor(container_size.width() / 5); |  | ||||||
|         height = Math.floor(container_size.height() / 5); |  | ||||||
|         left   = Math.floor(prev.x - width/2); |  | ||||||
|         bottom = Math.floor(renderer.domElement.height - prev.y + height/5); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         // Draw border
 |  | ||||||
|         var can_bottom = container_size.height() - bottom - height ; |  | ||||||
|         ctx2d.strokeStyle = "#ffffff"; |  | ||||||
|         ctx2d.beginPath(); |  | ||||||
|         ctx2d.moveTo(left-1, can_bottom); |  | ||||||
|         ctx2d.lineTo(left-1, can_bottom + height); |  | ||||||
|         ctx2d.lineTo(left + width-1, can_bottom + height); |  | ||||||
|         ctx2d.lineTo(left + width-1, can_bottom); |  | ||||||
|         ctx2d.closePath(); |  | ||||||
|         ctx2d.stroke(); |  | ||||||
| 
 |  | ||||||
|         ctx2d.strokeStyle = "#000000"; |  | ||||||
|         ctx2d.beginPath(); |  | ||||||
|         ctx2d.moveTo(left, can_bottom + 1); |  | ||||||
|         ctx2d.lineTo(left, can_bottom + height - 1); |  | ||||||
|         ctx2d.lineTo(left + width - 2 , can_bottom + height-1); |  | ||||||
|         ctx2d.lineTo(left + width - 2, can_bottom+1); |  | ||||||
|         ctx2d.closePath(); |  | ||||||
|         ctx2d.stroke(); |  | ||||||
| 
 |  | ||||||
|         // Do render in previsualization
 |  | ||||||
|         prev.camera.look(); |  | ||||||
|         renderer.setScissor(left, bottom, width, height); |  | ||||||
|         renderer.enableScissorTest (true); |  | ||||||
|         renderer.setViewport(left, bottom, width, height); |  | ||||||
|         renderer.render(scene, prev.camera); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function animate() { |  | ||||||
|     // on appelle la fonction animate() récursivement à chaque frame
 |  | ||||||
|     requestAnimationFrame(animate); |  | ||||||
| 
 |  | ||||||
|     stats.begin(); |  | ||||||
|     render(); |  | ||||||
|     stats.end(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function onWindowResize() { |  | ||||||
| 
 |  | ||||||
|     container.style.width = container_size.width() + "px"; |  | ||||||
|     container.style.height = container_size.height() + "px"; |  | ||||||
| 
 |  | ||||||
|     canvas.width = container_size.width(); |  | ||||||
|     canvas.height = container_size.height(); |  | ||||||
| 
 |  | ||||||
|     renderer.setSize(container_size.width(), container_size.height()); |  | ||||||
|     cameras.forEach(function(camera) {camera.aspect = container_size.width() / container_size.height();}); |  | ||||||
|     cameras.forEach(function(camera) {camera.updateProjectionMatrix();}); |  | ||||||
|     render(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function hide(object) { |  | ||||||
|     object.traverse(function(object) {object.visible = false;}); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function show(object) { |  | ||||||
|     object.traverse(function(object) {object.visible = true;}); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function updateMouse(event) { |  | ||||||
| 
 |  | ||||||
|     if (event !== undefined) { |  | ||||||
|         mouse.x = event.offsetX == undefined ? event.layerX : event.offsetX; |  | ||||||
|         mouse.y = event.offsetY == undefined ? event.layerY : event.offsetY; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var hovered = pointedCamera(event); |  | ||||||
| 
 |  | ||||||
|     if (hovered !== undefined) { |  | ||||||
|         prev.x = mouse.x; |  | ||||||
|         prev.y = mouse.y; |  | ||||||
|         prev.camera = hovered; |  | ||||||
|         prev.go = true; |  | ||||||
|     } else { |  | ||||||
|         prev.go = false; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function click(event) { |  | ||||||
|     var newCamera = pointedCamera(event); |  | ||||||
|     if (newCamera !== undefined) { |  | ||||||
|         cameras.mainCamera().move(newCamera); |  | ||||||
|         updateElements(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function pointedCamera(event) { |  | ||||||
|     var returnCamera; |  | ||||||
| 
 |  | ||||||
|     var x = ( mouse.x / renderer.domElement.width ) * 2 - 1; |  | ||||||
|     var y = - (mouse.y / renderer.domElement.height) * 2 + 1; |  | ||||||
| 
 |  | ||||||
|     var camera = cameras.mainCamera(); |  | ||||||
| 
 |  | ||||||
|     var vector = new THREE.Vector3(x, y, 0.5); |  | ||||||
|     vector.unproject(camera); |  | ||||||
| 
 |  | ||||||
|     raycaster.set(camera.position, vector.sub(camera.position).normalize()); |  | ||||||
| 
 |  | ||||||
|     var intersects = raycaster.intersectObjects(scene.children, true); |  | ||||||
| 
 |  | ||||||
|     if ( intersects.length > 0 ) { |  | ||||||
|         var minDistance; |  | ||||||
|         var bestIndex; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         // Looking for cameras
 |  | ||||||
|         for (i in intersects) { |  | ||||||
|             if (! (intersects[i].object instanceof THREE.Line)) { |  | ||||||
|             // if (intersects[i].object.raycastable) {
 |  | ||||||
|                 if ((intersects[i].distance > 0.5 && minDistance === undefined) || (intersects[i].distance < minDistance )) { |  | ||||||
|                     if (!(intersects[i].object instanceof THREE.Mesh && intersects[i].object.material.opacity < 0.1)) { |  | ||||||
|                         minDistance = intersects[i].distance; |  | ||||||
|                         bestIndex = i; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             // }
 |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (bestIndex !== undefined) { |  | ||||||
|             if (cameras.getById(intersects[bestIndex].object.id) !== undefined) { |  | ||||||
|                 return cameras.getById(intersects[bestIndex].object.id); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -8,7 +8,7 @@ block js | |||||||
|     script(src="/static/js/three/MTLLoader.js") |     script(src="/static/js/three/MTLLoader.js") | ||||||
|     script(src="/static/js/three/OBJLoader.js") |     script(src="/static/js/three/OBJLoader.js") | ||||||
|     script(src="/static/js/three/OBJMTLLoader.js") |     script(src="/static/js/three/OBJMTLLoader.js") | ||||||
|     script(src="/static/js/three/OrbitControls.js") |     -//script(src="/static/js/three/OrbitControls.js") | ||||||
|     script(src="/static/js/Cube.js") |     script(src="/static/js/Cube.js") | ||||||
|     script(src="/static/js/ProgressiveSphere.js") |     script(src="/static/js/ProgressiveSphere.js") | ||||||
|     script(src="/static/js/Camera.js") |     script(src="/static/js/Camera.js") | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user