Переглянути джерело

Merge branch 'master' of https://github.com/NASA-AMMOS/3DTilesRendererJS

Garrett Johnson 5 роки тому
батько
коміт
38c07c3f6c
2 змінених файлів з 12 додано та 1 видалено
  1. 1 0
      src/base/TilesRendererBase.js
  2. 11 1
      src/base/traverseFunctions.js

+ 1 - 0
src/base/TilesRendererBase.js

@@ -167,6 +167,7 @@ export class TilesRendererBase {
 
 		tile.__wasSetVisible = false;
 		tile.__visible = false;
+		tile.__childrenWereVisible = false;
 
 		tile.__wasSetActive = false;
 		tile.__active = false;

+ 11 - 1
src/base/traverseFunctions.js

@@ -19,6 +19,7 @@ function resetFrameState( tile, frameCount ) {
 		tile.__visible = false;
 		tile.__active = false;
 		tile.__error = 0;
+		tile.__childrenWereVisible = false;
 
 	}
 
@@ -173,6 +174,7 @@ export function markUsedSetLeaves( tile, renderer ) {
 
 	}
 
+
 	if ( ! anyChildrenUsed ) {
 
 		// TODO: This isn't necessarily right because it's possible that a parent tile is considered in the
@@ -184,12 +186,15 @@ export function markUsedSetLeaves( tile, renderer ) {
 
 	} else {
 
+		let childrenWereVisible = false;
 		for ( let i = 0, l = children.length; i < l; i ++ ) {
 
 			const c = children[ i ];
 			markUsedSetLeaves( c, renderer );
+			childrenWereVisible = childrenWereVisible || c.__wasSetVisible || c.__childrenWereVisible;
 
 		}
+		tile.__childrenWereVisible = childrenWereVisible;
 
 	}
 
@@ -234,6 +239,7 @@ export function skipTraversal( tile, renderer ) {
 	const meetsSSE = tile.__error <= errorRequirement;
 	const hasContent = ! tile.__contentEmpty;
 	const loadedContent = tile.__loadingState === LOADED && ! tile.__contentEmpty;
+	const childrenWereVisible = tile.__childrenWereVisible;
 	const children = tile.children;
 	let allChildrenHaveContent = true;
 	for ( let i = 0, l = children.length; i < l; i ++ ) {
@@ -256,7 +262,11 @@ export function skipTraversal( tile, renderer ) {
 
 	}
 
-	if ( meetsSSE && ! allChildrenHaveContent ) {
+	// Only mark this tile as visible if it meets the screen space error requirements, has loaded content, not
+	// all children have loaded yet, and if no children were visible last frame. We want to keep children visible
+	// that _were_ visible to avoid a pop in level of detail as the camera moves around and parent / sibling tiles
+	// load in.
+	if ( meetsSSE && ! allChildrenHaveContent && ! childrenWereVisible ) {
 
 		if ( loadedContent ) {