Skip to content
Docs
Open Promoeyes
complex-models

complex-models

SCENES — big environment GLBs (rooms, streets, kits, hero props) loaded as `asset(asset="model:…")` and re-lit / re-skinned with `material_overrides`. Ten scenes, one recipe each; every one is a faithful port or a kit-bash of a CC0 / permissively-licensed model, downloaded into assets/models/ (which is git-ignored — re-fetch with the URLs in each scene's header).

Read the rig's notes
THE RECIPE (every scene):
  asset#x(asset="model:<name>" scale=<units→mm>)      the GLB, at real size
    material_overrides                                 optional re-skin
      override
        select_mesh(name=… | name_contains=… | has_map=…)
        material(ref=basic|standard|physical … map="image:…")
  environment(hdr=…) and/or real lights                or the GLB is a black cutout
  renderer(tone_mapping=… exposure=… shadow_map=…)

UNITS: 1 authored unit = 1 mm. Metre models take scale=1000, Sponza (cm)
scale=10. Point/spot intensity with decay=2 scales × k² (see the hangar);
area / directional / hemisphere intensities do not. Transmission
`thickness` is LOCAL (three multiplies it by the node scale) — leave it in
the model's own units; `attenuation-distance` is world mm.

OVERRIDE SELECTORS ARE BY MESH NAME. That is the one thing to check before
committing to a model: dump the glTF's node names (a 10-line node script
against the JSON chunk). Sponza is ONE mesh with 103 primitives and Bistro
is 2909 meshes all called "subset" — neither can be re-skinned per part;
ABeautifulGame (King_W, Pawn_Body_B3 …), FlightHelmet (GlassPlastic_low …),
Poly Haven (classic_laptop_screen) and Kenney (one mesh per part) can.

EVERY SCENE DEMOS AN APP. The environment is the set; the UI is the subject —
each scene ends with the camera diving onto its app (frame kf node=…), and the
app does something (a chart draws, a cursor clicks a CTA, a status flips).
  s01 Bay Ops console on the GLB monitor  · s02 product card by the bottle
  s03 audio-guide iPhone                   · s04 café POS in a chrome window
  s05 crane-ops holo panel                 · s06 chess analysis panel
  s07 spec card per helmet                 · s08 Focus app on the laptop lid
  s09 launch telemetry + pad laptop        · s10 pad-control laptop (night)

SCENE INDEX
  s01-hangar      Quaternius Modular Sci-Fi Megakit layout (CC0), demo90 rig: 9 clustered
                  point lights, area roof strip, directional + shadow, screens carry live ui
  s02-soda        Patrick Ryan's soda bottle (Babylon demo): two-pass glass via a second
                  asset instance, VSM shadow, HDR skybox
  s03-sponza      Intel/Crytek Sponza (Khronos glTF-Sample-Assets, metres via a 0.008 root): sun + shadow,
                  hemisphere fill, fog, dolly through the atrium
  s04-bistro      Amazon Lumberyard Bistro (Ludicon glTF mirror, CC-BY; AVIF → 8-bit WebP): the GLB's own
                  camera and sun, a street at dusk
  s05-hangar-b    a SECOND Megakit layout on the s01 rig — swap `asset=`, keep the lights
  s06-chess       Khronos ABeautifulGame: named pieces re-skinned (gold king, glass queen)
  s07-helmets     DamagedHelmet · FlightHelmet · SciFiHelmet: hero props, one override each
  s08-tabletop    Poly Haven props (CC0) kit-bashed into a desk, laptop screen driven by a
                  live `ui` stage via map_from
  s09-spaceport   Kenney Space Kit (CC0) kit-bash, day: flat-shaded parts re-tinted whole
  s10-spaceport-n the same layout at night, match-moved — lights and palette swapped

SOURCES
  Megakit layouts   raw.githubusercontent.com/CedricGuillemet/dump/master/demo90/
  Sponza/Chess/Helmets  raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/
  Bistro            media.githubusercontent.com/media/Ludicon/bistro-gltf/main/ (LFS)
  Poly Haven        api.polyhaven.com/files/<id> → gltf.1k
  Kenney            kenney.nl/assets/space-kit (zip → Models/GLTF format)
  soda bottle       patrickryanms.github.io/BabylonJStextures/Demos/sodaBottle/assets/gltf/

NOT HERE: Quaternius's other kits (Corridor / Lab / Spaceship) ship only as a
Google-Drive zip and Sketchfab downloads need a login — neither is fetchable
headlessly, so they stay on the shopping list.

