meta-client
Version:
redefining space
253 lines (176 loc) • 5.22 kB
JavaScript
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;