diff --git a/src/SparkRenderer.ts b/src/SparkRenderer.ts index 83a96028..a54ea942 100644 --- a/src/SparkRenderer.ts +++ b/src/SparkRenderer.ts @@ -1233,6 +1233,7 @@ export class SparkRenderer extends THREE.Mesh { extSplats: this.pagedExtSplats, maxSplats: this.maxPagedSplats, numFetchers: this.numLodFetchers, + onDirty: () => this.setDirty(), }); const { lodId } = (await worker.call("newLodTree", { diff --git a/src/SplatPager.ts b/src/SplatPager.ts index 58af2f6d..132bf7ef 100644 --- a/src/SplatPager.ts +++ b/src/SplatPager.ts @@ -462,6 +462,7 @@ export interface SplatPagerOptions { * @default 3 */ numFetchers?: number; + onDirty?: () => void; } export class SplatPager { @@ -478,6 +479,7 @@ export class SplatPager { autoDrive: boolean; numFetchers: number; fetchPause = 0; + onDirty?: () => void; splatsChunkToPage: Map< PagedSplats, @@ -573,6 +575,7 @@ export class SplatPager { this.autoDrive = options.autoDrive ?? true; this.numFetchers = options.numFetchers ?? 3; + this.onDirty = options.onDirty; this.splatsChunkToPage = new Map(); this.pageToSplatsChunk = new Array(this.maxPages); @@ -1336,11 +1339,14 @@ export class SplatPager { private processFetched() { const now = performance.now(); + let processed = false; while (true) { const fetched = this.fetched.shift(); if (!fetched) { + if (processed) this.onDirty?.(); break; } + processed = true; const { splats, chunk, data } = fetched; let page = this.allocatePage();