From aab81acc330c38fb550ef12f80131f90e4be741b Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 Aug 2026 18:53:51 +0700 Subject: [PATCH] the static world merges into per-cell blobs, behind a flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - behind WOW_STATIC_MERGE=1, never-fade doodads, fading doodads and interior props bake into one mesh per 133-yard cell and material — −0.99 ms at the Stormwind gates, a wash in Lower Blackrock Spire, GPU flat - the merged faders fade in-shader on the reference's own fading draw state, so the ramp is as smooth as an individual doodad's - interior props carry their light-probe slot per vertex, and the arrival cover waits for every unbaked blob so a reveal never shows a hole - a merge census (WOW_MERGE_CENSUS=1) prices each population before it is built — WMO group geometry merges nothing and stays individual Co-Authored-By: Claude Fable 5 --- crates/benilla-app/src/entities/wmo_props.rs | 14 +- crates/benilla-app/src/loading_screen.rs | 4 +- crates/benilla-app/src/player/world_focus.rs | 12 +- crates/benilla-assets/src/lib.rs | 9 +- crates/benilla-assets/src/materials.rs | 36 + crates/benilla-assets/src/model.rs | 64 +- .../benilla-assets/src/shaders/wow_model.wgsl | 72 +- crates/benilla-world/src/lib.rs | 1 + crates/benilla-world/src/static_merge.rs | 167 ++++ crates/benilla-world/src/terrain_stream.rs | 43 +- .../benilla-world/src/terrain_stream/merge.rs | 712 ++++++++++++++++++ .../src/terrain_stream/spawn/assemble.rs | 161 +++- .../src/terrain_stream/spawn/mod.rs | 80 +- .../benilla-world/src/terrain_stream/weld.rs | 1 + crates/benilla-world/src/world_plugins.rs | 5 + 15 files changed, 1311 insertions(+), 70 deletions(-) create mode 100644 crates/benilla-world/src/static_merge.rs create mode 100644 crates/benilla-world/src/terrain_stream/merge.rs diff --git a/crates/benilla-app/src/entities/wmo_props.rs b/crates/benilla-app/src/entities/wmo_props.rs index 2ae53709..0dd1e4c2 100644 --- a/crates/benilla-app/src/entities/wmo_props.rs +++ b/crates/benilla-app/src/entities/wmo_props.rs @@ -61,7 +61,7 @@ use benilla_world::model_render::ShadeSel; use benilla_world::particles; use benilla_world::terrain_stream::{ build_collider_task, fold_interior_probe, m2_anim_bound, m2_fade, placement_collider_data, - point_light, spawn_model_entities, PendingCollider, PropLobeLight, + point_light, spawn_model_entities, PendingCollider, PropLobeLight, SpawnedModel, }; use super::{GameObjects, ModelHandle, VisualAttached}; @@ -260,7 +260,11 @@ pub(super) fn spawn_wmo_gameobject_props( } slot }); - let (ents, host) = spawn_model_entities( + let SpawnedModel { + entities: ents, + host, + .. + } = spawn_model_entities( &mut commands, mat_cache, materials, @@ -281,8 +285,10 @@ pub(super) fn spawn_wmo_gameobject_props( &mut tint_reg, &mut anim_table, card_owner, - // Never diverted into the WOW_MEGA_STATIC bracket: these props parent under a - // MOVING gameobject, and a merged blob bakes world transforms. + // Never diverted into the WOW_MEGA_STATIC bracket (nor 1417's production + // merge): these props parent under a MOVING gameobject, and a merged blob + // bakes world transforms. + None, None, ); commands.entity(entity).add_children(&ents); diff --git a/crates/benilla-app/src/loading_screen.rs b/crates/benilla-app/src/loading_screen.rs index 51a1efd0..0ce214b6 100644 --- a/crates/benilla-app/src/loading_screen.rs +++ b/crates/benilla-app/src/loading_screen.rs @@ -467,12 +467,14 @@ fn drive_loading_screen( screen.last_wait_log = now; info!( "loading screen: waiting {:.1}s — {}/{} resident, {} placements pending, \ - {} colliders pending, awaiting_snap={}, settling={}, warm={}, ui_pending={}", + {} colliders pending, {} merges pending, awaiting_snap={}, settling={}, \ + warm={}, ui_pending={}", now - screen.active_since, progress.ready, progress.total, progress.placements_pending, progress.colliders_pending, + progress.merge_pending, screen.awaiting_snap, player_settling, warm.satisfied(), diff --git a/crates/benilla-app/src/player/world_focus.rs b/crates/benilla-app/src/player/world_focus.rs index d2fac828..2b7a48c5 100644 --- a/crates/benilla-app/src/player/world_focus.rs +++ b/crates/benilla-app/src/player/world_focus.rs @@ -105,7 +105,7 @@ pub(super) fn release_post_snap_hold( mut player: ResMut, progress: Option>, time: Res