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
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 };
|