|
@@ -11646,6 +11646,14 @@ function checkBufferGeometryIntersection( object, material, raycaster, ray, posi
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( object.isSkinnedMesh ) {
|
|
|
+
|
|
|
+ object.boneTransform( a, _vA );
|
|
|
+ object.boneTransform( b, _vB );
|
|
|
+ object.boneTransform( c, _vC );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
var intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint );
|
|
|
|
|
|
if ( intersection ) {
|
|
@@ -23060,7 +23068,9 @@ function WebXRManager( renderer, gl ) {
|
|
|
cameraR.layers.enable( 2 );
|
|
|
cameraR.viewport = new Vector4();
|
|
|
|
|
|
- var cameraVR = new ArrayCamera( [ cameraL, cameraR ] );
|
|
|
+ var cameras = [ cameraL, cameraR ];
|
|
|
+
|
|
|
+ var cameraVR = new ArrayCamera();
|
|
|
cameraVR.layers.enable( 1 );
|
|
|
cameraVR.layers.enable( 2 );
|
|
|
|
|
@@ -23413,12 +23423,23 @@ function WebXRManager( renderer, gl ) {
|
|
|
|
|
|
renderer.setFramebuffer( baseLayer.framebuffer );
|
|
|
|
|
|
+ var cameraVRNeedsUpdate = false;
|
|
|
+
|
|
|
+ // check if it's necessary to rebuild cameraVR's camera list
|
|
|
+
|
|
|
+ if ( views.length !== cameraVR.cameras.length ) {
|
|
|
+
|
|
|
+ cameraVR.cameras.length = 0;
|
|
|
+ cameraVRNeedsUpdate = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
for ( var i = 0; i < views.length; i ++ ) {
|
|
|
|
|
|
var view = views[ i ];
|
|
|
var viewport = baseLayer.getViewport( view );
|
|
|
|
|
|
- var camera = cameraVR.cameras[ i ];
|
|
|
+ var camera = cameras[ i ];
|
|
|
camera.matrix.fromArray( view.transform.matrix );
|
|
|
camera.projectionMatrix.fromArray( view.projectionMatrix );
|
|
|
camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
|
|
@@ -23429,6 +23450,12 @@ function WebXRManager( renderer, gl ) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if ( cameraVRNeedsUpdate === true ) {
|
|
|
+
|
|
|
+ cameraVR.cameras.push( camera );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -27113,7 +27140,51 @@ SkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {
|
|
|
|
|
|
return new this.constructor( this.geometry, this.material ).copy( this );
|
|
|
|
|
|
- }
|
|
|
+ },
|
|
|
+
|
|
|
+ boneTransform: ( function () {
|
|
|
+
|
|
|
+ var basePosition = new Vector3();
|
|
|
+
|
|
|
+ var skinIndex = new Vector4();
|
|
|
+ var skinWeight = new Vector4();
|
|
|
+
|
|
|
+ var vector = new Vector3();
|
|
|
+ var matrix = new Matrix4();
|
|
|
+
|
|
|
+ return function ( index, target ) {
|
|
|
+
|
|
|
+ var skeleton = this.skeleton;
|
|
|
+ var geometry = this.geometry;
|
|
|
+
|
|
|
+ skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );
|
|
|
+ skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );
|
|
|
+
|
|
|
+ basePosition.fromBufferAttribute( geometry.attributes.position, index ).applyMatrix4( this.bindMatrix );
|
|
|
+
|
|
|
+ target.set( 0, 0, 0 );
|
|
|
+
|
|
|
+ for ( var i = 0; i < 4; i ++ ) {
|
|
|
+
|
|
|
+ var weight = skinWeight.getComponent( i );
|
|
|
+
|
|
|
+ if ( weight !== 0 ) {
|
|
|
+
|
|
|
+ var boneIndex = skinIndex.getComponent( i );
|
|
|
+
|
|
|
+ matrix.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );
|
|
|
+
|
|
|
+ target.addScaledVector( vector.copy( basePosition ).applyMatrix4( matrix ), weight );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return target.applyMatrix4( this.bindMatrixInverse );
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ }() )
|
|
|
|
|
|
} );
|
|
|
|