You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
1.5 KiB
JavaScript

import * as THREE from 'three';
const mouse = new THREE.Vector2();
const raycaster = new THREE.Raycaster();
class Selector {
constructor( editor ) {
const signals = editor.signals;
this.editor = editor;
this.signals = signals;
// signals
signals.intersectionsDetected.add( ( intersects ) => {
if ( intersects.length > 0 ) {
const object = intersects[ 0 ].object;
if ( object.userData.object !== undefined ) {
// helper
this.select( object.userData.object );
} else {
this.select( object );
}
} else {
this.select( null );
}
} );
}
getIntersects( raycaster ) {
const objects = [];
this.editor.scene.traverseVisible( function ( child ) {
objects.push( child );
} );
this.editor.sceneHelpers.traverseVisible( function ( child ) {
if ( child.name === 'picker' ) objects.push( child );
} );
return raycaster.intersectObjects( objects, false );
}
getPointerIntersects( point, camera ) {
mouse.set( ( point.x * 2 ) - 1, - ( point.y * 2 ) + 1 );
raycaster.setFromCamera( mouse, camera );
return this.getIntersects( raycaster );
}
select( object ) {
if ( this.editor.selected === object ) return;
let uuid = null;
if ( object !== null ) {
uuid = object.uuid;
}
this.editor.selected = object;
this.editor.config.setKey( 'selected', uuid );
this.signals.objectSelected.dispatch( object );
}
deselect() {
this.select( null );
}
}
export { Selector };