Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/three/TilesGroup.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,16 @@ export class TilesGroup extends Group {

raycast( raycaster, intersects ) {

// returning "true" ends raycast traversal
if ( this.tilesRenderer.optimizeRaycast ) {

this.tilesRenderer.raycast( raycaster, intersects );
return true;

}

return false;

}

updateMatrixWorld( force ) {
Expand Down
35 changes: 23 additions & 12 deletions src/three/TilesRenderer.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,15 @@ import {
Vector2,
LoadingManager,
EventDispatcher,
REVISION,
} from 'three';
import { raycastTraverse, raycastTraverseFirstHit } from './raycastTraverse.js';
import { readMagicBytes } from '../utilities/readMagicBytes.js';
import { TileBoundingVolume } from './math/TileBoundingVolume.js';
import { ExtendedFrustum } from './math/ExtendedFrustum.js';

// In three.js r165 and higher raycast traversal can be ended early
const REVISION_165 = parseInt( REVISION ) < 165;
const INITIAL_FRUSTUM_CULLED = Symbol( 'INITIAL_FRUSTUM_CULLED' );
const tempMat = new Matrix4();
const tempMat2 = new Matrix4();
Expand Down Expand Up @@ -92,18 +95,22 @@ export class TilesRenderer extends TilesRendererBase {
} );
this.manager = manager;

// Setting up the override raycasting function to be used by
// 3D objects created by this renderer
const tilesRenderer = this;
this._overridenRaycast = function ( raycaster, intersects ) {
if ( REVISION_165 ) {

if ( ! tilesRenderer.optimizeRaycast ) {
// Setting up the override raycasting function to be used by
// 3D objects created by this renderer
const tilesRenderer = this;
this._overridenRaycast = function ( raycaster, intersects ) {

Object.getPrototypeOf( this ).raycast.call( this, raycaster, intersects );
if ( ! tilesRenderer.optimizeRaycast ) {

}
Object.getPrototypeOf( this ).raycast.call( this, raycaster, intersects );

};
}

};

}

}

Expand Down Expand Up @@ -678,12 +685,16 @@ export class TilesRenderer extends TilesRendererBase {
} );
updateFrustumCulled( scene, ! this.autoDisableRendererCulling );

// We handle raycasting in a custom way so remove it from here
scene.traverse( c => {
if ( REVISION_165 ) {

c.raycast = this._overridenRaycast;
// We handle raycasting in a custom way so remove it from here
scene.traverse( c => {

} );
c.raycast = this._overridenRaycast;

} );

}

const materials = [];
const geometry = [];
Expand Down
6 changes: 4 additions & 2 deletions src/three/gltf/MeshFeatures.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { ShaderMaterial, Vector2, Vector4, WebGLRenderTarget, WebGLRenderer, REVISION, Box2 } from 'three';
import { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';

const REVISION_165 = parseInt( REVISION ) >= 165;

// renderer and quad for rendering a single pixel
const _renderer = new WebGLRenderer();
const _quad = new FullScreenQuad( new ShaderMaterial( {
Expand Down Expand Up @@ -58,7 +60,7 @@ function getTextureCoordAttribute( geometry, index ) {
// render target
function renderPixelToTarget( texture, pixel, dstPixel, target ) {

if ( REVISION >= 165 ) {
if ( REVISION_165 ) {

_box.min.copy( pixel );
_box.max.copy( pixel );
Expand Down Expand Up @@ -134,7 +136,7 @@ export class MeshFeatures {
// performs texture data read back asynchronously
getFeaturesAsync( ...args ) {

if ( REVISION >= 165 ) {
if ( REVISION_165 ) {

this._asyncRead = true;
const result = this.getFeatures( ...args );
Expand Down
24 changes: 17 additions & 7 deletions src/three/raycastTraverse.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { Matrix4, Ray, Vector3 } from 'three';
import { Matrix4, Ray, Vector3, REVISION } from 'three';

// In three.js r165 and higher raycast traversal can be ended early
const REVISION_165 = parseInt( REVISION ) < 165;
const _mat = new Matrix4();
const _localRay = new Ray();
const _vec = new Vector3();
Expand All @@ -13,20 +15,28 @@ function distanceSort( a, b ) {

function intersectTileScene( scene, raycaster, intersects ) {

// Don't intersect the box3 helpers because those are used for debugging
scene.traverse( c => {
if ( REVISION_165 ) {

// We set the default raycast function to empty so three.js doesn't automatically cast against it
Object.getPrototypeOf( c ).raycast.call( c, raycaster, intersects );
// Don't intersect the box3 helpers because those are used for debugging
scene.traverse( c => {

} );
// We set the default raycast function to empty so three.js doesn't automatically cast against it
Object.getPrototypeOf( c ).raycast.call( c, raycaster, intersects );

} );
_hitArray.sort( distanceSort );

} else {

raycaster.intersectObject( scene, true, intersects );

}

}

function intersectTileSceneFirstHist( scene, raycaster ) {

intersectTileScene( scene, raycaster, _hitArray );
_hitArray.sort( distanceSort );

const hit = _hitArray[ 0 ] || null;
_hitArray.length = 0;
Expand Down