108 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {
 | 
						|
	Object3D
 | 
						|
} from 'three';
 | 
						|
 | 
						|
import {
 | 
						|
	XRHandPrimitiveModel
 | 
						|
} from './XRHandPrimitiveModel.js';
 | 
						|
 | 
						|
import {
 | 
						|
	XRHandMeshModel
 | 
						|
} from './XRHandMeshModel.js';
 | 
						|
 | 
						|
class XRHandModel extends Object3D {
 | 
						|
 | 
						|
	constructor( controller ) {
 | 
						|
 | 
						|
		super();
 | 
						|
 | 
						|
		this.controller = controller;
 | 
						|
		this.motionController = null;
 | 
						|
		this.envMap = null;
 | 
						|
 | 
						|
		this.mesh = null;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	updateMatrixWorld( force ) {
 | 
						|
 | 
						|
		super.updateMatrixWorld( force );
 | 
						|
 | 
						|
		if ( this.motionController ) {
 | 
						|
 | 
						|
			this.motionController.updateMesh();
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
class XRHandModelFactory {
 | 
						|
 | 
						|
	constructor( gltfLoader = null, onLoad = null ) {
 | 
						|
 | 
						|
		this.gltfLoader = gltfLoader;
 | 
						|
		this.path = null;
 | 
						|
		this.onLoad = onLoad;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	setPath( path ) {
 | 
						|
 | 
						|
		this.path = path;
 | 
						|
 | 
						|
		return this;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	createHandModel( controller, profile ) {
 | 
						|
 | 
						|
		const handModel = new XRHandModel( controller );
 | 
						|
 | 
						|
		controller.addEventListener( 'connected', ( event ) => {
 | 
						|
 | 
						|
			const xrInputSource = event.data;
 | 
						|
 | 
						|
			if ( xrInputSource.hand && ! handModel.motionController ) {
 | 
						|
 | 
						|
				handModel.xrInputSource = xrInputSource;
 | 
						|
 | 
						|
				// @todo Detect profile if not provided
 | 
						|
				if ( profile === undefined || profile === 'spheres' ) {
 | 
						|
 | 
						|
					handModel.motionController = new XRHandPrimitiveModel( handModel, controller, this.path, xrInputSource.handedness, { primitive: 'sphere' } );
 | 
						|
 | 
						|
				} else if ( profile === 'boxes' ) {
 | 
						|
 | 
						|
					handModel.motionController = new XRHandPrimitiveModel( handModel, controller, this.path, xrInputSource.handedness, { primitive: 'box' } );
 | 
						|
 | 
						|
				} else if ( profile === 'mesh' ) {
 | 
						|
 | 
						|
					handModel.motionController = new XRHandMeshModel( handModel, controller, this.path, xrInputSource.handedness, this.gltfLoader, this.onLoad );
 | 
						|
 | 
						|
				}
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			controller.visible = true;
 | 
						|
 | 
						|
		} );
 | 
						|
 | 
						|
		controller.addEventListener( 'disconnected', () => {
 | 
						|
 | 
						|
			controller.visible = false;
 | 
						|
			// handModel.motionController = null;
 | 
						|
			// handModel.remove( scene );
 | 
						|
			// scene = null;
 | 
						|
 | 
						|
		} );
 | 
						|
 | 
						|
		return handModel;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
export { XRHandModelFactory };
 |