mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-06 11:24:00 +00:00
Release a running camera verb when a Navara scene is parked or torn down, as the Cesium scene does
This commit is contained in:
1 parent
dcb8de9d2c
commit
074f4af10e
2 files changed
+72
-2
No files matched your search
@@ -204,3 +204,59 @@ test('Navara keeps attribution for every available W1/W2 source and excludes una
|
|||||||
keys.map((key) => `Credit ${key}`),
|
keys.map((key) => `Credit ${key}`),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('parking or tearing down the Navara scene releases a running camera verb', async (t) => {
|
||||||
|
const { initCameraVerbs, moveCamera, getActiveCameraMotion } =
|
||||||
|
await import('../cameraVerbs.js');
|
||||||
|
const { createRendererCache } =
|
||||||
|
await import('../standalone/rendererCache.js');
|
||||||
|
for (const end of ['park', 'teardown']) {
|
||||||
|
const dom = installDom();
|
||||||
|
t.after(dom.restore);
|
||||||
|
// The renderer cache's own host element (parking needs one).
|
||||||
|
const element = () => ({
|
||||||
|
className: '',
|
||||||
|
prepend() {},
|
||||||
|
remove() {},
|
||||||
|
});
|
||||||
|
globalThis.document.createElement = element;
|
||||||
|
dom.container.prepend = () => {};
|
||||||
|
const engine = createFakeEngine({
|
||||||
|
kind: 'navara',
|
||||||
|
canvas: new EventTarget(),
|
||||||
|
});
|
||||||
|
const cache = createRendererCache();
|
||||||
|
const cleanups = [];
|
||||||
|
await createApplicationScene({
|
||||||
|
engineKind: 'navara',
|
||||||
|
requestServices,
|
||||||
|
googleApiKey: '',
|
||||||
|
credits: [],
|
||||||
|
loaderStatus: { textContent: '' },
|
||||||
|
signal: new AbortController().signal,
|
||||||
|
defer: (dispose) => cleanups.push(dispose),
|
||||||
|
rendererCache: cache,
|
||||||
|
loadNavaraGlobe: async () => async () => ({
|
||||||
|
engine,
|
||||||
|
setRenderLoop() {},
|
||||||
|
destroy: () => engine.destroy(),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
initCameraVerbs(engine);
|
||||||
|
assert.equal(
|
||||||
|
moveCamera({ motion: 'pan', direction: 'left', mode: 'continuous' }).ok,
|
||||||
|
true,
|
||||||
|
);
|
||||||
|
assert.equal(getActiveCameraMotion()?.rig, 'engine');
|
||||||
|
// An engine switch parks the renderer (its scene's suspend); a page
|
||||||
|
// teardown disposes it.
|
||||||
|
if (end === 'park') cache.retain('navara');
|
||||||
|
while (cleanups.length) await cleanups.pop()();
|
||||||
|
if (end === 'teardown') cache.clear();
|
||||||
|
assert.equal(getActiveCameraMotion(), null, end);
|
||||||
|
engine.fake.resetCalls();
|
||||||
|
if (!engine.isDestroyed()) engine.fake.frames(3);
|
||||||
|
assert.equal(engine.fake.callsOf('camera.setView').length, 0, end);
|
||||||
|
if (end === 'park') cache.clear();
|
||||||
|
}
|
||||||
|
});
|
||||||
+16
-2
@@ -112,8 +112,10 @@ async function createRenderer({
|
|||||||
}) {
|
}) {
|
||||||
// The Navara mode's own code loads only in that mode, with Navara itself,
|
// The Navara mode's own code loads only in that mode, with Navara itself,
|
||||||
// so the Cesium-mode bundle carries none of it.
|
// so the Cesium-mode bundle carries none of it.
|
||||||
if (engineKind === 'navara')
|
if (engineKind === 'navara') {
|
||||||
return (await import('./navaraMode.js')).createNavaraScene({
|
const scene = await (
|
||||||
|
await import('./navaraMode.js')
|
||||||
|
).createNavaraScene({
|
||||||
container,
|
container,
|
||||||
cesiumToken,
|
cesiumToken,
|
||||||
credits,
|
credits,
|
||||||
@@ -124,6 +126,17 @@ async function createRenderer({
|
|||||||
signal,
|
signal,
|
||||||
defer,
|
defer,
|
||||||
});
|
});
|
||||||
|
// As the Cesium scene below: a parked or released engine keeps no camera
|
||||||
|
// verb running on it (a Directions flight is parked before this).
|
||||||
|
const { engine } = scene;
|
||||||
|
defer(() => releaseCameraVerbs(engine));
|
||||||
|
const suspend = scene.suspend;
|
||||||
|
scene.suspend = () => {
|
||||||
|
releaseCameraVerbs(engine);
|
||||||
|
suspend();
|
||||||
|
};
|
||||||
|
return scene;
|
||||||
|
}
|
||||||
if (engineKind !== 'cesium')
|
if (engineKind !== 'cesium')
|
||||||
throw new TypeError(`Unknown globe engine: ${engineKind}`);
|
throw new TypeError(`Unknown globe engine: ${engineKind}`);
|
||||||
loaderStatus.textContent = t('Configuring viewer...');
|
loaderStatus.textContent = t('Configuring viewer...');
|
||||||
@@ -228,6 +241,7 @@ async function createRenderer({
|
|||||||
uninstallRenderGovernor(viewer);
|
uninstallRenderGovernor(viewer);
|
||||||
engine.camera.cancelFlight();
|
engine.camera.cancelFlight();
|
||||||
releaseCameraVerbs(viewer);
|
releaseCameraVerbs(viewer);
|
||||||
|
releaseCameraVerbs(engine);
|
||||||
viewer.useDefaultRenderLoop = false;
|
viewer.useDefaultRenderLoop = false;
|
||||||
},
|
},
|
||||||
resume() {
|
resume() {
|
||||||
|
|||||||
Reference in new issue
Block a user