Explorar o código

Add visible tiles set

Garrett Johnson %!s(int64=5) %!d(string=hai) anos
pai
achega
18c4493e33
Modificáronse 2 ficheiros con 56 adicións e 52 borrados
  1. 46 52
      src/three/DebugTilesRenderer.js
  2. 10 0
      src/three/TilesRenderer.js

+ 46 - 52
src/three/DebugTilesRenderer.js

@@ -138,93 +138,87 @@ export class DebugTilesRenderer extends TilesRenderer {
 
 		const errorTarget = this.errorTarget;
 		const colorMode = this.colorMode;
-		const visibleSet = this.visibleSet;
-		this.traverse( tile => {
+		const visibleTiles = this.visibleTiles;
+		visibleTiles.forEach( tile => {
 
 			const scene = tile.cached.scene;
-			if ( visibleSet.has( scene ) ) {
-
-				scene.traverse( c => {
-
-					const currMaterial = c.material;
-					if ( currMaterial ) {
-
-						const originalMaterial = c[ ORIGINAL_MATERIAL ];
-						if ( colorMode === NONE && currMaterial !== originalMaterial ) {
-
-							c.material.dispose();
-							c.material = c[ ORIGINAL_MATERIAL ];
+			scene.traverse( c => {
 
-						} else if ( colorMode !== NONE && currMaterial === originalMaterial ) {
+				const currMaterial = c.material;
+				if ( currMaterial ) {
 
-							c.material = new MeshBasicMaterial();
+					const originalMaterial = c[ ORIGINAL_MATERIAL ];
+					if ( colorMode === NONE && currMaterial !== originalMaterial ) {
 
-						}
+						c.material.dispose();
+						c.material = c[ ORIGINAL_MATERIAL ];
 
-						switch ( colorMode ) {
+					} else if ( colorMode !== NONE && currMaterial === originalMaterial ) {
 
-							case DEPTH: {
+						c.material = new MeshBasicMaterial();
 
-								const val = tile.__depth / maxDepth;
-								c.material.color.setRGB( val, val, val );
-								break;
+					}
 
-							}
-							case SCREEN_ERROR: {
+					switch ( colorMode ) {
 
-								const val = tile.__error / errorTarget;
-								if ( val > 1.0 ) {
+						case DEPTH: {
 
-									c.material.color.setRGB( 1.0, 0.0, 0.0 );
+							const val = tile.__depth / maxDepth;
+							c.material.color.setRGB( val, val, val );
+							break;
 
-								} else {
+						}
+						case SCREEN_ERROR: {
 
-									c.material.color.setRGB( val, val, val );
+							const val = tile.__error / errorTarget;
+							if ( val > 1.0 ) {
 
-								}
-								break;
+								c.material.color.setRGB( 1.0, 0.0, 0.0 );
 
-							}
-							case GEOMETRIC_ERROR: {
+							} else {
 
-								const val = Math.min( tile.geometricError / maxError, 1 );
 								c.material.color.setRGB( val, val, val );
-								break;
 
 							}
-							case DISTANCE: {
+							break;
 
-								// TODO
-								// Allow custom scaling
-								const val = Math.min( tile.cached.distance / maxDistance, 1 );
-								c.material.color.setRGB( val, val, val );
-								break;
+						}
+						case GEOMETRIC_ERROR: {
 
-							}
-							case IS_LEAF: {
+							const val = Math.min( tile.geometricError / maxError, 1 );
+							c.material.color.setRGB( val, val, val );
+							break;
 
-								if ( ! tile.children || tile.children.length === 0 ) {
+						}
+						case DISTANCE: {
 
-									c.material.color.set( 0xffffff );
+							// TODO
+							// Allow custom scaling
+							const val = Math.min( tile.cached.distance / maxDistance, 1 );
+							c.material.color.setRGB( val, val, val );
+							break;
 
-								} else {
+						}
+						case IS_LEAF: {
 
-									c.material.color.set( 0 );
+							if ( ! tile.children || tile.children.length === 0 ) {
 
-								}
-								break;
+								c.material.color.set( 0xffffff );
 
-							}
+							} else {
 
+								c.material.color.set( 0 );
 
+							}
+							break;
 
 						}
 
 					}
 
-				} );
+				}
 
-			}
+			} );
 
 		} );
 

+ 10 - 0
src/three/TilesRenderer.js

@@ -51,7 +51,9 @@ export class TilesRenderer extends TilesRendererBase {
 		this.resolution = new Vector2();
 		this.frustums = [];
 		this.activeSet = new Set();
+		this.activeTiles = new Set();
 		this.visibleSet = new Set();
+		this.visibleTiles = new Set();
 
 	}
 
@@ -391,13 +393,17 @@ export class TilesRenderer extends TilesRendererBase {
 		// TODO: save the whole tile object in the visible set and active set
 		const scene = tile.cached.scene;
 		const visibleSet = this.visibleSet;
+		const visibleTiles = this.visibleTiles;
 		const group = this.group;
 		if ( visible ) {
 
+			// TODO: Should set visible be called if the scene hasn't been loaded yet?
+			// Ideally this would only be called on state change and when it's relevant
 			if ( scene && ! scene.parent ) {
 
 				group.add( scene );
 				visibleSet.add( scene );
+				visibleTiles.add( tile );
 				scene.updateMatrixWorld( true );
 
 			}
@@ -406,6 +412,7 @@ export class TilesRenderer extends TilesRendererBase {
 
 			group.remove( scene );
 			visibleSet.delete( scene );
+			visibleTiles.delete( tile );
 
 		}
 
@@ -415,16 +422,19 @@ export class TilesRenderer extends TilesRendererBase {
 
 		const cached = tile.cached;
 		const activeSet = this.activeSet;
+		const activeTiles = this.activeTiles;
 		if ( active !== cached.active ) {
 
 			cached.active = active;
 			if ( active ) {
 
 				activeSet.add( cached.scene );
+				activeTiles.add( tile );
 
 			} else {
 
 				activeSet.delete( cached.scene );
+				activeTiles.delete( tile );
 
 			}