Improve Cesium preview loading state
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
const config = window.OSM_ASSET_PREVIEW_CONFIG || {};
|
||||
const statusEl = document.getElementById("status");
|
||||
const diagnosticsEl = document.getElementById("diagnostics");
|
||||
const loadingOverlay = document.getElementById("loadingOverlay");
|
||||
const toggleCruise = document.getElementById("toggleCruise");
|
||||
const toggleFollow = document.getElementById("toggleFollow");
|
||||
const toggleScene = document.getElementById("toggleScene");
|
||||
@@ -22,14 +23,17 @@
|
||||
// from a control the user just touched. Keep the summary so the transient
|
||||
// note can be replaced instead of destroying it.
|
||||
let baseStatus = "";
|
||||
const PREVIEW_BACKGROUND = "#d9e0e2";
|
||||
|
||||
Cesium.Ion.defaultAccessToken = "";
|
||||
|
||||
async function main() {
|
||||
setLoadingMessage("Loading scene", config.areaId || "");
|
||||
const metadata = await fetchJson(config.metadataName);
|
||||
const routeData = await fetchOptionalJson(config.routeName);
|
||||
const placement = scenePlacement(metadata);
|
||||
const viewer = createViewer();
|
||||
setLoadingMessage("Loading model", config.glbName || "");
|
||||
const assets = await loadSceneAssets(viewer, metadata, placement);
|
||||
const cruise = addVehicleCruises(viewer, routeData, config.vehicleModelName);
|
||||
const cameras = createCameraPresets(viewer, metadata, placement, cruise);
|
||||
@@ -40,6 +44,9 @@
|
||||
cameras.overview();
|
||||
baseStatus = summaryText(metadata, assets, cruise);
|
||||
setStatus(baseStatus);
|
||||
setLoadingMessage("Preparing view", "finalizing materials");
|
||||
await waitForStableFrames(viewer);
|
||||
document.body.classList.add("scene-ready");
|
||||
// Handle for the browser console and for headless checks: everything else
|
||||
// in here is closed over by the IIFE and unreachable from outside.
|
||||
window.osmPreview = { viewer, metadata, placement, assets, cruise, cameras };
|
||||
@@ -78,16 +85,49 @@
|
||||
selectionIndicator: false,
|
||||
baseLayer: false
|
||||
});
|
||||
viewer.scene.globe.depthTestAgainstTerrain = true;
|
||||
viewer.scene.backgroundColor = Cesium.Color.fromCssColorString("#d9e0e2");
|
||||
viewer.scene.globe.show = false;
|
||||
viewer.scene.globe.depthTestAgainstTerrain = false;
|
||||
viewer.scene.backgroundColor = Cesium.Color.fromCssColorString(PREVIEW_BACKGROUND);
|
||||
viewer.scene.skyAtmosphere.show = false;
|
||||
viewer.scene.skyBox.show = false;
|
||||
viewer.scene.sun.show = false;
|
||||
viewer.scene.moon.show = false;
|
||||
viewer.scene.globe.baseColor = Cesium.Color.fromCssColorString("#d4dcde");
|
||||
viewer.scene.globe.baseColor = Cesium.Color.fromCssColorString(PREVIEW_BACKGROUND);
|
||||
return viewer;
|
||||
}
|
||||
|
||||
function setLoadingMessage(title, detail) {
|
||||
if (!loadingOverlay) return;
|
||||
const titleEl = loadingOverlay.querySelector("strong");
|
||||
const detailEl = loadingOverlay.querySelector("span");
|
||||
if (titleEl) titleEl.textContent = title;
|
||||
if (detailEl) detailEl.textContent = detail || "";
|
||||
}
|
||||
|
||||
function waitForStableFrames(viewer) {
|
||||
return new Promise((resolve) => {
|
||||
const started = performance.now();
|
||||
let frames = 0;
|
||||
let done = false;
|
||||
let remove = function () {};
|
||||
function finish() {
|
||||
if (done) return;
|
||||
done = true;
|
||||
remove();
|
||||
resolve();
|
||||
}
|
||||
remove = viewer.scene.postRender.addEventListener(() => {
|
||||
frames += 1;
|
||||
const elapsed = performance.now() - started;
|
||||
if ((frames >= 14 && elapsed >= 650) || elapsed >= 2800) {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
window.setTimeout(finish, 3200);
|
||||
viewer.scene.requestRender();
|
||||
});
|
||||
}
|
||||
|
||||
function scenePlacement(metadata) {
|
||||
const anchor = metadata.anchor || {};
|
||||
const longitude = Number(anchor.longitude || 0);
|
||||
@@ -626,5 +666,7 @@
|
||||
main().catch((error) => {
|
||||
console.error(error);
|
||||
setStatus("Failed to load Cesium preview: " + error.message);
|
||||
document.body.classList.add("scene-error");
|
||||
setLoadingMessage("Failed to load scene", error.message);
|
||||
});
|
||||
}());
|
||||
|
||||
Reference in New Issue
Block a user