fix(preview): derive signals from OSM controls
This commit is contained in:
@@ -482,6 +482,7 @@
|
||||
const state = { elapsedSeconds: 0, phase: "" };
|
||||
const entities = [];
|
||||
const nodes = new Map();
|
||||
const countdownNodes = new WeakMap();
|
||||
const node = (name) => {
|
||||
if (nodes.has(name)) return nodes.get(name);
|
||||
let value = null;
|
||||
@@ -496,6 +497,18 @@
|
||||
if (value) nodes.set(name, value);
|
||||
return value;
|
||||
};
|
||||
const countdownNode = (model, name) => {
|
||||
let modelNodes = countdownNodes.get(model);
|
||||
if (!modelNodes) {
|
||||
modelNodes = new Map();
|
||||
countdownNodes.set(model, modelNodes);
|
||||
}
|
||||
if (modelNodes.has(name)) return modelNodes.get(name);
|
||||
let value = null;
|
||||
try { value = model.getNode(name); } catch (error) { /* model node table is still loading */ }
|
||||
if (value) modelNodes.set(name, value);
|
||||
return value;
|
||||
};
|
||||
const update = (elapsedSeconds) => {
|
||||
Cesium.JulianDate.addSeconds(start, elapsedSeconds, phaseTime);
|
||||
let changed = false;
|
||||
@@ -516,7 +529,7 @@
|
||||
for (let value = 0; value < 20; value += 1) {
|
||||
const name = `TrafficSignalDynamic_${signal.id}_countdown_${String(value).padStart(2, "0")}`;
|
||||
let countdown = null;
|
||||
try { countdown = countdownModel.getNode(name); } catch (error) { /* model node table is still loading */ }
|
||||
countdown = countdownNode(countdownModel, name);
|
||||
if (countdown && countdown.show !== (String(value).padStart(2, "0") === visibleCountdown)) {
|
||||
countdown.show = String(value).padStart(2, "0") === visibleCountdown;
|
||||
changed = true;
|
||||
@@ -544,6 +557,13 @@
|
||||
// countdown must remain visibly periodic.
|
||||
const timer = setInterval(render, 250);
|
||||
render();
|
||||
// Countdown GLBs may expose their node table a few frames after the
|
||||
// model object exists. Re-apply the initial state once both models are
|
||||
// ready so every hidden digit is explicitly hidden before the first
|
||||
// user-visible frame.
|
||||
for (const model of countdownModels.values()) {
|
||||
if (model.readyPromise) model.readyPromise.then(() => update(0)).catch(() => {});
|
||||
}
|
||||
return {
|
||||
entities, count: signals.length, dynamic, state, timer,
|
||||
set show(value) {
|
||||
|
||||
Reference in New Issue
Block a user