feat: add cesium traffic signal countdowns

This commit is contained in:
2026-08-06 16:43:08 +08:00
parent 9fbc218e10
commit 043766b84e
22 changed files with 1022 additions and 170 deletions

View File

@@ -127,12 +127,12 @@ EXPORT_EMISSION_OVERRIDES = {
def cli_args():
values = {"blend": None, "glb": None, "metadata": None}
values = {"blend": None, "glb": None, "metadata": None, "dynamic_glb": None, "countdown_0_glb": None, "countdown_1_glb": None}
argv = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []
i = 0
while i < len(argv):
if argv[i].startswith("--") and i + 1 < len(argv):
values[argv[i][2:]] = argv[i + 1]
values[argv[i][2:].replace("-", "_")] = argv[i + 1]
i += 2
else:
i += 1
@@ -609,6 +609,8 @@ def export(args):
material_map = {}
meshes = []
dynamic_meshes = []
countdown_meshes = {0: [], 1: []}
unwrapped = set()
for obj in bpy.context.scene.objects:
if obj.type != "MESH":
@@ -617,7 +619,14 @@ def export(args):
continue
if obj.hide_viewport or obj.hide_render:
continue
meshes.append(obj)
if any(c.name == "06_TrafficSignalsDynamic" for c in obj.users_collection):
groups = {slot.material.name for slot in obj.material_slots if slot.material}
group = (0 if any("Countdown Group 0" in name for name in groups)
else 1 if any("Countdown Group 1" in name for name in groups)
else None)
(countdown_meshes[group] if group is not None else dynamic_meshes).append(obj)
else:
meshes.append(obj)
apply_mesh_modifiers(obj)
# Hundreds of grass tufts share four mesh datablocks; unwrapping and
# triangulating are properties of the mesh, so once per datablock.
@@ -642,6 +651,14 @@ def export(args):
slot.material = material_map[source.name]
export_glb(args["glb"], meshes)
if args.get("dynamic_glb"):
if not dynamic_meshes:
raise RuntimeError("Dynamic traffic signal collection is empty")
export_glb(args["dynamic_glb"], dynamic_meshes)
for group, key in ((0, "countdown_0_glb"), (1, "countdown_1_glb")):
if not countdown_meshes[group]:
raise RuntimeError("Traffic countdown collection %d is empty" % group)
export_glb(args[key], countdown_meshes[group])
semantic_assets = semantic_asset_specs(args["glb"], meshes)
for asset in semantic_assets:
export_glb(asset["path"], asset["meshes"])
@@ -664,6 +681,19 @@ def export(args):
"type": "model",
"url": os.path.basename(args["glb"]),
"enabled": True,
}, {
"id": "traffic-dynamic",
"label": "Traffic signals dynamic",
"type": "model",
"url": os.path.basename(args["dynamic_glb"]) if args.get("dynamic_glb") and dynamic_meshes else "",
"enabled": True,
"category": "dynamic",
}, {
"id": "traffic-countdown-0", "label": "Traffic countdown group 0", "type": "model",
"url": os.path.basename(args["countdown_0_glb"]), "enabled": True, "category": "countdown", "phaseGroup": 0,
}, {
"id": "traffic-countdown-1", "label": "Traffic countdown group 1", "type": "model",
"url": os.path.basename(args["countdown_1_glb"]), "enabled": True, "category": "countdown", "phaseGroup": 1,
}] + [{
"id": asset["id"],
"label": asset["label"],