فهرست منبع

Merge pull request #32 from NASA-AMMOS/account-for-children-visibility

Account for children visibility
Garrett Johnson 5 سال پیش
والد
کامیت
99e074d6f3
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

@@ -17,6 +17,7 @@ function resetFrameState( tile, frameCount ) {
 		tile.__visible = false;
 		tile.__active = false;
 		tile.__error = 0;
+		tile.__childrenWereVisible = false;
 
 	}
 
@@ -159,6 +160,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
@@ -170,12 +172,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;
 
 	}
 
@@ -218,6 +223,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 ++ ) {
@@ -239,7 +245,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 ) {