diff --git a/crates/fparkan-assets/src/lib.rs b/crates/fparkan-assets/src/lib.rs index 423e6ec..31f4301 100644 --- a/crates/fparkan-assets/src/lib.rs +++ b/crates/fparkan-assets/src/lib.rs @@ -458,8 +458,10 @@ pub struct AssetPreparationReport { /// Asset preparation checkpoint emitted while resolving visual dependencies. #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum AssetPreparationPhase { - /// Decode a model and its corresponding WEAR table. - ModelAndWear, + /// Decode and validate an MSH model. + ModelMesh, + /// Decode the corresponding WEAR table. + WearTable, /// Resolve MAT0 material documents referenced by a WEAR table. Materials, /// Decode diffuse textures and baked lightmaps. @@ -1513,7 +1515,7 @@ fn prepare_visual_with_repository_internal( }); }; - on_phase(AssetPreparationPhase::ModelAndWear); + on_phase(AssetPreparationPhase::ModelMesh); let model = prepare_model_cached(repository, mesh_key, preparation_cache)?; let model_id = AssetId::new((identity_policy.model)(proto)); let prepared_model = PreparedModel { @@ -1529,6 +1531,7 @@ fn prepare_visual_with_repository_internal( name: wear_name, type_id: Some(WEAR_KIND), }; + on_phase(AssetPreparationPhase::WearTable); let wear = prepare_wear_cached(repository, &wear_key, preparation_cache)?; let wear_id = AssetId::new((identity_policy.wear)(proto)); let prepared_wear = PreparedWear { diff --git a/crates/fparkan-runtime/src/lib.rs b/crates/fparkan-runtime/src/lib.rs index 88b4bd1..9a35d65 100644 --- a/crates/fparkan-runtime/src/lib.rs +++ b/crates/fparkan-runtime/src/lib.rs @@ -120,8 +120,10 @@ pub enum MissionLoadPhase { GraphVisuals, /// Prepare all reachable visual/resource dependencies. Assets, - /// Decode model meshes and their WEAR tables. - AssetModels, + /// Decode and validate MSH model meshes. + AssetModelMeshes, + /// Decode WEAR material tables. + AssetWearTables, /// Resolve MAT0 material documents. AssetMaterials, /// Decode diffuse textures and baked lightmaps. @@ -707,7 +709,8 @@ fn load_mission_with_options_and_progress( let mut last_asset_phase = None; let mut observe_asset_phase = |phase| { let runtime_phase = match phase { - AssetPreparationPhase::ModelAndWear => MissionLoadPhase::AssetModels, + AssetPreparationPhase::ModelMesh => MissionLoadPhase::AssetModelMeshes, + AssetPreparationPhase::WearTable => MissionLoadPhase::AssetWearTables, AssetPreparationPhase::Materials => MissionLoadPhase::AssetMaterials, AssetPreparationPhase::Textures => MissionLoadPhase::AssetTextures, }; diff --git a/docs/tomes/05-render.md b/docs/tomes/05-render.md index e39f753..82e964d 100644 --- a/docs/tomes/05-render.md +++ b/docs/tomes/05-render.md @@ -1063,14 +1063,15 @@ provenance while avoiding repeat format work for repeated components. The same demonstrate an additional checkpoint advance from this cache; it must not be reported as a measured startup improvement. -`Assets` now has three ordered diagnostic sub-checkpoints: `AssetModels` -(MSH and WEAR), `AssetMaterials` (MAT0) and `AssetTextures` (diffuse TEXM and -lightmaps). The callback is observational: it neither changes the preparation -order nor deduplicates requests. A fresh controlled 60-second canonical GOG -`Autodemo.00` first-root probe reached `AssetModels` and did not reach +`Assets` now has four ordered diagnostic sub-checkpoints: `AssetModelMeshes` +(MSH), `AssetWearTables` (WEAR), `AssetMaterials` (MAT0) and `AssetTextures` +(diffuse TEXM and lightmaps). The callback is observational: it neither changes +the preparation order nor deduplicates requests. A fresh controlled 60-second +canonical GOG `Autodemo.00` first-root probe reached `AssetWearTables` but not `AssetMaterials`; its created process was terminated and no native frame was -reported. This narrows the next investigation to model/WEAR preparation, but -does not by itself attribute the delay to either decoder or I/O. +reported. At least one MSH therefore finished before the timeout, but this does +not attribute the remaining interval to WEAR decoding rather than later +MSH/WEAR iteration or archive I/O. The same source-axis proof now applies to `TerrainWorld`: its `Land.msh` surface height query and `Land.map` areal/grid lookup use XY ground coordinates, return