fix(assets): publish controllable traffic signal runtime

This commit is contained in:
2026-08-12 10:17:34 +08:00
parent 41a0e81a6f
commit f13d890ffb
16 changed files with 88 additions and 31 deletions

View File

@@ -6,8 +6,14 @@ function resolveAsset(manifestUrl, manifest, id = "main") {
return new URL(asset.uri, manifestUrl).href;
}
function resolveRuntime(manifestUrl, manifest, id) {
const runtime = (manifest.runtime || []).find((candidate) => candidate.id === id);
if (!runtime) throw new Error(`Unknown runtime asset '${id}'`);
return new URL(runtime.uri, manifestUrl).href;
}
function placement(manifest) {
return { ...manifest.placement, coordinateSystem: manifest.coordinateSystem };
}
module.exports = { resolveAsset, placement };
module.exports = { resolveAsset, resolveRuntime, placement };

View File

@@ -1,6 +1,6 @@
"use strict";
const { resolveAsset, placement } = require("./asset-package-resolver");
const { resolveAsset, resolveRuntime, placement } = require("./asset-package-resolver");
async function loadPackage(viewer, manifestUrl, assetId = "main") {
const manifest = await fetch(manifestUrl).then((response) => {
@@ -14,7 +14,7 @@ async function loadPackage(viewer, manifestUrl, assetId = "main") {
const modelMatrix = Cesium.Matrix4.multiplyByMatrix3(enu, rotation, new Cesium.Matrix4());
const model = await Cesium.Model.fromGltfAsync({ url: resolveAsset(manifestUrl, manifest, assetId), modelMatrix });
viewer.scene.primitives.add(model);
return { manifest, model, placement: p };
return { manifest, model, placement: p, runtime: (id) => resolveRuntime(manifestUrl, manifest, id) };
}
module.exports = { loadPackage };

View File

@@ -1,6 +1,6 @@
"use strict";
const { resolveAsset, placement } = require("./asset-package-resolver");
const { resolveAsset, resolveRuntime, placement } = require("./asset-package-resolver");
async function loadPackage(loader, manifestUrl, assetId = "main", handoffEnuPlacement) {
const manifest = await fetch(manifestUrl).then((response) => {
@@ -11,7 +11,7 @@ async function loadPackage(loader, manifestUrl, assetId = "main", handoffEnuPlac
// Three.js does not georeference local ENU itself; the embedding host owns it.
const enuPlacement = placement(manifest);
if (handoffEnuPlacement) handoffEnuPlacement(enuPlacement, scene.scene);
return { manifest, scene: scene.scene, placement: enuPlacement };
return { manifest, scene: scene.scene, placement: enuPlacement, runtime: (id) => resolveRuntime(manifestUrl, manifest, id) };
}
module.exports = { loadPackage };