9.5 KiB
WMO Runtime Mesh Finalizer
Metadata
| Field | Value |
|---|---|
| Status | Implemented extraction |
| Target/work package | M03 / M03-RND-WMO-RUNTIME-MESH-FINALIZER-001 |
| Owners | Cached WMO runtime Mesh refresh version, surface iteration and material reconstruction |
| Last verified | Worktree work/sindo-main-codex/m03-wmo-runtime-mesh-finalizer, 2026-07-18 |
| Profiles/capabilities | Profile-independent cached WMO material refresh |
Purpose
Finalize stale cached WMO runtime Mesh materials outside
StreamingWorldLoader: preserve exact Mesh identity, stamp the historical
refresh version and reconstruct eligible surface materials through WMOBuilder.
Non-goals
- Traverse scene Nodes or own Mesh/MultiMesh attachment and lifetime.
- Select WMO cache paths, poll ResourceLoader or schedule render build jobs.
- Change WMOBuilder shaders, textures, blend rules or cache serialization.
- Share an abstraction with the behaviorally different M2 finalizer.
Context and boundaries
flowchart LR
Loader[StreamingWorldLoader traversal/build step] -->|Mesh plus extracted directory| Finalizer[WmoRuntimeMeshFinalizer]
Finalizer -->|material definition plus compact texture paths| Builder[WMOBuilder material boundary]
Builder -->|rebuilt Material| Finalizer
Finalizer -->|same Mesh identity| Loader
The loader owns scene traversal and composition. The finalizer owns only the in-place Resource operation and depends on an injected WMO material builder.
Public API
| Symbol | Kind | Purpose | Thread/lifetime | Errors |
|---|---|---|---|---|
finalize_mesh(mesh, extracted_directory) |
Command/query | Stamp and refresh a stale Mesh in place | Renderer main thread; stateless between calls | Null returns null; unsupported Mesh returns exact identity |
rebuild_cached_material(material, extracted_directory) |
Query/boundary | Reconstruct one metadata-bearing cached WMO Material | Renderer main thread; borrowed input | Null/unmarked/missing builder returns null |
Inputs and outputs
| Direction | Contract/data | Producer | Consumer | Ownership | Thread/lifetime |
|---|---|---|---|---|---|
| Input | Mesh and refresh metadata |
Cached WMO scene/render group | Finalizer | Borrowed Resource | Call duration; identity retained |
| Input | Extracted content directory | Loader configuration | WMOBuilder | Borrowed String value | Call duration |
| Input | Texture paths, WMO flags/shader/blend and cached colors | Surface Material metadata/parameters | Finalizer | Borrowed values | One surface rebuild |
| Output | Compact texture-path array and material definition | Finalizer | WMOBuilder | Detached values | One builder call |
| Output | Rebuilt Material | WMOBuilder | ArrayMesh surface | Surface adopts exact Resource | Mesh lifetime |
| Output | Exact input Mesh | Finalizer | Loader traversal/build step | Caller retains ownership | Existing cache/scene lifetime |
Data flow
flowchart TD
Mesh[Borrowed Mesh] --> Null{Null?}
Null -->|yes| ReturnNull[Return null]
Null -->|no| Current{Refresh version at least 10?}
Current -->|yes| ReturnSame[Return exact Mesh]
Current -->|no| Stamp[Stamp version 10]
Stamp --> Array{ArrayMesh?}
Array -->|no| ReturnSame
Array -->|yes| Surface[Iterate surfaces]
Surface --> Eligible{Material has texture0 metadata?}
Eligible -->|no| Keep[Keep exact Material]
Eligible -->|yes| Definition[Compact paths and copy metadata/colors]
Definition --> Builder[WMOBuilder build material]
Builder --> Result{Non-null result?}
Result -->|yes| Adopt[Replace surface Material]
Result -->|no| Keep
Keep --> Surface
Adopt --> Surface
Surface -->|done| ReturnSame
Lifecycle/state
stateDiagram-v2
[*] --> Stale: missing/version below 10
[*] --> Current: version at least 10
Stale --> Current: stamp before optional surface refresh
Current --> Current: subsequent calls are identity-only
The version stamp is intentionally applied before type/material eligibility, as in the extracted loader behavior. The finalizer retains no Mesh or Material.
Main sequence
sequenceDiagram
participant Loader as StreamingWorldLoader
participant Finalizer as WmoRuntimeMeshFinalizer
participant Mesh as ArrayMesh
participant Builder as WMOBuilder
Loader->>Finalizer: finalize_mesh(mesh, extracted_directory)
Finalizer->>Mesh: read/stamp refresh metadata
loop each stale ArrayMesh surface
Finalizer->>Mesh: surface_get_material(index)
alt cached WMO metadata exists
Finalizer->>Builder: _build_material(definition, compact paths, directory)
Builder-->>Finalizer: rebuilt Material or null
Finalizer->>Mesh: surface_set_material when non-null
end
end
Finalizer-->>Loader: exact Mesh identity
Dependency diagram
flowchart TB
Loader[StreamingWorldLoader] --> Finalizer[WmoRuntimeMeshFinalizer]
Finalizer --> Engine[Mesh / ArrayMesh / Material]
Finalizer --> Builder[Injected WMO material builder]
Finalizer -. no dependency .-> Nodes[Node traversal/lifetime]
Finalizer -. no dependency .-> RL[ResourceLoader]
Finalizer -. no dependency .-> Queue[Build queue/scheduler]
Ownership, threading and resources
- The renderer main thread serializes Mesh metadata and surface mutation.
- The caller owns Mesh identity, scene traversal, attachment and destruction.
- ArrayMesh surfaces adopt only non-null builder results; otherwise the exact cached Material remains attached.
- The service retains no Resource, Node, RID, file, queue or per-path state.
Errors, cancellation and recovery
| Failure/state | Detection | Behavior | Diagnostic | Recovery |
|---|---|---|---|---|
| Null Mesh | Guard | Return null | Synthetic contract | Correct caller input |
| Current Mesh | Version metadata | Return exact identity, no builder call | Identity/version contract | Version bump makes it stale |
| Unsupported Mesh subtype | Type check after stamp | Return exact identity | PrimitiveMesh contract | No surface work required |
| Null/unmarked Material | Metadata guard | Preserve exact surface value | Surface contract | Rebuild cache with metadata |
| Missing builder/null result | Boundary guard/result | Preserve exact Material | Synthetic contract | Correct composition/retry after version bump |
| Shutdown | Loader lifecycle | No retained work to cancel | Shutdown suite | New loader composes a new service |
Configuration and capabilities
Refresh version 10 and metadata key wow_wmo_material_refresh_version are the
existing runtime compatibility boundary. No project setting, profile, permit or
feature flag is introduced.
Persistence, cache and migration
The module writes only the existing runtime Mesh metadata stamp and serializes nothing. It does not change WMO scene/render cache formats or trigger rebakes. A future material-rule change must deliberately bump the refresh version.
Diagnostics and observability
The finalizer emits no logs and allocates no metrics. Existing wmobuild queue
metrics and loader diagnostics remain the operational correlation surface.
Verification
verify_wmo_runtime_mesh_finalizer.gd: null/current/non-ArrayMesh identity, version stamp, null/unmarked surface retention, compact path indices, flags/shader/blend/default and shader colors, exact builder adoption, missing-builder behavior, source ownership and 1,000 current calls under one second.- Adjacent WMO queue/cache/finalizer, shutdown, material and baseline regressions protect orchestration and visible output.
- Fidelity evidence is exact behavior-preserving extraction; no private asset or original-client visual-parity claim is added.
Extension points
- Asset-backed WMO fixtures may compare reconstructed surface parameters without changing the service contract.
- A deliberate material refresh change may bump the owned version with old/new fixtures and paired visual evidence.
Capability status
| Capability | Status | Evidence | Gap/next step |
|---|---|---|---|
| Runtime refresh admission | Implemented extraction | Identity/version/type contracts | Serialized cache fixture pending |
| Cached material definition reconstruction | Implemented extraction | Path/metadata/color contracts | Asset-backed visual comparison pending |
| Scene traversal/materialization | Loader-owned | Existing WMO regressions | Further safe extraction pending |
Known gaps and risks
- Surface mutation and WMOBuilder material construction remain synchronous main-thread work.
- No proprietary WMO corpus, long leak run, GPU timing, traversal p95/p99 or paired build-12340 visual capture is included.
Source map
| Path | Responsibility |
|---|---|
src/render/wmo/wmo_runtime_mesh_finalizer.gd |
Refresh admission, surface iteration and material definition reconstruction |
addons/mpq_extractor/loaders/wmo_builder.gd |
WMO shader/material construction semantics |
src/scenes/streaming/streaming_world_loader.gd |
Composition, Node traversal, build jobs and lifetime |
src/tools/verify_wmo_runtime_mesh_finalizer.gd |
Identity/version/material/source/timing regression |