Jelajahi Sumber

cache transform in obbmat and sphere

Garrett Johnson 5 tahun lalu
induk
melakukan
3b57e644ed

+ 2 - 4
src/three/DebugTilesRenderer.js

@@ -258,12 +258,12 @@ export class DebugTilesRenderer extends TilesRenderer {
 		const boxHelperGroup = cached.boxHelperGroup;
 		const sphereHelper = cached.sphereHelper;
 
-		if ( ! visible && boxHelperGroup.parent ) {
+		if ( ! visible ) {
 
 			boxGroup.remove( boxHelperGroup );
 			sphereGroup.remove( sphereHelper );
 
-		} else if ( visible && ! boxHelperGroup.parent ) {
+		} else {
 
 			boxGroup.add( boxHelperGroup );
 			boxHelperGroup.updateMatrixWorld( true );
@@ -287,11 +287,9 @@ export class DebugTilesRenderer extends TilesRenderer {
 
 					const cachedBox = cached.box;
 					const cachedBoxMat = cached.boxTransform;
-					const cachedTransform = cached.transform;
 
 					const boxHelperGroup = new Group();
 					boxHelperGroup.matrix.copy( cachedBoxMat );
-					boxHelperGroup.matrix.premultiply( cachedTransform );
 					boxHelperGroup.matrix.decompose( boxHelperGroup.position, boxHelperGroup.quaternion, boxHelperGroup.scale );
 
 					const boxHelper = new Box3Helper( cachedBox );

+ 5 - 10
src/three/TilesRenderer.js

@@ -70,11 +70,9 @@ export class TilesRenderer extends TilesRendererBase {
 		const cached = this.root.cached;
 		const boundingBox = cached.box;
 		const obbMat = cached.boxTransform;
-		const transformMat = cached.transform;
 
 		box.copy( boundingBox );
-		tempMat.multiplyMatrices( transformMat, obbMat );
-		box.applyMatrix4( tempMat );
+		box.applyMatrix4( obbMat );
 
 		return true;
 
@@ -219,6 +217,7 @@ export class TilesRenderer extends TilesRendererBase {
 				vecX.z, vecY.z, vecZ.z, data[ 2 ],
 				0, 0, 0, 1
 			);
+			boxTransform.premultiply( transform );
 
 			// scale the box by the extents
 			box.min.set( - scaleX, - scaleY, - scaleZ );
@@ -233,12 +232,13 @@ export class TilesRenderer extends TilesRendererBase {
 			sphere = new Sphere();
 			sphere.center.set( data[ 0 ], data[ 1 ], data[ 2 ] );
 			sphere.radius = data[ 3 ];
+			sphere.applyMatrix4( transform );
 
 		} else if ( 'box' in tile.boundingVolume ) {
 
 			sphere = new Sphere();
 			box.getBoundingSphere( sphere );
-			boxTransform.decompose( sphere.center, tempQuaternion, tempVector );
+			sphere.applyMatrix4( boxTransform );
 
 		}
 
@@ -470,7 +470,6 @@ export class TilesRenderer extends TilesRendererBase {
 			// TODO: these can likely be cached? Or the world transform mat can be used
 			// transformMat can be rolled into oobMat
 			tempMat.copy( group.matrixWorld );
-			tempMat.multiply( transformMat );
 			tempMat.multiply( obbMat );
 			tempMat.getInverse( tempMat );
 
@@ -547,15 +546,11 @@ export class TilesRenderer extends TilesRendererBase {
 		const sphere = tile.cached.sphere;
 		if ( sphere ) {
 
-			// TODO: we should cache the sphere in the tileset root frame instead of transforming it here
-			_sphere.copy( sphere );
-			_sphere.applyMatrix4( tile.cached.transform );
-
 			const frustums = this.frustums;
 			for ( let i = 0, l = frustums.length; i < l; i ++ ) {
 
 				const frustum = frustums[ i ];
-				if ( frustum.intersectsSphere( _sphere ) ) {
+				if ( frustum.intersectsSphere( sphere ) ) {
 
 					return true;
 

+ 0 - 3
src/three/raycastTraverse.js

@@ -65,7 +65,6 @@ export function raycastTraverseFirstHit( root, group, activeTiles, raycaster ) {
 		const transformMat = cached.transform;
 
 		_mat.copy( groupMatrixWorld );
-		_mat.multiply( transformMat );
 
 		// if we don't hit the sphere then early out
 		const sphere = cached.sphere;
@@ -192,10 +191,8 @@ export function raycastTraverse( tile, group, activeTiles, raycaster, intersects
 
 	const cached = tile.cached;
 	const groupMatrixWorld = group.matrixWorld;
-	const transformMat = cached.transform;
 
 	_mat.copy( groupMatrixWorld );
-	_mat.multiply( transformMat );
 
 	const sphere = cached.sphere;
 	if ( sphere ) {