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