|
@@ -429,6 +429,8 @@ export class TilesRenderer extends TilesRendererBase {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ const transformInverse = new Matrix4().copy( transform ).invert();
|
|
|
|
+
|
|
let box = null;
|
|
let box = null;
|
|
let boxTransform = null;
|
|
let boxTransform = null;
|
|
let boxTransformInverse = null;
|
|
let boxTransformInverse = null;
|
|
@@ -517,6 +519,8 @@ export class TilesRenderer extends TilesRendererBase {
|
|
|
|
|
|
loadIndex: 0,
|
|
loadIndex: 0,
|
|
transform,
|
|
transform,
|
|
|
|
+ transformInverse,
|
|
|
|
+
|
|
active: false,
|
|
active: false,
|
|
inFrustum: [],
|
|
inFrustum: [],
|
|
|
|
|
|
@@ -794,10 +798,14 @@ export class TilesRenderer extends TilesRendererBase {
|
|
// TODO: We should use the largest distance to the tile between
|
|
// TODO: We should use the largest distance to the tile between
|
|
// all available bounding volume types.
|
|
// all available bounding volume types.
|
|
const boundingVolume = tile.boundingVolume;
|
|
const boundingVolume = tile.boundingVolume;
|
|
- if ( 'box' in boundingVolume ) {
|
|
|
|
|
|
|
|
|
|
+ if ( 'box' in boundingVolume || 'sphere' in boundingVolume ) {
|
|
|
|
+
|
|
|
|
+ const boundingSphere = cached.sphere;
|
|
const boundingBox = cached.box;
|
|
const boundingBox = cached.box;
|
|
const boxTransformInverse = cached.boxTransformInverse;
|
|
const boxTransformInverse = cached.boxTransformInverse;
|
|
|
|
+ const transformInverse = cached.transformInverse;
|
|
|
|
+ const useBox = boundingBox && boxTransformInverse;
|
|
|
|
|
|
let maxError = - Infinity;
|
|
let maxError = - Infinity;
|
|
let minDistance = Infinity;
|
|
let minDistance = Infinity;
|
|
@@ -814,8 +822,6 @@ export class TilesRenderer extends TilesRendererBase {
|
|
const camera = cameras[ i ];
|
|
const camera = cameras[ i ];
|
|
const info = cameraInfo[ i ];
|
|
const info = cameraInfo[ i ];
|
|
const invScale = info.invScale;
|
|
const invScale = info.invScale;
|
|
- tempVector.copy( info.position );
|
|
|
|
- tempVector.applyMatrix4( boxTransformInverse );
|
|
|
|
|
|
|
|
let error;
|
|
let error;
|
|
if ( camera.isOrthographicCamera ) {
|
|
if ( camera.isOrthographicCamera ) {
|
|
@@ -825,7 +831,21 @@ export class TilesRenderer extends TilesRendererBase {
|
|
|
|
|
|
} else {
|
|
} else {
|
|
|
|
|
|
- const distance = boundingBox.distanceToPoint( tempVector );
|
|
|
|
|
|
+ tempVector.copy( info.position );
|
|
|
|
+
|
|
|
|
+ let distance;
|
|
|
|
+ if ( useBox ) {
|
|
|
|
+
|
|
|
|
+ tempVector.applyMatrix4( boxTransformInverse );
|
|
|
|
+ distance = boundingBox.distanceToPoint( tempVector );
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ tempVector.applyMatrix4( transformInverse );
|
|
|
|
+ distance = boundingSphere.distanceToPoint( tempVector );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
const scaledDistance = distance * invScale;
|
|
const scaledDistance = distance * invScale;
|
|
const sseDenominator = info.sseDenominator;
|
|
const sseDenominator = info.sseDenominator;
|
|
error = tile.geometricError / ( scaledDistance * sseDenominator );
|
|
error = tile.geometricError / ( scaledDistance * sseDenominator );
|
|
@@ -841,12 +861,6 @@ export class TilesRenderer extends TilesRendererBase {
|
|
tile.__distanceFromCamera = minDistance;
|
|
tile.__distanceFromCamera = minDistance;
|
|
tile.__error = maxError;
|
|
tile.__error = maxError;
|
|
|
|
|
|
- } else if ( 'sphere' in boundingVolume ) {
|
|
|
|
-
|
|
|
|
- // const sphere = cached.sphere;
|
|
|
|
-
|
|
|
|
- console.warn( 'ThreeTilesRenderer : Sphere bounds not supported.' );
|
|
|
|
-
|
|
|
|
} else if ( 'region' in boundingVolume ) {
|
|
} else if ( 'region' in boundingVolume ) {
|
|
|
|
|
|
// unsupported
|
|
// unsupported
|