UNPKG

meta-client

Version:
253 lines (176 loc) 5.22 kB
import {log} from '../Utilities'; import {Raycaster, Vector2, Mesh, PlaneGeometry, MeshBasicMaterial} from 'three'; import {OrbitControls} from './lib/OrbitControls'; let RAYCASTER = new Raycaster(); let MOUSE = new Vector2(); let TIMEOUT = false; class Desktop { constructor(WORLD, HUMAN){ let that = this; this.name = 'DesktopDevice'; log(this.name); CONTROLS = new OrbitControls(CAMERA); CAMERA.position.set(0,1,1); this.INTERSECTED = false; this.HELPPLANE = false; addEventListener('mousedown', (event) => { log(HUMAN); //log(HUMAN+'mouseDown'); MOUSE.x = ( event.clientX / window.innerWidth ) * 2 - 1; MOUSE.y = - ( event.clientY / window.innerHeight ) * 2 + 1; // update the picking ray with the camera and mouse position RAYCASTER.setFromCamera( MOUSE, CAMERA ); // calculate objects intersecting the picking ray var intersects = RAYCASTER.intersectObjects( SCENE.children, true ); if(intersects.length>0){ log('Desktop', 'INTERSECTED '+JSON.stringify(intersects[0].object)) this.INTERSECTED = intersects[0]; //TODO TODO TODO TODO //TODO Doesn't work because its not there yet!!! //TODO maybe a DEVICE object between whatever ;) HUMAN.go('touch', this.INTERSECTED); }else{ HUMAN.go('touch'); } }, false); addEventListener('mouseup', (event) => { log(HUMAN); if(TIMEOUT){ clearTimeout(TIMEOUT); TIMEOUT=false; } //was something this.INTERSECTED? if(this.INTERSECTED){ if(CONTROLS) CONTROLS.enabled=true; //was mouseMove triggered? if(this.HELPPLANE){ SCENE.remove(this.HELPPLANE); this.HELPPLANE=false; }else{ //log(this.name, 'HUMAN.go(touch)'+this.INTERSECTED) } HUMAN.go('release', this.INTERSECTED); this.INTERSECTED = false; } }, false); addEventListener('mousemove', that.mouseMove, false); addEventListener('keydown', function(event){ //event.preventDefault(); that.keyDown(event); }); addEventListener('keyup', function(event){ //event.preventDefault(); that.keyUp(event); }); } mouseMove(event){ log(this.name, 'mouseMove') MOUSE.x = ( event.clientX / window.innerWidth ) * 2 - 1; MOUSE.y = - ( event.clientY / window.innerHeight ) * 2 + 1; // update the picking ray with the camera and mouse position RAYCASTER.setFromCamera( MOUSE, CAMERA ); if(this.INTERSECTED){ if(CONTROLS) CONTROLS.enabled=false; log(this.NAME, 'INTERSECTED') if(!this.HELPPLANE){ //create helping plane this.HELPPLANE = new Mesh(new PlaneGeometry(100,100,10,10), new MeshBasicMaterial({color:0x0000ff, wireframe:true, transparent:true, opacity: false})) this.HELPPLANE.position.set(this.INTERSECTED.object.position.x, this.INTERSECTED.object.position.y, this.INTERSECTED.object.position.z); this.HELPPLANE.rotation.set(CAMERA.rotation.x, CAMERA.rotation.y, CAMERA.rotation.z); SCENE.add(this.HELPPLANE); } //send new rays let HELPPLANE_INTERSECTS = RAYCASTER.intersectObject(this.HELPPLANE); //hit if (HELPPLANE_INTERSECTS.length > 0) { //send data let data = { position: HELPPLANE_INTERSECTS[0].point}; log(this.name, 'send data '+JSON.stringify(data)); //send grab event HUMAN.go('grab', this.INTERSECTED.object, data); } } } keyDown(event){ event.preventDefault(); switch(event.keyCode){ //arrows case 37: HUMAN.go('panleft', event); break; case 38: HUMAN.go('panup', event); log('panup') break; case 39: HUMAN.go('panright', event); break; case 40: HUMAN.go('pandown', event); log('pandown') break; // case 27: HUMAN.go('escape', event); break; case 16: HUMAN.go('shift', event); break; case 17: HUMAN.go('control', event); break; case 65: HUMAN.go('a', event); break; } } keyUp(event){ event.preventDefault(); switch(event.keyCode){ case 13: HUMAN.go('enter', event); log('enter') break; //arrows case 37: HUMAN.go('swipeleft', event); break; case 38: HUMAN.go('swipeup', event); log('swipeup') break; case 39: HUMAN.go('swiperight', event); break; case 40: HUMAN.go('swipedown', event); log('swipedown') break; //letters case 67: HUMAN.go('c', event); break; case 16: HUMAN.go('shift', event); break; case 17: HUMAN.go('control', event); break; case 49: HUMAN.go('1', event); break; case 50: HUMAN.go('2', event); break; case 51: HUMAN.go('3', event); break; case 65: HUMAN.go('a', event); break; } } } export default Desktop;