KNOWN BROKEN — s04-bistro. The Ludicon glTF mirror is damaged: 32 accessors
carry float-sentinel min/max, ~500 vertices are NaN/1e38 (they poison every
bounding sphere → frustum-culled), one 116 m primitive is mislocated, and the
textures are 10-bit AVIF that headless Chromium refuses. This repo's copy has
been patched (textures → 8-bit WebP, EXT_texture_webp; bad prims dropped; bad
verts zeroed; accessor bounds recomputed → bistro.gltf + bistro.bin) and the
runtime now loads it with no failures — but it still renders NOTHING at any
camera we tried, and the in-page bounds probe OOMs the headless tab. The scene
is kept as the authored port; swap the asset for a clean Bistro export (the
NVIDIA ORCA original, converted with gltf-transform) and it should light up
as-is. Until then this scene is a sky gradient. The 444 MB tree stays on
disk for local playback and is dockerignored (not baked into the image).

Preview: /packages/runtime/index.html?project=promos/primitives/scenes/scenes.promo
Topic
scenes
Scenes
10
Kind
reference rig
//
    SCENES — big environment GLBs (rooms, streets, kits, hero props) loaded as
    `asset(asset="model:…")` and re-lit / re-skinned with `material_overrides`.
    Ten scenes, one recipe each; every one is a faithful port or a kit-bash of
    a CC0 / permissively-licensed model, downloaded into assets/models/ (which
    is git-ignored — re-fetch with the URLs in each scene's header).

    THE RECIPE (every scene):
      asset#x(asset="model:<name>" scale=<units→mm>)      the GLB, at real size
        material_overrides                                 optional re-skin
          override
            select_mesh(name=… | name_contains=… | has_map=…)
            material(ref=basic|standard|physical … map="image:…")
      environment(hdr=…) and/or real lights                or the GLB is a black cutout
      renderer(tone_mapping=… exposure=… shadow_map=…)

    UNITS: 1 authored unit = 1 mm. Metre models take scale=1000, Sponza (cm)
    scale=10. Point/spot intensity with decay=2 scales × k² (see the hangar);
    area / directional / hemisphere intensities do not. Transmission
    `thickness` is LOCAL (three multiplies it by the node scale) — leave it in
    the model's own units; `attenuation-distance` is world mm.

    OVERRIDE SELECTORS ARE BY MESH NAME. That is the one thing to check before
    committing to a model: dump the glTF's node names (a 10-line node script
    against the JSON chunk). Sponza is ONE mesh with 103 primitives and Bistro
    is 2909 meshes all called "subset" — neither can be re-skinned per part;
    ABeautifulGame (King_W, Pawn_Body_B3 …), FlightHelmet (GlassPlastic_low …),
    Poly Haven (classic_laptop_screen) and Kenney (one mesh per part) can.

    EVERY SCENE DEMOS AN APP. The environment is the set; the UI is the subject —
    each scene ends with the camera diving onto its app (frame kf node=…), and the
    app does something (a chart draws, a cursor clicks a CTA, a status flips).
      s01 Bay Ops console on the GLB monitor  · s02 product card by the bottle
      s03 audio-guide iPhone                   · s04 café POS in a chrome window
      s05 crane-ops holo panel                 · s06 chess analysis panel
      s07 spec card per helmet                 · s08 Focus app on the laptop lid
      s09 launch telemetry + pad laptop        · s10 pad-control laptop (night)

    SCENE INDEX
      s01-hangar      Quaternius Modular Sci-Fi Megakit layout (CC0), demo90 rig: 9 clustered
                      point lights, area roof strip, directional + shadow, screens carry live ui
      s02-soda        Patrick Ryan's soda bottle (Babylon demo): two-pass glass via a second
                      asset instance, VSM shadow, HDR skybox
      s03-sponza      Intel/Crytek Sponza (Khronos glTF-Sample-Assets, metres via a 0.008 root): sun + shadow,
                      hemisphere fill, fog, dolly through the atrium
      s04-bistro      Amazon Lumberyard Bistro (Ludicon glTF mirror, CC-BY; AVIF → 8-bit WebP): the GLB's own
                      camera and sun, a street at dusk
      s05-hangar-b    a SECOND Megakit layout on the s01 rig — swap `asset=`, keep the lights
      s06-chess       Khronos ABeautifulGame: named pieces re-skinned (gold king, glass queen)
      s07-helmets     DamagedHelmet · FlightHelmet · SciFiHelmet: hero props, one override each
      s08-tabletop    Poly Haven props (CC0) kit-bashed into a desk, laptop screen driven by a
                      live `ui` stage via map_from
      s09-spaceport   Kenney Space Kit (CC0) kit-bash, day: flat-shaded parts re-tinted whole
      s10-spaceport-n the same layout at night, match-moved — lights and palette swapped

    SOURCES
      Megakit layouts   raw.githubusercontent.com/CedricGuillemet/dump/master/demo90/
      Sponza/Chess/Helmets  raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/
      Bistro            media.githubusercontent.com/media/Ludicon/bistro-gltf/main/ (LFS)
      Poly Haven        api.polyhaven.com/files/<i