meta-client
Version:
redefining space
359 lines (218 loc) • 7.98 kB
JavaScript
import {Vector3,
Matrix4,
CubeGeometry,
MeshBasicMaterial,
SphereGeometry,
Mesh,
Raycaster,
Sphere,
Box3} from 'three';
import {log} from '../Utilities';
import {VREffect} from './lib/VREffect';
import {VRControls} from './lib/VRControls';
import {ViveController} from './lib/ViveController';
import {Matter} from '../World';
class Reality {
constructor(WORLD, HUMAN){
let that = this;
this.name = 'VirtualRealityDevice';
log(this.name);
this.raycaster = new Raycaster();
//TODO WORLD.CONTROLS = or so...
CONTROLS = new VRControls( CAMERA );
//TODO WORLD.EFFECT = or so...
global.EFFECT = new VREffect( renderer );
EFFECT.setSize( window.innerWidth, window.innerHeight );
addEventListener('dblclick', () => {
log(that.name, `fullscreen`)
EFFECT.requestPresent();
})
function onTriggerDown0(){
console.log('onTriggerDown0')
//HUMAN.go('swipedown');
}
function onTriggerUp0(){
return;
var data = {}
data.position = new Vector3().setFromMatrixPosition(that.controller1.matrixWorld);
HUMAN.go('touch', data);
}
function onThumbpadDown0(){
console.log('onThumbpadDown0')
//HUMAN.go('touch');
}
function onThumbpadUp0(){
HUMAN.go('release');
console.log('onThumbpadUp0')
/*
let mesh = new Mesh(new CubeGeometry(.1,.1,.1), new MeshBasicMaterial({color:0x0000ff}));
mesh.position.setFromMatrixPosition(that.controller1.matrixWorld);
WORLD.add(mesh);
console.log(data.position)
console.log(mesh.position)
*/
}
function onMenuDown0(){
console.log('onMenuDown0')
}
function onMenuUp0(){
console.log('onMenuUp0')
HUMAN.go('escape');
}
function onGripsDown0(){
console.log('onGripsDown0')
}
function onGripsUp0(){
console.log('onGripsUp0')
//HUMAN.go('esc');
}
//
function onTriggerDown1(){
console.log('onTriggerDown1')
//HUMAN.go('swipeleft');
}
function onTriggerUp1(){
console.log('onTriggerUp1')
//HUMAN.go('swiperight');
}
function onThumbpadDown1(){
console.log('onThumbpadDown1')
}
function onThumbpadUp1(){
console.log('onThumbpadUp1')
//HUMAN.go('release');
}
function onMenuDown1(){
console.log('onMenuDown1')
}
function onMenuUp1(){
console.log('onMenuUp1');
HUMAN.go('escape');
}
function onGripsDown1(){
console.log('onGripsDown1')
}
function onGripsUp1(){
console.log('onGripsUp1')
//HUMAN.go('esc');
}
var tempMatrix = new Matrix4();
function getIntersections( controller, v ) {
tempMatrix.identity().extractRotation( controller.matrixWorld );
that.raycaster.ray.origin.setFromMatrixPosition( controller.matrixWorld );
that.raycaster.ray.direction.set( v.x, v.y, v.z ).applyMatrix4( tempMatrix );
return that.raycaster.intersectObjects( WORLD.children );
}
let oldIntersection = false;
function intersectObjects( controller, v) {
var intersections = getIntersections( controller, v );
//console.log(intersections.length);
if ( intersections.length > 0 ) {
var intersection = intersections[ 0 ];
//are we close?
if(intersection.distance>=.01) return;
//not the old one?
if(oldIntersection != intersection) {
HUMAN.go('touch', oldIntersection);
oldIntersection = intersection;
}
}else{
if(oldIntersection)
oldIntersection=false;
}
}
/*HALLELUJA
let oldIntersection = false;
let direction = false;
function intersectObjects( controller, v) {
var intersections = getIntersections( controller, v );
//console.log(intersections.length);
if ( intersections.length > 0 ) {
var intersection = intersections[ 0 ];
if(oldIntersection == intersection) {
if(intersection.distance<=oldIntersection.distance){
direction=true;
}else{
direction=false;
}
}else{
oldIntersection = intersection;
}
}else{
if(direction)
HUMAN.go('touch', oldIntersection)
direction=false;
}
}
*/
//Vive controlers
this.controller1 = new ViveController( 0 );
this.controller1.standingMatrix = CONTROLS.getStandingMatrix();
this.controller1.addEventListener( 'triggerdown', onTriggerDown0 );
this.controller1.addEventListener( 'triggerup', () => {
console.log('onTriggerUp0')
//that.controllerObject1.position.setFromMatrixPosition(that.controller1.matrixWorld);
});
this.controller1.addEventListener( 'thumbpaddown', onThumbpadDown0 );
this.controller1.addEventListener( 'thumbpadup', onThumbpadUp0 );
this.controller1.addEventListener( 'menudown', onMenuDown0 );
this.controller1.addEventListener( 'menuup', onMenuUp0 );
this.controller1.addEventListener( 'gripsdown', onGripsDown0 );
this.controller1.addEventListener( 'gripsup', onGripsUp0 );
WORLD.add(that.controller1);
this.controllerObject1 = new Mesh(new SphereGeometry(.01,16,16), new MeshBasicMaterial({color:0xff0000}));
this.controller1.add(that.controllerObject1);
this.controllerObject1Sphere = new Sphere(that.controllerObject1.position, that.controllerObject1.geometry.radius);
this.controller2 = new ViveController( 1 );
this.controller2.standingMatrix = CONTROLS.getStandingMatrix();
this.controller2.addEventListener( 'triggerdown', onTriggerDown1 );
this.controller2.addEventListener( 'triggerup', onTriggerUp1 );
this.controller2.addEventListener( 'thumbpaddown', onThumbpadDown1 );
this.controller2.addEventListener( 'thumbpadup', onThumbpadUp1 );
this.controller2.addEventListener( 'menudown', onMenuDown1 );
this.controller2.addEventListener( 'menuup', onMenuUp1 );
this.controller2.addEventListener( 'gripsdown', onGripsDown1 );
this.controller2.addEventListener( 'gripsup', onGripsUp1 );
WORLD.add(that.controller2);
this.controllerObject2 = new Mesh(new SphereGeometry(.01,16,16), new MeshBasicMaterial({color:0x0000ff}));
this.controller2.add(that.controllerObject2);
let oldObject = false;
let before = false;
function bounding(){
WORLD.traverse((object) => {
if(object instanceof Matter === false) return;
//if(object.name!='cube') return;
var box = new Box3(new Vector3(), new Vector3());
box.setFromObject(object);
if(box.containsPoint (new Vector3().setFromMatrixPosition(that.controller1.matrixWorld))){
if(!object.userData.touched){
HUMAN.go('touch', {object:object});
object.material.wireframe = false;
object.userData.touched = true;
}
//no intersections
}else {
if(object.userData.touched){
HUMAN.go('release', {object:object});
object.material.wireframe = true;
object.userData.touched = false;
}
}
});
}
WORLD.live(()=>{
that.controller1.update();
that.controller2.update();
bounding();
/*
intersectObjects( that.controller1, {x:0,y:0,z:1} );
intersectObjects( that.controller1, {x:0,y:0,z:-1} );
intersectObjects( that.controller1, {x:1,y:0,z:0} );
intersectObjects( that.controller1, {x:-1,y:0,z:0} );
intersectObjects( that.controller1, {x:0,y:0,z:-1} );
intersectObjects( that.controller1, {x:-0,y:0,z:-1} );
*/
})
}
}
export default Reality;