From cf6eaba53473d2825d0109f5a18f44794af5bd48 Mon Sep 17 00:00:00 2001 From: Rbanh Date: Fri, 17 Jul 2026 23:40:49 -0400 Subject: [PATCH] feat: complete M2 content workspace and inspector --- .../skills/blacksite-build-storage/SKILL.md | 23 + .../references/build-storage-policy.md | 27 + .../skills/blacksite-doc-integrity/SKILL.md | 21 + .../references/documentation-authority.md | 16 + .agents/skills/blacksite-editor-ux/SKILL.md | 14 + .../references/editor-ux-rubric.md | 29 + .agents/skills/blacksite-gitea-sync/SKILL.md | 20 + .../references/gitea-state-model.md | 14 + .agents/skills/blacksite-native-qa/SKILL.md | 18 + .../references/scenario-format.md | 41 + .../content-browser-card-layout.yaml | 20 + .../scenarios/material-slot-live-edit.yaml | 26 + .../scenarios/penpot-material-inspector.yaml | 27 + .../blacksite-release-candidate/SKILL.md | 17 + .../references/release-gates.md | 14 + .../blacksite-selective-verify/SKILL.md | 18 + .../references/verification-matrix.md | 19 + .agents/skills/blacksite-task-state/SKILL.md | 19 + .cargo/config.toml | 2 +- .codex/ARCHITECTURE.md | 14 + .codex/architecture.toml | 34 + .codex/config.toml | 2 + .codex/templates/GITEA_STATUS_COMMENT.md | 19 + .codex/templates/SCOPE_DELTA.md | 7 + .codex/templates/SESSION_STATE.md | 36 + .codex/workflow.toml | 81 + .../animation_authoring_2026-07-11.plan.md | 2 + .../plans/audio_authoring_2026-07-10.plan.md | 2 + ...te_production_readiness_2026-07-10.plan.md | 2 + .../collider_diagnostics_2026-07-12.plan.md | 2 + ...mponent_system_refactor_2026-06-05.plan.md | 2 + ...ce_and_import_authoring_2026-07-13.plan.md | 456 ++ ...stic_asset_fingerprints_2026-07-13.plan.md | 2 + ..._sample_regression_pack_2026-07-13.plan.md | 2 + ...al_texture_dependencies_2026-07-13.plan.md | 2 + ...ded_shutdown_savepoints_2026-07-13.plan.md | 2 + ...jackdaw_feature_roadmap_2026-06-06.plan.md | 57 +- ...brary_and_targeted_drop_2026-07-12.plan.md | 2 + .../navigation_authoring_2026-07-11.plan.md | 2 + ...blocking_native_dialogs_2026-07-12.plan.md | 2 + ...r_invariants_completion_2026-07-12.plan.md | 2 + .../physics_placement_2026-07-12.plan.md | 2 + ...on_readiness_acceptance_2026-07-12.plan.md | 2 + .../plans/project_roadmap_8a452d43.plan.md | 4 +- ...r_foundation_acceptance_2026-07-12.plan.md | 2 + ...al_component_foundation_2026-07-11.plan.md | 2 + .../rendering_unification_2026-06-05.plan.md | 2 + ...ol_collaboration_safety_2026-07-12.plan.md | 2 + ...tic_mesh_asset_refactor_2026-06-05.plan.md | 2 + ...in_authoring_foundation_2026-07-12.plan.md | 2 + ...terrain_material_layers_2026-07-12.plan.md | 2 + .../terrain_sculpt_tools_2026-07-12.plan.md | 2 + .cursor/rules/documentation.mdc | 43 +- .gitattributes | 1 + .github/workflows/ci.yml | 3 + .gitignore | 11 +- .vscode/launch.json | 58 - .vscode/tasks.json | 106 +- AGENTS.md | 191 +- Cargo.lock | 498 +- Cargo.toml | 4 + README.md | 125 +- .../76a589e4456ec3320b876209-arm.basis | 3 + .../c6f971e303a67229b09c1283-arm.basis | 3 + .../297372611543b1f7baa1e5e3-arm.basis | 3 + .../76a589e4456ec3320b876209-arm.basis | 3 + .../c6f971e303a67229b09c1283-arm.basis | 3 + .../3ecc62c0eaf1672ca08fb59f/texture.basis | 3 + .../552b39094506da0fbf4cd647/texture.basis | 3 + .../edf8ef1b2fc54bbe4eafc16d/texture.basis | 3 + .../534c0d384d22c554b9597064/texture.basis | 3 + .../cd1c550f437632f394bf7502/texture.basis | 3 + .../944b70940e3dd9a70e851d0e/texture.basis | 3 + .../2276a96b1a148fd7c16977d5/texture.basis | 3 + .../d0ec4224c3dcb6fa565c94bb/texture.basis | 3 + .../534c0d384d22c554b9597064/texture.basis | 3 + .../cd1c550f437632f394bf7502/texture.basis | 3 + .../edf8ef1b2fc54bbe4eafc16d/texture.basis | 3 + .../cd1c550f437632f394bf7502/texture.basis | 3 + .../edf8ef1b2fc54bbe4eafc16d/texture.basis | 3 + .../644db179a14573b2a514e68f/texture.basis | 3 + .../534c0d384d22c554b9597064/texture.basis | 3 + assets/.index/registry.ron | 1764 +++--- .../Office/blacksite-m2-robot-expressive.glb | 3 + assets/Furniture/Office/metal_office_desk.bin | Bin 0 -> 229700 bytes .../Office/metal_office_desk.material.ron | 116 + .../Office/metal_office_desk_2k.gltf | 3 + .../textures/metal_office_desk_arm_2k.jpg | 3 + .../textures/metal_office_desk_diff_2k.jpg | 3 + .../textures/metal_office_desk_nor_gl_2k.jpg | 3 + ...-e39c-41d4-9b5b-e48efe541f7f.animation.ron | 3 +- ...-89ca-4307-b8d9-cb77fca41907.animation.ron | 21 + ...-29ae-4ab1-aaca-f90f57e27966.animation.ron | 21 + ...-45eb-4cb2-8970-71921cbd7bd0.animation.ron | 3 +- ...-fc17-4703-b9ea-e4eb49a8c7fc.animation.ron | 235 + ...-3500-49e7-9935-f685fa9b2594.animation.ron | 3 +- ...-5ea8-48ef-b0db-5b1d57f33885.animation.ron | 21 + assets/content.catalog.ron | 909 ++++ .../levels/audio_authoring_showcase.scn.ron | 2 +- .../collider_diagnostics_showcase.scn.ron | 295 +- assets/levels/editor_scene 2.scn.ron | 812 ++- assets/levels/editor_scene 3.scn.ron | 1066 ++-- assets/levels/editor_scene.scn.ron | 1578 +++--- .../navigation_authoring_showcase.scn.ron | 14 +- .../levels/physics_placement_showcase.scn.ron | 235 +- assets/levels/rendering_showcase.scn.ron | 327 +- assets/levels/samples/brush_blockout.scn.ron | 147 +- assets/levels/samples/material_lab.scn.ron | 292 +- .../levels/terrain_authoring_showcase.scn.ron | 47 +- assets/materials/chrome.ron | 50 + assets/materials/concrete.ron | 105 +- assets/materials/emissive_panel.ron | 68 +- .../legacy-05a00cdd0a637f9e.material.ron | 50 + .../legacy-082ba03b8cbb710b.material.ron | 50 + .../legacy-0a21ebb8e495bf57.material.ron | 50 + .../legacy-1a259303a97c4ba9.material.ron | 50 + .../legacy-2b86cae1d3bfacae.material.ron | 50 + .../legacy-3546762bbff37951.material.ron | 50 + .../legacy-454bcd95aaa4f1ca.material.ron | 50 + .../legacy-4f65eccbb7dac1a2.material.ron | 50 + .../legacy-62ef60a686be94f1.material.ron | 50 + .../legacy-77cc6503f24bb9e8.material.ron | 50 + .../legacy-78bc49856f47eae1.material.ron | 50 + .../legacy-964101ee77293501.material.ron | 50 + .../legacy-97356bd0ac2f6198.material.ron | 50 + .../legacy-9a630ee3e4848d9d.material.ron | 50 + .../legacy-a74f874eafd5d224.material.ron | 50 + .../legacy-b278a62978900638.material.ron | 85 + .../legacy-c656429ce3668694.material.ron | 85 + .../legacy-c6c02ef278fba7c3.material.ron | 50 + .../legacy-c6fbbebd3e1a9943.material.ron | 50 + .../legacy-c9d05c61e5cf348d.material.ron | 50 + .../legacy-cc0396f5c90fb7bb.material.ron | 50 + .../legacy-e9671004b101f4df.material.ron | 50 + .../legacy-fc132d9b30cc63d4.material.ron | 89 + assets/materials/new_material.ron | 50 + assets/materials/new_material_2.ron | 50 + assets/materials/pebble_bricks.bin | Bin 0 -> 2370260 bytes assets/materials/pebble_bricks.ron | 128 + assets/materials/pebble_bricks_4k.gltf | 3 + assets/materials/surface_tint.ron | 120 +- assets/materials/surface_tint_instance.ron | 31 +- .../textures/pebble_bricks_arm_4k.jpg | 3 + .../textures/pebble_bricks_diff_4k.jpg | 3 + .../textures/pebble_bricks_nor_gl_4k.jpg | 3 + ...39c-41d4-9b5b-e48efe541f7f.static_mesh.ron | 5 +- ...9ca-4307-b8d9-cb77fca41907.static_mesh.ron | 193 + ...9ae-4ab1-aaca-f90f57e27966.static_mesh.ron | 249 + ...5eb-4cb2-8970-71921cbd7bd0.static_mesh.ron | 5 +- ...c17-4703-b9ea-e4eb49a8c7fc.static_mesh.ron | 361 ++ ...500-49e7-9935-f685fa9b2594.static_mesh.ron | 8 +- ...ea8-48ef-b0db-5b1d57f33885.static_mesh.ron | 67 + assets/models/metal_office_desk.bin | Bin 0 -> 229700 bytes assets/models/metal_office_desk_2k.gltf | 3 + .../textures/metal_office_desk_arm_2k.jpg | 3 + .../textures/metal_office_desk_diff_2k.jpg | 3 + .../textures/metal_office_desk_nor_gl_2k.jpg | 3 + ...cks_surface_instance.material-instance.ron | 14 + assets/prefabs/example_base.scn.ron | 2 +- assets/prefabs/example_nested.scn.ron | 2 +- assets/prefabs/example_variant.scn.ron | 2 +- assets/project.ron | 22 +- assets/shaders/standard_lit.shader.ron | 204 +- assets/shaders/surface_tint.shader.ron | 162 +- assets/shaders/unlit.shader.ron | 106 +- assets/textures/metal_office_desk_arm_2k.jpg | 3 + assets/textures/metal_office_desk_diff_2k.jpg | 3 + .../textures/metal_office_desk_nor_gl_2k.jpg | 3 + crates/blacksite_surface/src/lib.rs | 1131 +--- .../blacksite_surface/src/live_documents.rs | 67 + .../src/surface/cache_plugin.rs | 138 + .../blacksite_surface/src/surface/packing.rs | 229 + .../src/surface/property_blocks.rs | 523 ++ .../blacksite_surface/src/surface/resolver.rs | 541 ++ .../src/surface/surface_abi.rs | 131 + .../blacksite_surface/src/surface/terrain.rs | 229 + .../src/surface/terrain_types.rs | 76 + crates/blacksite_surface/src/surface/tests.rs | 727 +++ .../src/surface/validation.rs | 81 + crates/content_pipeline/AGENTS.md | 12 + crates/content_pipeline/Cargo.toml | 24 + crates/content_pipeline/src/animation.rs | 912 ++++ crates/content_pipeline/src/fingerprint.rs | 111 + crates/content_pipeline/src/import.rs | 1497 +++++ crates/content_pipeline/src/lib.rs | 868 +++ crates/content_pipeline/src/pbr_grouping.rs | 302 + crates/content_pipeline/src/static_mesh.rs | 963 ++++ crates/content_pipeline/src/texture.rs | 978 ++++ crates/content_pipeline/src/transaction.rs | 1544 ++++++ crates/content_pipeline/src/trash.rs | 605 +++ crates/content_pipeline/src/watcher.rs | 187 + crates/editor/AGENTS.md | 21 + crates/editor/Cargo.toml | 2 + .../assets/fonts/source-sans/LICENSE.md | 93 + .../fonts/source-sans/SourceSansPro-Bold.ttf | Bin 0 -> 253344 bytes .../source-sans/SourceSansPro-Regular.ttf | Bin 0 -> 254076 bytes crates/editor/src/assets/animation.rs | 905 +-- crates/editor/src/assets/asset_db.rs | 540 +- crates/editor/src/assets/catalog.rs | 1011 +++- .../src/assets/catalog/content_watch.rs | 548 ++ crates/editor/src/assets/fingerprint.rs | 115 +- crates/editor/src/assets/import.rs | 569 +- crates/editor/src/assets/materials.rs | 22 +- crates/editor/src/assets/mod.rs | 30 +- crates/editor/src/assets/operators.rs | 21 +- crates/editor/src/assets/static_mesh.rs | 856 +-- crates/editor/src/assets/thumbnails/cache.rs | 252 +- crates/editor/src/assets/thumbnails/mod.rs | 8 +- .../src/assets/thumbnails/sources/gltf.rs | 48 +- crates/editor/src/assets/thumbnails/studio.rs | 18 + crates/editor/src/infra.rs | 33 +- crates/editor/src/lib.rs | 3 + crates/editor/src/project/asset_documents.rs | 51 + .../document_store/live_updates.rs | 111 + .../document_store/processing.rs | 304 ++ .../document_store/publication.rs | 456 ++ .../document_store/recovery.rs | 608 +++ .../asset_documents/document_store/service.rs | 320 ++ .../asset_documents/document_store/store.rs | 338 ++ .../asset_documents/processing_impact.rs | 134 + crates/editor/src/project/collaboration.rs | 37 +- crates/editor/src/project/launcher.rs | 17 +- crates/editor/src/project/mod.rs | 1 + crates/editor/src/project/session.rs | 8 +- crates/editor/src/project/settings_ui.rs | 113 +- crates/editor/src/project/shutdown.rs | 72 +- crates/editor/src/render_target.rs | 55 +- crates/editor/src/scene/scene_io.rs | 96 +- crates/editor/src/scene/scene_view.rs | 7 +- .../editor/src/ui/actor_inspector/layout.rs | 63 + crates/editor/src/ui/actor_inspector/mod.rs | 143 +- .../src/ui/actor_inspector/transform.rs | 32 +- crates/editor/src/ui/animation_inspector.rs | 4 +- crates/editor/src/ui/asset_browser/mod.rs | 6 +- crates/editor/src/ui/asset_browser/panel.rs | 4607 +--------------- .../src/ui/asset_browser/panel/details.rs | 439 ++ .../src/ui/asset_browser/panel/embedded.rs | 374 ++ .../ui/asset_browser/panel/file_operations.rs | 544 ++ .../editor/src/ui/asset_browser/panel/grid.rs | 567 ++ .../ui/asset_browser/panel/import_settings.rs | 566 ++ .../editor/src/ui/asset_browser/panel/list.rs | 406 ++ .../panel/material_extraction.rs | 640 +++ .../src/ui/asset_browser/panel/navigation.rs | 506 ++ .../asset_browser/panel/pbr_transactions.rs | 595 ++ .../src/ui/asset_browser/panel/tests/a.rs | 455 ++ .../src/ui/asset_browser/panel/tests/b.rs | 481 ++ .../ui/asset_browser/panel/toolbar_import.rs | 557 ++ .../src/ui/asset_browser/panel/undo_trash.rs | 725 +++ .../src/ui/asset_browser/panel/utilities.rs | 761 +++ .../src/ui/asset_browser/panel/validation.rs | 32 + crates/editor/src/ui/asset_browser/state.rs | 141 +- crates/editor/src/ui/asset_card.rs | 225 + crates/editor/src/ui/audio_inspector.rs | 2 +- crates/editor/src/ui/build.rs | 18 + crates/editor/src/ui/component_registry.rs | 86 +- .../src/ui/component_registry/dispatch.rs | 28 + .../editor/src/ui/component_registry/tests.rs | 37 + .../src/ui/design_system/color_picker.rs | 308 ++ .../ui/design_system/color_picker/popup.rs | 765 +++ .../color_picker/popup/sliders.rs | 167 + .../editor/src/ui/design_system/controls.rs | 356 ++ crates/editor/src/ui/design_system/mod.rs | 154 + .../src/ui/design_system/property_grid.rs | 260 + .../editor/src/ui/design_system/typography.rs | 80 + crates/editor/src/ui/document_status.rs | 38 + crates/editor/src/ui/fonts.rs | 39 +- crates/editor/src/ui/hierarchy.rs | 10 +- crates/editor/src/ui/inspector.rs | 4833 +---------------- .../src/ui/inspector/asset_selectors.rs | 544 ++ .../editor/src/ui/inspector/brush_terrain.rs | 578 ++ .../editor/src/ui/inspector/component_add.rs | 452 ++ .../src/ui/inspector/component_chrome.rs | 518 ++ .../src/ui/inspector/component_lifecycle.rs | 772 +++ crates/editor/src/ui/inspector/dispatch.rs | 383 ++ .../ui/inspector/imported_material_preview.rs | 108 + .../editor/src/ui/inspector/material_slots.rs | 728 +++ .../editor/src/ui/inspector/mesh_renderers.rs | 425 ++ .../src/ui/inspector/primitive_domains.rs | 612 +++ .../src/ui/inspector/property_blocks.rs | 655 +++ .../editor/src/ui/inspector/renderer_panel.rs | 124 + .../editor/src/ui/inspector/sun_textures.rs | 326 ++ crates/editor/src/ui/inspector/tests/a.rs | 228 + crates/editor/src/ui/inspector/tests/b.rs | 228 + crates/editor/src/ui/layout.rs | 90 +- crates/editor/src/ui/material_library.rs | 176 +- crates/editor/src/ui/material_library/list.rs | 101 + .../src/ui/materials/advanced_preview.rs | 281 + .../editor/src/ui/materials/asset_editor.rs | 228 + crates/editor/src/ui/materials/editor.rs | 541 ++ crates/editor/src/ui/materials/inputs.rs | 648 +++ .../src/ui/materials/instance_editor.rs | 199 + .../src/ui/materials/instance_inputs.rs | 158 + crates/editor/src/ui/materials/layout.rs | 343 ++ crates/editor/src/ui/materials/mod.rs | 113 + crates/editor/src/ui/materials/panel.rs | 743 +++ crates/editor/src/ui/materials/pickers.rs | 411 ++ .../editor/src/ui/materials/texture_inputs.rs | 408 ++ .../editor/src/ui/materials/uv_transform.rs | 131 + crates/editor/src/ui/menu.rs | 30 +- crates/editor/src/ui/mod.rs | 67 +- crates/editor/src/ui/scene_tabs.rs | 2 +- crates/editor/src/ui/status_bar.rs | 19 +- crates/editor/src/ui/theme.rs | 182 +- crates/editor/src/ui/toolbar.rs | 4 +- crates/editor/src/ui/viewport_chrome.rs | 35 +- crates/editor/src/ui/widgets.rs | 8 +- crates/editor/src/viewport/material_drop.rs | 143 +- crates/editor/src/viewport/mod.rs | 1 + .../editor/src/viewport/target_presenter.rs | 104 + crates/game/src/launch.rs | 34 +- crates/game/src/lib.rs | 11 +- crates/scene/Cargo.toml | 1 + crates/scene/src/document.rs | 2 +- crates/scene/src/lib.rs | 20 +- crates/scene/src/migrate.rs | 9 + crates/scene/src/project_validation.rs | 220 +- crates/scene/src/sample_pack.rs | 7 +- crates/scene/src/upgrade.rs | 998 +++- crates/scene/src/upgrade/io.rs | 26 + crates/settings/src/lib.rs | 19 +- crates/settings/src/plugin.rs | 20 +- crates/shared/AGENTS.md | 8 + crates/shared/Cargo.toml | 1 + crates/shared/src/animation.rs | 4 +- crates/shared/src/components.rs | 192 +- crates/shared/src/content.rs | 693 +++ crates/shared/src/hydration/brushes.rs | 35 +- crates/shared/src/hydration/materials.rs | 162 +- crates/shared/src/hydration/mod.rs | 154 +- crates/shared/src/hydration/primitives.rs | 14 +- crates/shared/src/hydration/skinned_meshes.rs | 39 +- crates/shared/src/hydration/static_meshes.rs | 223 +- crates/shared/src/lib.rs | 46 +- crates/shared/src/material_asset.rs | 708 ++- crates/shared/src/material_desc.rs | 176 + crates/shared/src/prefab_overrides.rs | 21 +- crates/shared/src/renderer_material.rs | 102 +- docs/AGENTS.md | 9 + docs/README.md | 60 +- docs/adr/0014-unified-viewport-model.md | 10 + ...ared-material-assets-and-renderer-slots.md | 84 +- .../adr/0036-surface-abi-and-solari-parity.md | 2 + ...0037-collaborative-authored-file-safety.md | 2 + ...editor-shutdown-and-document-savepoints.md | 2 + ...boxed-fbx-external-texture-dependencies.md | 19 +- ...orkspace-and-material-fallback-contract.md | 90 + ...-material-inputs-and-processed-textures.md | 55 + .../0047-editor-authored-asset-documents.md | 71 + ...lar-editor-composition-and-debt-ratchet.md | 52 + .../0049-penpot-led-editor-visual-system.md | 119 + docs/archive/README.md | 9 + docs/authority.toml | 307 ++ .../Bevy_Editor_Component_System_Spec.md | 2 + docs/editor/README.md | 19 +- docs/editor/architecture.md | 54 +- docs/editor/brp.md | 17 +- docs/editor/content-workspace.md | 200 + docs/editor/debt-audit.md | 6 + docs/editor/design-system.md | 153 + docs/editor/evaluations/README.md | 15 +- .../collaborative-file-safety/README.md | 2 + .../collider-diagnostics/README.md | 2 + .../content-workspace-m2/README.md | 205 + .../content-workspace-m2/penpot/README.md | 40 + .../penpot/array-header-40.svg | 14 + .../penpot/color-picker-adjusted.svg | 14 + .../penpot/color-picker-presets.svg | 14 + .../penpot/color-picker-sliders.svg | 14 + .../penpot/color-picker-wheel.svg | 14 + .../penpot/component-composition-rule.svg | 14 + .../penpot/component-header-50.svg | 14 + .../penpot/foundation-components-catalog.svg | 14 + .../penpot/material-components-states.svg | 14 + .../penpot/materials-narrow-420.svg | 14 + .../penpot/materials-wide-620.svg | 14 + .../static-mesh-renderer-narrow-480.svg | 14 + .../penpot/static-mesh-renderer-wide-760.svg | 14 + .../README.md | 2 + .../README.md | 2 + .../guarded-shutdown-savepoints/README.md | 2 + docs/editor/evaluations/h1-signoff.md | 2 +- docs/editor/evaluations/h2-signoff.md | 2 +- docs/editor/evaluations/h3-signoff.md | 2 +- docs/editor/evaluations/h4-signoff.md | 2 +- docs/editor/evaluations/h5-signoff.md | 2 +- docs/editor/evaluations/h6-signoff.md | 2 +- .../material-library-targeted-drop/README.md | 2 + .../material-renderer-foundation/README.md | 2 + .../native-dialog-responsiveness/README.md | 2 + .../navigation-authoring/README.md | 2 + .../evaluations/operator-invariants/README.md | 2 + .../evaluations/physics-placement/README.md | 2 + .../production-readiness/README.md | 16 +- .../sample-regression-pack/README.md | 2 + .../evaluations/scoped-ui-actions/README.md | 2 + .../evaluations/terrain-foundation/README.md | 2 + .../terrain-material-layers/README.md | 2 + .../terrain-sculpt-tools/README.md | 2 + docs/editor/material-system.md | 186 +- docs/editor/prefab-authoring.md | 9 +- docs/editor/project-launcher.md | 8 +- docs/editor/release-notes.md | 2 + docs/editor/rendering.md | 6 +- docs/editor/roadmap.md | 11 +- docs/editor/session-recovery.md | 10 +- docs/mission.md | 8 +- docs/workflow/build-storage-policy.md | 32 + docs/workflow/codex-workflow.md | 30 + docs/workflow/documentation-policy.md | 52 + docs/workflow/gitea-tracking-policy.md | 17 + docs/workflow/verification-policy.md | 25 + scripts/codex/architecture_audit.py | 127 + scripts/codex/build_storage.py | 1745 ++++++ scripts/codex/cargo_lane.py | 848 +++ scripts/codex/docs_audit.py | 315 ++ scripts/codex/native_qa.sh | 348 ++ scripts/codex/state.py | 995 ++++ scripts/codex/summarize_command.py | 469 ++ scripts/codex/verify.py | 1167 ++++ scripts/editor/blacksite-editor | 184 + scripts/editor/build_progress.py | 200 + scripts/editor/splash.py | 217 + scripts/editor/test_build_progress.py | 47 + source_assets/Models/metal_office_desk.bin | Bin 0 -> 229700 bytes .../Models/metal_office_desk_2k.gltf | 3 + .../textures/metal_office_desk_arm_2k.jpg | 3 + .../textures/metal_office_desk_diff_2k.jpg | 3 + .../textures/metal_office_desk_nor_gl_2k.jpg | 3 + .../pebble_bricks_4k.gltf/pebble_bricks.bin | Bin 0 -> 2370260 bytes .../pebble_bricks_4k.gltf | 3 + .../textures/pebble_bricks_arm_4k.jpg | 3 + .../textures/pebble_bricks_diff_4k.jpg | 3 + .../textures/pebble_bricks_nor_gl_4k.jpg | 3 + xtask/AGENTS.md | 8 + xtask/Cargo.toml | 9 +- xtask/src/clean_target.rs | 417 +- xtask/src/package_project.rs | 189 +- xtask/src/process_assets.rs | 239 + 438 files changed, 59749 insertions(+), 19043 deletions(-) create mode 100644 .agents/skills/blacksite-build-storage/SKILL.md create mode 100644 .agents/skills/blacksite-build-storage/references/build-storage-policy.md create mode 100644 .agents/skills/blacksite-doc-integrity/SKILL.md create mode 100644 .agents/skills/blacksite-doc-integrity/references/documentation-authority.md create mode 100644 .agents/skills/blacksite-editor-ux/SKILL.md create mode 100644 .agents/skills/blacksite-editor-ux/references/editor-ux-rubric.md create mode 100644 .agents/skills/blacksite-gitea-sync/SKILL.md create mode 100644 .agents/skills/blacksite-gitea-sync/references/gitea-state-model.md create mode 100644 .agents/skills/blacksite-native-qa/SKILL.md create mode 100644 .agents/skills/blacksite-native-qa/references/scenario-format.md create mode 100644 .agents/skills/blacksite-native-qa/references/scenarios/content-browser-card-layout.yaml create mode 100644 .agents/skills/blacksite-native-qa/references/scenarios/material-slot-live-edit.yaml create mode 100644 .agents/skills/blacksite-native-qa/references/scenarios/penpot-material-inspector.yaml create mode 100644 .agents/skills/blacksite-release-candidate/SKILL.md create mode 100644 .agents/skills/blacksite-release-candidate/references/release-gates.md create mode 100644 .agents/skills/blacksite-selective-verify/SKILL.md create mode 100644 .agents/skills/blacksite-selective-verify/references/verification-matrix.md create mode 100644 .agents/skills/blacksite-task-state/SKILL.md create mode 100644 .codex/ARCHITECTURE.md create mode 100644 .codex/architecture.toml create mode 100644 .codex/config.toml create mode 100644 .codex/templates/GITEA_STATUS_COMMENT.md create mode 100644 .codex/templates/SCOPE_DELTA.md create mode 100644 .codex/templates/SESSION_STATE.md create mode 100644 .codex/workflow.toml create mode 100644 .cursor/plans/content_workspace_and_import_authoring_2026-07-13.plan.md create mode 100644 assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/76a589e4456ec3320b876209-arm.basis create mode 100644 assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/c6f971e303a67229b09c1283-arm.basis create mode 100644 assets/.import-cache/runtime/materials/647a63d4-64c6-4431-ba46-9efdd515cd8f/297372611543b1f7baa1e5e3-arm.basis create mode 100644 assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/76a589e4456ec3320b876209-arm.basis create mode 100644 assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/c6f971e303a67229b09c1283-arm.basis create mode 100644 assets/.import-cache/runtime/textures/0496e62e-1837-4940-a9c9-b2b4ffe9ed90/3ecc62c0eaf1672ca08fb59f/texture.basis create mode 100644 assets/.import-cache/runtime/textures/25db6174-afcb-421f-8c1c-0c5ffde21b79/552b39094506da0fbf4cd647/texture.basis create mode 100644 assets/.import-cache/runtime/textures/393414a8-3089-435f-b267-6dd3eac0285f/edf8ef1b2fc54bbe4eafc16d/texture.basis create mode 100644 assets/.import-cache/runtime/textures/481b1a35-75e4-4879-879d-ccab183ba2b7/534c0d384d22c554b9597064/texture.basis create mode 100644 assets/.import-cache/runtime/textures/5212dba1-853f-4dab-98f3-e6395d05a4f7/cd1c550f437632f394bf7502/texture.basis create mode 100644 assets/.import-cache/runtime/textures/7c5235a1-f5d7-4530-b29f-5ea075881df5/944b70940e3dd9a70e851d0e/texture.basis create mode 100644 assets/.import-cache/runtime/textures/bddaa4d4-5097-42bf-8d51-dd9a3580442a/2276a96b1a148fd7c16977d5/texture.basis create mode 100644 assets/.import-cache/runtime/textures/c4abe41c-ac88-4aec-8168-27e8a7c90583/d0ec4224c3dcb6fa565c94bb/texture.basis create mode 100644 assets/.import-cache/runtime/textures/c644134e-87c7-43fb-ac30-31c4e0a78b48/534c0d384d22c554b9597064/texture.basis create mode 100644 assets/.import-cache/runtime/textures/c661e66a-0745-4dd9-89b0-e611befab602/cd1c550f437632f394bf7502/texture.basis create mode 100644 assets/.import-cache/runtime/textures/c7a227bc-2bae-4a41-857b-28cc6b432a9d/edf8ef1b2fc54bbe4eafc16d/texture.basis create mode 100644 assets/.import-cache/runtime/textures/cadad4af-c24a-4d52-bdc4-8089dac67f30/cd1c550f437632f394bf7502/texture.basis create mode 100644 assets/.import-cache/runtime/textures/cef332e3-d0d1-41d7-adf2-87462c70f52c/edf8ef1b2fc54bbe4eafc16d/texture.basis create mode 100644 assets/.import-cache/runtime/textures/d3b9bec5-c0ea-4f83-ad80-f9e2a8cb69ee/644db179a14573b2a514e68f/texture.basis create mode 100644 assets/.import-cache/runtime/textures/e5512ff1-aa00-4592-a740-4574e1059a99/534c0d384d22c554b9597064/texture.basis create mode 100644 assets/Furniture/Office/blacksite-m2-robot-expressive.glb create mode 100644 assets/Furniture/Office/metal_office_desk.bin create mode 100644 assets/Furniture/Office/metal_office_desk.material.ron create mode 100644 assets/Furniture/Office/metal_office_desk_2k.gltf create mode 100644 assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg create mode 100644 assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg create mode 100644 assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg create mode 100644 assets/animations/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.animation.ron create mode 100644 assets/animations/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.animation.ron create mode 100644 assets/animations/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.animation.ron create mode 100644 assets/animations/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.animation.ron create mode 100644 assets/content.catalog.ron create mode 100644 assets/materials/chrome.ron create mode 100644 assets/materials/migrated/legacy-05a00cdd0a637f9e.material.ron create mode 100644 assets/materials/migrated/legacy-082ba03b8cbb710b.material.ron create mode 100644 assets/materials/migrated/legacy-0a21ebb8e495bf57.material.ron create mode 100644 assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron create mode 100644 assets/materials/migrated/legacy-2b86cae1d3bfacae.material.ron create mode 100644 assets/materials/migrated/legacy-3546762bbff37951.material.ron create mode 100644 assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron create mode 100644 assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron create mode 100644 assets/materials/migrated/legacy-62ef60a686be94f1.material.ron create mode 100644 assets/materials/migrated/legacy-77cc6503f24bb9e8.material.ron create mode 100644 assets/materials/migrated/legacy-78bc49856f47eae1.material.ron create mode 100644 assets/materials/migrated/legacy-964101ee77293501.material.ron create mode 100644 assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron create mode 100644 assets/materials/migrated/legacy-9a630ee3e4848d9d.material.ron create mode 100644 assets/materials/migrated/legacy-a74f874eafd5d224.material.ron create mode 100644 assets/materials/migrated/legacy-b278a62978900638.material.ron create mode 100644 assets/materials/migrated/legacy-c656429ce3668694.material.ron create mode 100644 assets/materials/migrated/legacy-c6c02ef278fba7c3.material.ron create mode 100644 assets/materials/migrated/legacy-c6fbbebd3e1a9943.material.ron create mode 100644 assets/materials/migrated/legacy-c9d05c61e5cf348d.material.ron create mode 100644 assets/materials/migrated/legacy-cc0396f5c90fb7bb.material.ron create mode 100644 assets/materials/migrated/legacy-e9671004b101f4df.material.ron create mode 100644 assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron create mode 100644 assets/materials/new_material.ron create mode 100644 assets/materials/new_material_2.ron create mode 100644 assets/materials/pebble_bricks.bin create mode 100644 assets/materials/pebble_bricks.ron create mode 100644 assets/materials/pebble_bricks_4k.gltf create mode 100644 assets/materials/textures/pebble_bricks_arm_4k.jpg create mode 100644 assets/materials/textures/pebble_bricks_diff_4k.jpg create mode 100644 assets/materials/textures/pebble_bricks_nor_gl_4k.jpg create mode 100644 assets/meshes/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.static_mesh.ron create mode 100644 assets/meshes/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.static_mesh.ron create mode 100644 assets/meshes/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.static_mesh.ron create mode 100644 assets/meshes/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.static_mesh.ron create mode 100644 assets/models/metal_office_desk.bin create mode 100644 assets/models/metal_office_desk_2k.gltf create mode 100644 assets/models/textures/metal_office_desk_arm_2k.jpg create mode 100644 assets/models/textures/metal_office_desk_diff_2k.jpg create mode 100644 assets/models/textures/metal_office_desk_nor_gl_2k.jpg create mode 100644 assets/pebble_bricks_surface_instance.material-instance.ron create mode 100644 assets/textures/metal_office_desk_arm_2k.jpg create mode 100644 assets/textures/metal_office_desk_diff_2k.jpg create mode 100644 assets/textures/metal_office_desk_nor_gl_2k.jpg create mode 100644 crates/blacksite_surface/src/live_documents.rs create mode 100644 crates/blacksite_surface/src/surface/cache_plugin.rs create mode 100644 crates/blacksite_surface/src/surface/packing.rs create mode 100644 crates/blacksite_surface/src/surface/property_blocks.rs create mode 100644 crates/blacksite_surface/src/surface/resolver.rs create mode 100644 crates/blacksite_surface/src/surface/surface_abi.rs create mode 100644 crates/blacksite_surface/src/surface/terrain.rs create mode 100644 crates/blacksite_surface/src/surface/terrain_types.rs create mode 100644 crates/blacksite_surface/src/surface/tests.rs create mode 100644 crates/blacksite_surface/src/surface/validation.rs create mode 100644 crates/content_pipeline/AGENTS.md create mode 100644 crates/content_pipeline/Cargo.toml create mode 100644 crates/content_pipeline/src/animation.rs create mode 100644 crates/content_pipeline/src/fingerprint.rs create mode 100644 crates/content_pipeline/src/import.rs create mode 100644 crates/content_pipeline/src/lib.rs create mode 100644 crates/content_pipeline/src/pbr_grouping.rs create mode 100644 crates/content_pipeline/src/static_mesh.rs create mode 100644 crates/content_pipeline/src/texture.rs create mode 100644 crates/content_pipeline/src/transaction.rs create mode 100644 crates/content_pipeline/src/trash.rs create mode 100644 crates/content_pipeline/src/watcher.rs create mode 100644 crates/editor/AGENTS.md create mode 100644 crates/editor/assets/fonts/source-sans/LICENSE.md create mode 100644 crates/editor/assets/fonts/source-sans/SourceSansPro-Bold.ttf create mode 100644 crates/editor/assets/fonts/source-sans/SourceSansPro-Regular.ttf create mode 100644 crates/editor/src/assets/catalog/content_watch.rs create mode 100644 crates/editor/src/project/asset_documents.rs create mode 100644 crates/editor/src/project/asset_documents/document_store/live_updates.rs create mode 100644 crates/editor/src/project/asset_documents/document_store/processing.rs create mode 100644 crates/editor/src/project/asset_documents/document_store/publication.rs create mode 100644 crates/editor/src/project/asset_documents/document_store/recovery.rs create mode 100644 crates/editor/src/project/asset_documents/document_store/service.rs create mode 100644 crates/editor/src/project/asset_documents/document_store/store.rs create mode 100644 crates/editor/src/project/asset_documents/processing_impact.rs create mode 100644 crates/editor/src/ui/actor_inspector/layout.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/details.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/embedded.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/file_operations.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/grid.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/import_settings.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/list.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/material_extraction.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/navigation.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/pbr_transactions.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/tests/a.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/tests/b.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/toolbar_import.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/undo_trash.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/utilities.rs create mode 100644 crates/editor/src/ui/asset_browser/panel/validation.rs create mode 100644 crates/editor/src/ui/asset_card.rs create mode 100644 crates/editor/src/ui/component_registry/dispatch.rs create mode 100644 crates/editor/src/ui/component_registry/tests.rs create mode 100644 crates/editor/src/ui/design_system/color_picker.rs create mode 100644 crates/editor/src/ui/design_system/color_picker/popup.rs create mode 100644 crates/editor/src/ui/design_system/color_picker/popup/sliders.rs create mode 100644 crates/editor/src/ui/design_system/controls.rs create mode 100644 crates/editor/src/ui/design_system/mod.rs create mode 100644 crates/editor/src/ui/design_system/property_grid.rs create mode 100644 crates/editor/src/ui/design_system/typography.rs create mode 100644 crates/editor/src/ui/document_status.rs create mode 100644 crates/editor/src/ui/inspector/asset_selectors.rs create mode 100644 crates/editor/src/ui/inspector/brush_terrain.rs create mode 100644 crates/editor/src/ui/inspector/component_add.rs create mode 100644 crates/editor/src/ui/inspector/component_chrome.rs create mode 100644 crates/editor/src/ui/inspector/component_lifecycle.rs create mode 100644 crates/editor/src/ui/inspector/dispatch.rs create mode 100644 crates/editor/src/ui/inspector/imported_material_preview.rs create mode 100644 crates/editor/src/ui/inspector/material_slots.rs create mode 100644 crates/editor/src/ui/inspector/mesh_renderers.rs create mode 100644 crates/editor/src/ui/inspector/primitive_domains.rs create mode 100644 crates/editor/src/ui/inspector/property_blocks.rs create mode 100644 crates/editor/src/ui/inspector/renderer_panel.rs create mode 100644 crates/editor/src/ui/inspector/sun_textures.rs create mode 100644 crates/editor/src/ui/inspector/tests/a.rs create mode 100644 crates/editor/src/ui/inspector/tests/b.rs create mode 100644 crates/editor/src/ui/material_library/list.rs create mode 100644 crates/editor/src/ui/materials/advanced_preview.rs create mode 100644 crates/editor/src/ui/materials/asset_editor.rs create mode 100644 crates/editor/src/ui/materials/editor.rs create mode 100644 crates/editor/src/ui/materials/inputs.rs create mode 100644 crates/editor/src/ui/materials/instance_editor.rs create mode 100644 crates/editor/src/ui/materials/instance_inputs.rs create mode 100644 crates/editor/src/ui/materials/layout.rs create mode 100644 crates/editor/src/ui/materials/mod.rs create mode 100644 crates/editor/src/ui/materials/panel.rs create mode 100644 crates/editor/src/ui/materials/pickers.rs create mode 100644 crates/editor/src/ui/materials/texture_inputs.rs create mode 100644 crates/editor/src/ui/materials/uv_transform.rs create mode 100644 crates/editor/src/viewport/target_presenter.rs create mode 100644 crates/scene/src/upgrade/io.rs create mode 100644 crates/shared/AGENTS.md create mode 100644 crates/shared/src/content.rs create mode 100644 crates/shared/src/material_desc.rs create mode 100644 docs/AGENTS.md create mode 100644 docs/adr/0045-content-workspace-and-material-fallback-contract.md create mode 100644 docs/adr/0046-schema-driven-material-inputs-and-processed-textures.md create mode 100644 docs/adr/0047-editor-authored-asset-documents.md create mode 100644 docs/adr/0048-modular-editor-composition-and-debt-ratchet.md create mode 100644 docs/adr/0049-penpot-led-editor-visual-system.md create mode 100644 docs/archive/README.md create mode 100644 docs/authority.toml create mode 100644 docs/editor/content-workspace.md create mode 100644 docs/editor/design-system.md create mode 100644 docs/editor/evaluations/content-workspace-m2/README.md create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/README.md create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/array-header-40.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/color-picker-adjusted.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/color-picker-presets.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/color-picker-sliders.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/color-picker-wheel.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/component-composition-rule.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/component-header-50.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/foundation-components-catalog.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/material-components-states.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/materials-narrow-420.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/materials-wide-620.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/static-mesh-renderer-narrow-480.svg create mode 100644 docs/editor/evaluations/content-workspace-m2/penpot/static-mesh-renderer-wide-760.svg create mode 100644 docs/workflow/build-storage-policy.md create mode 100644 docs/workflow/codex-workflow.md create mode 100644 docs/workflow/documentation-policy.md create mode 100644 docs/workflow/gitea-tracking-policy.md create mode 100644 docs/workflow/verification-policy.md create mode 100755 scripts/codex/architecture_audit.py create mode 100755 scripts/codex/build_storage.py create mode 100755 scripts/codex/cargo_lane.py create mode 100755 scripts/codex/docs_audit.py create mode 100755 scripts/codex/native_qa.sh create mode 100755 scripts/codex/state.py create mode 100755 scripts/codex/summarize_command.py create mode 100755 scripts/codex/verify.py create mode 100755 scripts/editor/blacksite-editor create mode 100755 scripts/editor/build_progress.py create mode 100755 scripts/editor/splash.py create mode 100755 scripts/editor/test_build_progress.py create mode 100644 source_assets/Models/metal_office_desk.bin create mode 100644 source_assets/Models/metal_office_desk_2k.gltf create mode 100644 source_assets/Models/textures/metal_office_desk_arm_2k.jpg create mode 100644 source_assets/Models/textures/metal_office_desk_diff_2k.jpg create mode 100644 source_assets/Models/textures/metal_office_desk_nor_gl_2k.jpg create mode 100644 source_assets/textures/pebble_bricks_4k.gltf/pebble_bricks.bin create mode 100644 source_assets/textures/pebble_bricks_4k.gltf/pebble_bricks_4k.gltf create mode 100644 source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_arm_4k.jpg create mode 100644 source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_diff_4k.jpg create mode 100644 source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_nor_gl_4k.jpg create mode 100644 xtask/AGENTS.md create mode 100644 xtask/src/process_assets.rs diff --git a/.agents/skills/blacksite-build-storage/SKILL.md b/.agents/skills/blacksite-build-storage/SKILL.md new file mode 100644 index 0000000..47b2778 --- /dev/null +++ b/.agents/skills/blacksite-build-storage/SKILL.md @@ -0,0 +1,23 @@ +--- +name: blacksite-build-storage +description: Keep Blacksite Cargo and package build artifacts within a configured disk budget by selecting stable build lanes, measuring target/build directories, pruning only verified disposable caches, and preserving warm development performance. Use before or after heavy builds, when disk use grows, or when compile performance degrades from artifact accumulation. +--- + +# Blacksite build storage + +Read `.codex/workflow.toml` and [the storage policy](references/build-storage-policy.md). Use `scripts/codex/cargo_lane.py` for every Cargo invocation and `scripts/codex/build_storage.py` for measurement or cleanup. + +Trigger this Skill for candidate, all-feature, all-target, package, hot-reload, full-debug, cache-growth, low-space, unexplained rebuild, and cleanup requests. + +- Keep one persistent `dev` lane. Candidate, hot-reload, full-debug, cross-target, and package lanes are exceptional and disposable. +- Use stable separate `CARGO_BUILD_BUILD_DIR` when supported; otherwise use bounded external `CARGO_TARGET_DIR` lanes. +- Account for repository final targets, external intermediates, package caches, Cargo timings/docs, free space, and an already-enabled `sccache`. +- Run storage preflight/postflight around heavy gates. When configured, pressure may prune only + expired disposable lanes after their complete checked plan is printed and flushed. +- Require valid sentinels, canonical workspace identity, no symlink traversal, and no active Cargo/rustc/linker/packager before deletion. +- Delete whole managed lanes only. Never delete individual Cargo internal files and never install cleanup/cache tools without explicit approval. +- Every apply prints and flushes its complete byte-counted checked plan before deletion begins. +- Preserve candidate binaries/packages and evidence outside the disposable lane, then establish the + generation-bound marker with `build_storage.py mark-candidate-preserved`; an absent, stale, or + hash-mismatched marker blocks candidate deletion. +- Report reclaimed bytes plus expected cold-build impact. diff --git a/.agents/skills/blacksite-build-storage/references/build-storage-policy.md b/.agents/skills/blacksite-build-storage/references/build-storage-policy.md new file mode 100644 index 0000000..9a3956c --- /dev/null +++ b/.agents/skills/blacksite-build-storage/references/build-storage-policy.md @@ -0,0 +1,27 @@ +# Build-storage policy + +The tracked limits live in `.codex/workflow.toml`. Defaults are a 55 GiB soft total, 80 GiB hard total, at least 40 GiB or 15% free space, a 40 GiB persistent-lane ceiling, and a 35 GiB ceiling per disposable lane. + +The canonical workspace path is hashed so `/home/.../Bevy` and `/mnt/Fedora/.../Bevy` share one cache identity. Managed lanes carry a sentinel with workspace path/hash, lane, toolchain, feature/profile signature, target/build directories, and timestamps. + +Enforcement order: + +1. Report total/per-lane size and largest children. +2. Under storage pressure, print the checked byte plan and prune expired marked disposable lanes. +3. Prune stale package intermediates after preserving published output. +4. Remove non-evidence Cargo timing/doc output. +5. Block a new heavy gate if the hard limit or free-space floor still fails. +6. Reset the persistent lane only at a safe slice boundary, after a dry run and verification-ledger update. + +`enforce --phase pre|post` automatically prunes only when tracked policy enables it, storage pressure +exists, and a disposable lane has expired. Automatic and explicit prune/reset paths first print and +flush the complete byte-counted plan, including sentinel, path, process, and preservation checks, +before deleting any lane. A candidate lane additionally requires +`.codex/session/candidate-prune-safe.json`, created only after preserved evidence and at least one +distinct binary/package file have been hashed with `mark-candidate-preserved`; any later candidate +lane use makes that generation-bound marker stale. + +Never prune an active lane, an unmarked directory, a symlink, another workspace, `/`, home, Cargo +home, the workspace root, `.git`, or a parent of any protected path. `cargo clean` is not a routine +operation; the one-time legacy-target migration is the sole exception documented by the workflow +installation record. diff --git a/.agents/skills/blacksite-doc-integrity/SKILL.md b/.agents/skills/blacksite-doc-integrity/SKILL.md new file mode 100644 index 0000000..f5a4d58 --- /dev/null +++ b/.agents/skills/blacksite-doc-integrity/SKILL.md @@ -0,0 +1,21 @@ +--- +name: blacksite-doc-integrity +description: Prevent stale or contradictory Blacksite documentation from becoming design context by enforcing documentation authority, archiving superseded plans, comparing changed behavior with canonical docs and accepted ADRs, and running the documentation audit. +--- + +# Blacksite documentation integrity + +Read `.codex/workflow.toml`, `docs/authority.toml`, and [the authority reference](references/documentation-authority.md) before treating repository prose as design guidance. + +Trigger this Skill for user-visible behavior, schema/command/component renames, architectural changes, candidate preparation, documentation requests, or discovered contradictions. + +1. Identify the changed public behavior from code and focused tests. +2. Load only the canonical docs for its topic and relevant accepted ADRs. +3. Read the exact Gitea acceptance criteria when tracked. +4. Search historical material only for contradictions, never as authority. +5. Write a bounded `.codex/session/doc-contradictions.md` listing claim, source, current truth, and action. +6. Update the smallest canonical owner at the stable slice boundary, within the same task. +7. Mark completed plans historical and freeze their substantive contents. Add required banners and replacement links. +8. Run `python scripts/codex/docs_audit.py --changed`, then the full audit at a documentation slice gate. + +Keep README as an overview. Do not duplicate detailed contracts across guides, plans, ADRs, and tracker bodies. Coordinate a dry-run Gitea scope/status update when tracker truth has drifted. diff --git a/.agents/skills/blacksite-doc-integrity/references/documentation-authority.md b/.agents/skills/blacksite-doc-integrity/references/documentation-authority.md new file mode 100644 index 0000000..fc70f79 --- /dev/null +++ b/.agents/skills/blacksite-doc-integrity/references/documentation-authority.md @@ -0,0 +1,16 @@ +# Documentation authority + +`docs/authority.toml` is the machine-readable registry. Roles mean: + +- `canonical`: current user or developer behavior. +- `architecture`: accepted decisions and constraints. +- `overview`: a high-level entry point linking to canonical owners. +- `active-plan`: approved incomplete work. +- `evidence`: dated acceptance or evaluation, not product specification. +- `historical`: preserved record no longer used as guidance. +- `superseded`: replaced material that links to its replacement. +- `draft`: non-authoritative work. + +Code, schemas, tests, and deterministic output define actual behavior. Accepted ADRs define architecture. Gitea defines accepted current scope and work state. Canonical docs describe shipped/current workflows. When they conflict, identify and reconcile the conflict; never silently combine old and new claims. + +Historical, evidence, and superseded files require a visible warning and current canonical link. Active plans require an incomplete-work banner and shipped-behavior link. Session state and raw logs are never documentation. diff --git a/.agents/skills/blacksite-editor-ux/SKILL.md b/.agents/skills/blacksite-editor-ux/SKILL.md new file mode 100644 index 0000000..f37a6fb --- /dev/null +++ b/.agents/skills/blacksite-editor-ux/SKILL.md @@ -0,0 +1,14 @@ +--- +name: blacksite-editor-ux +description: Design and evaluate Blacksite editor UI/UX changes using a production editor interaction rubric, explicit state matrices, existing visual language, and native acceptance criteria. Use for Content Browser, Inspector, viewport, dialogs, material UI, and other interactive editor work. +--- + +# Blacksite editor UX + +Read [the editor UX rubric](references/editor-ux-rubric.md). Before implementing meaningful UI behavior, record a compact interaction-state matrix in session state or the active plan. + +Cover only relevant states, but explicitly consider empty, single/multi-selection, narrow/resized, invalid/broken, inherited/read-only/built-in, loading, confirmation, cancel/failure, undo/redo, and restart persistence. + +Keep egui rendering thin and reuse established components, spacing, icons, cards, badges, drag/drop feedback, and editor language. Move reusable models and transactions to the lightest owning module/crate. Keep IDs, fingerprints, provenance, and implementation-owned data out of primary editing surfaces. + +Create named native scenarios and hand them to `blacksite-native-qa`. Unit tests and screenshots alone are not acceptance; exercise the interaction. If the user says behavior still does not work properly, return to acceptance-in-progress and record a scope delta rather than treating it as unrelated by default. diff --git a/.agents/skills/blacksite-editor-ux/references/editor-ux-rubric.md b/.agents/skills/blacksite-editor-ux/references/editor-ux-rubric.md new file mode 100644 index 0000000..18a47dc --- /dev/null +++ b/.agents/skills/blacksite-editor-ux/references/editor-ux-rubric.md @@ -0,0 +1,29 @@ +# Blacksite editor UX rubric + +## Product intent + +- What familiar editor or file-manager interaction is being matched? +- What is the primary action and what must be obvious without documentation? +- What happens on invalid input? + +## Interaction matrix + +Include relevant rows for mouse click, double click, right click, shortcut, drag start/hover/drop, multi-selection, empty-space action, narrow panel, modal/review, cancel, undo/redo, and restart. + +## Visual design + +- Reuse current typography, spacing, icons, cards, and status badges. +- Provide visible hover, drop, focus, invalid, and disabled states. +- Avoid duplicated controls and competing presentations. +- Hide managed/internal data unless diagnosing a failure. +- Support resizing and narrow layouts. +- Distinguish inherited/default/read-only state from explicit editable state. + +## Acceptance + +- Focused logic tests in the lightest owning crate. +- Focused UI wiring tests when editor-owned state matters. +- Native interaction against the intended build/profile. +- Targeted screenshot or recording of the relevant state. +- Cancel/failure proof and saved-state restart proof when applicable. +- Canonical documentation update after the behavior stabilizes. diff --git a/.agents/skills/blacksite-gitea-sync/SKILL.md b/.agents/skills/blacksite-gitea-sync/SKILL.md new file mode 100644 index 0000000..9728ed7 --- /dev/null +++ b/.agents/skills/blacksite-gitea-sync/SKILL.md @@ -0,0 +1,20 @@ +--- +name: blacksite-gitea-sync +description: Read and synchronize exact Blacksite Gitea issues, epics, and milestones with current scope, implementation state, verification evidence, canonical documentation, and release-candidate status while avoiding duplicate issues and noisy updates. +--- + +# Blacksite Gitea synchronization + +Read `.codex/workflow.toml` and [the state model](references/gitea-state-model.md). Use the configured Gitea connector; do not scrape or invent tracker state. + +Supported modes are `read`, `plan`, `status`, `scope-delta`, `candidate`, and `close`. + +1. Read exact known issue, parent epic, milestone, and recent relevant comments first. Search broadly only to locate an unknown item or prevent a duplicate. +2. Summarize acceptance locally and create a dry-run mutation plan before every write. +3. Follow configured permissions. Creation and scope/milestone changes require explicit authority; closure is candidate-only; delete/reopen is explicit. +4. Add at most one meaningful status comment per completed slice. +5. Distinguish working-tree implementation from engineering-complete, acceptance-in-progress, candidate-ready, and closure evidence. +6. Mark acceptance only when code, focused tests, and required native/package evidence exist and remain valid. +7. On failure, re-read the exact item, detect partial success, and retry only the missing operation. + +Never push or close as a side effect. Record remote mutations and their readback in session state. diff --git a/.agents/skills/blacksite-gitea-sync/references/gitea-state-model.md b/.agents/skills/blacksite-gitea-sync/references/gitea-state-model.md new file mode 100644 index 0000000..14c700e --- /dev/null +++ b/.agents/skills/blacksite-gitea-sync/references/gitea-state-model.md @@ -0,0 +1,14 @@ +# Gitea state model + +Gitea owns accepted scope, criteria, priority, dependencies, work state, candidate/evidence links, blockers, and milestone composition. It does not replace code, tests, ADRs, canonical docs, or native evidence. + +States: + +- `Implementing`: active local work. +- `Engineering-complete`: relevant engineering gates pass; native/product acceptance may remain. +- `Acceptance-in-progress`: native or stakeholder validation is active or exposed a gap. +- `Candidate-ready`: stable scope and a nominated tree are ready for remaining release gates. +- `Blocked`: an external condition prevents progress. +- `Closed`: candidate evidence and every criterion are accepted. + +User-discovered UX gaps return an item to acceptance-in-progress and become scope deltas, not automatic new issues. Close children, final signoff, epic, then milestone. Never close a milestone with open assigned issues unless the user explicitly changes its definition. diff --git a/.agents/skills/blacksite-native-qa/SKILL.md b/.agents/skills/blacksite-native-qa/SKILL.md new file mode 100644 index 0000000..c842f0b --- /dev/null +++ b/.agents/skills/blacksite-native-qa/SKILL.md @@ -0,0 +1,18 @@ +--- +name: blacksite-native-qa +description: Run deterministic named Blacksite editor or packaged-runtime scenarios on the actual desktop session, target the exact window, capture concise evidence, and restore test fixtures. Use only when visual or interactive acceptance is required. +--- + +# Blacksite native QA + +Use only when the user requests native/visual QA or the active acceptance target explicitly requires it. Read `.codex/workflow.toml` and [the scenario format](references/scenario-format.md), then use `scripts/codex/native_qa.sh`. + +- Build through `cargo_lane.py` in the named lane and resolve binary, intermediate `deps`, runtime environment, and PID from lane JSON. Never hard-code `target/debug/deps`. +- Target the exact PID/window/class/workspace. Bring offscreen dialogs on-screen and prefer accessibility or window-relative input over desktop coordinates. +- Capture only the target window or relevant crop under `.codex/evidence/`, with a hash and result record. +- Reuse one editor session while code is unchanged. +- Record fixture mutations and restore/trash them transactionally. +- Close processes spawned by the scenario. +- Keep full compositor/accessibility dumps out of the task unless they explain a failure. + +Do not claim acceptance from a screenshot alone. Exercise the named steps, invalid/cancel path, and persistence where required. diff --git a/.agents/skills/blacksite-native-qa/references/scenario-format.md b/.agents/skills/blacksite-native-qa/references/scenario-format.md new file mode 100644 index 0000000..078676b --- /dev/null +++ b/.agents/skills/blacksite-native-qa/references/scenario-format.md @@ -0,0 +1,41 @@ +# Named native scenario format + +Scenario files use these top-level fields: + +```yaml +name: +purpose: +preconditions: +build_lane: +fixture: +steps: +assertions: +evidence: +cleanup: +invalidates: +``` + +Keep steps deterministic and phrased as user actions. Assertions describe visible behavior, state transitions, persistence, and failure recovery. Evidence names the target window/crop and expected files. Cleanup must identify every spawned process and fixture mutation. + +The runner exposes the scenario instead of pretending manual interactions are automated: + +```bash +bash scripts/codex/native_qa.sh plan +bash scripts/codex/native_qa.sh launch +bash scripts/codex/native_qa.sh attach +bash scripts/codex/native_qa.sh capture +bash scripts/codex/native_qa.sh record pass|fail [note] +bash scripts/codex/native_qa.sh status +bash scripts/codex/native_qa.sh close +bash scripts/codex/native_qa.sh restore --dry-run +bash scripts/codex/native_qa.sh restore --apply +``` + +`launch` snapshots a workspace-contained regular-file fixture before the editor starts; `attach` +does the same while reusing an existing editor and never closes that user-owned process. `restore --apply` +prints and flushes the baseline/current hash plan, refuses to run while the recorded process +is alive, validates the snapshot hash, and restores atomically. A scenario is accepted only when all +named assertions are recorded as passing and the required evidence exists; visual interaction remains +user-controlled unless explicitly delegated. + +Recurring scenario families include Content Browser item/empty-space menus, multi-selection, destination-first import, move/reference repair, duplicate/undo/derived cleanup, material-slot assignment/inheritance, DefaultGrid Forward/Solari, and package launch. diff --git a/.agents/skills/blacksite-native-qa/references/scenarios/content-browser-card-layout.yaml b/.agents/skills/blacksite-native-qa/references/scenarios/content-browser-card-layout.yaml new file mode 100644 index 0000000..9e15714 --- /dev/null +++ b/.agents/skills/blacksite-native-qa/references/scenarios/content-browser-card-layout.yaml @@ -0,0 +1,20 @@ +name: content-browser-card-layout +purpose: Verify production-quality grid/list card layout and model-thumbnail identity at wide and narrow browser sizes. +preconditions: The running editor has the project Content Browser available with long asset names and the Poly Haven desk imported. +build_lane: dev +fixture: +steps: + - Open the Content Browser grid and navigate to the Office model folder. + - Inspect long Material, Texture, and model names with clean and dirty status states. + - Resize the Content Browser and Details splitter through narrow and wide layouts. + - Switch to list view and compare status markers and column alignment. + - Inspect the Poly Haven metal office desk card and one mesh-subasset preview. +assertions: + - Grid labels stay inside clipped two-line footers with ellipsis and no status overlap. + - Dirty, processing, and error state use the fixed top-right status rail rather than text over the label. + - List status markers occupy fixed space and do not shift or truncate neighboring columns unpredictably. + - Toolbar, Details splitter, and cards remain usable without clipped controls at narrow sizes. + - The office desk and mesh-subasset thumbnails show rendered geometry, never an albedo texture substitute. +evidence: Target-window captures for grid-wide, grid-narrow, list, and desk geometry states plus hashes. +cleanup: Close only a runner-spawned editor; this scenario does not mutate project fixtures. +invalidates: Asset-card, Content Browser layout, status model, or thumbnail-routing changes. diff --git a/.agents/skills/blacksite-native-qa/references/scenarios/material-slot-live-edit.yaml b/.agents/skills/blacksite-native-qa/references/scenarios/material-slot-live-edit.yaml new file mode 100644 index 0000000..efe1bf3 --- /dev/null +++ b/.agents/skills/blacksite-native-qa/references/scenarios/material-slot-live-edit.yaml @@ -0,0 +1,26 @@ +name: material-slot-live-edit +purpose: Verify persistent live Material edits, explicit save separation, and the unified responsive slot widget. +preconditions: editor_scene contains a primitive and static mesh using a project Material; no editor process is running. +build_lane: dev +fixture: assets/materials/pebble_bricks.ron +steps: + - Select the primitive using pebble_bricks and expand its material parameters. + - Drag a scalar control, release it, and observe the surface for at least five seconds. + - Switch selection away and back, then compare the scalar value and rendered surface. + - Narrow and widen the Inspector around the responsive threshold. + - Save the active Material document and observe status and processing indicators. + - Select a static mesh material slot and compare its slot presentation. + - Leave the expanded material card idle for five minutes while sampling the editor process GPU memory and terminal diagnostics. + - Close and relaunch the editor, then reopen the same Material slot. +assertions: + - The surface changes continuously, does not flicker back after release, and the editor remains responsive. + - Selection changes preserve the live value and the compact amber dirty indicator without label overlap. + - Scalar save becomes clean without a PROCESSING state or a long-running UI operation. + - Primitive and static-mesh slots use the same compact header and schema-driven parameter layout. + - Narrow and wide layouts contain every control without overlap, clipping, garbled rows, or redundant diagnostics prose. + - No Apply, Revert, Ctrl+S hint, inline Explicit label, or inline Source & Diagnostics section appears. + - GPU memory remains bounded, no repeated egui multipass ID warning appears, and the editor stays alive without a renderer Out of Memory error. + - Relaunch preserves the saved Material value and rendered result. +evidence: Target-window captures for dirty-wide, dirty-narrow, saved, and relaunched states plus hashes. +cleanup: Close the spawned editor and atomically restore pebble_bricks.ron from the runner snapshot. +invalidates: Material UI, material persistence, or slot-resolution code changes. diff --git a/.agents/skills/blacksite-native-qa/references/scenarios/penpot-material-inspector.yaml b/.agents/skills/blacksite-native-qa/references/scenarios/penpot-material-inspector.yaml new file mode 100644 index 0000000..71fbba8 --- /dev/null +++ b/.agents/skills/blacksite-native-qa/references/scenarios/penpot-material-inspector.yaml @@ -0,0 +1,27 @@ +name: penpot-material-inspector +purpose: Verify the final Penpot Materials list and material-slot panel at its 640 px and 420 px Inspector reference widths. +preconditions: editor_scene contains primitive, static-mesh, and skinned-mesh material users; no editor process is running. +build_lane: dev +fixture: assets/materials/pebble_bricks.ron +steps: + - Launch the editor on the real desktop and size the Inspector to the 640 px reference width. + - Select a primitive, static mesh, and skinned mesh in turn and expand each material panel. + - Compare Materials ownership, expanded slot header, PARAMETERS spine, Surface, six Inputs rows, UV, and Advanced geometry with the current Penpot reference. + - Narrow the Inspector to the 420 px floor and verify every value, channel, texture, Locate, and Clear control reflows. + - Open the material picker, dismiss it without selection, then assign a valid project Material and inspect inherited and direct states. + - Drop a Texture onto the material assignment target and inspect the invalid state without assigning it. + - Open Base Color and exercise Wheel, Sliders, Presets, Apply, Cancel, Escape, and outside dismissal. + - Edit a scalar and color, release the controls, switch actors, then save and relaunch the editor. + - Inspect imported-source, DefaultGrid, and broken-reference presentations through the available fixture states. +assertions: + - The 640 px Inspector matches the current Penpot palette, Source Sans Pro typography, 32 px Materials heading, 82 px expanded slot header, 592 px parameter sections, six 30 px input rows, spacing, borders, and fixed property geometry without visible drift. + - Primitive, static-mesh, and skinned-mesh slots use the same panel geometry and have no redundant second slot presentation. + - At the 420 px Inspector floor, six 56 px input rows put paired texture controls on the second line with no horizontal scrolling, clipping, compressed labels, or missing actions. + - Direct assignments have no Explicit badge; inherited, dirty, processing, failed, read-only, imported-source, and built-in states retain one header geometry. + - Picker dismissal and invalid Texture drops make no assignment or source save; valid Material or Instance drops use the blue accent state. + - Wheel, Sliders, and Presets preview live; Apply retains the dirty in-memory value and Cancel, Escape, or outside dismissal restores the exact pre-open value. + - Material controls perform no pointer-release write or scalar/color processing job and keep the existing live GPU handle visible across actor selection. + - Save and relaunch preserve the authored value, while broken explicit references retain failed identity and visible DefaultGrid fallback. +evidence: Target-window captures for 640 px primitive/static/skinned, narrow reflow, color modes, invalid drop, dirty state, and relaunch plus hashes. +cleanup: Close the spawned editor and atomically restore pebble_bricks.ron from the runner snapshot. +invalidates: Design tokens, fonts, material panel geometry, material picker, color picker, authored documents, or material resolver changes. diff --git a/.agents/skills/blacksite-release-candidate/SKILL.md b/.agents/skills/blacksite-release-candidate/SKILL.md new file mode 100644 index 0000000..dd94c08 --- /dev/null +++ b/.agents/skills/blacksite-release-candidate/SKILL.md @@ -0,0 +1,17 @@ +--- +name: blacksite-release-candidate +description: Nominate and verify one Blacksite candidate tree or commit, reuse still-valid selective verification evidence, run the remaining full release gates once, produce an evidence manifest, and hand results to Gitea synchronization. +--- + +# Blacksite release candidate + +Read `.codex/workflow.toml` and [the release gates](references/release-gates.md). Require stable scope, no pending major delta, and `Candidate-ready` session state. + +1. Record the candidate SHA or dirty-tree digest. +2. Read the verification ledger and reuse every gate whose relevant input digest and lane signature remain valid. +3. Run only missing/invalid release gates via `verify.py candidate` and managed candidate/package lanes. +4. Preserve final binaries/package output and required native evidence before disposable-lane pruning. +5. Write `.codex/session/candidate-evidence.json` with commands, digests, results, artifacts, screenshots, and documentation status. +6. Run documentation integrity and hand a dry-run/authorized candidate update to `blacksite-gitea-sync`. + +Do not push, close, or change tracker scope outside direct or configured authority. Run full workspace/all-feature tests and strict lint only once per candidate code digest. diff --git a/.agents/skills/blacksite-release-candidate/references/release-gates.md b/.agents/skills/blacksite-release-candidate/references/release-gates.md new file mode 100644 index 0000000..6d2d7e5 --- /dev/null +++ b/.agents/skills/blacksite-release-candidate/references/release-gates.md @@ -0,0 +1,14 @@ +# Candidate release gates + +A nominated Blacksite candidate requires, when relevant: + +- Full workspace/all-feature tests. +- Strict all-target/all-feature Clippy with warnings denied. +- Deterministic content processing and read-only check parity. +- Level/sample/project validators and migration idempotence. +- Packaging, packaged artifact validation, and launch. +- Named native editor/runtime scenarios against candidate binaries. +- Documentation authority/contradiction audit. +- Clean candidate-tree or nominated dirty-tree digest evidence. + +Do not precede workspace tests with a redundant workspace check unless a target is otherwise uncovered. Documentation-only changes do not invalidate code gates when recorded inputs are unchanged. Closure additionally requires every issue criterion, epic checklist synchronization, and configured Gitea evidence. diff --git a/.agents/skills/blacksite-selective-verify/SKILL.md b/.agents/skills/blacksite-selective-verify/SKILL.md new file mode 100644 index 0000000..f147855 --- /dev/null +++ b/.agents/skills/blacksite-selective-verify/SKILL.md @@ -0,0 +1,18 @@ +--- +name: blacksite-selective-verify +description: Select and run the smallest valid Blacksite formatting, compile, test, lint, processing, validation, packaging, and native gates based on changed files and the current task state. Use after edits or before slice/candidate completion; do not default to full workspace gates. +--- + +# Blacksite selective verification + +Read `.codex/workflow.toml` and [the verification matrix](references/verification-matrix.md), then invoke `python scripts/codex/verify.py`. + +- `plan` explains selected and skipped gates without executing them. +- `fast` runs the smallest useful edit loop. +- `slice` adds affected-package tests, strict Clippy, domain checks, docs integrity, and named native requirements. +- `candidate` is permitted only for a nominated Candidate-ready state and runs missing release gates once. +- `status` reads the digest ledger; `invalidate --reason ...` invalidates only when inputs or acceptance change. + +Every Cargo command must go through `cargo_lane.py`. Do not run overlapping Cargo processes. Reuse a PASS when its relevant input digest, command, lane signature, toolchain, features, and environment are unchanged. Store complete output under `.codex/logs/` and show only the compact result or the first bounded actionable failure. + +Do not append workspace tests, workspace Clippy, processing, validators, packaging, or native QA to an ordinary fast loop. Prefer focused tests in the lightest crate that owns the invariant. diff --git a/.agents/skills/blacksite-selective-verify/references/verification-matrix.md b/.agents/skills/blacksite-selective-verify/references/verification-matrix.md new file mode 100644 index 0000000..0c9417a --- /dev/null +++ b/.agents/skills/blacksite-selective-verify/references/verification-matrix.md @@ -0,0 +1,19 @@ +# Blacksite verification matrix + +| Changed area | Fast loop | Slice gate | Candidate impact | +|---|---|---|---| +| Markdown only | docs audit | docs audit | Rust gates remain valid | +| `AGENTS.md`, Skills, workflow scripts | script self-tests/dry run | docs audit and workflow acceptance | No Rust gate unless Rust changed | +| `crates/content_pipeline/**` | pipeline check and focused tests | pipeline tests and strict Clippy; processing if output changed | Full gate later | +| `crates/shared/**` schemas/types | shared check and focused tests | shared tests, dependent checks, migration dry run if needed | Full gate later | +| `crates/editor/src/ui/**` | editor library check; focused wiring tests | editor tests/Clippy and named native scenario | Full gate later | +| `crates/blacksite_surface/**`, shaders | surface check/tests | surface Clippy and relevant renderer scenarios | Full gate later | +| `xtask/**` packaging | focused xtask/package test | repeat package test and package dry run | Package candidate required | +| Registry/catalog inputs | processing check | validators and deterministic write/check | Package/native as relevant | +| Migration/schema versions | focused migration tests/dry run | fixture apply, idempotence, rollback | Full gate later | +| Gitea only | No Cargo | Tracker readback | No code gate | +| Session/evidence only | No Cargo | Evidence integrity | No code gate | + +Fast checks normally use the `dev` lane. Candidate, package, hot-reload, and full-debug work use their named disposable lanes. A docs-only edit never invalidates a code gate whose recorded input digest is unchanged. + +Rust gate digests fingerprint the owning package and its local dependency closure, relevant Cargo and workflow configuration, the exact gate/lane, tool versions, and build-affecting environment. Documentation and unrelated packages are excluded, so their edits preserve valid focused Rust evidence; changes to a dependency, relevant configuration, toolchain, or environment invalidate it. diff --git a/.agents/skills/blacksite-task-state/SKILL.md b/.agents/skills/blacksite-task-state/SKILL.md new file mode 100644 index 0000000..405c537 --- /dev/null +++ b/.agents/skills/blacksite-task-state/SKILL.md @@ -0,0 +1,19 @@ +--- +name: blacksite-task-state +description: Maintain resumable Blacksite task state, scope deltas, verification validity, and exact next actions during multi-step implementation, user steering, reconnects, or context compaction. Use for long or multi-subsystem work; do not use for trivial one-file edits. +--- + +# Blacksite task state + +Read `.codex/workflow.toml`, then use `python scripts/codex/state.py` to create or update the ignored `.codex/session/STATE.md`. + +Use this Skill for `continue`, `resume`, plan implementation, multi-crate work, material scope changes, native acceptance discoveries, reconnects, and path remapping. + +1. Verify the canonical repository path, branch, HEAD, dirty summary, and relevant live processes. +2. Resume an existing valid state instead of rediscovering the repository. +3. Keep the active goal, slice, acceptance target, non-goals, intentional files, decisions, evidence validity, and one exact next action current. +4. Record steering with `state.py scope-delta`. Classify it as an active-slice refinement, newly discovered blocker, added acceptance criterion, or separate follow-up. +5. State which evidence remains valid and invalidate only affected gates with `verify.py invalidate`. +6. Update state after a completed slice, native checkpoint, or remote mutation. + +Keep the file below the configured line limit. Never copy logs, issue bodies, large plans, or desktop dumps into it. diff --git a/.cargo/config.toml b/.cargo/config.toml index 1750233..423163d 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -5,9 +5,9 @@ linker = "clang" rustflags = ["-C", "link-arg=-fuse-ld=mold"] [alias] -clean-target = "run -p xtask --bin clean-target --" validate-levels = "run -p xtask --features validate-levels --bin validate-levels --" validate-samples = "run -p xtask --features validate-samples --bin validate-samples --" bake-navigation = "run -p xtask --features validate-levels --bin bake-navigation --" package-project = "run -p xtask --features validate-levels --bin package-project --" upgrade-project = "run -p xtask --features validate-levels --bin upgrade-project --" +process-assets = "run -p xtask --features content-pipeline --bin process-assets --" diff --git a/.codex/ARCHITECTURE.md b/.codex/ARCHITECTURE.md new file mode 100644 index 0000000..a5755b3 --- /dev/null +++ b/.codex/ARCHITECTURE.md @@ -0,0 +1,14 @@ +# Architecture debt ratchet + +Blacksite keeps extension seams sustainable at the point of change. New behavior belongs in the +smallest domain module that owns it; an already-large file is not permission to add more behavior +there. + +`architecture.toml` is the machine-readable policy. `scripts/codex/architecture_audit.py` enforces +three default nonblank-line budgets: 500 for UI shells, 800 for other UI modules, and 1,200 for +other production Rust modules. Existing files above those budgets have frozen ceilings and may +shrink but never grow. + +An exception is temporary and must name a tracker issue, rationale, hard maximum, extraction +target, and expiry milestone. Passing the audit means the debt did not regress; it does not mean an +exception is complete. Candidate review must reject expired exceptions. diff --git a/.codex/architecture.toml b/.codex/architecture.toml new file mode 100644 index 0000000..3a33122 --- /dev/null +++ b/.codex/architecture.toml @@ -0,0 +1,34 @@ +version = 1 + +[limits] +ui_shell = 500 +ui_module = 800 +production_rust_module = 1200 + +[shells] +"crates/editor/src/ui/asset_browser/panel.rs" = 500 +"crates/editor/src/ui/inspector.rs" = 500 + +# Frozen baselines are debt ceilings, not targets. They may shrink but never grow. +[baselines] +"crates/scene/src/project_validation.rs" = 4685 +"crates/editor/src/assets/prefab_overrides.rs" = 4238 +"crates/editor/src/scene/scene_io.rs" = 4196 +"crates/editor/src/history/mod.rs" = 3651 +"crates/editor/src/assets/catalog.rs" = 2077 +"crates/scene/src/navigation.rs" = 2346 +"crates/shared/src/components.rs" = 1831 +"crates/game/src/animation.rs" = 1690 +"crates/editor/src/project/collaboration.rs" = 1649 +"crates/editor/src/ui/viewport_chrome.rs" = 1575 +"crates/content_pipeline/src/transaction.rs" = 1477 +"crates/content_pipeline/src/import.rs" = 1417 +"crates/editor/src/viewport/brush_edit.rs" = 1286 +"crates/editor/src/viewport/material_drop.rs" = 1269 +"crates/editor/src/viewport/visualizers.rs" = 1221 +"crates/scene/src/upgrade.rs" = 1203 +"crates/editor/src/ui/navigation_inspector.rs" = 1210 +"crates/editor/src/ui/hierarchy.rs" = 1149 +"crates/editor/src/ui/material_library.rs" = 1011 +"crates/editor/src/ui/animation_inspector.rs" = 971 +"crates/editor/src/ui/component_registry.rs" = 864 diff --git a/.codex/config.toml b/.codex/config.toml new file mode 100644 index 0000000..5cb54df --- /dev/null +++ b/.codex/config.toml @@ -0,0 +1,2 @@ +approval_policy = "on-request" +workspace_root = "/home/Rbanh/Documents/Bevy" diff --git a/.codex/templates/GITEA_STATUS_COMMENT.md b/.codex/templates/GITEA_STATUS_COMMENT.md new file mode 100644 index 0000000..33b7834 --- /dev/null +++ b/.codex/templates/GITEA_STATUS_COMMENT.md @@ -0,0 +1,19 @@ +## Codex status — + +**Scope completed** +- ... + +**Verification** +- `` — PASS +- Native scenario `` — PASS/NOT RUN + +**Documentation** +- Canonical docs updated: ... +- Contradiction audit: PASS/remaining ... + +**Candidate** +- Commit: working tree only | `` +- This is/is not closure evidence. + +**Remaining** +- ... diff --git a/.codex/templates/SCOPE_DELTA.md b/.codex/templates/SCOPE_DELTA.md new file mode 100644 index 0000000..0f709a1 --- /dev/null +++ b/.codex/templates/SCOPE_DELTA.md @@ -0,0 +1,7 @@ +### Delta N — title +- Source: +- Classification: active-slice refinement | newly discovered blocker | added acceptance criterion | separate follow-up +- Added/changed requirement: +- Prior evidence still valid: +- Invalidated gates: +- Tracker sync required: yes | no diff --git a/.codex/templates/SESSION_STATE.md b/.codex/templates/SESSION_STATE.md new file mode 100644 index 0000000..1b59a78 --- /dev/null +++ b/.codex/templates/SESSION_STATE.md @@ -0,0 +1,36 @@ +# Codex session state + +## Repository +- Root: +- Real path: +- Branch: +- HEAD: +- Worktree status summary: +- Active processes/windows: + +## Active task +- Goal: +- Current state: Implementing +- Gitea issue(s): +- Gitea milestone: +- Active slice: +- Non-goals: + +## Acceptance target +- [ ] Criterion + +## Scope deltas + +## Files intentionally changed + +## Verification ledger summary + +## Native evidence + +## Decisions + +## Remote actions already performed +- None. + +## Exact next action +- One concrete next step. diff --git a/.codex/workflow.toml b/.codex/workflow.toml new file mode 100644 index 0000000..d20c799 --- /dev/null +++ b/.codex/workflow.toml @@ -0,0 +1,81 @@ +version = 1 + +[session] +state_file = ".codex/session/STATE.md" +verification_file = ".codex/session/verification.json" +max_state_lines = 180 + +[output] +log_dir = ".codex/logs" +evidence_dir = ".codex/evidence" +max_failure_lines = 120 +progress_mode = "meaningful-checkpoints" + +[verification] +default_tier = "fast" +candidate_requires_explicit_state = true +reuse_by_input_digest = true +offline_after_bootstrap = true +cargo_lane_wrapper = "scripts/codex/cargo_lane.py" +persistent_lane = "dev" +candidate_lane = "candidate" +hot_reload_lane = "hot-reload" +full_debug_lane = "full-debug" +package_lane = "package" +parallel_cargo = false +run_workspace_check_before_workspace_test = false + +[build_storage] +enabled = true +strategy = "separate-build-dir-when-supported" +cache_root = "workspace-parent-cache" +workspace_partition = "canonical-path-hash" +dev_target_dir = "target" +exceptional_target_root = "target/lanes" +soft_total_gib = 55 +hard_total_gib = 80 +min_free_gib = 40 +min_free_percent = 15 +persistent_lane_max_gib = 40 +disposable_lane_max_gib = 35 +candidate_retention_hours = 24 +hot_reload_retention_hours = 24 +full_debug_retention_hours = 12 +failed_lane_retention_hours = 24 +auto_prune_disposable = true +persistent_reset = "safe-slice-boundary-after-dry-run" +delete_only_marked_lanes = true +preflight = true +postflight = true + +[git] +large_task_branch = true +local_checkpoint_commits = true +push = "explicit" +force_push = false +dirty_main_policy = "preserve-and-isolate-when-safe" + +[gitea] +repository = "Falling-Metal-Interactive/Blacksite" +read_exact_items_first = true +routine_status_comments = true +sync_acceptance_checkboxes = true +sync_epic_checklists = true +create_issues = "explicit" +change_scope_or_milestone = "explicit" +close_issues = "candidate-only" +close_milestones = "candidate-only" +delete_or_reopen = "explicit" +max_status_comments_per_slice = 1 + +[documentation] +authority_manifest = "docs/authority.toml" +classify_all_docs = true +historical_banner_required = true +canonical_topic_unique = true +completed_plans_become_historical = true + +[native_qa] +reuse_running_session = true +capture_target_window_only = true +restore_fixtures = true diff --git a/.cursor/plans/animation_authoring_2026-07-11.plan.md b/.cursor/plans/animation_authoring_2026-07-11.plan.md index 74f0834..08c026c 100644 --- a/.cursor/plans/animation_authoring_2026-07-11.plan.md +++ b/.cursor/plans/animation_authoring_2026-07-11.plan.md @@ -1,5 +1,7 @@ # Skeletal Animation Import, Preview, And Authoring +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Working implementation plan for Gitea issue [`#46`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/46). This is the minimum production animation loop required by the M7 content-production milestone. diff --git a/.cursor/plans/audio_authoring_2026-07-10.plan.md b/.cursor/plans/audio_authoring_2026-07-10.plan.md index 69807ab..7a5166d 100644 --- a/.cursor/plans/audio_authoring_2026-07-10.plan.md +++ b/.cursor/plans/audio_authoring_2026-07-10.plan.md @@ -1,5 +1,7 @@ # Audio Authoring And Runtime Parity +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Working implementation plan for Gitea issue [`#47`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/47). This is the minimum complete audio loop required by the M7 content-production milestone. diff --git a/.cursor/plans/blacksite_production_readiness_2026-07-10.plan.md b/.cursor/plans/blacksite_production_readiness_2026-07-10.plan.md index a3ad794..c94481c 100644 --- a/.cursor/plans/blacksite_production_readiness_2026-07-10.plan.md +++ b/.cursor/plans/blacksite_production_readiness_2026-07-10.plan.md @@ -1,5 +1,7 @@ # Blacksite Editor Production Readiness Program +> **Active plan — desired scope and acceptance, not implementation truth.** Current shipped behavior is indexed in the [canonical documentation](../../docs/README.md). + Working milestone plan for the production expansion tracked by Gitea epic [`#1`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/1). The existing Jackdaw-inspired M0-M5 roadmap remains the authoring/tool foundation. This plan adds diff --git a/.cursor/plans/collider_diagnostics_2026-07-12.plan.md b/.cursor/plans/collider_diagnostics_2026-07-12.plan.md index a1a5a25..37d4ec6 100644 --- a/.cursor/plans/collider_diagnostics_2026-07-12.plan.md +++ b/.cursor/plans/collider_diagnostics_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Collider Authoring Diagnostics - 2026-07-12 +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Issue: Gitea #26 (`BS-JD-305`) ## Outcome diff --git a/.cursor/plans/component_system_refactor_2026-06-05.plan.md b/.cursor/plans/component_system_refactor_2026-06-05.plan.md index d6e9f3f..e3db88d 100644 --- a/.cursor/plans/component_system_refactor_2026-06-05.plan.md +++ b/.cursor/plans/component_system_refactor_2026-06-05.plan.md @@ -1,5 +1,7 @@ # Component System Refactor Plan - 2026-06-05 +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + ## Goal Align the actor inspector and static mesh authoring model with diff --git a/.cursor/plans/content_workspace_and_import_authoring_2026-07-13.plan.md b/.cursor/plans/content_workspace_and_import_authoring_2026-07-13.plan.md new file mode 100644 index 0000000..7961624 --- /dev/null +++ b/.cursor/plans/content_workspace_and_import_authoring_2026-07-13.plan.md @@ -0,0 +1,456 @@ +# Content Workspace And Import Authoring Refactor + +> **Active plan — desired scope and acceptance, not implementation truth.** Current shipped behavior is documented in the [Content Workspace guide](../../docs/editor/content-workspace.md). + +Date: 2026-07-13 + +## Status + +Active acceptance plan for Gitea milestone **M2 - Content workspace and asset pipeline**. Current +implementation state, user steering, invalidated evidence, and the exact next action live in the +ignored `.codex/session/STATE.md`; accepted scope and closure state live in Gitea #59 and #65. The +local candidate tree passed the complete candidate gate on 2026-07-17; its exact commit is assigned +at publication, so this plan must not be read as remote completion evidence yet. It remains the +desired acceptance target until M2 is accepted, then becomes a frozen historical record. + +## Gitea Tracking + +- Milestone: [M2 - Content workspace and asset pipeline](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/milestone/12) +- Epic: [#59 BS-JD-211 - Content workspace and import authoring refactor](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/59) +- Contract and catalog: [#60 BS-JD-212](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/60), [#62 BS-JD-214](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/62) +- File operations and import: [#20 BS-JD-205](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/20), [#61 BS-JD-213](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/61) +- Model materials: [#64 BS-JD-215](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/64), [#63 BS-JD-216](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/63) +- Final gate: [#65 BS-JD-217](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/65) +- Engine fallback: [#66 BS-JD-218](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/66) +- Responsive authored documents: [#67 BS-JD-219](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/67) +- Modular editor architecture: [#68 BS-JD-220](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/68) + +## Goal + +The active corrective slice also requires one overlay-first Material handle authority, conditional +ARM/ORM-only derived processing, registry-only Inspector dispatch, shared Material/asset-card UI, +and the ADR 0048 architecture ratchet. Both large UI files are now <=500-line shells; #68 remains +open until selective verification, critical native acceptance, and publication approval are +complete. + +The current #68 refinement adopts the Penpot **Inspector Material Slot** as the first Blacksite +design-system reference. Penpot owns geometry, typography, and interaction-state references; +Blacksite's editor-owned semantic palette owns color and is published into Penpot Assets / Colors. +The current palette is the default, with preference selection deferred behind the same palette +seam. Shared semantic tokens, Source Sans Pro typography, action-returning +material panels, responsive property grids, and custom asset/color pickers must match the 640 px +and 420 px references. The Inspector has a hard 420 px floor and one actor-body scroll region. +Runtime material authority and explicit-save behavior remain +owned by #67 and ADR 0047; wider editor-panel migration is not part of this slice. + +Make the Content Browser behave like a project file manager and make imported models behave like +editable engine assets: + +- users organize source and authored assets in any folder beneath the project `assets/` content + root; +- importing copies into the current or explicitly chosen project folder instead of sorting by file + extension; +- static and skinned model assets expose stable material slots whose defaults can use source + materials, existing project Materials/Material Instances, or extracted editable Materials; +- move, rename, reimport, validation, packaging, and headless processing preserve stable identity + and never silently overwrite authored material work. + +This matches the portable project-content model used by Unity and Unreal. Arbitrary absolute paths +outside the project are not part of this milestone: external linked assets require a separate +virtual-filesystem, packaging, and source-control decision. + +## Existing Foundation To Reuse + +- `AssetRegistry` owns UUIDs, source fingerprints, import settings, and generated-manifest paths. +- The Content Browser already scans nested folders below `assets/`, renders thumbnails and model + subassets, stages import settings, reimports, and moves deleted files to `assets/.trash/`. +- Static and skinned renderers already share stable material-slot IDs, imported-source fallback, + explicit scene-level project Material assignments, and orphan preservation. +- Project Materials and direct-base Material Instances are editable, schema-driven assets with a + dedicated Material Library. Parameter edits update shared runtime handles every frame and mark an + asset-keyed document dirty; pointer release performs no persistence or processing. Explicit Save + publishes guarded source and queues affected-only derived processing in the background. +- Imported-source fingerprints are content-addressed, and FBX dependency bundles already use a + sandboxed transactional copy. + +The refactor must extend these contracts rather than add a second catalog, material type, or model +loader. + +## Implementation Snapshot + +- [Implemented] Destination-first Import Here/Import To, in-project adoption, exact-path review, + dependency/source fingerprint guards, dependency-bundle preflight, and whole-batch rollback. +- [Implemented] Folder-independent registry-v3 classification and one `content_pipeline` engine for + editor transactions, watcher refresh, validation, headless processing, and packaging catalogs. +- [Implemented] File-manager selection, folders, item/batch/visible-empty-space context menus, + content-scoped keyboard operations, protected managed folders, safe navigation and subasset + semantics, guarded undo, transaction review, collaboration state, trash, stable-reference + rewrites, hidden-selection clearing when filters change, consistent right-click targeting, and + restart-safe explicit identity selection for ambiguous out-of-editor moves. +- [Implemented] Stable per-slot model defaults, orphan reconciliation, six-layer material + precedence, project fallback, immutable DefaultGrid, and reviewed exact-slot + MaterialPropertyBlock promotion with transactional rollback. +- [Implemented] Transactional glTF/GLB/FBX material extraction with provenance, explicit + diff/apply/create-new re-extraction, plus loose-texture PBR grouping. +- [Implemented 2026-07-15] Scene schema v6 and actor-only `MaterialSlot` ownership for + primitives/static/skinned renderers; primitive-local `MaterialDesc` hydration and the synthetic + Authoring Material card are removed. The unified slot widget supports valid/invalid drag state, + inherited effective status, guarded shared parameter editing, direct-base instance creation, + actor-exact source extraction, and property-block promotion. +- [Implemented 2026-07-14] Typed thumbnail keys separate textures, models, mesh subassets, and + source materials. Models always queue geometry rendering and static draw previews request their + exact mesh subasset; the Poly Haven metal office desk regression is unit-covered. +- [Implemented 2026-07-15] Thumbnail cache replacement, retry, and catalog invalidation release the + last Egui image registration for each key. Repeated studio renders no longer retain hidden GPU + render targets after the visible cache entry is gone. +- [Implemented 2026-07-14] Asset-keyed authored documents separate live Material/Instance and + import-setting edits from explicit source publication. Context Save, Save All, recovery, + conflict state, separate Git/processing badges, and revisioned background processing remove + pointer-release writes and synchronous content work from material controls. +- [Implemented 2026-07-17] Penpot-led design-system foundations and the unified + primitive/static/skinned material panel are in the local worktree. The revised handoff adds + field-click texture pickers with Locate/Clear, Separate/ORM presentation, and shared UV + Offset/Tiling controls. Blacksite's default semantic palette now replaces the panel-private + prototype colors. Exact 640/420 px native acceptance and responsive resize/deep-scroll scenarios + pass on the final geometry. +- [Implemented 2026-07-17] #67/#68 corrective sampler and Penpot v2.3 slice: project textures use + catalog-authored Repeat/Clamp/Mirror sampling across Standard and Surface paths; the shared panel + has one Shader selector, UV before Advanced, typed texture thumbnails, and a disabled Advanced + preview with no authored/runtime state. +- [Implemented 2026-07-17] #68 Penpot v2.3.1 corrective pass: the design component and every state + reference remove Shading Model and UV/Advanced overlap; the shared Material asset zone owns + assignment and its current/recent/project picker; Surface, Packed Maps, inputs, UV, and Advanced + use the locked reference heights; and the actor-salted Inspector body is clipped below its fixed + identity header. Managed verification and Codex-owned native visual acceptance pass. +- [Implemented 2026-07-17] Direct exports of the default, expanded Advanced, Material picker, and + color picker are now the numeric baseline. The exact pass removes the invented drop cue and Blend + label, restores the fixed Inputs columns, boxed ORM guidance, `UV` label, Advanced summary, compact + Material menu, paired color/HEX values, normal strength, and the seventh Emissive Intensity row. +- [Implemented 2026-07-17] The final #68 micro-geometry pass makes the exported 420 x 350 color + overlay Inspector-centered and modal, locks its value/alpha/recents/footer coordinates, keeps the + eyedropper as a disabled planned preview, replaces stock material sliders with the 130 px Penpot + scalar control, and scroll-reveals the complete expanded Advanced body. Geometry and popup + interaction tests plus native captures pass. +- [Implemented 2026-07-17] Native Inspector splitter endurance exposed a viewport-target ownership + leak: every intermediate width allocated another full-resolution HDR Image and Egui retained each + strong registration until Solari terminated on GPU OutOfMemory. The corrective path resizes one + stable Image asset in place, unregisters exceptional replacements/absent targets, and requires a + repeated wide/narrow drag endurance pass before #68 visual acceptance resumes. +- [Implemented 2026-07-17] Native top-level window resizing exposed a distinct NVIDIA Wayland + swapchain-acquire timeout loop after the target-ownership leak was removed. The editor host now + prefers an Immediate/Mailbox presentation path while packaged game windows retain VSync; repeated + native-window resize remains the focused acceptance gate. +- [Implemented 2026-07-17] Native narrow/tall Inspector captures exposed a universal overflow + boundary defect: solid scrollbar allocation changed responsive widths and nested component cards + could replace the actor-body clip. The shared Inspector now keeps a stable floating scroll rail, + intersects every touched child clip, and ready texture fields omit the redundant image glyph. +- [Implemented 2026-07-17] The final #68 Penpot boards supersede the earlier v2.2/v2.3 slot + geometry. Inspectors render a 32 px **Materials** heading and ordered 82/52 px collapsible slots, + a nested PARAMETERS spine, 616/396 px slot references, 592/372 px parameter bodies, and one + 420 px Inspector floor. Surface owns Separate/ORM; Inputs has six 30/56 px primary rows, with + independently stored Emissive Intensity presented as the Emissive color companion. +- [Implemented 2026-07-17] The exact geometry correction replaces flow-derived Surface, input, + texture-action, and UV placement with clipped owning-rectangle models for the exported 592/372 px + sections. Texture names can no longer move row actions, UV labels no longer share coordinates, + and transient sub-minimum widths use a bounded overflow fallback. Focused engineering verification + and 640/420/short-height native captures pass. +- [Candidate gate passed 2026-07-17; pending publication] The complete all-feature test and strict + lint gates, deterministic processing, level/sample validators, QA package, architecture audit, + and documentation audit pass on the local candidate tree. Native runtime-injected property-block + promotion, skeletal import, explicit scene-slot assignment, and broken project-fallback behavior + also pass. Exact-commit clean-tree readback, evidence publication, and Gitea closure remain. +- [Corrective acceptance in progress 2026-07-17] The current Penpot README and active 01–30 boards + supersede the earlier 640/420 material-only references and invalidate the prior candidate's UI + acceptance. M2 now requires the shared 50 px Inspector Header, renderer Array Header/panels, + foundation controls, overlays, and current 620/420 Material references across the complete + Inspector. The new wide/narrow Material canvases are 596/396 px with 569/369 px parameter + sections, 32/58 px rows, and 54/94 px UV sections. Candidate publication and issue closure remain + blocked until refreshed engineering and Codex-owned native evidence pass on one exact tree. + +## Target Contracts + +### Project content boundary + +- User-managed content may live in any normal nested folder under `assets/`. +- Folder names are organizational only and never determine asset type. +- `assets/.index/`, `assets/.trash/`, thumbnail storage, and UUID-keyed derived artifacts remain + editor-managed and protected from ordinary file operations. +- The storage ADR decides whether existing generated directories remain in place or migrate behind + `.index`; either way, they stay hidden and are never presented as imported user content. + +### Registry and type authority + +- `AssetId` remains authoritative identity; the current project-relative path is mutable metadata. +- Extension plus parsed document schema/registry kind determines type. Moving a Material beside a + model does not turn it into a level. +- All editor, hydration, validation, and packaging paths resolve current locations through stable + identity before consulting cached path hints. +- Existing projects migrate without replacing UUIDs or rewriting semantically unchanged files. + +### Filesystem operations + +- Create Folder, Rename, Move, Duplicate, Cut/Copy/Paste, drag-to-folder, trash, and restore work on + assets and folders. +- Ref-affecting operations show collisions, dependencies, collaboration state, and affected authored + files before commit. They use guarded, staged filesystem transactions with rollback on failure. +- Reversible filesystem operations create guarded content-undo entries. Undo is refused after an + external fingerprint change; trash/restore remains the recovery model for deletion. +- External filesystem changes reconcile by stable ID/fingerprint where unambiguous and otherwise + produce an explicit repair flow. + +### Destination-first import + +- **Import Here** targets the selected Content Browser folder. **Import To...** chooses another + folder beneath `assets/` without changing the browser location. The native picker opens only + after the destination is pinned, then a second review previews every dependency and final path. +- External files are copied into the chosen project folder; files already inside project content + are registered/processed in place instead of copied again. +- Import never silently creates visible `models/`, `textures/`, `audio/`, or `materials/` folders. +- Dependency-relative bundles, overwrite conflicts, collaboration guards, staging, and rollback + are resolved before registry publication. +- Registry records retain optional source provenance and a deterministic reimport recipe without + making an external absolute path a runtime dependency. + +### Model asset material defaults + +Material resolution uses the strongest valid authored layer in this order: + +1. runtime `MaterialPropertyBlock`; +2. placed renderer/prefab slot assignment; +3. model-asset per-slot default; +4. imported source material; +5. project default Material/Instance; +6. immutable engine DefaultGrid. + +Mappings are keyed by stable imported slot/subasset IDs, never display names. Changing a model-asset +default updates existing and future placements that do not carry a scene override; clearing a scene +override returns to the next intentional layer. A configured-but-broken explicit reference reports +a diagnostic and renders DefaultGrid instead of exposing a weaker assignment. Static and skinned +renderers use the same resolution rules without sharing geometry/hydration components. + +Reimport reconciles by stable slot ID. Removed mappings become visible orphans and are never moved to +a similarly named slot automatically. + +### Editable imported materials + +- A model import can keep source fallback, map a slot to an existing project material, extract a + supported source material into an editable project Material, or intentionally select Default. +- Extraction previews destination paths, naming collisions, external texture channels, render + state, provenance, and supported PBR parameters before writing. Embedded texture payloads remain + source-owned and are not misrepresented as extracted project textures. +- Extracted Materials are ordinary project assets and may live beside the model or anywhere else + under `assets/`. +- Source provenance is recorded, but reimport never overwrites an edited Material silently. Updating + an extracted material requires an explicit diff/apply decision. +- Unsupported source features produce diagnostics and preserve a predictable source/fallback path; + partial conversion is never presented as lossless. + +## Milestone Work Packages + +### Epic — Content workspace and import authoring refactor + +Tracks the milestone contract, dependencies, sequencing, and exit evidence. It is not an +implementation substitute for the focused issues below. + +### Architecture — Project content and derived-artifact contract + +- [Implemented] Add ADR 0045 covering the content root, registry/type authority, mutable paths, + protected managed directories, import provenance, and the six-layer material resolution contract. +- [Implemented] Define explicit migrations for registry v1, project settings, legacy cached refs, + whole-model material policy, and mesh material overrides. +- [Implemented] Replace fixed-folder consumers across editor, shared hydration, scene validation, project + settings, and packaging. + +### Existing BS-JD-205 — Content Browser file operations and reference-safe moves + +Expand the existing rename/move repair ticket instead of duplicating it: + +- [Implemented] create folder, rename, move, duplicate, cut/copy/paste, drag-to-folder, and + transactional trash/restore with stable-ID manifests and collision guards; +- [Implemented] file-manager selection for assets and folders (single, Ctrl/Cmd toggle, Shift range, select all), + batch operations, keyboard shortcuts, and scoped context menus on assets, folders, and unused + content space; +- [Implemented] asset/folder collision, collaboration, external-fingerprint, and dependency-impact preview; +- [Implemented] atomic registry/reference repair and external-change reconciliation; +- [Implemented] selection, breadcrumb, thumbnail, and Material Library continuity after moves. + +### Destination-first transactional import + +- [Implemented] Replace extension-to-directory routing with current-folder/explicit-folder import. +- [Implemented] Register files already under project content in place. +- [Implemented] Preserve FBX/glTF relative dependencies safely and reject collisions before any + selected source mutates the destination. +- [Implemented] Roll back the complete multi-source publication batch on failure; cancellation + remains non-mutating. + +### Path-agnostic catalog, loading, validation, and packaging + +- [Implemented] Remove folder-name asset classification and fixed material/shader/model discovery paths. +- [Implemented] Resolve stable IDs to current paths in editor and runtime consumers. +- [Implemented] Make the live editor watcher, headless processing, validators, and build manifests + share the same catalog rules. Live refresh debounces changes, ignores generated/managed noise, + suppresses editor transactions, republishes registry/runtime catalog, and invalidates thumbnails. +- [Implemented] Migrate representative registry/model records while preserving UUIDs and + semantically unchanged user-authored bytes. + +### Built-in DefaultGrid and project fallback + +- [Implemented] Provide one immutable, UV-independent engine material with forward/Solari parity and a shared + emergency StandardMaterial handle. +- [Implemented] Let Project Settings select a registry-backed project Material/Instance fallback; Clear or an + invalid reference returns to DefaultGrid with diagnostics. +- [Implemented] Apply the fallback to unresolved static/skinned slots, primitives without an active material, + unassigned brush faces, and model/mesh previews. Terrain keeps its specialized layer fallback. + +### Unified actor material slots and previews + +- [Implemented] `MaterialSlot`/`MaterialSlotSet` are the primary contracts; schema-v4 renderer names + remain compatibility aliases for one cycle. `Primitive.surface` always uses + `slot:primitive:surface` and new placements begin unassigned. +- [Implemented] Hydration binds the exact primitive/static/skinned slot to one cached emergency + handle, then resolves explicit/model source/project default/DefaultGrid without actor-local + material creation. Component-form `MaterialDesc` remains only for the brush fallback path. +- [Implemented] One inspector widget exposes the effective Material sphere/name/status, + Browse/Locate/Clear, a full-width Material/Instance target, red explanatory Texture rejection, + expandable guarded shared parameters, exact-slot instance creation, imported-source extraction, + and property-block information/promotion. +- [Implemented] Scene schema v6 stores actor-only slot assignments; the explicit upgrader converts primitive, mesh-wide, and per-slot legacy values + into saved slots and deterministic deduplicated project Materials. Normal loading remains + non-writing and validation diagnoses unmigrated actor components. +- [Implemented] Model cards always use the offscreen scene studio; texture loading is texture-only. + Typed cache keys prevent cross-category collisions and static mesh inspector previews request + exact mesh-subasset renders. + +### Model-asset material slot mapping + +- [Implemented] Persist model-default mappings by stable slot/subasset ID. +- [Implemented] Add Content Browser model-details controls to Browse, Assign, Locate, Clear, and inspect orphans. +- [Implemented] Apply the six-layer resolution contract to static and skinned hydration. +- [Implemented] Reimport without rewriting scene overrides or resetting skinned animation state. + +### Editable source-material extraction and import-policy UX + +- [Implemented] Convert supported glTF/GLB/FBX PBR source values and external textures into guarded + `MaterialAsset` documents. +- [Implemented] Let each slot choose Source, Existing Project Material, Extract Editable, or Default. +- [Implemented] Integrate PBR texture-set detection from BS-JD-202 without conflating filename + grouping with model source-material conversion. The folder action now previews confidence, + supports manual roles and target merge/split, and publishes no-overwrite Material batches through + the shared transaction engine. +- [Implemented] Preview converted values, destinations, collisions, provenance, and render state. + Provenance-matched re-extraction requires an explicit diff-backed Apply or Create New choice; + Apply is fingerprint-guarded and byte-restoring, while unrelated provenance is never overwritten. + +### Migration and acceptance signoff + +Use a representative project workflow: + +1. Create `assets/Props/Office/` in the Content Browser. +2. Import a static model and a skeletal model directly into that folder. +3. Extract one valid source material, map another slot to an existing Material Instance, and keep a + third slot on source fallback. +4. Place both models, add one scene-level material override, save, close, and reopen. +5. Move/rename the containing folder, reimport both models, and resolve a removed-slot orphan. +6. Verify unchanged UUIDs, model defaults, scene override precedence, editable Material contents, + thumbnails, selection, PIE/runtime rendering, headless validation, and release packaging. +7. Verify a failed/cancelled import or move leaves the exact pre-operation filesystem and registry. + +No M2 milestone issue of any priority may remain open at signoff. + +## Sequencing + +1. Epic and ADR/storage contract. +2. Path-agnostic registry/type resolution foundation. +3. BS-JD-205 file operations and destination-first import. +4. DefaultGrid/project fallback and model-asset material mapping. +5. Editable extraction plus BS-JD-202 PBR grouping integration. +6. [Implemented] BS-JD-204 live refresh and BS-JD-206 headless parity. +7. Migration/native/headless/package acceptance. + +[Implemented] BS-JD-208 runtime MaterialPropertyBlocks applies after resolved bases with cached +per-owner/slot handles and exact-slot transactional promotion. +Solari dynamic-deformation work remains independent and is not a prerequisite for this refactor. + +## Documentation On Implementation + +- [Implemented] Create and index ADR 0045; update ADR 0035 and ADR 0044 where contracts changed. +- [Implemented] Add `docs/editor/content-workspace.md` as the canonical workflow/reference document and index it + from `docs/README.md` and `docs/editor/README.md`. +- [Implemented] Update root README controls, troubleshooting, and implementation checklist. +- [Implemented] Add the M2 Content Workspace feature-level native evaluation record with capture + checksums and headless/package evidence links. +- [Pending signoff] Upload the native PNGs to Gitea and rerun the record from the exact committed + implementation revision. + +## Verification Matrix + +- Unit tests: path/type resolution, collision planning, slot mapping precedence, orphan + reconciliation, conversion fidelity, provenance, and migration. +- Transaction fixtures: recursive move/rename, bundle import rollback, collaboration conflict, + cancelled extraction, and external filesystem moves. +- Editor tests: file-manager actions, exact model-slot mapping, static/skinned parity, save/reopen, + and no scene dirtiness from previews. +- [Passed 2026-07-13] Focused unit/transaction/editor suites; `cargo process-assets` write followed + by read-only check over 42 assets; project validation over 97 dependencies with 0 blockers. +- [Passed 2026-07-13] Five sample projects validate with 0 blockers; repeated QA packaging reuses + unchanged files, includes/fingerprints the runtime catalog, and the native executable remains + healthy through a bounded launch smoke test. +- [Passed 2026-07-13] Development packaging publishes after accepting an equivalent legacy lock + output with a trailing separator; the regression is unit-covered, the packaged runtime catalog + is byte-identical to the headless catalog, and an eight-second native launch leaves no process + behind. +- [Passed 2026-07-13] `cargo fmt --all -- --check`, strict workspace/all-target/all-feature Clippy, + and the complete workspace/all-feature unit and documentation test suite. +- [Passed 2026-07-13] Native Content Browser selection, batch and empty-space menus, basic item + actions, managed-folder hiding, background/item interaction priority, and Details resizing; see + `docs/editor/evaluations/content-workspace-m2/`. +- [Passed 2026-07-14] All-feature workspace tests, strict all-target/all-feature Clippy, 48-asset + write/check parity, 116/121-dependency validators with no blockers, byte-identical packaged + catalog, and live mapped editor/package windows. +- [Passed locally 2026-07-14] Destination-first skeletal import and placement, broken project + fallback to DefaultGrid, and exact-slot skinned scene override. The registry was restored to the + built-in default before the final deterministic refresh. +- [Passed locally 2026-07-14] Focused Import To/review tests prove pinned destinations, no mutation + before confirmation, collision refusal, source/dependency fingerprint conflicts, and complete + textual-glTF dependency tracking. Focused promotion tests prove direct-base/exact-slot + publication, one history edit, cancel/conflict/stale-input non-mutation, schema validation, and + byte-exact file/catalog rollback after a failed scene edit. +- [Passed natively 2026-07-14] Import To selected `assets/Furniture/Office` while the browser stayed + at `assets`, the second review showed the exact target for a temporary PNG, and Cancel published + no file. Capture hashes are recorded in the M2 evaluation. +- [Passed 2026-07-14] The material-slot consistency follow-through migrated the active project to + the then-current scene schema, processed 71 assets with write/check parity, passed 330 editor tests plus the + complete all-feature workspace suite and strict Clippy, published the development package, and + kept both the live editor and packaged runtime healthy through bounded Wayland launches. Native + inspection confirmed the primitive-owned Surface Material slot and expandable shared parameters; + typed thumbnail tests confirm the Poly Haven office desk queues geometry renders rather than its + albedo texture. +- [Corrected 2026-07-14] Assigned Standard Materials now detach from the singleton emergency + handle during resolution. The regression begins with a neutral-grey hydrated handle, verifies + that fallback remains unchanged, and checks the resolved project asset's base color, metallic, + and roughness on its reference-scoped cached handle. +- [Passed natively 2026-07-17] Editor-only BRP injected a two-parameter + `MaterialPropertyBlock` into Ground's `slot:primitive:surface`; the Inspector promoted one sparse + direct-base Material Instance, assigned the exact slot through one history edit, and removed the + runtime block only after successful publication. Undo restored the prior slot, and the temporary + instance, registry, catalog, scene, and Pebble fixture were restored byte-for-byte afterward. +- [Passed on candidate tree 2026-07-17; exact-commit readback pending] Refresh/validation of + unchanged content writes no files (`process-assets --check`: 78 discovered, zero changes). +# Material authoring UI and Texture processing completion (2026-07-14) + +- [x] Replace duplicated Standard fields with schema-v2 `MaterialInputSchema` and + `MaterialInputSet` documents; keep Material Instance overrides sparse. +- [x] Use one compact primitive/static/skinned material-slot widget with an embedded sphere, + assignment status/actions, responsive parameters, and diagnostics outside parameter rows. +- [x] Pair Standard Lit multipliers with textures and expose ARM/ORM, Separate Maps, and custom + channel selection. +- [x] Add registry-v3 typed Texture properties and a shared deterministic UASTC/KTX2 processor. +- [x] Canonicalize AO/Roughness/Metallic selections to R/G/B ARM and publish runtime-catalog v2 + paths for Forward and Surface/Solari consumers. +- [x] Extend the explicit transactional upgrader for registry v2 and Material/Instance/Shader + Schema v1 documents; current normal loading remains non-writing. +- [ ] Codex-owned critical native acceptance covers persistent live edits, scalar Save without + processing, ARM background processing, final wide/narrow material cards, long Content Browser + labels/status, clean-value recovery retirement, restart persistence, and Forward/Solari + presentation. The user explicitly delegated this QA; low-quality UI is a failure, not + acceptable evidence. diff --git a/.cursor/plans/deterministic_asset_fingerprints_2026-07-13.plan.md b/.cursor/plans/deterministic_asset_fingerprints_2026-07-13.plan.md index 41cc021..31ac6ac 100644 --- a/.cursor/plans/deterministic_asset_fingerprints_2026-07-13.plan.md +++ b/.cursor/plans/deterministic_asset_fingerprints_2026-07-13.plan.md @@ -1,5 +1,7 @@ # Deterministic Imported-Asset Fingerprints +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + **Status:** Complete at `cbd380a9413411667a83f74b66c5a2feda5e1af7`; see [`docs/editor/evaluations/deterministic-asset-fingerprints/`](../../docs/editor/evaluations/deterministic-asset-fingerprints/). diff --git a/.cursor/plans/editor_sample_regression_pack_2026-07-13.plan.md b/.cursor/plans/editor_sample_regression_pack_2026-07-13.plan.md index 505e937..6e7fb96 100644 --- a/.cursor/plans/editor_sample_regression_pack_2026-07-13.plan.md +++ b/.cursor/plans/editor_sample_regression_pack_2026-07-13.plan.md @@ -1,5 +1,7 @@ # Editor Sample Regression Pack +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Date: 2026-07-13 Issue: BS-JD-501 / Gitea #32 Milestone: M5 - Regression, docs, and first-hour UX diff --git a/.cursor/plans/fbx_external_texture_dependencies_2026-07-13.plan.md b/.cursor/plans/fbx_external_texture_dependencies_2026-07-13.plan.md index 8a705ee..a2cb162 100644 --- a/.cursor/plans/fbx_external_texture_dependencies_2026-07-13.plan.md +++ b/.cursor/plans/fbx_external_texture_dependencies_2026-07-13.plan.md @@ -1,5 +1,7 @@ # FBX External Texture Dependencies +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + **Issue:** Gitea #58 (`BS-JD-210`) ## Goal diff --git a/.cursor/plans/guarded_shutdown_savepoints_2026-07-13.plan.md b/.cursor/plans/guarded_shutdown_savepoints_2026-07-13.plan.md index 949b5d6..8fc21dd 100644 --- a/.cursor/plans/guarded_shutdown_savepoints_2026-07-13.plan.md +++ b/.cursor/plans/guarded_shutdown_savepoints_2026-07-13.plan.md @@ -1,5 +1,7 @@ # Guarded Shutdown And History Savepoints +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Date: 2026-07-13 Issue: BS-PR-709 / Gitea #55 Milestone: M7 - Production Readiness diff --git a/.cursor/plans/jackdaw_feature_roadmap_2026-06-06.plan.md b/.cursor/plans/jackdaw_feature_roadmap_2026-06-06.plan.md index 6c2fb29..5af4d90 100644 --- a/.cursor/plans/jackdaw_feature_roadmap_2026-06-06.plan.md +++ b/.cursor/plans/jackdaw_feature_roadmap_2026-06-06.plan.md @@ -1,5 +1,7 @@ # Blacksite Editor Roadmap: Jackdaw-Inspired Feature Tickets +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) and exact current Gitea scope instead of its original ticket drafts. + Date: 2026-06-06 Target repository: `Falling-Metal-Interactive/Blacksite` on `main`. @@ -15,7 +17,7 @@ Blacksite already has the hard foundation pieces: an editor crate, ordered plugi Recommended sequence: - **M0 - Foundation and polish seams:** Make the sandbox easy to start, easy to extend internally, and safe to mutate. This is the prerequisite for bigger tools. - **M1 - Brush-based blockout:** Add the Jackdaw-inspired level-blockout workflow: brush schema, draw/edit modes, CSG, per-face materials. -- **M2 - Materials and asset pipeline:** Make assets feel live and production-like: material browser, PBR grouping, drag/drop assignment, reference repair, headless processing. +- **M2 - Content workspace and asset pipeline:** Make project content user-organized and production-like: file-manager operations, destination-first import, model-asset material mapping and extraction, live refresh, reference repair, and headless processing. The expanded implementation contract lives in [`content_workspace_and_import_authoring_2026-07-13.plan.md`](content_workspace_and_import_authoring_2026-07-13.plan.md). - **M3 - Terrain and physics placement:** Add larger-world authoring and practical prop placement: terrain sculpting plus physics drop/settle. - **M4 - Extensibility and runtime integration:** Turn Blacksite from a single editor crate into a future-game editor platform through static extensions and narrow remote prototypes. - **M5 - Regression, docs, and first-hour UX:** Lock in quality: samples, tests, profiling, docs, and first-run guidance. @@ -40,6 +42,7 @@ Recommended sequence: | Operator framework | Blacksite has EditorHistory and EditorCommandRegistry. | Unify all mutating actions behind preview/commit/cancel/undo operators. | BS-JD-004 | | Brushes and CSG | Blacksite has primitives/static meshes, no native brush geometry yet. | Add authoring brush data, draw/edit modes, CSG, per-face material/UV. | BS-JD-101 to BS-JD-106 | | Material browser and PBR auto-detection | Blacksite has MaterialAsset, material overrides, asset browser, thumbnails. | Add dedicated Material Browser, texture-set detection, drag/drop material assignment. | BS-JD-201 to BS-JD-203 | +| Content workspace and model import authoring | The browser scans nested folders, but imports use fixed type directories and imported model defaults are not editable project mappings. | Make folders organizational, import to a chosen destination, add safe file operations, and expose editable model material defaults/extraction. | BS-JD-205, BS-JD-211 to BS-JD-217 | | Terrain sculpting | No native terrain authoring found in inspected Blacksite editor modules. | Add heightmap/chunk terrain MVP and brush tools. | BS-JD-301 to BS-JD-303 | | Physics placement tool | Blacksite has Avian, ColliderDesc/RigidBodyDesc, visualizers, PIE sim. | Add selected-body drop/settle/commit tool and collider diagnostics. | BS-JD-304 to BS-JD-305 | | Dylib extensions | Blacksite has EditorPlugin, command palette, ActorInspectorSection, optional game hot reload. | Stabilize static extension API first; treat dylib as later experimental. | BS-JD-401 to BS-JD-403 | @@ -71,16 +74,27 @@ Add the Jackdaw-inspired level-blockout workflow: brush schema, draw/edit modes, - **BS-JD-105 [P1] Per-face material and UV controls** - Allow brush faces to reference textures/materials and edit UV offset, scale, and rotation. - **BS-JD-106 [P2] Brush validation, repair, and diagnostics** - Add robust error handling for degenerate brushes, inverted normals, zero-area faces, and non-manifold results. -### M2: Materials and asset pipeline +### M2: Content workspace and asset pipeline -Make assets feel live and production-like: material browser, PBR grouping, drag/drop assignment, reference repair, headless processing. +Make project content user-organized and production-like. The original material browser, PBR grouping, +drag/drop, watcher, reference-repair, and headless-processing slices remain; destination-first import, +path-agnostic asset typing, model-asset material defaults, and editable source-material extraction are +specified in +[`content_workspace_and_import_authoring_2026-07-13.plan.md`](content_workspace_and_import_authoring_2026-07-13.plan.md). - **BS-JD-201 [P0] Material Browser and shared material catalog** - Create a dedicated Material Browser panel for named PBR materials, scene-local materials, and project-wide material assets. - **BS-JD-202 [P1] PBR texture-set auto-detection** - Detect texture sets from filenames and generate draft materials automatically. - **BS-JD-203 [P0] Drag/drop material and texture application** - Make texture/material drag/drop work consistently for static mesh actors, primitive actors, and brush faces. - **BS-JD-204 [P1] Live asset watcher and refresh** - Watch assets/ and refresh asset catalog, thumbnails, and material registry without manual refresh. -- **BS-JD-205 [P1] Asset rename/move reference repair** - Track asset moves/renames and repair scene/material/prefab references. +- **BS-JD-205 [P0] Content Browser file operations and reference-safe moves** - Add file-manager operations with stable identity, reference repair, and transactional rollback. - **BS-JD-206 [P2] Headless asset processing command** - Add xtask/cargo-style command to process assets without opening the editor UI. +- **BS-JD-211 [P0] Content workspace and import authoring refactor** - Coordinate the expanded M2 product contract and acceptance path. +- **BS-JD-212 [P0] Project content and derived-artifact contract** - Fix the storage, identity, typing, provenance, and material-resolution contract before implementation. +- **BS-JD-213 [P0] Destination-first transactional asset import** - Import or adopt content in the current or explicitly selected project folder. +- **BS-JD-214 [P0] Path-agnostic asset catalog, loading, validation, and packaging** - Remove conventional-folder semantics from every asset consumer. +- **BS-JD-215 [P0] Static and skinned model-asset material slot mappings** - Persist project Material defaults by stable imported slot ID. +- **BS-JD-216 [P1] Editable imported-material extraction and per-slot import policy** - Extract supported source materials as ordinary editable project assets without silent reimport overwrite. +- **BS-JD-217 [P0] M2 content-workspace migration and acceptance signoff** - Gate migration, native editor, headless, and packaged behavior with one representative workflow. ### M3: Terrain and physics placement @@ -763,38 +777,43 @@ Lock in quality: samples, tests, profiling, docs, and first-run guidance. **Docs to update:** - docs/editor/assets.md. -### BS-JD-205 - Asset rename/move reference repair +### BS-JD-205 - Content Browser file operations and reference-safe moves **Milestone:** M2 -**Priority:** P1 +**Priority:** P0 **Area:** Assets -**Summary:** Track asset moves/renames and repair scene/material/prefab references. +**Summary:** Turn the Content Browser into a safe project file manager while preserving stable asset identity and authored references. -**Why this matters:** General editors need robust asset references. Jackdaw has project-wide catalog concepts; Blacksite already has stable UUIDs in AssetRegistry, so this is a natural improvement. +**Why this matters:** Users need to organize content entirely inside the editor without losing scene, prefab, material, model-slot, thumbnail, or registry continuity. **Implementation notes:** - Treat AssetId as source of truth and path as mutable metadata. -- On file watcher rename or Asset Browser rename, update AssetRecord.path and all EditorAssetRef paths where asset_id matches. -- Add a missing-reference resolver dialog for files changed outside the editor. -- Add Asset Browser actions: Rename, Move, Duplicate, Delete with reference impact preview. +- Add Create Folder, Rename, Move, Duplicate, Cut/Copy/Paste, drag-to-folder, trash, and restore. +- Use guarded staged filesystem transactions with collision and dependency previews. +- Repair cached paths across scenes, prefabs, Materials/Instances, model material mappings, generated manifests, thumbnails, and registry metadata. +- Reconcile unambiguous external moves by stable identity and send ambiguous cases through an explicit repair flow. +- Protect editor-managed index, trash, thumbnail, and derived-artifact locations. **Acceptance criteria:** -- Renaming a material or model inside editor updates scene refs and registry. -- Opening a scene with missing path but matching AssetId repairs path if registry knows it. -- Deleting an asset warns about usages before commit. +- Arbitrary nested folders and all scoped file operations work entirely in the Content Browser. +- Moving supported authored/imported assets or a containing folder retains UUID identity and valid references after save/reopen. +- Recursive operations preview collisions and reference impact before commit. +- Cancelled or failed operations leave the filesystem and registry byte-for-byte unchanged. +- Trash/restore retains identity; ambiguous external moves are never guessed. **Polish details:** - Reference impact dialog lists affected scenes/entities/material slots. -- Offer 'Keep broken reference' for deliberate missing assets. -- Add undo for in-editor rename/move where practical. +- Selection, breadcrumbs, thumbnails, Material Library usage, validation, and PIE remain coherent after moves. +- Offer an explicit broken-reference choice when retaining a missing dependency is deliberate. **Tests:** -- Registry path update tests. -- Scene ref repair tests with missing asset path. +- Recursive transaction/rollback and registry-path tests. +- Reference-repair fixtures across scenes, prefabs, Materials, and model mappings. +- Native drag-to-folder, restart, and external-move acceptance. **Docs to update:** -- docs/editor/assets.md reference model. +- Canonical content-workspace guide defined by the expanded M2 plan. ### BS-JD-206 - Headless asset processing command diff --git a/.cursor/plans/material_library_and_targeted_drop_2026-07-12.plan.md b/.cursor/plans/material_library_and_targeted_drop_2026-07-12.plan.md index 7ab7374..2ef45d4 100644 --- a/.cursor/plans/material_library_and_targeted_drop_2026-07-12.plan.md +++ b/.cursor/plans/material_library_and_targeted_drop_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Material Library And Targeted Viewport Drop +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Working implementation plan for Gitea issues [`#16`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/16) and [`#18`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/18). diff --git a/.cursor/plans/navigation_authoring_2026-07-11.plan.md b/.cursor/plans/navigation_authoring_2026-07-11.plan.md index 539dc48..49e57bb 100644 --- a/.cursor/plans/navigation_authoring_2026-07-11.plan.md +++ b/.cursor/plans/navigation_authoring_2026-07-11.plan.md @@ -1,5 +1,7 @@ # Navigation Mesh Authoring, Bake Diagnostics, And Path Preview +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Working implementation plan for Gitea issue [`#48`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/48). This is the navigation production loop required by the M7 content-production milestone. diff --git a/.cursor/plans/non_blocking_native_dialogs_2026-07-12.plan.md b/.cursor/plans/non_blocking_native_dialogs_2026-07-12.plan.md index 6b743b5..2cdcf44 100644 --- a/.cursor/plans/non_blocking_native_dialogs_2026-07-12.plan.md +++ b/.cursor/plans/non_blocking_native_dialogs_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Non-Blocking Native Dialogs +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Working implementation plan for the production-readiness defect discovered during live acceptance of collaborative file safety. Opening an `rfd` picker synchronously from an egui/Bevy system stops window event processing long enough for Hyprland to report Blacksite as unresponsive. diff --git a/.cursor/plans/operator_invariants_completion_2026-07-12.plan.md b/.cursor/plans/operator_invariants_completion_2026-07-12.plan.md index c131a0d..5d3c2f5 100644 --- a/.cursor/plans/operator_invariants_completion_2026-07-12.plan.md +++ b/.cursor/plans/operator_invariants_completion_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Operator Invariants Completion +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Working plan for Gitea [`#33`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/33). diff --git a/.cursor/plans/physics_placement_2026-07-12.plan.md b/.cursor/plans/physics_placement_2026-07-12.plan.md index 4388188..3d76e8c 100644 --- a/.cursor/plans/physics_placement_2026-07-12.plan.md +++ b/.cursor/plans/physics_placement_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Physics Placement Tool - 2026-07-12 +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Issue: Gitea #25 (`BS-JD-304`) ## Outcome diff --git a/.cursor/plans/production_readiness_acceptance_2026-07-12.plan.md b/.cursor/plans/production_readiness_acceptance_2026-07-12.plan.md index 3d53ad8..aa595f0 100644 --- a/.cursor/plans/production_readiness_acceptance_2026-07-12.plan.md +++ b/.cursor/plans/production_readiness_acceptance_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Production-Readiness Acceptance Gate +> **Active plan — desired scope and acceptance, not implementation truth.** Current shipped behavior is indexed in the [canonical documentation](../../docs/README.md). + Working plan for Gitea issue [`#50`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/50). This gate is broader than the M7 feature list: it proves the complete daily authoring, content, diff --git a/.cursor/plans/project_roadmap_8a452d43.plan.md b/.cursor/plans/project_roadmap_8a452d43.plan.md index 95444b0..4c16789 100644 --- a/.cursor/plans/project_roadmap_8a452d43.plan.md +++ b/.cursor/plans/project_roadmap_8a452d43.plan.md @@ -71,6 +71,8 @@ todos: isProject: false --- +> **Superseded plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) and exact current Gitea scope. + ## Project Roadmap (Plan of Plans) This is the top-level strategy. Each milestone (M0-M8) becomes its own detailed sub-plan when started. Milestone M1 (Editor Build-Out) is fully contained inline in the "M1 detail" section below; later milestones get their detailed plans spun out as they begin. @@ -212,4 +214,4 @@ M1 out of scope (later): per-field inspector undo, multi-scene tabs, full PBR ma This roadmap is the index, and M1's full detail is contained inline above. Starting a later milestone expands its detailed scope/files/todos the same way (either inline or as a spun-out plan). M0 and M2 are the immediate next planning targets; M3 begins with a time-boxed Lightyear spike before committing. ### Out of scope for now -- Concrete release dates/staffing (cadence assumptions only), console ports, peer-to-peer topology, and full anti-cheat beyond server authority. \ No newline at end of file +- Concrete release dates/staffing (cadence assumptions only), console ports, peer-to-peer topology, and full anti-cheat beyond server authority. diff --git a/.cursor/plans/renderer_foundation_acceptance_2026-07-12.plan.md b/.cursor/plans/renderer_foundation_acceptance_2026-07-12.plan.md index 2b22393..8588b1a 100644 --- a/.cursor/plans/renderer_foundation_acceptance_2026-07-12.plan.md +++ b/.cursor/plans/renderer_foundation_acceptance_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Renderer Foundation Acceptance Split - 2026-07-12 +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Issue: Gitea #51 (`BS-JD-207`) ## Outcome diff --git a/.cursor/plans/renderer_material_component_foundation_2026-07-11.plan.md b/.cursor/plans/renderer_material_component_foundation_2026-07-11.plan.md index a16352b..b59f7e7 100644 --- a/.cursor/plans/renderer_material_component_foundation_2026-07-11.plan.md +++ b/.cursor/plans/renderer_material_component_foundation_2026-07-11.plan.md @@ -1,5 +1,7 @@ # Renderer, material, and component foundation +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + ## Goal Separate static and skinned renderer ownership, restore deterministic skinned edit poses, add shared diff --git a/.cursor/plans/rendering_unification_2026-06-05.plan.md b/.cursor/plans/rendering_unification_2026-06-05.plan.md index 2a78878..6e72e1c 100644 --- a/.cursor/plans/rendering_unification_2026-06-05.plan.md +++ b/.cursor/plans/rendering_unification_2026-06-05.plan.md @@ -1,5 +1,7 @@ # Rendering Unification Plan +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + ## Summary Unify the Bevy 0.18 rendering framework around a single effective render-stack contract. Preserve diff --git a/.cursor/plans/source_control_collaboration_safety_2026-07-12.plan.md b/.cursor/plans/source_control_collaboration_safety_2026-07-12.plan.md index 39ee0d2..fcae1bd 100644 --- a/.cursor/plans/source_control_collaboration_safety_2026-07-12.plan.md +++ b/.cursor/plans/source_control_collaboration_safety_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Source-Control Status And Collaborative File Safety +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Working implementation plan for Gitea issue [`#49`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/49). This is the final M7 implementation slice before the production-readiness acceptance gate. diff --git a/.cursor/plans/static_mesh_asset_refactor_2026-06-05.plan.md b/.cursor/plans/static_mesh_asset_refactor_2026-06-05.plan.md index 50d9f7b..49968c9 100644 --- a/.cursor/plans/static_mesh_asset_refactor_2026-06-05.plan.md +++ b/.cursor/plans/static_mesh_asset_refactor_2026-06-05.plan.md @@ -1,5 +1,7 @@ # Static Mesh Asset Refactor Plan +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Date: 2026-06-05 ## Scope diff --git a/.cursor/plans/terrain_authoring_foundation_2026-07-12.plan.md b/.cursor/plans/terrain_authoring_foundation_2026-07-12.plan.md index ea13d30..fb81f8d 100644 --- a/.cursor/plans/terrain_authoring_foundation_2026-07-12.plan.md +++ b/.cursor/plans/terrain_authoring_foundation_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Terrain Authoring Foundation +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + Working implementation plan for Gitea [`#22`](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/22). This establishes the persistent and hydrated terrain contract required by sculpting `#23`, layer diff --git a/.cursor/plans/terrain_material_layers_2026-07-12.plan.md b/.cursor/plans/terrain_material_layers_2026-07-12.plan.md index 36b79a8..8ff84ff 100644 --- a/.cursor/plans/terrain_material_layers_2026-07-12.plan.md +++ b/.cursor/plans/terrain_material_layers_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Terrain Material Layers And Weight Painting (#24) +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + ## Scope - Persist up to four shared Material/Material Instance references on each `TerrainDesc`. diff --git a/.cursor/plans/terrain_sculpt_tools_2026-07-12.plan.md b/.cursor/plans/terrain_sculpt_tools_2026-07-12.plan.md index 2e88bf7..1097447 100644 --- a/.cursor/plans/terrain_sculpt_tools_2026-07-12.plan.md +++ b/.cursor/plans/terrain_sculpt_tools_2026-07-12.plan.md @@ -1,5 +1,7 @@ # Terrain Sculpt Tools (#23) +> **Historical plan — not current implementation guidance.** Use the [documentation index](../../docs/README.md) for current behavior and architecture. + ## Scope - Add a modal terrain sculpt operator for raise, lower, flatten, smooth, and deterministic noise. diff --git a/.cursor/rules/documentation.mdc b/.cursor/rules/documentation.mdc index e823627..81cfb7f 100644 --- a/.cursor/rules/documentation.mdc +++ b/.cursor/rules/documentation.mdc @@ -1,42 +1,13 @@ --- -description: Keep project documentation current—ADRs, mission, editor docs, README checklist +description: Follow Blacksite repository and documentation authority rules alwaysApply: true --- -# Documentation Maintenance +# Repository instructions -When changing behavior, architecture, or user-facing workflows, **update docs in the same task**—do not defer. +Follow the root [`AGENTS.md`](../../AGENTS.md) and the closest subtree `AGENTS.md`. Documentation +work also follows [`docs/AGENTS.md`](../../docs/AGENTS.md), with document status and authority read +from [`docs/authority.toml`](../../docs/authority.toml). -## Doc map (single source of truth: [docs/README.md](../../docs/README.md)) - -| Change type | Update | -|-------------|--------| -| Architecture / crate boundary / sim-network split | New or updated ADR in `docs/adr/` | -| Editor framework intent, principles, non-goals | `docs/mission.md` | -| Editor feature design or phase status | `docs/editor/` (see its README) | -| User controls, run commands, troubleshooting | Root `README.md` | -| Shipped feature completion | Root `README.md` Implementation Checklist | -| Bevy upgrade policy | ADR 0002 + migration notes in `docs/adr/` | -| Milestone scope (pre-implementation) | `.cursor/plans/` plan file | - -## ADRs - -Create `docs/adr/NNNN-short-title.md` when a decision is **hard to reverse** or affects multiple crates (rendering path, scene format, PIE semantics, settings schema, netcode choice). - -Format: Status, Context, Decision, Consequences. Number sequentially. Link from `docs/README.md` and root README. - -## Coherence rules - -- **One home per fact.** Link across docs; do not copy paragraphs between README, mission, and ADRs. -- **Intent vs implementation:** mission/ADRs = *why*; README = *how to use*; crate module docs = *local API*. -- **Plans vs permanent docs:** `.cursor/plans/` holds working roadmaps; promote stable decisions into `docs/` when implemented. -- **Stale docs are bugs.** If code contradicts docs, fix both or fix docs in the same PR/task. -- **New subsystems** get a short entry in `docs/README.md` and, if editor-facing, `docs/editor/README.md`. - -## Agent checklist (end of relevant tasks) - -1. Did behavior or UX change? → README controls / checklist -2. Did architecture or policy change? → ADR or mission -3. Did editor workflow change? → `docs/editor/` -4. Added a new doc file? → index in `docs/README.md` -5. Left a deliberate gap? → "Future work" in README or an ADR Consequences section—not silent omission +This Cursor rule is intentionally only a pointer so workflow and documentation policy have one +maintained source. diff --git a/.gitattributes b/.gitattributes index 6f9142e..1eceb98 100644 --- a/.gitattributes +++ b/.gitattributes @@ -20,6 +20,7 @@ *.tga filter=lfs diff=lfs merge=lfs -text *.exr filter=lfs diff=lfs merge=lfs -text *.hdr filter=lfs diff=lfs merge=lfs -text +*.basis filter=lfs diff=lfs merge=lfs -text *.wav filter=lfs diff=lfs merge=lfs -text *.ogg filter=lfs diff=lfs merge=lfs -text *.mp3 filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1ea051e..694cef7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,6 +48,9 @@ jobs: - name: Check formatting run: cargo fmt --all --check + - name: Check architecture debt ratchet + run: python scripts/codex/architecture_audit.py check + - name: Check workspace run: cargo check --workspace --all-targets diff --git a/.gitignore b/.gitignore index 8a93262..a869d60 100644 --- a/.gitignore +++ b/.gitignore @@ -2,9 +2,12 @@ /target/ /dist/ -# Local automation and assistant state -/.agents/ -/.codex/ +# Local automation and assistant state. Repository instructions, Skills, +# configuration, and templates remain tracked. +/.codex/session/ +/.codex/logs/ +/.codex/cache/ +/.codex/evidence/ # Local environment files .env @@ -17,6 +20,8 @@ /.blacksite/backups/ # Backup, temporary, and log files +__pycache__/ +*.py[cod] **/*.rs.bk Cargo.lock.bak *.bak diff --git a/.vscode/launch.json b/.vscode/launch.json index bd081d5..bd2e9b1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -43,35 +43,6 @@ "sourceLanguages": ["rust"], "gracefulShutdown": "SIGINT" }, - { - "type": "lldb", - "request": "launch", - "name": "Editor: Hot reload", - "cargo": { - "args": [ - "build", - "-p", - "editor", - "--bin", - "editor", - "--features", - "dev,hot-reload" - ], - "filter": { "name": "editor", "kind": "bin" }, - "env": { "CARGO_TARGET_DIR": "${workspaceFolder}/target" }, - "problemMatcher": "$rustc" - }, - "args": [], - "env": { - "RUST_BACKTRACE": "1", - "WGPU_VALIDATION": "0", - "LD_LIBRARY_PATH": "${workspaceFolder}/target/debug/deps:${env:LD_LIBRARY_PATH}" - }, - "cwd": "${workspaceFolder}", - "terminal": "integrated", - "sourceLanguages": ["rust"], - "gracefulShutdown": "SIGINT" - }, { "type": "lldb", "request": "launch", @@ -174,35 +145,6 @@ "sourceLanguages": ["rust"], "gracefulShutdown": "SIGINT" }, - { - "type": "lldb", - "request": "launch", - "name": "Game: Hot reload", - "cargo": { - "args": [ - "build", - "-p", - "game", - "--bin", - "game", - "--features", - "dev,hot-reload" - ], - "filter": { "name": "game", "kind": "bin" }, - "env": { "CARGO_TARGET_DIR": "${workspaceFolder}/target" }, - "problemMatcher": "$rustc" - }, - "args": [], - "env": { - "RUST_BACKTRACE": "1", - "WGPU_VALIDATION": "0", - "LD_LIBRARY_PATH": "${workspaceFolder}/target/debug/deps:${env:LD_LIBRARY_PATH}" - }, - "cwd": "${workspaceFolder}", - "terminal": "integrated", - "sourceLanguages": ["rust"], - "gracefulShutdown": "SIGINT" - }, { "type": "lldb", "request": "launch", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 3692069..80b1ce3 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -35,9 +35,15 @@ }, { "label": "cargo clippy (launch feature matrix)", - "type": "cargo", - "command": "clippy", + "type": "shell", + "command": "python", "args": [ + "scripts/codex/cargo_lane.py", + "exec", + "hot-reload", + "--", + "cargo", + "clippy", "-p", "editor", "-p", @@ -101,52 +107,34 @@ "group": "build" }, { - "label": "clean dev-link crates", - "type": "cargo", - "command": "clean", - "args": ["-p", "editor", "-p", "game", "-p", "game_hot", "-p", "shared"], - "options": { - "cwd": "${workspaceFolder}", - "env": { "CARGO_TARGET_DIR": "${workspaceFolder}/target" } - }, - "problemMatcher": [] - }, - { - "label": "clean build editor (dev)", - "dependsOrder": "sequence", - "dependsOn": ["clean dev-link crates", "build editor (dev fast-link)"], - "problemMatcher": [], - "group": "build" - }, - { - "label": "target cleanup (dry run)", + "label": "build storage status", "type": "shell", - "command": "cargo clean-target", + "command": "python", + "args": ["scripts/codex/build_storage.py", "status"], "options": { - "cwd": "${workspaceFolder}", - "env": { "CARGO_TARGET_DIR": "${workspaceFolder}/target" } + "cwd": "${workspaceFolder}" }, "problemMatcher": [], "group": "build" }, { - "label": "target cleanup (safe apply)", + "label": "build storage prune (dry run)", "type": "shell", - "command": "cargo clean-target --apply", + "command": "python", + "args": ["scripts/codex/build_storage.py", "prune", "--dry-run"], "options": { - "cwd": "${workspaceFolder}", - "env": { "CARGO_TARGET_DIR": "${workspaceFolder}/target" } + "cwd": "${workspaceFolder}" }, "problemMatcher": [], "group": "build" }, { - "label": "target cleanup (deep stale, 3 days)", + "label": "build storage prune (apply)", "type": "shell", - "command": "cargo clean-target --include-artifacts --days 3 --apply", + "command": "python", + "args": ["scripts/codex/build_storage.py", "prune", "--apply"], "options": { - "cwd": "${workspaceFolder}", - "env": { "CARGO_TARGET_DIR": "${workspaceFolder}/target" } + "cwd": "${workspaceFolder}" }, "problemMatcher": [], "group": "build" @@ -185,9 +173,15 @@ }, { "label": "run editor (hot reload)", - "type": "cargo", - "command": "run", + "type": "shell", + "command": "python", "args": [ + "scripts/codex/cargo_lane.py", + "exec", + "hot-reload", + "--", + "cargo", + "run", "-p", "editor", "--bin", @@ -199,8 +193,7 @@ "cwd": "${workspaceFolder}", "env": { "RUST_BACKTRACE": "1", - "WGPU_VALIDATION": "0", - "CARGO_TARGET_DIR": "${workspaceFolder}/target" + "WGPU_VALIDATION": "0" } }, "problemMatcher": ["$rustc"], @@ -208,15 +201,27 @@ }, { "label": "run game (hot reload)", - "type": "cargo", - "command": "run", - "args": ["-p", "game", "--bin", "game", "--features", "dev,hot-reload"], + "type": "shell", + "command": "python", + "args": [ + "scripts/codex/cargo_lane.py", + "exec", + "hot-reload", + "--", + "cargo", + "run", + "-p", + "game", + "--bin", + "game", + "--features", + "dev,hot-reload" + ], "options": { "cwd": "${workspaceFolder}", "env": { "RUST_BACKTRACE": "1", - "WGPU_VALIDATION": "0", - "CARGO_TARGET_DIR": "${workspaceFolder}/target" + "WGPU_VALIDATION": "0" } }, "problemMatcher": ["$rustc"], @@ -259,10 +264,23 @@ { "label": "watch game_hot (hot reload)", "type": "shell", - "command": "cargo watch -w crates/game_hot -w crates/sim -x \"build -p game_hot --features dylib\"", + "command": "python", + "args": [ + "scripts/codex/cargo_lane.py", + "exec", + "hot-reload", + "--", + "cargo", + "watch", + "-w", + "crates/game_hot", + "-w", + "crates/sim", + "-x", + "build -p game_hot --features dylib" + ], "options": { - "cwd": "${workspaceFolder}", - "env": { "CARGO_TARGET_DIR": "${workspaceFolder}/target" } + "cwd": "${workspaceFolder}" }, "problemMatcher": ["$rustc"], "group": "build", diff --git a/AGENTS.md b/AGENTS.md index 0881f6d..2369eec 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,35 +1,174 @@ -# Agent Instructions +# Blacksite Codex operating rules -## Documentation Maintenance +## Sources of truth -When changing behavior, architecture, or user-facing workflows, update documentation in the same task. Do not defer documentation updates for implemented work. +For desired scope and acceptance: -Use `docs/README.md` as the documentation map and keep each fact in one home: +1. The user's latest instruction. +2. The current Gitea issue, epic, and milestone scope, including newer explicit scope-change comments. +3. The active implementation plan, when one exists. -| Change type | Update | -|-------------|--------| -| Architecture, crate boundaries, or sim/network split | New or updated ADR in `docs/adr/` | -| Editor framework intent, principles, or non-goals | `docs/mission.md` | -| Editor feature design or phase status | `docs/editor/` | -| User controls, run commands, or troubleshooting | Root `README.md` | -| Shipped feature completion | Root `README.md` implementation checklist | -| Bevy upgrade policy | ADR 0002 and migration notes in `docs/adr/` | -| Milestone scope before implementation | `.cursor/plans/` plan file | +For actual implemented behavior: -Create an ADR in `docs/adr/NNNN-short-title.md` when a decision is hard to reverse or affects multiple crates, such as rendering path, scene format, PIE semantics, settings schema, or netcode choice. Use this format: Status, Context, Decision, Consequences. Number ADRs sequentially and link new ADRs from `docs/README.md` and the root README when relevant. +1. Current source code and schemas. +2. Current tests and deterministic generated outputs. +3. Current native acceptance evidence. +4. Canonical current documentation. -Coherence rules: +For architecture: -- One home per fact. Link across docs; do not copy paragraphs between README, mission, and ADRs. -- Intent vs implementation: mission/ADRs explain why, README explains how to use, crate module docs explain local API. -- Plans vs permanent docs: `.cursor/plans/` holds working roadmaps; promote stable decisions into `docs/` when implemented. -- Stale docs are bugs. If code contradicts docs, fix both or fix docs in the same PR/task. -- New subsystems get a short entry in `docs/README.md` and, if editor-facing, `docs/editor/README.md`. +1. Accepted ADRs. +2. Current public types and dependency boundaries. +3. Canonical architecture documentation. -End-of-task checklist for relevant implementation work: +Before using repository documentation as design guidance, read `docs/authority.toml`. Historical +plans, evaluations, session logs, archived docs, and superseded docs are not current implementation +guidance. When sources conflict, do not silently blend them. Reconcile current code, canonical docs, +active tracker scope, and the user's latest direction. -1. Did behavior or UX change? Update README controls or checklist. -2. Did architecture or policy change? Update or create an ADR or mission note. -3. Did an editor workflow change? Update `docs/editor/`. -4. Added a new doc file? Index it in `docs/README.md`. -5. Left a deliberate gap? Record it as future work in README or an ADR Consequences section. +## Work modes and remote authority + +- "Plan", "audit", "investigate", "review", and "propose" are read-only unless the user explicitly + authorizes mutation. +- "Implement", "fix", "apply", and equivalent wording authorize local repository edits. +- Do not push, force-push, close tracker items, create tracker items, or change milestone scope without + authority from `.codex/workflow.toml` or a direct user instruction. +- Routine Gitea comments and checklist synchronization may occur only through + `blacksite-gitea-sync` and within its configured permissions. + +## Start of task + +1. Read `.codex/session/STATE.md` when it exists. +2. Verify repository root, canonical real path, branch, HEAD, dirty state, and relevant active + processes. +3. Read the closest applicable `AGENTS.md` files. +4. Read only canonical docs for the affected topic as classified by `docs/authority.toml`. +5. Read exact linked Gitea items when the task is tracked. +6. Establish the goal, acceptance criteria, non-goals, affected subsystem, and verification tier. + +Do not repeat broad repository discovery when valid session state already exists. + +## User steering and scope deltas + +User steering is authoritative. When the target changes materially: + +1. Record a scope delta in `.codex/session/STATE.md`. +2. Classify it as an active-slice refinement, discovered blocker, added acceptance criterion, or + separate follow-up. +3. Record which evidence remains valid and which gates are invalidated. +4. Synchronize active tracker scope/status through the configured workflow when appropriate. +5. Continue without rerunning unrelated gates or rediscovering the repository. + +A missing product behavior found during native acceptance is not unrelated merely because it was +absent from the first prompt. + +## Token and context discipline + +- Search before reading large files; use targeted ranges and do not reread unchanged files. +- Keep raw command output in `.codex/logs/`; report concise results and bounded actionable excerpts. +- Never dump full issue lists, accessibility trees, desktop state, or build logs when exact queries + are available. +- Keep `.codex/session/STATE.md` current for compaction, reconnects, and path remapping. +- Use subagents only for narrow independent work that does not duplicate repository context. + +## Architecture for fast iteration + +- Minimize technical debt at the point of change. New behavior belongs in the smallest owning + domain module; an already-large file is not permission to grow it. +- Keep Inspector and Content Browser panel shells thin and dispatch through registered/domain + extension seams. Run `python scripts/codex/architecture_audit.py check` for production changes. +- Architecture-audit exceptions must name a tracker issue, rationale, hard cap, extraction target, + and expiry milestone; passing with an exception is not completion evidence. +- Keep UI-independent logic out of the heavy editor UI crate when practical. +- Prefer `shared`, `content_pipeline`, or another lightweight core crate for schemas, transactions, + classification, import planning, validation, and deterministic processing. +- The editor renders state and dispatches operations; it should not own reusable headless logic. +- `xtask` and headless processors must not depend on the editor crate. +- Put non-rendering tests in the lightest crate that owns the invariant. +- Do not add Bevy rendering dependencies to headless code without a proven requirement. + +## Verification + +Use `blacksite-selective-verify` and its verification matrix. + +- **Fast loop:** formatting as needed, affected-package check, and focused tests. +- **Slice gate:** affected-package tests and Clippy plus relevant domain checks. +- **Candidate gate:** full workspace/all-feature tests and lint, deterministic content checks, + validators, packaging, and named native scenarios. + +Do not run the candidate gate during ordinary iteration. Do not run a full workspace check directly +before a full workspace test unless it covers an otherwise-uncompiled target. Do not rerun a passed +gate when its inputs are unchanged. Never use unscoped `cargo clean`; scoped lane deletion is allowed +only through the build-storage workflow. Keep toolchain, features, profile, target, build directory, +and `RUSTFLAGS` stable within a lane. + +## Build artifacts and disk budget + +- Every Codex Cargo invocation runs through `scripts/codex/verify.py` or + `scripts/codex/cargo_lane.py`. +- Do not invent ad hoc target directories. +- Use one persistent ordinary-development cache. Candidate, all-feature/hot-reload, full-debug, + cross-target, and package caches are exceptional lanes with explicit retention limits. +- Run `scripts/codex/build_storage.py enforce --phase pre` before a heavy build and `--phase post` + afterward. +- Do not contaminate the persistent lane with a different feature set, profile, target, wrapper, + linker configuration, or `RUSTFLAGS`. +- Preserve required binaries/evidence before pruning a disposable lane. +- Never delete individual files from Cargo's `deps`, `.fingerprint`, `build`, or `incremental` + layouts by age. Delete only a complete verified workflow-managed lane. +- At the hard limit or free-space floor, stop starting heavy builds, prune safe expired lanes, and + schedule a persistent-lane reset at a safe slice boundary if still required. + +## Documentation maintenance + +Update documentation in the same task when behavior, architecture, or user workflows change, but +publish canonical updates at a stable slice boundary rather than after every tiny edit. Use +`blacksite-doc-integrity`; classify every document in `docs/authority.toml`; and treat historical +plans and evidence as records, not current requirements. + +| Change type | Canonical home | +|-------------|----------------| +| Architecture or crate boundary | Accepted ADR in `docs/adr/` | +| Editor framework intent or non-goals | `docs/mission.md` | +| Editor feature workflow | `docs/editor/` | +| User controls, commands, troubleshooting | Root `README.md` | +| Shipped feature completion | Root README implementation checklist | +| Bevy upgrade policy | ADR 0002 and its migration notes | +| Milestone scope before implementation | An active `.cursor/plans/` plan | + +Keep one home per fact. Link instead of copying contracts across README, guides, plans, ADRs, and +tracker bodies. New subsystems must be indexed in `docs/README.md` and, when editor-facing, +`docs/editor/README.md`. Record deliberate gaps as future work in the owning canonical doc or an ADR +Consequences section. + +## Gitea + +- Read exact linked issues, epics, and milestones; avoid broad unfiltered listing. +- Distinguish Implementing, Engineering-complete, Acceptance-in-progress, Candidate-ready, and + Closed. +- Add at most one meaningful tracker update per completed slice or material scope change. +- Do not mark criteria complete without code/test/native evidence, and do not call an issue complete + from a dirty worktree. +- Closure requires a nominated commit and configured release evidence. +- Keep epic checklists and milestone composition aligned with material child-scope changes. + +## Native editor quality + +Use `blacksite-editor-ux` for editor UX changes and `blacksite-native-qa` for interactive evidence. +Automated tests are not user acceptance. For UI work, exercise the rendered interaction flow and +relevant empty, selection, invalid, read-only, narrow-layout, cancel, undo, and restart states. Honor +an explicit user instruction that they will perform visual QA. + +## Completion states + +Use these states precisely: + +- Implementing +- Engineering-complete +- Acceptance-in-progress +- Candidate-ready +- Accepted/closed + +Do not say "complete" when only engineering checks pass. Once the current acceptance target is met, +stop broad adjacent auditing unless a shared invariant requires a bounded sibling audit or the user +asks for more. diff --git a/Cargo.lock b/Cargo.lock index fa1d369..6347913 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -119,6 +119,24 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -214,6 +232,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + [[package]] name = "arbitrary-chunks" version = "0.4.1" @@ -240,6 +264,17 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -258,6 +293,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -390,6 +434,40 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.18", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom 8.0.0", + "num-rational", + "v_frame", +] + [[package]] name = "avian3d" version = "0.7.0" @@ -428,6 +506,15 @@ dependencies = [ "syn", ] +[[package]] +name = "avif-serialize" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" +dependencies = [ + "arrayvec", +] + [[package]] name = "base64" version = "0.13.1" @@ -446,6 +533,26 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "basis-universal" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555fb05709f4e12fa2f6b93a480facf167eb0ecb2558ba41f610f588e77cbd14" +dependencies = [ + "basis-universal-sys", + "bitflags 1.3.2", + "lazy_static", +] + +[[package]] +name = "basis-universal-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd9bde5e9547958fb0e77d79fc7879edcf91d5e0c8e372ef8959916cf35e8506" +dependencies = [ + "cc", +] + [[package]] name = "bevy" version = "0.19.0" @@ -1126,6 +1233,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37bc41f69a0c6ade2e7961602517545b39ab8e42bc8c4a729bd24ffee3bcd904" dependencies = [ + "basis-universal", "bevy_app", "bevy_asset", "bevy_color", @@ -2201,6 +2309,12 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + [[package]] name = "bitflags" version = "1.3.2" @@ -2217,6 +2331,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "bitstream-io" +version = "4.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" +dependencies = [ + "no_std_io2", +] + [[package]] name = "blacksite_surface" version = "0.1.0" @@ -2294,6 +2417,12 @@ dependencies = [ "serde", ] +[[package]] +name = "built" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" + [[package]] name = "bumpalo" version = "3.20.3" @@ -2542,6 +2671,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "combine" version = "4.6.7" @@ -2629,6 +2764,26 @@ dependencies = [ "const_soft_float", ] +[[package]] +name = "content_pipeline" +version = "0.1.0" +dependencies = [ + "basis-universal", + "bevy", + "bevy_ufbx", + "blake3", + "gltf", + "image", + "notify", + "ron 0.8.1", + "serde", + "serde_json", + "shared", + "ufbx", + "uuid", + "walkdir", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -3068,7 +3223,9 @@ dependencies = [ "bevy_egui", "bevy_solari", "bevy_ufbx", + "blacksite_surface", "blake3", + "content_pipeline", "egui_dock", "egui_phosphor_icons", "game", @@ -3271,6 +3428,26 @@ version = "0.34.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8970033a4282a7bcf899b38b5ed3a58b732fe093d03785d58648515d8d309da" +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -3334,6 +3511,23 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.74.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "num-complex", + "pulp", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "2.4.1" @@ -3695,6 +3889,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gilrs" version = "0.11.2" @@ -4327,14 +4531,38 @@ checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", "moxcms", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", "zune-core", "zune-jpeg", ] +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" + [[package]] name = "indexmap" version = "2.14.0" @@ -4384,6 +4612,17 @@ dependencies = [ "libc", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "inventory" version = "0.3.24" @@ -4620,6 +4859,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + [[package]] name = "lewton" version = "0.10.2" @@ -4637,6 +4882,16 @@ version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +[[package]] +name = "libfuzzer-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.9" @@ -4720,6 +4975,15 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "mach2" version = "0.5.0" @@ -4754,6 +5018,16 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.8.2" @@ -4893,6 +5167,12 @@ dependencies = [ "jni-sys 0.3.1", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.31.3" @@ -4905,6 +5185,15 @@ dependencies = [ "libc", ] +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -4921,12 +5210,27 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + [[package]] name = "nonmax" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "normpath" version = "1.5.1" @@ -5003,6 +5307,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ + "bytemuck", "num-traits", ] @@ -5645,6 +5950,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "peniko" version = "0.6.1" @@ -5921,6 +6232,19 @@ name = "profiling" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +dependencies = [ + "quote", + "syn", +] [[package]] name = "protocol" @@ -5930,12 +6254,44 @@ dependencies = [ "serde", ] +[[package]] +name = "pulp" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" + [[package]] name = "pxfm" version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + [[package]] name = "quick-error" version = "2.0.1" @@ -5985,10 +6341,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "libc", - "rand_chacha", + "rand_chacha 0.3.1", "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + [[package]] name = "rand" version = "0.10.1" @@ -6009,6 +6375,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + [[package]] name = "rand_core" version = "0.6.4" @@ -6018,6 +6394,15 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "rand_core" version = "0.10.1" @@ -6040,6 +6425,65 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.14.0", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand 0.9.5", + "rand_chacha 0.9.0", + "simd_helpers", + "thiserror 2.0.18", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.13.0", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -6112,6 +6556,12 @@ dependencies = [ "font-types", ] +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + [[package]] name = "rectangle-pack" version = "0.4.2" @@ -6223,6 +6673,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" + [[package]] name = "robust" version = "1.2.0" @@ -6279,7 +6735,7 @@ dependencies = [ "const_format", "derive_more 0.99.20", "macro_rules_attribute", - "nom", + "nom 7.1.3", "unicode-ident", ] @@ -6381,6 +6837,7 @@ dependencies = [ "serde", "settings", "shared", + "uuid", ] [[package]] @@ -6506,6 +6963,7 @@ dependencies = [ "ron 0.8.1", "serde", "settings", + "uuid", ] [[package]] @@ -6560,6 +7018,15 @@ dependencies = [ "simdutf8", ] +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "simdutf8" version = "0.1.5" @@ -7313,6 +7780,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" @@ -8432,6 +8910,7 @@ name = "xtask" version = "0.1.0" dependencies = [ "blake3", + "content_pipeline", "libc", "ron 0.8.1", "scene", @@ -8442,6 +8921,12 @@ dependencies = [ "walkdir", ] +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yazi" version = "0.2.1" @@ -8565,6 +9050,15 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + [[package]] name = "zune-jpeg" version = "0.5.15" diff --git a/Cargo.toml b/Cargo.toml index d6f5f20..037d3db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] members = [ "crates/blacksite_surface", + "crates/content_pipeline", "crates/game", "crates/game_hot", "crates/shared", @@ -29,6 +30,8 @@ avian3d = { version = "0.7", default-features = false, features = [ ] } bevy = { version = "0.19", features = [ "serialize", + "basis-universal", + "ktx2", "jpeg", "vorbis", "wav", @@ -38,6 +41,7 @@ bevy = { version = "0.19", features = [ bevy_core_pipeline = "0.19" bevy_solari = "0.19" blacksite_surface = { path = "crates/blacksite_surface" } +content_pipeline = { path = "crates/content_pipeline" } bevy_ufbx = "0.18.1-rc.1" bevy_egui = "0.40" bevy-inspector-egui = "0.37" diff --git a/README.md b/README.md index f4f1e16..c54bdc7 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,33 @@ native Bevy scene save/load, and BRP support for external tooling. - A Vulkan-capable GPU + drivers (developed against an NVIDIA RTX 3080 Ti) - Linux build deps for `winit`/`wgpu` (ALSA, udev, etc.) if not already present +## Repository Workflow + +[`docs/authority.toml`](docs/authority.toml) classifies current documentation, active plans, +evidence, historical records, and superseded material. The complete workflow and policy index is +[`docs/workflow/codex-workflow.md`](docs/workflow/codex-workflow.md). Validate documentation changes +with `python scripts/codex/docs_audit.py`. + +Codex compile/test work uses `scripts/codex/verify.py` and `scripts/codex/cargo_lane.py` so focused +checks reuse one stable development lane and broad candidate gates run only when explicitly +nominated. The direct Cargo examples below remain contributor commands, not an instruction to rerun +the full set after every edit. + +| Workflow action | Command | +|-----------------|---------| +| Start a resumable task | `python scripts/codex/state.py init --goal "..." --accept "..." --slice "..." --next "..."` | +| Resume | `python scripts/codex/state.py resume` | +| Preview / run focused verification | `python scripts/codex/verify.py plan` / `python scripts/codex/verify.py fast` | +| Run a stable slice gate | `python scripts/codex/verify.py slice` | +| Inspect build storage | `python scripts/codex/build_storage.py status` | +| Run storage preflight / postflight | `python scripts/codex/build_storage.py enforce --phase pre` / `python scripts/codex/build_storage.py enforce --phase post` | +| Preview / apply safe pruning | `python scripts/codex/build_storage.py prune --dry-run` / `python scripts/codex/build_storage.py prune --apply` | +| Preserve a candidate before expiry | `python scripts/codex/build_storage.py mark-candidate-preserved --evidence --artifact ` | +| Audit documentation | `python scripts/codex/docs_audit.py` | +| Preview a named native scenario without launching | `bash scripts/codex/native_qa.sh plan material-slot-live-edit` | +| Sync tracker state | Ask Codex to use `blacksite-gitea-sync` in `read`, `plan`, or authorized `status` mode for exact issue IDs | +| Nominate / verify a candidate | `python scripts/codex/state.py nominate --commit ` then `python scripts/codex/verify.py candidate` | + ## Running ```bash @@ -29,6 +56,9 @@ cargo test --workspace cargo validate-levels cargo validate-samples cargo bake-navigation --project . --check +cargo process-assets --project . --check +# Refresh registry v3 and the stripped runtime content catalog after external content changes +cargo process-assets --project . # Validate one artifact without opening a game window cargo run -p game -- --validate-navigation assets/navigation/generated/navigation_showcase_humanoid.nav.ron # Machine-readable project dependency and finding report @@ -59,7 +89,10 @@ cargo run -p editor --bin project_launcher --features dev The installed **Blacksite Editor** desktop entry also exposes **Open Project Browser** from its desktop action menu. In the editor, **File > Switch Project...** uses the guarded Save All / Discard / Cancel shutdown path before opening the same browser; choosing a project starts a fresh editor -process with that root. +process with that root. A normal desktop click launches the current managed development binary +without invoking Cargo. This keeps editor startup deterministic and prevents build-planning work +from consuming memory in the desktop session. When an explicit rebuild is required, run +`~/.local/bin/blacksite-editor --build-only`; that command uses Blacksite's managed Cargo lane. ### Hot reload (gameplay iteration) @@ -70,14 +103,17 @@ Add `--features hot-reload` for **in-process hot reload** of [`game_hot`](crates **Two-terminal workflow (hot reload):** ```bash -# Terminal 1 — rebuild the hot dylib on save -cargo watch -w crates/game_hot -w crates/sim -x "build -p game_hot --features dylib" +# Terminal 1 — rebuild the hot dylib on save in the managed hot-reload lane +python scripts/codex/cargo_lane.py exec hot-reload -- cargo watch -w crates/game_hot -w crates/sim -x "build -p game_hot --features dylib" -# Terminal 2 — run the editor once -cargo run -p editor --features dev,hot-reload +# Terminal 2 — run the editor once in the same lane +python scripts/codex/cargo_lane.py exec hot-reload -- cargo run -p editor --features dev,hot-reload ``` -Or use the VS Code task **watch game_hot (hot reload)** alongside **run editor (hot reload)**, or choose **Editor: Hot reload** in Run and Debug. The watcher task requires `cargo-watch` (`cargo install cargo-watch --locked`). +Or use the VS Code task **watch game_hot (hot reload)** alongside **run editor (hot reload)**. The +managed tasks intentionally replace the former CodeLLDB hot-reload launch so lane-specific runtime +paths are never guessed. The watcher task requires an existing `cargo-watch` installation; this +workflow never installs it implicitly. | Input | Action | |-------|--------| @@ -92,22 +128,25 @@ Or use the VS Code task **watch game_hot (hot reload)** alongside **run editor ( ### Target Cache Cleanup -Cargo/Bevy debug artifacts can grow quickly. Use the workspace cleanup task before reaching for a full `cargo clean`: +Cargo/Bevy artifacts are managed as whole, sentinel-marked build lanes. Inspect and plan cleanup +before applying it: | Command | Effect | |---------|--------| -| `cargo clean-target` | Dry run: prints reclaimable `target/` cache. | -| `cargo clean-target --apply` | Safe cleanup: removes incremental and rust-analyzer flycheck cache. | -| `cargo clean-target --include-artifacts --days 3 --apply` | Deeper cleanup: also removes stale hashed `deps`, `build`, `.fingerprint`, and example artifacts older than 3 days. Cargo will rebuild anything still needed. | +| `python scripts/codex/build_storage.py status` | Measure repository output, managed lanes, package caches, and free space. | +| `python scripts/codex/build_storage.py plan` | Explain policy actions without deleting anything. | +| `python scripts/codex/build_storage.py enforce --phase pre` | Enforce budgets before a heavy command; under pressure, prune only expired verified disposable lanes after printing their checked plan. | +| `python scripts/codex/build_storage.py enforce --phase post` | Recheck after the command and apply the same bounded expired-lane policy. | +| `python scripts/codex/build_storage.py prune --dry-run` | Byte-count expired disposable lanes after path/sentinel safety checks. | +| `python scripts/codex/build_storage.py prune --apply` | Remove only the verified complete lanes shown by the dry run. | +| `python scripts/codex/build_storage.py reset-lane --dry-run` | Preview an explicit whole-lane reset. | +| `python scripts/codex/build_storage.py reset-lane --apply` | Apply that explicit whole-lane reset only after reviewing its printed dry run. | +| `python scripts/codex/build_storage.py mark-candidate-preserved --evidence --artifact ` | Hash evidence and at least one preserved artifact outside the candidate lane before that lane can expire. | -Use the safe cleanup during normal iteration and the three-day deep cleanup after Bevy upgrades, -feature-matrix builds, or large test runs. The cutoff preserves recent artifacts and avoids the full -rebuild caused by `cargo clean`. The workspace test profile keeps line tables but disables full test -debuginfo and incremental test caches, so routine test binaries stay materially smaller without -reducing normal editor debugging fidelity. The cleanup binary deliberately excludes the scene/Bevy -validation dependency; `cargo clean-target` therefore stays cheap even from a cold target. Use -`cargo validate-levels` when level and prefab-graph validation is required. VS Code tasks expose dry-run, safe, and -deep-stale variants. +Do not use an unscoped `cargo clean` as a troubleshooting reflex. Never delete individual Cargo +`deps`, `.fingerprint`, `build`, or `incremental` files by age; preserve nominated binaries/evidence +and remove only an entire verified disposable lane. See the +[build-storage policy](docs/workflow/build-storage-policy.md). ### Launch Troubleshooting @@ -115,7 +154,10 @@ deep-stale variants. - If the window maps but appears transparent on Hyprland or another Wayland compositor, launch with `BEVY_FPS_HDR=0` to force the SDR camera path while debugging monitor/compositor behavior. - Bevy 0.19 removed the prior local `bevy_render` swapchain-timeout patch; launch troubleshooting should start from current wgpu/driver/compositor logs. - Normal Debug and run configurations preserve project HDR and set `WGPU_VALIDATION=0` to suppress known Bevy/Solari Vulkan memory-model VUID noise on this stack. Use **GPU validation** when actively debugging renderer work; it forces `WGPU_VALIDATION=1` and may report those known upstream/driver messages. Use **SDR fallback** for compositor/HDR mapping failures; it additionally sets `BEVY_FPS_HDR=0`. -- If **CodeLLDB / mold** fails with hundreds of `undefined symbol` linker errors, the incremental `target/` cache is stale. Run the VS Code task **clean build editor (dev)** or `cargo clean -p editor -p game -p game_hot -p shared && cargo build -p editor --bin editor --features dev`, then launch **Editor: Debug** again. Use `cargo run -p editor --features dev` from the terminal if you need `libbevy_dylib` on `LD_LIBRARY_PATH` automatically. +- If **CodeLLDB / mold** fails with hundreds of `undefined symbol` linker errors, inspect the active + lane signature first. Preview a development-lane reset with + `python scripts/codex/build_storage.py reset-lane hot-reload --dry-run`, apply it only at a safe + slice boundary, then rebuild through `python scripts/codex/cargo_lane.py exec hot-reload -- cargo build -p editor --bin editor --features dev`. ## Editor Controls @@ -152,13 +194,14 @@ deep-stale variants. | Viewport selection/orientation HUD | Identify the primary selection, multi-selection count, overlapping-pick position, camera axes, shading mode, and active render path | | Click Player visualizer in Edit mode | Select or create the authored `PlayerSpawn` (`Player Start`) | | Select Project Sun | Inspect project default lighting; create a scene sun override | -| Asset Browser project/file views | Browse `assets/`, search/filter/sort models, textures, materials, audio clips, levels, and prefabs; switch grid/list; expand model subassets; inspect file details; audition audio; drag supported assets/submeshes into the viewport | +| Asset Browser project/file views | Browse `assets/`, search/filter/sort models, textures, materials, audio clips, levels, and prefabs; switch grid/list; expand model subassets; inspect file details; resize the Details pane by dragging its divider (double-click resets it); use click/Ctrl/Shift multi-selection and item/empty-space context menus; audition audio; drag supported assets/submeshes into the viewport | | Drag audio clip into viewport | Create an authored audio source; when an audio source is selected, assign the clip instead | -| Asset Browser context/details actions | Apply textures/materials, regenerate thumbnails, reimport models, place assets/submeshes, or move file assets to `assets/.trash/` | +| Asset Browser context/details actions | Preview affected IDs/reference rewrites, then create folders or Materials in the current folder; rename, duplicate, cut/copy/paste or drag-to-folder; undo an unchanged content move; use **Import Here** or **Import To...** and review every source dependency/final target before committing; review/group loose PBR textures into editable Materials; assign/locate/clear per-slot model materials and resolve preserved reimport orphans; extract editable glTF/GLB/FBX PBR materials, explicitly diff/apply or create-new on re-extraction, and atomically map their source slots; regenerate thumbnails; reimport; place assets/submeshes; or trash and collision-guarded restore complete deletion batches | +| Texture Details | Set semantic and sRGB/Linear intent, mip policy, Basis UASTC or uncompressed KTX2 output, size limit, filtering, wrapping, anisotropy, and OpenGL/DirectX normal convention; **Apply & Reprocess** publishes derived runtime data without altering the source image | | Window → Material Library | Search/filter project Materials and Material Instances, inspect scene usage and dependency health, create/edit shared assets, and drag them into the viewport | -| Drag Material/Instance onto viewport surface | Preview and assign the exact renderer slot, primitive, or brush face under the pointer; release commits one undo step, while Escape/right-click/outside restores the preview | -| Drag Texture onto viewport surface | Set a primitive base-color texture or exact brush face; renderer slots reject loose textures and direct you to a Material Instance | -| Static/Skinned Mesh Renderer material slots | Assign a shared Material/Material Instance per slot; Browse/Select/Locate the reference, or Clear the override to restore the imported source material | +| Drag Material/Instance onto viewport surface | Preview and assign the exact primitive/static/skinned slot or brush face under the pointer; release commits one undo step, while Escape/right-click/outside restores the preview | +| Drag Texture onto viewport surface | Primitive/static/skinned slots reject loose textures and explain that a Material/Instance is required; brush faces retain their specialized direct-texture path | +| Primitive/Static/Skinned material slots | Use the same Penpot-led material panel: Drop or Browse a shared Material/Instance; Clear returns to model source, project default, or DefaultGrid; expand the panel for immediate shared-handle updates that mark the asset **UNSAVED** without writing on release, then use contextual Save/Save All; use **Create Instance and Assign** for actor variation or **Extract Editable…** for one imported source slot; runtime property-block promotion remains exact-slot and transactional | | `Ctrl+P` | Centered command palette; search human labels or stable command IDs, use arrow keys to select, Enter to run | | `F7` | While paused in Play: advance one sim tick | | Shift/Ctrl + click (Hierarchy) | Additive selection | @@ -332,7 +375,8 @@ the current process without changing preferences. Clean editor exits restore the last authored scene, panel visibility, and viewport bookmarks from the versioned machine-local session document. After an abnormal exit, Blacksite opens the safe startup scene and asks whether to **Resume Last Scene** or **Continue Safe**; modal tools and dirty -preview state are never restored. Session metadata lives under +preview state are never restored. The recovery prompt is modal and blocks interaction with the +safe scene until one of those choices is made. Session metadata lives under `$XDG_STATE_HOME/blacksite-editor/session.ron` or `~/.local/state/blacksite-editor/session.ron` and contains no scene contents or credentials. See [ADR 0024](docs/adr/0024-versioned-editor-session-state.md). @@ -361,7 +405,10 @@ The `.vscode/` folder is preconfigured: - `settings.json` runs `clippy` on save, enables proc-macro/build-script support, formats on save, and excludes `target/` from search/watch. - `tasks.json` mirrors the full workspace formatting, all-target check, strict Clippy, test, level-validation, build/run, hot-reload, and target-cleanup workflows. **build editor (dev fast-link)** is the default build task. -- `launch.json` uses CodeLLDB Cargo artifact filtering for editor/game Debug, GPU-validation, hot-reload, SDR fallback, and Release configurations. Normal launches keep HDR enabled while quieting known Vulkan validation noise; dynamic-link launches set the required `LD_LIBRARY_PATH` automatically. +- `launch.json` uses CodeLLDB Cargo artifact filtering for ordinary editor/game Debug, + GPU-validation, SDR fallback, and Release configurations. Managed hot reload uses the lane-aware + tasks above so exceptional artifacts cannot overwrite or borrow the ordinary editor's runtime + dependency path. - `.github/workflows/ci.yml` mirrors local formatting, check, clippy, test, and binary build verification. ## Architecture Decisions @@ -377,6 +424,9 @@ The `.vscode/` folder is preconfigured: - [ADR 0017: Normalized Static Mesh Assets](docs/adr/0017-normalized-static-mesh-assets.md) - [ADR 0034: Registry-driven Authoring Components](docs/adr/0034-registry-driven-authoring-components.md) - [ADR 0037: Collaborative Authored-File Safety](docs/adr/0037-collaborative-authored-file-safety.md) +- [ADR 0047: Editor Authored-Asset Documents](docs/adr/0047-editor-authored-asset-documents.md) +- [ADR 0048: Modular Editor Composition and Debt Ratchet](docs/adr/0048-modular-editor-composition-and-debt-ratchet.md) +- [ADR 0049: Penpot-Led Editor Visual System](docs/adr/0049-penpot-led-editor-visual-system.md) - [ADR 0043: Content-Addressed Import Fingerprints](docs/adr/0043-content-addressed-import-fingerprints.md) - [ADR 0044: Sandboxed FBX External Texture Dependencies](docs/adr/0044-sandboxed-fbx-external-texture-dependencies.md) @@ -460,8 +510,16 @@ crates/ - [x] Independent scene tabs + stable subscene composition, recursive validation, ownership locks, active-world PIE consistency, and per-saved-tab recovery ([ADR 0026](docs/adr/0026-stable-scene-composition-and-active-document.md)) - [x] Editor lib/bin split + `EditorPluginGroup`; game EditorPlugin dogfood panel - [x] FBX/glTF model import + normalized static/skinned renderer routing; explicit generic scene-instance load via `bevy_ufbx` / `ModelRef` -- [x] Asset browser model thumbnails (unified `assets/thumbnails/` pipeline; `ThumbnailState` cache; FBX via `FbxThumbnailSource`) -- [x] Shared Material/Material Instance assets, stable static/skinned renderer material slots, imported-source fallback, orphan preservation, and a persistence-excluded property-block schema; runtime block application/promotion remains tracked in [Gitea #53](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/53) ([ADR 0035](docs/adr/0035-shared-material-assets-and-renderer-slots.md), [material-system guide](docs/editor/material-system.md)) +- [x] Typed texture/model/mesh-subasset/source-material thumbnail cache keys; model and mesh cards always render geometry in the offscreen studio instead of substituting an albedo texture (`ThumbnailState`; FBX via `FbxThumbnailSource`) +- [x] Shared Material/Material Instance assets, generalized primitive/static/skinned slots, expandable guarded shared parameters, stable model defaults, six-layer fallback through immutable DefaultGrid, exact-actor source extraction, orphan preservation, cached Standard/Surface runtime property-block application, and exact-slot transactional instance creation/promotion ([ADR 0035](docs/adr/0035-shared-material-assets-and-renderer-slots.md), [ADR 0045](docs/adr/0045-content-workspace-and-material-fallback-contract.md), [material-system guide](docs/editor/material-system.md)) +- [x] Path-agnostic content classification, reference-safe file operations, destination-first dependency-bundle import, deterministic runtime catalog/model manifests, shared debounced watcher core, and atomic GPU-free `cargo process-assets` write/check validation ([content workspace guide](docs/editor/content-workspace.md)) +- [x] Registry v3 Texture properties, schema-v2 Material inputs, paired multiplier/texture controls, channel-selectable ARM/ORM repacking, and content-addressed UASTC/KTX2 runtime artifacts shared by editor refresh and `cargo process-assets` ([ADR 0046](docs/adr/0046-schema-driven-material-inputs-and-processed-textures.md), [material guide](docs/editor/material-system.md)) +- [x] Asset-keyed dirty documents use one overlay-first live Material authority and conditional derived processing without pointer-release writes; contextual Save/Save All, recovery, background processing, and live-handle persistence passed native acceptance ([ADR 0047](docs/adr/0047-editor-authored-asset-documents.md)) +- [x] Registry-only Inspector dispatch, shared material/asset-card UI, and the architecture debt ratchet are implemented; both Inspector and Content Browser shells are <=500 nonblank lines and pass the selective architecture gate plus native resize/deep-scroll acceptance ([ADR 0048](docs/adr/0048-modular-editor-composition-and-debt-ratchet.md)) +- [ ] Penpot-led tokens, Source Sans Pro typography, responsive Inspector/material components, asset/color pickers, and exact current 620/420 px geometry are undergoing final M2 native acceptance ([ADR 0049](docs/adr/0049-penpot-led-editor-visual-system.md)) +- [x] File-manager Content Browser selection for assets and folders, Ctrl/Cmd toggle and Shift ranges, batch clipboard/duplicate/drag/trash operations, stable-ID moves, fresh-ID copies with internal-only reference remapping, concrete destructive-reference previews, exact cancel-state restoration, restart-safe explicit ambiguous external-move identity repair, fingerprint-guarded move/create/copy/trash undo, modal-safe content-scoped keyboard shortcuts, exact-name Cut/Paste collision review, safe navigation/filter selection clearing, consistent right-click targeting for files/folders/subassets, current-folder Material creation, and right-click menus on items and empty workspace space ([content workspace guide](docs/editor/content-workspace.md)) +- [x] Transactional Content Trash with versioned batch manifests, stable-ID restore, generated model-manifest preservation, collision guards, legacy-batch discovery, and registry/runtime-catalog rollback ([content workspace guide](docs/editor/content-workspace.md)) +- [x] Transactional loose-texture PBR grouping with suffix/confidence detection, manual role correction and target merge/split, packed ORM/ARM mapping, and no-overwrite Material publication ([material-system guide](docs/editor/material-system.md)) - [x] Docked Material Library with cross-folder type/usage filters, resolved Material Instance thumbnails, shared guarded editors, and exact reversible viewport Material/Texture drops for renderer slots, primitives, and brush faces ([material-system guide](docs/editor/material-system.md); [Gitea #16](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/16), [Gitea #18](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/18)) - [x] Prefab v2 core: shared stable nested override paths, property/component/structural scopes, recursive graph validation, linked-root variants, conflict recovery, transactional source Apply, and undoable unpack/convert ([ADR 0027](docs/adr/0027-stable-prefab-ownership-and-variants.md)) - [x] Prefab v2 production acceptance: committed base/nested/variant fixtures pass workspace tests, recursive headless validation, packaged release startup, and live editor placement/inspection regression coverage ([Gitea #43](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/43)) @@ -471,7 +529,7 @@ crates/ - [x] Surface ABI v1 with shared raster/Solari evaluator dispatch, packed typed parameters/textures, exact cutout ray-candidate evaluation, last-good shader fallback, and explicit exclusion of skinned/morph-deformed Solari geometry ([ADR 0036](docs/adr/0036-surface-abi-and-solari-parity.md), [material-system guide](docs/editor/material-system.md)) - [x] Static mesh renderer component, generated normalized mesh artifacts, source/one-actor hierarchy placement, and inspector renderer slots ([ADR 0017](docs/adr/0017-normalized-static-mesh-assets.md)) - [x] Dedicated `SkinnedMeshRenderer`/`SkinnedMesh` actor path, skinned-part exclusion from static slots, dedicated runtime hierarchy hydration, and v2-to-v3 animated-scene migration ([ADR 0033](docs/adr/0033-dedicated-skinned-mesh-renderer.md)) -- [x] Componentized actor inspector, unified component cards, thumbnail static mesh slots, imported asset Browse/Locate/Clear refs with inherited source defaults, collider split, shader-aware actor material data, and texture picker/drop refs ([ADR 0018](docs/adr/0018-componentized-actor-inspector-and-materials.md)) +- [x] Componentized actor inspector with one primitive/static/skinned Material-slot widget, full-width valid/invalid drop feedback, material sphere and exact mesh-subasset previews, inherited status, Browse/Locate/Clear, guarded shared parameter foldouts, and no synthetic primitive Authoring Material card ([ADR 0018](docs/adr/0018-componentized-actor-inspector-and-materials.md), [ADR 0035](docs/adr/0035-shared-material-assets-and-renderer-slots.md)) - [x] Stable authoring component IDs, registry-built save filtering, reflected atomic add/remove/reset/copy/paste history, independent active state, static extension registration, and derived composable `ActorKind` hints ([ADR 0034](docs/adr/0034-registry-driven-authoring-components.md), [extensibility guide](docs/editor/extensibility.md)) - [x] Brush authoring schema MVP with `ActorKind::Brush`, cube `BrushDesc`, generated mesh hydration, scene migration, and inspector Add Component support ([ADR 0021](docs/adr/0021-brush-authoring-schema.md)) - [x] Brush draw, vertex/edge/face gizmo editing, face material/UV authoring, clip, and bounds-based CSG preview/commit workflow ([brush guide](docs/editor/brushes.md)) @@ -481,13 +539,14 @@ crates/ - Crouch lowers the camera and movement speed; the collider stays full-height for stability. - The editor asset browser is filesystem-backed with folder/tree navigation, grid/list views, - texture and model thumbnails (glTF albedo fast-path; offscreen render studio for FBX and - untextured models), material sphere thumbnails, search/filter/sort controls, expandable model + direct texture thumbnails, offscreen geometry renders for all models and mesh subassets, + material sphere thumbnails, search/filter/sort controls, expandable model subasset shelves, and a staged details pane. **File -> Import Assets** accepts glTF/GLB and binary **FBX**. FBX import parses and transactionally preserves every safe referenced sibling `textures/` or `.fbm/` file while rejecting traversal and external absolute paths before project content changes. Missing source textures appear once in validation and Asset - Browser dependency status; **Authoring Override** deliberately permits an untextured model. + Browser dependency status; choosing **Project** or **Default** for every stable model slot + deliberately permits an untextured model, while any **Source** slot keeps the bundle required. Model assets generate normalized model manifests under `assets/meshes/generated/`; drag/drop uses **Renderable Asset (Auto)**. Unrigged sources use `StaticMeshRenderer` with imported asset refs and optional separate static mesh colliders. Skin-bound or animated sources and their subasset placement use @@ -508,7 +567,7 @@ crates/ **Unpack Layer** preserves nested links; **Convert to Local** recursively removes them. Current authoring UI coverage and production-acceptance gaps are tracked in [prefab-authoring.md](docs/editor/prefab-authoring.md). -- Material and direct-base Material Instance assets live under `assets/materials/`; shader schemas live under `assets/shaders/`. **Window > Material Library** provides cross-folder creation, editing, usage filters, and drag sources. Viewport Material drops target one exact renderer slot, primitive, or brush face and use reversible preview plus one-step history; loose Textures target primitives/brush faces and are rejected on renderer slots. Shared edits propagate through live-updated handles without reloading skinned geometry. Custom Surface evaluators share one constrained ABI between raster and Solari-eligible non-deformed geometry. Runtime property-block application/promotion is tracked in [#53](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/53); dynamic skinned/morph Solari geometry is tracked in [#54](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/54). See the [material-system guide](docs/editor/material-system.md). +- Material and direct-base Material Instance assets may live anywhere under `assets/`; shader schemas are also folder-independent. **Window > Material Library** provides cross-folder creation, editing, usage filters, and drag sources. Material parameters update one live shared handle and mark the asset **UNSAVED**; releasing a control does not write or process. **Ctrl+S** saves the last edited context and **Ctrl+Shift+S** / **File > Save All** saves every dirty scene, asset, and project setting. Scalar/color/render-state Material saves finish without a processing job; ARM/ORM binding changes continue through affected-only background processing. Viewport Material drops target one exact primitive/static/skinned slot or brush face and use reversible preview plus one-step history; loose Textures are rejected by primitive/mesh slots while brushes retain their specialized face texture path. Runtime property blocks apply after resolved bases without mutating shared assets. Custom Surface evaluators share one constrained ABI between raster and Solari-eligible non-deformed geometry. Dynamic skinned/morph Solari geometry remains tracked in [#54](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/54). See the [material-system guide](docs/editor/material-system.md). - Per-field reflect undo for all components remains future work; typed `shared` inspectors cover the common authoring path. - The authoring/hydration layer is intentionally small so richer asset workflows (terrain, material graphs, lighting profiles) can be added without changing the scene format foundation. diff --git a/assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/76a589e4456ec3320b876209-arm.basis b/assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/76a589e4456ec3320b876209-arm.basis new file mode 100644 index 0000000..6f9faa3 --- /dev/null +++ b/assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/76a589e4456ec3320b876209-arm.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dbf73b7df8f3d17cb6ce961f986bf1b02902bcea30a06a0dff8dc451b8d04ae +size 22370024 diff --git a/assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/c6f971e303a67229b09c1283-arm.basis b/assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/c6f971e303a67229b09c1283-arm.basis new file mode 100644 index 0000000..2b458b4 --- /dev/null +++ b/assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/c6f971e303a67229b09c1283-arm.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef8d5f2ed1e3d3824b6e0f50d6106475cdbbf4cf590936def34defedce7f2bea +size 22370024 diff --git a/assets/.import-cache/runtime/materials/647a63d4-64c6-4431-ba46-9efdd515cd8f/297372611543b1f7baa1e5e3-arm.basis b/assets/.import-cache/runtime/materials/647a63d4-64c6-4431-ba46-9efdd515cd8f/297372611543b1f7baa1e5e3-arm.basis new file mode 100644 index 0000000..75c49b9 --- /dev/null +++ b/assets/.import-cache/runtime/materials/647a63d4-64c6-4431-ba46-9efdd515cd8f/297372611543b1f7baa1e5e3-arm.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6f45715e7c352ac03e90a646cd66376ab9831bfbdcc40f137e427a021418814 +size 5592785 diff --git a/assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/76a589e4456ec3320b876209-arm.basis b/assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/76a589e4456ec3320b876209-arm.basis new file mode 100644 index 0000000..6f9faa3 --- /dev/null +++ b/assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/76a589e4456ec3320b876209-arm.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dbf73b7df8f3d17cb6ce961f986bf1b02902bcea30a06a0dff8dc451b8d04ae +size 22370024 diff --git a/assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/c6f971e303a67229b09c1283-arm.basis b/assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/c6f971e303a67229b09c1283-arm.basis new file mode 100644 index 0000000..2b458b4 --- /dev/null +++ b/assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/c6f971e303a67229b09c1283-arm.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef8d5f2ed1e3d3824b6e0f50d6106475cdbbf4cf590936def34defedce7f2bea +size 22370024 diff --git a/assets/.import-cache/runtime/textures/0496e62e-1837-4940-a9c9-b2b4ffe9ed90/3ecc62c0eaf1672ca08fb59f/texture.basis b/assets/.import-cache/runtime/textures/0496e62e-1837-4940-a9c9-b2b4ffe9ed90/3ecc62c0eaf1672ca08fb59f/texture.basis new file mode 100644 index 0000000..a0cc0f5 --- /dev/null +++ b/assets/.import-cache/runtime/textures/0496e62e-1837-4940-a9c9-b2b4ffe9ed90/3ecc62c0eaf1672ca08fb59f/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92442c1e7ed2f768cbda8eadd162d9fa86711a93425ee8c5d0092f5d94298d76 +size 5592785 diff --git a/assets/.import-cache/runtime/textures/25db6174-afcb-421f-8c1c-0c5ffde21b79/552b39094506da0fbf4cd647/texture.basis b/assets/.import-cache/runtime/textures/25db6174-afcb-421f-8c1c-0c5ffde21b79/552b39094506da0fbf4cd647/texture.basis new file mode 100644 index 0000000..6f9faa3 --- /dev/null +++ b/assets/.import-cache/runtime/textures/25db6174-afcb-421f-8c1c-0c5ffde21b79/552b39094506da0fbf4cd647/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dbf73b7df8f3d17cb6ce961f986bf1b02902bcea30a06a0dff8dc451b8d04ae +size 22370024 diff --git a/assets/.import-cache/runtime/textures/393414a8-3089-435f-b267-6dd3eac0285f/edf8ef1b2fc54bbe4eafc16d/texture.basis b/assets/.import-cache/runtime/textures/393414a8-3089-435f-b267-6dd3eac0285f/edf8ef1b2fc54bbe4eafc16d/texture.basis new file mode 100644 index 0000000..75c49b9 --- /dev/null +++ b/assets/.import-cache/runtime/textures/393414a8-3089-435f-b267-6dd3eac0285f/edf8ef1b2fc54bbe4eafc16d/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6f45715e7c352ac03e90a646cd66376ab9831bfbdcc40f137e427a021418814 +size 5592785 diff --git a/assets/.import-cache/runtime/textures/481b1a35-75e4-4879-879d-ccab183ba2b7/534c0d384d22c554b9597064/texture.basis b/assets/.import-cache/runtime/textures/481b1a35-75e4-4879-879d-ccab183ba2b7/534c0d384d22c554b9597064/texture.basis new file mode 100644 index 0000000..06b9128 --- /dev/null +++ b/assets/.import-cache/runtime/textures/481b1a35-75e4-4879-879d-ccab183ba2b7/534c0d384d22c554b9597064/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d18f679a3a59aedd9dd4b3a85ea4c14fa0ac4efc686cdec87a3fd61376e464d +size 5592785 diff --git a/assets/.import-cache/runtime/textures/5212dba1-853f-4dab-98f3-e6395d05a4f7/cd1c550f437632f394bf7502/texture.basis b/assets/.import-cache/runtime/textures/5212dba1-853f-4dab-98f3-e6395d05a4f7/cd1c550f437632f394bf7502/texture.basis new file mode 100644 index 0000000..7d3f2e9 --- /dev/null +++ b/assets/.import-cache/runtime/textures/5212dba1-853f-4dab-98f3-e6395d05a4f7/cd1c550f437632f394bf7502/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed2cf26e680b7f8e0783c8ffe2c72532589057bc723acb200ea9e74a43c12e04 +size 5592785 diff --git a/assets/.import-cache/runtime/textures/7c5235a1-f5d7-4530-b29f-5ea075881df5/944b70940e3dd9a70e851d0e/texture.basis b/assets/.import-cache/runtime/textures/7c5235a1-f5d7-4530-b29f-5ea075881df5/944b70940e3dd9a70e851d0e/texture.basis new file mode 100644 index 0000000..238d322 --- /dev/null +++ b/assets/.import-cache/runtime/textures/7c5235a1-f5d7-4530-b29f-5ea075881df5/944b70940e3dd9a70e851d0e/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4a4bdc2381d9afe0ca11dff6a0f34178ae927c1b84f9816e8aaef9435070a77 +size 22370024 diff --git a/assets/.import-cache/runtime/textures/bddaa4d4-5097-42bf-8d51-dd9a3580442a/2276a96b1a148fd7c16977d5/texture.basis b/assets/.import-cache/runtime/textures/bddaa4d4-5097-42bf-8d51-dd9a3580442a/2276a96b1a148fd7c16977d5/texture.basis new file mode 100644 index 0000000..2eda7dd --- /dev/null +++ b/assets/.import-cache/runtime/textures/bddaa4d4-5097-42bf-8d51-dd9a3580442a/2276a96b1a148fd7c16977d5/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d28497a128f2b8b2f9a3d1f144f4beb6611cc12f89311f58caf436b370dcf44f +size 5592785 diff --git a/assets/.import-cache/runtime/textures/c4abe41c-ac88-4aec-8168-27e8a7c90583/d0ec4224c3dcb6fa565c94bb/texture.basis b/assets/.import-cache/runtime/textures/c4abe41c-ac88-4aec-8168-27e8a7c90583/d0ec4224c3dcb6fa565c94bb/texture.basis new file mode 100644 index 0000000..590c745 --- /dev/null +++ b/assets/.import-cache/runtime/textures/c4abe41c-ac88-4aec-8168-27e8a7c90583/d0ec4224c3dcb6fa565c94bb/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a27aa22c744477635fd7e39aadbd2d99dce7958814f58142a54e73c509ca7601 +size 5592785 diff --git a/assets/.import-cache/runtime/textures/c644134e-87c7-43fb-ac30-31c4e0a78b48/534c0d384d22c554b9597064/texture.basis b/assets/.import-cache/runtime/textures/c644134e-87c7-43fb-ac30-31c4e0a78b48/534c0d384d22c554b9597064/texture.basis new file mode 100644 index 0000000..06b9128 --- /dev/null +++ b/assets/.import-cache/runtime/textures/c644134e-87c7-43fb-ac30-31c4e0a78b48/534c0d384d22c554b9597064/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d18f679a3a59aedd9dd4b3a85ea4c14fa0ac4efc686cdec87a3fd61376e464d +size 5592785 diff --git a/assets/.import-cache/runtime/textures/c661e66a-0745-4dd9-89b0-e611befab602/cd1c550f437632f394bf7502/texture.basis b/assets/.import-cache/runtime/textures/c661e66a-0745-4dd9-89b0-e611befab602/cd1c550f437632f394bf7502/texture.basis new file mode 100644 index 0000000..7d3f2e9 --- /dev/null +++ b/assets/.import-cache/runtime/textures/c661e66a-0745-4dd9-89b0-e611befab602/cd1c550f437632f394bf7502/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed2cf26e680b7f8e0783c8ffe2c72532589057bc723acb200ea9e74a43c12e04 +size 5592785 diff --git a/assets/.import-cache/runtime/textures/c7a227bc-2bae-4a41-857b-28cc6b432a9d/edf8ef1b2fc54bbe4eafc16d/texture.basis b/assets/.import-cache/runtime/textures/c7a227bc-2bae-4a41-857b-28cc6b432a9d/edf8ef1b2fc54bbe4eafc16d/texture.basis new file mode 100644 index 0000000..75c49b9 --- /dev/null +++ b/assets/.import-cache/runtime/textures/c7a227bc-2bae-4a41-857b-28cc6b432a9d/edf8ef1b2fc54bbe4eafc16d/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6f45715e7c352ac03e90a646cd66376ab9831bfbdcc40f137e427a021418814 +size 5592785 diff --git a/assets/.import-cache/runtime/textures/cadad4af-c24a-4d52-bdc4-8089dac67f30/cd1c550f437632f394bf7502/texture.basis b/assets/.import-cache/runtime/textures/cadad4af-c24a-4d52-bdc4-8089dac67f30/cd1c550f437632f394bf7502/texture.basis new file mode 100644 index 0000000..7d3f2e9 --- /dev/null +++ b/assets/.import-cache/runtime/textures/cadad4af-c24a-4d52-bdc4-8089dac67f30/cd1c550f437632f394bf7502/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed2cf26e680b7f8e0783c8ffe2c72532589057bc723acb200ea9e74a43c12e04 +size 5592785 diff --git a/assets/.import-cache/runtime/textures/cef332e3-d0d1-41d7-adf2-87462c70f52c/edf8ef1b2fc54bbe4eafc16d/texture.basis b/assets/.import-cache/runtime/textures/cef332e3-d0d1-41d7-adf2-87462c70f52c/edf8ef1b2fc54bbe4eafc16d/texture.basis new file mode 100644 index 0000000..75c49b9 --- /dev/null +++ b/assets/.import-cache/runtime/textures/cef332e3-d0d1-41d7-adf2-87462c70f52c/edf8ef1b2fc54bbe4eafc16d/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6f45715e7c352ac03e90a646cd66376ab9831bfbdcc40f137e427a021418814 +size 5592785 diff --git a/assets/.import-cache/runtime/textures/d3b9bec5-c0ea-4f83-ad80-f9e2a8cb69ee/644db179a14573b2a514e68f/texture.basis b/assets/.import-cache/runtime/textures/d3b9bec5-c0ea-4f83-ad80-f9e2a8cb69ee/644db179a14573b2a514e68f/texture.basis new file mode 100644 index 0000000..f55bd2d --- /dev/null +++ b/assets/.import-cache/runtime/textures/d3b9bec5-c0ea-4f83-ad80-f9e2a8cb69ee/644db179a14573b2a514e68f/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:504c83749fc2b43212ccfee04f12c8f46416566891c66ac5bac20ff6688c91a9 +size 22370024 diff --git a/assets/.import-cache/runtime/textures/e5512ff1-aa00-4592-a740-4574e1059a99/534c0d384d22c554b9597064/texture.basis b/assets/.import-cache/runtime/textures/e5512ff1-aa00-4592-a740-4574e1059a99/534c0d384d22c554b9597064/texture.basis new file mode 100644 index 0000000..06b9128 --- /dev/null +++ b/assets/.import-cache/runtime/textures/e5512ff1-aa00-4592-a740-4574e1059a99/534c0d384d22c554b9597064/texture.basis @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d18f679a3a59aedd9dd4b3a85ea4c14fa0ac4efc686cdec87a3fd61376e464d +size 5592785 diff --git a/assets/.index/registry.ron b/assets/.index/registry.ron index 743f4c4..b937026 100644 --- a/assets/.index/registry.ron +++ b/assets/.index/registry.ron @@ -1,776 +1,1070 @@ -[ - ( - id: ("04a4e00e-4732-43db-8e99-9cd99b94667b"), - path: "assets/animations/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.animation.ron", - label: "113f74df-e39c-41d4-9b5b-e48efe541f7f.animation", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, - ), - dependencies: [], +( + schema_version: 3, + defaults: ( + default_material: None, ), - ( - id: ("4937e63f-923b-4270-bdfc-298d63bcb814"), - path: "assets/animations/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.animation.ron", - label: "3f63f359-45eb-4cb2-8970-71921cbd7bd0.animation", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + records: [ + ( + id: ("5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc"), + path: "assets/Furniture/Office/blacksite-m2-robot-expressive.glb", + label: "blacksite-m2-robot-expressive", + kind: Model, + source_fingerprint: Some(( + byte_len: 463988, + content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", + )), + import_settings: Model(( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SingleActor, + material_slots: [], + orphaned_material_slots: [], + static_mesh_manifest_path: Some("assets/meshes/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.static_mesh.ron"), + animation_manifest_path: Some("assets/animations/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.animation.ron"), + default_animation_clip_id: None, + )), + dependencies: [], ), - dependencies: [], - ), - ( - id: ("28f1df44-6d24-4722-bf75-6969879995a4"), - path: "assets/animations/generated/b98ef565-3500-49e7-9935-f685fa9b2594.animation.ron", - label: "b98ef565-3500-49e7-9935-f685fa9b2594.animation", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("647a63d4-64c6-4431-ba46-9efdd515cd8f"), + path: "assets/Furniture/Office/metal_office_desk.material.ron", + label: "metal_office_desk.material", + kind: Material, + import_settings: None, + dependencies: [ + "assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg", + "assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg", + "assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg", + ], ), - dependencies: [], - ), - ( - id: ("fe40db93-181f-4c79-86e6-26bd97464c4b"), - path: "assets/audio/Puzzle Lobby.mp3", - label: "Puzzle Lobby", - kind_tag: "AudioClip", - source_fingerprint: Some(( - byte_len: 1680820, - content_hash: "3b5a401dbaccfdbda540c60070ce259fb506d7da548f45008eb2b3fa720b4b57", - )), - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("36c51ff3-29ae-4ab1-aaca-f90f57e27966"), + path: "assets/Furniture/Office/metal_office_desk_2k.gltf", + label: "metal_office_desk_2k", + kind: Model, + source_fingerprint: Some(( + byte_len: 13500, + content_hash: "64fd91fbc603c9675f9c8b5f1291a654deff89b40aeb0a0b877b7b93f6ebf05e", + )), + import_settings: Model(( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SourceHierarchy, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node0:mesh0:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node1:mesh1:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node2:mesh2:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node3:mesh3:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node4:mesh4:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node5:mesh5:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node6:mesh6:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node7:mesh7:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ], + orphaned_material_slots: [], + static_mesh_manifest_path: Some("assets/meshes/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.static_mesh.ron"), + animation_manifest_path: Some("assets/animations/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.animation.ron"), + default_animation_clip_id: None, + )), + dependencies: [ + "assets/Furniture/Office/metal_office_desk.bin", + "assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg", + "assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg", + "assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg", + ], ), - dependencies: [], - ), - ( - id: ("c0a7d10e-53c1-4de0-b0dc-34a66f44ba77"), - path: "assets/audio/editor_audition_tone.ogg", - label: "editor_audition_tone", - kind_tag: "AudioClip", - source_fingerprint: Some(( - byte_len: 4450, - content_hash: "8ef56184ab5b5cd135e45df152f8a95737023420947f3d08c9b3e3605e55a349", - )), - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("cef332e3-d0d1-41d7-adf2-87462c70f52c"), + path: "assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg", + label: "metal_office_desk_arm_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 2724325, + content_hash: "0f67cb85769b10467eeea0aa3bf0649c65a2687029d49b6de76a960ab60ce00d", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], ), - dependencies: [], - ), - ( - id: ("9213efe6-12c7-45a8-8b64-9e1699f76ba3"), - path: "assets/build_profiles/development.ron", - label: "development", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("481b1a35-75e4-4879-879d-ccab183ba2b7"), + path: "assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg", + label: "metal_office_desk_diff_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 1787420, + content_hash: "5469ef3017f5818e177c08294e9bd9e51cca6f010db09cbead11b103e7fa5e63", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], ), - dependencies: [], - ), - ( - id: ("64fea29e-c123-4987-92dc-ca25f4dc7dea"), - path: "assets/build_profiles/qa.ron", - label: "qa", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("cadad4af-c24a-4d52-bdc4-8089dac67f30"), + path: "assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg", + label: "metal_office_desk_nor_gl_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 490814, + content_hash: "b9847b163409459d6d052a236c483ba1c0d72a5510aa9fb067ec3c1f0f5f5bb0", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], ), - dependencies: [], - ), - ( - id: ("de76f1c9-f05d-48d3-bb69-6b7ce05f29d8"), - path: "assets/build_profiles/release.ron", - label: "release", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("fe40db93-181f-4c79-86e6-26bd97464c4b"), + path: "assets/audio/Puzzle Lobby.mp3", + label: "Puzzle Lobby", + kind: AudioClip, + source_fingerprint: Some(( + byte_len: 1680820, + content_hash: "3b5a401dbaccfdbda540c60070ce259fb506d7da548f45008eb2b3fa720b4b57", + )), + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("f3dfcd11-aa5b-4fd4-872b-06832b865c99"), - path: "assets/levels/audio_authoring_showcase.scn.ron", - label: "audio_authoring_showcase.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("c0a7d10e-53c1-4de0-b0dc-34a66f44ba77"), + path: "assets/audio/editor_audition_tone.ogg", + label: "editor_audition_tone", + kind: AudioClip, + source_fingerprint: Some(( + byte_len: 4450, + content_hash: "8ef56184ab5b5cd135e45df152f8a95737023420947f3d08c9b3e3605e55a349", + )), + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("a7ef65b4-24d6-4c3a-b637-5bb52d8e9a26"), - path: "assets/levels/collider_diagnostics_showcase.scn.ron", - label: "collider_diagnostics_showcase.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("f3dfcd11-aa5b-4fd4-872b-06832b865c99"), + path: "assets/levels/audio_authoring_showcase.scn.ron", + label: "audio_authoring_showcase.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("dc13ce01-c7ce-43c5-974c-0e659ae49ab9"), - path: "assets/levels/editor_scene 2.scn.ron", - label: "editor_scene 2.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("a7ef65b4-24d6-4c3a-b637-5bb52d8e9a26"), + path: "assets/levels/collider_diagnostics_showcase.scn.ron", + label: "collider_diagnostics_showcase.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("48bcef13-e6a6-4260-bb1b-c29787bd8c70"), - path: "assets/levels/editor_scene 3.scn.ron", - label: "editor_scene 3.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("dc13ce01-c7ce-43c5-974c-0e659ae49ab9"), + path: "assets/levels/editor_scene 2.scn.ron", + label: "editor_scene 2.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("5a2307d0-48e5-40d3-a5c9-527c0cfd30f4"), - path: "assets/levels/editor_scene.scn.ron", - label: "editor_scene.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("48bcef13-e6a6-4260-bb1b-c29787bd8c70"), + path: "assets/levels/editor_scene 3.scn.ron", + label: "editor_scene 3.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("706e604e-1a63-4e97-b35d-eeb1d88fe3a9"), - path: "assets/levels/navigation_authoring_showcase.scn.ron", - label: "navigation_authoring_showcase.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("5a2307d0-48e5-40d3-a5c9-527c0cfd30f4"), + path: "assets/levels/editor_scene.scn.ron", + label: "editor_scene.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("78c6850b-5a76-4a4f-b48e-7fb00f6dd1ed"), - path: "assets/levels/physics_placement_showcase.scn.ron", - label: "physics_placement_showcase.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("706e604e-1a63-4e97-b35d-eeb1d88fe3a9"), + path: "assets/levels/navigation_authoring_showcase.scn.ron", + label: "navigation_authoring_showcase.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("61802b85-fda9-4aff-94d9-fe5f0860c516"), - path: "assets/levels/rendering_showcase.scn.ron", - label: "rendering_showcase.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("78c6850b-5a76-4a4f-b48e-7fb00f6dd1ed"), + path: "assets/levels/physics_placement_showcase.scn.ron", + label: "physics_placement_showcase.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("bca13177-afa9-4691-9b40-288059c7a57e"), - path: "assets/levels/samples/brush_blockout.scn.ron", - label: "brush_blockout.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("61802b85-fda9-4aff-94d9-fe5f0860c516"), + path: "assets/levels/rendering_showcase.scn.ron", + label: "rendering_showcase.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("607864bf-fa77-4f9e-acc9-2c0906d34163"), - path: "assets/levels/samples/material_lab.scn.ron", - label: "material_lab.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("bca13177-afa9-4691-9b40-288059c7a57e"), + path: "assets/levels/samples/brush_blockout.scn.ron", + label: "brush_blockout.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("1b25d451-7b54-41d6-af00-d2e6950f502d"), - path: "assets/levels/terrain_authoring_showcase.scn.ron", - label: "terrain_authoring_showcase.scn", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("607864bf-fa77-4f9e-acc9-2c0906d34163"), + path: "assets/levels/samples/material_lab.scn.ron", + label: "material_lab.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("a57f2891-8536-47b8-b476-01c08b36ac43"), - path: "assets/materials/concrete.ron", - label: "concrete", - kind_tag: "Material", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("1b25d451-7b54-41d6-af00-d2e6950f502d"), + path: "assets/levels/terrain_authoring_showcase.scn.ron", + label: "terrain_authoring_showcase.scn", + kind: Level, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("4f684592-50b1-47e4-888c-8ba537e4c29d"), - path: "assets/materials/emissive_panel.ron", - label: "emissive_panel", - kind_tag: "Material", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("782d9f6a-e965-41af-86e1-84ce44de1cd6"), + path: "assets/materials/chrome.ron", + label: "chrome", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("d6cb4151-7124-4237-aaf9-f7f8abd5fb76"), - path: "assets/materials/surface_tint.ron", - label: "surface_tint", - kind_tag: "Material", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("a57f2891-8536-47b8-b476-01c08b36ac43"), + path: "assets/materials/concrete.ron", + label: "concrete", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("cc2769da-c9a5-4cb3-866a-cc81d0688ee2"), - path: "assets/materials/surface_tint_instance.ron", - label: "surface_tint_instance", - kind_tag: "Material", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("4f684592-50b1-47e4-888c-8ba537e4c29d"), + path: "assets/materials/emissive_panel.ron", + label: "emissive_panel", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("113f74df-e39c-41d4-9b5b-e48efe541f7f"), - path: "assets/models/RobotExpressive.glb", - label: "RobotExpressive", - kind_tag: "Model", - source_fingerprint: Some(( - byte_len: 463988, - content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", - )), - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: SceneInstance, - hierarchy_mode: SourceHierarchy, - material_policy: SourceMaterials, - static_mesh_manifest_path: Some("assets/meshes/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.static_mesh.ron"), - animation_manifest_path: Some("assets/animations/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.animation.ron"), - default_animation_clip_id: Some("animation:clip:8:standing"), + ( + id: ("0cb3fb85-db18-52ea-8c42-b5ab58e90965"), + path: "assets/materials/migrated/legacy-05a00cdd0a637f9e.material.ron", + label: "legacy-05a00cdd0a637f9e.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("b98ef565-3500-49e7-9935-f685fa9b2594"), - path: "assets/models/painted_wooden_chair_02_2k.fbx", - label: "painted_wooden_chair_02_2k", - kind_tag: "Model", - source_fingerprint: Some(( - byte_len: 59964, - content_hash: "b12973a62dcb44589e380ea833eade726ae98a86c81084c842ee3801866d6a46", - )), - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: AuthoringOverride, - static_mesh_manifest_path: Some("assets/meshes/generated/b98ef565-3500-49e7-9935-f685fa9b2594.static_mesh.ron"), - animation_manifest_path: Some("assets/animations/generated/b98ef565-3500-49e7-9935-f685fa9b2594.animation.ron"), - default_animation_clip_id: None, + ( + id: ("250a0db7-7108-5adf-b759-39b30c692c35"), + path: "assets/materials/migrated/legacy-082ba03b8cbb710b.material.ron", + label: "legacy-082ba03b8cbb710b.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [ - "assets/models/textures/painted_wooden_chair_02_diff_2k.jpg", - "assets/models/textures/painted_wooden_chair_02_nor_gl_2k.exr", - "assets/models/textures/painted_wooden_chair_02_rough_2k.exr", - ], - ), - ( - id: ("3f63f359-45eb-4cb2-8970-71921cbd7bd0"), - path: "assets/models/robot_expressive.glb", - label: "robot_expressive", - kind_tag: "Model", - source_fingerprint: Some(( - byte_len: 463988, - content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", - )), - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: Some("assets/meshes/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.static_mesh.ron"), - animation_manifest_path: Some("assets/animations/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.animation.ron"), - default_animation_clip_id: Some("animation:clip:8:standing"), + ( + id: ("5b60f0a9-53b8-56b4-8ee9-cffd2e117c55"), + path: "assets/materials/migrated/legacy-0a21ebb8e495bf57.material.ron", + label: "legacy-0a21ebb8e495bf57.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("264e2010-0693-4d74-8440-99373c2cedb3"), - path: "assets/navigation/generated/navigation_showcase_humanoid.nav.ron", - label: "navigation_showcase_humanoid.nav", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("8fd7f537-75c1-524d-9f09-6654a3718a8e"), + path: "assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron", + label: "legacy-1a259303a97c4ba9.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("31963299-d4c1-45dc-8f67-2f469ca1ad6d"), - path: "assets/post_fx/chromatic_aberration.ron", - label: "chromatic_aberration", - kind_tag: "PostProcessEffect", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("7a818722-7a73-5541-838c-cedbef0648f7"), + path: "assets/materials/migrated/legacy-2b86cae1d3bfacae.material.ron", + label: "legacy-2b86cae1d3bfacae.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("e14a9bc3-9a4e-47b0-901f-b31c004e1836"), - path: "assets/post_fx/vignette.ron", - label: "vignette", - kind_tag: "PostProcessEffect", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("c6c84742-e395-5ccb-96bc-d1bd101623b5"), + path: "assets/materials/migrated/legacy-3546762bbff37951.material.ron", + label: "legacy-3546762bbff37951.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("862530b2-8111-4ebb-9078-29723c002e08"), - path: "assets/prefabs/example_base.scn.ron", - label: "example_base.scn", - kind_tag: "Prefab", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("3adc8ea9-1387-5f1c-9404-bbe057dd910d"), + path: "assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron", + label: "legacy-454bcd95aaa4f1ca.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("682191d6-59cd-46a1-9560-6cf7bc1583b2"), - path: "assets/prefabs/example_nested.scn.ron", - label: "example_nested.scn", - kind_tag: "Prefab", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("2b67be74-d8b5-509a-9efe-dd58b8010a9a"), + path: "assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron", + label: "legacy-4f65eccbb7dac1a2.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("c14f6240-5654-4e80-9edb-2b4c44cf8d61"), - path: "assets/prefabs/example_variant.scn.ron", - label: "example_variant.scn", - kind_tag: "Prefab", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("231210a7-5d2a-5d06-b3ec-b3ee0bde636a"), + path: "assets/materials/migrated/legacy-62ef60a686be94f1.material.ron", + label: "legacy-62ef60a686be94f1.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("2c4a9866-17b5-4797-9a8f-726b2ffacdb9"), - path: "assets/rendering_profiles/cave_dark.ron", - label: "cave_dark", - kind_tag: "RenderingProfile", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("c98f2306-b6f1-5d02-b232-19e74e886e20"), + path: "assets/materials/migrated/legacy-77cc6503f24bb9e8.material.ron", + label: "legacy-77cc6503f24bb9e8.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("802471df-8295-4997-80e2-db4191850fc9"), - path: "assets/rendering_profiles/outdoor_haze.ron", - label: "outdoor_haze", - kind_tag: "RenderingProfile", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("6cc5ffc1-16fb-5652-ab6b-0bb9b4f36ae2"), + path: "assets/materials/migrated/legacy-78bc49856f47eae1.material.ron", + label: "legacy-78bc49856f47eae1.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("e42185de-cda2-4a9e-9df0-df67ccd86123"), - path: "assets/samples/editor_samples.ron", - label: "editor_samples", - kind_tag: "Level", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("069977d1-acb8-5bf2-8afa-dfe2abbd4303"), + path: "assets/materials/migrated/legacy-964101ee77293501.material.ron", + label: "legacy-964101ee77293501.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("addf6f7f-8114-45f3-8566-70d1eaa1fec3"), - path: "assets/shaders/standard_lit.shader.ron", - label: "standard_lit.shader", - kind_tag: "ShaderSchema", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("ee32fb60-4ef9-5b7f-a20d-ce216e915530"), + path: "assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron", + label: "legacy-97356bd0ac2f6198.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("a72943d6-3e9d-4629-8887-5c02d99d4f92"), - path: "assets/shaders/surface_tint.shader.ron", - label: "surface_tint.shader", - kind_tag: "ShaderSchema", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("1cc3cb7a-7ddd-55e3-ba91-71071f30dc83"), + path: "assets/materials/migrated/legacy-9a630ee3e4848d9d.material.ron", + label: "legacy-9a630ee3e4848d9d.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("7b143cfb-a9e9-45d4-8f01-cfaa66fa9811"), - path: "assets/shaders/unlit.shader.ron", - label: "unlit.shader", - kind_tag: "ShaderSchema", - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("81212e15-4fc8-50ca-bd7d-ac596505cb4c"), + path: "assets/materials/migrated/legacy-a74f874eafd5d224.material.ron", + label: "legacy-a74f874eafd5d224.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("0496e62e-1837-4940-a9c9-b2b4ffe9ed90"), - path: "assets/textures/metal_stool_01_arm_2k.jpg", - label: "metal_stool_01_arm_2k", - kind_tag: "Texture", - source_fingerprint: Some(( - byte_len: 3152060, - content_hash: "31b2249ed7b50d3a021312a1e299167897513710ee8ded75c5c5e56aad592e10", - )), - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("91e93c0c-4d4b-5e3f-adcd-6c15be6d0a74"), + path: "assets/materials/migrated/legacy-b278a62978900638.material.ron", + label: "legacy-b278a62978900638.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("bddaa4d4-5097-42bf-8d51-dd9a3580442a"), - path: "assets/textures/metal_stool_01_diff_2k.jpg", - label: "metal_stool_01_diff_2k", - kind_tag: "Texture", - source_fingerprint: Some(( - byte_len: 2603921, - content_hash: "e0b9dee5b09f1968e7c6ea82eb9a157d303c25d0600913b8b9c809adf50b73c8", - )), - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("0a4681e1-b5f0-57fa-8ee1-4431e14e322f"), + path: "assets/materials/migrated/legacy-c656429ce3668694.material.ron", + label: "legacy-c656429ce3668694.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), - ( - id: ("c4abe41c-ac88-4aec-8168-27e8a7c90583"), - path: "assets/textures/metal_stool_01_nor_gl_2k.jpg", - label: "metal_stool_01_nor_gl_2k", - kind_tag: "Texture", - source_fingerprint: Some(( - byte_len: 2779150, - content_hash: "8c0aa4cf4270c9bf7217fba40b2b48878972ee59cff851cb8dfa57a90f4f373b", - )), - import_settings: ( - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: StaticAsset, - hierarchy_mode: SingleActor, - material_policy: SourceMaterials, - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + ( + id: ("ba295f51-426f-5fdb-b444-a5f1cc5199da"), + path: "assets/materials/migrated/legacy-c6c02ef278fba7c3.material.ron", + label: "legacy-c6c02ef278fba7c3.material", + kind: Material, + import_settings: None, + dependencies: [], ), - dependencies: [], - ), -] + ( + id: ("6c8791ac-a746-58a2-b097-17d2fe0494dc"), + path: "assets/materials/migrated/legacy-c6fbbebd3e1a9943.material.ron", + label: "legacy-c6fbbebd3e1a9943.material", + kind: Material, + import_settings: None, + dependencies: [], + ), + ( + id: ("41dbf5a0-7a0a-5fac-9ec3-a0ceacb548a9"), + path: "assets/materials/migrated/legacy-c9d05c61e5cf348d.material.ron", + label: "legacy-c9d05c61e5cf348d.material", + kind: Material, + import_settings: None, + dependencies: [], + ), + ( + id: ("2fb3fcd4-f7b7-5f28-bf79-2241e47c7ea8"), + path: "assets/materials/migrated/legacy-cc0396f5c90fb7bb.material.ron", + label: "legacy-cc0396f5c90fb7bb.material", + kind: Material, + import_settings: None, + dependencies: [], + ), + ( + id: ("c512d6e2-272b-5e86-8235-4628ed3b6e8c"), + path: "assets/materials/migrated/legacy-e9671004b101f4df.material.ron", + label: "legacy-e9671004b101f4df.material", + kind: Material, + import_settings: None, + dependencies: [], + ), + ( + id: ("2db7e7f2-c0ab-51df-b71b-37f0e8c038f1"), + path: "assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron", + label: "legacy-fc132d9b30cc63d4.material", + kind: Material, + import_settings: None, + dependencies: [], + ), + ( + id: ("e9bd02c0-986f-4f90-a6d5-f04388622b94"), + path: "assets/materials/new_material.ron", + label: "new_material", + kind: Material, + import_settings: None, + dependencies: [], + ), + ( + id: ("d4387c2e-3ca2-4fca-862a-d86def44e424"), + path: "assets/materials/new_material_2.ron", + label: "new_material_2", + kind: Material, + import_settings: None, + dependencies: [], + ), + ( + id: ("c07a5b05-f27d-46c6-8b8c-9de9cdd14720"), + path: "assets/materials/pebble_bricks.ron", + label: "pebble_bricks", + kind: Material, + import_settings: None, + dependencies: [ + "assets/materials/textures/pebble_bricks_arm_4k.jpg", + "assets/materials/textures/pebble_bricks_diff_4k.jpg", + "assets/materials/textures/pebble_bricks_nor_gl_4k.jpg", + ], + ), + ( + id: ("bd495161-5ea8-48ef-b0db-5b1d57f33885"), + path: "assets/materials/pebble_bricks_4k.gltf", + label: "pebble_bricks_4k", + kind: Model, + source_fingerprint: Some(( + byte_len: 2788, + content_hash: "55a5374732e4174e33859cf415d22ac855cea3efe8d8ff78c6ee42c86d8fd5fb", + )), + import_settings: Model(( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SingleActor, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node0:mesh0:primitive0"), + selection: Project((( + asset_id: "c07a5b05-f27d-46c6-8b8c-9de9cdd14720", + sub_asset_id: "", + label: "pebble_bricks", + source_path: Some("assets/materials/pebble_bricks.ron"), + ))), + ), + ], + orphaned_material_slots: [], + static_mesh_manifest_path: Some("assets/meshes/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.static_mesh.ron"), + animation_manifest_path: Some("assets/animations/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.animation.ron"), + default_animation_clip_id: None, + )), + dependencies: [ + "assets/materials/pebble_bricks.bin", + "assets/materials/textures/pebble_bricks_arm_4k.jpg", + "assets/materials/textures/pebble_bricks_diff_4k.jpg", + "assets/materials/textures/pebble_bricks_nor_gl_4k.jpg", + ], + ), + ( + id: ("d6cb4151-7124-4237-aaf9-f7f8abd5fb76"), + path: "assets/materials/surface_tint.ron", + label: "surface_tint", + kind: Material, + import_settings: None, + dependencies: [], + ), + ( + id: ("cc2769da-c9a5-4cb3-866a-cc81d0688ee2"), + path: "assets/materials/surface_tint_instance.ron", + label: "surface_tint_instance", + kind: MaterialInstance, + import_settings: None, + dependencies: [], + ), + ( + id: ("25db6174-afcb-421f-8c1c-0c5ffde21b79"), + path: "assets/materials/textures/pebble_bricks_arm_4k.jpg", + label: "pebble_bricks_arm_4k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 16434309, + content_hash: "f4b80f8443ab093a9e513d92e69890a6e81803728655ef3988113c94a991a106", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("d3b9bec5-c0ea-4f83-ad80-f9e2a8cb69ee"), + path: "assets/materials/textures/pebble_bricks_diff_4k.jpg", + label: "pebble_bricks_diff_4k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 14259465, + content_hash: "25324328e0beee417d9005906590e6e98f747f2fdcbfaf5bfb57aa80f623cd30", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("7c5235a1-f5d7-4530-b29f-5ea075881df5"), + path: "assets/materials/textures/pebble_bricks_nor_gl_4k.jpg", + label: "pebble_bricks_nor_gl_4k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 20424876, + content_hash: "337a67d8773a7842991e6de13af5fddf3632d033056b7933dc8ec597e3278cf2", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("113f74df-e39c-41d4-9b5b-e48efe541f7f"), + path: "assets/models/RobotExpressive.glb", + label: "RobotExpressive", + kind: Model, + source_fingerprint: Some(( + byte_len: 463988, + content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", + )), + import_settings: Model(( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: SceneInstance, + hierarchy_mode: SourceHierarchy, + material_slots: [], + orphaned_material_slots: [], + static_mesh_manifest_path: Some("assets/meshes/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.static_mesh.ron"), + animation_manifest_path: Some("assets/animations/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.animation.ron"), + default_animation_clip_id: Some("animation:clip:8:standing"), + )), + dependencies: [], + ), + ( + id: ("3076fad0-89ca-4307-b8d9-cb77fca41907"), + path: "assets/models/metal_office_desk_2k.gltf", + label: "metal_office_desk_2k", + kind: Model, + source_fingerprint: Some(( + byte_len: 13510, + content_hash: "904f3af2a5283a08f60bcfb2651c5280f14f1232ec522154e4878e90909551ce", + )), + import_settings: Model(( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SingleActor, + material_slots: [], + orphaned_material_slots: [], + static_mesh_manifest_path: Some("assets/meshes/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.static_mesh.ron"), + animation_manifest_path: Some("assets/animations/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.animation.ron"), + default_animation_clip_id: None, + )), + dependencies: [ + "assets/models/metal_office_desk.bin", + "assets/models/textures/metal_office_desk_arm_2k.jpg", + "assets/models/textures/metal_office_desk_diff_2k.jpg", + "assets/models/textures/metal_office_desk_nor_gl_2k.jpg", + ], + ), + ( + id: ("b98ef565-3500-49e7-9935-f685fa9b2594"), + path: "assets/models/painted_wooden_chair_02_2k.fbx", + label: "painted_wooden_chair_02_2k", + kind: Model, + source_fingerprint: Some(( + byte_len: 59964, + content_hash: "b12973a62dcb44589e380ea833eade726ae98a86c81084c842ee3801866d6a46", + )), + import_settings: Model(( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SingleActor, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node1:material0"), + selection: Default, + ), + ], + orphaned_material_slots: [], + static_mesh_manifest_path: Some("assets/meshes/generated/b98ef565-3500-49e7-9935-f685fa9b2594.static_mesh.ron"), + animation_manifest_path: Some("assets/animations/generated/b98ef565-3500-49e7-9935-f685fa9b2594.animation.ron"), + default_animation_clip_id: None, + )), + dependencies: [ + "assets/models/textures/painted_wooden_chair_02_diff_2k.jpg", + "assets/models/textures/painted_wooden_chair_02_nor_gl_2k.exr", + "assets/models/textures/painted_wooden_chair_02_rough_2k.exr", + ], + ), + ( + id: ("3f63f359-45eb-4cb2-8970-71921cbd7bd0"), + path: "assets/models/robot_expressive.glb", + label: "robot_expressive", + kind: Model, + source_fingerprint: Some(( + byte_len: 463988, + content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", + )), + import_settings: Model(( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SingleActor, + material_slots: [], + orphaned_material_slots: [], + static_mesh_manifest_path: Some("assets/meshes/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.static_mesh.ron"), + animation_manifest_path: Some("assets/animations/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.animation.ron"), + default_animation_clip_id: Some("animation:clip:8:standing"), + )), + dependencies: [], + ), + ( + id: ("393414a8-3089-435f-b267-6dd3eac0285f"), + path: "assets/models/textures/metal_office_desk_arm_2k.jpg", + label: "metal_office_desk_arm_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 2724325, + content_hash: "0f67cb85769b10467eeea0aa3bf0649c65a2687029d49b6de76a960ab60ce00d", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("e5512ff1-aa00-4592-a740-4574e1059a99"), + path: "assets/models/textures/metal_office_desk_diff_2k.jpg", + label: "metal_office_desk_diff_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 1787420, + content_hash: "5469ef3017f5818e177c08294e9bd9e51cca6f010db09cbead11b103e7fa5e63", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("5212dba1-853f-4dab-98f3-e6395d05a4f7"), + path: "assets/models/textures/metal_office_desk_nor_gl_2k.jpg", + label: "metal_office_desk_nor_gl_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 490814, + content_hash: "b9847b163409459d6d052a236c483ba1c0d72a5510aa9fb067ec3c1f0f5f5bb0", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("09762f59-bcd6-44fc-8157-2ad920177996"), + path: "assets/pebble_bricks_surface_instance.material-instance.ron", + label: "pebble_bricks_surface_instance.material-instance", + kind: MaterialInstance, + import_settings: None, + dependencies: [], + ), + ( + id: ("31963299-d4c1-45dc-8f67-2f469ca1ad6d"), + path: "assets/post_fx/chromatic_aberration.ron", + label: "chromatic_aberration", + kind: PostProcessEffect, + import_settings: None, + dependencies: [], + ), + ( + id: ("e14a9bc3-9a4e-47b0-901f-b31c004e1836"), + path: "assets/post_fx/vignette.ron", + label: "vignette", + kind: PostProcessEffect, + import_settings: None, + dependencies: [], + ), + ( + id: ("862530b2-8111-4ebb-9078-29723c002e08"), + path: "assets/prefabs/example_base.scn.ron", + label: "example_base.scn", + kind: Level, + import_settings: None, + dependencies: [], + ), + ( + id: ("682191d6-59cd-46a1-9560-6cf7bc1583b2"), + path: "assets/prefabs/example_nested.scn.ron", + label: "example_nested.scn", + kind: Level, + import_settings: None, + dependencies: [], + ), + ( + id: ("c14f6240-5654-4e80-9edb-2b4c44cf8d61"), + path: "assets/prefabs/example_variant.scn.ron", + label: "example_variant.scn", + kind: Level, + import_settings: None, + dependencies: [], + ), + ( + id: ("2c4a9866-17b5-4797-9a8f-726b2ffacdb9"), + path: "assets/rendering_profiles/cave_dark.ron", + label: "cave_dark", + kind: RenderingProfile, + import_settings: None, + dependencies: [], + ), + ( + id: ("802471df-8295-4997-80e2-db4191850fc9"), + path: "assets/rendering_profiles/outdoor_haze.ron", + label: "outdoor_haze", + kind: RenderingProfile, + import_settings: None, + dependencies: [], + ), + ( + id: ("addf6f7f-8114-45f3-8566-70d1eaa1fec3"), + path: "assets/shaders/standard_lit.shader.ron", + label: "standard_lit.shader", + kind: ShaderSchema, + import_settings: None, + dependencies: [], + ), + ( + id: ("a72943d6-3e9d-4629-8887-5c02d99d4f92"), + path: "assets/shaders/surface_tint.shader.ron", + label: "surface_tint.shader", + kind: ShaderSchema, + import_settings: None, + dependencies: [], + ), + ( + id: ("7b143cfb-a9e9-45d4-8f01-cfaa66fa9811"), + path: "assets/shaders/unlit.shader.ron", + label: "unlit.shader", + kind: ShaderSchema, + import_settings: None, + dependencies: [], + ), + ( + id: ("c7a227bc-2bae-4a41-857b-28cc6b432a9d"), + path: "assets/textures/metal_office_desk_arm_2k.jpg", + label: "metal_office_desk_arm_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 2724325, + content_hash: "0f67cb85769b10467eeea0aa3bf0649c65a2687029d49b6de76a960ab60ce00d", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Linear, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("c644134e-87c7-43fb-ac30-31c4e0a78b48"), + path: "assets/textures/metal_office_desk_diff_2k.jpg", + label: "metal_office_desk_diff_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 1787420, + content_hash: "5469ef3017f5818e177c08294e9bd9e51cca6f010db09cbead11b103e7fa5e63", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("c661e66a-0745-4dd9-89b0-e611befab602"), + path: "assets/textures/metal_office_desk_nor_gl_2k.jpg", + label: "metal_office_desk_nor_gl_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 490814, + content_hash: "b9847b163409459d6d052a236c483ba1c0d72a5510aa9fb067ec3c1f0f5f5bb0", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Linear, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("0496e62e-1837-4940-a9c9-b2b4ffe9ed90"), + path: "assets/textures/metal_stool_01_arm_2k.jpg", + label: "metal_stool_01_arm_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 3152060, + content_hash: "31b2249ed7b50d3a021312a1e299167897513710ee8ded75c5c5e56aad592e10", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("bddaa4d4-5097-42bf-8d51-dd9a3580442a"), + path: "assets/textures/metal_stool_01_diff_2k.jpg", + label: "metal_stool_01_diff_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 2603921, + content_hash: "e0b9dee5b09f1968e7c6ea82eb9a157d303c25d0600913b8b9c809adf50b73c8", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ( + id: ("c4abe41c-ac88-4aec-8168-27e8a7c90583"), + path: "assets/textures/metal_stool_01_nor_gl_2k.jpg", + label: "metal_stool_01_nor_gl_2k", + kind: Texture, + source_fingerprint: Some(( + byte_len: 2779150, + content_hash: "8c0aa4cf4270c9bf7217fba40b2b48878972ee59cff851cb8dfa57a90f4f373b", + )), + import_settings: Texture(( + semantic: Auto, + color_space: Auto, + mipmaps: Generate, + compression: Auto, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + )), + dependencies: [], + ), + ], +) \ No newline at end of file diff --git a/assets/Furniture/Office/blacksite-m2-robot-expressive.glb b/assets/Furniture/Office/blacksite-m2-robot-expressive.glb new file mode 100644 index 0000000..7cb7550 --- /dev/null +++ b/assets/Furniture/Office/blacksite-m2-robot-expressive.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:047f5e5fb3bb6d378bd1df16ca6137f2a596c99b3a1b5690b4020c05aaf6f319 +size 463988 diff --git a/assets/Furniture/Office/metal_office_desk.bin b/assets/Furniture/Office/metal_office_desk.bin new file mode 100644 index 0000000000000000000000000000000000000000..980289970a7587c50476a502a7f412317565e575 GIT binary patch literal 229700 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
9>@<}57JKKD1N%WDSm3x^+VS) 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 literal 0 HcmV?d00001 diff --git a/assets/Furniture/Office/metal_office_desk.material.ron b/assets/Furniture/Office/metal_office_desk.material.ron new file mode 100644 index 0000000..59852fe --- /dev/null +++ b/assets/Furniture/Office/metal_office_desk.material.ron @@ -0,0 +1,116 @@ +( + schema_version: 2, + label: "metal_office_desk", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: true, + ), + provenance: Some(( + source_path: "assets/Furniture/Office/metal_office_desk_2k.gltf", + source_fingerprint: "904f3af2a5283a08f60bcfb2651c5280f14f1232ec522154e4878e90909551ce", + source_sub_asset_id: "material:0", + source_label: "metal_office_desk", + )), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.23189718), + ), + ( + name: "roughness", + value: Float(1.0), + ), + ( + name: "emissive_color", + value: Color(( + r: 0.0, + g: 0.0, + b: 0.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ( + name: "occlusion", + value: Float(1.0), + ), + ], + textures: [ + ( + name: "base_color", + texture: Some(( + asset_id: "481b1a35-75e4-4879-879d-ccab183ba2b7", + sub_asset_id: "texture:source", + label: "metal_office_desk_diff_2k", + source_path: Some("assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg"), + )), + channel: Rgba, + ), + ( + name: "normal", + texture: Some(( + asset_id: "cadad4af-c24a-4d52-bdc4-8089dac67f30", + sub_asset_id: "texture:source", + label: "metal_office_desk_nor_gl_2k", + source_path: Some("assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg"), + )), + channel: Rgb, + ), + ( + name: "occlusion", + texture: Some(( + asset_id: "cef332e3-d0d1-41d7-adf2-87462c70f52c", + sub_asset_id: "texture:source", + label: "metal_office_desk_arm_2k", + source_path: Some("assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg"), + )), + channel: R, + ), + ( + name: "roughness", + texture: Some(( + asset_id: "cef332e3-d0d1-41d7-adf2-87462c70f52c", + sub_asset_id: "texture:source", + label: "metal_office_desk_arm_2k", + source_path: Some("assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg"), + )), + channel: G, + ), + ( + name: "metallic", + texture: Some(( + asset_id: "cef332e3-d0d1-41d7-adf2-87462c70f52c", + sub_asset_id: "texture:source", + label: "metal_office_desk_arm_2k", + source_path: Some("assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg"), + )), + channel: B, + ), + ( + name: "emissive_color", + texture: None, + channel: Rgb, + ), + ], + ), +) \ No newline at end of file diff --git a/assets/Furniture/Office/metal_office_desk_2k.gltf b/assets/Furniture/Office/metal_office_desk_2k.gltf new file mode 100644 index 0000000..8a13add --- /dev/null +++ b/assets/Furniture/Office/metal_office_desk_2k.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6997a8b4e1b82facc95ad698196c42a5c6f1b2734173af138555576a80344189 +size 13500 diff --git a/assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg b/assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg new file mode 100644 index 0000000..7986b9c --- /dev/null +++ b/assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23c94b99aec8c9b105ff4d843ac41f229b0effb97abe921f0f8b506ccfd76952 +size 2724325 diff --git a/assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg b/assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg new file mode 100644 index 0000000..fe6aafc --- /dev/null +++ b/assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f5854edc8a7979ed4576b914c184bda64d7e6ee9969357738703be49118da30 +size 1787420 diff --git a/assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg b/assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg new file mode 100644 index 0000000..093cd80 --- /dev/null +++ b/assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25392e7682c43ca07abbbbe717388b9e6d40bbca663836916204f99ac0378d34 +size 490814 diff --git a/assets/animations/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.animation.ron b/assets/animations/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.animation.ron index 0c9f6ca..a745c9b 100644 --- a/assets/animations/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.animation.ron +++ b/assets/animations/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.animation.ron @@ -8,7 +8,6 @@ format: "glb", fingerprint: ( byte_len: 463988, - modified_unix_secs: 1783799272, content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", ), dependencies: [], @@ -233,4 +232,4 @@ ), ], diagnostics: [], -) \ No newline at end of file +) diff --git a/assets/animations/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.animation.ron b/assets/animations/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.animation.ron new file mode 100644 index 0000000..c9f55fe --- /dev/null +++ b/assets/animations/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.animation.ron @@ -0,0 +1,21 @@ +( + schema_version: 3, + asset_id: "3076fad0-89ca-4307-b8d9-cb77fca41907", + label: "metal_office_desk_2k", + default_animation_clip_id: None, + source: ( + path: "assets/models/metal_office_desk_2k.gltf", + format: "gltf", + fingerprint: ( + byte_len: 13510, + content_hash: "904f3af2a5283a08f60bcfb2651c5280f14f1232ec522154e4878e90909551ce", + ), + dependencies: [ + "assets/models/metal_office_desk.bin", + ], + ), + runtime_supported: true, + skeletons: [], + clips: [], + diagnostics: [], +) diff --git a/assets/animations/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.animation.ron b/assets/animations/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.animation.ron new file mode 100644 index 0000000..a931248 --- /dev/null +++ b/assets/animations/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.animation.ron @@ -0,0 +1,21 @@ +( + schema_version: 3, + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + label: "metal_office_desk_2k", + default_animation_clip_id: None, + source: ( + path: "assets/Furniture/Office/metal_office_desk_2k.gltf", + format: "gltf", + fingerprint: ( + byte_len: 13500, + content_hash: "64fd91fbc603c9675f9c8b5f1291a654deff89b40aeb0a0b877b7b93f6ebf05e", + ), + dependencies: [ + "assets/Furniture/Office/metal_office_desk.bin", + ], + ), + runtime_supported: true, + skeletons: [], + clips: [], + diagnostics: [], +) diff --git a/assets/animations/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.animation.ron b/assets/animations/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.animation.ron index 8ae208c..81ea0ed 100644 --- a/assets/animations/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.animation.ron +++ b/assets/animations/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.animation.ron @@ -8,7 +8,6 @@ format: "glb", fingerprint: ( byte_len: 463988, - modified_unix_secs: 1783750957, content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", ), dependencies: [], @@ -233,4 +232,4 @@ ), ], diagnostics: [], -) \ No newline at end of file +) diff --git a/assets/animations/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.animation.ron b/assets/animations/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.animation.ron new file mode 100644 index 0000000..3290c0a --- /dev/null +++ b/assets/animations/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.animation.ron @@ -0,0 +1,235 @@ +( + schema_version: 3, + asset_id: "5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc", + label: "blacksite-m2-robot-expressive", + default_animation_clip_id: None, + source: ( + path: "assets/Furniture/Office/blacksite-m2-robot-expressive.glb", + format: "glb", + fingerprint: ( + byte_len: 463988, + content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", + ), + dependencies: [], + ), + runtime_supported: true, + skeletons: [ + ( + id: "animation:skeleton:0:skeleton_0", + label: "Skeleton 0", + source_index: 0, + signature: ("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b"), + joint_paths: [ + "RootNode/RobotArmature/Bone", + "RootNode/RobotArmature/Bone/Foot.L", + "RootNode/RobotArmature/Bone/Body", + "RootNode/RobotArmature/Bone/Body/Hips", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Neck", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Neck/Head", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm2.L/Middle1.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm2.L/Middle1.L/Middle2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Thumb.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Thumb.L/Thumb2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm1.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm1.L/Index.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm1.L/Index.L/Index2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm3.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm3.L/Ring1.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm3.L/Ring1.L/Ring2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm2.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm2.R/Middle1.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm2.R/Middle1.R/Middle2.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Thumb.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Thumb.R/Thumb2.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm1.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm1.R/Index.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm1.R/Index.R/Index2.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm3.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm3.R/Ring1.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm3.R/Ring1.R/Ring2.R", + "RootNode/RobotArmature/Bone/Body/UpperLeg.L", + "RootNode/RobotArmature/Bone/Body/UpperLeg.L/LowerLeg.L", + "RootNode/RobotArmature/Bone/Body/UpperLeg.R", + "RootNode/RobotArmature/Bone/Body/UpperLeg.R/LowerLeg.R", + "RootNode/RobotArmature/Bone/PoleTarget.L", + "RootNode/RobotArmature/Bone/Foot.R", + "RootNode/RobotArmature/Bone/PoleTarget.R", + ], + ), + ( + id: "animation:skeleton:1:skeleton_1", + label: "Skeleton 1", + source_index: 1, + signature: ("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b"), + joint_paths: [ + "RootNode/RobotArmature/Bone", + "RootNode/RobotArmature/Bone/Foot.L", + "RootNode/RobotArmature/Bone/Body", + "RootNode/RobotArmature/Bone/Body/Hips", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Neck", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Neck/Head", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm2.L/Middle1.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm2.L/Middle1.L/Middle2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Thumb.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Thumb.L/Thumb2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm1.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm1.L/Index.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm1.L/Index.L/Index2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm3.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm3.L/Ring1.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/LowerArm.L/Palm3.L/Ring1.L/Ring2.L", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm2.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm2.R/Middle1.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm2.R/Middle1.R/Middle2.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Thumb.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Thumb.R/Thumb2.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm1.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm1.R/Index.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm1.R/Index.R/Index2.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm3.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm3.R/Ring1.R", + "RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/LowerArm.R/Palm3.R/Ring1.R/Ring2.R", + "RootNode/RobotArmature/Bone/Body/UpperLeg.L", + "RootNode/RobotArmature/Bone/Body/UpperLeg.L/LowerLeg.L", + "RootNode/RobotArmature/Bone/Body/UpperLeg.R", + "RootNode/RobotArmature/Bone/Body/UpperLeg.R/LowerLeg.R", + "RootNode/RobotArmature/Bone/PoleTarget.L", + "RootNode/RobotArmature/Bone/Foot.R", + "RootNode/RobotArmature/Bone/PoleTarget.R", + ], + ), + ], + clips: [ + ( + id: "animation:clip:0:dance", + label: "Dance", + source_index: 0, + duration_seconds: 3.3333333, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:1:death", + label: "Death", + source_index: 1, + duration_seconds: 0.9583333, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:2:idle", + label: "Idle", + source_index: 2, + duration_seconds: 3.3333333, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:3:jump", + label: "Jump", + source_index: 3, + duration_seconds: 0.7083333, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:4:no", + label: "No", + source_index: 4, + duration_seconds: 1.6666666, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:5:punch", + label: "Punch", + source_index: 5, + duration_seconds: 0.8333333, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:6:running", + label: "Running", + source_index: 6, + duration_seconds: 0.9583333, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:7:sitting", + label: "Sitting", + source_index: 7, + duration_seconds: 0.41666666, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:8:standing", + label: "Standing", + source_index: 8, + duration_seconds: 0.41666666, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:9:thumbsup", + label: "ThumbsUp", + source_index: 9, + duration_seconds: 1.5833334, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:10:walking", + label: "Walking", + source_index: 10, + duration_seconds: 0.9583333, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:11:walkjump", + label: "WalkJump", + source_index: 11, + duration_seconds: 0.8333333, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:12:wave", + label: "Wave", + source_index: 12, + duration_seconds: 1.8333334, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ( + id: "animation:clip:13:yes", + label: "Yes", + source_index: 13, + duration_seconds: 1.6666666, + target_skeleton_signature: Some(("e9761f2a198d6a280afd0fc2aca6e8783dc6237bd85c90b8bc07a2e11271dc2b")), + events: [], + ), + ], + diagnostics: [], +) diff --git a/assets/animations/generated/b98ef565-3500-49e7-9935-f685fa9b2594.animation.ron b/assets/animations/generated/b98ef565-3500-49e7-9935-f685fa9b2594.animation.ron index 6259f6e..b364c25 100644 --- a/assets/animations/generated/b98ef565-3500-49e7-9935-f685fa9b2594.animation.ron +++ b/assets/animations/generated/b98ef565-3500-49e7-9935-f685fa9b2594.animation.ron @@ -8,7 +8,6 @@ format: "fbx", fingerprint: ( byte_len: 59964, - modified_unix_secs: 1780713434, content_hash: "b12973a62dcb44589e380ea833eade726ae98a86c81084c842ee3801866d6a46", ), dependencies: [], @@ -17,4 +16,4 @@ skeletons: [], clips: [], diagnostics: [], -) \ No newline at end of file +) diff --git a/assets/animations/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.animation.ron b/assets/animations/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.animation.ron new file mode 100644 index 0000000..af8417a --- /dev/null +++ b/assets/animations/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.animation.ron @@ -0,0 +1,21 @@ +( + schema_version: 3, + asset_id: "bd495161-5ea8-48ef-b0db-5b1d57f33885", + label: "pebble_bricks_4k", + default_animation_clip_id: None, + source: ( + path: "assets/materials/pebble_bricks_4k.gltf", + format: "gltf", + fingerprint: ( + byte_len: 2788, + content_hash: "55a5374732e4174e33859cf415d22ac855cea3efe8d8ff78c6ee42c86d8fd5fb", + ), + dependencies: [ + "assets/materials/pebble_bricks.bin", + ], + ), + runtime_supported: true, + skeletons: [], + clips: [], + diagnostics: [], +) diff --git a/assets/content.catalog.ron b/assets/content.catalog.ron new file mode 100644 index 0000000..b32895f --- /dev/null +++ b/assets/content.catalog.ron @@ -0,0 +1,909 @@ +( + version: 2, + defaults: ( + default_material: None, + ), + records: [ + ( + id: ("5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc"), + path: "assets/Furniture/Office/blacksite-m2-robot-expressive.glb", + label: "blacksite-m2-robot-expressive", + kind: Model, + material_slots: [], + ), + ( + id: ("647a63d4-64c6-4431-ba46-9efdd515cd8f"), + path: "assets/Furniture/Office/metal_office_desk.material.ron", + label: "metal_office_desk.material", + kind: Material, + material_slots: [], + material: Some(( + packed_arm_path: Some("assets/.import-cache/runtime/materials/647a63d4-64c6-4431-ba46-9efdd515cd8f/297372611543b1f7baa1e5e3-arm.basis"), + processing_key: Some("297372611543b1f7baa1e5e3"), + )), + ), + ( + id: ("36c51ff3-29ae-4ab1-aaca-f90f57e27966"), + path: "assets/Furniture/Office/metal_office_desk_2k.gltf", + label: "metal_office_desk_2k", + kind: Model, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node0:mesh0:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node1:mesh1:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node2:mesh2:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node3:mesh3:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node4:mesh4:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node5:mesh5:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node6:mesh6:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node7:mesh7:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ], + ), + ( + id: ("cef332e3-d0d1-41d7-adf2-87462c70f52c"), + path: "assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg", + label: "metal_office_desk_arm_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/cef332e3-d0d1-41d7-adf2-87462c70f52c/edf8ef1b2fc54bbe4eafc16d/texture.basis"), + processing_key: Some("edf8ef1b2fc54bbe4eafc16d"), + settings: ( + semantic: MaskData, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("481b1a35-75e4-4879-879d-ccab183ba2b7"), + path: "assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg", + label: "metal_office_desk_diff_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/481b1a35-75e4-4879-879d-ccab183ba2b7/534c0d384d22c554b9597064/texture.basis"), + processing_key: Some("534c0d384d22c554b9597064"), + settings: ( + semantic: Color, + color_space: Srgb, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: true, + )), + ), + ( + id: ("cadad4af-c24a-4d52-bdc4-8089dac67f30"), + path: "assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg", + label: "metal_office_desk_nor_gl_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/cadad4af-c24a-4d52-bdc4-8089dac67f30/cd1c550f437632f394bf7502/texture.basis"), + processing_key: Some("cd1c550f437632f394bf7502"), + settings: ( + semantic: Normal, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("fe40db93-181f-4c79-86e6-26bd97464c4b"), + path: "assets/audio/Puzzle Lobby.mp3", + label: "Puzzle Lobby", + kind: AudioClip, + material_slots: [], + ), + ( + id: ("c0a7d10e-53c1-4de0-b0dc-34a66f44ba77"), + path: "assets/audio/editor_audition_tone.ogg", + label: "editor_audition_tone", + kind: AudioClip, + material_slots: [], + ), + ( + id: ("f3dfcd11-aa5b-4fd4-872b-06832b865c99"), + path: "assets/levels/audio_authoring_showcase.scn.ron", + label: "audio_authoring_showcase.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("a7ef65b4-24d6-4c3a-b637-5bb52d8e9a26"), + path: "assets/levels/collider_diagnostics_showcase.scn.ron", + label: "collider_diagnostics_showcase.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("dc13ce01-c7ce-43c5-974c-0e659ae49ab9"), + path: "assets/levels/editor_scene 2.scn.ron", + label: "editor_scene 2.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("48bcef13-e6a6-4260-bb1b-c29787bd8c70"), + path: "assets/levels/editor_scene 3.scn.ron", + label: "editor_scene 3.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("5a2307d0-48e5-40d3-a5c9-527c0cfd30f4"), + path: "assets/levels/editor_scene.scn.ron", + label: "editor_scene.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("706e604e-1a63-4e97-b35d-eeb1d88fe3a9"), + path: "assets/levels/navigation_authoring_showcase.scn.ron", + label: "navigation_authoring_showcase.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("78c6850b-5a76-4a4f-b48e-7fb00f6dd1ed"), + path: "assets/levels/physics_placement_showcase.scn.ron", + label: "physics_placement_showcase.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("61802b85-fda9-4aff-94d9-fe5f0860c516"), + path: "assets/levels/rendering_showcase.scn.ron", + label: "rendering_showcase.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("bca13177-afa9-4691-9b40-288059c7a57e"), + path: "assets/levels/samples/brush_blockout.scn.ron", + label: "brush_blockout.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("607864bf-fa77-4f9e-acc9-2c0906d34163"), + path: "assets/levels/samples/material_lab.scn.ron", + label: "material_lab.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("1b25d451-7b54-41d6-af00-d2e6950f502d"), + path: "assets/levels/terrain_authoring_showcase.scn.ron", + label: "terrain_authoring_showcase.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("782d9f6a-e965-41af-86e1-84ce44de1cd6"), + path: "assets/materials/chrome.ron", + label: "chrome", + kind: Material, + material_slots: [], + ), + ( + id: ("a57f2891-8536-47b8-b476-01c08b36ac43"), + path: "assets/materials/concrete.ron", + label: "concrete", + kind: Material, + material_slots: [], + ), + ( + id: ("4f684592-50b1-47e4-888c-8ba537e4c29d"), + path: "assets/materials/emissive_panel.ron", + label: "emissive_panel", + kind: Material, + material_slots: [], + ), + ( + id: ("0cb3fb85-db18-52ea-8c42-b5ab58e90965"), + path: "assets/materials/migrated/legacy-05a00cdd0a637f9e.material.ron", + label: "legacy-05a00cdd0a637f9e.material", + kind: Material, + material_slots: [], + ), + ( + id: ("250a0db7-7108-5adf-b759-39b30c692c35"), + path: "assets/materials/migrated/legacy-082ba03b8cbb710b.material.ron", + label: "legacy-082ba03b8cbb710b.material", + kind: Material, + material_slots: [], + ), + ( + id: ("5b60f0a9-53b8-56b4-8ee9-cffd2e117c55"), + path: "assets/materials/migrated/legacy-0a21ebb8e495bf57.material.ron", + label: "legacy-0a21ebb8e495bf57.material", + kind: Material, + material_slots: [], + ), + ( + id: ("8fd7f537-75c1-524d-9f09-6654a3718a8e"), + path: "assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron", + label: "legacy-1a259303a97c4ba9.material", + kind: Material, + material_slots: [], + ), + ( + id: ("7a818722-7a73-5541-838c-cedbef0648f7"), + path: "assets/materials/migrated/legacy-2b86cae1d3bfacae.material.ron", + label: "legacy-2b86cae1d3bfacae.material", + kind: Material, + material_slots: [], + ), + ( + id: ("c6c84742-e395-5ccb-96bc-d1bd101623b5"), + path: "assets/materials/migrated/legacy-3546762bbff37951.material.ron", + label: "legacy-3546762bbff37951.material", + kind: Material, + material_slots: [], + ), + ( + id: ("3adc8ea9-1387-5f1c-9404-bbe057dd910d"), + path: "assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron", + label: "legacy-454bcd95aaa4f1ca.material", + kind: Material, + material_slots: [], + ), + ( + id: ("2b67be74-d8b5-509a-9efe-dd58b8010a9a"), + path: "assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron", + label: "legacy-4f65eccbb7dac1a2.material", + kind: Material, + material_slots: [], + ), + ( + id: ("231210a7-5d2a-5d06-b3ec-b3ee0bde636a"), + path: "assets/materials/migrated/legacy-62ef60a686be94f1.material.ron", + label: "legacy-62ef60a686be94f1.material", + kind: Material, + material_slots: [], + ), + ( + id: ("c98f2306-b6f1-5d02-b232-19e74e886e20"), + path: "assets/materials/migrated/legacy-77cc6503f24bb9e8.material.ron", + label: "legacy-77cc6503f24bb9e8.material", + kind: Material, + material_slots: [], + ), + ( + id: ("6cc5ffc1-16fb-5652-ab6b-0bb9b4f36ae2"), + path: "assets/materials/migrated/legacy-78bc49856f47eae1.material.ron", + label: "legacy-78bc49856f47eae1.material", + kind: Material, + material_slots: [], + ), + ( + id: ("069977d1-acb8-5bf2-8afa-dfe2abbd4303"), + path: "assets/materials/migrated/legacy-964101ee77293501.material.ron", + label: "legacy-964101ee77293501.material", + kind: Material, + material_slots: [], + ), + ( + id: ("ee32fb60-4ef9-5b7f-a20d-ce216e915530"), + path: "assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron", + label: "legacy-97356bd0ac2f6198.material", + kind: Material, + material_slots: [], + ), + ( + id: ("1cc3cb7a-7ddd-55e3-ba91-71071f30dc83"), + path: "assets/materials/migrated/legacy-9a630ee3e4848d9d.material.ron", + label: "legacy-9a630ee3e4848d9d.material", + kind: Material, + material_slots: [], + ), + ( + id: ("81212e15-4fc8-50ca-bd7d-ac596505cb4c"), + path: "assets/materials/migrated/legacy-a74f874eafd5d224.material.ron", + label: "legacy-a74f874eafd5d224.material", + kind: Material, + material_slots: [], + ), + ( + id: ("91e93c0c-4d4b-5e3f-adcd-6c15be6d0a74"), + path: "assets/materials/migrated/legacy-b278a62978900638.material.ron", + label: "legacy-b278a62978900638.material", + kind: Material, + material_slots: [], + ), + ( + id: ("0a4681e1-b5f0-57fa-8ee1-4431e14e322f"), + path: "assets/materials/migrated/legacy-c656429ce3668694.material.ron", + label: "legacy-c656429ce3668694.material", + kind: Material, + material_slots: [], + ), + ( + id: ("ba295f51-426f-5fdb-b444-a5f1cc5199da"), + path: "assets/materials/migrated/legacy-c6c02ef278fba7c3.material.ron", + label: "legacy-c6c02ef278fba7c3.material", + kind: Material, + material_slots: [], + ), + ( + id: ("6c8791ac-a746-58a2-b097-17d2fe0494dc"), + path: "assets/materials/migrated/legacy-c6fbbebd3e1a9943.material.ron", + label: "legacy-c6fbbebd3e1a9943.material", + kind: Material, + material_slots: [], + ), + ( + id: ("41dbf5a0-7a0a-5fac-9ec3-a0ceacb548a9"), + path: "assets/materials/migrated/legacy-c9d05c61e5cf348d.material.ron", + label: "legacy-c9d05c61e5cf348d.material", + kind: Material, + material_slots: [], + ), + ( + id: ("2fb3fcd4-f7b7-5f28-bf79-2241e47c7ea8"), + path: "assets/materials/migrated/legacy-cc0396f5c90fb7bb.material.ron", + label: "legacy-cc0396f5c90fb7bb.material", + kind: Material, + material_slots: [], + ), + ( + id: ("c512d6e2-272b-5e86-8235-4628ed3b6e8c"), + path: "assets/materials/migrated/legacy-e9671004b101f4df.material.ron", + label: "legacy-e9671004b101f4df.material", + kind: Material, + material_slots: [], + ), + ( + id: ("2db7e7f2-c0ab-51df-b71b-37f0e8c038f1"), + path: "assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron", + label: "legacy-fc132d9b30cc63d4.material", + kind: Material, + material_slots: [], + ), + ( + id: ("e9bd02c0-986f-4f90-a6d5-f04388622b94"), + path: "assets/materials/new_material.ron", + label: "new_material", + kind: Material, + material_slots: [], + ), + ( + id: ("d4387c2e-3ca2-4fca-862a-d86def44e424"), + path: "assets/materials/new_material_2.ron", + label: "new_material_2", + kind: Material, + material_slots: [], + ), + ( + id: ("c07a5b05-f27d-46c6-8b8c-9de9cdd14720"), + path: "assets/materials/pebble_bricks.ron", + label: "pebble_bricks", + kind: Material, + material_slots: [], + material: Some(( + packed_arm_path: Some("assets/.import-cache/runtime/materials/c07a5b05-f27d-46c6-8b8c-9de9cdd14720/76a589e4456ec3320b876209-arm.basis"), + processing_key: Some("76a589e4456ec3320b876209"), + )), + ), + ( + id: ("bd495161-5ea8-48ef-b0db-5b1d57f33885"), + path: "assets/materials/pebble_bricks_4k.gltf", + label: "pebble_bricks_4k", + kind: Model, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node0:mesh0:primitive0"), + selection: Project((( + asset_id: "c07a5b05-f27d-46c6-8b8c-9de9cdd14720", + sub_asset_id: "", + label: "pebble_bricks", + source_path: Some("assets/materials/pebble_bricks.ron"), + ))), + ), + ], + ), + ( + id: ("d6cb4151-7124-4237-aaf9-f7f8abd5fb76"), + path: "assets/materials/surface_tint.ron", + label: "surface_tint", + kind: Material, + material_slots: [], + ), + ( + id: ("cc2769da-c9a5-4cb3-866a-cc81d0688ee2"), + path: "assets/materials/surface_tint_instance.ron", + label: "surface_tint_instance", + kind: MaterialInstance, + material_slots: [], + ), + ( + id: ("25db6174-afcb-421f-8c1c-0c5ffde21b79"), + path: "assets/materials/textures/pebble_bricks_arm_4k.jpg", + label: "pebble_bricks_arm_4k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/materials/textures/pebble_bricks_arm_4k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/25db6174-afcb-421f-8c1c-0c5ffde21b79/552b39094506da0fbf4cd647/texture.basis"), + processing_key: Some("552b39094506da0fbf4cd647"), + settings: ( + semantic: MaskData, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("d3b9bec5-c0ea-4f83-ad80-f9e2a8cb69ee"), + path: "assets/materials/textures/pebble_bricks_diff_4k.jpg", + label: "pebble_bricks_diff_4k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/materials/textures/pebble_bricks_diff_4k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/d3b9bec5-c0ea-4f83-ad80-f9e2a8cb69ee/644db179a14573b2a514e68f/texture.basis"), + processing_key: Some("644db179a14573b2a514e68f"), + settings: ( + semantic: Color, + color_space: Srgb, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: true, + )), + ), + ( + id: ("7c5235a1-f5d7-4530-b29f-5ea075881df5"), + path: "assets/materials/textures/pebble_bricks_nor_gl_4k.jpg", + label: "pebble_bricks_nor_gl_4k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/materials/textures/pebble_bricks_nor_gl_4k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/7c5235a1-f5d7-4530-b29f-5ea075881df5/944b70940e3dd9a70e851d0e/texture.basis"), + processing_key: Some("944b70940e3dd9a70e851d0e"), + settings: ( + semantic: Normal, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("113f74df-e39c-41d4-9b5b-e48efe541f7f"), + path: "assets/models/RobotExpressive.glb", + label: "RobotExpressive", + kind: Model, + material_slots: [], + ), + ( + id: ("3076fad0-89ca-4307-b8d9-cb77fca41907"), + path: "assets/models/metal_office_desk_2k.gltf", + label: "metal_office_desk_2k", + kind: Model, + material_slots: [], + ), + ( + id: ("b98ef565-3500-49e7-9935-f685fa9b2594"), + path: "assets/models/painted_wooden_chair_02_2k.fbx", + label: "painted_wooden_chair_02_2k", + kind: Model, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node1:material0"), + selection: Default, + ), + ], + ), + ( + id: ("3f63f359-45eb-4cb2-8970-71921cbd7bd0"), + path: "assets/models/robot_expressive.glb", + label: "robot_expressive", + kind: Model, + material_slots: [], + ), + ( + id: ("393414a8-3089-435f-b267-6dd3eac0285f"), + path: "assets/models/textures/metal_office_desk_arm_2k.jpg", + label: "metal_office_desk_arm_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/models/textures/metal_office_desk_arm_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/393414a8-3089-435f-b267-6dd3eac0285f/edf8ef1b2fc54bbe4eafc16d/texture.basis"), + processing_key: Some("edf8ef1b2fc54bbe4eafc16d"), + settings: ( + semantic: MaskData, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("e5512ff1-aa00-4592-a740-4574e1059a99"), + path: "assets/models/textures/metal_office_desk_diff_2k.jpg", + label: "metal_office_desk_diff_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/models/textures/metal_office_desk_diff_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/e5512ff1-aa00-4592-a740-4574e1059a99/534c0d384d22c554b9597064/texture.basis"), + processing_key: Some("534c0d384d22c554b9597064"), + settings: ( + semantic: Color, + color_space: Srgb, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: true, + )), + ), + ( + id: ("5212dba1-853f-4dab-98f3-e6395d05a4f7"), + path: "assets/models/textures/metal_office_desk_nor_gl_2k.jpg", + label: "metal_office_desk_nor_gl_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/models/textures/metal_office_desk_nor_gl_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/5212dba1-853f-4dab-98f3-e6395d05a4f7/cd1c550f437632f394bf7502/texture.basis"), + processing_key: Some("cd1c550f437632f394bf7502"), + settings: ( + semantic: Normal, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("09762f59-bcd6-44fc-8157-2ad920177996"), + path: "assets/pebble_bricks_surface_instance.material-instance.ron", + label: "pebble_bricks_surface_instance.material-instance", + kind: MaterialInstance, + material_slots: [], + material: Some(( + packed_arm_path: Some("assets/.import-cache/runtime/materials/09762f59-bcd6-44fc-8157-2ad920177996/76a589e4456ec3320b876209-arm.basis"), + processing_key: Some("76a589e4456ec3320b876209"), + )), + ), + ( + id: ("31963299-d4c1-45dc-8f67-2f469ca1ad6d"), + path: "assets/post_fx/chromatic_aberration.ron", + label: "chromatic_aberration", + kind: PostProcessEffect, + material_slots: [], + ), + ( + id: ("e14a9bc3-9a4e-47b0-901f-b31c004e1836"), + path: "assets/post_fx/vignette.ron", + label: "vignette", + kind: PostProcessEffect, + material_slots: [], + ), + ( + id: ("862530b2-8111-4ebb-9078-29723c002e08"), + path: "assets/prefabs/example_base.scn.ron", + label: "example_base.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("682191d6-59cd-46a1-9560-6cf7bc1583b2"), + path: "assets/prefabs/example_nested.scn.ron", + label: "example_nested.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("c14f6240-5654-4e80-9edb-2b4c44cf8d61"), + path: "assets/prefabs/example_variant.scn.ron", + label: "example_variant.scn", + kind: Level, + material_slots: [], + ), + ( + id: ("2c4a9866-17b5-4797-9a8f-726b2ffacdb9"), + path: "assets/rendering_profiles/cave_dark.ron", + label: "cave_dark", + kind: RenderingProfile, + material_slots: [], + ), + ( + id: ("802471df-8295-4997-80e2-db4191850fc9"), + path: "assets/rendering_profiles/outdoor_haze.ron", + label: "outdoor_haze", + kind: RenderingProfile, + material_slots: [], + ), + ( + id: ("addf6f7f-8114-45f3-8566-70d1eaa1fec3"), + path: "assets/shaders/standard_lit.shader.ron", + label: "standard_lit.shader", + kind: ShaderSchema, + material_slots: [], + ), + ( + id: ("a72943d6-3e9d-4629-8887-5c02d99d4f92"), + path: "assets/shaders/surface_tint.shader.ron", + label: "surface_tint.shader", + kind: ShaderSchema, + material_slots: [], + ), + ( + id: ("7b143cfb-a9e9-45d4-8f01-cfaa66fa9811"), + path: "assets/shaders/unlit.shader.ron", + label: "unlit.shader", + kind: ShaderSchema, + material_slots: [], + ), + ( + id: ("c7a227bc-2bae-4a41-857b-28cc6b432a9d"), + path: "assets/textures/metal_office_desk_arm_2k.jpg", + label: "metal_office_desk_arm_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/textures/metal_office_desk_arm_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/c7a227bc-2bae-4a41-857b-28cc6b432a9d/edf8ef1b2fc54bbe4eafc16d/texture.basis"), + processing_key: Some("edf8ef1b2fc54bbe4eafc16d"), + settings: ( + semantic: MaskData, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("c644134e-87c7-43fb-ac30-31c4e0a78b48"), + path: "assets/textures/metal_office_desk_diff_2k.jpg", + label: "metal_office_desk_diff_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/textures/metal_office_desk_diff_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/c644134e-87c7-43fb-ac30-31c4e0a78b48/534c0d384d22c554b9597064/texture.basis"), + processing_key: Some("534c0d384d22c554b9597064"), + settings: ( + semantic: Color, + color_space: Srgb, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: true, + )), + ), + ( + id: ("c661e66a-0745-4dd9-89b0-e611befab602"), + path: "assets/textures/metal_office_desk_nor_gl_2k.jpg", + label: "metal_office_desk_nor_gl_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/textures/metal_office_desk_nor_gl_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/c661e66a-0745-4dd9-89b0-e611befab602/cd1c550f437632f394bf7502/texture.basis"), + processing_key: Some("cd1c550f437632f394bf7502"), + settings: ( + semantic: Normal, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("0496e62e-1837-4940-a9c9-b2b4ffe9ed90"), + path: "assets/textures/metal_stool_01_arm_2k.jpg", + label: "metal_stool_01_arm_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/textures/metal_stool_01_arm_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/0496e62e-1837-4940-a9c9-b2b4ffe9ed90/3ecc62c0eaf1672ca08fb59f/texture.basis"), + processing_key: Some("3ecc62c0eaf1672ca08fb59f"), + settings: ( + semantic: MaskData, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ( + id: ("bddaa4d4-5097-42bf-8d51-dd9a3580442a"), + path: "assets/textures/metal_stool_01_diff_2k.jpg", + label: "metal_stool_01_diff_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/textures/metal_stool_01_diff_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/bddaa4d4-5097-42bf-8d51-dd9a3580442a/2276a96b1a148fd7c16977d5/texture.basis"), + processing_key: Some("2276a96b1a148fd7c16977d5"), + settings: ( + semantic: Color, + color_space: Srgb, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: true, + )), + ), + ( + id: ("c4abe41c-ac88-4aec-8168-27e8a7c90583"), + path: "assets/textures/metal_stool_01_nor_gl_2k.jpg", + label: "metal_stool_01_nor_gl_2k", + kind: Texture, + material_slots: [], + texture: Some(( + source_path: "assets/textures/metal_stool_01_nor_gl_2k.jpg", + processed_path: Some("assets/.import-cache/runtime/textures/c4abe41c-ac88-4aec-8168-27e8a7c90583/d0ec4224c3dcb6fa565c94bb/texture.basis"), + processing_key: Some("d0ec4224c3dcb6fa565c94bb"), + settings: ( + semantic: Normal, + color_space: Linear, + mipmaps: Generate, + compression: Uastc, + max_dimension: None, + filter: Linear, + wrap: Repeat, + anisotropy: 8, + normal_map_convention: OpenGl, + ), + is_srgb: false, + )), + ), + ], +) \ No newline at end of file diff --git a/assets/levels/audio_authoring_showcase.scn.ron b/assets/levels/audio_authoring_showcase.scn.ron index 65ae56a..d097074 100644 --- a/assets/levels/audio_authoring_showcase.scn.ron +++ b/assets/levels/audio_authoring_showcase.scn.ron @@ -1,4 +1,4 @@ -(schema_version: 4,resources: { +(schema_version: 6,resources: { }, entities: { 4294969001: (components: { diff --git a/assets/levels/collider_diagnostics_showcase.scn.ron b/assets/levels/collider_diagnostics_showcase.scn.ron index 6949d43..95eee29 100644 --- a/assets/levels/collider_diagnostics_showcase.scn.ron +++ b/assets/levels/collider_diagnostics_showcase.scn.ron @@ -1,175 +1,208 @@ -(schema_version: 4, resources: {}, entities: { - 1: (components: { - "bevy_ecs::name::Name": "Valid Box Collider", - "bevy_transform::components::transform::Transform": ( +(schema_version: 6,resources: { + }, + entities: { + 1: (components: { + "bevy_ecs::name::Name": "Valid Box Collider", + "bevy_transform::components::transform::Transform": ( translation: (-4.5, 1.0, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("collider-showcase-box"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (0), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.18, g: 0.62, b: 0.36, a: 1.0), - metallic: 0.05, roughness: 0.55, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), emissive_intensity: 0.0, - base_color_texture: None, emissive_texture: None, normal_map_texture: None, - metallic_roughness_texture: None, material_asset_path: None, parameters: [], textures: [], - ), - "shared::components::Primitive": (shape: Box, size: (1.8, 2.0, 1.8)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("collider-showcase-box"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: true, is_trigger: false, shape: Cuboid(x_length: 1.8, y_length: 2.0, z_length: 1.8), ), - }), - 2: (components: { - "bevy_ecs::name::Name": "Valid Sphere Collider", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (0), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (1.8, 2.0, 1.8), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "069977d1-acb8-5bf2-8afa-dfe2abbd4303", + sub_asset_id: "material:source", + label: "Legacy Material 964101ee77293501", + source_path: Some("assets/materials/migrated/legacy-964101ee77293501.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 2: (components: { + "bevy_ecs::name::Name": "Valid Sphere Collider", + "bevy_transform::components::transform::Transform": ( translation: (-2.25, 1.0, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.35, 0.8), ), - "shared::components::ActorId": ("collider-showcase-sphere"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (1), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.16, g: 0.52, b: 0.78, a: 1.0), - metallic: 0.08, roughness: 0.42, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), emissive_intensity: 0.0, - base_color_texture: None, emissive_texture: None, normal_map_texture: None, - metallic_roughness_texture: None, material_asset_path: None, parameters: [], textures: [], - ), - "shared::components::Primitive": (shape: Sphere, size: (2.0, 2.0, 2.0)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("collider-showcase-sphere"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: true, is_trigger: false, shape: Sphere(radius: 1.0), ), - }), - 3: (components: { - "bevy_ecs::name::Name": "Valid Capsule Collider", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (1), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Sphere, + size: (2.0, 2.0, 2.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "81212e15-4fc8-50ca-bd7d-ac596505cb4c", + sub_asset_id: "material:source", + label: "Legacy Material a74f874eafd5d224", + source_path: Some("assets/materials/migrated/legacy-a74f874eafd5d224.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 3: (components: { + "bevy_ecs::name::Name": "Valid Capsule Collider", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 1.4, 0.0), rotation: (0.0, 0.1950903, 0.0, 0.9807853), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("collider-showcase-capsule"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (2), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.58, g: 0.34, b: 0.78, a: 1.0), - metallic: 0.06, roughness: 0.48, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), emissive_intensity: 0.0, - base_color_texture: None, emissive_texture: None, normal_map_texture: None, - metallic_roughness_texture: None, material_asset_path: None, parameters: [], textures: [], - ), - "shared::components::Primitive": (shape: Box, size: (1.4, 2.8, 1.4)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("collider-showcase-capsule"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: true, is_trigger: false, shape: Capsule(radius: 0.7, height: 2.8), ), - }), - 4: (components: { - "bevy_ecs::name::Name": "Trigger Collider", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (2), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (1.4, 2.8, 1.4), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "7a818722-7a73-5541-838c-cedbef0648f7", + sub_asset_id: "material:source", + label: "Legacy Material 2b86cae1d3bfacae", + source_path: Some("assets/materials/migrated/legacy-2b86cae1d3bfacae.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 4: (components: { + "bevy_ecs::name::Name": "Trigger Collider", + "bevy_transform::components::transform::Transform": ( translation: (2.25, 1.0, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("collider-showcase-trigger"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (3), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.12, g: 0.68, b: 0.82, a: 1.0), - metallic: 0.03, roughness: 0.4, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), emissive_intensity: 0.0, - base_color_texture: None, emissive_texture: None, normal_map_texture: None, - metallic_roughness_texture: None, material_asset_path: None, parameters: [], textures: [], - ), - "shared::components::Primitive": (shape: Sphere, size: (2.0, 2.0, 2.0)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("collider-showcase-trigger"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: true, is_trigger: true, shape: Sphere(radius: 1.0), ), - }), - 5: (components: { - "bevy_ecs::name::Name": "Disabled Collider", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (3), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Sphere, + size: (2.0, 2.0, 2.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "6c8791ac-a746-58a2-b097-17d2fe0494dc", + sub_asset_id: "material:source", + label: "Legacy Material c6fbbebd3e1a9943", + source_path: Some("assets/materials/migrated/legacy-c6fbbebd3e1a9943.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 5: (components: { + "bevy_ecs::name::Name": "Disabled Collider", + "bevy_transform::components::transform::Transform": ( translation: (4.5, 1.0, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("collider-showcase-disabled"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (4), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.38, g: 0.40, b: 0.46, a: 1.0), - metallic: 0.02, roughness: 0.68, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), emissive_intensity: 0.0, - base_color_texture: None, emissive_texture: None, normal_map_texture: None, - metallic_roughness_texture: None, material_asset_path: None, parameters: [], textures: [], - ), - "shared::components::Primitive": (shape: Box, size: (1.8, 2.0, 1.8)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("collider-showcase-disabled"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: false, is_trigger: false, shape: Cuboid(x_length: 1.8, y_length: 2.0, z_length: 1.8), ), - }), - 6: (components: { - "bevy_ecs::name::Name": "Missing Collider", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (4), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (1.8, 2.0, 1.8), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "ba295f51-426f-5fdb-b444-a5f1cc5199da", + sub_asset_id: "material:source", + label: "Legacy Material c6c02ef278fba7c3", + source_path: Some("assets/materials/migrated/legacy-c6c02ef278fba7c3.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 6: (components: { + "bevy_ecs::name::Name": "Missing Collider", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 1.0, -3.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("collider-showcase-missing"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (5), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.78, g: 0.16, b: 0.20, a: 1.0), - metallic: 0.02, roughness: 0.58, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), emissive_intensity: 0.0, - base_color_texture: None, emissive_texture: None, normal_map_texture: None, - metallic_roughness_texture: None, material_asset_path: None, parameters: [], textures: [], - ), - "shared::components::Primitive": (shape: Box, size: (1.8, 2.0, 1.8)), - "shared::components::RigidBodyDesc": (body: Static), - }), - 7: (components: { - "bevy_ecs::name::Name": "Collider Showcase Sun", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("collider-showcase-missing"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (5), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (1.8, 2.0, 1.8), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "c98f2306-b6f1-5d02-b232-19e74e886e20", + sub_asset_id: "material:source", + label: "Legacy Material 77cc6503f24bb9e8", + source_path: Some("assets/materials/migrated/legacy-77cc6503f24bb9e8.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 7: (components: { + "bevy_ecs::name::Name": "Collider Showcase Sun", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 8.0, 4.0), rotation: (-0.3826834, 0.0, 0.0, 0.9238795), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("collider-showcase-sun"), - "shared::components::ActorKind": Light, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (6), - "shared::components::LevelObject": (), - "shared::components::LightDesc": ( + "shared::components::ActorId": ("collider-showcase-sun"), + "shared::components::ActorKind": Light, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (6), + "shared::components::LevelObject": (), + "shared::components::LightDesc": ( kind: Directional, color: (r: 1.0, g: 0.95, b: 0.88, a: 1.0), intensity: 100000.0, range: 0.0, shadows: true, inner_angle_deg: 25.0, outer_angle_deg: 35.0, ), - }), -}) + }), + }, +) \ No newline at end of file diff --git a/assets/levels/editor_scene 2.scn.ron b/assets/levels/editor_scene 2.scn.ron index 53c1d0e..4087fe3 100644 --- a/assets/levels/editor_scene 2.scn.ron +++ b/assets/levels/editor_scene 2.scn.ron @@ -1,4 +1,4 @@ -(schema_version: 4,resources: { +(schema_version: 6,resources: { }, entities: { 4294967126: (components: { @@ -14,20 +14,6 @@ ), "shared::components::HierarchySiblingIndex": (23), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -37,9 +23,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 4294967158: (components: { "bevy_ecs::name::Name": "Scene Sun", @@ -82,20 +78,6 @@ ), "shared::components::HierarchySiblingIndex": (1), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.42, - g: 0.45, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.92, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -105,9 +87,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (200.0, 1.0, 200.0), - ), + shape: Box, + size: (200.0, 1.0, 200.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "1cc3cb7a-7ddd-55e3-ba91-71071f30dc83", + sub_asset_id: "material:source", + label: "Legacy Material 9a630ee3e4848d9d", + source_path: Some("assets/materials/migrated/legacy-9a630ee3e4848d9d.material.ron"), + ))), + ), +), }), 8589934420: (components: { "bevy_ecs::name::Name": "Pillar Copy", @@ -122,20 +114,6 @@ ), "shared::components::HierarchySiblingIndex": (25), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -145,9 +123,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 8589934456: (components: { "bevy_ecs::name::Name": "Player Start", @@ -177,20 +165,6 @@ ), "shared::components::HierarchySiblingIndex": (3), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.95, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -198,9 +172,19 @@ ), ), "shared::components::Primitive": ( - shape: Sphere, - size: (1.2, 1.2, 1.2), - ), + shape: Sphere, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2b67be74-d8b5-509a-9efe-dd58b8010a9a", + sub_asset_id: "material:source", + label: "Legacy Material 4f65eccbb7dac1a2", + source_path: Some("assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron"), + ))), + ), +), }), 8589934458: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", @@ -215,20 +199,6 @@ ), "shared::components::HierarchySiblingIndex": (4), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.6, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -236,9 +206,19 @@ ), ), "shared::components::Primitive": ( - shape: Sphere, - size: (1.2, 1.2, 1.2), - ), + shape: Sphere, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "0a4681e1-b5f0-57fa-8ee1-4431e14e322f", + sub_asset_id: "material:source", + label: "Legacy Material c656429ce3668694", + source_path: Some("assets/materials/migrated/legacy-c656429ce3668694.material.ron"), + ))), + ), +), }), 8589934459: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", @@ -253,20 +233,6 @@ ), "shared::components::HierarchySiblingIndex": (5), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.3, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -274,9 +240,19 @@ ), ), "shared::components::Primitive": ( - shape: Sphere, - size: (1.2, 1.2, 1.2), - ), + shape: Sphere, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "8fd7f537-75c1-524d-9f09-6654a3718a8e", + sub_asset_id: "material:source", + label: "Legacy Material 1a259303a97c4ba9", + source_path: Some("assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron"), + ))), + ), +), }), 8589934460: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", @@ -291,20 +267,6 @@ ), "shared::components::HierarchySiblingIndex": (6), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.05, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -312,9 +274,19 @@ ), ), "shared::components::Primitive": ( - shape: Sphere, - size: (1.2, 1.2, 1.2), - ), + shape: Sphere, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "91e93c0c-4d4b-5e3f-adcd-6c15be6d0a74", + sub_asset_id: "material:source", + label: "Legacy Material b278a62978900638", + source_path: Some("assets/materials/migrated/legacy-b278a62978900638.material.ron"), + ))), + ), +), }), 8589934461: (components: { "bevy_ecs::name::Name": "Stair", @@ -329,20 +301,6 @@ ), "shared::components::HierarchySiblingIndex": (7), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -352,9 +310,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.8000001, 0.5), - ), + shape: Box, + size: (5.0, 1.8000001, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934462: (components: { "bevy_ecs::name::Name": "Stair", @@ -369,20 +337,6 @@ ), "shared::components::HierarchySiblingIndex": (8), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -392,9 +346,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.6200001, 0.5), - ), + shape: Box, + size: (5.0, 1.6200001, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934463: (components: { "bevy_ecs::name::Name": "Stair", @@ -409,20 +373,6 @@ ), "shared::components::HierarchySiblingIndex": (9), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -432,9 +382,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.44, 0.5), - ), + shape: Box, + size: (5.0, 1.44, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934464: (components: { "bevy_ecs::name::Name": "Stair", @@ -449,20 +409,6 @@ ), "shared::components::HierarchySiblingIndex": (10), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -472,9 +418,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.26, 0.5), - ), + shape: Box, + size: (5.0, 1.26, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934465: (components: { "bevy_ecs::name::Name": "Stair", @@ -489,20 +445,6 @@ ), "shared::components::HierarchySiblingIndex": (11), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -512,9 +454,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.08, 0.5), - ), + shape: Box, + size: (5.0, 1.08, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934466: (components: { "bevy_ecs::name::Name": "Stair", @@ -529,20 +481,6 @@ ), "shared::components::HierarchySiblingIndex": (12), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -552,9 +490,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.90000004, 0.5), - ), + shape: Box, + size: (5.0, 0.90000004, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934467: (components: { "bevy_ecs::name::Name": "Stair", @@ -569,20 +517,6 @@ ), "shared::components::HierarchySiblingIndex": (13), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -592,9 +526,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.72, 0.5), - ), + shape: Box, + size: (5.0, 0.72, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934468: (components: { "bevy_ecs::name::Name": "Stair", @@ -609,20 +553,6 @@ ), "shared::components::HierarchySiblingIndex": (14), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -632,9 +562,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.54, 0.5), - ), + shape: Box, + size: (5.0, 0.54, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934469: (components: { "bevy_ecs::name::Name": "Stair", @@ -649,20 +589,6 @@ ), "shared::components::HierarchySiblingIndex": (15), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -672,9 +598,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.36, 0.5), - ), + shape: Box, + size: (5.0, 0.36, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934470: (components: { "bevy_ecs::name::Name": "Stair", @@ -689,20 +625,6 @@ ), "shared::components::HierarchySiblingIndex": (16), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -712,9 +634,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.18, 0.5), - ), + shape: Box, + size: (5.0, 0.18, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934471: (components: { "bevy_ecs::name::Name": "Ramp", @@ -729,20 +661,6 @@ ), "shared::components::HierarchySiblingIndex": (17), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.3, - g: 0.45, - b: 0.7, - a: 1.0, - ), - metallic: 0.1, - roughness: 0.55, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -752,9 +670,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.4, 9.0), - ), + shape: Box, + size: (5.0, 0.4, 9.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "ee32fb60-4ef9-5b7f-a20d-ce216e915530", + sub_asset_id: "material:source", + label: "Legacy Material 97356bd0ac2f6198", + source_path: Some("assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron"), + ))), + ), +), }), 8589934472: (components: { "bevy_ecs::name::Name": "Crate", @@ -769,20 +697,6 @@ ), "shared::components::HierarchySiblingIndex": (18), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -792,9 +706,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934473: (components: { "bevy_ecs::name::Name": "Crate", @@ -809,20 +733,6 @@ ), "shared::components::HierarchySiblingIndex": (19), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -832,9 +742,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.5, 1.5, 1.5), - ), + shape: Box, + size: (1.5, 1.5, 1.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934474: (components: { "bevy_ecs::name::Name": "Crate", @@ -849,20 +769,6 @@ ), "shared::components::HierarchySiblingIndex": (20), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -872,9 +778,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934475: (components: { "bevy_ecs::name::Name": "Crate", @@ -889,20 +805,6 @@ ), "shared::components::HierarchySiblingIndex": (21), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -912,9 +814,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934476: (components: { "bevy_ecs::name::Name": "Crate", @@ -929,20 +841,6 @@ ), "shared::components::HierarchySiblingIndex": (22), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -952,9 +850,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934477: (components: { "bevy_ecs::name::Name": "Pillar", @@ -969,20 +877,6 @@ ), "shared::components::HierarchySiblingIndex": (23), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -992,9 +886,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 8589934478: (components: { "bevy_ecs::name::Name": "Pillar", @@ -1009,20 +913,6 @@ ), "shared::components::HierarchySiblingIndex": (24), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1032,9 +922,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 8589934479: (components: { "bevy_ecs::name::Name": "Pillar", @@ -1049,20 +949,6 @@ ), "shared::components::HierarchySiblingIndex": (25), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1072,9 +958,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 8589934480: (components: { "bevy_ecs::name::Name": "Pillar", @@ -1089,20 +985,6 @@ ), "shared::components::HierarchySiblingIndex": (26), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - base_color_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1112,9 +994,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), }, ) \ No newline at end of file diff --git a/assets/levels/editor_scene 3.scn.ron b/assets/levels/editor_scene 3.scn.ron index 78ed583..e53d590 100644 --- a/assets/levels/editor_scene 3.scn.ron +++ b/assets/levels/editor_scene 3.scn.ron @@ -1,4 +1,4 @@ -(schema_version: 4,resources: { +(schema_version: 6,resources: { }, entities: { 4294967124: (components: { @@ -14,28 +14,6 @@ ), "shared::components::HierarchySiblingIndex": (29), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.8, - g: 0.8, - b: 0.8, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.65, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -45,9 +23,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "c6c84742-e395-5ccb-96bc-d1bd101623b5", + sub_asset_id: "material:source", + label: "Legacy Material 3546762bbff37951", + source_path: Some("assets/materials/migrated/legacy-3546762bbff37951.material.ron"), + ))), + ), +), }), 4294967126: (components: { "bevy_ecs::name::Name": "Cube", @@ -62,28 +50,6 @@ ), "shared::components::HierarchySiblingIndex": (28), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.8, - g: 0.8, - b: 0.8, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.65, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -93,9 +59,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "c6c84742-e395-5ccb-96bc-d1bd101623b5", + sub_asset_id: "material:source", + label: "Legacy Material 3546762bbff37951", + source_path: Some("assets/materials/migrated/legacy-3546762bbff37951.material.ron"), + ))), + ), +), }), 4294967128: (components: { "bevy_ecs::name::Name": "Point Light", @@ -166,28 +142,6 @@ ), "shared::components::HierarchySiblingIndex": (1), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.42, - g: 0.45, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.92, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -197,9 +151,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (200.0, 1.0, 200.0), - ), + shape: Box, + size: (200.0, 1.0, 200.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "1cc3cb7a-7ddd-55e3-ba91-71071f30dc83", + sub_asset_id: "material:source", + label: "Legacy Material 9a630ee3e4848d9d", + source_path: Some("assets/materials/migrated/legacy-9a630ee3e4848d9d.material.ron"), + ))), + ), +), }), 8589934417: (components: { "bevy_ecs::name::Name": "Spot Light", @@ -257,28 +221,6 @@ ), "shared::components::HierarchySiblingIndex": (3), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.95, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -286,9 +228,19 @@ ), ), "shared::components::Primitive": ( - shape: Sphere, - size: (1.2, 1.2, 1.2), - ), + shape: Sphere, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2b67be74-d8b5-509a-9efe-dd58b8010a9a", + sub_asset_id: "material:source", + label: "Legacy Material 4f65eccbb7dac1a2", + source_path: Some("assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron"), + ))), + ), +), }), 8589934458: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", @@ -303,28 +255,6 @@ ), "shared::components::HierarchySiblingIndex": (4), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.6, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -332,9 +262,19 @@ ), ), "shared::components::Primitive": ( - shape: Sphere, - size: (1.2, 1.2, 1.2), - ), + shape: Sphere, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "0a4681e1-b5f0-57fa-8ee1-4431e14e322f", + sub_asset_id: "material:source", + label: "Legacy Material c656429ce3668694", + source_path: Some("assets/materials/migrated/legacy-c656429ce3668694.material.ron"), + ))), + ), +), }), 8589934459: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", @@ -349,28 +289,6 @@ ), "shared::components::HierarchySiblingIndex": (5), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -378,9 +296,19 @@ ), ), "shared::components::Primitive": ( - shape: Sphere, - size: (1.2, 1.2, 1.2), - ), + shape: Sphere, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "8fd7f537-75c1-524d-9f09-6654a3718a8e", + sub_asset_id: "material:source", + label: "Legacy Material 1a259303a97c4ba9", + source_path: Some("assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron"), + ))), + ), +), }), 8589934460: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", @@ -395,28 +323,6 @@ ), "shared::components::HierarchySiblingIndex": (6), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.05, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -424,9 +330,19 @@ ), ), "shared::components::Primitive": ( - shape: Sphere, - size: (1.2, 1.2, 1.2), - ), + shape: Sphere, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "91e93c0c-4d4b-5e3f-adcd-6c15be6d0a74", + sub_asset_id: "material:source", + label: "Legacy Material b278a62978900638", + source_path: Some("assets/materials/migrated/legacy-b278a62978900638.material.ron"), + ))), + ), +), }), 8589934461: (components: { "bevy_ecs::name::Name": "Stair", @@ -441,28 +357,6 @@ ), "shared::components::HierarchySiblingIndex": (7), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -472,9 +366,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.8000001, 0.5), - ), + shape: Box, + size: (5.0, 1.8000001, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934462: (components: { "bevy_ecs::name::Name": "Stair", @@ -489,28 +393,6 @@ ), "shared::components::HierarchySiblingIndex": (8), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -520,9 +402,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.6200001, 0.5), - ), + shape: Box, + size: (5.0, 1.6200001, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934463: (components: { "bevy_ecs::name::Name": "Stair", @@ -537,28 +429,6 @@ ), "shared::components::HierarchySiblingIndex": (9), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -568,9 +438,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.44, 0.5), - ), + shape: Box, + size: (5.0, 1.44, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934464: (components: { "bevy_ecs::name::Name": "Stair", @@ -585,28 +465,6 @@ ), "shared::components::HierarchySiblingIndex": (10), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -616,9 +474,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.26, 0.5), - ), + shape: Box, + size: (5.0, 1.26, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934465: (components: { "bevy_ecs::name::Name": "Stair", @@ -633,28 +501,6 @@ ), "shared::components::HierarchySiblingIndex": (11), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -664,9 +510,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 1.08, 0.5), - ), + shape: Box, + size: (5.0, 1.08, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934466: (components: { "bevy_ecs::name::Name": "Stair", @@ -681,28 +537,6 @@ ), "shared::components::HierarchySiblingIndex": (12), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -712,9 +546,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.90000004, 0.5), - ), + shape: Box, + size: (5.0, 0.90000004, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934467: (components: { "bevy_ecs::name::Name": "Stair", @@ -729,28 +573,6 @@ ), "shared::components::HierarchySiblingIndex": (13), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -760,9 +582,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.72, 0.5), - ), + shape: Box, + size: (5.0, 0.72, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934468: (components: { "bevy_ecs::name::Name": "Stair", @@ -777,28 +609,6 @@ ), "shared::components::HierarchySiblingIndex": (14), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -808,9 +618,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.54, 0.5), - ), + shape: Box, + size: (5.0, 0.54, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934469: (components: { "bevy_ecs::name::Name": "Stair", @@ -825,28 +645,6 @@ ), "shared::components::HierarchySiblingIndex": (15), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -856,9 +654,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.36, 0.5), - ), + shape: Box, + size: (5.0, 0.36, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934470: (components: { "bevy_ecs::name::Name": "Stair", @@ -873,28 +681,6 @@ ), "shared::components::HierarchySiblingIndex": (16), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -904,9 +690,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.18, 0.5), - ), + shape: Box, + size: (5.0, 0.18, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), +), }), 8589934471: (components: { "bevy_ecs::name::Name": "Ramp", @@ -921,28 +717,6 @@ ), "shared::components::HierarchySiblingIndex": (17), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.3, - g: 0.45, - b: 0.7, - a: 1.0, - ), - metallic: 0.1, - roughness: 0.55, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -952,9 +726,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (5.0, 0.4, 9.0), - ), + shape: Box, + size: (5.0, 0.4, 9.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "ee32fb60-4ef9-5b7f-a20d-ce216e915530", + sub_asset_id: "material:source", + label: "Legacy Material 97356bd0ac2f6198", + source_path: Some("assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron"), + ))), + ), +), }), 8589934472: (components: { "bevy_ecs::name::Name": "Crate", @@ -969,28 +753,6 @@ ), "shared::components::HierarchySiblingIndex": (18), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1000,9 +762,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934473: (components: { "bevy_ecs::name::Name": "Crate", @@ -1017,28 +789,6 @@ ), "shared::components::HierarchySiblingIndex": (19), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1048,9 +798,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.5, 1.5, 1.5), - ), + shape: Box, + size: (1.5, 1.5, 1.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934474: (components: { "bevy_ecs::name::Name": "Crate", @@ -1065,28 +825,6 @@ ), "shared::components::HierarchySiblingIndex": (20), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1096,9 +834,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934475: (components: { "bevy_ecs::name::Name": "Crate", @@ -1113,28 +861,6 @@ ), "shared::components::HierarchySiblingIndex": (21), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1144,9 +870,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934476: (components: { "bevy_ecs::name::Name": "Crate", @@ -1161,28 +897,6 @@ ), "shared::components::HierarchySiblingIndex": (22), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1192,9 +906,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), +), }), 8589934477: (components: { "bevy_ecs::name::Name": "Pillar", @@ -1209,28 +933,6 @@ ), "shared::components::HierarchySiblingIndex": (23), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1240,9 +942,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 8589934478: (components: { "bevy_ecs::name::Name": "Pillar", @@ -1257,28 +969,6 @@ ), "shared::components::HierarchySiblingIndex": (24), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1288,9 +978,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 8589934479: (components: { "bevy_ecs::name::Name": "Pillar", @@ -1305,28 +1005,6 @@ ), "shared::components::HierarchySiblingIndex": (25), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1336,9 +1014,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 8589934480: (components: { "bevy_ecs::name::Name": "Pillar", @@ -1353,28 +1041,6 @@ ), "shared::components::HierarchySiblingIndex": (26), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1384,9 +1050,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.2, 7.0, 1.2), - ), + shape: Box, + size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), +), }), 12884901711: (components: { "bevy_ecs::name::Name": "Cube", @@ -1401,28 +1077,6 @@ ), "shared::components::HierarchySiblingIndex": (31), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - base_color: ( - r: 0.7322267, - g: 0.0, - b: 0.0, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: Some("assets/materials/concrete.ron"), - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1432,9 +1086,19 @@ ), ), "shared::components::Primitive": ( - shape: Box, - size: (1.0, 1.0, 1.0), - ), + shape: Box, + size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "a57f2891-8536-47b8-b476-01c08b36ac43", + sub_asset_id: "material:source", + label: "concrete", + source_path: Some("assets/materials/concrete.ron"), + ))), + ), +), }), }, ) \ No newline at end of file diff --git a/assets/levels/editor_scene.scn.ron b/assets/levels/editor_scene.scn.ron index 4a58538..6ed996b 100644 --- a/assets/levels/editor_scene.scn.ron +++ b/assets/levels/editor_scene.scn.ron @@ -1,8 +1,8 @@ -(schema_version: 4,resources: { +(schema_version: 6,resources: { "shared::components::SceneComposition": (scene_id:"legacy:assets/levels/editor_scene.scn.ron",subscenes:[]), }, entities: { - 4294966587: (components: { + 4294966529: (components: { "bevy_ecs::name::Name": "Brush Part 2", "bevy_transform::components::transform::Transform": ( translation: (25.75, 0.0, 9.5), @@ -162,12 +162,15 @@ emissive_texture: None, normal_map_texture: None, metallic_roughness_texture: None, + occlusion_texture: None, material_asset_path: None, parameters: [], textures: [], + uv_offset: (0.0, 0.0), + uv_tiling: (1.0, 1.0), ), }), - 4294966588: (components: { + 4294966530: (components: { "bevy_ecs::name::Name": "Brush Part 1", "bevy_transform::components::transform::Transform": ( translation: (24.5, 0.0, 7.75), @@ -327,12 +330,15 @@ emissive_texture: None, normal_map_texture: None, metallic_roughness_texture: None, + occlusion_texture: None, material_asset_path: None, parameters: [], textures: [], + uv_offset: (0.0, 0.0), + uv_tiling: (1.0, 1.0), ), }), - 4294966589: (components: { + 4294966531: (components: { "bevy_ecs::name::Name": "Crate Copy", "bevy_transform::components::transform::Transform": ( translation: (15.624287, 0.75, 1.8058548), @@ -492,12 +498,15 @@ emissive_texture: None, normal_map_texture: None, metallic_roughness_texture: None, + occlusion_texture: None, material_asset_path: None, parameters: [], textures: [], + uv_offset: (0.0, 0.0), + uv_tiling: (1.0, 1.0), ), }), - 4294966590: (components: { + 4294966532: (components: { "bevy_ecs::name::Name": "Post Process Volume", "bevy_transform::components::transform::Transform": ( translation: (28.0, 2.0, -1.0), @@ -652,7 +661,7 @@ label: None, ), }), - 4294966591: (components: { + 4294966533: (components: { "bevy_ecs::name::Name": "Pillar", "bevy_transform::components::transform::Transform": ( translation: (-8.0, 3.5, -6.0), @@ -665,35 +674,6 @@ ), "shared::components::HierarchySiblingIndex": (8), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -705,9 +685,19 @@ "shared::components::Primitive": ( shape: Box, size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), ), }), - 4294966592: (components: { + 4294966534: (components: { "bevy_ecs::name::Name": "Pillar", "bevy_transform::components::transform::Transform": ( translation: (8.0, 3.5, -6.0), @@ -720,35 +710,6 @@ ), "shared::components::HierarchySiblingIndex": (9), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -760,9 +721,19 @@ "shared::components::Primitive": ( shape: Box, size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), ), }), - 4294966593: (components: { + 4294966535: (components: { "bevy_ecs::name::Name": "Pillar", "bevy_transform::components::transform::Transform": ( translation: (-8.0, 3.5, 6.0), @@ -775,35 +746,6 @@ ), "shared::components::HierarchySiblingIndex": (10), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -815,9 +757,19 @@ "shared::components::Primitive": ( shape: Box, size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), ), }), - 4294966594: (components: { + 4294966536: (components: { "bevy_ecs::name::Name": "Pillar", "bevy_transform::components::transform::Transform": ( translation: (8.0, 3.5, 6.0), @@ -830,35 +782,6 @@ ), "shared::components::HierarchySiblingIndex": (11), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.85, - g: 0.85, - b: 0.88, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -870,9 +793,19 @@ "shared::components::Primitive": ( shape: Box, size: (1.2, 7.0, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "231210a7-5d2a-5d06-b3ec-b3ee0bde636a", + sub_asset_id: "material:source", + label: "Legacy Material 62ef60a686be94f1", + source_path: Some("assets/materials/migrated/legacy-62ef60a686be94f1.material.ron"), + ))), + ), ), }), - 4294966595: (components: { + 4294966537: (components: { "bevy_ecs::name::Name": "Crate", "bevy_transform::components::transform::Transform": ( translation: (-0.8005953, 0.3732614, 0.21393776), @@ -885,35 +818,6 @@ ), "shared::components::HierarchySiblingIndex": (1), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -925,9 +829,19 @@ "shared::components::Primitive": ( shape: Box, size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), ), }), - 4294966596: (components: { + 4294966538: (components: { "bevy_ecs::name::Name": "Crate", "bevy_transform::components::transform::Transform": ( translation: (0.59940434, 0.3732614, 0.013936996), @@ -940,35 +854,6 @@ ), "shared::components::HierarchySiblingIndex": (2), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -980,9 +865,19 @@ "shared::components::Primitive": ( shape: Box, size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), ), }), - 4294966597: (components: { + 4294966539: (components: { "bevy_ecs::name::Name": "Crate", "bevy_transform::components::transform::Transform": ( translation: (-0.10059604, 1.3955705, 0.11393738), @@ -995,35 +890,6 @@ ), "shared::components::HierarchySiblingIndex": (0), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1035,9 +901,19 @@ "shared::components::Primitive": ( shape: Box, size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), ), }), - 4294966598: (components: { + 4294966540: (components: { "bevy_ecs::name::Name": "Crate", "bevy_transform::components::transform::Transform": ( translation: (14.575503, 4.5, -15.5), @@ -1196,12 +1072,15 @@ emissive_texture: None, normal_map_texture: None, metallic_roughness_texture: None, + occlusion_texture: None, material_asset_path: Some("assets/materials/concrete.ron"), parameters: [], textures: [], + uv_offset: (0.0, 0.0), + uv_tiling: (1.0, 1.0), ), }), - 4294966599: (components: { + 4294966541: (components: { "bevy_ecs::name::Name": "Crate", "bevy_transform::components::transform::Transform": ( translation: (5.4, 0.5, 2.4), @@ -1214,35 +1093,6 @@ ), "shared::components::HierarchySiblingIndex": (28), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.72, - g: 0.45, - b: 0.2, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1254,9 +1104,19 @@ "shared::components::Primitive": ( shape: Box, size: (1.0, 1.0, 1.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2db7e7f2-c0ab-51df-b71b-37f0e8c038f1", + sub_asset_id: "material:source", + label: "Legacy Material fc132d9b30cc63d4", + source_path: Some("assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron"), + ))), + ), ), }), - 4294966600: (components: { + 4294966542: (components: { "bevy_ecs::name::Name": "Ramp", "bevy_transform::components::transform::Transform": ( translation: (-14.0, 1.6, 0.0), @@ -1269,35 +1129,6 @@ ), "shared::components::HierarchySiblingIndex": (16), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.3, - g: 0.45, - b: 0.7, - a: 1.0, - ), - metallic: 0.1, - roughness: 0.55, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1309,9 +1140,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 0.4, 9.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "ee32fb60-4ef9-5b7f-a20d-ce216e915530", + sub_asset_id: "material:source", + label: "Legacy Material 97356bd0ac2f6198", + source_path: Some("assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron"), + ))), + ), ), }), - 4294966601: (components: { + 4294966543: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.09, 14.0), @@ -1324,35 +1165,6 @@ ), "shared::components::HierarchySiblingIndex": (17), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1364,9 +1176,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 0.18, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966602: (components: { + 4294966544: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.18, 13.5), @@ -1379,35 +1201,6 @@ ), "shared::components::HierarchySiblingIndex": (18), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1419,9 +1212,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 0.36, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966603: (components: { + 4294966545: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.27, 13.0), @@ -1434,35 +1237,6 @@ ), "shared::components::HierarchySiblingIndex": (19), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1474,9 +1248,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 0.54, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966604: (components: { + 4294966546: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.36, 12.5), @@ -1489,35 +1273,6 @@ ), "shared::components::HierarchySiblingIndex": (20), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1529,9 +1284,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 0.72, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966605: (components: { + 4294966547: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.45000002, 12.0), @@ -1544,35 +1309,6 @@ ), "shared::components::HierarchySiblingIndex": (21), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1584,9 +1320,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 0.90000004, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966606: (components: { + 4294966548: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.54, 11.5), @@ -1599,35 +1345,6 @@ ), "shared::components::HierarchySiblingIndex": (22), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1639,9 +1356,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 1.08, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966607: (components: { + 4294966549: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.63, 11.0), @@ -1654,35 +1381,6 @@ ), "shared::components::HierarchySiblingIndex": (23), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1694,9 +1392,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 1.26, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966608: (components: { + 4294966550: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.72, 10.5), @@ -1709,35 +1417,6 @@ ), "shared::components::HierarchySiblingIndex": (24), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1749,9 +1428,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 1.44, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966609: (components: { + 4294966551: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.81000006, 10.0), @@ -1764,35 +1453,6 @@ ), "shared::components::HierarchySiblingIndex": (25), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1804,9 +1464,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 1.6200001, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966610: (components: { + 4294966552: (components: { "bevy_ecs::name::Name": "Stair", "bevy_transform::components::transform::Transform": ( translation: (12.0, 0.90000004, 9.5), @@ -1819,35 +1489,6 @@ ), "shared::components::HierarchySiblingIndex": (26), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.52, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.8, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -1859,9 +1500,19 @@ "shared::components::Primitive": ( shape: Box, size: (5.0, 1.8000001, 0.5), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "3adc8ea9-1387-5f1c-9404-bbe057dd910d", + sub_asset_id: "material:source", + label: "Legacy Material 454bcd95aaa4f1ca", + source_path: Some("assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron"), + ))), + ), ), }), - 4294966611: (components: { + 4294966553: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", "bevy_transform::components::transform::Transform": ( translation: (-8.0, 0.6, 4.0), @@ -1874,35 +1525,6 @@ ), "shared::components::HierarchySiblingIndex": (15), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.05, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -1912,9 +1534,19 @@ "shared::components::Primitive": ( shape: Sphere, size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "91e93c0c-4d4b-5e3f-adcd-6c15be6d0a74", + sub_asset_id: "material:source", + label: "Legacy Material b278a62978900638", + source_path: Some("assets/materials/migrated/legacy-b278a62978900638.material.ron"), + ))), + ), ), }), - 4294966612: (components: { + 4294966554: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", "bevy_transform::components::transform::Transform": ( translation: (-5.8, 0.6, 4.0), @@ -1927,35 +1559,6 @@ ), "shared::components::HierarchySiblingIndex": (13), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.3, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -1965,9 +1568,19 @@ "shared::components::Primitive": ( shape: Sphere, size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "8fd7f537-75c1-524d-9f09-6654a3718a8e", + sub_asset_id: "material:source", + label: "Legacy Material 1a259303a97c4ba9", + source_path: Some("assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron"), + ))), + ), ), }), - 4294966613: (components: { + 4294966555: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", "bevy_transform::components::transform::Transform": ( translation: (-3.6, 0.6, 4.0), @@ -1980,35 +1593,6 @@ ), "shared::components::HierarchySiblingIndex": (14), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.6, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -2018,9 +1602,19 @@ "shared::components::Primitive": ( shape: Sphere, size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "0a4681e1-b5f0-57fa-8ee1-4431e14e322f", + sub_asset_id: "material:source", + label: "Legacy Material c656429ce3668694", + source_path: Some("assets/materials/migrated/legacy-c656429ce3668694.material.ron"), + ))), + ), ), }), - 4294966614: (components: { + 4294966556: (components: { "bevy_ecs::name::Name": "ShowcaseSphere", "bevy_transform::components::transform::Transform": ( translation: (-1.3999996, 0.6, 4.0), @@ -2033,35 +1627,6 @@ ), "shared::components::HierarchySiblingIndex": (7), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.9, - g: 0.9, - b: 0.92, - a: 1.0, - ), - metallic: 1.0, - roughness: 0.95, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Sphere( @@ -2071,9 +1636,19 @@ "shared::components::Primitive": ( shape: Sphere, size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2b67be74-d8b5-509a-9efe-dd58b8010a9a", + sub_asset_id: "material:source", + label: "Legacy Material 4f65eccbb7dac1a2", + source_path: Some("assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron"), + ))), + ), ), }), - 4294966615: (components: { + 4294966557: (components: { "bevy_ecs::name::Name": "Player Start", "bevy_transform::components::transform::Transform": ( translation: (0.0, 0.9900649, 12.46175), @@ -2088,7 +1663,7 @@ "shared::components::LevelObject": (), "shared::components::PlayerSpawn": (), }), - 4294966616: (components: { + 4294966558: (components: { "bevy_ecs::name::Name": "Ground", "bevy_transform::components::transform::Transform": ( translation: (0.0, -0.5, 0.0), @@ -2101,35 +1676,6 @@ ), "shared::components::HierarchySiblingIndex": (12), "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.42, - g: 0.45, - b: 0.48, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.92, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), "shared::components::PhysicsBody": ( body: Static, collider: Cuboid( @@ -2141,13 +1687,23 @@ "shared::components::Primitive": ( shape: Box, size: (200.0, 1.0, 200.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "c07a5b05-f27d-46c6-8b8c-9de9cdd14720", + sub_asset_id: "material:source", + label: "pebble_bricks", + source_path: Some("assets/materials/pebble_bricks.ron"), + ))), + ), ), }), - 4294966617: (components: { + 4294966559: (components: { "bevy_ecs::name::Name": "Scene Sun", "bevy_transform::components::transform::Transform": ( translation: (0.0, 5.316672, 0.0), - rotation: (-0.21401538, 0.31161797, 0.67592126, 0.6326311), + rotation: (-0.3045251, 0.40742344, 0.62288165, 0.5943812), scale: (1.0, 1.0, 1.0), ), "shared::components::ActorKind": Light, @@ -2160,8 +1716,8 @@ kind: Directional, color: ( r: 1.0, - g: 0.95, - b: 0.85, + g: 1.0, + b: 1.0, a: 1.0, ), intensity: 100000.0, @@ -2171,5 +1727,565 @@ outer_angle_deg: 35.0, ), }), + 68719475876: (components: { + "bevy_ecs::hierarchy::ChildOf": (107374181688), + "bevy_ecs::name::Name": "metal_office_desk / Primitive 0", + "bevy_transform::components::transform::Transform": ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("bb88fac5-50d9-40a8-ab3b-4ef20d2fcca0"), + "shared::components::ActorKind": StaticMesh, + "shared::components::AuthoringComponentStates": ( + states: [ + ( + component_id: "physics.collider", + type_name: "", + active: true, + ), + ], + ), + "shared::components::ColliderDesc": ( + enabled: true, + is_trigger: false, + shape: StaticMesh( + meshes: [ + ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node2:mesh2:primitive0", + label: "metal_office_desk / Primitive 0", + source_path: None, + ), + ], + cooking: Default, + ), + ), + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (0), + "shared::components::LevelObject": (), + "shared::components::RigidBodyDesc": ( + body: Static, + ), + "shared::components::StaticMeshRenderer": ( + slots: [ + ( + id: ("draw:scene0:node2:mesh2:primitive0"), + name: "metal_office_desk / Primitive 0", + mesh: ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node2:mesh2:primitive0", + label: "metal_office_desk / Primitive 0", + source_path: None, + ), + material_slot_id: ("slot:draw:scene0:node2:mesh2:primitive0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + visible: true, + cast_shadows: true, + receive_shadows: true, + ), + ], + materials: ( + slots: [ + ( + id: ("slot:draw:scene0:node2:mesh2:primitive0"), + name: "metal_office_desk / Primitive 0", + material: None, + ), + ], + orphaned_assignments: [], + ), + ), + }), + 77309410416: (components: { + "bevy_ecs::hierarchy::ChildOf": (68719475876), + "bevy_ecs::name::Name": "metal_office_desk_drawer_04 / Primitive 0", + "bevy_transform::components::transform::Transform": ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("0d83d985-275c-4bf1-998f-c1de6990dc1f"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( + enabled: true, + is_trigger: false, + shape: StaticMesh( + meshes: [ + ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node3:mesh3:primitive0", + label: "metal_office_desk_drawer_04 / Primitive 0", + source_path: None, + ), + ], + cooking: Default, + ), + ), + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (3), + "shared::components::LevelObject": (), + "shared::components::RigidBodyDesc": ( + body: Static, + ), + "shared::components::StaticMeshRenderer": ( + slots: [ + ( + id: ("draw:scene0:node3:mesh3:primitive0"), + name: "metal_office_desk_drawer_04 / Primitive 0", + mesh: ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node3:mesh3:primitive0", + label: "metal_office_desk_drawer_04 / Primitive 0", + source_path: None, + ), + material_slot_id: ("slot:draw:scene0:node3:mesh3:primitive0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + visible: true, + cast_shadows: true, + receive_shadows: true, + ), + ], + materials: ( + slots: [ + ( + id: ("slot:draw:scene0:node3:mesh3:primitive0"), + name: "metal_office_desk_drawer_04 / Primitive 0", + material: None, + ), + ], + orphaned_assignments: [], + ), + ), + }), + 81604377613: (components: { + "bevy_ecs::hierarchy::ChildOf": (68719475876), + "bevy_ecs::name::Name": "metal_office_desk_tray_01 / Primitive 0", + "bevy_transform::components::transform::Transform": ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("5589764d-9f00-444d-9904-6d9e28b70e1e"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( + enabled: true, + is_trigger: false, + shape: StaticMesh( + meshes: [ + ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node1:mesh1:primitive0", + label: "metal_office_desk_tray_01 / Primitive 0", + source_path: None, + ), + ], + cooking: Default, + ), + ), + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (6), + "shared::components::LevelObject": (), + "shared::components::RigidBodyDesc": ( + body: Static, + ), + "shared::components::StaticMeshRenderer": ( + slots: [ + ( + id: ("draw:scene0:node1:mesh1:primitive0"), + name: "metal_office_desk_tray_01 / Primitive 0", + mesh: ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node1:mesh1:primitive0", + label: "metal_office_desk_tray_01 / Primitive 0", + source_path: None, + ), + material_slot_id: ("slot:draw:scene0:node1:mesh1:primitive0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + visible: true, + cast_shadows: true, + receive_shadows: true, + ), + ], + materials: ( + slots: [ + ( + id: ("slot:draw:scene0:node1:mesh1:primitive0"), + name: "metal_office_desk_tray_01 / Primitive 0", + material: None, + ), + ], + orphaned_assignments: [], + ), + ), + }), + 85899344880: (components: { + "bevy_ecs::hierarchy::ChildOf": (68719475876), + "bevy_ecs::name::Name": "metal_office_desk_drawer_03 / Primitive 0", + "bevy_transform::components::transform::Transform": ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("63866135-caca-4061-aada-15ca763718a1"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( + enabled: true, + is_trigger: false, + shape: StaticMesh( + meshes: [ + ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node4:mesh4:primitive0", + label: "metal_office_desk_drawer_03 / Primitive 0", + source_path: None, + ), + ], + cooking: Default, + ), + ), + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (2), + "shared::components::LevelObject": (), + "shared::components::RigidBodyDesc": ( + body: Static, + ), + "shared::components::StaticMeshRenderer": ( + slots: [ + ( + id: ("draw:scene0:node4:mesh4:primitive0"), + name: "metal_office_desk_drawer_03 / Primitive 0", + mesh: ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node4:mesh4:primitive0", + label: "metal_office_desk_drawer_03 / Primitive 0", + source_path: None, + ), + material_slot_id: ("slot:draw:scene0:node4:mesh4:primitive0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + visible: true, + cast_shadows: true, + receive_shadows: true, + ), + ], + materials: ( + slots: [ + ( + id: ("slot:draw:scene0:node4:mesh4:primitive0"), + name: "metal_office_desk_drawer_03 / Primitive 0", + material: None, + ), + ], + orphaned_assignments: [], + ), + ), + }), + 85899345209: (components: { + "bevy_ecs::hierarchy::ChildOf": (68719475876), + "bevy_ecs::name::Name": "metal_office_desk_drawer_05 / Primitive 0", + "bevy_transform::components::transform::Transform": ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("56208828-a8de-466c-8fe8-bcbc236a98de"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( + enabled: true, + is_trigger: false, + shape: StaticMesh( + meshes: [ + ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node5:mesh5:primitive0", + label: "metal_office_desk_drawer_05 / Primitive 0", + source_path: None, + ), + ], + cooking: Default, + ), + ), + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (4), + "shared::components::LevelObject": (), + "shared::components::RigidBodyDesc": ( + body: Static, + ), + "shared::components::StaticMeshRenderer": ( + slots: [ + ( + id: ("draw:scene0:node5:mesh5:primitive0"), + name: "metal_office_desk_drawer_05 / Primitive 0", + mesh: ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node5:mesh5:primitive0", + label: "metal_office_desk_drawer_05 / Primitive 0", + source_path: None, + ), + material_slot_id: ("slot:draw:scene0:node5:mesh5:primitive0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + visible: true, + cast_shadows: true, + receive_shadows: true, + ), + ], + materials: ( + slots: [ + ( + id: ("slot:draw:scene0:node5:mesh5:primitive0"), + name: "metal_office_desk_drawer_05 / Primitive 0", + material: None, + ), + ], + orphaned_assignments: [], + ), + ), + }), + 90194312192: (components: { + "bevy_ecs::hierarchy::ChildOf": (68719475876), + "bevy_ecs::name::Name": "metal_office_desk_drawer_06 / Primitive 0", + "bevy_transform::components::transform::Transform": ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("1b1e06b2-1bb3-4bd5-b3e2-9f2d83297268"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( + enabled: true, + is_trigger: false, + shape: StaticMesh( + meshes: [ + ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node0:mesh0:primitive0", + label: "metal_office_desk_drawer_06 / Primitive 0", + source_path: None, + ), + ], + cooking: Default, + ), + ), + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (5), + "shared::components::LevelObject": (), + "shared::components::RigidBodyDesc": ( + body: Static, + ), + "shared::components::StaticMeshRenderer": ( + slots: [ + ( + id: ("draw:scene0:node0:mesh0:primitive0"), + name: "metal_office_desk_drawer_06 / Primitive 0", + mesh: ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node0:mesh0:primitive0", + label: "metal_office_desk_drawer_06 / Primitive 0", + source_path: None, + ), + material_slot_id: ("slot:draw:scene0:node0:mesh0:primitive0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + visible: true, + cast_shadows: true, + receive_shadows: true, + ), + ], + materials: ( + slots: [ + ( + id: ("slot:draw:scene0:node0:mesh0:primitive0"), + name: "metal_office_desk_drawer_06 / Primitive 0", + material: None, + ), + ], + orphaned_assignments: [], + ), + ), + }), + 98784246793: (components: { + "bevy_ecs::hierarchy::ChildOf": (68719475876), + "bevy_ecs::name::Name": "metal_office_desk_drawer_01 / Primitive 0", + "bevy_transform::components::transform::Transform": ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("1797b075-3f86-46be-ab56-9835f60d7487"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( + enabled: true, + is_trigger: false, + shape: StaticMesh( + meshes: [ + ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node7:mesh7:primitive0", + label: "metal_office_desk_drawer_01 / Primitive 0", + source_path: None, + ), + ], + cooking: Default, + ), + ), + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (0), + "shared::components::LevelObject": (), + "shared::components::RigidBodyDesc": ( + body: Static, + ), + "shared::components::StaticMeshRenderer": ( + slots: [ + ( + id: ("draw:scene0:node7:mesh7:primitive0"), + name: "metal_office_desk_drawer_01 / Primitive 0", + mesh: ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node7:mesh7:primitive0", + label: "metal_office_desk_drawer_01 / Primitive 0", + source_path: None, + ), + material_slot_id: ("slot:draw:scene0:node7:mesh7:primitive0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + visible: true, + cast_shadows: true, + receive_shadows: true, + ), + ], + materials: ( + slots: [ + ( + id: ("slot:draw:scene0:node7:mesh7:primitive0"), + name: "metal_office_desk_drawer_01 / Primitive 0", + material: None, + ), + ], + orphaned_assignments: [], + ), + ), + }), + 107374181688: (components: { + "bevy_ecs::name::Name": "metal_office_desk_2k", + "bevy_transform::components::transform::Transform": ( + translation: (2.0, 0.1, 9.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("e0c30906-7519-45c6-8f54-19f7780e8bd5"), + "shared::components::ActorKind": Empty, + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (30), + "shared::components::LevelObject": (), + }), + 120259083352: (components: { + "bevy_ecs::hierarchy::ChildOf": (68719475876), + "bevy_ecs::name::Name": "metal_office_desk_drawer_02 / Primitive 0", + "bevy_transform::components::transform::Transform": ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("85c6a7c9-d48f-4858-813b-b3fc106feff0"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( + enabled: true, + is_trigger: false, + shape: StaticMesh( + meshes: [ + ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node6:mesh6:primitive0", + label: "metal_office_desk_drawer_02 / Primitive 0", + source_path: None, + ), + ], + cooking: Default, + ), + ), + "shared::components::EditorVisibility": ( + visible: true, + ), + "shared::components::HierarchySiblingIndex": (1), + "shared::components::LevelObject": (), + "shared::components::RigidBodyDesc": ( + body: Static, + ), + "shared::components::StaticMeshRenderer": ( + slots: [ + ( + id: ("draw:scene0:node6:mesh6:primitive0"), + name: "metal_office_desk_drawer_02 / Primitive 0", + mesh: ( + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + sub_asset_id: "draw:scene0:node6:mesh6:primitive0", + label: "metal_office_desk_drawer_02 / Primitive 0", + source_path: None, + ), + material_slot_id: ("slot:draw:scene0:node6:mesh6:primitive0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + visible: true, + cast_shadows: true, + receive_shadows: true, + ), + ], + materials: ( + slots: [ + ( + id: ("slot:draw:scene0:node6:mesh6:primitive0"), + name: "metal_office_desk_drawer_02 / Primitive 0", + material: None, + ), + ], + orphaned_assignments: [], + ), + ), + }), }, ) \ No newline at end of file diff --git a/assets/levels/navigation_authoring_showcase.scn.ron b/assets/levels/navigation_authoring_showcase.scn.ron index 6f95235..beb0e00 100644 --- a/assets/levels/navigation_authoring_showcase.scn.ron +++ b/assets/levels/navigation_authoring_showcase.scn.ron @@ -1,4 +1,4 @@ -(schema_version: 4,resources: { +(schema_version: 6,resources: { }, entities: { 1: (components: { @@ -67,7 +67,15 @@ "shared::components::EditorVisibility": (visible: true), "shared::components::HierarchySiblingIndex": (4), "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (16.0, 0.5, 16.0)), + "shared::components::Primitive": ( + shape: Box, + size: (16.0, 0.5, 16.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: None, + ), +), }), }, -) +) \ No newline at end of file diff --git a/assets/levels/physics_placement_showcase.scn.ron b/assets/levels/physics_placement_showcase.scn.ron index 6803934..9104027 100644 --- a/assets/levels/physics_placement_showcase.scn.ron +++ b/assets/levels/physics_placement_showcase.scn.ron @@ -1,157 +1,151 @@ -(schema_version: 4, resources: {}, entities: { - 1: (components: { - "bevy_ecs::name::Name": "Placement Floor", - "bevy_transform::components::transform::Transform": ( +(schema_version: 6,resources: { + }, + entities: { + 1: (components: { + "bevy_ecs::name::Name": "Placement Floor", + "bevy_transform::components::transform::Transform": ( translation: (0.0, -0.25, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("physics-placement-floor"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (0), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.12, g: 0.14, b: 0.16, a: 1.0), - metallic: 0.05, - roughness: 0.72, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), - "shared::components::Primitive": (shape: Box, size: (14.0, 0.5, 10.0)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("physics-placement-floor"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: true, is_trigger: false, shape: Cuboid(x_length: 14.0, y_length: 0.5, z_length: 10.0), ), - }), - 2: (components: { - "bevy_ecs::name::Name": "Placement Cuboid", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (0), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (14.0, 0.5, 10.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "6cc5ffc1-16fb-5652-ab6b-0bb9b4f36ae2", + sub_asset_id: "material:source", + label: "Legacy Material 78bc49856f47eae1", + source_path: Some("assets/materials/migrated/legacy-78bc49856f47eae1.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 2: (components: { + "bevy_ecs::name::Name": "Placement Cuboid", + "bevy_transform::components::transform::Transform": ( translation: (-2.0, 3.0, 0.0), rotation: (0.1305262, 0.0, 0.0, 0.9914449), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("physics-placement-prop-a"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (1), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.88, g: 0.48, b: 0.12, a: 1.0), - metallic: 0.1, - roughness: 0.42, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), - "shared::components::Primitive": (shape: Box, size: (1.2, 1.2, 1.2)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("physics-placement-prop-a"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: true, is_trigger: false, shape: Cuboid(x_length: 1.2, y_length: 1.2, z_length: 1.2), ), - }), - 3: (components: { - "bevy_ecs::name::Name": "Placement Sphere", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (1), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (1.2, 1.2, 1.2), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "0cb3fb85-db18-52ea-8c42-b5ab58e90965", + sub_asset_id: "material:source", + label: "Legacy Material 05a00cdd0a637f9e", + source_path: Some("assets/materials/migrated/legacy-05a00cdd0a637f9e.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 3: (components: { + "bevy_ecs::name::Name": "Placement Sphere", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 5.0, 0.0), rotation: (0.0, 0.2164396, 0.0, 0.976296), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("physics-placement-prop-b"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (2), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.10, g: 0.58, b: 0.72, a: 1.0), - metallic: 0.15, - roughness: 0.35, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), - "shared::components::Primitive": (shape: Sphere, size: (1.6, 1.6, 1.6)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("physics-placement-prop-b"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: true, is_trigger: false, shape: Sphere(radius: 0.8), ), - }), - 4: (components: { - "bevy_ecs::name::Name": "Placement Capsule", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (2), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Sphere, + size: (1.6, 1.6, 1.6), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "5b60f0a9-53b8-56b4-8ee9-cffd2e117c55", + sub_asset_id: "material:source", + label: "Legacy Material 0a21ebb8e495bf57", + source_path: Some("assets/materials/migrated/legacy-0a21ebb8e495bf57.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 4: (components: { + "bevy_ecs::name::Name": "Placement Capsule", + "bevy_transform::components::transform::Transform": ( translation: (2.0, 7.0, 0.0), rotation: (0.092296, 0.092296, -0.008077, 0.991405), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("physics-placement-prop-c"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (3), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.62, g: 0.24, b: 0.56, a: 1.0), - metallic: 0.08, - roughness: 0.5, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), - "shared::components::Primitive": (shape: Box, size: (0.9, 1.8, 0.9)), - "shared::components::RigidBodyDesc": (body: Static), - "shared::components::ColliderDesc": ( + "shared::components::ActorId": ("physics-placement-prop-c"), + "shared::components::ActorKind": StaticMesh, + "shared::components::ColliderDesc": ( enabled: true, is_trigger: false, shape: Capsule(radius: 0.45, height: 1.8), ), - }), - 5: (components: { - "bevy_ecs::name::Name": "Placement Sun", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (3), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (0.9, 1.8, 0.9), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "2fb3fcd4-f7b7-5f28-bf79-2241e47c7ea8", + sub_asset_id: "material:source", + label: "Legacy Material cc0396f5c90fb7bb", + source_path: Some("assets/materials/migrated/legacy-cc0396f5c90fb7bb.material.ron"), + ))), + ), +), + "shared::components::RigidBodyDesc": (body: Static), + }), + 5: (components: { + "bevy_ecs::name::Name": "Placement Sun", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 8.0, 2.0), rotation: (-0.3826834, 0.0, 0.0, 0.9238795), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("physics-placement-sun"), - "shared::components::ActorKind": Light, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (4), - "shared::components::LevelObject": (), - "shared::components::LightDesc": ( + "shared::components::ActorId": ("physics-placement-sun"), + "shared::components::ActorKind": Light, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (4), + "shared::components::LevelObject": (), + "shared::components::LightDesc": ( kind: Directional, color: (r: 1.0, g: 0.95, b: 0.85, a: 1.0), intensity: 100000.0, @@ -160,5 +154,6 @@ inner_angle_deg: 25.0, outer_angle_deg: 35.0, ), - }), -}) + }), + }, +) \ No newline at end of file diff --git a/assets/levels/rendering_showcase.scn.ron b/assets/levels/rendering_showcase.scn.ron index 1e0194a..34c9739 100644 --- a/assets/levels/rendering_showcase.scn.ron +++ b/assets/levels/rendering_showcase.scn.ron @@ -1,162 +1,154 @@ -(schema_version: 4, resources: {}, entities: { - 1: (components: { - "bevy_ecs::name::Name": "Rendering Lab Floor", - "bevy_transform::components::transform::Transform": ( +(schema_version: 6,resources: { + }, + entities: { + 1: (components: { + "bevy_ecs::name::Name": "Rendering Lab Floor", + "bevy_transform::components::transform::Transform": ( translation: (1.0, -0.25, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-floor"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (0), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (38.0, 0.5, 12.0)), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.12, g: 0.14, b: 0.16, a: 1.0), - metallic: 0.05, - roughness: 0.72, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), - }), - 2: (components: { - "bevy_ecs::name::Name": "Vignette Anchor", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("rendering-showcase-floor"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (0), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (38.0, 0.5, 12.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "6cc5ffc1-16fb-5652-ab6b-0bb9b4f36ae2", + sub_asset_id: "material:source", + label: "Legacy Material 78bc49856f47eae1", + source_path: Some("assets/materials/migrated/legacy-78bc49856f47eae1.material.ron"), + ))), + ), +), + }), + 2: (components: { + "bevy_ecs::name::Name": "Vignette Anchor", + "bevy_transform::components::transform::Transform": ( translation: (-12.0, 1.2, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-vignette-anchor"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (1), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Sphere, size: (2.4, 2.4, 2.4)), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.82, g: 0.18, b: 0.2, a: 1.0), - metallic: 0.08, - roughness: 0.38, - emissive_color: (r: 1.0, g: 0.2, b: 0.2, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), - }), - 3: (components: { - "bevy_ecs::name::Name": "Fog Anchor", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("rendering-showcase-vignette-anchor"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (1), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Sphere, + size: (2.4, 2.4, 2.4), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "c512d6e2-272b-5e86-8235-4628ed3b6e8c", + sub_asset_id: "material:source", + label: "Legacy Material e9671004b101f4df", + source_path: Some("assets/materials/migrated/legacy-e9671004b101f4df.material.ron"), + ))), + ), +), + }), + 3: (components: { + "bevy_ecs::name::Name": "Fog Anchor", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 1.4, 0.0), rotation: (0.0, 0.258819, 0.0, 0.9659258), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-fog-anchor"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (2), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (2.8, 2.8, 2.8)), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.1, g: 0.58, b: 0.72, a: 1.0), - metallic: 0.15, - roughness: 0.35, - emissive_color: (r: 0.1, g: 0.58, b: 0.72, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), - }), - 4: (components: { - "bevy_ecs::name::Name": "Exposure Anchor", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("rendering-showcase-fog-anchor"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (2), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (2.8, 2.8, 2.8), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "41dbf5a0-7a0a-5fac-9ec3-a0ceacb548a9", + sub_asset_id: "material:source", + label: "Legacy Material c9d05c61e5cf348d", + source_path: Some("assets/materials/migrated/legacy-c9d05c61e5cf348d.material.ron"), + ))), + ), +), + }), + 4: (components: { + "bevy_ecs::name::Name": "Exposure Anchor", + "bevy_transform::components::transform::Transform": ( translation: (14.0, 1.3, 0.0), rotation: (0.0, -0.1736482, 0.0, 0.9848078), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-exposure-anchor"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (3), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (3.0, 2.6, 3.0)), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.92, g: 0.62, b: 0.12, a: 1.0), - metallic: 0.12, - roughness: 0.32, - emissive_color: (r: 1.0, g: 0.65, b: 0.12, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], - ), - }), - 5: (components: { - "bevy_ecs::name::Name": "Emissive Comparison Panel", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("rendering-showcase-exposure-anchor"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (3), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (3.0, 2.6, 3.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "250a0db7-7108-5adf-b759-39b30c692c35", + sub_asset_id: "material:source", + label: "Legacy Material 082ba03b8cbb710b", + source_path: Some("assets/materials/migrated/legacy-082ba03b8cbb710b.material.ron"), + ))), + ), +), + }), + 5: (components: { + "bevy_ecs::name::Name": "Emissive Comparison Panel", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 2.6, -4.8), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-emissive-panel"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (4), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (26.0, 1.2, 0.25)), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.15, g: 0.22, b: 0.28, a: 1.0), - metallic: 0.0, - roughness: 0.35, - emissive_color: (r: 0.55, g: 0.85, b: 1.0, a: 1.0), - emissive_intensity: 2500.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: Some("assets/materials/emissive_panel.ron"), - parameters: [], - textures: [], - ), - }), - 6: (components: { - "bevy_ecs::name::Name": "Fog Volume", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("rendering-showcase-emissive-panel"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (4), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (26.0, 1.2, 0.25), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + material: Some((( + asset_id: "4f684592-50b1-47e4-888c-8ba537e4c29d", + sub_asset_id: "material:source", + label: "emissive_panel", + source_path: Some("assets/materials/emissive_panel.ron"), + ))), + ), +), + }), + 6: (components: { + "bevy_ecs::name::Name": "Fog Volume", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 2.0, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-fog-volume"), - "shared::components::ActorKind": PostProcessVolume, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (5), - "shared::components::LevelObject": (), - "shared::components::PostProcessVolumeDesc": ( + "shared::components::ActorId": ("rendering-showcase-fog-volume"), + "shared::components::ActorKind": PostProcessVolume, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (5), + "shared::components::LevelObject": (), + "shared::components::PostProcessVolumeDesc": ( half_extents: (6.0, 3.0, 6.0), priority: 0, blend_distance: 2.0, @@ -168,20 +160,20 @@ profile: None, label: Some("Foggy courtyard"), ), - }), - 7: (components: { - "bevy_ecs::name::Name": "Dark Exposure Volume", - "bevy_transform::components::transform::Transform": ( + }), + 7: (components: { + "bevy_ecs::name::Name": "Dark Exposure Volume", + "bevy_transform::components::transform::Transform": ( translation: (14.0, 2.0, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-exposure-volume"), - "shared::components::ActorKind": PostProcessVolume, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (6), - "shared::components::LevelObject": (), - "shared::components::PostProcessVolumeDesc": ( + "shared::components::ActorId": ("rendering-showcase-exposure-volume"), + "shared::components::ActorKind": PostProcessVolume, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (6), + "shared::components::LevelObject": (), + "shared::components::PostProcessVolumeDesc": ( half_extents: (4.0, 2.5, 4.0), priority: 5, blend_distance: 1.5, @@ -193,20 +185,20 @@ profile: Some("assets/rendering_profiles/cave_dark.ron"), label: Some("Cave mouth"), ), - }), - 8: (components: { - "bevy_ecs::name::Name": "Vignette FX Volume", - "bevy_transform::components::transform::Transform": ( + }), + 8: (components: { + "bevy_ecs::name::Name": "Vignette FX Volume", + "bevy_transform::components::transform::Transform": ( translation: (-12.0, 2.0, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-vignette-volume"), - "shared::components::ActorKind": PostProcessVolume, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (7), - "shared::components::LevelObject": (), - "shared::components::PostProcessVolumeDesc": ( + "shared::components::ActorId": ("rendering-showcase-vignette-volume"), + "shared::components::ActorKind": PostProcessVolume, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (7), + "shared::components::LevelObject": (), + "shared::components::PostProcessVolumeDesc": ( half_extents: (5.0, 2.0, 5.0), priority: 2, blend_distance: 2.0, @@ -215,20 +207,20 @@ profile: None, label: Some("Vignette demo"), ), - }), - 9: (components: { - "bevy_ecs::name::Name": "Rendering Lab Sun", - "bevy_transform::components::transform::Transform": ( + }), + 9: (components: { + "bevy_ecs::name::Name": "Rendering Lab Sun", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 10.0, 5.0), rotation: (-0.3826834, 0.0, 0.0, 0.9238795), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("rendering-showcase-sun"), - "shared::components::ActorKind": Light, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (8), - "shared::components::LevelObject": (), - "shared::components::LightDesc": ( + "shared::components::ActorId": ("rendering-showcase-sun"), + "shared::components::ActorKind": Light, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (8), + "shared::components::LevelObject": (), + "shared::components::LightDesc": ( kind: Directional, color: (r: 1.0, g: 0.95, b: 0.85, a: 1.0), intensity: 100000.0, @@ -237,5 +229,6 @@ inner_angle_deg: 25.0, outer_angle_deg: 35.0, ), - }), -}) + }), + }, +) \ No newline at end of file diff --git a/assets/levels/samples/brush_blockout.scn.ron b/assets/levels/samples/brush_blockout.scn.ron index da24239..62f02b3 100644 --- a/assets/levels/samples/brush_blockout.scn.ron +++ b/assets/levels/samples/brush_blockout.scn.ron @@ -1,32 +1,16 @@ -(schema_version: 4, resources: {}, entities: { - 1: (components: { - "bevy_ecs::name::Name": "Foundation Brush", - "bevy_transform::components::transform::Transform": ( +(schema_version: 6,resources: { + }, + entities: { + 1: (components: { + "bevy_ecs::name::Name": "Foundation Brush", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 0.5, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("sample-brush-foundation"), - "shared::components::ActorKind": Brush, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (0), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.55, g: 0.54, b: 0.52, a: 1.0), - metallic: 0.0, - roughness: 0.85, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: Some("assets/materials/concrete.ron"), - parameters: [], - textures: [], - ), - "shared::components::BrushDesc": ( + "shared::components::ActorId": ("sample-brush-foundation"), + "shared::components::ActorKind": Brush, + "shared::components::BrushDesc": ( kind: Additive, faces: [ ( @@ -99,20 +83,10 @@ cast_shadows: true, receive_shadows: true, ), - }), - 2: (components: { - "bevy_ecs::name::Name": "Material Face Tower", - "bevy_transform::components::transform::Transform": ( - translation: (-2.5, 3.0, 0.0), - rotation: (0.0, 0.0, 0.0, 1.0), - scale: (1.0, 1.0, 1.0), - ), - "shared::components::ActorId": ("sample-brush-material-tower"), - "shared::components::ActorKind": Brush, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (1), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (0), + "shared::components::LevelObject": (), + "shared::components::MaterialDesc": ( shader: (kind: StandardLit, schema_path: None, shader_path: None), base_color: (r: 0.55, g: 0.54, b: 0.52, a: 1.0), metallic: 0.0, @@ -127,7 +101,17 @@ parameters: [], textures: [], ), - "shared::components::BrushDesc": ( + }), + 2: (components: { + "bevy_ecs::name::Name": "Material Face Tower", + "bevy_transform::components::transform::Transform": ( + translation: (-2.5, 3.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("sample-brush-material-tower"), + "shared::components::ActorKind": Brush, + "shared::components::BrushDesc": ( kind: Additive, faces: [ ( @@ -205,35 +189,35 @@ cast_shadows: true, receive_shadows: true, ), - }), - 3: (components: { - "bevy_ecs::name::Name": "Subtractive Marker", - "bevy_transform::components::transform::Transform": ( - translation: (2.5, 2.0, 0.0), - rotation: (0.0, 0.258819, 0.0, 0.9659258), - scale: (1.0, 1.0, 1.0), - ), - "shared::components::ActorId": ("sample-brush-subtractive-marker"), - "shared::components::ActorKind": Brush, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (2), - "shared::components::LevelObject": (), - "shared::components::MaterialDesc": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (1), + "shared::components::LevelObject": (), + "shared::components::MaterialDesc": ( shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.72, g: 0.14, b: 0.16, a: 1.0), - metallic: 0.05, - roughness: 0.4, - emissive_color: (r: 1.0, g: 0.25, b: 0.2, a: 1.0), + base_color: (r: 0.55, g: 0.54, b: 0.52, a: 1.0), + metallic: 0.0, + roughness: 0.85, + emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), emissive_intensity: 0.0, base_color_texture: None, emissive_texture: None, normal_map_texture: None, metallic_roughness_texture: None, - material_asset_path: None, + material_asset_path: Some("assets/materials/concrete.ron"), parameters: [], textures: [], ), - "shared::components::BrushDesc": ( + }), + 3: (components: { + "bevy_ecs::name::Name": "Subtractive Marker", + "bevy_transform::components::transform::Transform": ( + translation: (2.5, 2.0, 0.0), + rotation: (0.0, 0.258819, 0.0, 0.9659258), + scale: (1.0, 1.0, 1.0), + ), + "shared::components::ActorId": ("sample-brush-subtractive-marker"), + "shared::components::ActorKind": Brush, + "shared::components::BrushDesc": ( kind: SubtractiveMarker, faces: [ ( @@ -306,20 +290,38 @@ cast_shadows: true, receive_shadows: true, ), - }), - 4: (components: { - "bevy_ecs::name::Name": "Brush Lab Sun", - "bevy_transform::components::transform::Transform": ( + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (2), + "shared::components::LevelObject": (), + "shared::components::MaterialDesc": ( + shader: (kind: StandardLit, schema_path: None, shader_path: None), + base_color: (r: 0.72, g: 0.14, b: 0.16, a: 1.0), + metallic: 0.05, + roughness: 0.4, + emissive_color: (r: 1.0, g: 0.25, b: 0.2, a: 1.0), + emissive_intensity: 0.0, + base_color_texture: None, + emissive_texture: None, + normal_map_texture: None, + metallic_roughness_texture: None, + material_asset_path: None, + parameters: [], + textures: [], + ), + }), + 4: (components: { + "bevy_ecs::name::Name": "Brush Lab Sun", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 8.0, 4.0), rotation: (-0.3826834, 0.0, 0.0, 0.9238795), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("sample-brush-sun"), - "shared::components::ActorKind": Light, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (3), - "shared::components::LevelObject": (), - "shared::components::LightDesc": ( + "shared::components::ActorId": ("sample-brush-sun"), + "shared::components::ActorKind": Light, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (3), + "shared::components::LevelObject": (), + "shared::components::LightDesc": ( kind: Directional, color: (r: 1.0, g: 0.95, b: 0.85, a: 1.0), intensity: 100000.0, @@ -328,5 +330,6 @@ inner_angle_deg: 25.0, outer_angle_deg: 35.0, ), - }), -}) + }), + }, +) \ No newline at end of file diff --git a/assets/levels/samples/material_lab.scn.ron b/assets/levels/samples/material_lab.scn.ron index 7911031..8eadeb1 100644 --- a/assets/levels/samples/material_lab.scn.ron +++ b/assets/levels/samples/material_lab.scn.ron @@ -1,182 +1,159 @@ -(schema_version: 4, resources: {}, entities: { - 1: (components: { - "bevy_ecs::name::Name": "Material Lab Floor", - "bevy_transform::components::transform::Transform": ( +(schema_version: 5,resources: { + }, + entities: { + 1: (components: { + "bevy_ecs::name::Name": "Material Lab Floor", + "bevy_transform::components::transform::Transform": ( translation: (0.0, -0.2, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("sample-material-floor"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (0), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (14.0, 0.4, 8.0)), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.55, g: 0.54, b: 0.52, a: 1.0), - metallic: 0.0, - roughness: 0.85, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: Some("assets/materials/concrete.ron"), - parameters: [], - textures: [], - ), - }), - 2: (components: { - "bevy_ecs::name::Name": "Concrete Reference", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("sample-material-floor"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (0), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (14.0, 0.4, 8.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + source_material: None, + material: Some((( + asset_id: "a57f2891-8536-47b8-b476-01c08b36ac43", + sub_asset_id: "material:source", + label: "concrete", + source_path: Some("assets/materials/concrete.ron"), + ))), + ), +), + }), + 2: (components: { + "bevy_ecs::name::Name": "Concrete Reference", + "bevy_transform::components::transform::Transform": ( translation: (-4.0, 1.0, 0.0), rotation: (0.0, 0.2164396, 0.0, 0.976296), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("sample-material-concrete"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (1), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (2.0, 2.0, 2.0)), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.55, g: 0.54, b: 0.52, a: 1.0), - metallic: 0.0, - roughness: 0.85, - emissive_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: Some("assets/materials/concrete.ron"), - parameters: [], - textures: [], - ), - }), - 3: (components: { - "bevy_ecs::name::Name": "Custom Surface Reference", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("sample-material-concrete"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (1), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (2.0, 2.0, 2.0), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + source_material: None, + material: Some((( + asset_id: "a57f2891-8536-47b8-b476-01c08b36ac43", + sub_asset_id: "material:source", + label: "concrete", + source_path: Some("assets/materials/concrete.ron"), + ))), + ), +), + }), + 3: (components: { + "bevy_ecs::name::Name": "Custom Surface Reference", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 1.2, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("sample-material-custom-surface"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (2), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Sphere, size: (2.4, 2.4, 2.4)), - "shared::components::MaterialDesc": ( - shader: ( - kind: Custom, - schema_path: Some("assets/shaders/surface_tint.shader.ron"), - shader_path: Some("assets/shaders/surface_tint.wgsl"), - ), - base_color: (r: 0.12, g: 0.42, b: 0.95, a: 1.0), - metallic: 0.15, - roughness: 0.28, - emissive_color: (r: 0.02, g: 0.08, b: 0.25, a: 1.0), - emissive_intensity: 3.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: Some("assets/materials/surface_tint.ron"), - parameters: [ - (name: "tint", value: Color((r: 0.12, g: 0.42, b: 0.95, a: 1.0))), - (name: "roughness", value: Float(0.28)), - (name: "metallic", value: Float(0.15)), - (name: "emissive", value: Color((r: 0.02, g: 0.08, b: 0.25, a: 1.0))), - (name: "emissive_intensity", value: Float(3.0)), - ], - textures: [], - ), - }), - 4: (components: { - "bevy_ecs::name::Name": "Material Instance Reference", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("sample-material-custom-surface"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (2), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Sphere, + size: (2.4, 2.4, 2.4), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + source_material: None, + material: Some((( + asset_id: "d6cb4151-7124-4237-aaf9-f7f8abd5fb76", + sub_asset_id: "material:source", + label: "surface_tint", + source_path: Some("assets/materials/surface_tint.ron"), + ))), + ), +), + }), + 4: (components: { + "bevy_ecs::name::Name": "Material Instance Reference", + "bevy_transform::components::transform::Transform": ( translation: (4.0, 1.0, 0.0), rotation: (0.0, -0.1305262, 0.0, 0.9914449), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("sample-material-instance"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (3), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (2.6, 2.0, 2.6)), - "shared::components::MaterialDesc": ( - shader: ( - kind: Custom, - schema_path: Some("assets/shaders/surface_tint.shader.ron"), - shader_path: Some("assets/shaders/surface_tint.wgsl"), - ), - base_color: (r: 0.12, g: 0.42, b: 0.95, a: 1.0), - metallic: 0.15, - roughness: 0.28, - emissive_color: (r: 0.02, g: 0.08, b: 0.25, a: 1.0), - emissive_intensity: 3.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: Some("assets/materials/surface_tint_instance.ron"), - parameters: [ - (name: "tint", value: Color((r: 0.12, g: 0.42, b: 0.95, a: 1.0))), - (name: "roughness", value: Float(0.28)), - (name: "metallic", value: Float(0.15)), - (name: "emissive", value: Color((r: 0.02, g: 0.08, b: 0.25, a: 1.0))), - (name: "emissive_intensity", value: Float(3.0)), - ], - textures: [], - ), - }), - 5: (components: { - "bevy_ecs::name::Name": "Emissive Reference Panel", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("sample-material-instance"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (3), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (2.6, 2.0, 2.6), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + source_material: None, + material: Some((( + asset_id: "cc2769da-c9a5-4cb3-866a-cc81d0688ee2", + sub_asset_id: "material:instance", + label: "surface_tint_instance", + source_path: Some("assets/materials/surface_tint_instance.ron"), + ))), + ), +), + }), + 5: (components: { + "bevy_ecs::name::Name": "Emissive Reference Panel", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 2.3, -3.6), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("sample-material-emissive-panel"), - "shared::components::ActorKind": StaticMesh, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (4), - "shared::components::LevelObject": (), - "shared::components::Primitive": (shape: Box, size: (9.0, 3.0, 0.25)), - "shared::components::MaterialDesc": ( - shader: (kind: StandardLit, schema_path: None, shader_path: None), - base_color: (r: 0.15, g: 0.22, b: 0.28, a: 1.0), - metallic: 0.0, - roughness: 0.35, - emissive_color: (r: 0.55, g: 0.85, b: 1.0, a: 1.0), - emissive_intensity: 2500.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: Some("assets/materials/emissive_panel.ron"), - parameters: [], - textures: [], - ), - }), - 6: (components: { - "bevy_ecs::name::Name": "Material Lab Sun", - "bevy_transform::components::transform::Transform": ( + "shared::components::ActorId": ("sample-material-emissive-panel"), + "shared::components::ActorKind": StaticMesh, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (4), + "shared::components::LevelObject": (), + "shared::components::Primitive": ( + shape: Box, + size: (9.0, 3.0, 0.25), + surface: ( + id: ("slot:primitive:surface"), + name: "Surface", + source_material: None, + material: Some((( + asset_id: "4f684592-50b1-47e4-888c-8ba537e4c29d", + sub_asset_id: "material:source", + label: "emissive_panel", + source_path: Some("assets/materials/emissive_panel.ron"), + ))), + ), +), + }), + 6: (components: { + "bevy_ecs::name::Name": "Material Lab Sun", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 8.0, 4.0), rotation: (-0.3826834, 0.0, 0.0, 0.9238795), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("sample-material-sun"), - "shared::components::ActorKind": Light, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (5), - "shared::components::LevelObject": (), - "shared::components::LightDesc": ( + "shared::components::ActorId": ("sample-material-sun"), + "shared::components::ActorKind": Light, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (5), + "shared::components::LevelObject": (), + "shared::components::LightDesc": ( kind: Directional, color: (r: 1.0, g: 0.95, b: 0.85, a: 1.0), intensity: 100000.0, @@ -185,5 +162,6 @@ inner_angle_deg: 25.0, outer_angle_deg: 35.0, ), - }), -}) + }), + }, +) \ No newline at end of file diff --git a/assets/levels/terrain_authoring_showcase.scn.ron b/assets/levels/terrain_authoring_showcase.scn.ron index fc5cb3c..a782819 100644 --- a/assets/levels/terrain_authoring_showcase.scn.ron +++ b/assets/levels/terrain_authoring_showcase.scn.ron @@ -1,17 +1,19 @@ -(schema_version: 4, resources: {}, entities: { - 1: (components: { - "bevy_ecs::name::Name": "Terrain Showcase", - "bevy_transform::components::transform::Transform": ( +(schema_version: 6,resources: { + }, + entities: { + 1: (components: { + "bevy_ecs::name::Name": "Terrain Showcase", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 0.0, 0.0), rotation: (0.0, 0.0, 0.0, 1.0), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("terrain-showcase-main"), - "shared::components::ActorKind": Terrain, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (0), - "shared::components::LevelObject": (), - "shared::components::TerrainDesc": ( + "shared::components::ActorId": ("terrain-showcase-main"), + "shared::components::ActorKind": Terrain, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (0), + "shared::components::LevelObject": (), + "shared::components::TerrainDesc": ( schema_version: 1, resolution: 5, heights: [ @@ -61,20 +63,20 @@ cast_shadows: true, receive_shadows: true, ), - }), - 2: (components: { - "bevy_ecs::name::Name": "Terrain Sun", - "bevy_transform::components::transform::Transform": ( + }), + 2: (components: { + "bevy_ecs::name::Name": "Terrain Sun", + "bevy_transform::components::transform::Transform": ( translation: (0.0, 8.0, 0.0), rotation: (-0.3826834, 0.0, 0.0, 0.9238795), scale: (1.0, 1.0, 1.0), ), - "shared::components::ActorId": ("terrain-showcase-sun"), - "shared::components::ActorKind": Light, - "shared::components::EditorVisibility": (visible: true), - "shared::components::HierarchySiblingIndex": (1), - "shared::components::LevelObject": (), - "shared::components::LightDesc": ( + "shared::components::ActorId": ("terrain-showcase-sun"), + "shared::components::ActorKind": Light, + "shared::components::EditorVisibility": (visible: true), + "shared::components::HierarchySiblingIndex": (1), + "shared::components::LevelObject": (), + "shared::components::LightDesc": ( kind: Directional, color: (r: 1.0, g: 0.95, b: 0.85, a: 1.0), intensity: 100000.0, @@ -83,5 +85,6 @@ inner_angle_deg: 25.0, outer_angle_deg: 35.0, ), - }), -}) + }), + }, +) \ No newline at end of file diff --git a/assets/materials/chrome.ron b/assets/materials/chrome.ron new file mode 100644 index 0000000..8b10d5f --- /dev/null +++ b/assets/materials/chrome.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "New Material 3", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(1.0), + ), + ( + name: "roughness", + value: Float(0.0), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/concrete.ron b/assets/materials/concrete.ron index dc8ffd8..61655c3 100644 --- a/assets/materials/concrete.ron +++ b/assets/materials/concrete.ron @@ -1,40 +1,85 @@ ( - schema_version: 1, + schema_version: 2, label: "Concrete", - shader: None, + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), shader_ref: None, render_state: ( alpha_mode: Opaque, alpha_cutoff: 0.5, double_sided: false, ), - material: ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.55, - g: 0.54, - b: 0.52, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.85, - emissive_color: ( - r: 1.0, - g: 1.0, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], - textures: [], + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.55, + g: 0.54, + b: 0.52, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.85), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ( + name: "occlusion", + value: Float(1.0), + ), + ], + textures: [ + ( + name: "base_color", + texture: None, + channel: Rgba, + ), + ( + name: "metallic", + texture: None, + channel: B, + ), + ( + name: "roughness", + texture: None, + channel: G, + ), + ( + name: "occlusion", + texture: None, + channel: R, + ), + ( + name: "normal", + texture: None, + channel: Rgb, + ), + ( + name: "emissive_color", + texture: None, + channel: Rgb, + ), + ], ), ) \ No newline at end of file diff --git a/assets/materials/emissive_panel.ron b/assets/materials/emissive_panel.ron index e9d296c..b858fa4 100644 --- a/assets/materials/emissive_panel.ron +++ b/assets/materials/emissive_panel.ron @@ -1,40 +1,50 @@ ( - schema_version: 1, + schema_version: 2, label: "Emissive Panel", - shader: None, + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), shader_ref: None, render_state: ( alpha_mode: Opaque, alpha_cutoff: 0.5, double_sided: false, ), - material: ( - shader: ( - kind: StandardLit, - schema_path: None, - shader_path: None, - ), - base_color: ( - r: 0.15, - g: 0.22, - b: 0.28, - a: 1.0, - ), - metallic: 0.0, - roughness: 0.35, - emissive_color: ( - r: 0.55, - g: 0.85, - b: 1.0, - a: 1.0, - ), - emissive_intensity: 2500.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [], + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.15, + g: 0.22, + b: 0.28, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.35), + ), + ( + name: "emissive_color", + value: Color(( + r: 0.55, + g: 0.85, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(2500.0), + ), + ], textures: [], ), ) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-05a00cdd0a637f9e.material.ron b/assets/materials/migrated/legacy-05a00cdd0a637f9e.material.ron new file mode 100644 index 0000000..c342733 --- /dev/null +++ b/assets/materials/migrated/legacy-05a00cdd0a637f9e.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 05a00cdd0a637f9e", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.88, + g: 0.48, + b: 0.12, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.1), + ), + ( + name: "roughness", + value: Float(0.42), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-082ba03b8cbb710b.material.ron b/assets/materials/migrated/legacy-082ba03b8cbb710b.material.ron new file mode 100644 index 0000000..9e9d4c6 --- /dev/null +++ b/assets/materials/migrated/legacy-082ba03b8cbb710b.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 082ba03b8cbb710b", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.92, + g: 0.62, + b: 0.12, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.12), + ), + ( + name: "roughness", + value: Float(0.32), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 0.65, + b: 0.12, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-0a21ebb8e495bf57.material.ron b/assets/materials/migrated/legacy-0a21ebb8e495bf57.material.ron new file mode 100644 index 0000000..7edf64b --- /dev/null +++ b/assets/materials/migrated/legacy-0a21ebb8e495bf57.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 0a21ebb8e495bf57", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.1, + g: 0.58, + b: 0.72, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.15), + ), + ( + name: "roughness", + value: Float(0.35), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron b/assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron new file mode 100644 index 0000000..65f345d --- /dev/null +++ b/assets/materials/migrated/legacy-1a259303a97c4ba9.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 1a259303a97c4ba9", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.9, + g: 0.9, + b: 0.92, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(1.0), + ), + ( + name: "roughness", + value: Float(0.3), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-2b86cae1d3bfacae.material.ron b/assets/materials/migrated/legacy-2b86cae1d3bfacae.material.ron new file mode 100644 index 0000000..6f6a0c4 --- /dev/null +++ b/assets/materials/migrated/legacy-2b86cae1d3bfacae.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 2b86cae1d3bfacae", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.58, + g: 0.34, + b: 0.78, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.06), + ), + ( + name: "roughness", + value: Float(0.48), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-3546762bbff37951.material.ron b/assets/materials/migrated/legacy-3546762bbff37951.material.ron new file mode 100644 index 0000000..07fea64 --- /dev/null +++ b/assets/materials/migrated/legacy-3546762bbff37951.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 3546762bbff37951", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.8, + g: 0.8, + b: 0.8, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.65), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron b/assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron new file mode 100644 index 0000000..5f34913 --- /dev/null +++ b/assets/materials/migrated/legacy-454bcd95aaa4f1ca.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 454bcd95aaa4f1ca", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.55, + g: 0.52, + b: 0.48, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.8), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron b/assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron new file mode 100644 index 0000000..7ea2e68 --- /dev/null +++ b/assets/materials/migrated/legacy-4f65eccbb7dac1a2.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 4f65eccbb7dac1a2", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.9, + g: 0.9, + b: 0.92, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(1.0), + ), + ( + name: "roughness", + value: Float(0.95), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-62ef60a686be94f1.material.ron b/assets/materials/migrated/legacy-62ef60a686be94f1.material.ron new file mode 100644 index 0000000..727d790 --- /dev/null +++ b/assets/materials/migrated/legacy-62ef60a686be94f1.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 62ef60a686be94f1", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.85, + g: 0.85, + b: 0.88, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.3), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-77cc6503f24bb9e8.material.ron b/assets/materials/migrated/legacy-77cc6503f24bb9e8.material.ron new file mode 100644 index 0000000..f372eb5 --- /dev/null +++ b/assets/materials/migrated/legacy-77cc6503f24bb9e8.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 77cc6503f24bb9e8", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.78, + g: 0.16, + b: 0.2, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.02), + ), + ( + name: "roughness", + value: Float(0.58), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-78bc49856f47eae1.material.ron b/assets/materials/migrated/legacy-78bc49856f47eae1.material.ron new file mode 100644 index 0000000..5c56700 --- /dev/null +++ b/assets/materials/migrated/legacy-78bc49856f47eae1.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 78bc49856f47eae1", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.12, + g: 0.14, + b: 0.16, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.05), + ), + ( + name: "roughness", + value: Float(0.72), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-964101ee77293501.material.ron b/assets/materials/migrated/legacy-964101ee77293501.material.ron new file mode 100644 index 0000000..bc33464 --- /dev/null +++ b/assets/materials/migrated/legacy-964101ee77293501.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 964101ee77293501", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.18, + g: 0.62, + b: 0.36, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.05), + ), + ( + name: "roughness", + value: Float(0.55), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron b/assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron new file mode 100644 index 0000000..282915b --- /dev/null +++ b/assets/materials/migrated/legacy-97356bd0ac2f6198.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 97356bd0ac2f6198", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.3, + g: 0.45, + b: 0.7, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.1), + ), + ( + name: "roughness", + value: Float(0.55), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-9a630ee3e4848d9d.material.ron b/assets/materials/migrated/legacy-9a630ee3e4848d9d.material.ron new file mode 100644 index 0000000..dbab876 --- /dev/null +++ b/assets/materials/migrated/legacy-9a630ee3e4848d9d.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material 9a630ee3e4848d9d", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.42, + g: 0.45, + b: 0.48, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.92), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-a74f874eafd5d224.material.ron b/assets/materials/migrated/legacy-a74f874eafd5d224.material.ron new file mode 100644 index 0000000..b4ca607 --- /dev/null +++ b/assets/materials/migrated/legacy-a74f874eafd5d224.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material a74f874eafd5d224", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.16, + g: 0.52, + b: 0.78, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.08), + ), + ( + name: "roughness", + value: Float(0.42), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-b278a62978900638.material.ron b/assets/materials/migrated/legacy-b278a62978900638.material.ron new file mode 100644 index 0000000..8934c62 --- /dev/null +++ b/assets/materials/migrated/legacy-b278a62978900638.material.ron @@ -0,0 +1,85 @@ +( + schema_version: 2, + label: "Legacy Material b278a62978900638", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.9, + g: 0.9, + b: 0.92, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(1.0), + ), + ( + name: "roughness", + value: Float(0.0), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ( + name: "occlusion", + value: Float(1.0), + ), + ], + textures: [ + ( + name: "base_color", + texture: None, + channel: Rgba, + ), + ( + name: "metallic", + texture: None, + channel: B, + ), + ( + name: "roughness", + texture: None, + channel: G, + ), + ( + name: "occlusion", + texture: None, + channel: R, + ), + ( + name: "normal", + texture: None, + channel: Rgb, + ), + ( + name: "emissive_color", + texture: None, + channel: Rgb, + ), + ], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-c656429ce3668694.material.ron b/assets/materials/migrated/legacy-c656429ce3668694.material.ron new file mode 100644 index 0000000..e70066a --- /dev/null +++ b/assets/materials/migrated/legacy-c656429ce3668694.material.ron @@ -0,0 +1,85 @@ +( + schema_version: 2, + label: "Legacy Material c656429ce3668694", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.9, + g: 0.9, + b: 0.92, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.0), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ( + name: "occlusion", + value: Float(1.0), + ), + ], + textures: [ + ( + name: "base_color", + texture: None, + channel: Rgba, + ), + ( + name: "metallic", + texture: None, + channel: B, + ), + ( + name: "roughness", + texture: None, + channel: G, + ), + ( + name: "occlusion", + texture: None, + channel: R, + ), + ( + name: "normal", + texture: None, + channel: Rgb, + ), + ( + name: "emissive_color", + texture: None, + channel: Rgb, + ), + ], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-c6c02ef278fba7c3.material.ron b/assets/materials/migrated/legacy-c6c02ef278fba7c3.material.ron new file mode 100644 index 0000000..d3f5bbc --- /dev/null +++ b/assets/materials/migrated/legacy-c6c02ef278fba7c3.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material c6c02ef278fba7c3", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.38, + g: 0.4, + b: 0.46, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.02), + ), + ( + name: "roughness", + value: Float(0.68), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-c6fbbebd3e1a9943.material.ron b/assets/materials/migrated/legacy-c6fbbebd3e1a9943.material.ron new file mode 100644 index 0000000..2ce27b1 --- /dev/null +++ b/assets/materials/migrated/legacy-c6fbbebd3e1a9943.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material c6fbbebd3e1a9943", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.12, + g: 0.68, + b: 0.82, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.03), + ), + ( + name: "roughness", + value: Float(0.4), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-c9d05c61e5cf348d.material.ron b/assets/materials/migrated/legacy-c9d05c61e5cf348d.material.ron new file mode 100644 index 0000000..ceca9f3 --- /dev/null +++ b/assets/materials/migrated/legacy-c9d05c61e5cf348d.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material c9d05c61e5cf348d", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.1, + g: 0.58, + b: 0.72, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.15), + ), + ( + name: "roughness", + value: Float(0.35), + ), + ( + name: "emissive_color", + value: Color(( + r: 0.1, + g: 0.58, + b: 0.72, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-cc0396f5c90fb7bb.material.ron b/assets/materials/migrated/legacy-cc0396f5c90fb7bb.material.ron new file mode 100644 index 0000000..c77766e --- /dev/null +++ b/assets/materials/migrated/legacy-cc0396f5c90fb7bb.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material cc0396f5c90fb7bb", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.62, + g: 0.24, + b: 0.56, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.08), + ), + ( + name: "roughness", + value: Float(0.5), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-e9671004b101f4df.material.ron b/assets/materials/migrated/legacy-e9671004b101f4df.material.ron new file mode 100644 index 0000000..9fc2fbf --- /dev/null +++ b/assets/materials/migrated/legacy-e9671004b101f4df.material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "Legacy Material e9671004b101f4df", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.82, + g: 0.18, + b: 0.2, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.08), + ), + ( + name: "roughness", + value: Float(0.38), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 0.2, + b: 0.2, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron b/assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron new file mode 100644 index 0000000..eb9a4c3 --- /dev/null +++ b/assets/materials/migrated/legacy-fc132d9b30cc63d4.material.ron @@ -0,0 +1,89 @@ +( + schema_version: 2, + label: "Legacy Material fc132d9b30cc63d4", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.72, + g: 0.45, + b: 0.2, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.85), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ( + name: "occlusion", + value: Float(1.0), + ), + ( + name: "normal", + value: Float(0.85), + ), + ], + textures: [ + ( + name: "base_color", + texture: None, + channel: Rgba, + ), + ( + name: "metallic", + texture: None, + channel: B, + ), + ( + name: "roughness", + texture: None, + channel: G, + ), + ( + name: "occlusion", + texture: None, + channel: R, + ), + ( + name: "normal", + texture: None, + channel: Rgb, + ), + ( + name: "emissive_color", + texture: None, + channel: Rgb, + ), + ], + ), +) \ No newline at end of file diff --git a/assets/materials/new_material.ron b/assets/materials/new_material.ron new file mode 100644 index 0000000..8dffac9 --- /dev/null +++ b/assets/materials/new_material.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "New Material", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.8, + g: 0.8, + b: 0.8, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.65), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/new_material_2.ron b/assets/materials/new_material_2.ron new file mode 100644 index 0000000..926cdba --- /dev/null +++ b/assets/materials/new_material_2.ron @@ -0,0 +1,50 @@ +( + schema_version: 2, + label: "New Material 2", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: false, + ), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.8, + g: 0.8, + b: 0.8, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(0.0), + ), + ( + name: "roughness", + value: Float(0.65), + ), + ( + name: "emissive_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/materials/pebble_bricks.bin b/assets/materials/pebble_bricks.bin new file mode 100644 index 0000000000000000000000000000000000000000..f533a269a9cc2a765ef2bd7ca9d3250ee10cff8e GIT binary patch literal 2370260 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

RdZ#IT1S?T*o+SMU3p_vM~?iu0k=nb@csrJ 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

UUuSVAEuj| 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 z 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%0DAT%0=}14V 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


wb| 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

jS7J8Hpi2^L^s+b`Pm&r$RqYUBO)W=eDR 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

2E79jWbvlA-vb8nz=A9awN72J?Dr zu($6HSgmT$XH&Oh;a6==42i*!ahjZFy94FJwOI0YE9ORY;JR^JQ7=5u%5fVOPHxYA zaWUvLu05COZ$q=4^w!CFQ`xD>f>zP6+^RwUgedHtCfsjuw5)4uQME1#p-Z(m?^zTS zD%*3-mne9osZz-~8k^oKGgMyph+Zf5#TN7%CR`?IGbVmeV?Lwcq^(A`eVZ{OScRjS zBQffCJN6qB0afu+S(!&-@+(z_?1_NF8Wpznh(PKTWxgJ@Np#lgOxzs~eepxtMQ_C3 zKh&t-5RQ5B{!E)qnAV`m`w8JF?4`oGYa6iJL7m3^H(<_#wzTfN9@|9EQ|Yq-lg6vk z`c@cHj;b)aa<|Oir8{=wP8b=fu~W%zBv+|&LWf=Wa94#B8g?Q~{6D##yI|x#wvk3TUwqb9%uJs=&v3}b|-09hx`foPj>#$br9u$GS9TjMi8IC=7+puNv2FzR_ zI;vmm|L0?wJvtnUO0Brae8c~^Pu-F*D7Y(gnpPN!#)wWwyrXS|lj$8_k6HhS4{2=} zbXT^beo`#vEmoq%xSeoV(}r(f@BE+M$ZYaX=#NsQ!nj?Sut9u1Lu2tGyaf;XY)8Ps zHdGoG0~_H{HIhC0(7QDa*Y3bC7ey|W>wLYl0`LBaL8b7r5r1q$yj~mDe2bC(F45`y z+KOlW6nK8>R#bW`F}7qYHZM|?PW7$$-lG+3wici^p(k}kොspI_p`%Mr<`1vJ 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ȝ(B!zf^Lg~q|^A%*bvA* ztH%}4|D~5XAAX{`r(OzTzhejM;_AU)@oK(ScD1g7E%Bg7=2vV!LEUb_XC%F1-G8Z? z^^#Whj{J!s^@yW;e8q%S)a%CmfO&{cD(LsIiP3RR?iVcT5-7Kx|3Iyo)HAGJq17$o zz+%p=O{E@n`5kecPRy^phAHvDnZ=)wG9XYEO)EtP`)F<4Ut&XJ>Kz9@!S?qc3CsF` zgK2>>q`_OvZAYDN=^Gfmp+AxD?@IhOqvAC>s<@rU-eJqHAh|={DVN*rK>o+HIdzgh zUcrw(#4fhwu%u6R$e2&q$@<=;?|bz6M=uU7-y&xZ>x}lLc(+9>lifeTTCJ7A^*>

8+sxR~qY(#DSvu1CpW&WG*Bez#d= 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�WD$5a1> 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

KZ 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

Kd($>)>8B;ra%7}kxZ;& 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

odTTQk^i`Slwq|;mNzaZe2h5=d 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 UT-iBHe58S%ZA2gQH|i$$f7kDhO8@`> literal 0 HcmV?d00001 diff --git a/assets/materials/pebble_bricks.ron b/assets/materials/pebble_bricks.ron new file mode 100644 index 0000000..2df044a --- /dev/null +++ b/assets/materials/pebble_bricks.ron @@ -0,0 +1,128 @@ +( + schema_version: 2, + label: "pebble_bricks", + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), + shader_ref: None, + render_state: ( + alpha_mode: Opaque, + alpha_cutoff: 0.5, + double_sided: true, + ), + provenance: Some(( + source_path: "assets/materials/pebble_bricks_4k.gltf", + source_fingerprint: "55a5374732e4174e33859cf415d22ac855cea3efe8d8ff78c6ee42c86d8fd5fb", + source_sub_asset_id: "material:0", + source_label: "pebble_bricks", + )), + inputs: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "metallic", + value: Float(1.0), + ), + ( + name: "roughness", + value: Float(1.0), + ), + ( + name: "emissive_color", + value: Color(( + r: 0.0, + g: 0.0, + b: 0.0, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(0.0), + ), + ( + name: "occlusion", + value: Float(1.0), + ), + ( + name: "uv_offset", + value: Vec2((0.0, 0.0)), + ), + ( + name: "uv_tiling", + value: Vec2((25.0, 25.0)), + ), + ( + name: "normal", + value: Float(1.0), + ), + ], + textures: [ + ( + name: "base_color", + texture: Some(( + asset_id: "d3b9bec5-c0ea-4f83-ad80-f9e2a8cb69ee", + sub_asset_id: "texture:source", + label: "pebble_bricks_diff_4k", + source_path: Some("assets/materials/textures/pebble_bricks_diff_4k.jpg"), + )), + channel: Rgba, + ), + ( + name: "normal", + texture: Some(( + asset_id: "7c5235a1-f5d7-4530-b29f-5ea075881df5", + sub_asset_id: "texture:source", + label: "pebble_bricks_nor_gl_4k", + source_path: Some("assets/materials/textures/pebble_bricks_nor_gl_4k.jpg"), + )), + channel: Rgb, + ), + ( + name: "occlusion", + texture: Some(( + asset_id: "25db6174-afcb-421f-8c1c-0c5ffde21b79", + sub_asset_id: "texture:source", + label: "pebble_bricks_arm_4k", + source_path: Some("assets/materials/textures/pebble_bricks_arm_4k.jpg"), + )), + channel: R, + ), + ( + name: "roughness", + texture: Some(( + asset_id: "25db6174-afcb-421f-8c1c-0c5ffde21b79", + sub_asset_id: "texture:source", + label: "pebble_bricks_arm_4k", + source_path: Some("assets/materials/textures/pebble_bricks_arm_4k.jpg"), + )), + channel: G, + ), + ( + name: "metallic", + texture: Some(( + asset_id: "25db6174-afcb-421f-8c1c-0c5ffde21b79", + sub_asset_id: "texture:source", + label: "pebble_bricks_arm_4k", + source_path: Some("assets/materials/textures/pebble_bricks_arm_4k.jpg"), + )), + channel: B, + ), + ( + name: "emissive_color", + texture: None, + channel: Rgb, + ), + ], + ), +) \ No newline at end of file diff --git a/assets/materials/pebble_bricks_4k.gltf b/assets/materials/pebble_bricks_4k.gltf new file mode 100644 index 0000000..6043300 --- /dev/null +++ b/assets/materials/pebble_bricks_4k.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abe2d69811650bf94f75867c72ea7c16734e0d5a6a07a4f36bef1cf347ec9120 +size 2788 diff --git a/assets/materials/surface_tint.ron b/assets/materials/surface_tint.ron index 3844b3a..e006ce7 100644 --- a/assets/materials/surface_tint.ron +++ b/assets/materials/surface_tint.ron @@ -1,71 +1,103 @@ ( - schema_version: 1, + schema_version: 2, label: "Surface Tint", - shader: Some("assets/shaders/surface_tint.shader.ron"), + shader: ( + kind: StandardLit, + schema_path: None, + shader_path: None, + ), shader_ref: None, render_state: ( alpha_mode: Opaque, alpha_cutoff: 0.5, - double_sided: false, + double_sided: true, ), - material: ( - shader: ( - kind: Custom, - schema_path: Some("assets/shaders/surface_tint.shader.ron"), - shader_path: Some("assets/shaders/surface_tint.wgsl"), - ), - base_color: ( - r: 0.12, - g: 0.42, - b: 0.95, - a: 1.0, - ), - metallic: 0.15, - roughness: 0.28, - emissive_color: ( - r: 0.02, - g: 0.08, - b: 0.25, - a: 1.0, - ), - emissive_intensity: 3.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: [ + inputs: ( + values: [ ( - name: "tint", + name: "base_color", value: Color(( - r: 0.12, - g: 0.42, - b: 0.95, + r: 0.0, + g: 0.0, + b: 0.0, a: 1.0, )), ), + ( + name: "metallic", + value: Float(0.32), + ), ( name: "roughness", value: Float(0.28), ), ( - name: "metallic", - value: Float(0.15), - ), - ( - name: "emissive", + name: "emissive_color", value: Color(( - r: 0.02, - g: 0.08, - b: 0.25, + r: 0.0, + g: 0.0, + b: 0.0, a: 1.0, )), ), ( name: "emissive_intensity", - value: Float(3.0), + value: Float(0.0), + ), + ( + name: "tint", + value: Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + )), + ), + ( + name: "emissive", + value: Color(( + r: 0.8786662, + g: 0.0, + b: 0.0, + a: 1.0, + )), + ), + ( + name: "occlusion", + value: Float(1.0), + ), + ], + textures: [ + ( + name: "base_color", + texture: None, + channel: Rgba, + ), + ( + name: "metallic", + texture: None, + channel: B, + ), + ( + name: "roughness", + texture: None, + channel: G, + ), + ( + name: "occlusion", + texture: None, + channel: R, + ), + ( + name: "normal", + texture: None, + channel: Rgb, + ), + ( + name: "emissive_color", + texture: None, + channel: Rgb, ), ], - textures: [], ), ) \ No newline at end of file diff --git a/assets/materials/surface_tint_instance.ron b/assets/materials/surface_tint_instance.ron index c0b16a2..a74a70a 100644 --- a/assets/materials/surface_tint_instance.ron +++ b/assets/materials/surface_tint_instance.ron @@ -1,5 +1,5 @@ ( - schema_version: 1, + schema_version: 2, label: "surface_tint Instance", base: (( asset_id: "d6cb4151-7124-4237-aaf9-f7f8abd5fb76", @@ -7,6 +7,31 @@ label: "surface_tint", source_path: Some("assets/materials/surface_tint.ron"), )), - parameters: [], - textures: [], + overrides: ( + values: [ + ( + name: "base_color", + value: Color(( + r: 0.82078725, + g: 0.04000172, + b: 0.04000172, + a: 1.0, + )), + ), + ( + name: "emissive_intensity", + value: Float(20000.0), + ), + ( + name: "tint", + value: Color(( + r: 0.32096356, + g: 0.32096356, + b: 0.32096356, + a: 1.0, + )), + ), + ], + textures: [], + ), ) \ No newline at end of file diff --git a/assets/materials/textures/pebble_bricks_arm_4k.jpg b/assets/materials/textures/pebble_bricks_arm_4k.jpg new file mode 100644 index 0000000..2c8ebc4 --- /dev/null +++ b/assets/materials/textures/pebble_bricks_arm_4k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c918907704ae266e2ccef6784be62e64de67833b3967b8acf41c833fcdc5b15 +size 16434309 diff --git a/assets/materials/textures/pebble_bricks_diff_4k.jpg b/assets/materials/textures/pebble_bricks_diff_4k.jpg new file mode 100644 index 0000000..9801ee9 --- /dev/null +++ b/assets/materials/textures/pebble_bricks_diff_4k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38993a7b7efb9c037d12b99bbb464c0b46ab9f1c1d0ab93e5370452b7d61498d +size 14259465 diff --git a/assets/materials/textures/pebble_bricks_nor_gl_4k.jpg b/assets/materials/textures/pebble_bricks_nor_gl_4k.jpg new file mode 100644 index 0000000..6c32003 --- /dev/null +++ b/assets/materials/textures/pebble_bricks_nor_gl_4k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:565457e7271e8546d938ec17505f9565a734769023c1cd0438524e727002bbbc +size 20424876 diff --git a/assets/meshes/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.static_mesh.ron b/assets/meshes/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.static_mesh.ron index a836a4e..806ebf6 100644 --- a/assets/meshes/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.static_mesh.ron +++ b/assets/meshes/generated/113f74df-e39c-41d4-9b5b-e48efe541f7f.static_mesh.ron @@ -17,7 +17,8 @@ lod0_only: true, placement_mode: SceneInstance, hierarchy_mode: SourceHierarchy, - material_policy: SourceMaterials, + material_slots: [], + orphaned_material_slots: [], ), metadata: ( mesh_count: 14, @@ -357,4 +358,4 @@ "Animations are recorded as metadata; animated placement uses SkinnedMeshRenderer.", "Skinned primitives are excluded from StaticMeshRenderer and use SkinnedMeshRenderer.", ], -) \ No newline at end of file +) diff --git a/assets/meshes/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.static_mesh.ron b/assets/meshes/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.static_mesh.ron new file mode 100644 index 0000000..e38d0d0 --- /dev/null +++ b/assets/meshes/generated/3076fad0-89ca-4307-b8d9-cb77fca41907.static_mesh.ron @@ -0,0 +1,193 @@ +( + schema_version: 4, + asset_id: "3076fad0-89ca-4307-b8d9-cb77fca41907", + label: "metal_office_desk_2k", + source: ( + path: "assets/models/metal_office_desk_2k.gltf", + format: "gltf", + fingerprint: ( + byte_len: 13510, + content_hash: "904f3af2a5283a08f60bcfb2651c5280f14f1232ec522154e4878e90909551ce", + ), + dependencies: [ + "assets/models/metal_office_desk.bin", + "assets/models/textures/metal_office_desk_arm_2k.jpg", + "assets/models/textures/metal_office_desk_diff_2k.jpg", + "assets/models/textures/metal_office_desk_nor_gl_2k.jpg", + ], + ), + import: ( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SingleActor, + material_slots: [], + orphaned_material_slots: [], + ), + metadata: ( + mesh_count: 9, + material_count: 1, + node_count: 9, + animation_count: 0, + skin_count: 0, + light_count: 0, + camera_count: 0, + ), + parts: [ + ( + id: "draw:scene0:node0:mesh0:primitive0", + name: "metal_office_desk_drawer_06 / Primitive 0", + mesh_label: "Mesh0/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_06"), + source_mesh: Some("Mesh0"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node1:mesh1:primitive0", + name: "metal_office_desk_tray_01 / Primitive 0", + mesh_label: "Mesh1/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_tray_01"), + source_mesh: Some("Mesh1"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node2:mesh2:primitive0", + name: "metal_office_desk / Primitive 0", + mesh_label: "Mesh2/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk"), + source_mesh: Some("Mesh2"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node3:mesh3:primitive0", + name: "metal_office_desk_drawer_04 / Primitive 0", + mesh_label: "Mesh3/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_04"), + source_mesh: Some("Mesh3"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node4:mesh4:primitive0", + name: "metal_office_desk_drawer_03 / Primitive 0", + mesh_label: "Mesh4/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_03"), + source_mesh: Some("Mesh4"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node5:mesh5:primitive0", + name: "metal_office_desk_drawer_05 / Primitive 0", + mesh_label: "Mesh5/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_05"), + source_mesh: Some("Mesh5"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node6:mesh6:primitive0", + name: "metal_office_desk_drawer_02 / Primitive 0", + mesh_label: "Mesh6/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_02"), + source_mesh: Some("Mesh6"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node7:mesh7:primitive0", + name: "metal_office_desk_drawer_01 / Primitive 0", + mesh_label: "Mesh7/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_01"), + source_mesh: Some("Mesh7"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node8:mesh8:primitive0", + name: "metal_office_desk_tray_02 / Primitive 0", + mesh_label: "Mesh8/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_tray_02"), + source_mesh: Some("Mesh8"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ], + warnings: [], +) diff --git a/assets/meshes/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.static_mesh.ron b/assets/meshes/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.static_mesh.ron new file mode 100644 index 0000000..a4d620c --- /dev/null +++ b/assets/meshes/generated/36c51ff3-29ae-4ab1-aaca-f90f57e27966.static_mesh.ron @@ -0,0 +1,249 @@ +( + schema_version: 4, + asset_id: "36c51ff3-29ae-4ab1-aaca-f90f57e27966", + label: "metal_office_desk_2k", + source: ( + path: "assets/Furniture/Office/metal_office_desk_2k.gltf", + format: "gltf", + fingerprint: ( + byte_len: 13500, + content_hash: "64fd91fbc603c9675f9c8b5f1291a654deff89b40aeb0a0b877b7b93f6ebf05e", + ), + dependencies: [ + "assets/Furniture/Office/metal_office_desk.bin", + "assets/Furniture/Office/textures/metal_office_desk_arm_2k.jpg", + "assets/Furniture/Office/textures/metal_office_desk_diff_2k.jpg", + "assets/Furniture/Office/textures/metal_office_desk_nor_gl_2k.jpg", + ], + ), + import: ( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SourceHierarchy, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node0:mesh0:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node1:mesh1:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node2:mesh2:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node3:mesh3:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node4:mesh4:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node5:mesh5:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node6:mesh6:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ( + slot_id: ("slot:draw:scene0:node7:mesh7:primitive0"), + selection: Project((( + asset_id: "647a63d4-64c6-4431-ba46-9efdd515cd8f", + sub_asset_id: "", + label: "metal_office_desk", + source_path: Some("assets/Furniture/Office/metal_office_desk.material.ron"), + ))), + ), + ], + orphaned_material_slots: [], + ), + metadata: ( + mesh_count: 9, + material_count: 1, + node_count: 9, + animation_count: 0, + skin_count: 0, + light_count: 0, + camera_count: 0, + ), + parts: [ + ( + id: "draw:scene0:node0:mesh0:primitive0", + name: "metal_office_desk_drawer_06 / Primitive 0", + mesh_label: "Mesh0/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_06"), + source_mesh: Some("Mesh0"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node1:mesh1:primitive0", + name: "metal_office_desk_tray_01 / Primitive 0", + mesh_label: "Mesh1/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_tray_01"), + source_mesh: Some("Mesh1"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node2:mesh2:primitive0", + name: "metal_office_desk / Primitive 0", + mesh_label: "Mesh2/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk"), + source_mesh: Some("Mesh2"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node3:mesh3:primitive0", + name: "metal_office_desk_drawer_04 / Primitive 0", + mesh_label: "Mesh3/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_04"), + source_mesh: Some("Mesh3"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node4:mesh4:primitive0", + name: "metal_office_desk_drawer_03 / Primitive 0", + mesh_label: "Mesh4/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_03"), + source_mesh: Some("Mesh4"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node5:mesh5:primitive0", + name: "metal_office_desk_drawer_05 / Primitive 0", + mesh_label: "Mesh5/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_05"), + source_mesh: Some("Mesh5"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node6:mesh6:primitive0", + name: "metal_office_desk_drawer_02 / Primitive 0", + mesh_label: "Mesh6/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_02"), + source_mesh: Some("Mesh6"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ( + id: "draw:scene0:node7:mesh7:primitive0", + name: "metal_office_desk_drawer_01 / Primitive 0", + mesh_label: "Mesh7/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "metal_office_desk", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("metal_office_desk_drawer_01"), + source_mesh: Some("Mesh7"), + source_material: Some("metal_office_desk"), + skinned: false, + ), + ], + warnings: [], +) diff --git a/assets/meshes/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.static_mesh.ron b/assets/meshes/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.static_mesh.ron index 4363ddd..813a13b 100644 --- a/assets/meshes/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.static_mesh.ron +++ b/assets/meshes/generated/3f63f359-45eb-4cb2-8970-71921cbd7bd0.static_mesh.ron @@ -17,7 +17,8 @@ lod0_only: true, placement_mode: StaticAsset, hierarchy_mode: SingleActor, - material_policy: SourceMaterials, + material_slots: [], + orphaned_material_slots: [], ), metadata: ( mesh_count: 14, @@ -357,4 +358,4 @@ "Animations are recorded as metadata; animated placement uses SkinnedMeshRenderer.", "Skinned primitives are excluded from StaticMeshRenderer and use SkinnedMeshRenderer.", ], -) \ No newline at end of file +) diff --git a/assets/meshes/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.static_mesh.ron b/assets/meshes/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.static_mesh.ron new file mode 100644 index 0000000..c644955 --- /dev/null +++ b/assets/meshes/generated/5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc.static_mesh.ron @@ -0,0 +1,361 @@ +( + schema_version: 4, + asset_id: "5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc", + label: "blacksite-m2-robot-expressive", + source: ( + path: "assets/Furniture/Office/blacksite-m2-robot-expressive.glb", + format: "glb", + fingerprint: ( + byte_len: 463988, + content_hash: "5869cb813e6a6093eda7af2824a9c13a582750e0443e88ce7c991a1f83415521", + ), + dependencies: [], + ), + import: ( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SingleActor, + material_slots: [], + orphaned_material_slots: [], + ), + metadata: ( + mesh_count: 14, + material_count: 3, + node_count: 74, + animation_count: 14, + skin_count: 2, + light_count: 0, + camera_count: 0, + ), + parts: [ + ( + id: "draw:scene0:node4:mesh0:primitive0", + name: "Foot.L / Primitive 0", + mesh_label: "Mesh0/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "Grey", + material_label: Some("Material0"), + local_transform: ( + translation: (0.62405795, 0.39766362, 0.19111444), + rotation: (0.7071068, 0.00000005228401, 0.000000015504241, -0.70710665), + scale: (100.0, 99.999985, 100.0), + ), + source_node: Some("RootNode/RobotArmature/Bone/Foot.L/Foot.L"), + source_mesh: Some("Mesh0"), + source_material: Some("Grey"), + skinned: false, + ), + ( + id: "draw:scene0:node7:mesh1:primitive0", + name: "Torso / Primitive 0", + mesh_label: "Mesh1/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "Grey", + material_label: Some("Material0"), + local_transform: ( + translation: (-0.0027156367, 2.1737509, -0.019581214), + rotation: (0.70710677, 0.000000000000031351603, 0.000000000000055267226, -0.7071067), + scale: (100.0, 99.99998, 99.99998), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Torso"), + source_mesh: Some("Mesh1"), + source_material: Some("Grey"), + skinned: false, + ), + ( + id: "draw:scene0:node7:mesh1:primitive1", + name: "Torso / Primitive 1", + mesh_label: "Mesh1/Primitive1", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (-0.0027156367, 2.1737509, -0.019581214), + rotation: (0.70710677, 0.000000000000031351603, 0.000000000000055267226, -0.7071067), + scale: (100.0, 99.99998, 99.99998), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Torso"), + source_mesh: Some("Mesh1"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node61:mesh10:primitive0", + name: "Leg.R / Primitive 0", + mesh_label: "Mesh10/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (-0.6746981, 1.1586236, 0.046261936), + rotation: (0.7693698, 0.080835514, 0.110868365, -0.6238942), + scale: (99.99999, 99.99886, 100.00024), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/UpperLeg.R/Leg.R"), + source_mesh: Some("Mesh10"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node63:mesh11:primitive0", + name: "LowerLeg.R / Primitive 0", + mesh_label: "Mesh11/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (-0.73626167, 0.34982973, 0.22594015), + rotation: (-0.65091395, -0.099058665, -0.09436109, 0.7467224), + scale: (99.99999, 99.998604, 100.00058), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/UpperLeg.R/LowerLeg.R/LowerLeg.R"), + source_mesh: Some("Mesh11"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node72:mesh12:primitive0", + name: "Hand.R / Primitive 0", + mesh_label: "Mesh12/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (-0.002715637, 2.3702974, -0.020994147), + rotation: (0.70710677, 0.0, 0.0, -0.7071067), + scale: (100.0, 99.99999, 99.99999), + ), + source_node: Some("RootNode/Hand.R"), + source_mesh: Some("Mesh12"), + source_material: Some("Main"), + skinned: true, + ), + ( + id: "draw:scene0:node72:mesh12:primitive1", + name: "Hand.R / Primitive 1", + mesh_label: "Mesh12/Primitive1", + material_id: Some("material:material0"), + material_slot_name: "Grey", + material_label: Some("Material0"), + local_transform: ( + translation: (-0.002715637, 2.3702974, -0.020994147), + rotation: (0.70710677, 0.0, 0.0, -0.7071067), + scale: (100.0, 99.99999, 99.99999), + ), + source_node: Some("RootNode/Hand.R"), + source_mesh: Some("Mesh12"), + source_material: Some("Grey"), + skinned: true, + ), + ( + id: "draw:scene0:node73:mesh13:primitive0", + name: "Hand.L / Primitive 0", + mesh_label: "Mesh13/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (-0.002715637, 2.3702974, -0.020994147), + rotation: (0.70710677, 0.0, 0.0, -0.7071067), + scale: (100.0, 99.99999, 99.99999), + ), + source_node: Some("RootNode/Hand.L"), + source_mesh: Some("Mesh13"), + source_material: Some("Main"), + skinned: true, + ), + ( + id: "draw:scene0:node73:mesh13:primitive1", + name: "Hand.L / Primitive 1", + mesh_label: "Mesh13/Primitive1", + material_id: Some("material:material0"), + material_slot_name: "Grey", + material_label: Some("Material0"), + local_transform: ( + translation: (-0.002715637, 2.3702974, -0.020994147), + rotation: (0.70710677, 0.0, 0.0, -0.7071067), + scale: (100.0, 99.99999, 99.99999), + ), + source_node: Some("RootNode/Hand.L"), + source_mesh: Some("Mesh13"), + source_material: Some("Grey"), + skinned: true, + ), + ( + id: "draw:scene0:node13:mesh2:primitive0", + name: "Head / Primitive 0", + mesh_label: "Mesh2/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "Grey", + material_label: Some("Material0"), + local_transform: ( + translation: (-0.05334633, 3.6175368, -0.0068152454), + rotation: (0.7249889, 0.0852804, 0.05460569, -0.6812757), + scale: (99.99997, 99.99996, 99.99997), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Neck/Head/Head"), + source_mesh: Some("Mesh2"), + source_material: Some("Grey"), + skinned: false, + ), + ( + id: "draw:scene0:node13:mesh2:primitive1", + name: "Head / Primitive 1", + mesh_label: "Mesh2/Primitive1", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (-0.05334633, 3.6175368, -0.0068152454), + rotation: (0.7249889, 0.0852804, 0.05460569, -0.6812757), + scale: (99.99997, 99.99996, 99.99997), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Neck/Head/Head"), + source_mesh: Some("Mesh2"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node13:mesh2:primitive2", + name: "Head / Primitive 2", + mesh_label: "Mesh2/Primitive2", + material_id: Some("material:material2"), + material_slot_name: "Black", + material_label: Some("Material2"), + local_transform: ( + translation: (-0.05334633, 3.6175368, -0.0068152454), + rotation: (0.7249889, 0.0852804, 0.05460569, -0.6812757), + scale: (99.99997, 99.99996, 99.99997), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Neck/Head/Head"), + source_mesh: Some("Mesh2"), + source_material: Some("Black"), + skinned: false, + ), + ( + id: "draw:scene0:node68:mesh3:primitive0", + name: "Foot.R / Primitive 0", + mesh_label: "Mesh3/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "Grey", + material_label: Some("Material0"), + local_transform: ( + translation: (-0.637997, 0.3976636, 0.19111452), + rotation: (0.70710677, 0.00000005201811, 0.000000015770217, -0.7071067), + scale: (100.0, 99.999985, 100.0), + ), + source_node: Some("RootNode/RobotArmature/Bone/Foot.R/Foot.R"), + source_mesh: Some("Mesh3"), + source_material: Some("Grey"), + skinned: false, + ), + ( + id: "draw:scene0:node16:mesh4:primitive0", + name: "Shoulder.L / Primitive 0", + mesh_label: "Mesh4/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (0.58268076, 2.3724597, -0.020994142), + rotation: (-0.59886926, 0.37597278, -0.37597266, 0.59886944), + scale: (99.99996, 99.999954, 99.99997), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/Shoulder.L"), + source_mesh: Some("Mesh4"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node18:mesh5:primitive0", + name: "Arm.L / Primitive 0", + mesh_label: "Mesh5/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (0.26500192, 2.8489676, 0.13069445), + rotation: (-0.5164575, 0.4218856, -0.32294926, 0.67155623), + scale: (99.99994, 99.99994, 99.99999), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.L/UpperArm.L/Arm.L"), + source_mesh: Some("Mesh5"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node36:mesh6:primitive0", + name: "Shoulder.R / Primitive 0", + mesh_label: "Mesh6/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (-0.6369861, 2.3718858, -0.020994166), + rotation: (0.6017577, 0.37133226, -0.37133226, -0.6017577), + scale: (99.999954, 99.99997, 99.99994), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/Shoulder.R"), + source_mesh: Some("Mesh6"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node38:mesh7:primitive0", + name: "Arm.R / Primitive 0", + mesh_label: "Mesh7/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (-0.82568955, 1.9825263, 0.040243305), + rotation: (0.6276481, 0.35463694, -0.3873087, -0.5747021), + scale: (22.70405, 22.704054, 22.704046), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/Hips/Abdomen/Torso/Shoulder.R/UpperArm.R/Arm.R"), + source_mesh: Some("Mesh7"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node56:mesh8:primitive0", + name: "Leg.L / Primitive 0", + mesh_label: "Mesh8/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (0.6488191, 1.1620699, 0.057466835), + rotation: (0.76387787, -0.05410902, -0.070370995, -0.6392268), + scale: (99.99999, 100.00079, 100.00024), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/UpperLeg.L/Leg.L"), + source_mesh: Some("Mesh8"), + source_material: Some("Main"), + skinned: false, + ), + ( + id: "draw:scene0:node58:mesh9:primitive0", + name: "LowerLeg.L / Primitive 0", + mesh_label: "Mesh9/Primitive0", + material_id: Some("material:material1"), + material_slot_name: "Main", + material_label: Some("Material1"), + local_transform: ( + translation: (0.68805873, 0.3497491, 0.23465614), + rotation: (-0.6547612, 0.06408298, 0.061960325, 0.7505613), + scale: (100.000015, 100.0006, 100.000496), + ), + source_node: Some("RootNode/RobotArmature/Bone/Body/UpperLeg.L/LowerLeg.L/LowerLeg.L"), + source_mesh: Some("Mesh9"), + source_material: Some("Main"), + skinned: false, + ), + ], + warnings: [ + "Animations are recorded as metadata; animated placement uses SkinnedMeshRenderer.", + "Skinned primitives are excluded from StaticMeshRenderer and use SkinnedMeshRenderer.", + ], +) diff --git a/assets/meshes/generated/b98ef565-3500-49e7-9935-f685fa9b2594.static_mesh.ron b/assets/meshes/generated/b98ef565-3500-49e7-9935-f685fa9b2594.static_mesh.ron index 7110e7d..15a4e35 100644 --- a/assets/meshes/generated/b98ef565-3500-49e7-9935-f685fa9b2594.static_mesh.ron +++ b/assets/meshes/generated/b98ef565-3500-49e7-9935-f685fa9b2594.static_mesh.ron @@ -21,7 +21,13 @@ lod0_only: true, placement_mode: StaticAsset, hierarchy_mode: SingleActor, - material_policy: AuthoringOverride, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node1:material0"), + selection: Default, + ), + ], + orphaned_material_slots: [], ), metadata: ( mesh_count: 1, diff --git a/assets/meshes/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.static_mesh.ron b/assets/meshes/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.static_mesh.ron new file mode 100644 index 0000000..5943ec1 --- /dev/null +++ b/assets/meshes/generated/bd495161-5ea8-48ef-b0db-5b1d57f33885.static_mesh.ron @@ -0,0 +1,67 @@ +( + schema_version: 4, + asset_id: "bd495161-5ea8-48ef-b0db-5b1d57f33885", + label: "pebble_bricks_4k", + source: ( + path: "assets/materials/pebble_bricks_4k.gltf", + format: "gltf", + fingerprint: ( + byte_len: 2788, + content_hash: "55a5374732e4174e33859cf415d22ac855cea3efe8d8ff78c6ee42c86d8fd5fb", + ), + dependencies: [ + "assets/materials/pebble_bricks.bin", + "assets/materials/textures/pebble_bricks_arm_4k.jpg", + "assets/materials/textures/pebble_bricks_diff_4k.jpg", + "assets/materials/textures/pebble_bricks_nor_gl_4k.jpg", + ], + ), + import: ( + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: StaticAsset, + hierarchy_mode: SingleActor, + material_slots: [ + ( + slot_id: ("slot:draw:scene0:node0:mesh0:primitive0"), + selection: Project((( + asset_id: "c07a5b05-f27d-46c6-8b8c-9de9cdd14720", + sub_asset_id: "", + label: "pebble_bricks", + source_path: Some("assets/materials/pebble_bricks.ron"), + ))), + ), + ], + orphaned_material_slots: [], + ), + metadata: ( + mesh_count: 1, + material_count: 1, + node_count: 1, + animation_count: 0, + skin_count: 0, + light_count: 0, + camera_count: 0, + ), + parts: [ + ( + id: "draw:scene0:node0:mesh0:primitive0", + name: "sphere_gltf / Primitive 0", + mesh_label: "Mesh0/Primitive0", + material_id: Some("material:material0"), + material_slot_name: "pebble_bricks", + material_label: Some("Material0"), + local_transform: ( + translation: (0.0, 0.0, 0.0), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: (1.0, 1.0, 1.0), + ), + source_node: Some("sphere_gltf"), + source_mesh: Some("Mesh0"), + source_material: Some("pebble_bricks"), + skinned: false, + ), + ], + warnings: [], +) diff --git a/assets/models/metal_office_desk.bin b/assets/models/metal_office_desk.bin new file mode 100644 index 0000000000000000000000000000000000000000..980289970a7587c50476a502a7f412317565e575 GIT binary patch literal 229700 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
9>@<}57JKKD1N%WDSm3x^+VS) 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 literal 0 HcmV?d00001 diff --git a/assets/models/metal_office_desk_2k.gltf b/assets/models/metal_office_desk_2k.gltf new file mode 100644 index 0000000..3fc15c9 --- /dev/null +++ b/assets/models/metal_office_desk_2k.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4323f2e6cae9abb82146449b45445ee9446068c5a9b2ca23e018503b3b0af035 +size 13510 diff --git a/assets/models/textures/metal_office_desk_arm_2k.jpg b/assets/models/textures/metal_office_desk_arm_2k.jpg new file mode 100644 index 0000000..7986b9c --- /dev/null +++ b/assets/models/textures/metal_office_desk_arm_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23c94b99aec8c9b105ff4d843ac41f229b0effb97abe921f0f8b506ccfd76952 +size 2724325 diff --git a/assets/models/textures/metal_office_desk_diff_2k.jpg b/assets/models/textures/metal_office_desk_diff_2k.jpg new file mode 100644 index 0000000..fe6aafc --- /dev/null +++ b/assets/models/textures/metal_office_desk_diff_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f5854edc8a7979ed4576b914c184bda64d7e6ee9969357738703be49118da30 +size 1787420 diff --git a/assets/models/textures/metal_office_desk_nor_gl_2k.jpg b/assets/models/textures/metal_office_desk_nor_gl_2k.jpg new file mode 100644 index 0000000..093cd80 --- /dev/null +++ b/assets/models/textures/metal_office_desk_nor_gl_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25392e7682c43ca07abbbbe717388b9e6d40bbca663836916204f99ac0378d34 +size 490814 diff --git a/assets/pebble_bricks_surface_instance.material-instance.ron b/assets/pebble_bricks_surface_instance.material-instance.ron new file mode 100644 index 0000000..d5513b2 --- /dev/null +++ b/assets/pebble_bricks_surface_instance.material-instance.ron @@ -0,0 +1,14 @@ +( + schema_version: 2, + label: "pebble_bricks Surface Instance", + base: (( + asset_id: "c07a5b05-f27d-46c6-8b8c-9de9cdd14720", + sub_asset_id: "material:source", + label: "pebble_bricks", + source_path: Some("assets/materials/pebble_bricks.ron"), + )), + overrides: ( + values: [], + textures: [], + ), +) \ No newline at end of file diff --git a/assets/prefabs/example_base.scn.ron b/assets/prefabs/example_base.scn.ron index e3f91e6..7fb81b2 100644 --- a/assets/prefabs/example_base.scn.ron +++ b/assets/prefabs/example_base.scn.ron @@ -1,4 +1,4 @@ -(schema_version: 4,resources: { +(schema_version: 6,resources: { }, entities: { 1: (components: { diff --git a/assets/prefabs/example_nested.scn.ron b/assets/prefabs/example_nested.scn.ron index a98c3c4..ccfb586 100644 --- a/assets/prefabs/example_nested.scn.ron +++ b/assets/prefabs/example_nested.scn.ron @@ -1,4 +1,4 @@ -(schema_version: 4,resources: { +(schema_version: 6,resources: { }, entities: { 1: (components: { diff --git a/assets/prefabs/example_variant.scn.ron b/assets/prefabs/example_variant.scn.ron index 58623bd..0502bfa 100644 --- a/assets/prefabs/example_variant.scn.ron +++ b/assets/prefabs/example_variant.scn.ron @@ -1,4 +1,4 @@ -(schema_version: 4,resources: { +(schema_version: 6,resources: { }, entities: { 1: (components: { diff --git a/assets/project.ron b/assets/project.ron index ca7e10d..b4dafc0 100644 --- a/assets/project.ron +++ b/assets/project.ron @@ -1,20 +1,22 @@ ( - version: 1, + version: 2, project_id: "blacksite-foundation", name: "Bevy FPS Foundation", project_kind: Game, - template_version: 1, - capabilities: ["editor", "gameplay", "rendering", "audio", "solari"], + template_version: 2, + capabilities: [ + "editor", + "gameplay", + "rendering", + "audio", + "solari", + ], default_level: "assets/levels/editor_scene.scn.ron", asset_roots: [ - "assets/audio", - "assets/models", - "assets/textures", - "assets/materials", - "assets/levels", + "assets", ], rendering: ( - gi_mode: Auto, + gi_mode: Forward, hdr: true, exposure_mode: Manual, exposure_ev100: 12.5, @@ -85,4 +87,4 @@ editor_look_sensitivity: 0.003, editor_pan_speed: 0.015, ), -) +) \ No newline at end of file diff --git a/assets/shaders/standard_lit.shader.ron b/assets/shaders/standard_lit.shader.ron index 02d4ca7..2a7f50a 100644 --- a/assets/shaders/standard_lit.shader.ron +++ b/assets/shaders/standard_lit.shader.ron @@ -1,73 +1,147 @@ ( - schema_version: 1, + schema_version: 2, label: "Standard Lit", kind: StandardLit, wgsl_path: None, - parameters: [ - ( - name: "base_color", - display_name: "Base Color", - group: "Surface", - property_type: Color, - ), - ( - name: "metallic", - display_name: "Metallic", - group: "Surface", - property_type: Float( - min: Some(0.0), - max: Some(1.0), + schema: ( + groups: [ + ( + id: "surface_inputs", + display_name: "Surface Inputs", + order: 0, + advanced: false, ), - ), - ( - name: "roughness", - display_name: "Roughness", - group: "Surface", - property_type: Float( - min: Some(0.0), - max: Some(1.0), + ( + id: "advanced_inputs", + display_name: "Advanced Inputs", + order: 100, + advanced: true, ), - ), - ( - name: "emissive_color", - display_name: "Emissive Color", - group: "Emission", - property_type: Color, - ), - ( - name: "emissive_intensity", - display_name: "Emissive Nits", - group: "Emission", - property_type: Float( - min: Some(0.0), - max: Some(20000.0), + ], + inputs: [ + ( + name: "base_color", + display_name: "Base Color", + group: "surface_inputs", + order: 0, + property_type: Color, + default_value: Some(Color(( + r: 0.8, + g: 0.8, + b: 0.8, + a: 1.0, + ))), + texture: Some(( + semantic: Color, + default_channel: Rgba, + allow_channel_override: false, + )), + tooltip: "Color multiplier applied to the base-color texture.", + advanced: false, ), - ), - ( - name: "base_color_texture", - display_name: "Base Color Texture", - group: "Textures", - property_type: Texture, - ), - ( - name: "normal_map_texture", - display_name: "Normal Map", - group: "Textures", - property_type: Texture, - ), - ( - name: "metallic_roughness_texture", - display_name: "Metallic/Roughness Texture", - group: "Textures", - property_type: Texture, - ), - ( - name: "emissive_texture", - display_name: "Emissive Texture", - group: "Textures", - property_type: Texture, - ), - ], - default_values: [], - default_textures: [], + ( + name: "metallic", + display_name: "Metallic", + group: "surface_inputs", + order: 10, + property_type: Float( + min: Some(0.0), + max: Some(1.0), + ), + default_value: Some(Float(0.0)), + texture: Some(( + semantic: Scalar, + default_channel: B, + allow_channel_override: true, + )), + tooltip: "Scalar multiplier; ARM/ORM uses the blue channel.", + advanced: false, + ), + ( + name: "roughness", + display_name: "Roughness", + group: "surface_inputs", + order: 20, + property_type: Float( + min: Some(0.0), + max: Some(1.0), + ), + default_value: Some(Float(0.65)), + texture: Some(( + semantic: Scalar, + default_channel: G, + allow_channel_override: true, + )), + tooltip: "Scalar multiplier; ARM/ORM uses the green channel.", + advanced: false, + ), + ( + name: "occlusion", + display_name: "Occlusion", + group: "surface_inputs", + order: 30, + property_type: Float( + min: Some(0.0), + max: Some(1.0), + ), + default_value: Some(Float(1.0)), + texture: Some(( + semantic: Scalar, + default_channel: R, + allow_channel_override: true, + )), + tooltip: "Ambient-occlusion strength; ARM/ORM uses the red channel.", + advanced: false, + ), + ( + name: "normal", + display_name: "Normal Map", + group: "surface_inputs", + order: 40, + property_type: Texture, + default_value: None, + texture: Some(( + semantic: Normal, + default_channel: Rgb, + allow_channel_override: false, + )), + tooltip: "", + advanced: false, + ), + ( + name: "emissive_color", + display_name: "Emissive", + group: "surface_inputs", + order: 50, + property_type: Color, + default_value: Some(Color(( + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + ))), + texture: Some(( + semantic: Color, + default_channel: Rgb, + allow_channel_override: false, + )), + tooltip: "Emissive color multiplied by the texture and intensity.", + advanced: false, + ), + ( + name: "emissive_intensity", + display_name: "Emissive Intensity", + group: "surface_inputs", + order: 60, + property_type: Float( + min: Some(0.0), + max: Some(50000.0), + ), + default_value: Some(Float(0.0)), + texture: None, + tooltip: "Emissive luminance multiplier in nits.", + advanced: false, + ), + ], + ), ) \ No newline at end of file diff --git a/assets/shaders/surface_tint.shader.ron b/assets/shaders/surface_tint.shader.ron index 6c346a3..2e64c77 100644 --- a/assets/shaders/surface_tint.shader.ron +++ b/assets/shaders/surface_tint.shader.ron @@ -1,80 +1,98 @@ ( - schema_version: 1, + schema_version: 2, label: "Surface Tint", kind: Custom, wgsl_path: Some("assets/shaders/surface_tint.wgsl"), - parameters: [ - ( - name: "tint", - display_name: "Tint", - group: "Surface", - property_type: Color, - ), - ( - name: "roughness", - display_name: "Roughness", - group: "Surface", - property_type: Float( - min: Some(0.001), - max: Some(1.0), + schema: ( + groups: [ + ( + id: "surface", + display_name: "Surface", + order: 0, + advanced: false, ), - ), - ( - name: "metallic", - display_name: "Metallic", - group: "Surface", - property_type: Float( - min: Some(0.0), - max: Some(1.0), + ( + id: "emission", + display_name: "Emission", + order: 1, + advanced: false, ), - ), - ( - name: "emissive", - display_name: "Emissive", - group: "Emission", - property_type: Color, - ), - ( - name: "emissive_intensity", - display_name: "Emissive Nits", - group: "Emission", - property_type: Float( - min: Some(0.0), - max: Some(20000.0), + ], + inputs: [ + ( + name: "tint", + display_name: "Tint", + group: "surface", + order: 0, + property_type: Color, + default_value: Some(Color(( + r: 0.12, + g: 0.42, + b: 0.95, + a: 1.0, + ))), + texture: None, + tooltip: "", + advanced: false, ), - ), - ], - default_values: [ - ( - name: "tint", - value: Color(( - r: 0.12, - g: 0.42, - b: 0.95, - a: 1.0, - )), - ), - ( - name: "roughness", - value: Float(0.28), - ), - ( - name: "metallic", - value: Float(0.15), - ), - ( - name: "emissive", - value: Color(( - r: 0.02, - g: 0.08, - b: 0.25, - a: 1.0, - )), - ), - ( - name: "emissive_intensity", - value: Float(3.0), - ), - ], - default_textures: [], + ( + name: "roughness", + display_name: "Roughness", + group: "surface", + order: 1, + property_type: Float( + min: Some(0.001), + max: Some(1.0), + ), + default_value: Some(Float(0.28)), + texture: None, + tooltip: "", + advanced: false, + ), + ( + name: "metallic", + display_name: "Metallic", + group: "surface", + order: 2, + property_type: Float( + min: Some(0.0), + max: Some(1.0), + ), + default_value: Some(Float(0.15)), + texture: None, + tooltip: "", + advanced: false, + ), + ( + name: "emissive", + display_name: "Emissive", + group: "emission", + order: 3, + property_type: Color, + default_value: Some(Color(( + r: 0.02, + g: 0.08, + b: 0.25, + a: 1.0, + ))), + texture: None, + tooltip: "", + advanced: false, + ), + ( + name: "emissive_intensity", + display_name: "Emissive Nits", + group: "emission", + order: 4, + property_type: Float( + min: Some(0.0), + max: Some(20000.0), + ), + default_value: Some(Float(3.0)), + texture: None, + tooltip: "", + advanced: false, + ), + ], + ), ) \ No newline at end of file diff --git a/assets/shaders/unlit.shader.ron b/assets/shaders/unlit.shader.ron index bf04d97..578b048 100644 --- a/assets/shaders/unlit.shader.ron +++ b/assets/shaders/unlit.shader.ron @@ -1,37 +1,81 @@ ( - schema_version: 1, + schema_version: 2, label: "Unlit", kind: Unlit, wgsl_path: None, - parameters: [ - ( - name: "base_color", - display_name: "Base Color", - group: "Surface", - property_type: Color, - ), - ( - name: "base_color_texture", - display_name: "Base Color Texture", - group: "Textures", - property_type: Texture, - ), - ( - name: "emissive_color", - display_name: "Emissive Color", - group: "Emission", - property_type: Color, - ), - ( - name: "emissive_intensity", - display_name: "Emissive Nits", - group: "Emission", - property_type: Float( - min: Some(0.0), - max: Some(20000.0), + schema: ( + groups: [ + ( + id: "surface", + display_name: "Surface", + order: 0, + advanced: false, ), - ), - ], - default_values: [], - default_textures: [], + ( + id: "textures", + display_name: "Textures", + order: 1, + advanced: false, + ), + ( + id: "emission", + display_name: "Emission", + order: 2, + advanced: false, + ), + ], + inputs: [ + ( + name: "base_color", + display_name: "Base Color", + group: "surface", + order: 0, + property_type: Color, + default_value: None, + texture: None, + tooltip: "", + advanced: false, + ), + ( + name: "base_color_texture", + display_name: "Base Color Texture", + group: "textures", + order: 1, + property_type: Texture, + default_value: None, + texture: Some(( + semantic: Mask, + default_channel: Rgba, + allow_channel_override: true, + )), + tooltip: "", + advanced: false, + ), + ( + name: "emissive_color", + display_name: "Emissive Color", + group: "emission", + order: 2, + property_type: Color, + default_value: None, + texture: None, + tooltip: "", + advanced: false, + ), + ( + name: "emissive_intensity", + display_name: "Emissive Nits", + group: "emission", + order: 3, + property_type: Float( + min: Some(0.0), + max: Some(20000.0), + ), + default_value: None, + texture: None, + tooltip: "", + advanced: false, + ), + ], + ), ) \ No newline at end of file diff --git a/assets/textures/metal_office_desk_arm_2k.jpg b/assets/textures/metal_office_desk_arm_2k.jpg new file mode 100644 index 0000000..7986b9c --- /dev/null +++ b/assets/textures/metal_office_desk_arm_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23c94b99aec8c9b105ff4d843ac41f229b0effb97abe921f0f8b506ccfd76952 +size 2724325 diff --git a/assets/textures/metal_office_desk_diff_2k.jpg b/assets/textures/metal_office_desk_diff_2k.jpg new file mode 100644 index 0000000..fe6aafc --- /dev/null +++ b/assets/textures/metal_office_desk_diff_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f5854edc8a7979ed4576b914c184bda64d7e6ee9969357738703be49118da30 +size 1787420 diff --git a/assets/textures/metal_office_desk_nor_gl_2k.jpg b/assets/textures/metal_office_desk_nor_gl_2k.jpg new file mode 100644 index 0000000..093cd80 --- /dev/null +++ b/assets/textures/metal_office_desk_nor_gl_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25392e7682c43ca07abbbbe717388b9e6d40bbca663836916204f99ac0378d34 +size 490814 diff --git a/crates/blacksite_surface/src/lib.rs b/crates/blacksite_surface/src/lib.rs index 43b9276..80952cd 100644 --- a/crates/blacksite_surface/src/lib.rs +++ b/crates/blacksite_surface/src/lib.rs @@ -3,8 +3,10 @@ //! The authoring layer persists named values. This crate validates and packs them into a fixed GPU //! contract and supplies the same surface evaluator source to raster and Solari integrations. -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::fs; +use std::hash::{DefaultHasher, Hash, Hasher}; +use std::path::Path; use bevy::material::OpaqueRendererMethod; use bevy::mesh::MeshVertexBufferLayoutRef; @@ -16,1080 +18,91 @@ use bevy::render::extract_resource::ExtractResource; use bevy::render::render_resource::{ AsBindGroup, RenderPipelineDescriptor, ShaderType, SpecializedMeshPipelineError, }; -use bevy::shader::{Shader, ShaderRef}; +use bevy::shader::{Shader, ShaderDefVal, ShaderRef}; use shared::{ - asset_server_path, material_from_desc, HydratedRendererMaterialBinding, - HydratedTerrainMaterialBinding, MaterialAsset, MaterialDesc, MaterialInstanceAsset, - MaterialParameterValue, MaterialRef, ShaderPropertyType, ShaderSchemaAsset, + asset_server_path, HydratedMaterialSelection, HydratedMaterialSlotBinding, + HydratedTerrainMaterialBinding, MaterialAsset, MaterialDesc, MaterialInputSet, + MaterialInstanceAsset, MaterialParameterValue, MaterialPropertyBlock, MaterialPropertyBlocks, + MaterialRef, RuntimeContentCatalog, ShaderPropertyType, ShaderSchemaAsset, TerrainMaterialLayer, MATERIAL_INSTANCE_SCHEMA_VERSION, TERRAIN_MATERIAL_LAYER_LIMIT, }; +mod live_documents; +pub use live_documents::*; + pub const SURFACE_ABI_VERSION: u32 = 1; pub const SURFACE_PARAMETER_LANES: usize = 16; pub const SURFACE_TEXTURE_SLOTS: usize = 8; pub const DEFAULT_SURFACE_SHADER_PATH: &str = "shaders/blacksite_surface.wgsl"; pub const TERRAIN_LAYER_SHADER_PATH: &str = "shaders/terrain_layers.wgsl"; - -#[derive(ShaderType, Reflect, Debug, Clone, Copy, PartialEq)] -pub struct TerrainLayerUniform { - pub base_colors: [Vec4; TERRAIN_MATERIAL_LAYER_LIMIT], - /// Metallic, perceptual roughness, normal-map enabled, layer enabled. - pub properties: [Vec4; TERRAIN_MATERIAL_LAYER_LIMIT], - pub uv_scales: Vec4, - pub base_texture_enabled: Vec4, +pub const DEFAULT_GRID_SHADER_ID: u32 = 0xffff_ff01; +pub const DEFAULT_GRID_LABEL: &str = "Default Grid — Engine Built-in"; +const DEFAULT_GRID_SHADER_UUID: uuid::Uuid = + uuid::Uuid::from_u128(0x3420_f5ad_551c_4bd6_a902_5f8a_5ce5_9f01); +const DEFAULT_GRID_EVALUATOR: &str = r#" +fn grid_axis(position: vec2) -> f32 { + let cell = floor(position / 0.5); + let checker = (cell.x + cell.y) - 2.0 * floor((cell.x + cell.y) * 0.5); + let major_cell = floor(position / 4.0); + let major = (major_cell.x + major_cell.y) - 2.0 * floor((major_cell.x + major_cell.y) * 0.5); + return checker * 0.72 + major * 0.28; } -impl Default for TerrainLayerUniform { - fn default() -> Self { - Self { - base_colors: [Vec4::ONE; TERRAIN_MATERIAL_LAYER_LIMIT], - properties: [Vec4::new(0.0, 0.9, 0.0, 0.0); TERRAIN_MATERIAL_LAYER_LIMIT], - uv_scales: Vec4::splat(8.0), - base_texture_enabled: Vec4::ZERO, - } - } -} - -#[derive(Asset, AsBindGroup, Reflect, Debug, Clone, Default)] -pub struct TerrainLayerExtension { - #[uniform(100)] - pub uniform: TerrainLayerUniform, - #[texture(101)] - #[sampler(102)] - pub base_color0: Option>, - #[texture(103)] - #[sampler(104)] - pub normal0: Option>, - #[texture(105)] - #[sampler(106)] - pub base_color1: Option>, - #[texture(107)] - #[sampler(108)] - pub normal1: Option>, - #[texture(109)] - #[sampler(110)] - pub base_color2: Option>, - #[texture(111)] - #[sampler(112)] - pub normal2: Option>, - #[texture(113)] - #[sampler(114)] - pub base_color3: Option>, - #[texture(115)] - #[sampler(116)] - pub normal3: Option>, -} - -impl MaterialExtension for TerrainLayerExtension { - fn fragment_shader() -> ShaderRef { - TERRAIN_LAYER_SHADER_PATH.into() - } - - fn deferred_fragment_shader() -> ShaderRef { - TERRAIN_LAYER_SHADER_PATH.into() - } -} - -pub type TerrainLayerMaterial = ExtendedMaterial; - -#[derive(Debug, Clone)] -struct TerrainLayerCacheEntry { - layers: Vec, - handle: Handle, - revision: u64, -} - -#[derive(Resource, Default)] -struct TerrainLayerMaterialCache(HashMap); - -type TerrainMaterialBindings<'w, 's> = - Query<'w, 's, (Entity, &'static HydratedTerrainMaterialBinding)>; - -#[derive(ShaderType, Reflect, Debug, Clone, Copy, PartialEq)] -pub struct SurfaceUniform { - pub shader_id: u32, - pub flags: u32, - pub alpha_cutoff: f32, - pub abi_version: u32, - pub params: [Vec4; SURFACE_PARAMETER_LANES], - pub uv_transforms: [Vec4; SURFACE_TEXTURE_SLOTS], -} - -impl Default for SurfaceUniform { - fn default() -> Self { - Self { - shader_id: 0, - flags: 0, - alpha_cutoff: 0.5, - abi_version: SURFACE_ABI_VERSION, - params: [Vec4::ZERO; SURFACE_PARAMETER_LANES], - uv_transforms: [Vec4::new(1.0, 1.0, 0.0, 0.0); SURFACE_TEXTURE_SLOTS], - } - } -} - -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub struct SurfaceExtensionKey { - shader: AssetId, -} - -impl From<&SurfaceExtension> for SurfaceExtensionKey { - fn from(extension: &SurfaceExtension) -> Self { - Self { - shader: extension.shader.id(), - } - } -} - -#[derive(Asset, AsBindGroup, Reflect, Debug, Clone, Default)] -#[bind_group_data(SurfaceExtensionKey)] -pub struct SurfaceExtension { - #[uniform(100)] - pub uniform: SurfaceUniform, - #[texture(101)] - #[sampler(102)] - pub texture0: Option>, - #[texture(103)] - #[sampler(104)] - pub texture1: Option>, - #[texture(105)] - #[sampler(106)] - pub texture2: Option>, - #[texture(107)] - #[sampler(108)] - pub texture3: Option>, - #[texture(109)] - #[sampler(110)] - pub texture4: Option>, - #[texture(111)] - #[sampler(112)] - pub texture5: Option>, - #[texture(113)] - #[sampler(114)] - pub texture6: Option>, - #[texture(115)] - #[sampler(116)] - pub texture7: Option>, - #[reflect(ignore)] - pub shader: Handle, -} - -impl SurfaceExtension { - pub fn set_texture(&mut self, index: usize, handle: Option>) { - match index { - 0 => self.texture0 = handle, - 1 => self.texture1 = handle, - 2 => self.texture2 = handle, - 3 => self.texture3 = handle, - 4 => self.texture4 = handle, - 5 => self.texture5 = handle, - 6 => self.texture6 = handle, - 7 => self.texture7 = handle, - _ => {} - } - } -} - -impl MaterialExtension for SurfaceExtension { - fn fragment_shader() -> ShaderRef { - DEFAULT_SURFACE_SHADER_PATH.into() - } - - fn deferred_fragment_shader() -> ShaderRef { - DEFAULT_SURFACE_SHADER_PATH.into() - } - - fn specialize( - _pipeline: &MaterialExtensionPipeline, - descriptor: &mut RenderPipelineDescriptor, - _layout: &MeshVertexBufferLayoutRef, - key: MaterialExtensionKey, - ) -> Result<(), SpecializedMeshPipelineError> { - if let (AssetId::Uuid { uuid }, Some(fragment)) = - (key.bind_group_data.shader, descriptor.fragment.as_mut()) - { - fragment.shader = Handle::Uuid(uuid, Default::default()); - } - Ok(()) - } -} - -pub type SurfaceMaterial = ExtendedMaterial; - -#[derive(Resource, Default)] -pub struct SurfaceMaterialCache { - handles: HashMap>, - standard_handles: HashMap>, - revisions: HashMap, - standard_only: HashMap, - dependencies: HashMap>, - failed_revisions: HashMap, -} - -enum BuiltRendererMaterial { - Standard(Box), - Surface(Box), -} - -#[derive(Resource, Default, Debug, Clone)] -pub struct SurfaceDiagnostics(pub Vec); - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct SurfaceEvaluatorRecord { - pub shader_id: u32, - pub evaluator_source: String, - pub revision: u64, - pub alpha_mode: shared::MaterialAlphaMode, -} - -/// Active, validated evaluator generation consumed by both raster and Solari render worlds. -#[derive(Resource, ExtractResource, Default, Debug, Clone)] -pub struct SurfaceEvaluatorRegistry { - pub evaluators: HashMap, -} - -pub struct SurfaceMaterialPlugin; - -impl Plugin for SurfaceMaterialPlugin { - fn build(&self, app: &mut App) { - app.add_plugins(MaterialPlugin::::default()) - .add_plugins(MaterialPlugin::::default()) - .init_resource::() - .init_resource::() - .init_resource::() - .init_resource::() - .add_systems( - Update, - ( - sync_surface_material_bindings, - sync_terrain_layer_material_bindings, - ), - ); - } -} - -fn sync_terrain_layer_material_bindings( - mut commands: Commands, - asset_server: Res, - mut materials: ResMut>, - mut cache: ResMut, - mut diagnostics: ResMut, - bindings: TerrainMaterialBindings, -) { - for (entity, binding) in &bindings { - if binding.layers.is_empty() { - continue; - } - let revision = terrain_layer_revision(&binding.layers); - let cached = cache - .0 - .get(&binding.owner) - .filter(|entry| entry.layers == binding.layers && entry.revision == revision) - .map(|entry| entry.handle.clone()); - let handle = cached.unwrap_or_else(|| { - let material = - build_terrain_layer_material(&asset_server, &binding.layers, &mut diagnostics.0); - let handle = cache - .0 - .get(&binding.owner) - .map(|entry| entry.handle.clone()) - .filter(|handle| { - materials - .get_mut(handle) - .map(|mut slot| { - *slot = material.clone(); - }) - .is_some() - }) - .unwrap_or_else(|| materials.add(material)); - cache.0.insert( - binding.owner, - TerrainLayerCacheEntry { - layers: binding.layers.clone(), - handle: handle.clone(), - revision, - }, - ); - handle - }); - queue_terrain_material_binding(&mut commands, entity, handle); - } -} - -fn queue_terrain_material_binding( - commands: &mut Commands, - entity: Entity, - handle: Handle, -) { - // Generated render entities can be removed by a scene switch after this system's query - // but before deferred commands apply. That lifecycle race is expected and must not abort - // the editor while opening another scene. - commands - .entity(entity) - .try_remove::>() - .try_insert(MeshMaterial3d(handle)); -} - -fn terrain_layer_revision(layers: &[TerrainMaterialLayer]) -> u64 { - let mut dependencies = layers - .iter() - .filter_map(|layer| layer.material.as_ref()) - .filter_map(|reference| reference.source_path.as_deref()) - .flat_map(|path| material_dependency_paths(path).unwrap_or_else(|_| vec![path.to_string()])) - .collect::>(); - dependencies.sort(); - dependencies.dedup(); - dependency_revision(&dependencies) -} - -fn build_terrain_layer_material( - asset_server: &AssetServer, - layers: &[TerrainMaterialLayer], - diagnostics: &mut Vec, -) -> TerrainLayerMaterial { - let mut extension = TerrainLayerExtension::default(); - for (index, layer) in layers.iter().take(TERRAIN_MATERIAL_LAYER_LIMIT).enumerate() { - extension.uniform.uv_scales[index] = layer.uv_scale; - let desc = resolve_terrain_layer(layer, index, diagnostics); - let color = desc.base_color.to_color().to_linear(); - extension.uniform.base_colors[index] = - Vec4::new(color.red, color.green, color.blue, color.alpha); - extension.uniform.properties[index] = Vec4::new( - desc.metallic, - desc.roughness, - f32::from(desc.normal_map_texture.is_some()), - 1.0, - ); - extension.uniform.base_texture_enabled[index] = - f32::from(desc.base_color_texture.is_some()); - let base_color = desc - .base_color_texture - .as_deref() - .map(|path| asset_server.load(asset_server_path(path))); - let normal = desc - .normal_map_texture - .as_deref() - .map(|path| asset_server.load(asset_server_path(path))); - match index { - 0 => { - extension.base_color0 = base_color; - extension.normal0 = normal; - } - 1 => { - extension.base_color1 = base_color; - extension.normal1 = normal; - } - 2 => { - extension.base_color2 = base_color; - extension.normal2 = normal; - } - 3 => { - extension.base_color3 = base_color; - extension.normal3 = normal; - } - _ => {} - } - } - TerrainLayerMaterial { - base: StandardMaterial { - base_color: Color::WHITE, - perceptual_roughness: 1.0, - // Terrain is intentionally absent from the Solari acceleration structure until its - // ray-tracing evaluator exists, so keep the layer blend in the raster forward pass. - opaque_render_method: OpaqueRendererMethod::Forward, - ..default() - }, - extension, - } -} - -fn resolve_terrain_layer( - layer: &TerrainMaterialLayer, - index: usize, - diagnostics: &mut Vec, -) -> MaterialDesc { - let Some(reference) = layer.material.as_ref() else { - diagnostics.push(format!( - "terrain material layer {} is unassigned; using visible fallback", - index + 1 - )); - return terrain_layer_fallback(); - }; - let Some(path) = reference.source_path.as_deref() else { - diagnostics.push(format!( - "terrain material layer {} ({}) has no loadable source path; using visible fallback", - index + 1, - reference.label - )); - return terrain_layer_fallback(); - }; - match shared::load_resolved_material_from_path(path) { - Ok((desc, _)) => desc, - Err(error) => { - diagnostics.push(format!( - "terrain material layer {} ({}) could not resolve: {error}; using visible fallback", - index + 1, - reference.label - )); - terrain_layer_fallback() - } - } -} - -fn terrain_layer_fallback() -> MaterialDesc { - MaterialDesc { - base_color: shared::ColorDesc::srgb(0.24, 0.29, 0.25), - roughness: 0.92, - ..Default::default() - } -} - -#[allow(clippy::too_many_arguments, clippy::type_complexity)] -fn sync_surface_material_bindings( - mut commands: Commands, - asset_server: Res, - mut shaders: ResMut>, - mut standard_materials: ResMut>, - mut surface_materials: ResMut>, - mut cache: ResMut, - mut diagnostics: ResMut, - mut evaluator_registry: ResMut, - bindings: Query<( - Entity, - &HydratedRendererMaterialBinding, - Option<&MeshMaterial3d>, - Option<&MeshMaterial3d>, - )>, -) { - for (entity, binding, standard_handle, surface_handle) in &bindings { - let Some(reference) = binding.effective_material.as_ref() else { - continue; - }; - let Some(path) = reference.0.source_path.as_deref() else { - continue; - }; - let dependencies = cache - .dependencies - .get(reference) - .cloned() - .unwrap_or_else(|| vec![path.to_string()]); - let revision = dependency_revision(&dependencies); - if cache.failed_revisions.get(reference) == Some(&revision) { - continue; - } - if cache.standard_only.get(reference) == Some(&revision) { - if let Some(handle) = cache.standard_handles.get(reference).cloned() { - if standard_handle.is_none_or(|current| current.0 != handle) - || surface_handle.is_some() - { - commands - .entity(entity) - .try_remove::>() - .try_insert(MeshMaterial3d(handle)); - } - } - continue; - } - let stale = cache.revisions.get(reference) != Some(&revision); - let handle = if !stale { - cache.handles.get(reference).cloned() - } else { - None - }; - let handle = match handle { - Some(handle) => handle, - None => match build_surface_material( - reference, - path, - &asset_server, - &mut shaders, - &mut standard_materials, - standard_handle, - &mut evaluator_registry, - ) { - Ok(BuiltRendererMaterial::Surface(material)) => { - let material = *material; - cache.standard_only.remove(reference); - cache.standard_handles.remove(reference); - cache.failed_revisions.remove(reference); - if let Some(existing) = cache.handles.get(reference).cloned() { - if let Some(mut slot) = surface_materials.get_mut(&existing) { - *slot = material; - } - existing - } else { - let handle = surface_materials.add(material); - cache.handles.insert(reference.clone(), handle.clone()); - handle - } - } - Ok(BuiltRendererMaterial::Standard(material)) => { - let material = *material; - // Plain Material assets stay on Bevy's StandardMaterial path, while still - // sharing one live-updated handle across every renderer slot. - let handle = standard_handle - .map(|handle| handle.0.clone()) - .or_else(|| cache.standard_handles.get(reference).cloned()) - .unwrap_or_else(|| standard_materials.add(material.clone())); - if let Some(mut slot) = standard_materials.get_mut(&handle) { - *slot = material; - } - cache.handles.remove(reference); - cache.revisions.remove(reference); - cache - .standard_handles - .insert(reference.clone(), handle.clone()); - let next_dependencies = - material_dependency_paths(path).unwrap_or_else(|_| vec![path.to_string()]); - let next_revision = dependency_revision(&next_dependencies); - cache - .dependencies - .insert(reference.clone(), next_dependencies); - cache.standard_only.insert(reference.clone(), next_revision); - cache.failed_revisions.remove(reference); - evaluator_registry - .evaluators - .remove(&stable_shader_id(reference)); - if standard_handle.is_none_or(|current| current.0 != handle) - || surface_handle.is_some() - { - commands - .entity(entity) - .try_remove::>() - .try_insert(MeshMaterial3d(handle)); - } - continue; - } - Err(error) => { - cache.failed_revisions.insert(reference.clone(), revision); - diagnostics.0.push(format!( - "material {} could not build Surface ABI: {error}", - reference.0.label - )); - continue; - } - }, - }; - let next_dependencies = - material_dependency_paths(path).unwrap_or_else(|_| vec![path.to_string()]); - let next_revision = dependency_revision(&next_dependencies); - cache - .dependencies - .insert(reference.clone(), next_dependencies); - cache.revisions.insert(reference.clone(), next_revision); - if surface_handle.is_none_or(|current| current.0 != handle) { - commands - .entity(entity) - .try_remove::>() - .try_insert(MeshMaterial3d(handle)); - } - } -} - -fn build_surface_material( - reference: &MaterialRef, - path: &str, - asset_server: &AssetServer, - shaders: &mut Assets, - standard_materials: &mut Assets, - existing_standard: Option<&MeshMaterial3d>, - evaluator_registry: &mut SurfaceEvaluatorRegistry, -) -> Result { - let (mut asset, instance) = match MaterialAsset::load_from_path(path) { - Ok(asset) => (asset, None), - Err(_) => { - let instance = MaterialInstanceAsset::load_from_path(path)?; - if instance.schema_version != MATERIAL_INSTANCE_SCHEMA_VERSION { - return Err(format!( - "unsupported material-instance schema {}", - instance.schema_version - )); - } - let base_path = instance - .base - .0 - .source_path - .as_deref() - .ok_or_else(|| "material instance base has no loadable path".to_string())?; - (MaterialAsset::load_from_path(base_path)?, Some(instance)) - } - }; - if let Some(instance) = instance.as_ref() { - instance.apply_to(&mut asset.material); - } - let schema_path = asset - .shader_ref - .as_ref() - .and_then(|reference| reference.source_path.as_deref()) - .or(asset.material.shader.schema_path.as_deref()) - .or(asset - .shader - .as_deref() - .filter(|path| path.ends_with(".ron"))); - let schema = schema_path - .map(ShaderSchemaAsset::load_from_path) - .transpose()?; - let evaluator_source = schema - .as_ref() - .and_then(|schema| schema.wgsl_path.as_deref()) - .map(fs::read_to_string) - .transpose() - .map_err(|error| format!("could not read surface WGSL: {error}"))?; - - let mut base = existing_standard - .and_then(|handle| standard_materials.get(&handle.0).cloned()) - .unwrap_or_else(|| material_from_desc(asset_server, &asset.material)); - base.alpha_mode = match asset.render_state.alpha_mode { - shared::MaterialAlphaMode::Opaque => AlphaMode::Opaque, - shared::MaterialAlphaMode::Cutout => AlphaMode::Mask(asset.render_state.alpha_cutoff), - }; - base.cull_mode = - (!asset.render_state.double_sided).then_some(bevy::render::render_resource::Face::Back); - - let Some(evaluator) = evaluator_source.as_deref() else { - return Ok(BuiltRendererMaterial::Standard(Box::new(base))); - }; - validate_surface_evaluator(evaluator)?; - let runtime_shader_id = stable_shader_id(reference); - evaluator_registry.evaluators.insert( - runtime_shader_id, - SurfaceEvaluatorRecord { - shader_id: runtime_shader_id, - evaluator_source: evaluator.to_string(), - revision: evaluator_revision(evaluator), - alpha_mode: asset.render_state.alpha_mode, - }, - ); - let virtual_path = format!("generated://surface/{}.wgsl", reference.0.asset_id); - let shader_uuid = shader_uuid_for_material(reference); - let shader_id = AssetId::::Uuid { uuid: shader_uuid }; - shaders - .insert( - shader_id, - Shader::from_wgsl(compose_surface_shader(evaluator), virtual_path), - ) - .map_err(|error| format!("could not replace generated surface shader: {error}"))?; - let shader = Handle::Uuid(shader_uuid, Default::default()); - - let mut extension = SurfaceExtension { - shader, - ..default() - }; - extension.uniform.alpha_cutoff = asset.render_state.alpha_cutoff; - extension.uniform.shader_id = runtime_shader_id; - if let Some(schema) = schema.as_ref() { - pack_schema_values( - &mut extension, - schema, - &asset.material, - instance.as_ref(), - asset_server, - )?; - } - Ok(BuiltRendererMaterial::Surface(Box::new(ExtendedMaterial { - base, - extension, - }))) -} - -fn material_dependency_paths(path: &str) -> Result, String> { - let mut dependencies = vec![path.to_string()]; - let asset = match MaterialAsset::load_from_path(path) { - Ok(asset) => asset, - Err(_) => { - let instance = MaterialInstanceAsset::load_from_path(path)?; - let base_path = instance - .base - .0 - .source_path - .as_deref() - .ok_or_else(|| "material instance base has no loadable path".to_string())?; - dependencies.push(base_path.to_string()); - MaterialAsset::load_from_path(base_path)? - } - }; - let schema_path = asset - .shader_ref - .as_ref() - .and_then(|reference| reference.source_path.as_deref()) - .or(asset.material.shader.schema_path.as_deref()) - .or(asset - .shader - .as_deref() - .filter(|path| path.ends_with(".ron"))); - if let Some(schema_path) = schema_path { - dependencies.push(schema_path.to_string()); - if let Some(wgsl_path) = ShaderSchemaAsset::load_from_path(schema_path)?.wgsl_path { - dependencies.push(wgsl_path); - } - } - dependencies.sort(); - dependencies.dedup(); - Ok(dependencies) -} - -fn dependency_revision(paths: &[String]) -> u64 { - let mut hash = 0xcbf29ce484222325u64; - for path in paths { - for byte in path.bytes() { - hash ^= u64::from(byte); - hash = hash.wrapping_mul(0x100000001b3); - } - match fs::metadata(path) { - Ok(metadata) => { - for byte in metadata.len().to_le_bytes() { - hash ^= u64::from(byte); - hash = hash.wrapping_mul(0x100000001b3); - } - if let Ok(modified) = metadata.modified() { - if let Ok(duration) = modified.duration_since(std::time::UNIX_EPOCH) { - for byte in duration.as_nanos().to_le_bytes() { - hash ^= u64::from(byte); - hash = hash.wrapping_mul(0x100000001b3); - } - } - } - } - Err(_) => { - hash ^= u64::MAX; - hash = hash.wrapping_mul(0x100000001b3); - } - } - } - hash -} - -fn stable_shader_id(reference: &MaterialRef) -> u32 { - let mut hash = 0x811c9dc5u32; - for byte in reference.0.asset_id.bytes() { - hash ^= u32::from(byte); - hash = hash.wrapping_mul(0x01000193); - } - hash -} - -fn evaluator_revision(source: &str) -> u64 { - let mut hash = 0xcbf29ce484222325u64; - for byte in source.bytes() { - hash ^= u64::from(byte); - hash = hash.wrapping_mul(0x100000001b3); - } - hash -} - -fn shader_uuid_for_material(reference: &MaterialRef) -> uuid::Uuid { - if let Ok(source) = uuid::Uuid::parse_str(&reference.0.asset_id) { - let mixed = source.as_u128() ^ 0x7f8c_4e90_f9ab_4f28_9b44_47c1_b2d5_5ac1u128; - return uuid::Uuid::from_u128(mixed); - } - let mut bytes = [0u8; 16]; - for (index, byte) in reference.0.asset_id.bytes().enumerate() { - bytes[index % 16] = bytes[index % 16].wrapping_mul(31).wrapping_add(byte); - } - uuid::Uuid::from_bytes(bytes) -} - -fn pack_schema_values( - extension: &mut SurfaceExtension, - schema: &ShaderSchemaAsset, - material: &shared::MaterialDesc, - instance: Option<&MaterialInstanceAsset>, - asset_server: &AssetServer, -) -> Result<(), String> { - let mut numeric_index = 0usize; - let mut texture_index = 0usize; - for property in &schema.parameters { - if matches!(property.property_type, ShaderPropertyType::Texture) { - if texture_index >= SURFACE_TEXTURE_SLOTS { - return Err(format!( - "surface schema exceeds {SURFACE_TEXTURE_SLOTS} textures" - )); - } - let binding = instance - .and_then(|instance| { - instance - .textures - .iter() - .find(|value| value.name == property.name) - }) - .or_else(|| { - material - .textures - .iter() - .find(|value| value.name == property.name) - }); - let handle = binding - .and_then(|binding| binding.texture.as_ref()) - .and_then(|reference| reference.source_path.as_deref()) - .map(asset_server_path) - .map(|path| asset_server.load(path)); - extension.set_texture(texture_index, handle); - texture_index += 1; - continue; - } - if numeric_index >= SURFACE_PARAMETER_LANES { - return Err(format!( - "surface schema exceeds {SURFACE_PARAMETER_LANES} parameter lanes" - )); - } - let value = instance - .and_then(|instance| { - instance - .parameters - .iter() - .find(|value| value.name == property.name) - }) - .or_else(|| { - material - .parameters - .iter() - .find(|value| value.name == property.name) - }) - .or_else(|| { - schema - .default_values - .iter() - .find(|value| value.name == property.name) - }); - extension.uniform.params[numeric_index] = value - .map(|value| parameter_lane(&value.value, &property.property_type)) - .transpose()? - .unwrap_or(Vec4::ZERO); - numeric_index += 1; - } - Ok(()) -} - -fn parameter_lane( - value: &MaterialParameterValue, - property_type: &ShaderPropertyType, -) -> Result { - match (value, property_type) { - (MaterialParameterValue::Bool(value), ShaderPropertyType::Bool) => { - Ok(Vec4::new(u32::from(*value) as f32, 0.0, 0.0, 0.0)) - } - (MaterialParameterValue::Float(value), ShaderPropertyType::Float { .. }) => { - Ok(Vec4::new(*value, 0.0, 0.0, 0.0)) - } - (MaterialParameterValue::Vec2(value), ShaderPropertyType::Vec2) => { - Ok(Vec4::new(value.x, value.y, 0.0, 0.0)) - } - (MaterialParameterValue::Vec3(value), ShaderPropertyType::Vec3) => Ok(value.extend(0.0)), - (MaterialParameterValue::Color(value), ShaderPropertyType::Color) => { - Ok(Vec4::new(value.r, value.g, value.b, value.a)) - } - (MaterialParameterValue::Enum(value), ShaderPropertyType::Enum { options }) => { - let index = options - .iter() - .position(|option| option == value) - .ok_or_else(|| format!("enum value `{value}` is not declared by the schema"))?; - Ok(Vec4::new(index as f32, 0.0, 0.0, 0.0)) - } - _ => Err("material value does not match shader schema type".into()), - } -} - -pub fn validate_surface_evaluator(source: &str) -> Result<(), String> { - if !source.contains("fn evaluate(") { - return Err("surface WGSL must define `fn evaluate(`".into()); - } - for forbidden in [ - "@group", - "@binding", - "@vertex", - "@fragment", - "@compute", - "var<", - "rayQuery", - "dpdx", - "dpdy", - "fwidth", - "discard", - "Barrier", - "subgroup", - "textureStore", - "atomic", - ] { - if source.contains(forbidden) { - return Err(format!( - "surface WGSL uses forbidden construct `{forbidden}`" - )); - } - } - let validation_source = format!("{EVALUATOR_VALIDATION_PRELUDE}\n{source}"); - let module = naga::front::wgsl::parse_str(&validation_source) - .map_err(|error| format!("surface WGSL syntax error: {error}"))?; - naga::valid::Validator::new( - naga::valid::ValidationFlags::all(), - naga::valid::Capabilities::empty(), - ) - .validate(&module) - .map_err(|error| format!("surface WGSL validation error: {error}"))?; - Ok(()) -} - -const EVALUATOR_VALIDATION_PRELUDE: &str = r#" -struct SurfaceInput { - uv0: vec2, - world_position: vec3, - world_normal: vec3, -} -struct SurfaceParams { lanes: array, 16>, } -struct SurfaceSamples { values: array, 8>, } -struct Surface { - base_color: vec4, - normal_ts: vec3, - emissive: vec3, - metallic: f32, - perceptual_roughness: f32, - reflectance: f32, - occlusion: f32, - model: u32, -} -fn surface_default() -> Surface { - var surface: Surface; - surface.base_color = vec4(1.0); - surface.normal_ts = vec3(0.0, 0.0, 1.0); - surface.emissive = vec3(0.0); +fn evaluate( + input: SurfaceInput, + params: SurfaceParams, + samples: SurfaceSamples, +) -> Surface { + var surface = surface_default(); + let weights = abs(normalize(input.world_normal)); + let normalized_weights = weights / max(weights.x + weights.y + weights.z, 0.0001); + let grid = grid_axis(input.world_position.yz) * normalized_weights.x + + grid_axis(input.world_position.xz) * normalized_weights.y + + grid_axis(input.world_position.xy) * normalized_weights.z; + let shade = mix(0.32, 0.56, grid); + surface.base_color = vec4(vec3(shade), 1.0); + surface.perceptual_roughness = 0.86; surface.metallic = 0.0; - surface.perceptual_roughness = 0.5; - surface.reflectance = 0.5; + surface.emissive = vec3(shade * 0.035); + surface.reflectance = 0.35; surface.occlusion = 1.0; - surface.model = 0u; return surface; } "#; -pub fn compose_surface_shader(evaluator: &str) -> String { - format!( - "{}\n{}\n{}", - include_str!("surface_header.wgsl"), - evaluator, - include_str!("surface_footer.wgsl") - ) -} +#[path = "surface/cache_plugin.rs"] +mod cache_plugin; +#[path = "surface/packing.rs"] +mod packing; +#[path = "surface/property_blocks.rs"] +mod property_blocks; +#[path = "surface/resolver.rs"] +mod resolver; +#[path = "surface/surface_abi.rs"] +mod surface_abi; +#[path = "surface/terrain.rs"] +mod terrain; +#[path = "surface/terrain_types.rs"] +mod terrain_types; +#[path = "surface/validation.rs"] +mod validation; + +pub use cache_plugin::{ + DefaultGridMaterialHandles, SurfaceDiagnostics, SurfaceEvaluatorRecord, + SurfaceEvaluatorRegistry, SurfaceMaterialCache, SurfaceMaterialPlugin, +}; +pub use property_blocks::validate_property_block_for_promotion; +pub use surface_abi::{SurfaceExtension, SurfaceExtensionKey, SurfaceMaterial, SurfaceUniform}; +pub use terrain_types::{TerrainLayerExtension, TerrainLayerMaterial, TerrainLayerUniform}; +pub use validation::{compose_surface_shader, validate_surface_evaluator}; + +use cache_plugin::*; +use packing::*; +use property_blocks::*; +use resolver::*; +use terrain::*; +use terrain_types::*; #[cfg(test)] -mod tests { - use super::*; - use bevy::ecs::world::CommandQueue; - - #[test] - fn stale_generated_terrain_binding_is_nonfatal_during_scene_switch() { - let mut world = World::new(); - let entity = world.spawn_empty().id(); - let mut queue = CommandQueue::default(); - let mut commands = Commands::new(&mut queue, &world); - queue_terrain_material_binding(&mut commands, entity, Handle::default()); - - world.entity_mut(entity).despawn(); - queue.apply(&mut world); - - assert!(world.get_entity(entity).is_err()); - } - - #[test] - fn rejects_resource_bindings_and_missing_entry() { - assert!(validate_surface_evaluator("fn nope() {}").is_err()); - assert!(validate_surface_evaluator( - "@group(0) @binding(0) var t: texture_2d; fn evaluate() {}" - ) - .is_err()); - for compute_incompatible in [ - "dpdx(input.uv0.x)", - "dpdy(input.uv0.y)", - "fwidth(input.uv0.x)", - "discard", - "workgroupBarrier()", - "subgroupAdd(1u)", - ] { - let source = format!( - "fn evaluate(input: SurfaceInput, params: SurfaceParams, samples: SurfaceSamples) -> Surface {{ let invalid = {compute_incompatible}; return surface_default(); }}" - ); - assert!( - validate_surface_evaluator(&source).is_err(), - "accepted compute-incompatible evaluator: {compute_incompatible}" - ); - } - assert!(validate_surface_evaluator( - "fn evaluate(input: SurfaceInput, params: SurfaceParams, samples: SurfaceSamples) -> Surface { return missing_symbol; }" - ) - .is_err()); - } - - #[test] - fn accepts_surface_only_module_and_composes_wrapper() { - let source = "fn evaluate(input: SurfaceInput, params: SurfaceParams, samples: SurfaceSamples) -> Surface { return surface_default(); }"; - validate_surface_evaluator(source).unwrap(); - let composed = compose_surface_shader(source); - assert!(composed.contains(source)); - assert!(composed.contains("@fragment")); - } - - #[test] - fn abi_limits_are_stable() { - assert_eq!(SURFACE_PARAMETER_LANES, 16); - assert_eq!(SURFACE_TEXTURE_SLOTS, 8); - assert_eq!(std::mem::size_of::(), 400); - } - - #[test] - fn material_extensions_leave_non_deferred_prepasses_to_standard_material() { - assert!(matches!( - ::prepass_fragment_shader(), - ShaderRef::Default - )); - assert!(matches!( - ::prepass_fragment_shader(), - ShaderRef::Default - )); - } - - #[test] - fn terrain_layer_builder_packs_project_material_values() { - let mut app = App::new(); - app.add_plugins((MinimalPlugins, AssetPlugin::default())); - let asset_server = app.world().resource::(); - let materials_root = - std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../../assets/materials"); - let layers = [ - TerrainMaterialLayer { - material: Some( - shared::EditorAssetRef::new("concrete", "material:source", "Concrete") - .with_source_path( - materials_root.join("concrete.ron").display().to_string(), - ), - ), - uv_scale: 6.0, - }, - TerrainMaterialLayer { - material: Some( - shared::EditorAssetRef::new("tint", "material:source", "Surface Tint") - .with_source_path( - materials_root - .join("surface_tint.ron") - .display() - .to_string(), - ), - ), - uv_scale: 10.0, - }, - ]; - let mut diagnostics = Vec::new(); - let material = build_terrain_layer_material(asset_server, &layers, &mut diagnostics); - - assert!(diagnostics.is_empty(), "{diagnostics:?}"); - assert_eq!(material.extension.uniform.uv_scales.x, 6.0); - assert_eq!(material.extension.uniform.uv_scales.y, 10.0); - assert_eq!(material.extension.uniform.properties[0].w, 1.0); - assert_eq!(material.extension.uniform.properties[1].w, 1.0); - assert_eq!( - material.base.opaque_render_method, - OpaqueRendererMethod::Forward - ); - assert_ne!( - material.extension.uniform.base_colors[0], - material.extension.uniform.base_colors[1] - ); - } -} +#[path = "surface/tests.rs"] +mod tests; diff --git a/crates/blacksite_surface/src/live_documents.rs b/crates/blacksite_surface/src/live_documents.rs new file mode 100644 index 0000000..113326d --- /dev/null +++ b/crates/blacksite_surface/src/live_documents.rs @@ -0,0 +1,67 @@ +//! Editor-owned live Material and Material Instance values. + +use std::collections::HashMap; + +use bevy::prelude::Resource; +use shared::{MaterialAsset, MaterialInstanceAsset, MaterialRef}; + +#[derive(Debug, Clone)] +pub enum LiveMaterialDocument { + Material(MaterialAsset), + Instance(MaterialInstanceAsset), +} + +#[derive(Debug, Clone)] +pub struct LiveMaterialDocumentEntry { + pub revision: u64, + pub document: LiveMaterialDocument, +} + +#[derive(Resource, Default, Debug)] +pub struct LiveMaterialDocumentOverlay { + documents: HashMap, +} + +impl LiveMaterialDocumentOverlay { + pub fn update_material( + &mut self, + asset_id: impl Into, + revision: u64, + asset: MaterialAsset, + ) { + self.documents.insert( + asset_id.into(), + LiveMaterialDocumentEntry { + revision, + document: LiveMaterialDocument::Material(asset), + }, + ); + } + + pub fn update_instance( + &mut self, + asset_id: impl Into, + revision: u64, + instance: MaterialInstanceAsset, + ) { + self.documents.insert( + asset_id.into(), + LiveMaterialDocumentEntry { + revision, + document: LiveMaterialDocument::Instance(instance), + }, + ); + } + + pub fn remove(&mut self, asset_id: &str) { + self.documents.remove(asset_id); + } + + pub fn revision_for_asset(&self, asset_id: &str) -> Option { + self.documents.get(asset_id).map(|entry| entry.revision) + } + + pub(crate) fn get(&self, reference: &MaterialRef) -> Option<&LiveMaterialDocumentEntry> { + self.documents.get(&reference.0.asset_id) + } +} diff --git a/crates/blacksite_surface/src/surface/cache_plugin.rs b/crates/blacksite_surface/src/surface/cache_plugin.rs new file mode 100644 index 0000000..5ef3455 --- /dev/null +++ b/crates/blacksite_surface/src/surface/cache_plugin.rs @@ -0,0 +1,138 @@ +use super::*; + +#[derive(Resource, Default)] +pub struct SurfaceMaterialCache { + pub(super) handles: HashMap>, + pub(super) standard_handles: HashMap>, + pub(super) revisions: HashMap, + pub(super) standard_only: HashMap, + pub(super) instance_bases: HashMap, + pub(super) failed_revisions: HashMap, + pub(super) disk_generation: u64, +} + +impl SurfaceMaterialCache { + /// Invalidates disk-backed project materials after an explicit save or watcher event. + /// Interactive edits use `LiveMaterialDocumentOverlay`, so synchronization never needs to + /// stat or reparse authored files for every bound entity on every frame. + pub fn invalidate_disk_documents(&mut self) { + self.disk_generation = self.disk_generation.wrapping_add(1); + self.failed_revisions.clear(); + } + + pub(super) fn disk_generation(&self) -> u64 { + self.disk_generation + } + + pub(super) fn revision_for_handles( + &self, + standard: Option<&MeshMaterial3d>, + surface: Option<&MeshMaterial3d>, + ) -> u64 { + if let Some(handle) = standard { + if let Some((reference, _)) = self + .standard_handles + .iter() + .find(|(_, cached)| cached.id() == handle.0.id()) + { + return self + .standard_only + .get(reference) + .copied() + .unwrap_or_default(); + } + } + if let Some(handle) = surface { + if let Some((reference, _)) = self + .handles + .iter() + .find(|(_, cached)| cached.id() == handle.0.id()) + { + return self.revisions.get(reference).copied().unwrap_or_default(); + } + } + 0 + } +} + +#[derive(Resource, Default)] +pub(super) struct MaterialPropertyBlockCache { + pub(super) entries: HashMap<(Entity, String), PropertyBlockCacheEntry>, +} + +pub(super) enum PropertyBlockHandle { + Standard(Handle), + Surface(Handle), +} + +pub(super) struct PropertyBlockCacheEntry { + pub(super) revision: u64, + pub(super) handle: PropertyBlockHandle, +} + +#[derive(Resource, Default, Debug, Clone)] +pub struct DefaultGridMaterialHandles { + pub surface: Option>, + pub emergency_standard: Option>, +} + +pub(super) enum BuiltRendererMaterial { + Standard(Box), + Surface(Box), +} + +#[derive(Resource, Default, Debug, Clone)] +pub struct SurfaceDiagnostics(pub Vec); + +pub(super) fn record_diagnostic(diagnostics: &mut Vec, message: String) { + if diagnostics.iter().any(|existing| existing == &message) { + return; + } + const MAX_DIAGNOSTICS: usize = 256; + if diagnostics.len() == MAX_DIAGNOSTICS { + diagnostics.remove(0); + } + diagnostics.push(message); +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SurfaceEvaluatorRecord { + pub shader_id: u32, + pub evaluator_source: String, + pub revision: u64, + pub alpha_mode: shared::MaterialAlphaMode, +} + +/// Active, validated evaluator generation consumed by both raster and Solari render worlds. +#[derive(Resource, ExtractResource, Default, Debug, Clone)] +pub struct SurfaceEvaluatorRegistry { + pub evaluators: HashMap, +} + +pub struct SurfaceMaterialPlugin; + +impl Plugin for SurfaceMaterialPlugin { + fn build(&self, app: &mut App) { + app.add_plugins(MaterialPlugin::::default()) + .add_plugins(MaterialPlugin::::default()) + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .add_systems( + Update, + ( + ( + sync_surface_material_bindings, + apply_material_property_blocks, + ) + .chain(), + sync_terrain_layer_material_bindings, + ), + ); + } +} diff --git a/crates/blacksite_surface/src/surface/packing.rs b/crates/blacksite_surface/src/surface/packing.rs new file mode 100644 index 0000000..fc92776 --- /dev/null +++ b/crates/blacksite_surface/src/surface/packing.rs @@ -0,0 +1,229 @@ +use super::*; + +pub(super) fn pack_schema_values( + extension: &mut SurfaceExtension, + schema: &ShaderSchemaAsset, + inputs: &shared::MaterialInputSet, + instance: Option<&MaterialInstanceAsset>, + asset_server: &AssetServer, + runtime_catalog: Option<&RuntimeContentCatalog>, +) -> Result<(), String> { + let mut numeric_index = 0usize; + let mut texture_index = 0usize; + for property in &schema.schema.inputs { + if property.texture.is_some() + || matches!(property.property_type, ShaderPropertyType::Texture) + { + if texture_index >= SURFACE_TEXTURE_SLOTS { + return Err(format!( + "surface schema exceeds {SURFACE_TEXTURE_SLOTS} textures" + )); + } + let binding = instance + .and_then(|instance| { + instance + .overrides + .textures + .iter() + .find(|value| value.name == property.name) + }) + .or_else(|| { + inputs + .textures + .iter() + .find(|value| value.name == property.name) + }); + let handle = binding + .and_then(|binding| binding.texture.as_ref()) + .and_then(|reference| { + runtime_texture_spec( + runtime_catalog, + reference, + property.texture.as_ref().is_some_and(|texture| { + texture.semantic == shared::TextureSemantic::Color + }), + ) + }) + .map(|spec| shared::load_runtime_texture(asset_server, &spec)); + extension.set_texture(texture_index, handle); + texture_index += 1; + } + if matches!(property.property_type, ShaderPropertyType::Texture) { + continue; + } + if numeric_index >= SURFACE_PARAMETER_LANES { + return Err(format!( + "surface schema exceeds {SURFACE_PARAMETER_LANES} parameter lanes" + )); + } + let value = instance + .and_then(|instance| { + instance + .overrides + .values + .iter() + .find(|value| value.name == property.name) + }) + .or_else(|| { + inputs + .values + .iter() + .find(|value| value.name == property.name) + }) + .map(|value| &value.value) + .or(property.default_value.as_ref()); + extension.uniform.params[numeric_index] = value + .map(|value| parameter_lane(value, &property.property_type)) + .transpose()? + .unwrap_or(Vec4::ZERO); + numeric_index += 1; + } + Ok(()) +} + +pub(super) fn load_runtime_content_catalog() -> Option { + let source = fs::read_to_string("assets/content.catalog.ron").ok()?; + ron::from_str(&source).ok() +} + +pub(super) fn runtime_texture_path( + catalog: Option<&RuntimeContentCatalog>, + reference: &shared::EditorAssetRef, +) -> Option { + catalog + .and_then(|catalog| { + catalog + .records + .iter() + .find(|record| record.id.as_string() == reference.asset_id) + }) + .and_then(|record| record.texture.as_ref()) + .and_then(|runtime| runtime.processed_path.clone()) + .or_else(|| reference.source_path.clone()) +} + +pub(super) fn runtime_texture_spec( + catalog: Option<&RuntimeContentCatalog>, + reference: &shared::EditorAssetRef, + fallback_srgb: bool, +) -> Option { + catalog + .and_then(|catalog| catalog.texture_load_spec(reference)) + .or_else(|| { + reference + .source_path + .as_ref() + .map(|path| shared::RuntimeTextureLoadSpec { + path: path.clone(), + is_srgb: fallback_srgb, + filter: shared::TextureFilter::Linear, + wrap: shared::TextureWrap::Repeat, + anisotropy: 8, + }) + }) +} + +pub(super) fn packed_runtime_texture_spec( + catalog: Option<&RuntimeContentCatalog>, + inputs: &MaterialInputSet, + instance: Option<&MaterialInstanceAsset>, + material: &MaterialRef, +) -> Result, String> { + let Some(catalog) = catalog else { + return Ok(None); + }; + let Some(path) = catalog + .records + .iter() + .find(|record| record.id.as_string() == material.0.asset_id) + .and_then(|record| record.material.as_ref()) + .and_then(|runtime| runtime.packed_arm_path.clone()) + else { + return Ok(None); + }; + let mut source_specs = ["occlusion", "roughness", "metallic"] + .into_iter() + .filter_map(|name| { + instance + .and_then(|instance| instance.overrides.texture(name)) + .or_else(|| inputs.texture(name)) + .and_then(|binding| binding.texture.as_ref()) + .and_then(|reference| catalog.texture_load_spec(reference)) + }); + let Some(first) = source_specs.next() else { + return Ok(None); + }; + if source_specs.any(|spec| { + spec.filter != first.filter + || spec.wrap != first.wrap + || spec.anisotropy != first.anisotropy + }) { + return Err("packed AO/roughness/metallic textures must use matching filter, wrap, and anisotropy settings".into()); + } + Ok(Some(shared::RuntimeTextureLoadSpec { + path, + is_srgb: false, + filter: first.filter, + wrap: first.wrap, + anisotropy: first.anisotropy, + })) +} + +pub(super) fn apply_runtime_texture_paths( + resolved: &mut MaterialDesc, + inputs: &MaterialInputSet, + instance: Option<&MaterialInstanceAsset>, + material: &MaterialRef, + catalog: Option<&RuntimeContentCatalog>, +) { + let binding = |name: &str| { + instance + .and_then(|instance| instance.overrides.texture(name)) + .or_else(|| inputs.texture(name)) + .and_then(|binding| binding.texture.as_ref()) + .and_then(|reference| runtime_texture_path(catalog, reference)) + }; + resolved.base_color_texture = binding("base_color"); + resolved.normal_map_texture = binding("normal"); + resolved.emissive_texture = binding("emissive"); + let packed_arm = catalog + .and_then(|catalog| { + catalog + .records + .iter() + .find(|record| record.id.as_string() == material.0.asset_id) + }) + .and_then(|record| record.material.as_ref()) + .and_then(|runtime| runtime.packed_arm_path.clone()); + resolved.metallic_roughness_texture = packed_arm.clone(); + resolved.occlusion_texture = packed_arm; +} + +pub(super) fn parameter_lane( + value: &MaterialParameterValue, + property_type: &ShaderPropertyType, +) -> Result { + match (value, property_type) { + (MaterialParameterValue::Bool(value), ShaderPropertyType::Bool) => { + Ok(Vec4::new(u32::from(*value) as f32, 0.0, 0.0, 0.0)) + } + (MaterialParameterValue::Float(value), ShaderPropertyType::Float { .. }) => { + Ok(Vec4::new(*value, 0.0, 0.0, 0.0)) + } + (MaterialParameterValue::Vec2(value), ShaderPropertyType::Vec2) => { + Ok(Vec4::new(value.x, value.y, 0.0, 0.0)) + } + (MaterialParameterValue::Vec3(value), ShaderPropertyType::Vec3) => Ok(value.extend(0.0)), + (MaterialParameterValue::Color(value), ShaderPropertyType::Color) => { + Ok(Vec4::new(value.r, value.g, value.b, value.a)) + } + (MaterialParameterValue::Enum(value), ShaderPropertyType::Enum { options }) => { + let index = options + .iter() + .position(|option| option == value) + .ok_or_else(|| format!("enum value `{value}` is not declared by the schema"))?; + Ok(Vec4::new(index as f32, 0.0, 0.0, 0.0)) + } + _ => Err("material value does not match shader schema type".into()), + } +} diff --git a/crates/blacksite_surface/src/surface/property_blocks.rs b/crates/blacksite_surface/src/surface/property_blocks.rs new file mode 100644 index 0000000..1399875 --- /dev/null +++ b/crates/blacksite_surface/src/surface/property_blocks.rs @@ -0,0 +1,523 @@ +use super::*; + +#[allow(clippy::too_many_arguments, clippy::type_complexity)] +pub(super) fn apply_material_property_blocks( + mut commands: Commands, + asset_server: Res, + owners: Query<&MaterialPropertyBlocks>, + bindings: Query<( + Entity, + &HydratedMaterialSlotBinding, + Option<&MeshMaterial3d>, + Option<&MeshMaterial3d>, + )>, + mut standard_materials: ResMut>, + mut surface_materials: ResMut>, + surface_cache: Res, + mut cache: ResMut, + mut diagnostics: ResMut, +) { + let mut active = HashSet::new(); + for (entity, binding, standard_handle, surface_handle) in &bindings { + let Ok(blocks) = owners.get(binding.owner) else { + continue; + }; + let Some(block) = blocks + .slots + .iter() + .find(|block| block.slot_id == binding.slot_id) + else { + continue; + }; + let revision = property_block_revision( + block, + standard_handle, + surface_handle, + surface_cache.revision_for_handles(standard_handle, surface_handle), + ); + let key = (binding.owner, binding.slot_id.0.clone()); + active.insert(key.clone()); + let cached = cache + .entries + .get(&key) + .filter(|entry| entry.revision == revision); + let handle = if let Some(entry) = cached { + match &entry.handle { + PropertyBlockHandle::Standard(handle) => { + PropertyBlockHandle::Standard(handle.clone()) + } + PropertyBlockHandle::Surface(handle) => { + PropertyBlockHandle::Surface(handle.clone()) + } + } + } else if let Some(source) = surface_handle + .and_then(|handle| surface_materials.get(&handle.0)) + .cloned() + { + let mut material = source; + let application = + apply_standard_property_block(&mut material.base, block, &asset_server, true) + .and_then(|()| { + binding + .selection + .project_reference() + .map_or(Ok(()), |reference| { + apply_surface_property_block( + &mut material, + reference, + block, + &asset_server, + ) + }) + }); + if let Err(error) = application { + record_diagnostic( + &mut diagnostics.0, + format!( + "material property block for {} was ignored: {error}", + binding.slot_id.0 + ), + ); + continue; + } + let handle = cache + .entries + .get(&key) + .and_then(|entry| match &entry.handle { + PropertyBlockHandle::Surface(handle) => Some(handle.clone()), + PropertyBlockHandle::Standard(_) => None, + }); + if let Some(handle) = handle { + if let Some(mut existing) = surface_materials.get_mut(&handle) { + *existing = material; + } + PropertyBlockHandle::Surface(handle) + } else { + PropertyBlockHandle::Surface(surface_materials.add(material)) + } + } else if let Some(source) = standard_handle + .and_then(|handle| standard_materials.get(&handle.0)) + .cloned() + { + let mut material = source; + if let Err(error) = + apply_standard_property_block(&mut material, block, &asset_server, false) + { + record_diagnostic( + &mut diagnostics.0, + format!( + "material property block for {} was ignored: {error}", + binding.slot_id.0 + ), + ); + continue; + } + let handle = cache + .entries + .get(&key) + .and_then(|entry| match &entry.handle { + PropertyBlockHandle::Standard(handle) => Some(handle.clone()), + PropertyBlockHandle::Surface(_) => None, + }); + if let Some(handle) = handle { + if let Some(mut existing) = standard_materials.get_mut(&handle) { + *existing = material; + } + PropertyBlockHandle::Standard(handle) + } else { + PropertyBlockHandle::Standard(standard_materials.add(material)) + } + } else { + continue; + }; + match &handle { + PropertyBlockHandle::Standard(handle) => { + commands + .entity(entity) + .try_remove::>() + .try_insert(MeshMaterial3d(handle.clone())); + } + PropertyBlockHandle::Surface(handle) => { + commands + .entity(entity) + .try_remove::>() + .try_insert(MeshMaterial3d(handle.clone())); + } + } + cache + .entries + .insert(key, PropertyBlockCacheEntry { revision, handle }); + } + cache.entries.retain(|key, entry| { + if active.contains(key) { + return true; + } + match &entry.handle { + PropertyBlockHandle::Standard(handle) => { + standard_materials.remove(handle.id()); + } + PropertyBlockHandle::Surface(handle) => { + surface_materials.remove(handle.id()); + } + } + false + }); +} + +pub(super) fn property_block_revision( + block: &MaterialPropertyBlock, + standard: Option<&MeshMaterial3d>, + surface: Option<&MeshMaterial3d>, + base_revision: u64, +) -> u64 { + let mut hasher = DefaultHasher::new(); + format!("{block:?}").hash(&mut hasher); + standard.map(|handle| handle.0.id()).hash(&mut hasher); + surface.map(|handle| handle.0.id()).hash(&mut hasher); + base_revision.hash(&mut hasher); + hasher.finish() +} + +pub(super) fn apply_standard_property_block( + material: &mut StandardMaterial, + block: &MaterialPropertyBlock, + asset_server: &AssetServer, + allow_custom: bool, +) -> Result<(), String> { + validate_standard_property_block(block, allow_custom)?; + for parameter in &block.parameters { + match ( + parameter.name.to_ascii_lowercase().as_str(), + ¶meter.value, + ) { + ("base_color" | "albedo", MaterialParameterValue::Color(value)) => { + material.base_color = value.to_color() + } + ("metallic", MaterialParameterValue::Float(value)) => material.metallic = *value, + ("roughness", MaterialParameterValue::Float(value)) => { + material.perceptual_roughness = *value + } + ("emissive", MaterialParameterValue::Color(value)) => { + material.emissive = value.to_color().into() + } + _ => continue, + } + } + for texture in &block.textures { + let handle = texture + .texture + .as_ref() + .and_then(|reference| reference.source_path.as_deref()) + .map(asset_server_path) + .map(|path| asset_server.load(path)); + match texture.name.to_ascii_lowercase().as_str() { + "base_color" | "albedo" => material.base_color_texture = handle, + "normal" | "normal_map" => material.normal_map_texture = handle, + "metallic_roughness" => material.metallic_roughness_texture = handle, + "emissive" => material.emissive_texture = handle, + _ => continue, + } + } + Ok(()) +} + +pub(super) fn validate_standard_property_block( + block: &MaterialPropertyBlock, + allow_custom: bool, +) -> Result<(), String> { + validate_standard_property_block_at(Path::new("."), block, allow_custom) +} + +/// Validates a runtime block against the material path selected for editor promotion. +/// +/// The editor passes the resolved project root so relative texture references are checked without +/// relying on process working-directory state. Custom properties are accepted only when the +/// selected material has an active Surface evaluator and its schema declares them. +pub fn validate_property_block_for_promotion( + project_root: &Path, + block: &MaterialPropertyBlock, + schema: Option<&ShaderSchemaAsset>, + custom_surface: bool, +) -> Result<(), String> { + validate_standard_property_block_at(project_root, block, custom_surface)?; + if custom_surface { + validate_surface_property_block(schema, block)?; + } + Ok(()) +} + +pub(super) fn validate_standard_property_block_at( + project_root: &Path, + block: &MaterialPropertyBlock, + allow_custom: bool, +) -> Result<(), String> { + let mut parameter_names = HashSet::new(); + for parameter in &block.parameters { + if !parameter_names.insert(parameter.name.as_str()) { + return Err(format!( + "parameter `{}` is assigned more than once", + parameter.name + )); + } + let name = parameter.name.to_ascii_lowercase(); + let valid = match (name.as_str(), ¶meter.value) { + ("base_color" | "albedo" | "emissive", MaterialParameterValue::Color(value)) => { + [value.r, value.g, value.b, value.a] + .into_iter() + .all(f32::is_finite) + } + ("metallic" | "roughness", MaterialParameterValue::Float(value)) => { + value.is_finite() && (0.0..=1.0).contains(value) + } + ("base_color" | "albedo" | "emissive" | "metallic" | "roughness", _) => false, + _ if allow_custom => true, + _ => { + return Err(format!( + "parameter `{}` is not supported by Standard materials", + parameter.name + )); + } + }; + if !valid { + return Err(format!( + "parameter `{}` has an invalid type or value", + parameter.name + )); + } + } + + let mut texture_names = HashSet::new(); + for texture in &block.textures { + if !texture_names.insert(texture.name.as_str()) { + return Err(format!( + "texture `{}` is assigned more than once", + texture.name + )); + } + let name = texture.name.to_ascii_lowercase(); + if !matches!( + name.as_str(), + "base_color" | "albedo" | "normal" | "normal_map" | "metallic_roughness" | "emissive" + ) && !allow_custom + { + return Err(format!( + "texture `{}` is not supported by Standard materials", + texture.name + )); + } + if let Some(reference) = texture.texture.as_ref() { + let path = reference + .source_path + .as_deref() + .ok_or_else(|| format!("texture `{}` has no loadable source path", texture.name))?; + let path = Path::new(path); + let resolved = if path.is_absolute() { + path.to_path_buf() + } else { + project_root.join(path) + }; + if !resolved.is_file() { + return Err(format!( + "texture `{}` is missing at {}", + texture.name, + path.display() + )); + } + } + } + Ok(()) +} + +pub(super) fn apply_surface_property_block( + material: &mut SurfaceMaterial, + reference: &MaterialRef, + block: &MaterialPropertyBlock, + asset_server: &AssetServer, +) -> Result<(), String> { + let path = reference + .0 + .source_path + .as_deref() + .ok_or_else(|| "base material has no loadable path".to_string())?; + let (mut asset, mut instance) = match MaterialAsset::load_from_path(path) { + Ok(asset) => (asset, None), + Err(_) => { + let instance = MaterialInstanceAsset::load_from_path(path)?; + let base_path = instance + .base + .0 + .source_path + .as_deref() + .ok_or_else(|| "material instance base has no loadable path".to_string())?; + (MaterialAsset::load_from_path(base_path)?, Some(instance)) + } + }; + let schema_path = asset + .shader_ref + .as_ref() + .and_then(|reference| reference.source_path.as_deref()) + .or(asset.shader.schema_path.as_deref()); + let schema = schema_path + .map(ShaderSchemaAsset::load_from_path) + .transpose()?; + validate_surface_property_block(schema.as_ref(), block)?; + merge_surface_property_block(&mut asset, &mut instance, block); + if let Some(schema) = schema.as_ref() { + let runtime_catalog = load_runtime_content_catalog(); + pack_schema_values( + &mut material.extension, + schema, + &asset.inputs, + instance.as_ref(), + asset_server, + runtime_catalog.as_ref(), + )?; + } + let mut resolved = MaterialDesc::default(); + asset.inputs.apply_to_material_desc(&mut resolved); + if let Some(instance) = instance.as_ref() { + instance.apply_to(&mut resolved); + } + material.extension.uniform.uv_transforms.fill(Vec4::new( + resolved.uv_tiling.x, + resolved.uv_tiling.y, + resolved.uv_offset.x, + resolved.uv_offset.y, + )); + Ok(()) +} + +pub(super) fn merge_surface_property_block( + asset: &mut MaterialAsset, + instance: &mut Option, + block: &MaterialPropertyBlock, +) { + if let Some(instance) = instance.as_mut() { + instance.merge_overrides(block.parameters.clone(), block.textures.clone()); + } else { + merge_material_input_overrides(&mut asset.inputs, block); + } +} + +pub(super) fn merge_material_input_overrides( + inputs: &mut shared::MaterialInputSet, + block: &MaterialPropertyBlock, +) { + for parameter in &block.parameters { + if let Some(existing) = inputs + .values + .iter_mut() + .find(|value| value.name == parameter.name) + { + *existing = parameter.clone(); + } else { + inputs.values.push(parameter.clone()); + } + } + for texture in &block.textures { + if let Some(existing) = inputs + .textures + .iter_mut() + .find(|value| value.name == texture.name) + { + *existing = texture.clone(); + } else { + inputs.textures.push(texture.clone()); + } + } +} + +pub(super) fn validate_surface_property_block( + schema: Option<&ShaderSchemaAsset>, + block: &MaterialPropertyBlock, +) -> Result<(), String> { + for parameter in &block.parameters { + if matches!( + parameter.name.to_ascii_lowercase().as_str(), + "base_color" | "albedo" | "emissive" | "metallic" | "roughness" + ) { + continue; + } + let property = schema + .and_then(|schema| { + schema + .schema + .inputs + .iter() + .find(|property| property.name == parameter.name) + }) + .ok_or_else(|| { + format!( + "parameter `{}` is not declared by the Surface schema", + parameter.name + ) + })?; + if matches!(property.property_type, ShaderPropertyType::Texture) { + return Err(format!( + "parameter `{}` targets a texture property", + parameter.name + )); + } + parameter_lane(¶meter.value, &property.property_type)?; + if !parameter_value_is_finite(¶meter.value) { + return Err(format!( + "parameter `{}` contains a non-finite value", + parameter.name + )); + } + if let (MaterialParameterValue::Float(value), ShaderPropertyType::Float { min, max }) = + (¶meter.value, &property.property_type) + { + if !value.is_finite() + || min.is_some_and(|min| *value < min) + || max.is_some_and(|max| *value > max) + { + return Err(format!( + "parameter `{}` is outside its declared finite range", + parameter.name + )); + } + } + } + for texture in &block.textures { + if matches!( + texture.name.to_ascii_lowercase().as_str(), + "base_color" | "albedo" | "normal" | "normal_map" | "metallic_roughness" | "emissive" + ) { + continue; + } + let property = schema + .and_then(|schema| { + schema + .schema + .inputs + .iter() + .find(|property| property.name == texture.name) + }) + .ok_or_else(|| { + format!( + "texture `{}` is not declared by the Surface schema", + texture.name + ) + })?; + if !matches!(property.property_type, ShaderPropertyType::Texture) { + return Err(format!( + "texture `{}` targets a non-texture property", + texture.name + )); + } + } + Ok(()) +} + +pub(super) fn parameter_value_is_finite(value: &MaterialParameterValue) -> bool { + match value { + MaterialParameterValue::Bool(_) | MaterialParameterValue::Enum(_) => true, + MaterialParameterValue::Float(value) => value.is_finite(), + MaterialParameterValue::Vec2(value) => value.is_finite(), + MaterialParameterValue::Vec3(value) => value.is_finite(), + MaterialParameterValue::Color(value) => [value.r, value.g, value.b, value.a] + .into_iter() + .all(f32::is_finite), + } +} diff --git a/crates/blacksite_surface/src/surface/resolver.rs b/crates/blacksite_surface/src/surface/resolver.rs new file mode 100644 index 0000000..fc08c4e --- /dev/null +++ b/crates/blacksite_surface/src/surface/resolver.rs @@ -0,0 +1,541 @@ +use super::*; + +pub(super) fn resolve_material_desc( + reference: &MaterialRef, + path: &str, + live_documents: &LiveMaterialDocumentOverlay, +) -> Result { + let (asset, instance) = match live_documents.get(reference) { + Some(LiveMaterialDocumentEntry { + document: LiveMaterialDocument::Material(asset), + .. + }) => (asset.clone(), None), + Some(LiveMaterialDocumentEntry { + document: LiveMaterialDocument::Instance(instance), + .. + }) => ( + live_base_material(&instance.base, live_documents)?, + Some(instance.clone()), + ), + None => return shared::load_resolved_material_from_path(path).map(|(desc, _)| desc), + }; + let mut resolved = MaterialDesc { + shader: asset.shader.clone(), + ..Default::default() + }; + asset.inputs.apply_to_material_desc(&mut resolved); + if let Some(instance) = instance.as_ref() { + instance.apply_to(&mut resolved); + } + Ok(resolved) +} + +pub(super) fn material_live_revision( + reference: &MaterialRef, + live_documents: &LiveMaterialDocumentOverlay, +) -> Option { + let entry = live_documents.get(reference)?; + let base_revision = match &entry.document { + LiveMaterialDocument::Material(_) => None, + LiveMaterialDocument::Instance(instance) => live_documents + .get(&instance.base) + .map(|base| base.revision.rotate_left(1)), + }; + Some(base_revision.map_or(entry.revision, |base| entry.revision ^ base)) +} + +#[allow(clippy::too_many_arguments, clippy::type_complexity)] +pub(super) fn sync_surface_material_bindings( + mut commands: Commands, + asset_server: Res, + mut shaders: ResMut>, + mut standard_materials: ResMut>, + mut surface_materials: ResMut>, + mut cache: ResMut, + live_documents: Res, + mut default_grid: ResMut, + content_defaults: Res, + mut diagnostics: ResMut, + mut evaluator_registry: ResMut, + bindings: Query<( + Entity, + &HydratedMaterialSlotBinding, + Option<&MeshMaterial3d>, + Option<&MeshMaterial3d>, + )>, +) { + let default_grid_handle = ensure_default_grid_material( + &mut shaders, + &mut standard_materials, + &mut surface_materials, + &mut default_grid, + &mut evaluator_registry, + ); + for (entity, binding, standard_handle, surface_handle) in &bindings { + if matches!( + binding.selection, + HydratedMaterialSelection::ImportedSource { .. } + ) { + continue; + } + let reference = binding + .selection + .project_reference() + .or(content_defaults.default_material.as_ref()); + let Some(reference) = reference else { + queue_default_grid_binding(&mut commands, entity, default_grid_handle.clone()); + continue; + }; + let Some(path) = reference.0.source_path.as_deref() else { + record_diagnostic( + &mut diagnostics.0, + format!( + "material {} has no loadable source path; using {DEFAULT_GRID_LABEL}", + reference.0.label + ), + ); + queue_default_grid_binding(&mut commands, entity, default_grid_handle.clone()); + continue; + }; + let live_revision = material_live_revision(reference, &live_documents).or_else(|| { + cache + .instance_bases + .get(reference) + .and_then(|base| live_documents.get(base)) + .map(|entry| entry.revision.rotate_left(1)) + }); + let revision = live_revision + .map(|revision| revision | (1_u64 << 63)) + .unwrap_or_else(|| cache.disk_generation()); + if cache.failed_revisions.get(reference) == Some(&revision) { + queue_default_grid_binding(&mut commands, entity, default_grid_handle.clone()); + continue; + } + if cache.standard_only.get(reference) == Some(&revision) { + if let Some(handle) = cache.standard_handles.get(reference).cloned() { + if standard_handle.is_none_or(|current| current.0 != handle) + || surface_handle.is_some() + { + commands + .entity(entity) + .try_remove::>() + .try_insert(MeshMaterial3d(handle)); + } + } + continue; + } + let stale = cache.revisions.get(reference) != Some(&revision); + let handle = if !stale { + cache.handles.get(reference).cloned() + } else { + None + }; + let handle = match handle { + Some(handle) => handle, + None => match build_surface_material( + reference, + path, + &live_documents, + &asset_server, + &mut shaders, + &mut evaluator_registry, + ) { + Ok((BuiltRendererMaterial::Surface(material), base_reference)) => { + let material = *material; + if let Some(base_reference) = base_reference { + cache + .instance_bases + .insert(reference.clone(), base_reference); + } else { + cache.instance_bases.remove(reference); + } + cache.standard_only.remove(reference); + cache.standard_handles.remove(reference); + cache.failed_revisions.remove(reference); + if let Some(existing) = cache.handles.get(reference).cloned() { + if let Some(mut slot) = surface_materials.get_mut(&existing) { + *slot = material; + } + existing + } else { + let handle = surface_materials.add(material); + cache.handles.insert(reference.clone(), handle.clone()); + handle + } + } + Ok((BuiltRendererMaterial::Standard(material), base_reference)) => { + let material = *material; + if let Some(base_reference) = base_reference { + cache + .instance_bases + .insert(reference.clone(), base_reference); + } else { + cache.instance_bases.remove(reference); + } + // Plain Material assets stay on Bevy's StandardMaterial path, while still + // sharing one live-updated handle across every renderer slot. + // Never adopt the renderer's current handle here: hydration starts every + // surface on one singleton emergency handle, so adopting it would make + // unrelated Materials overwrite each other. Cache one handle per reference. + let handle = cache + .standard_handles + .get(reference) + .cloned() + .unwrap_or_else(|| standard_materials.add(material.clone())); + if let Some(mut slot) = standard_materials.get_mut(&handle) { + *slot = material; + } + cache.handles.remove(reference); + cache.revisions.remove(reference); + cache + .standard_handles + .insert(reference.clone(), handle.clone()); + cache.standard_only.insert(reference.clone(), revision); + cache.failed_revisions.remove(reference); + evaluator_registry + .evaluators + .remove(&stable_shader_id(reference)); + if standard_handle.is_none_or(|current| current.0 != handle) + || surface_handle.is_some() + { + commands + .entity(entity) + .try_remove::>() + .try_insert(MeshMaterial3d(handle)); + } + continue; + } + Err(error) => { + cache.failed_revisions.insert(reference.clone(), revision); + record_diagnostic( + &mut diagnostics.0, + format!( + "material {} could not build Surface ABI: {error}; using {DEFAULT_GRID_LABEL}", + reference.0.label + ), + ); + queue_default_grid_binding(&mut commands, entity, default_grid_handle.clone()); + continue; + } + }, + }; + cache.revisions.insert(reference.clone(), revision); + if surface_handle.is_none_or(|current| current.0 != handle) { + commands + .entity(entity) + .try_remove::>() + .try_insert(MeshMaterial3d(handle)); + } + } +} + +pub(super) fn queue_default_grid_binding( + commands: &mut Commands, + entity: Entity, + handle: Handle, +) { + commands + .entity(entity) + .try_remove::>() + .try_insert(MeshMaterial3d(handle)); +} + +pub(super) fn ensure_default_grid_material( + shaders: &mut Assets, + standard_materials: &mut Assets, + surface_materials: &mut Assets, + handles: &mut DefaultGridMaterialHandles, + evaluator_registry: &mut SurfaceEvaluatorRegistry, +) -> Handle { + if let Some(handle) = handles.surface.as_ref() { + return handle.clone(); + } + validate_surface_evaluator(DEFAULT_GRID_EVALUATOR) + .expect("embedded DefaultGrid evaluator must remain valid"); + let shader_id = AssetId::::Uuid { + uuid: DEFAULT_GRID_SHADER_UUID, + }; + shaders + .insert( + shader_id, + Shader::from_wgsl( + compose_surface_shader(DEFAULT_GRID_EVALUATOR), + "builtin://default-grid.wgsl", + ), + ) + .expect("reserved DefaultGrid shader ID must be replaceable"); + evaluator_registry.evaluators.insert( + DEFAULT_GRID_SHADER_ID, + SurfaceEvaluatorRecord { + shader_id: DEFAULT_GRID_SHADER_ID, + evaluator_source: DEFAULT_GRID_EVALUATOR.to_string(), + revision: evaluator_revision(DEFAULT_GRID_EVALUATOR), + alpha_mode: shared::MaterialAlphaMode::Opaque, + }, + ); + let emergency = standard_materials.add(StandardMaterial { + base_color: Color::srgb(0.46, 0.46, 0.46), + perceptual_roughness: 0.86, + cull_mode: None, + ..default() + }); + let material = SurfaceMaterial { + base: StandardMaterial { + base_color: Color::WHITE, + perceptual_roughness: 0.86, + cull_mode: None, + ..default() + }, + extension: SurfaceExtension { + uniform: SurfaceUniform { + shader_id: DEFAULT_GRID_SHADER_ID, + ..default() + }, + shader: Handle::Uuid(DEFAULT_GRID_SHADER_UUID, Default::default()), + ..default() + }, + }; + let handle = surface_materials.add(material); + handles.emergency_standard = Some(emergency); + handles.surface = Some(handle.clone()); + handle +} + +pub(super) fn build_surface_material( + reference: &MaterialRef, + path: &str, + live_documents: &LiveMaterialDocumentOverlay, + asset_server: &AssetServer, + shaders: &mut Assets, + evaluator_registry: &mut SurfaceEvaluatorRegistry, +) -> Result<(BuiltRendererMaterial, Option), String> { + let (asset, instance, base_reference) = match live_documents.get(reference) { + Some(LiveMaterialDocumentEntry { + document: LiveMaterialDocument::Material(asset), + .. + }) => (asset.clone(), None, None), + Some(LiveMaterialDocumentEntry { + document: LiveMaterialDocument::Instance(instance), + .. + }) => { + if instance.schema_version != MATERIAL_INSTANCE_SCHEMA_VERSION { + return Err(format!( + "unsupported material-instance schema {}", + instance.schema_version + )); + } + ( + live_base_material(&instance.base, live_documents)?, + Some(instance.clone()), + Some(instance.base.clone()), + ) + } + None => match MaterialAsset::load_from_path(path) { + Ok(asset) => (asset, None, None), + Err(_) => { + let instance = MaterialInstanceAsset::load_from_path(path)?; + if instance.schema_version != MATERIAL_INSTANCE_SCHEMA_VERSION { + return Err(format!( + "unsupported material-instance schema {}", + instance.schema_version + )); + } + let base_reference = instance.base.clone(); + ( + live_base_material(&base_reference, live_documents)?, + Some(instance), + Some(base_reference), + ) + } + }, + }; + let mut resolved = shared::MaterialDesc { + shader: asset.shader.clone(), + ..Default::default() + }; + asset.inputs.apply_to_material_desc(&mut resolved); + if let Some(instance) = instance.as_ref() { + instance.apply_to(&mut resolved); + } + let runtime_catalog = load_runtime_content_catalog(); + apply_runtime_texture_paths( + &mut resolved, + &asset.inputs, + instance.as_ref(), + reference, + runtime_catalog.as_ref(), + ); + let schema_path = asset + .shader_ref + .as_ref() + .and_then(|reference| reference.source_path.as_deref()) + .or(asset.shader.schema_path.as_deref()); + let schema = schema_path + .map(ShaderSchemaAsset::load_from_path) + .transpose()?; + let evaluator_source = schema + .as_ref() + .and_then(|schema| schema.wgsl_path.as_deref()) + .map(fs::read_to_string) + .transpose() + .map_err(|error| format!("could not read surface WGSL: {error}"))?; + + // Hydration deliberately attaches the singleton emergency StandardMaterial first so geometry + // stays visible before this resolver runs. Its neutral values must never become the base of an + // assigned project Material. + let runtime_binding = |name: &str| { + instance + .as_ref() + .and_then(|instance| instance.overrides.texture(name)) + .or_else(|| asset.inputs.texture(name)) + }; + let base_color_spec = runtime_binding("base_color") + .and_then(|binding| binding.texture.as_ref()) + .and_then(|reference| runtime_texture_spec(runtime_catalog.as_ref(), reference, true)); + let normal_spec = runtime_binding("normal") + .and_then(|binding| binding.texture.as_ref()) + .and_then(|reference| runtime_texture_spec(runtime_catalog.as_ref(), reference, false)); + let emissive_spec = runtime_binding("emissive") + .and_then(|binding| binding.texture.as_ref()) + .and_then(|reference| runtime_texture_spec(runtime_catalog.as_ref(), reference, true)); + let packed_spec = packed_runtime_texture_spec( + runtime_catalog.as_ref(), + &asset.inputs, + instance.as_ref(), + reference, + )?; + let specs = [base_color_spec, normal_spec, emissive_spec, packed_spec] + .into_iter() + .flatten() + .map(|spec| (spec.path.clone(), spec)) + .collect::>(); + let mut base = + shared::material_from_desc_with_texture_loader(asset_server, &resolved, |path| { + specs.get(path).map_or_else( + || asset_server.load(asset_server_path(path)), + |spec| shared::load_runtime_texture(asset_server, spec), + ) + }); + base.alpha_mode = match asset.render_state.alpha_mode { + shared::MaterialAlphaMode::Opaque => AlphaMode::Opaque, + shared::MaterialAlphaMode::Cutout => AlphaMode::Mask(asset.render_state.alpha_cutoff), + }; + base.cull_mode = + (!asset.render_state.double_sided).then_some(bevy::render::render_resource::Face::Back); + + let Some(evaluator) = evaluator_source.as_deref() else { + return Ok(( + BuiltRendererMaterial::Standard(Box::new(base)), + base_reference, + )); + }; + validate_surface_evaluator(evaluator)?; + let runtime_shader_id = stable_shader_id(reference); + let evaluator_source_revision = evaluator_revision(evaluator); + let shader_changed = evaluator_registry + .evaluators + .get(&runtime_shader_id) + .is_none_or(|record| record.revision != evaluator_source_revision); + evaluator_registry.evaluators.insert( + runtime_shader_id, + SurfaceEvaluatorRecord { + shader_id: runtime_shader_id, + evaluator_source: evaluator.to_string(), + revision: evaluator_source_revision, + alpha_mode: asset.render_state.alpha_mode, + }, + ); + let virtual_path = format!("generated://surface/{}.wgsl", reference.0.asset_id); + let shader_uuid = shader_uuid_for_material(reference); + let shader_id = AssetId::::Uuid { uuid: shader_uuid }; + if shader_changed || shaders.get(shader_id).is_none() { + shaders + .insert( + shader_id, + Shader::from_wgsl(compose_surface_shader(evaluator), virtual_path), + ) + .map_err(|error| format!("could not replace generated surface shader: {error}"))?; + } + let shader = Handle::Uuid(shader_uuid, Default::default()); + + let mut extension = SurfaceExtension { + shader, + ..default() + }; + extension.uniform.alpha_cutoff = asset.render_state.alpha_cutoff; + extension.uniform.shader_id = runtime_shader_id; + if let Some(schema) = schema.as_ref() { + pack_schema_values( + &mut extension, + schema, + &asset.inputs, + instance.as_ref(), + asset_server, + runtime_catalog.as_ref(), + )?; + } + extension.uniform.uv_transforms.fill(Vec4::new( + resolved.uv_tiling.x, + resolved.uv_tiling.y, + resolved.uv_offset.x, + resolved.uv_offset.y, + )); + Ok(( + BuiltRendererMaterial::Surface(Box::new(ExtendedMaterial { base, extension })), + base_reference, + )) +} + +pub(super) fn live_base_material( + reference: &MaterialRef, + live_documents: &LiveMaterialDocumentOverlay, +) -> Result { + match live_documents.get(reference) { + Some(LiveMaterialDocumentEntry { + document: LiveMaterialDocument::Material(asset), + .. + }) => Ok(asset.clone()), + Some(LiveMaterialDocumentEntry { + document: LiveMaterialDocument::Instance(_), + .. + }) => Err("nested Material Instances are not supported".to_string()), + None => { + let base_path = reference + .0 + .source_path + .as_deref() + .ok_or_else(|| "material instance base has no loadable path".to_string())?; + MaterialAsset::load_from_path(base_path) + } + } +} + +pub(super) fn stable_shader_id(reference: &MaterialRef) -> u32 { + let mut hash = 0x811c9dc5u32; + for byte in reference.0.asset_id.bytes() { + hash ^= u32::from(byte); + hash = hash.wrapping_mul(0x01000193); + } + hash +} + +pub(super) fn evaluator_revision(source: &str) -> u64 { + let mut hash = 0xcbf29ce484222325u64; + for byte in source.bytes() { + hash ^= u64::from(byte); + hash = hash.wrapping_mul(0x100000001b3); + } + hash +} + +pub(super) fn shader_uuid_for_material(reference: &MaterialRef) -> uuid::Uuid { + if let Ok(source) = uuid::Uuid::parse_str(&reference.0.asset_id) { + let mixed = source.as_u128() ^ 0x7f8c_4e90_f9ab_4f28_9b44_47c1_b2d5_5ac1u128; + return uuid::Uuid::from_u128(mixed); + } + let mut bytes = [0u8; 16]; + for (index, byte) in reference.0.asset_id.bytes().enumerate() { + bytes[index % 16] = bytes[index % 16].wrapping_mul(31).wrapping_add(byte); + } + uuid::Uuid::from_bytes(bytes) +} diff --git a/crates/blacksite_surface/src/surface/surface_abi.rs b/crates/blacksite_surface/src/surface/surface_abi.rs new file mode 100644 index 0000000..8e35af9 --- /dev/null +++ b/crates/blacksite_surface/src/surface/surface_abi.rs @@ -0,0 +1,131 @@ +use super::*; + +#[derive(ShaderType, Reflect, Debug, Clone, Copy, PartialEq)] +pub struct SurfaceUniform { + pub shader_id: u32, + pub flags: u32, + pub alpha_cutoff: f32, + pub abi_version: u32, + pub params: [Vec4; SURFACE_PARAMETER_LANES], + pub uv_transforms: [Vec4; SURFACE_TEXTURE_SLOTS], +} + +impl Default for SurfaceUniform { + fn default() -> Self { + Self { + shader_id: 0, + flags: 0, + alpha_cutoff: 0.5, + abi_version: SURFACE_ABI_VERSION, + params: [Vec4::ZERO; SURFACE_PARAMETER_LANES], + uv_transforms: [Vec4::new(1.0, 1.0, 0.0, 0.0); SURFACE_TEXTURE_SLOTS], + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub struct SurfaceExtensionKey { + shader: AssetId, +} + +impl From<&SurfaceExtension> for SurfaceExtensionKey { + fn from(extension: &SurfaceExtension) -> Self { + Self { + shader: extension.shader.id(), + } + } +} + +#[derive(Asset, AsBindGroup, Reflect, Debug, Clone, Default)] +#[bind_group_data(SurfaceExtensionKey)] +pub struct SurfaceExtension { + #[uniform(100)] + pub uniform: SurfaceUniform, + #[texture(101)] + #[sampler(102)] + pub texture0: Option>, + #[texture(103)] + #[sampler(104)] + pub texture1: Option>, + #[texture(105)] + #[sampler(106)] + pub texture2: Option>, + #[texture(107)] + #[sampler(108)] + pub texture3: Option>, + #[texture(109)] + #[sampler(110)] + pub texture4: Option>, + #[texture(111)] + #[sampler(112)] + pub texture5: Option>, + #[texture(113)] + #[sampler(114)] + pub texture6: Option>, + #[texture(115)] + #[sampler(116)] + pub texture7: Option>, + #[reflect(ignore)] + pub shader: Handle, +} + +impl SurfaceExtension { + pub fn set_texture(&mut self, index: usize, handle: Option>) { + match index { + 0 => self.texture0 = handle, + 1 => self.texture1 = handle, + 2 => self.texture2 = handle, + 3 => self.texture3 = handle, + 4 => self.texture4 = handle, + 5 => self.texture5 = handle, + 6 => self.texture6 = handle, + 7 => self.texture7 = handle, + _ => {} + } + } +} + +impl MaterialExtension for SurfaceExtension { + fn fragment_shader() -> ShaderRef { + DEFAULT_SURFACE_SHADER_PATH.into() + } + + fn deferred_fragment_shader() -> ShaderRef { + DEFAULT_SURFACE_SHADER_PATH.into() + } + + fn specialize( + _pipeline: &MaterialExtensionPipeline, + descriptor: &mut RenderPipelineDescriptor, + _layout: &MeshVertexBufferLayoutRef, + key: MaterialExtensionKey, + ) -> Result<(), SpecializedMeshPipelineError> { + if let (AssetId::Uuid { uuid }, Some(fragment)) = + (key.bind_group_data.shader, descriptor.fragment.as_mut()) + { + // The evaluator fragment owns forward and deferred shading, but ordinary depth, + // normal, and motion-vector prepasses must retain Bevy's standard prepass shader. + // Substituting the evaluator there calls `deferred_output()` without a + // `DEFERRED_PREPASS` output attachment and fails shader validation at runtime. + if surface_evaluator_owns_fragment(&fragment.shader_defs) { + fragment.shader = Handle::Uuid(uuid, Default::default()); + } + } + Ok(()) + } +} + +pub(super) fn surface_evaluator_owns_fragment(shader_defs: &[ShaderDefVal]) -> bool { + !shader_def_enabled(shader_defs, "PREPASS_PIPELINE") + || shader_def_enabled(shader_defs, "DEFERRED_PREPASS") +} + +pub(super) fn shader_def_enabled(shader_defs: &[ShaderDefVal], expected: &str) -> bool { + shader_defs.iter().any(|shader_def| match shader_def { + ShaderDefVal::Bool(name, enabled) => name == expected && *enabled, + ShaderDefVal::Int(name, value) => name == expected && *value != 0, + ShaderDefVal::UInt(name, value) => name == expected && *value != 0, + }) +} + +pub type SurfaceMaterial = ExtendedMaterial; diff --git a/crates/blacksite_surface/src/surface/terrain.rs b/crates/blacksite_surface/src/surface/terrain.rs new file mode 100644 index 0000000..7fbd3c0 --- /dev/null +++ b/crates/blacksite_surface/src/surface/terrain.rs @@ -0,0 +1,229 @@ +use super::*; +use bevy::ecs::system::SystemParam; + +#[derive(SystemParam)] +pub(super) struct TerrainMaterialResources<'w> { + asset_server: Res<'w, AssetServer>, + materials: ResMut<'w, Assets>, + cache: ResMut<'w, TerrainLayerMaterialCache>, + surface_cache: Res<'w, SurfaceMaterialCache>, + live_documents: Res<'w, LiveMaterialDocumentOverlay>, + diagnostics: ResMut<'w, SurfaceDiagnostics>, +} + +pub(super) fn sync_terrain_layer_material_bindings( + mut commands: Commands, + resources: TerrainMaterialResources, + bindings: TerrainMaterialBindings, +) { + let TerrainMaterialResources { + asset_server, + mut materials, + mut cache, + surface_cache, + live_documents, + mut diagnostics, + } = resources; + for (entity, binding) in &bindings { + if binding.layers.is_empty() { + continue; + } + let revision = terrain_layer_revision( + &binding.layers, + &live_documents, + surface_cache.disk_generation(), + ); + let cached = cache + .0 + .get(&binding.owner) + .filter(|entry| entry.layers == binding.layers && entry.revision == revision) + .map(|entry| entry.handle.clone()); + let handle = cached.unwrap_or_else(|| { + let material = build_terrain_layer_material( + &asset_server, + &binding.layers, + &live_documents, + &mut diagnostics.0, + ); + let handle = cache + .0 + .get(&binding.owner) + .map(|entry| entry.handle.clone()) + .filter(|handle| { + materials + .get_mut(handle) + .map(|mut slot| { + *slot = material.clone(); + }) + .is_some() + }) + .unwrap_or_else(|| materials.add(material)); + cache.0.insert( + binding.owner, + TerrainLayerCacheEntry { + layers: binding.layers.clone(), + handle: handle.clone(), + revision, + }, + ); + handle + }); + queue_terrain_material_binding(&mut commands, entity, handle); + } +} + +pub(super) fn queue_terrain_material_binding( + commands: &mut Commands, + entity: Entity, + handle: Handle, +) { + // Generated render entities can be removed by a scene switch after this system's query + // but before deferred commands apply. That lifecycle race is expected and must not abort + // the editor while opening another scene. + commands + .entity(entity) + .try_remove::>() + .try_insert(MeshMaterial3d(handle)); +} + +pub(super) fn terrain_layer_revision( + layers: &[TerrainMaterialLayer], + live_documents: &LiveMaterialDocumentOverlay, + disk_generation: u64, +) -> u64 { + let mut hash = 0xcbf29ce484222325u64; + for layer in layers { + for byte in layer.uv_scale.to_bits().to_le_bytes() { + hash ^= u64::from(byte); + hash = hash.wrapping_mul(0x100000001b3); + } + let Some(reference) = layer.material.as_ref() else { + hash ^= u64::MAX; + continue; + }; + for byte in reference.asset_id.bytes() { + hash ^= u64::from(byte); + hash = hash.wrapping_mul(0x100000001b3); + } + let revision = material_live_revision(&MaterialRef(reference.clone()), live_documents) + .unwrap_or(disk_generation); + for byte in revision.to_le_bytes() { + hash ^= u64::from(byte); + hash = hash.wrapping_mul(0x100000001b3); + } + } + hash +} + +pub(super) fn build_terrain_layer_material( + asset_server: &AssetServer, + layers: &[TerrainMaterialLayer], + live_documents: &LiveMaterialDocumentOverlay, + diagnostics: &mut Vec, +) -> TerrainLayerMaterial { + let mut extension = TerrainLayerExtension::default(); + for (index, layer) in layers.iter().take(TERRAIN_MATERIAL_LAYER_LIMIT).enumerate() { + extension.uniform.uv_scales[index] = layer.uv_scale; + let desc = resolve_terrain_layer(layer, index, live_documents, diagnostics); + let color = desc.base_color.to_color().to_linear(); + extension.uniform.base_colors[index] = + Vec4::new(color.red, color.green, color.blue, color.alpha); + extension.uniform.properties[index] = Vec4::new( + desc.metallic, + desc.roughness, + f32::from(desc.normal_map_texture.is_some()), + 1.0, + ); + extension.uniform.base_texture_enabled[index] = + f32::from(desc.base_color_texture.is_some()); + let base_color = desc + .base_color_texture + .as_deref() + .map(|path| asset_server.load(asset_server_path(path))); + let normal = desc + .normal_map_texture + .as_deref() + .map(|path| asset_server.load(asset_server_path(path))); + match index { + 0 => { + extension.base_color0 = base_color; + extension.normal0 = normal; + } + 1 => { + extension.base_color1 = base_color; + extension.normal1 = normal; + } + 2 => { + extension.base_color2 = base_color; + extension.normal2 = normal; + } + 3 => { + extension.base_color3 = base_color; + extension.normal3 = normal; + } + _ => {} + } + } + TerrainLayerMaterial { + base: StandardMaterial { + base_color: Color::WHITE, + perceptual_roughness: 1.0, + // Terrain is intentionally absent from the Solari acceleration structure until its + // ray-tracing evaluator exists, so keep the layer blend in the raster forward pass. + opaque_render_method: OpaqueRendererMethod::Forward, + ..default() + }, + extension, + } +} + +pub(super) fn resolve_terrain_layer( + layer: &TerrainMaterialLayer, + index: usize, + live_documents: &LiveMaterialDocumentOverlay, + diagnostics: &mut Vec, +) -> MaterialDesc { + let Some(reference) = layer.material.as_ref() else { + record_diagnostic( + diagnostics, + format!( + "terrain material layer {} is unassigned; using visible fallback", + index + 1 + ), + ); + return terrain_layer_fallback(); + }; + let Some(path) = reference.source_path.as_deref() else { + record_diagnostic( + diagnostics, + format!( + "terrain material layer {} ({}) has no loadable source path; using visible fallback", + index + 1, + reference.label + ), + ); + return terrain_layer_fallback(); + }; + match resolve_material_desc(&MaterialRef(reference.clone()), path, live_documents) { + Ok(desc) => desc, + Err(error) => { + record_diagnostic( + diagnostics, + format!( + "terrain material layer {} ({}) could not resolve: {error}; using visible fallback", + index + 1, + reference.label + ), + ); + terrain_layer_fallback() + } + } +} + +pub(super) fn terrain_layer_fallback() -> MaterialDesc { + MaterialDesc { + base_color: shared::ColorDesc::srgb(0.24, 0.29, 0.25), + roughness: 0.92, + ..Default::default() + } +} diff --git a/crates/blacksite_surface/src/surface/terrain_types.rs b/crates/blacksite_surface/src/surface/terrain_types.rs new file mode 100644 index 0000000..6cab21b --- /dev/null +++ b/crates/blacksite_surface/src/surface/terrain_types.rs @@ -0,0 +1,76 @@ +use super::*; + +#[derive(ShaderType, Reflect, Debug, Clone, Copy, PartialEq)] +pub struct TerrainLayerUniform { + pub base_colors: [Vec4; TERRAIN_MATERIAL_LAYER_LIMIT], + /// Metallic, perceptual roughness, normal-map enabled, layer enabled. + pub properties: [Vec4; TERRAIN_MATERIAL_LAYER_LIMIT], + pub uv_scales: Vec4, + pub base_texture_enabled: Vec4, +} + +impl Default for TerrainLayerUniform { + fn default() -> Self { + Self { + base_colors: [Vec4::ONE; TERRAIN_MATERIAL_LAYER_LIMIT], + properties: [Vec4::new(0.0, 0.9, 0.0, 0.0); TERRAIN_MATERIAL_LAYER_LIMIT], + uv_scales: Vec4::splat(8.0), + base_texture_enabled: Vec4::ZERO, + } + } +} + +#[derive(Asset, AsBindGroup, Reflect, Debug, Clone, Default)] +pub struct TerrainLayerExtension { + #[uniform(100)] + pub uniform: TerrainLayerUniform, + #[texture(101)] + #[sampler(102)] + pub base_color0: Option>, + #[texture(103)] + #[sampler(104)] + pub normal0: Option>, + #[texture(105)] + #[sampler(106)] + pub base_color1: Option>, + #[texture(107)] + #[sampler(108)] + pub normal1: Option>, + #[texture(109)] + #[sampler(110)] + pub base_color2: Option>, + #[texture(111)] + #[sampler(112)] + pub normal2: Option>, + #[texture(113)] + #[sampler(114)] + pub base_color3: Option>, + #[texture(115)] + #[sampler(116)] + pub normal3: Option>, +} + +impl MaterialExtension for TerrainLayerExtension { + fn fragment_shader() -> ShaderRef { + TERRAIN_LAYER_SHADER_PATH.into() + } + + fn deferred_fragment_shader() -> ShaderRef { + TERRAIN_LAYER_SHADER_PATH.into() + } +} + +pub type TerrainLayerMaterial = ExtendedMaterial; + +#[derive(Debug, Clone)] +pub(super) struct TerrainLayerCacheEntry { + pub(super) layers: Vec, + pub(super) handle: Handle, + pub(super) revision: u64, +} + +#[derive(Resource, Default)] +pub(super) struct TerrainLayerMaterialCache(pub(super) HashMap); + +pub(super) type TerrainMaterialBindings<'w, 's> = + Query<'w, 's, (Entity, &'static HydratedTerrainMaterialBinding)>; diff --git a/crates/blacksite_surface/src/surface/tests.rs b/crates/blacksite_surface/src/surface/tests.rs new file mode 100644 index 0000000..64ee292 --- /dev/null +++ b/crates/blacksite_surface/src/surface/tests.rs @@ -0,0 +1,727 @@ +use super::*; +use crate::surface_abi::surface_evaluator_owns_fragment; +use bevy::ecs::world::CommandQueue; + +fn live_material_app() -> App { + let mut app = App::new(); + app.add_plugins((MinimalPlugins, AssetPlugin::default())) + .init_resource::>() + .init_resource::>() + .init_resource::>() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .add_systems(Update, sync_surface_material_bindings); + app +} + +fn authored_standard_material(label: &str, color: shared::ColorDesc) -> MaterialAsset { + MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: label.into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: shared::MaterialRenderState::default(), + inputs: shared::MaterialInputSet::from_material_desc(&MaterialDesc { + base_color: color, + roughness: 0.4, + ..Default::default() + }), + provenance: None, + } +} + +#[test] +fn stale_generated_terrain_binding_is_nonfatal_during_scene_switch() { + let mut world = World::new(); + let entity = world.spawn_empty().id(); + let mut queue = CommandQueue::default(); + let mut commands = Commands::new(&mut queue, &world); + queue_terrain_material_binding(&mut commands, entity, Handle::default()); + + world.entity_mut(entity).despawn(); + queue.apply(&mut world); + + assert!(world.get_entity(entity).is_err()); +} + +#[test] +fn rejects_resource_bindings_and_missing_entry() { + assert!(validate_surface_evaluator("fn nope() {}").is_err()); + assert!(validate_surface_evaluator( + "@group(0) @binding(0) var t: texture_2d; fn evaluate() {}" + ) + .is_err()); + for compute_incompatible in [ + "dpdx(input.uv0.x)", + "dpdy(input.uv0.y)", + "fwidth(input.uv0.x)", + "discard", + "workgroupBarrier()", + "subgroupAdd(1u)", + ] { + let source = format!( + "fn evaluate(input: SurfaceInput, params: SurfaceParams, samples: SurfaceSamples) -> Surface {{ let invalid = {compute_incompatible}; return surface_default(); }}" + ); + assert!( + validate_surface_evaluator(&source).is_err(), + "accepted compute-incompatible evaluator: {compute_incompatible}" + ); + } + assert!(validate_surface_evaluator( + "fn evaluate(input: SurfaceInput, params: SurfaceParams, samples: SurfaceSamples) -> Surface { return missing_symbol; }" + ) + .is_err()); +} + +#[test] +fn accepts_surface_only_module_and_composes_wrapper() { + let source = "fn evaluate(input: SurfaceInput, params: SurfaceParams, samples: SurfaceSamples) -> Surface { return surface_default(); }"; + validate_surface_evaluator(source).unwrap(); + let composed = compose_surface_shader(source); + assert!(composed.contains(source)); + assert!(composed.contains("@fragment")); +} + +#[test] +fn embedded_default_grid_is_uv_independent_and_surface_valid() { + validate_surface_evaluator(DEFAULT_GRID_EVALUATOR).unwrap(); + assert!(DEFAULT_GRID_EVALUATOR.contains("world_position")); + assert!(DEFAULT_GRID_EVALUATOR.contains("0.5")); + assert!(DEFAULT_GRID_EVALUATOR.contains("4.0")); + assert!(!DEFAULT_GRID_EVALUATOR.contains("uv0")); +} + +#[test] +fn assigned_standard_material_replaces_emergency_values() { + let path = std::env::temp_dir().join(format!( + "blacksite-assigned-material-{}-{}.material.ron", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + let authored_color = shared::ColorDesc::srgb(0.25, 0.0, 1.0); + let asset = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Purple Chrome".into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: shared::MaterialRenderState::default(), + inputs: shared::MaterialInputSet::from_material_desc(&MaterialDesc { + base_color: authored_color, + metallic: 0.93, + roughness: 0.17, + ..Default::default() + }), + provenance: None, + }; + std::fs::write( + &path, + ron::ser::to_string_pretty(&asset, ron::ser::PrettyConfig::default()).unwrap(), + ) + .unwrap(); + + let mut app = App::new(); + app.add_plugins((MinimalPlugins, AssetPlugin::default())) + .init_resource::>() + .init_resource::>() + .init_resource::>() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .init_resource::() + .add_systems(Update, sync_surface_material_bindings); + let emergency = app + .world_mut() + .resource_mut::>() + .add(StandardMaterial { + base_color: Color::srgb(0.46, 0.46, 0.46), + metallic: 0.0, + perceptual_roughness: 0.86, + ..Default::default() + }); + let reference = MaterialRef::new( + shared::EditorAssetRef::new("purple-chrome", "material:source", "Purple Chrome") + .with_source_path(path.to_string_lossy()), + ); + let draw = app + .world_mut() + .spawn(( + HydratedMaterialSlotBinding { + owner: Entity::PLACEHOLDER, + slot_id: shared::ComponentInstanceId::new("slot:primitive:surface"), + selection: HydratedMaterialSelection::Project { + reference, + layer: shared::HydratedMaterialLayer::Actor, + }, + }, + MeshMaterial3d(emergency.clone()), + )) + .id(); + + app.update(); + + let resolved = app + .world() + .get::>(draw) + .unwrap(); + assert_ne!( + resolved.0, emergency, + "assigned Materials must detach from the singleton emergency handle" + ); + let materials = app.world().resource::>(); + let material = materials.get(&resolved.0).unwrap(); + assert_eq!(material.base_color, authored_color.to_color()); + assert_eq!(material.metallic, 0.93); + assert_eq!(material.perceptual_roughness, 0.17); + let emergency_material = materials.get(&emergency).unwrap(); + assert_eq!(emergency_material.base_color, Color::srgb(0.46, 0.46, 0.46)); + assert_eq!(emergency_material.metallic, 0.0); + assert_eq!(emergency_material.perceptual_roughness, 0.86); + assert!(app.world().resource::().0.is_empty()); + + std::fs::remove_file(path).unwrap(); +} + +#[test] +fn live_material_edits_persist_across_frames_and_reuse_the_handle() { + let mut app = live_material_app(); + let reference = MaterialRef::new( + shared::EditorAssetRef::new("live-material", "material:source", "Live Material") + .with_source_path("assets/materials/live_material.ron"), + ); + let first_color = shared::ColorDesc::srgb(0.8, 0.1, 0.05); + app.world_mut() + .resource_mut::() + .update_material( + reference.0.asset_id.clone(), + 1, + authored_standard_material("Live Material", first_color), + ); + let emergency = app + .world_mut() + .resource_mut::>() + .add(StandardMaterial::default()); + let draw = app + .world_mut() + .spawn(( + HydratedMaterialSlotBinding { + owner: Entity::PLACEHOLDER, + slot_id: shared::ComponentInstanceId::new("slot:primitive:surface"), + selection: HydratedMaterialSelection::Project { + reference: reference.clone(), + layer: shared::HydratedMaterialLayer::Actor, + }, + }, + MeshMaterial3d(emergency), + )) + .id(); + + app.update(); + let handle = app + .world() + .get::>(draw) + .unwrap() + .0 + .clone(); + assert_eq!( + app.world() + .resource::>() + .get(&handle) + .unwrap() + .base_color, + first_color.to_color() + ); + + let second_color = shared::ColorDesc::srgb(0.05, 0.15, 0.9); + app.world_mut() + .resource_mut::() + .update_material( + reference.0.asset_id.clone(), + 2, + authored_standard_material("Live Material", second_color), + ); + app.update(); + app.update(); + + assert_eq!( + app.world() + .get::>(draw) + .unwrap() + .0, + handle, + "ordinary live edits must mutate the cached handle instead of rehydrating geometry" + ); + assert_eq!( + app.world() + .resource::>() + .get(&handle) + .unwrap() + .base_color, + second_color.to_color(), + "disk-backed state must not overwrite the live document on a later frame" + ); +} + +#[test] +fn live_base_material_changes_flow_through_direct_instances() { + let mut app = live_material_app(); + let base_reference = MaterialRef::new( + shared::EditorAssetRef::new("live-base", "material:source", "Live Base") + .with_source_path("assets/materials/live_base.ron"), + ); + let instance_reference = MaterialRef::new( + shared::EditorAssetRef::new("live-instance", "material:instance", "Live Instance") + .with_source_path("assets/materials/live_instance.ron"), + ); + let first_color = shared::ColorDesc::srgb(0.7, 0.2, 0.1); + { + let mut overlay = app + .world_mut() + .resource_mut::(); + overlay.update_material( + base_reference.0.asset_id.clone(), + 1, + authored_standard_material("Live Base", first_color), + ); + overlay.update_instance( + instance_reference.0.asset_id.clone(), + 1, + MaterialInstanceAsset { + schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, + label: "Live Instance".into(), + base: base_reference.clone(), + overrides: shared::MaterialInputSet { + values: vec![shared::MaterialParameter { + name: "metallic".into(), + value: MaterialParameterValue::Float(0.75), + }], + textures: Vec::new(), + }, + }, + ); + } + let emergency = app + .world_mut() + .resource_mut::>() + .add(StandardMaterial::default()); + let draw = app + .world_mut() + .spawn(( + HydratedMaterialSlotBinding { + owner: Entity::PLACEHOLDER, + slot_id: shared::ComponentInstanceId::new("slot:body"), + selection: HydratedMaterialSelection::Project { + reference: instance_reference, + layer: shared::HydratedMaterialLayer::Actor, + }, + }, + MeshMaterial3d(emergency), + )) + .id(); + app.update(); + let handle = app + .world() + .get::>(draw) + .unwrap() + .0 + .clone(); + + let second_color = shared::ColorDesc::srgb(0.1, 0.25, 0.85); + app.world_mut() + .resource_mut::() + .update_material( + base_reference.0.asset_id.clone(), + 2, + authored_standard_material("Live Base", second_color), + ); + app.update(); + app.update(); + + let materials = app.world().resource::>(); + let resolved = materials.get(&handle).unwrap(); + assert_eq!(resolved.base_color, second_color.to_color()); + assert_eq!(resolved.metallic, 0.75); + assert_eq!( + app.world() + .get::>(draw) + .unwrap() + .0, + handle + ); +} + +#[test] +fn property_block_revision_is_stable_and_changes_with_values() { + let mut block = MaterialPropertyBlock { + slot_id: shared::ComponentInstanceId::new("slot:body"), + parameters: vec![shared::MaterialParameter { + name: "roughness".into(), + value: MaterialParameterValue::Float(0.25), + }], + textures: Vec::new(), + }; + let first = property_block_revision(&block, None, None, 7); + assert_eq!(first, property_block_revision(&block, None, None, 7)); + block.parameters[0].value = MaterialParameterValue::Float(0.8); + assert_ne!(first, property_block_revision(&block, None, None, 7)); + assert_ne!(first, property_block_revision(&block, None, None, 8)); +} + +#[test] +fn invalid_standard_property_blocks_are_rejected_before_mutation() { + let mut block = MaterialPropertyBlock { + slot_id: shared::ComponentInstanceId::new("slot:body"), + parameters: vec![shared::MaterialParameter { + name: "unsupported".into(), + value: MaterialParameterValue::Float(0.25), + }], + textures: Vec::new(), + }; + + assert!(validate_standard_property_block(&block, false).is_err()); + assert!(validate_standard_property_block(&block, true).is_ok()); + block.parameters[0] = shared::MaterialParameter { + name: "roughness".into(), + value: MaterialParameterValue::Float(1.25), + }; + assert!(validate_standard_property_block(&block, false).is_err()); + block.parameters[0].value = MaterialParameterValue::Color(shared::ColorDesc::default()); + assert!(validate_standard_property_block(&block, false).is_err()); +} + +#[test] +fn surface_property_block_overrides_existing_instance_value() { + let property = shared::MaterialParameter { + name: "tint_strength".into(), + value: MaterialParameterValue::Float(0.9), + }; + let block = MaterialPropertyBlock { + slot_id: shared::ComponentInstanceId::new("slot:body"), + parameters: vec![property.clone()], + textures: Vec::new(), + }; + let schema = ShaderSchemaAsset { + schema_version: shared::SURFACE_SHADER_SCHEMA_VERSION, + label: "Tint".into(), + kind: shared::MaterialShaderKind::Custom, + wgsl_path: None, + schema: shared::MaterialInputSchema { + groups: vec![shared::MaterialInputGroupDesc { + id: "surface".into(), + display_name: "Surface".into(), + ..Default::default() + }], + inputs: vec![shared::ShaderPropertyDesc { + name: "tint_strength".into(), + display_name: "Tint strength".into(), + group: "surface".into(), + order: 0, + property_type: ShaderPropertyType::Float { + min: Some(0.0), + max: Some(1.0), + }, + default_value: Some(MaterialParameterValue::Float(0.0)), + texture: None, + tooltip: String::new(), + advanced: false, + presentation: Default::default(), + }], + }, + }; + validate_standard_property_block(&block, true).unwrap(); + validate_surface_property_block(Some(&schema), &block).unwrap(); + + let mut asset = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Base".into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: shared::MaterialRenderState::default(), + inputs: shared::MaterialInputSet::from_material_desc(&MaterialDesc { + parameters: vec![shared::MaterialParameter { + name: "tint_strength".into(), + value: MaterialParameterValue::Float(0.1), + }], + ..Default::default() + }), + provenance: None, + }; + let mut instance = Some(MaterialInstanceAsset { + schema_version: MATERIAL_INSTANCE_SCHEMA_VERSION, + label: "Variant".into(), + base: MaterialRef::new(shared::EditorAssetRef::new( + "base-id", + "material:base", + "Base", + )), + overrides: shared::MaterialInputSet { + values: vec![shared::MaterialParameter { + name: "tint_strength".into(), + value: MaterialParameterValue::Float(0.4), + }], + textures: Vec::new(), + }, + }); + + merge_surface_property_block(&mut asset, &mut instance, &block); + + assert_eq!( + instance.unwrap().overrides.values, + vec![property], + "runtime block must be stronger than the selected Material Instance" + ); + assert_eq!( + asset + .inputs + .values + .iter() + .find(|value| value.name == "tint_strength") + .unwrap() + .value, + MaterialParameterValue::Float(0.1), + "promotion/runtime overrides must not mutate the shared base asset" + ); +} + +#[test] +fn standard_property_blocks_are_owner_local_and_reuse_cached_handles() { + let mut app = App::new(); + app.add_plugins(MinimalPlugins) + .add_plugins(AssetPlugin::default()) + .init_resource::>() + .init_resource::>() + .init_resource::() + .init_resource::() + .init_resource::() + .add_systems(Update, apply_material_property_blocks); + let base = app + .world_mut() + .resource_mut::>() + .add(StandardMaterial { + perceptual_roughness: 0.5, + ..Default::default() + }); + let slot = shared::ComponentInstanceId::new("slot:body"); + let spawn_owner = |world: &mut World, roughness: f32| { + world + .spawn(MaterialPropertyBlocks { + slots: vec![MaterialPropertyBlock { + slot_id: slot.clone(), + parameters: vec![shared::MaterialParameter { + name: "roughness".into(), + value: MaterialParameterValue::Float(roughness), + }], + textures: Vec::new(), + }], + }) + .id() + }; + let owner_a = spawn_owner(app.world_mut(), 0.2); + let owner_b = spawn_owner(app.world_mut(), 0.8); + let spawn_draw = |world: &mut World, owner| { + world + .spawn(( + HydratedMaterialSlotBinding { + owner, + slot_id: slot.clone(), + selection: HydratedMaterialSelection::Inherit, + }, + MeshMaterial3d(base.clone()), + )) + .id() + }; + let draw_a = spawn_draw(app.world_mut(), owner_a); + let draw_b = spawn_draw(app.world_mut(), owner_b); + + app.update(); + + let handle_a = app + .world() + .get::>(draw_a) + .unwrap() + .0 + .clone(); + let handle_b = app + .world() + .get::>(draw_b) + .unwrap() + .0 + .clone(); + assert_ne!(handle_a, handle_b); + assert_ne!(handle_a, base); + assert_ne!(handle_b, base); + let materials = app.world().resource::>(); + assert_eq!(materials.get(&base).unwrap().perceptual_roughness, 0.5); + assert_eq!(materials.get(&handle_a).unwrap().perceptual_roughness, 0.2); + assert_eq!(materials.get(&handle_b).unwrap().perceptual_roughness, 0.8); + assert_eq!( + app.world() + .resource::() + .entries + .len(), + 2 + ); + let material_count = materials.len(); + + app.update(); + + assert_eq!( + app.world() + .get::>(draw_a) + .unwrap() + .0, + handle_a + ); + assert_eq!( + app.world() + .get::>(draw_b) + .unwrap() + .0, + handle_b + ); + assert_eq!( + app.world().resource::>().len(), + material_count, + "steady property-block application must not grow material handles" + ); +} + +#[test] +fn invalid_property_block_keeps_base_visible_with_one_diagnostic() { + let mut app = App::new(); + app.add_plugins(MinimalPlugins) + .add_plugins(AssetPlugin::default()) + .init_resource::>() + .init_resource::>() + .init_resource::() + .init_resource::() + .init_resource::() + .add_systems(Update, apply_material_property_blocks); + let base = app + .world_mut() + .resource_mut::>() + .add(StandardMaterial::default()); + let slot_id = shared::ComponentInstanceId::new("slot:body"); + let owner = app + .world_mut() + .spawn(MaterialPropertyBlocks { + slots: vec![MaterialPropertyBlock { + slot_id: slot_id.clone(), + parameters: vec![shared::MaterialParameter { + name: "unsupported".into(), + value: MaterialParameterValue::Float(0.5), + }], + textures: Vec::new(), + }], + }) + .id(); + let draw = app + .world_mut() + .spawn(( + HydratedMaterialSlotBinding { + owner, + slot_id, + selection: HydratedMaterialSelection::Inherit, + }, + MeshMaterial3d(base.clone()), + )) + .id(); + + app.update(); + app.update(); + + assert_eq!( + app.world() + .get::>(draw) + .unwrap() + .0, + base + ); + let diagnostics = &app.world().resource::().0; + assert_eq!(diagnostics.len(), 1); + assert!(diagnostics[0].contains("unsupported")); +} + +#[test] +fn abi_limits_are_stable() { + assert_eq!(SURFACE_PARAMETER_LANES, 16); + assert_eq!(SURFACE_TEXTURE_SLOTS, 8); + assert_eq!(std::mem::size_of::(), 400); +} + +#[test] +fn material_extensions_leave_non_deferred_prepasses_to_standard_material() { + assert!(matches!( + ::prepass_fragment_shader(), + ShaderRef::Default + )); + assert!(matches!( + ::prepass_fragment_shader(), + ShaderRef::Default + )); + assert!(!surface_evaluator_owns_fragment(&[ + "PREPASS_PIPELINE".into(), + "NORMAL_PREPASS".into(), + ])); + assert!(surface_evaluator_owns_fragment(&[ + "PREPASS_PIPELINE".into(), + "DEFERRED_PREPASS".into(), + ])); + assert!(surface_evaluator_owns_fragment(&[])); +} + +#[test] +fn terrain_layer_builder_packs_project_material_values() { + let mut app = App::new(); + app.add_plugins((MinimalPlugins, AssetPlugin::default())); + let asset_server = app.world().resource::(); + let materials_root = + std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../../assets/materials"); + let layers = [ + TerrainMaterialLayer { + material: Some( + shared::EditorAssetRef::new("concrete", "material:source", "Concrete") + .with_source_path(materials_root.join("concrete.ron").display().to_string()), + ), + uv_scale: 6.0, + }, + TerrainMaterialLayer { + material: Some( + shared::EditorAssetRef::new("tint", "material:source", "Surface Tint") + .with_source_path( + materials_root + .join("surface_tint.ron") + .display() + .to_string(), + ), + ), + uv_scale: 10.0, + }, + ]; + let mut diagnostics = Vec::new(); + let live_documents = LiveMaterialDocumentOverlay::default(); + let material = + build_terrain_layer_material(asset_server, &layers, &live_documents, &mut diagnostics); + + assert!(diagnostics.is_empty(), "{diagnostics:?}"); + assert_eq!(material.extension.uniform.uv_scales.x, 6.0); + assert_eq!(material.extension.uniform.uv_scales.y, 10.0); + assert_eq!(material.extension.uniform.properties[0].w, 1.0); + assert_eq!(material.extension.uniform.properties[1].w, 1.0); + assert_eq!( + material.base.opaque_render_method, + OpaqueRendererMethod::Forward + ); + assert_ne!( + material.extension.uniform.base_colors[0], + material.extension.uniform.base_colors[1] + ); +} diff --git a/crates/blacksite_surface/src/surface/validation.rs b/crates/blacksite_surface/src/surface/validation.rs new file mode 100644 index 0000000..027ba63 --- /dev/null +++ b/crates/blacksite_surface/src/surface/validation.rs @@ -0,0 +1,81 @@ +use super::*; + +pub fn validate_surface_evaluator(source: &str) -> Result<(), String> { + if !source.contains("fn evaluate(") { + return Err("surface WGSL must define `fn evaluate(`".into()); + } + for forbidden in [ + "@group", + "@binding", + "@vertex", + "@fragment", + "@compute", + "var<", + "rayQuery", + "dpdx", + "dpdy", + "fwidth", + "discard", + "Barrier", + "subgroup", + "textureStore", + "atomic", + ] { + if source.contains(forbidden) { + return Err(format!( + "surface WGSL uses forbidden construct `{forbidden}`" + )); + } + } + let validation_source = format!("{EVALUATOR_VALIDATION_PRELUDE}\n{source}"); + let module = naga::front::wgsl::parse_str(&validation_source) + .map_err(|error| format!("surface WGSL syntax error: {error}"))?; + naga::valid::Validator::new( + naga::valid::ValidationFlags::all(), + naga::valid::Capabilities::empty(), + ) + .validate(&module) + .map_err(|error| format!("surface WGSL validation error: {error}"))?; + Ok(()) +} + +pub(super) const EVALUATOR_VALIDATION_PRELUDE: &str = r#" +struct SurfaceInput { + uv0: vec2, + world_position: vec3, + world_normal: vec3, +} +struct SurfaceParams { lanes: array, 16>, } +struct SurfaceSamples { values: array, 8>, } +struct Surface { + base_color: vec4, + normal_ts: vec3, + emissive: vec3, + metallic: f32, + perceptual_roughness: f32, + reflectance: f32, + occlusion: f32, + model: u32, +} +fn surface_default() -> Surface { + var surface: Surface; + surface.base_color = vec4(1.0); + surface.normal_ts = vec3(0.0, 0.0, 1.0); + surface.emissive = vec3(0.0); + surface.metallic = 0.0; + surface.perceptual_roughness = 0.5; + surface.reflectance = 0.5; + surface.occlusion = 1.0; + surface.model = 0u; + return surface; +} +"#; + +pub fn compose_surface_shader(evaluator: &str) -> String { + format!( + "{}\n{}\n{}", + include_str!("../surface_header.wgsl"), + evaluator, + include_str!("../surface_footer.wgsl") + ) +} diff --git a/crates/content_pipeline/AGENTS.md b/crates/content_pipeline/AGENTS.md new file mode 100644 index 0000000..44922d5 --- /dev/null +++ b/crates/content_pipeline/AGENTS.md @@ -0,0 +1,12 @@ +# Content pipeline subtree rules + +- This crate owns UI-independent asset, import, catalog, transaction, watcher, and processing + behavior. +- Preserve transaction atomicity, byte-identical rollback, stable identity, reference repair, + derived-artifact ownership, managed-path protection, watcher suppression, and deterministic + restart behavior. +- Prefer focused tests here over heavy editor tests. +- Never depend on the editor crate. +- Keep GPU and rendering requirements out of headless paths. +- A defect in one content operation may justify one bounded sibling-operation invariant audit, not + an unlimited repository audit. diff --git a/crates/content_pipeline/Cargo.toml b/crates/content_pipeline/Cargo.toml new file mode 100644 index 0000000..a754c2f --- /dev/null +++ b/crates/content_pipeline/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "content_pipeline" +version.workspace = true +edition.workspace = true +license.workspace = true +description = "UI-independent Blacksite content discovery, registry, and transaction pipeline" + +[dependencies] +blake3 = "1" +bevy.workspace = true +bevy_ufbx.workspace = true +basis-universal = "0.3.1" +gltf = { version = "1.4", features = ["extras"] } +image = "0.25.10" +notify = "6.1" +ron = "0.8" +serde.workspace = true +serde_json = "1" +shared.workspace = true +walkdir = "2.5" +uuid = { version = "1", features = ["v4"] } +ufbx = "0.9" + +[dev-dependencies] diff --git a/crates/content_pipeline/src/animation.rs b/crates/content_pipeline/src/animation.rs new file mode 100644 index 0000000..21525c8 --- /dev/null +++ b/crates/content_pipeline/src/animation.rs @@ -0,0 +1,912 @@ +//! Generated animation artifacts for imported model sources. + +use std::collections::BTreeSet; +use std::fs; +use std::path::Path; + +use serde::Deserialize; +use shared::{ + animation_clip_sub_asset_id, animation_skeleton_sub_asset_id, AnimationClipRecord, + AnimationDiagnosticSeverity, AnimationEventDesc, AnimationImportDiagnostic, AnimationManifest, + AnimationManifestSource, AnimationSkeletonRecord, AnimationSkeletonSignature, + AnimationSourceFingerprint, ANIMATION_ARTIFACT_DIR, ANIMATION_MANIFEST_SCHEMA_VERSION, +}; + +use crate::fingerprint::write_pretty_ron_if_changed; +use shared::AssetRecord; + +pub fn animation_manifest_path(asset_id: &str) -> String { + format!("{ANIMATION_ARTIFACT_DIR}/{asset_id}.animation.ron") +} + +pub fn refresh_animation_artifact(record: &mut AssetRecord) -> Result { + let (manifest, path) = plan_animation_artifact(record)?; + + if write_pretty_ron_if_changed(&path, &manifest) + .map_err(|error| format!("could not publish animation manifest {path}: {error}"))? + { + bevy::log::info!( + "Animation manifest refreshed: source={} artifact={} skeletons={} clips={} runtime_supported={}", + record.path, + path, + manifest.skeletons.len(), + manifest.clips.len(), + manifest.runtime_supported + ); + } + + Ok(manifest) +} + +pub fn plan_animation_artifact( + record: &mut AssetRecord, +) -> Result<(AnimationManifest, String), String> { + let mut manifest = build_animation_manifest(record)?; + manifest.source.dependencies.sort(); + manifest.source.dependencies.dedup(); + + let path = animation_manifest_path(&record.id.as_string()); + record.model_import_mut().animation_manifest_path = Some(path.clone()); + record + .dependencies + .extend(manifest.source.dependencies.iter().cloned()); + record.dependencies.sort(); + record.dependencies.dedup(); + Ok((manifest, path)) +} + +pub fn load_animation_manifest(path: &str) -> Result { + let text = + fs::read_to_string(path).map_err(|error| format!("could not read {path}: {error}"))?; + ron::from_str(&text).map_err(|error| format!("could not parse {path}: {error}")) +} + +pub fn build_animation_manifest(record: &AssetRecord) -> Result { + let bytes = fs::read(&record.path) + .map_err(|error| format!("could not read {}: {error}", record.path))?; + let fingerprint = source_fingerprint(&bytes); + let format = source_format(&record.path)?; + match format.as_str() { + "gltf" | "glb" => build_gltf_manifest(record, format, fingerprint, &bytes), + "fbx" => build_fbx_manifest(record, format, fingerprint, &bytes), + _ => Err(format!("unsupported animation source format `{format}`")), + } +} + +#[derive(Debug, Clone)] +struct SkeletonCandidate { + compatible_nodes: BTreeSet, + signature: AnimationSkeletonSignature, +} + +fn build_gltf_manifest( + record: &AssetRecord, + format: String, + fingerprint: AnimationSourceFingerprint, + bytes: &[u8], +) -> Result { + let gltf = gltf::Gltf::from_slice(bytes) + .map_err(|error| format!("could not parse glTF {}: {error}", record.path))?; + let base = Path::new(&record.path).parent(); + let buffers = gltf::import_buffers(&gltf.document, base, gltf.blob.clone()) + .map_err(|error| format!("could not load glTF buffers for {}: {error}", record.path))?; + + let mut dependencies = gltf + .document + .buffers() + .filter_map(|buffer| match buffer.source() { + gltf::buffer::Source::Uri(uri) if !uri.starts_with("data:") => { + Some(resolve_dependency(&record.path, uri)) + } + _ => None, + }) + .collect::>(); + dependencies.sort(); + dependencies.dedup(); + + let node_identity_names = gltf + .document + .nodes() + .map(|node| bevy_node_segment(node.name(), node.index())) + .collect::>(); + let readable_node_names = gltf + .document + .nodes() + .map(|node| normalized_node_segment(node.name(), node.index())) + .collect::>(); + let mut parents = vec![None; node_identity_names.len()]; + for node in gltf.document.nodes() { + for child in node.children() { + parents[child.index()] = Some(node.index()); + } + } + + let mut skeletons = Vec::new(); + let mut candidates = Vec::new(); + for skin in gltf.document.skins() { + let source_index = skin.index(); + let label = skin + .name() + .filter(|name| !name.trim().is_empty()) + .map(str::to_string) + .unwrap_or_else(|| format!("Skeleton {source_index}")); + let joint_indices = skin.joints().map(|joint| joint.index()).collect::>(); + let joint_identity_paths = joint_indices + .iter() + .map(|index| node_path_segments(*index, &node_identity_names, &parents)) + .collect::>(); + let joint_paths = joint_indices + .iter() + .map(|index| node_path(*index, &readable_node_names, &parents)) + .collect::>(); + let bind_poses = skin + .reader(|buffer| Some(buffers[buffer.index()].0.as_slice())) + .read_inverse_bind_matrices() + .map(|matrices| matrices.map(gltf_matrix_bytes).collect::>()) + .unwrap_or_else(|| vec![identity_matrix_bytes(); joint_paths.len()]); + let signature = skeleton_signature(&joint_identity_paths, &bind_poses); + let mut compatible_nodes = joint_indices.into_iter().collect::>(); + if let Some(root) = skin.skeleton() { + compatible_nodes.insert(root.index()); + } + candidates.push(SkeletonCandidate { + compatible_nodes, + signature: signature.clone(), + }); + skeletons.push(AnimationSkeletonRecord { + id: animation_skeleton_sub_asset_id(source_index, &label), + label, + source_index, + signature, + joint_paths, + }); + } + + let mut diagnostics = Vec::new(); + let mut clips = Vec::new(); + let mut animation_roots = BTreeSet::new(); + for animation in gltf.document.animations() { + let source_index = animation.index(); + let label = animation + .name() + .filter(|name| !name.trim().is_empty()) + .map(str::to_string) + .unwrap_or_else(|| format!("Animation {source_index}")); + let mut duration_seconds = 0.0_f32; + let mut target_nodes = BTreeSet::new(); + for channel in animation.channels() { + let target_index = channel.target().node().index(); + target_nodes.insert(target_index); + animation_roots.insert(top_level_node(target_index, &parents)); + if let Some(inputs) = channel + .reader(|buffer| Some(buffers[buffer.index()].0.as_slice())) + .read_inputs() + { + for input in inputs { + if input.is_finite() { + duration_seconds = duration_seconds.max(input); + } + } + } + } + let target_skeleton_signature = matching_skeleton_signature(&target_nodes, &candidates); + if !candidates.is_empty() && target_skeleton_signature.is_none() { + diagnostics.push(AnimationImportDiagnostic { + severity: AnimationDiagnosticSeverity::Warning, + code: "animation.clip_skeleton_unresolved".into(), + message: format!( + "clip `{label}` does not target a uniquely identifiable imported skeleton" + ), + repair: "Export the clip with channels targeting one skeleton, or split unrelated rigs into separate glTF assets.".into(), + }); + } + let events = gltf_animation_events(&animation, duration_seconds, &label, &mut diagnostics); + clips.push(AnimationClipRecord { + id: animation_clip_sub_asset_id(source_index, &label), + label, + source_index, + duration_seconds, + target_skeleton_signature, + events, + }); + } + + let default_animation_clip_id = record.model_import().default_animation_clip_id.clone(); + validate_default_animation_clip( + default_animation_clip_id.as_deref(), + &clips, + &mut diagnostics, + ); + + let runtime_supported = animation_roots.len() <= 1; + if !runtime_supported { + let roots = animation_roots + .iter() + .map(|index| format!("`{}` (node {index})", node_identity_names[*index])) + .collect::>() + .join(", "); + diagnostics.push(AnimationImportDiagnostic { + severity: AnimationDiagnosticSeverity::Error, + code: "animation.multiple_roots_unsupported".into(), + message: format!( + "animation channels target {} distinct top-level roots ({roots}); Bevy requires a separate AnimationPlayer for each root", + animation_roots.len() + ), + repair: "Split the source into one animated rig per glTF asset, or export every clip under one common top-level root, then reimport.".into(), + }); + } + + Ok(AnimationManifest { + schema_version: ANIMATION_MANIFEST_SCHEMA_VERSION, + asset_id: record.id.as_string(), + label: record.label.clone(), + default_animation_clip_id, + source: AnimationManifestSource { + path: record.path.clone(), + format, + fingerprint, + dependencies, + }, + runtime_supported, + skeletons, + clips, + diagnostics, + }) +} + +fn build_fbx_manifest( + record: &AssetRecord, + format: String, + fingerprint: AnimationSourceFingerprint, + bytes: &[u8], +) -> Result { + let scene = ufbx::load_memory( + bytes, + ufbx::LoadOpts { + target_unit_meters: 1.0, + target_axes: ufbx::CoordinateAxes::right_handed_y_up(), + ..Default::default() + }, + ) + .map_err(|error| format!("could not parse FBX {}: {error:?}", record.path))?; + + let mut skeletons = Vec::new(); + for (source_index, skin) in scene.skin_deformers.as_ref().iter().enumerate() { + let label = if skin.element.name.is_empty() { + format!("Skeleton {source_index}") + } else { + skin.element.name.to_string() + }; + let mut joint_identity_paths = Vec::new(); + let mut joint_paths = Vec::new(); + let mut bind_poses = Vec::new(); + for cluster in skin.clusters.as_ref() { + let Some(bone) = cluster.bone_node.as_ref() else { + continue; + }; + let segments = fbx_node_path_segments(bone.as_ref()); + joint_paths.push(segments.join("/")); + joint_identity_paths.push(segments); + bind_poses.push(fbx_matrix_bytes(&cluster.bind_to_world)); + } + let signature = skeleton_signature(&joint_identity_paths, &bind_poses); + skeletons.push(AnimationSkeletonRecord { + id: animation_skeleton_sub_asset_id(source_index, &label), + label, + source_index, + signature, + joint_paths, + }); + } + + let fallback_signature = (skeletons.len() == 1).then(|| skeletons[0].signature.clone()); + let clips = scene + .anim_stacks + .as_ref() + .iter() + .enumerate() + .map(|(source_index, stack)| { + let label = if stack.element.name.is_empty() { + format!("Animation {source_index}") + } else { + stack.element.name.to_string() + }; + AnimationClipRecord { + id: animation_clip_sub_asset_id(source_index, &label), + label, + source_index, + duration_seconds: (stack.time_end - stack.time_begin).max(0.0) as f32, + target_skeleton_signature: fallback_signature.clone(), + events: Vec::new(), + } + }) + .collect::>(); + + let (runtime_supported, mut diagnostics) = fbx_runtime_support( + scene.anim_stacks.as_ref().len(), + scene.skin_deformers.as_ref().len(), + ); + let default_animation_clip_id = record.model_import().default_animation_clip_id.clone(); + validate_default_animation_clip( + default_animation_clip_id.as_deref(), + &clips, + &mut diagnostics, + ); + + Ok(AnimationManifest { + schema_version: ANIMATION_MANIFEST_SCHEMA_VERSION, + asset_id: record.id.as_string(), + label: record.label.clone(), + default_animation_clip_id, + source: AnimationManifestSource { + path: record.path.clone(), + format, + fingerprint, + dependencies: Vec::new(), + }, + runtime_supported, + skeletons, + clips, + diagnostics, + }) +} + +fn validate_default_animation_clip( + default_clip_id: Option<&str>, + clips: &[AnimationClipRecord], + diagnostics: &mut Vec, +) { + let Some(default_clip_id) = default_clip_id.filter(|id| !id.trim().is_empty()) else { + return; + }; + if clips.iter().any(|clip| clip.id == default_clip_id) { + return; + } + diagnostics.push(AnimationImportDiagnostic { + severity: AnimationDiagnosticSeverity::Error, + code: "animation.default_clip_missing".into(), + message: format!( + "configured default animation clip `{default_clip_id}` no longer exists in the imported source" + ), + repair: "Choose an existing Default animation in Model Import Settings, or select Imported rest pose, then reimport.".into(), + }); +} + +fn fbx_runtime_support( + animation_count: usize, + skin_count: usize, +) -> (bool, Vec) { + let mut diagnostics = Vec::new(); + if animation_count > 0 || skin_count > 0 { + diagnostics.push(AnimationImportDiagnostic { + severity: AnimationDiagnosticSeverity::Error, + code: "animation.fbx_runtime_unsupported".into(), + message: format!( + "FBX contains {animation_count} animation stack(s) and {skin_count} skin deformer(s), but Blacksite's current FBX loader cannot build a runtime skeleton or clips" + ), + repair: "Export the animated source as glTF 2.0 (.glb or .gltf). Keep FBX only for static mesh import until hierarchy, SkinnedMesh, and AnimationClip conversion are implemented.".into(), + }); + } + (false, diagnostics) +} + +#[derive(Debug, Default, Deserialize)] +struct GltfAnimationExtras { + #[serde(default)] + blacksite_events: Vec, +} + +#[derive(Debug, Deserialize)] +struct GltfAnimationEvent { + id: String, + time_seconds: f32, + #[serde(default)] + payload: Option, +} + +fn gltf_animation_events( + animation: &gltf::Animation<'_>, + duration_seconds: f32, + clip_label: &str, + diagnostics: &mut Vec, +) -> Vec { + let Some(raw) = animation.extras().as_ref() else { + return Vec::new(); + }; + let extras = match serde_json::from_str::(raw.get()) { + Ok(extras) => extras, + Err(error) => { + diagnostics.push(AnimationImportDiagnostic { + severity: AnimationDiagnosticSeverity::Warning, + code: "animation.events_invalid".into(), + message: format!("clip `{clip_label}` has invalid animation event metadata: {error}"), + repair: "Use an animation extras object with `blacksite_events` entries containing `id`, `time_seconds`, and optional string `payload`.".into(), + }); + return Vec::new(); + } + }; + + let mut events = Vec::new(); + for event in extras.blacksite_events { + let valid_time = event.time_seconds.is_finite() + && event.time_seconds >= 0.0 + && event.time_seconds <= duration_seconds; + if event.id.trim().is_empty() || !valid_time { + diagnostics.push(AnimationImportDiagnostic { + severity: AnimationDiagnosticSeverity::Warning, + code: "animation.event_out_of_range".into(), + message: format!( + "clip `{clip_label}` contains an event with an empty ID or time outside 0..={duration_seconds:.3}s" + ), + repair: "Give every event a stable non-empty ID and place it within the imported clip duration.".into(), + }); + continue; + } + events.push(AnimationEventDesc { + id: event.id, + time_seconds: event.time_seconds, + payload: event.payload, + }); + } + events.sort_by(|left, right| { + left.time_seconds + .total_cmp(&right.time_seconds) + .then(left.id.cmp(&right.id)) + .then(left.payload.cmp(&right.payload)) + }); + events +} + +fn matching_skeleton_signature( + target_nodes: &BTreeSet, + candidates: &[SkeletonCandidate], +) -> Option { + let scored = candidates + .iter() + .map(|candidate| { + ( + candidate + .compatible_nodes + .intersection(target_nodes) + .count(), + candidate, + ) + }) + .filter(|(score, _)| *score > 0) + .collect::>(); + let best_score = scored.iter().map(|(score, _)| *score).max()?; + let mut best = scored + .into_iter() + .filter(|(score, _)| *score == best_score) + .map(|(_, candidate)| candidate); + let candidate = best.next()?; + best.all(|other| other.signature == candidate.signature) + .then(|| candidate.signature.clone()) +} + +fn node_path(index: usize, names: &[String], parents: &[Option]) -> String { + node_path_segments(index, names, parents).join("/") +} + +fn node_path_segments(index: usize, names: &[String], parents: &[Option]) -> Vec { + let mut segments = Vec::new(); + let mut current = Some(index); + while let Some(node_index) = current { + segments.push(names[node_index].clone()); + current = parents[node_index]; + } + segments.reverse(); + segments +} + +fn top_level_node(index: usize, parents: &[Option]) -> usize { + let mut current = index; + while let Some(parent) = parents[current] { + current = parent; + } + current +} + +fn bevy_node_segment(name: Option<&str>, index: usize) -> String { + name.map(str::to_string) + .unwrap_or_else(|| format!("GltfNode{index}")) +} + +fn normalized_node_segment(name: Option<&str>, index: usize) -> String { + name.map(str::trim) + .filter(|name| !name.is_empty()) + .map(|name| name.replace(['/', '\\'], "_")) + .unwrap_or_else(|| format!("Node{index}")) +} + +fn fbx_node_path_segments(node: &ufbx::Node) -> Vec { + let mut segments = Vec::new(); + let mut current = Some(node); + while let Some(node) = current { + segments.push(normalized_node_segment( + (!node.element.name.is_empty()).then(|| node.element.name.as_ref()), + node.element.element_id as usize, + )); + current = node.parent.as_ref().map(|parent| parent.as_ref()); + } + segments.reverse(); + segments +} + +fn skeleton_signature( + joint_path_segments: &[Vec], + bind_pose_bytes: &[Vec], +) -> AnimationSkeletonSignature { + let mut hasher = blake3::Hasher::new(); + hasher.update(b"blacksite-animation-skeleton-v2\0"); + hasher.update(&(joint_path_segments.len() as u64).to_le_bytes()); + for path in joint_path_segments { + hasher.update(&(path.len() as u64).to_le_bytes()); + for segment in path { + let bytes = segment.as_bytes(); + hasher.update(&(bytes.len() as u64).to_le_bytes()); + hasher.update(bytes); + } + } + hasher.update(&(bind_pose_bytes.len() as u64).to_le_bytes()); + for bytes in bind_pose_bytes { + hasher.update(&(bytes.len() as u64).to_le_bytes()); + hasher.update(bytes); + } + AnimationSkeletonSignature::new(hasher.finalize().to_hex().to_string()) +} + +fn gltf_matrix_bytes(matrix: [[f32; 4]; 4]) -> Vec { + matrix + .into_iter() + .flatten() + .flat_map(f32::to_le_bytes) + .collect() +} + +fn identity_matrix_bytes() -> Vec { + gltf_matrix_bytes([ + [1.0, 0.0, 0.0, 0.0], + [0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 1.0, 0.0], + [0.0, 0.0, 0.0, 1.0], + ]) +} + +fn fbx_matrix_bytes(matrix: &ufbx::Matrix) -> Vec { + [ + matrix.m00, matrix.m10, matrix.m20, matrix.m01, matrix.m11, matrix.m21, matrix.m02, + matrix.m12, matrix.m22, matrix.m03, matrix.m13, matrix.m23, + ] + .into_iter() + .flat_map(f64::to_le_bytes) + .collect() +} + +fn source_fingerprint(bytes: &[u8]) -> AnimationSourceFingerprint { + AnimationSourceFingerprint::from_bytes(bytes) +} + +fn source_format(path: &str) -> Result { + Path::new(path) + .extension() + .and_then(|extension| extension.to_str()) + .map(|extension| extension.to_ascii_lowercase()) + .ok_or_else(|| format!("asset path `{path}` has no extension")) +} + +fn resolve_dependency(source_path: &str, uri: &str) -> String { + Path::new(source_path) + .parent() + .unwrap_or_else(|| Path::new("")) + .join(uri) + .to_string_lossy() + .replace('\\', "/") +} + +#[cfg(test)] +mod tests { + use super::*; + use shared::{AssetId, AssetImportSettings, ImportSettings}; + use uuid::Uuid; + + fn fixture_record(path: &Path) -> AssetRecord { + AssetRecord { + id: AssetId(Uuid::nil()), + path: path.to_string_lossy().replace('\\', "/"), + label: "Animated Hero".into(), + kind: shared::AssetKind::Model, + source_fingerprint: None, + import_settings: AssetImportSettings::Model(ImportSettings::default()), + dependencies: Vec::new(), + } + } + + fn write_animated_gltf(root: &Path) -> std::path::PathBuf { + fs::create_dir_all(root).unwrap(); + let mut buffer = Vec::new(); + for value in [0.0_f32, 1.25] { + buffer.extend_from_slice(&value.to_le_bytes()); + } + for value in [0.0_f32, 0.0, 0.0, 1.0, 0.0, 0.38268343, 0.0, 0.9238795] { + buffer.extend_from_slice(&value.to_le_bytes()); + } + fs::write(root.join("animated.bin"), buffer).unwrap(); + let gltf = r#"{ + "asset":{"version":"2.0"}, + "scene":0, + "scenes":[{"nodes":[0]}], + "nodes":[{"name":"Armature","children":[1]},{"name":"Hip"}], + "skins":[{"name":"Hero Rig","skeleton":0,"joints":[1]}], + "buffers":[{"uri":"animated.bin","byteLength":40}], + "bufferViews":[ + {"buffer":0,"byteOffset":0,"byteLength":8}, + {"buffer":0,"byteOffset":8,"byteLength":32} + ], + "accessors":[ + {"bufferView":0,"componentType":5126,"count":2,"type":"SCALAR","min":[0.0],"max":[1.25]}, + {"bufferView":1,"componentType":5126,"count":2,"type":"VEC4"} + ], + "animations":[{ + "name":"Idle Loop", + "samplers":[{"input":0,"output":1,"interpolation":"LINEAR"}], + "channels":[{"sampler":0,"target":{"node":1,"path":"rotation"}}], + "extras":{"blacksite_events":[{"id":"footstep.left","time_seconds":0.5,"payload":"stone"}]} + }] + }"#; + let path = root.join("animated.gltf"); + fs::write(&path, gltf).unwrap(); + path + } + + fn write_multi_root_animated_gltf(root: &Path) -> std::path::PathBuf { + fs::create_dir_all(root).unwrap(); + let mut buffer = Vec::new(); + for value in [0.0_f32, 1.0] { + buffer.extend_from_slice(&value.to_le_bytes()); + } + for value in [0.0_f32, 0.0, 0.0, 1.0, 0.0, 0.38268343, 0.0, 0.9238795] { + buffer.extend_from_slice(&value.to_le_bytes()); + } + fs::write(root.join("multi-root.bin"), buffer).unwrap(); + let gltf = r#"{ + "asset":{"version":"2.0"}, + "scene":0, + "scenes":[{"nodes":[0,2]}], + "nodes":[ + {"name":"Character A","children":[1]}, + {"name":"Joint A"}, + {"name":"Character B","children":[3]}, + {"name":"Joint B"} + ], + "buffers":[{"uri":"multi-root.bin","byteLength":40}], + "bufferViews":[ + {"buffer":0,"byteOffset":0,"byteLength":8}, + {"buffer":0,"byteOffset":8,"byteLength":32} + ], + "accessors":[ + {"bufferView":0,"componentType":5126,"count":2,"type":"SCALAR","min":[0.0],"max":[1.0]}, + {"bufferView":1,"componentType":5126,"count":2,"type":"VEC4"} + ], + "animations":[{ + "name":"Two Players Required", + "samplers":[ + {"input":0,"output":1,"interpolation":"LINEAR"}, + {"input":0,"output":1,"interpolation":"LINEAR"} + ], + "channels":[ + {"sampler":0,"target":{"node":1,"path":"rotation"}}, + {"sampler":1,"target":{"node":3,"path":"rotation"}} + ] + }] + }"#; + let path = root.join("multi-root.gltf"); + fs::write(&path, gltf).unwrap(); + path + } + + #[test] + fn animation_manifest_path_uses_registry_uuid() { + assert_eq!( + animation_manifest_path("abc"), + "assets/animations/generated/abc.animation.ron" + ); + } + + #[test] + fn gltf_extraction_is_deterministic_and_preserves_duration_events_and_signature() { + let root = std::env::temp_dir().join(format!("blacksite-animation-{}", Uuid::new_v4())); + let path = write_animated_gltf(&root); + let record = fixture_record(&path); + + let first = build_animation_manifest(&record).unwrap(); + let second = build_animation_manifest(&record).unwrap(); + + assert_eq!(first, second); + assert_eq!(first.schema_version, ANIMATION_MANIFEST_SCHEMA_VERSION); + assert!(first.default_animation_clip_id.is_none()); + assert!(first.runtime_supported); + assert_eq!(first.source.dependencies.len(), 1); + assert_eq!(first.skeletons.len(), 1); + assert_eq!(first.clips.len(), 1); + assert_eq!(first.skeletons[0].id, "animation:skeleton:0:hero_rig"); + assert!(!first.skeletons[0].signature.is_empty()); + assert_eq!(first.clips[0].id, "animation:clip:0:idle_loop"); + assert_eq!(first.clips[0].duration_seconds, 1.25); + assert_eq!( + first.clips[0].target_skeleton_signature, + Some(first.skeletons[0].signature.clone()) + ); + assert_eq!(first.clips[0].events.len(), 1); + assert_eq!(first.clips[0].events[0].id, "footstep.left"); + assert_eq!(first.clips[0].events[0].time_seconds, 0.5); + assert_eq!(first.diagnostics, Vec::new()); + + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn legacy_mtime_metadata_does_not_rewrite_equivalent_animation_manifest() { + let root = + std::env::temp_dir().join(format!("blacksite-animation-legacy-{}", Uuid::new_v4())); + let path = write_animated_gltf(&root); + let manifest = build_animation_manifest(&fixture_record(&path)).unwrap(); + let canonical = + ron::ser::to_string_pretty(&manifest, ron::ser::PrettyConfig::default()).unwrap(); + let marker = format!("byte_len: {},", manifest.source.fingerprint.byte_len); + let legacy = canonical.replacen( + &marker, + &format!("{marker}\n modified_unix_secs: 123456,"), + 1, + ); + assert_ne!(legacy, canonical); + let artifact = root.join("legacy.animation.ron"); + fs::write(&artifact, &legacy).unwrap(); + + assert!(!write_pretty_ron_if_changed(&artifact, &manifest).unwrap()); + assert_eq!(fs::read_to_string(&artifact).unwrap(), legacy); + + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn explicit_default_clip_is_stable_and_stale_ids_are_diagnostic() { + let root = + std::env::temp_dir().join(format!("blacksite-animation-default-{}", Uuid::new_v4())); + let path = write_animated_gltf(&root); + let mut record = fixture_record(&path); + record.model_import_mut().default_animation_clip_id = + Some("animation:clip:0:idle_loop".into()); + + let manifest = build_animation_manifest(&record).unwrap(); + assert_eq!( + manifest.default_animation_clip_id.as_deref(), + Some("animation:clip:0:idle_loop") + ); + assert!(manifest.diagnostics.is_empty()); + + record.model_import_mut().default_animation_clip_id = + Some("animation:clip:99:removed".into()); + let stale = build_animation_manifest(&record).unwrap(); + assert!(stale.diagnostics.iter().any(|diagnostic| { + diagnostic.code == "animation.default_clip_missing" + && diagnostic.severity == AnimationDiagnosticSeverity::Error + })); + + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn exact_signature_changes_with_joint_path_or_bind_pose() { + let identity = identity_matrix_bytes(); + let first = skeleton_signature( + &[vec!["Armature".into(), "Hip".into()]], + std::slice::from_ref(&identity), + ); + let renamed = skeleton_signature( + &[vec!["Armature".into(), "Pelvis".into()]], + std::slice::from_ref(&identity), + ); + let mut changed_pose = identity; + changed_pose[0] ^= 1; + let rebound = skeleton_signature(&[vec!["Armature".into(), "Hip".into()]], &[changed_pose]); + assert_ne!(first, renamed); + assert_ne!(first, rebound); + } + + #[test] + fn exact_signature_preserves_bevy_node_bytes_and_segment_boundaries() { + let identity = identity_matrix_bytes(); + let slash_in_name = vec![vec!["Armature".into(), "Hip/Joint".into()]]; + let slash_as_boundary = vec![vec!["Armature/Hip".into(), "Joint".into()]]; + + assert_eq!(slash_in_name[0].join("/"), slash_as_boundary[0].join("/")); + assert_ne!( + skeleton_signature(&slash_in_name, std::slice::from_ref(&identity)), + skeleton_signature(&slash_as_boundary, std::slice::from_ref(&identity)) + ); + + let backslash = vec![vec!["Armature".into(), "Hip\\Joint".into()]]; + assert_eq!( + normalized_node_segment(Some("Hip/Joint"), 1), + normalized_node_segment(Some("Hip\\Joint"), 1) + ); + assert_ne!( + skeleton_signature(&slash_in_name, std::slice::from_ref(&identity)), + skeleton_signature(&backslash, std::slice::from_ref(&identity)) + ); + assert_eq!(bevy_node_segment(Some(" /Joint "), 7), " /Joint "); + assert_eq!(bevy_node_segment(None, 7), "GltfNode7"); + } + + #[test] + fn gltf_with_multiple_animation_roots_is_runtime_unsupported() { + let root = + std::env::temp_dir().join(format!("blacksite-animation-multi-root-{}", Uuid::new_v4())); + let path = write_multi_root_animated_gltf(&root); + let manifest = build_animation_manifest(&fixture_record(&path)).unwrap(); + + assert!(!manifest.runtime_supported); + let diagnostic = manifest + .diagnostics + .iter() + .find(|diagnostic| diagnostic.code == "animation.multiple_roots_unsupported") + .expect("multi-root glTF should include an actionable blocking diagnostic"); + assert_eq!(diagnostic.severity, AnimationDiagnosticSeverity::Error); + assert!(diagnostic.message.contains("2 distinct top-level roots")); + assert!(diagnostic.repair.contains("one common top-level root")); + + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn animated_or_skinned_fbx_is_runtime_unsupported_with_repair_guidance() { + let (supported, diagnostics) = fbx_runtime_support(2, 1); + assert!(!supported); + assert_eq!(diagnostics.len(), 1); + assert_eq!(diagnostics[0].severity, AnimationDiagnosticSeverity::Error); + assert_eq!(diagnostics[0].code, "animation.fbx_runtime_unsupported"); + assert!(diagnostics[0].repair.contains("glTF 2.0")); + + let (supported, diagnostics) = fbx_runtime_support(0, 0); + assert!(!supported); + assert!(diagnostics.is_empty()); + } + + #[test] + fn committed_robot_fixture_exposes_a_skin_and_multiple_named_states() { + let path = + Path::new(env!("CARGO_MANIFEST_DIR")).join("../../assets/models/robot_expressive.glb"); + let manifest = build_animation_manifest(&fixture_record(&path)).unwrap(); + + assert!(manifest.runtime_supported); + assert_eq!(manifest.skeletons.len(), 2); + assert_eq!(manifest.skeletons[0].id, "animation:skeleton:0:skeleton_0"); + assert_eq!(manifest.skeletons[1].id, "animation:skeleton:1:skeleton_1"); + assert!(manifest + .skeletons + .iter() + .all(|skeleton| skeleton.joint_paths.len() == 43)); + let signature = &manifest.skeletons[0].signature; + assert!(manifest + .skeletons + .iter() + .all(|skeleton| &skeleton.signature == signature)); + assert_eq!(manifest.clips.len(), 14); + for expected in ["Idle", "Walking", "Running", "Jump", "Wave"] { + assert!( + manifest.clips.iter().any(|clip| clip.label == expected), + "missing expected fixture clip {expected}" + ); + } + assert!(manifest + .clips + .iter() + .all(|clip| clip.duration_seconds.is_finite() && clip.duration_seconds > 0.0)); + assert!(manifest + .clips + .iter() + .all(|clip| { clip.target_skeleton_signature.as_ref() == Some(signature) })); + assert!(manifest.diagnostics.is_empty()); + } +} diff --git a/crates/content_pipeline/src/fingerprint.rs b/crates/content_pipeline/src/fingerprint.rs new file mode 100644 index 0000000..8667964 --- /dev/null +++ b/crates/content_pipeline/src/fingerprint.rs @@ -0,0 +1,111 @@ +use std::fs; +use std::path::Path; + +use serde::de::DeserializeOwned; +use serde::Serialize; +use shared::AssetSourceFingerprint; + +pub fn fingerprint_file(path: impl AsRef) -> Result { + let path = path.as_ref(); + let bytes = fs::read(path) + .map_err(|error| format!("could not read imported source {}: {error}", path.display()))?; + Ok(AssetSourceFingerprint::from_bytes(&bytes)) +} + +/// Writes canonical pretty RON only when the parsed document changes semantically. +/// +/// Equivalent existing bytes, including custom formatting and final-newline policy, stay intact. +pub fn write_pretty_ron_if_changed(path: impl AsRef, value: &T) -> Result +where + T: DeserializeOwned + PartialEq + Serialize, +{ + let path = path.as_ref(); + if fs::read_to_string(path) + .ok() + .and_then(|text| ron::from_str::(&text).ok()) + .is_some_and(|existing| existing == *value) + { + return Ok(false); + } + + let text = ron::ser::to_string_pretty(value, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("could not serialize RON: {error}"))?; + if fs::read(path).ok().as_deref() == Some(text.as_bytes()) { + return Ok(false); + } + if let Some(parent) = path.parent() { + fs::create_dir_all(parent) + .map_err(|error| format!("could not create {}: {error}", parent.display()))?; + } + fs::write(path, text) + .map_err(|error| format!("could not write {}: {error}", path.display()))?; + Ok(true) +} + +#[cfg(test)] +mod tests { + use super::*; + use serde::Deserialize; + use std::fs::{File, FileTimes}; + use std::time::{Duration, SystemTime}; + use uuid::Uuid; + + #[derive(Debug, Deserialize, PartialEq, Serialize)] + struct Fixture { + count: u32, + label: String, + } + + fn fixture_path(name: &str) -> std::path::PathBuf { + std::env::temp_dir().join(format!( + "blacksite-fingerprint-{name}-{}.ron", + Uuid::new_v4() + )) + } + + #[test] + fn metadata_only_drift_does_not_change_content_identity() { + let path = fixture_path("mtime"); + fs::write(&path, b"stable source bytes").unwrap(); + let before = fingerprint_file(&path).unwrap(); + File::options() + .write(true) + .open(&path) + .unwrap() + .set_times( + FileTimes::new().set_modified(SystemTime::now() + Duration::from_secs(86_400)), + ) + .unwrap(); + + assert_eq!(fingerprint_file(&path).unwrap(), before); + fs::remove_file(path).unwrap(); + } + + #[test] + fn same_size_byte_change_updates_content_identity() { + let path = fixture_path("same-size"); + fs::write(&path, b"source-a").unwrap(); + let before = fingerprint_file(&path).unwrap(); + fs::write(&path, b"source-b").unwrap(); + let after = fingerprint_file(&path).unwrap(); + + assert_eq!(before.byte_len, after.byte_len); + assert_ne!(before.content_hash, after.content_hash); + fs::remove_file(path).unwrap(); + } + + #[test] + fn equivalent_ron_preserves_exact_existing_bytes() { + let path = fixture_path("semantic"); + let existing = b"( label: \"stable\", count: 7, )\n\n"; + fs::write(&path, existing).unwrap(); + let value = Fixture { + count: 7, + label: "stable".into(), + }; + + assert!(!write_pretty_ron_if_changed(&path, &value).unwrap()); + assert_eq!(fs::read(&path).unwrap(), existing); + fs::remove_file(path).unwrap(); + } +} diff --git a/crates/content_pipeline/src/import.rs b/crates/content_pipeline/src/import.rs new file mode 100644 index 0000000..0973a9c --- /dev/null +++ b/crates/content_pipeline/src/import.rs @@ -0,0 +1,1497 @@ +//! External asset bundle inspection, conversion, and transactional import. + +use std::collections::{BTreeMap, BTreeSet}; +use std::fs; +use std::io; +use std::path::{Component, Path, PathBuf}; + +use bevy_ufbx::texture::{external_texture_paths, external_texture_reference}; +use shared::{ + AssetSourceFingerprint, ColorDesc, MaterialAlphaMode, MaterialAsset, MaterialDesc, + MaterialRenderState, +}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FbxDependencyInspection { + pub relative_paths: Vec, + pub resolved_paths: Vec, + pub missing_paths: Vec, +} + +/// Parses every external FBX texture reference without loading it through Bevy. +pub fn inspect_fbx_dependencies(source: &Path) -> Result { + let bytes = fs::read(source) + .map_err(|error| format!("could not read FBX {}: {error}", source.display()))?; + let filename_hint = source.to_string_lossy(); + let scene = ufbx::load_memory( + &bytes, + ufbx::LoadOpts { + target_unit_meters: 1.0, + target_axes: ufbx::CoordinateAxes::right_handed_y_up(), + filename: ufbx::StringOpt::Ref(&filename_hint), + ..Default::default() + }, + ) + .map_err(|error| format!("could not parse FBX {}: {error:?}", source.display()))?; + let relative_paths = external_texture_paths(&scene).map_err(|errors| { + format!( + "unsafe FBX texture reference(s) in {}: {}", + source.display(), + errors + .into_iter() + .map(|error| error.to_string()) + .collect::>() + .join("; ") + ) + })?; + let source_root = source.parent().unwrap_or_else(|| Path::new("")); + let canonical_root = fs::canonicalize(source_root).map_err(|error| { + format!( + "could not resolve FBX source directory {}: {error}", + source_root.display() + ) + })?; + let mut resolved_paths = Vec::new(); + let mut missing_paths = Vec::new(); + for relative_path in &relative_paths { + let resolved = source_root.join(relative_path); + if !resolved.is_file() { + missing_paths.push(resolved.clone()); + resolved_paths.push(resolved); + continue; + } + let canonical = fs::canonicalize(&resolved).map_err(|error| { + format!( + "could not resolve FBX dependency {}: {error}", + resolved.display() + ) + })?; + if !canonical.starts_with(&canonical_root) { + return Err(format!( + "FBX dependency {} resolves outside source directory {}", + resolved.display(), + source_root.display() + )); + } + resolved_paths.push(resolved); + } + missing_paths.sort(); + Ok(FbxDependencyInspection { + relative_paths, + resolved_paths, + missing_paths, + }) +} + +/// Returns one stable browser-facing error for all missing FBX source textures. +pub fn validate_fbx_dependencies(source: &Path) -> Result<(), String> { + let inspection = inspect_fbx_dependencies(source)?; + if inspection.missing_paths.is_empty() { + return Ok(()); + } + Err(format!( + "missing {} FBX source texture(s): {}", + inspection.missing_paths.len(), + inspection + .missing_paths + .iter() + .map(|path| path.to_string_lossy().replace('\\', "/")) + .collect::>() + .join(", ") + )) +} + +/// Copies an FBX and every referenced external texture as one staged filesystem transaction. +pub fn copy_fbx_bundle(source: &Path, dest_dir: &Path) -> Result<(), String> { + let entries = plan_fbx_bundle(source)?; + copy_bundle_transactionally(&entries, dest_dir) +} + +fn plan_fbx_bundle(source: &Path) -> Result, String> { + let inspection = inspect_fbx_dependencies(source)?; + if !inspection.missing_paths.is_empty() { + return Err(format!( + "FBX import is missing {} required texture(s): {}", + inspection.missing_paths.len(), + inspection + .missing_paths + .iter() + .map(|path| path.display().to_string()) + .collect::>() + .join(", ") + )); + } + let file_name = source + .file_name() + .ok_or_else(|| "FBX import path has no file name".to_string())?; + let mut entries = BTreeMap::new(); + entries.insert(PathBuf::from(file_name), source.to_path_buf()); + for (relative, resolved) in inspection + .relative_paths + .iter() + .zip(inspection.resolved_paths.iter()) + { + let relative = PathBuf::from(relative); + if let Some(existing) = entries.insert(relative.clone(), resolved.clone()) { + if existing != *resolved { + return Err(format!( + "FBX import maps multiple source files to {}", + relative.display() + )); + } + } + } + Ok(entries) +} + +/// Copies a textual glTF and all of its external buffers and images as one transaction. +/// Binary GLB files are self-contained and should use the ordinary single-file import path. +pub fn copy_gltf_bundle(source: &Path, dest_dir: &Path) -> Result<(), String> { + let entries = plan_gltf_bundle(source)?; + copy_bundle_transactionally(&entries, dest_dir) +} + +fn plan_gltf_bundle(source: &Path) -> Result, String> { + let document = gltf::Gltf::open(source) + .map_err(|error| format!("could not parse glTF {}: {error}", source.display()))?; + let source_root = source.parent().unwrap_or_else(|| Path::new("")); + let canonical_root = fs::canonicalize(source_root).map_err(|error| { + format!( + "could not resolve glTF source directory {}: {error}", + source_root.display() + ) + })?; + let file_name = source + .file_name() + .ok_or_else(|| "glTF import path has no file name".to_string())?; + let mut entries = BTreeMap::from([(PathBuf::from(file_name), source.to_path_buf())]); + let uris = document + .buffers() + .filter_map(|buffer| match buffer.source() { + gltf::buffer::Source::Uri(uri) => Some(uri), + gltf::buffer::Source::Bin => None, + }) + .chain(document.images().filter_map(|image| match image.source() { + gltf::image::Source::Uri { uri, .. } if !uri.starts_with("data:") => Some(uri), + _ => None, + })); + for uri in uris { + let relative = decode_gltf_uri_path(uri)?; + validate_bundle_relative_path(&relative)?; + let resolved = source_root.join(&relative); + let metadata = fs::symlink_metadata(&resolved).map_err(|error| { + format!( + "missing glTF dependency {} referenced by {}: {error}", + resolved.display(), + source.display() + ) + })?; + if metadata.file_type().is_symlink() || !metadata.is_file() { + return Err(format!( + "glTF dependency {} must be a regular non-symlink file", + resolved.display() + )); + } + let canonical = fs::canonicalize(&resolved).map_err(|error| { + format!( + "could not resolve glTF dependency {}: {error}", + resolved.display() + ) + })?; + if !canonical.starts_with(&canonical_root) { + return Err(format!( + "glTF dependency {} resolves outside source directory {}", + resolved.display(), + source_root.display() + )); + } + if let Some(existing) = entries.insert(relative.clone(), resolved.clone()) { + if existing != resolved { + return Err(format!( + "glTF import maps multiple source files to {}", + relative.display() + )); + } + } + } + Ok(entries) +} + +pub fn planned_import_targets(source: &Path, destination: &Path) -> Result, String> { + let extension = source + .extension() + .and_then(|extension| extension.to_str()) + .unwrap_or_default(); + let relative_paths = if extension.eq_ignore_ascii_case("fbx") { + plan_fbx_bundle(source)?.into_keys().collect::>() + } else if extension.eq_ignore_ascii_case("gltf") { + plan_gltf_bundle(source)?.into_keys().collect::>() + } else { + vec![PathBuf::from(source.file_name().ok_or_else(|| { + format!("import path has no file name: {}", source.display()) + })?)] + }; + Ok(relative_paths + .into_iter() + .map(|relative| destination.join(relative)) + .collect()) +} + +fn fingerprint_file(path: impl AsRef) -> Result { + let path = path.as_ref(); + let bytes = fs::read(path) + .map_err(|error| format!("could not read imported source {}: {error}", path.display()))?; + Ok(AssetSourceFingerprint::from_bytes(&bytes)) +} + +pub fn import_external_assets(paths: &[PathBuf]) -> Result { + import_external_assets_to(paths, Path::new(crate::ASSETS_DIRECTORY)) +} + +pub fn import_external_assets_to(paths: &[PathBuf], destination: &Path) -> Result { + let plan = plan_external_assets_import(paths, destination)?; + commit_external_assets_import(&plan) +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ExternalAssetImportEntry { + pub source: PathBuf, + pub source_files: Vec<(PathBuf, AssetSourceFingerprint)>, + pub targets: Vec, + pub adopt_in_place: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ExternalAssetImportPlan { + pub project_root: PathBuf, + pub destination: PathBuf, + pub entries: Vec, + pub conflicts: Vec, + /// Reviewed editor registry bytes. Import refuses publication if another process changes them. + pub registry_snapshot: Option>, + /// Reviewed stripped runtime catalog bytes, guarded independently from the source registry. + pub runtime_catalog_snapshot: Option>, +} + +impl ExternalAssetImportPlan { + pub fn imported_count(&self) -> usize { + self.entries.len() + } + + pub fn can_commit(&self) -> bool { + self.conflicts.is_empty() + } +} + +pub fn plan_external_assets_import( + paths: &[PathBuf], + destination: &Path, +) -> Result { + plan_external_assets_import_at(Path::new("."), paths, destination) +} + +pub fn plan_external_assets_import_at( + project_root: &Path, + paths: &[PathBuf], + destination: &Path, +) -> Result { + crate::validate_asset_path(destination)?; + if destination + .components() + .any(|component| component.as_os_str().to_string_lossy().starts_with('.')) + { + return Err("imports cannot target hidden or engine-managed directories".into()); + } + let assets_root = fs::canonicalize(project_root.join(crate::ASSETS_DIRECTORY)) + .map_err(|error| format!("could not resolve project assets root: {error}"))?; + let destination_absolute = project_root.join(destination); + let mut entries = Vec::new(); + let mut planned_targets = BTreeSet::new(); + let mut conflicts = Vec::new(); + for source in paths { + let canonical_source = fs::canonicalize(source) + .map_err(|error| format!("could not resolve import {}: {error}", source.display()))?; + let source_fingerprint = fingerprint_file(&canonical_source)?; + if canonical_source.starts_with(&assets_root) { + let target = canonical_source + .strip_prefix(project_root) + .unwrap_or(&canonical_source) + .to_path_buf(); + entries.push(ExternalAssetImportEntry { + source: source.clone(), + source_files: vec![(canonical_source.clone(), source_fingerprint)], + targets: vec![target], + adopt_in_place: true, + }); + continue; + } + let absolute_targets = planned_import_targets(source, &destination_absolute)?; + let mut targets = Vec::with_capacity(absolute_targets.len()); + for absolute_target in &absolute_targets { + let target = absolute_target + .strip_prefix(project_root) + .map_err(|_| { + format!( + "planned target {} escaped project root {}", + absolute_target.display(), + project_root.display() + ) + })? + .to_path_buf(); + if absolute_target.exists() { + conflicts.push(format!("{} already exists", target.display())); + } + if !planned_targets.insert(target.clone()) { + conflicts.push(format!("multiple sources target {}", target.display())); + } + targets.push(target); + } + let source_parent = source.parent().unwrap_or_else(|| Path::new(".")); + let mut source_files = Vec::with_capacity(targets.len()); + for target in &targets { + let relative = target.strip_prefix(destination).map_err(|_| { + format!( + "planned target {} escaped destination {}", + target.display(), + destination.display() + ) + })?; + let dependency = source_parent.join(relative); + source_files.push((dependency.clone(), fingerprint_file(&dependency)?)); + } + entries.push(ExternalAssetImportEntry { + source: source.clone(), + source_files, + targets, + adopt_in_place: false, + }); + } + conflicts.sort(); + conflicts.dedup(); + Ok(ExternalAssetImportPlan { + project_root: project_root.to_path_buf(), + destination: destination.to_path_buf(), + entries, + conflicts, + registry_snapshot: fs::read(project_root.join(crate::REGISTRY_PATH)).ok(), + runtime_catalog_snapshot: fs::read(project_root.join(crate::RUNTIME_CATALOG_PATH)).ok(), + }) +} + +pub fn commit_external_assets_import(plan: &ExternalAssetImportPlan) -> Result { + if !plan.can_commit() { + return Err(format!( + "import has unresolved conflicts: {}", + plan.conflicts.join("; ") + )); + } + if fs::read(plan.project_root.join(crate::REGISTRY_PATH)) + .ok() + .as_deref() + != plan.registry_snapshot.as_deref() + { + return Err("asset registry changed after import review".into()); + } + if fs::read(plan.project_root.join(crate::RUNTIME_CATALOG_PATH)) + .ok() + .as_deref() + != plan.runtime_catalog_snapshot.as_deref() + { + return Err("runtime content catalog changed after import review".into()); + } + let destination = plan.project_root.join(&plan.destination); + for entry in &plan.entries { + for (source, reviewed) in &entry.source_files { + let current = fingerprint_file(source)?; + if ¤t != reviewed { + return Err(format!( + "import source {} changed after review", + source.display() + )); + } + } + if !entry.adopt_in_place { + for target in &entry.targets { + if plan.project_root.join(target).exists() { + return Err(format!( + "import target {} changed after review", + target.display() + )); + } + } + } + } + let planned_targets = plan + .entries + .iter() + .filter(|entry| !entry.adopt_in_place) + .flat_map(|entry| { + entry + .targets + .iter() + .map(|target| plan.project_root.join(target)) + }) + .collect::>(); + + let mut published = Vec::new(); + let mut created_directories = BTreeSet::new(); + for target in &planned_targets { + let mut parent = target.parent(); + while let Some(directory) = parent { + if directory.exists() || !directory.starts_with(&destination) { + break; + } + created_directories.insert(directory.to_path_buf()); + parent = directory.parent(); + } + } + let result: Result<(), String> = (|| { + for entry in plan.entries.iter().filter(|entry| !entry.adopt_in_place) { + let source = &entry.source; + let targets = &entry.targets; + let extension = source + .extension() + .and_then(|extension| extension.to_str()) + .unwrap_or_default(); + if extension.eq_ignore_ascii_case("fbx") { + copy_fbx_bundle(source, &destination)?; + published.extend(targets.iter().map(|target| plan.project_root.join(target))); + continue; + } + if extension.eq_ignore_ascii_case("gltf") { + copy_gltf_bundle(source, &destination)?; + published.extend(targets.iter().map(|target| plan.project_root.join(target))); + continue; + } + fs::create_dir_all(&destination) + .map_err(|err| format!("could not create {}: {err}", destination.display()))?; + let dest = plan.project_root.join( + targets + .first() + .ok_or_else(|| format!("import {} produced no target", source.display()))?, + ); + copy_file_create_new(source, &dest).map_err(|err| { + format!( + "could not copy {} to {}: {err}", + source.display(), + dest.display() + ) + })?; + published.push(dest); + } + Ok(()) + })(); + if let Err(error) = result { + for target in published.into_iter().rev() { + let _ = fs::remove_file(target); + } + let mut created_directories = created_directories.into_iter().collect::>(); + created_directories.sort_by_key(|path| std::cmp::Reverse(path.components().count())); + for directory in created_directories { + let _ = fs::remove_dir(directory); + } + return Err(format!("import batch rolled back: {error}")); + } + Ok(plan.imported_count()) +} + +/// Removes only files published by a reviewed external import. In-project adoption is never +/// removed. Empty directories created beneath the selected destination are cleaned deepest-first. +pub fn rollback_external_assets_import(plan: &ExternalAssetImportPlan) -> Result<(), String> { + let destination = plan.project_root.join(&plan.destination); + let mut failures = Vec::new(); + let mut directories = BTreeSet::new(); + let mut targets = plan + .entries + .iter() + .filter(|entry| !entry.adopt_in_place) + .flat_map(|entry| entry.targets.iter()) + .map(|target| plan.project_root.join(target)) + .collect::>(); + targets.sort_by_key(|path| std::cmp::Reverse(path.components().count())); + targets.dedup(); + for target in targets { + if let Some(parent) = target.parent() { + let mut candidate = Some(parent); + while let Some(directory) = candidate { + if !directory.starts_with(&destination) { + break; + } + directories.insert(directory.to_path_buf()); + candidate = directory.parent(); + } + } + if target.exists() { + let result = if target.is_dir() { + fs::remove_dir_all(&target) + } else { + fs::remove_file(&target) + }; + if let Err(error) = result { + failures.push(format!("could not remove {}: {error}", target.display())); + } + } + } + let mut directories = directories.into_iter().collect::>(); + directories.sort_by_key(|path| std::cmp::Reverse(path.components().count())); + for directory in directories { + if directory != destination { + let _ = fs::remove_dir(&directory); + } + } + if failures.is_empty() { + Ok(()) + } else { + Err(failures.join("; ")) + } +} + +fn copy_file_create_new(source: &Path, destination: &Path) -> io::Result { + let mut source = fs::File::open(source)?; + let mut output = fs::OpenOptions::new() + .write(true) + .create_new(true) + .open(destination)?; + match io::copy(&mut source, &mut output) { + Ok(bytes) => Ok(bytes), + Err(error) => { + drop(output); + let _ = fs::remove_file(destination); + Err(error) + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ExtractedGltfMaterial { + pub source_index: usize, + pub source_name: String, + pub path: PathBuf, +} + +#[derive(Debug, Clone)] +pub struct PlannedGltfMaterial { + pub source_index: usize, + pub source_name: String, + pub path: PathBuf, + pub asset: MaterialAsset, +} + +/// Plans editable project Materials for any model source format whose PBR material contract is +/// understood by the importer. Embedded texture payloads remain source-owned; scalar values and +/// safe external texture references are still converted. +pub fn plan_model_material_extraction( + source: &Path, + destination: &Path, +) -> Result, String> { + match source + .extension() + .and_then(|extension| extension.to_str()) + .map(str::to_ascii_lowercase) + .as_deref() + { + Some("gltf" | "glb") => plan_gltf_material_extraction(source, destination), + Some("fbx") => plan_fbx_material_extraction(source, destination), + Some(extension) => Err(format!( + "material extraction does not support model format `{extension}`" + )), + None => Err("model source has no file extension".into()), + } +} + +pub fn plan_gltf_material_extraction( + source: &Path, + destination: &Path, +) -> Result, String> { + let document = gltf::Gltf::open(source) + .map_err(|error| format!("could not parse glTF {}: {error}", source.display()))?; + let source_fingerprint = blake3::hash( + &fs::read(source) + .map_err(|error| format!("could not fingerprint {}: {error}", source.display()))?, + ) + .to_hex() + .to_string(); + crate::validate_asset_path(destination)?; + let mut planned = Vec::new(); + let mut reserved = BTreeSet::new(); + for material in document.materials() { + let index = material.index().unwrap_or(planned.len()); + let source_name = material + .name() + .map(str::to_string) + .unwrap_or_else(|| format!("Material {index}")); + let pbr = material.pbr_metallic_roughness(); + let color = pbr.base_color_factor(); + let emissive = material.emissive_factor(); + let parent = source.parent().unwrap_or_else(|| Path::new("")); + let material_desc = MaterialDesc { + base_color: ColorDesc::srgb(color[0], color[1], color[2]), + metallic: pbr.metallic_factor(), + roughness: pbr.roughness_factor(), + emissive_color: ColorDesc::srgb(emissive[0], emissive[1], emissive[2]), + emissive_intensity: if emissive == [0.0, 0.0, 0.0] { + 0.0 + } else { + 1.0 + }, + base_color_texture: pbr + .base_color_texture() + .and_then(|texture| gltf_texture_path(parent, texture.texture())), + normal_map_texture: material + .normal_texture() + .and_then(|texture| gltf_texture_path(parent, texture.texture())), + metallic_roughness_texture: pbr + .metallic_roughness_texture() + .and_then(|texture| gltf_texture_path(parent, texture.texture())), + emissive_texture: material + .emissive_texture() + .and_then(|texture| gltf_texture_path(parent, texture.texture())), + ..Default::default() + }; + let asset = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: source_name.clone(), + shader: material_desc.shader.clone(), + shader_ref: None, + render_state: MaterialRenderState { + alpha_mode: match material.alpha_mode() { + gltf::material::AlphaMode::Mask => MaterialAlphaMode::Cutout, + _ => MaterialAlphaMode::Opaque, + }, + alpha_cutoff: material.alpha_cutoff().unwrap_or(0.5), + double_sided: material.double_sided(), + }, + provenance: Some(shared::MaterialProvenance { + source_path: source.to_string_lossy().replace('\\', "/"), + source_fingerprint: source_fingerprint.clone(), + source_sub_asset_id: format!("material:{index}"), + source_label: source_name.clone(), + }), + inputs: shared::MaterialInputSet::from_material_desc(&material_desc), + }; + let stem = safe_material_stem(&source_name); + let path = unique_material_path(destination, &stem, &mut reserved); + planned.push(PlannedGltfMaterial { + source_index: index, + source_name, + path, + asset, + }); + } + Ok(planned) +} + +pub fn plan_fbx_material_extraction( + source: &Path, + destination: &Path, +) -> Result, String> { + let bytes = fs::read(source) + .map_err(|error| format!("could not read FBX {}: {error}", source.display()))?; + let filename_hint = source.to_string_lossy(); + let scene = ufbx::load_memory( + &bytes, + ufbx::LoadOpts { + target_unit_meters: 1.0, + target_axes: ufbx::CoordinateAxes::right_handed_y_up(), + filename: ufbx::StringOpt::Ref(&filename_hint), + ..Default::default() + }, + ) + .map_err(|error| format!("could not parse FBX {}: {error:?}", source.display()))?; + crate::validate_asset_path(destination)?; + let source_fingerprint = blake3::hash(&bytes).to_hex().to_string(); + let parent = source.parent().unwrap_or_else(|| Path::new("")); + let mut texture_paths = BTreeMap::new(); + for (index, texture) in scene.textures.as_ref().iter().enumerate() { + let reference = external_texture_reference(index, texture) + .map_err(|error| format!("unsafe FBX texture reference: {error}"))?; + if let Some(reference) = reference { + texture_paths.insert( + reference.element_id, + parent + .join(reference.relative_path) + .to_string_lossy() + .replace('\\', "/"), + ); + } + } + + let mut planned = Vec::new(); + let mut reserved = BTreeSet::new(); + for (index, material) in scene.materials.as_ref().iter().enumerate() { + if material.element.element_id == 0 { + continue; + } + let source_name = if material.element.name.is_empty() { + format!("Material {index}") + } else { + material.element.name.to_string() + }; + let base_color = if material.pbr.base_color.has_value { + material.pbr.base_color.value_vec4 + } else { + material.fbx.diffuse_color.value_vec4 + }; + let emission = if material.pbr.emission_color.has_value { + material.pbr.emission_color.value_vec4 + } else { + material.fbx.emission_color.value_vec4 + }; + let metallic = if material.pbr.metalness.has_value { + material.pbr.metalness.value_vec4.x as f32 + } else { + 0.0 + }; + let roughness = if material.pbr.roughness.has_value { + material.pbr.roughness.value_vec4.x as f32 + } else { + MaterialDesc::default().roughness + }; + let mut material_desc = MaterialDesc { + base_color: ColorDesc::srgb( + base_color.x as f32, + base_color.y as f32, + base_color.z as f32, + ), + metallic, + roughness, + emissive_color: ColorDesc::srgb( + emission.x as f32, + emission.y as f32, + emission.z as f32, + ), + emissive_intensity: if emission.x == 0.0 && emission.y == 0.0 && emission.z == 0.0 { + 0.0 + } else { + 1.0 + }, + ..Default::default() + }; + for texture in &material.textures { + let Some(path) = texture_paths.get(&texture.texture.element.element_id) else { + continue; + }; + match texture.material_prop.as_ref() { + "DiffuseColor" | "BaseColor" => { + material_desc.base_color_texture = Some(path.clone()) + } + "NormalMap" => material_desc.normal_map_texture = Some(path.clone()), + "Metallic" => material_desc.metallic_roughness_texture = Some(path.clone()), + "Roughness" if material_desc.metallic_roughness_texture.is_none() => { + material_desc.metallic_roughness_texture = Some(path.clone()) + } + "EmissiveColor" => material_desc.emissive_texture = Some(path.clone()), + _ => {} + } + } + let asset = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: source_name.clone(), + shader: material_desc.shader.clone(), + shader_ref: None, + render_state: MaterialRenderState { + // MaterialAsset currently has no blended mode. Preserve visibility and report the + // converted state as opaque instead of pretending a lossy blend is exact. + alpha_mode: MaterialAlphaMode::Opaque, + alpha_cutoff: 0.5, + double_sided: material.features.double_sided.enabled, + }, + provenance: Some(shared::MaterialProvenance { + source_path: source.to_string_lossy().replace('\\', "/"), + source_fingerprint: source_fingerprint.clone(), + source_sub_asset_id: format!("material:{index}"), + source_label: source_name.clone(), + }), + inputs: shared::MaterialInputSet::from_material_desc(&material_desc), + }; + let stem = safe_material_stem(&source_name); + let path = unique_material_path(destination, &stem, &mut reserved); + planned.push(PlannedGltfMaterial { + source_index: index, + source_name, + path, + asset, + }); + } + Ok(planned) +} + +/// Converts supported glTF metallic/roughness materials into ordinary editable project assets. +/// Existing files are never overwritten; deterministic numeric suffixes create a new revision. +pub fn extract_gltf_materials( + source: &Path, + destination: &Path, +) -> Result, String> { + let planned = plan_gltf_material_extraction(source, destination)?; + fs::create_dir_all(destination) + .map_err(|error| format!("could not create {}: {error}", destination.display()))?; + let mut extracted = Vec::new(); + let mut published = Vec::new(); + let result: Result<(), String> = (|| { + for material in planned { + let bytes = + ron::ser::to_string_pretty(&material.asset, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("could not serialize extracted material: {error}"))?; + fs::write(&material.path, format!("{bytes}\n")).map_err(|error| { + format!("could not publish {}: {error}", material.path.display()) + })?; + published.push(material.path.clone()); + extracted.push(ExtractedGltfMaterial { + source_index: material.source_index, + source_name: material.source_name, + path: material.path, + }); + } + Ok(()) + })(); + if let Err(error) = result { + for path in published { + let _ = fs::remove_file(path); + } + return Err(error); + } + Ok(extracted) +} + +fn gltf_texture_path(parent: &Path, texture: gltf::Texture<'_>) -> Option { + let gltf::image::Source::Uri { uri, .. } = texture.source().source() else { + return None; + }; + let relative = decode_gltf_uri_path(uri).ok()?; + Some(parent.join(relative).to_string_lossy().replace('\\', "/")) +} + +fn safe_material_stem(label: &str) -> String { + let stem = label + .chars() + .map(|character| { + if character.is_ascii_alphanumeric() || matches!(character, '-' | '_') { + character + } else { + '_' + } + }) + .collect::(); + let stem = stem.trim_matches('_'); + if stem.is_empty() { + "material".into() + } else { + stem.into() + } +} + +fn unique_material_path( + destination: &Path, + stem: &str, + reserved: &mut BTreeSet, +) -> PathBuf { + (1..) + .map(|suffix| { + if suffix == 1 { + destination.join(format!("{stem}.material.ron")) + } else { + destination.join(format!("{stem}_{suffix}.material.ron")) + } + }) + .find(|candidate| !candidate.exists() && reserved.insert(candidate.clone())) + .expect("numeric material suffix space is effectively unbounded") +} + +/// Finds an editable Material previously extracted from one stable source-material slot. +pub fn find_matching_extracted_material( + destination: &Path, + source: &Path, + source_sub_asset_id: &str, +) -> Option { + let normalized_source = source.to_string_lossy().replace('\\', "/"); + let mut existing = fs::read_dir(destination) + .ok() + .into_iter() + .flatten() + .filter_map(Result::ok) + .map(|entry| entry.path()) + .filter(|path| path.is_file()) + .filter_map(|path| { + let asset = MaterialAsset::load_from_path(path.to_string_lossy().as_ref()).ok()?; + let provenance = asset.provenance.as_ref()?; + (provenance.source_path == normalized_source + && provenance.source_sub_asset_id == source_sub_asset_id) + .then_some(path) + }) + .collect::>(); + existing.sort(); + existing.into_iter().next() +} + +fn decode_gltf_uri_path(uri: &str) -> Result { + if uri.starts_with("data:") { + return Err("embedded glTF data URI is not an external dependency".into()); + } + if uri.contains(['?', '#']) || uri.contains('\\') { + return Err(format!( + "glTF dependency URI {uri:?} is not a safe file path" + )); + } + let bytes = uri.as_bytes(); + let mut decoded = Vec::with_capacity(bytes.len()); + let mut index = 0; + while index < bytes.len() { + if bytes[index] == b'%' { + let Some(pair) = bytes.get(index + 1..index + 3) else { + return Err(format!( + "glTF dependency URI {uri:?} has invalid percent encoding" + )); + }; + let text = std::str::from_utf8(pair) + .map_err(|_| format!("glTF dependency URI {uri:?} has invalid percent encoding"))?; + decoded.push(u8::from_str_radix(text, 16).map_err(|_| { + format!("glTF dependency URI {uri:?} has invalid percent encoding") + })?); + index += 3; + } else { + decoded.push(bytes[index]); + index += 1; + } + } + let decoded = String::from_utf8(decoded) + .map_err(|_| format!("glTF dependency URI {uri:?} is not UTF-8"))?; + Ok(PathBuf::from(decoded)) +} + +fn copy_bundle_transactionally( + entries: &BTreeMap, + dest_dir: &Path, +) -> Result<(), String> { + fs::create_dir_all(dest_dir) + .map_err(|error| format!("could not create {}: {error}", dest_dir.display()))?; + let canonical_dest_dir = fs::canonicalize(dest_dir).map_err(|error| { + format!( + "could not resolve import destination {}: {error}", + dest_dir.display() + ) + })?; + for relative in entries.keys() { + validate_bundle_relative_path(relative)?; + validate_existing_destination_parents(dest_dir, &canonical_dest_dir, relative)?; + let target = dest_dir.join(relative); + if target.is_dir() { + return Err(format!( + "import target {} is an existing directory", + target.display() + )); + } + } + let collisions = entries + .keys() + .map(|relative| dest_dir.join(relative)) + .filter(|target| target.exists()) + .collect::>(); + if !collisions.is_empty() { + return Err(format!( + "import collision(s): {}", + collisions + .iter() + .map(|path| path.display().to_string()) + .collect::>() + .join(", ") + )); + } + + let stage_root = dest_dir.join(format!(".blacksite-import-{}", uuid::Uuid::new_v4())); + let staged_root = stage_root.join("new"); + let stage_result = (|| { + for (relative, source) in entries { + let staged = staged_root.join(relative); + if let Some(parent) = staged.parent() { + fs::create_dir_all(parent).map_err(|error| { + format!( + "could not create import staging {}: {error}", + parent.display() + ) + })?; + } + fs::copy(source, &staged).map_err(|error| { + format!( + "could not stage bundle file {} as {}: {error}", + source.display(), + relative.display() + ) + })?; + } + commit_staged_bundle(entries, dest_dir, &canonical_dest_dir, &staged_root) + })(); + let cleanup_result = fs::remove_dir_all(&stage_root); + match (stage_result, cleanup_result) { + (Err(error), _) => Err(error), + (Ok(()), Ok(())) => Ok(()), + (Ok(()), Err(error)) if error.kind() == std::io::ErrorKind::NotFound => Ok(()), + // The transaction is already committed at this point. A stale hidden staging directory is + // safe to leave for later cleanup and must not turn a successful import into a false + // rollback report. + (Ok(()), Err(_)) => Ok(()), + } +} + +fn validate_bundle_relative_path(relative: &Path) -> Result<(), String> { + if relative.as_os_str().is_empty() + || !relative + .components() + .all(|component| matches!(component, Component::Normal(_))) + { + return Err(format!( + "import target path {} is not a safe relative path", + relative.display() + )); + } + Ok(()) +} + +fn validate_existing_destination_parents( + dest_dir: &Path, + canonical_dest_dir: &Path, + relative: &Path, +) -> Result<(), String> { + let mut current = dest_dir.to_path_buf(); + let Some(parent) = relative.parent() else { + return Ok(()); + }; + for component in parent.components() { + let Component::Normal(segment) = component else { + return Err(format!( + "import target path {} is not a safe relative path", + relative.display() + )); + }; + current.push(segment); + let metadata = match fs::symlink_metadata(¤t) { + Ok(metadata) => metadata, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => break, + Err(error) => { + return Err(format!( + "could not inspect import target {}: {error}", + current.display() + )); + } + }; + if metadata.file_type().is_symlink() { + return Err(format!( + "import target parent {} is a symbolic link", + current.display() + )); + } + if !metadata.is_dir() { + return Err(format!( + "import target parent {} is not a directory", + current.display() + )); + } + let canonical = fs::canonicalize(¤t).map_err(|error| { + format!( + "could not resolve import target parent {}: {error}", + current.display() + ) + })?; + if !canonical.starts_with(canonical_dest_dir) { + return Err(format!( + "import target parent {} resolves outside destination {}", + current.display(), + dest_dir.display() + )); + } + } + Ok(()) +} + +fn commit_staged_bundle( + entries: &BTreeMap, + dest_dir: &Path, + canonical_dest_dir: &Path, + staged_root: &Path, +) -> Result<(), String> { + let mut installed = Vec::new(); + let backups = Vec::new(); + for relative in entries.keys() { + let target = dest_dir.join(relative); + let staged = staged_root.join(relative); + if let Some(parent) = target.parent() { + if let Err(error) = fs::create_dir_all(parent) { + return rollback_bundle( + &installed, + &backups, + format!( + "could not create import target {}: {error}", + parent.display() + ), + ); + } + let canonical_parent = match fs::canonicalize(parent) { + Ok(canonical_parent) => canonical_parent, + Err(error) => { + return rollback_bundle( + &installed, + &backups, + format!( + "could not resolve import target {}: {error}", + parent.display() + ), + ); + } + }; + if !canonical_parent.starts_with(canonical_dest_dir) { + return rollback_bundle( + &installed, + &backups, + format!( + "import target {} resolves outside destination {}", + parent.display(), + dest_dir.display() + ), + ); + } + } + if let Err(error) = fs::rename(&staged, &target) { + return rollback_bundle( + &installed, + &backups, + format!( + "could not publish import target {}: {error}", + target.display() + ), + ); + } + installed.push(target); + } + Ok(()) +} + +fn rollback_bundle( + installed: &[PathBuf], + backups: &[(PathBuf, PathBuf)], + cause: String, +) -> Result<(), String> { + let mut rollback_errors = Vec::new(); + for target in installed.iter().rev() { + if let Err(error) = fs::remove_file(target) { + if error.kind() != std::io::ErrorKind::NotFound { + rollback_errors.push(format!("remove {}: {error}", target.display())); + } + } + } + for (backup, target) in backups.iter().rev() { + if let Err(error) = fs::rename(backup, target) { + rollback_errors.push(format!( + "restore {} to {}: {error}", + backup.display(), + target.display() + )); + } + } + if rollback_errors.is_empty() { + Err(cause) + } else { + Err(format!( + "{cause}; rollback also failed: {}", + rollback_errors.join("; ") + )) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn temp_root(label: &str) -> PathBuf { + std::env::temp_dir().join(format!("blacksite-fbx-{label}-{}", uuid::Uuid::new_v4())) + } + + fn committed_chair_bytes() -> Vec { + fs::read( + Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../assets/models/painted_wooden_chair_02_2k.fbx"), + ) + .unwrap() + } + + fn replace_equal_length(bytes: &mut [u8], from: &[u8], to: &[u8]) -> usize { + assert_eq!(from.len(), to.len()); + let mut count = 0; + let mut offset = 0; + while let Some(index) = bytes[offset..] + .windows(from.len()) + .position(|window| window == from) + { + let start = offset + index; + bytes[start..start + from.len()].copy_from_slice(to); + offset = start + from.len(); + count += 1; + } + count + } + + fn write_textures(root: &Path, folder: &str) { + let folder = root.join(folder); + fs::create_dir_all(&folder).unwrap(); + for name in [ + "painted_wooden_chair_02_diff_2k.jpg", + "painted_wooden_chair_02_nor_gl_2k.exr", + "painted_wooden_chair_02_rough_2k.exr", + ] { + fs::write(folder.join(name), name.as_bytes()).unwrap(); + } + } + + #[test] + fn committed_chair_reports_one_stable_missing_dependency_state() { + let path = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../assets/models/painted_wooden_chair_02_2k.fbx"); + + let error = validate_fbx_dependencies(&path).unwrap_err(); + + assert!(error.starts_with("missing 3 FBX source texture(s):")); + assert_eq!(error.matches("painted_wooden_chair_02_").count(), 3); + } + + #[test] + fn sibling_texture_bundle_is_copied_with_relative_layout() { + let root = temp_root("sibling"); + let source_root = root.join("source"); + let destination = root.join("destination"); + fs::create_dir_all(&source_root).unwrap(); + let source = source_root.join("chair.fbx"); + fs::write(&source, committed_chair_bytes()).unwrap(); + write_textures(&source_root, "textures"); + + copy_fbx_bundle(&source, &destination).unwrap(); + + assert!(destination.join("chair.fbx").is_file()); + assert!(destination + .join("textures/painted_wooden_chair_02_diff_2k.jpg") + .is_file()); + assert!(!destination.read_dir().unwrap().any(|entry| entry + .unwrap() + .file_name() + .to_string_lossy() + .starts_with(".blacksite-import-"))); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn valid_bundle_collision_never_overwrites_existing_content() { + let root = temp_root("collision"); + let source_root = root.join("source"); + let destination = root.join("destination"); + fs::create_dir_all(&source_root).unwrap(); + fs::create_dir_all(&destination).unwrap(); + let source = source_root.join("chair.fbx"); + fs::write(&source, committed_chair_bytes()).unwrap(); + write_textures(&source_root, "textures"); + fs::write(destination.join("chair.fbx"), b"authored existing bytes").unwrap(); + + let error = copy_fbx_bundle(&source, &destination).unwrap_err(); + + assert!(error.contains("import collision")); + assert_eq!( + fs::read(destination.join("chair.fbx")).unwrap(), + b"authored existing bytes" + ); + assert!(!destination.join("textures").exists()); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn fbm_texture_bundle_is_copied_with_relative_layout() { + let root = temp_root("fbm"); + let source_root = root.join("source"); + let destination = root.join("destination"); + fs::create_dir_all(&source_root).unwrap(); + let source = source_root.join("chair.fbx"); + let mut bytes = committed_chair_bytes(); + assert!(replace_equal_length(&mut bytes, b"textures/", b"test.fbm/") > 0); + fs::write(&source, bytes).unwrap(); + write_textures(&source_root, "test.fbm"); + + copy_fbx_bundle(&source, &destination).unwrap(); + + assert!(destination + .join("test.fbm/painted_wooden_chair_02_diff_2k.jpg") + .is_file()); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn traversal_reference_is_rejected_before_destination_changes() { + let root = temp_root("traversal"); + let source_root = root.join("source"); + let destination = root.join("destination"); + fs::create_dir_all(&source_root).unwrap(); + fs::create_dir_all(&destination).unwrap(); + let source = source_root.join("chair.fbx"); + let mut bytes = committed_chair_bytes(); + assert!(replace_equal_length(&mut bytes, b"textures/", b"../evil//") > 0); + fs::write(&source, bytes).unwrap(); + fs::write(destination.join("chair.fbx"), b"original").unwrap(); + + let error = copy_fbx_bundle(&source, &destination).unwrap_err(); + + assert!(error.contains("parent traversal")); + assert_eq!( + fs::read(destination.join("chair.fbx")).unwrap(), + b"original" + ); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn missing_bundle_preserves_existing_destination() { + let root = temp_root("missing"); + let source_root = root.join("source"); + let destination = root.join("destination"); + fs::create_dir_all(&source_root).unwrap(); + fs::create_dir_all(&destination).unwrap(); + let source = source_root.join("chair.fbx"); + fs::write(&source, committed_chair_bytes()).unwrap(); + fs::write(destination.join("chair.fbx"), b"original").unwrap(); + + let error = copy_fbx_bundle(&source, &destination).unwrap_err(); + + assert!(error.contains("missing 3 required texture(s)")); + assert_eq!( + fs::read(destination.join("chair.fbx")).unwrap(), + b"original" + ); + fs::remove_dir_all(root).unwrap(); + } + + #[cfg(unix)] + #[test] + fn destination_symlink_escape_is_rejected_before_external_changes() { + use std::os::unix::fs::symlink; + + let root = temp_root("destination-symlink"); + let source_root = root.join("source"); + let destination = root.join("destination"); + let outside = root.join("outside"); + fs::create_dir_all(&source_root).unwrap(); + fs::create_dir_all(&destination).unwrap(); + fs::create_dir_all(&outside).unwrap(); + let source = source_root.join("chair.fbx"); + fs::write(&source, committed_chair_bytes()).unwrap(); + write_textures(&source_root, "textures"); + symlink(&outside, destination.join("textures")).unwrap(); + + let error = copy_fbx_bundle(&source, &destination).unwrap_err(); + + assert!(error.contains("symbolic link")); + assert!(!destination.join("chair.fbx").exists()); + assert!(!outside.join("painted_wooden_chair_02_diff_2k.jpg").exists()); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn gltf_external_dependencies_are_copied_with_relative_layout() { + let root = temp_root("gltf-bundle"); + let source_root = root.join("source"); + let destination = root.join("destination"); + fs::create_dir_all(source_root.join("textures")).unwrap(); + fs::write(source_root.join("mesh.bin"), [0_u8; 12]).unwrap(); + fs::write(source_root.join("textures/base color.png"), b"png").unwrap(); + fs::write( + source_root.join("mesh.gltf"), + r#"{"asset":{"version":"2.0"},"buffers":[{"uri":"mesh.bin","byteLength":12}],"images":[{"uri":"textures/base%20color.png"}]}"#, + ) + .unwrap(); + + copy_gltf_bundle(&source_root.join("mesh.gltf"), &destination).unwrap(); + + assert!(destination.join("mesh.gltf").is_file()); + assert!(destination.join("mesh.bin").is_file()); + assert!(destination.join("textures/base color.png").is_file()); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn gltf_traversal_is_rejected_without_destination_changes() { + let root = temp_root("gltf-traversal"); + let source_root = root.join("source"); + let destination = root.join("destination"); + fs::create_dir_all(&source_root).unwrap(); + fs::create_dir_all(&destination).unwrap(); + fs::write( + source_root.join("mesh.gltf"), + r#"{"asset":{"version":"2.0"},"buffers":[{"uri":"../outside.bin","byteLength":4}]}"#, + ) + .unwrap(); + fs::write(root.join("outside.bin"), [0_u8; 4]).unwrap(); + + let error = copy_gltf_bundle(&source_root.join("mesh.gltf"), &destination).unwrap_err(); + + assert!(error.contains("safe relative path")); + assert!(!destination.join("mesh.gltf").exists()); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn gltf_pbr_material_extracts_without_overwriting_edits() { + let root = temp_root("gltf-material"); + let source_root = root.join("source"); + let destination = + PathBuf::from("assets").join(format!(".extract-test-{}", uuid::Uuid::new_v4())); + fs::create_dir_all(&source_root).unwrap(); + fs::write( + source_root.join("mesh.gltf"), + r#"{"asset":{"version":"2.0"},"materials":[{"name":"Paint Red","pbrMetallicRoughness":{"baseColorFactor":[0.8,0.1,0.05,1.0],"metallicFactor":0.7,"roughnessFactor":0.3}}]}"#, + ) + .unwrap(); + + let first = extract_gltf_materials(&source_root.join("mesh.gltf"), &destination).unwrap(); + assert_eq!( + find_matching_extracted_material( + &destination, + &source_root.join("mesh.gltf"), + "material:0", + ) + .as_deref(), + Some(first[0].path.as_path()) + ); + let second = extract_gltf_materials(&source_root.join("mesh.gltf"), &destination).unwrap(); + + assert_ne!(first[0].path, second[0].path); + let asset = MaterialAsset::load_from_path(&first[0].path.to_string_lossy()).unwrap(); + assert_eq!(asset.label, "Paint Red"); + let mut material = MaterialDesc::default(); + asset.inputs.apply_to_material_desc(&mut material); + assert_eq!(material.metallic, 0.7); + assert_eq!(material.roughness, 0.3); + fs::remove_dir_all(root).unwrap(); + fs::remove_dir_all(destination).unwrap(); + } + + #[test] + fn fbx_pbr_material_planning_preserves_provenance_and_external_textures() { + let root = temp_root("fbx-material"); + let source_root = root.join("source"); + let destination = + PathBuf::from("assets").join(format!(".extract-test-{}", uuid::Uuid::new_v4())); + fs::create_dir_all(&source_root).unwrap(); + let source = source_root.join("chair.fbx"); + fs::write(&source, committed_chair_bytes()).unwrap(); + + let planned = plan_model_material_extraction(&source, &destination).unwrap(); + + assert!(!planned.is_empty()); + assert!(planned + .iter() + .all(|entry| entry.path.starts_with(&destination))); + assert!(planned.iter().all(|entry| entry + .asset + .provenance + .as_ref() + .is_some_and(|provenance| provenance.source_path.ends_with("chair.fbx") + && provenance.source_sub_asset_id.starts_with("material:")))); + assert!(planned + .iter() + .any(|entry| !entry.asset.inputs.textures.is_empty())); + assert!(!destination.exists()); + fs::remove_dir_all(root).unwrap(); + } +} diff --git a/crates/content_pipeline/src/lib.rs b/crates/content_pipeline/src/lib.rs new file mode 100644 index 0000000..c55655d --- /dev/null +++ b/crates/content_pipeline/src/lib.rs @@ -0,0 +1,868 @@ +//! UI-independent project content discovery and publication. + +use serde::{Deserialize, Serialize}; +use shared::{ + AssetKind, AssetRecord, AssetRegistryDocument, AssetSourceFingerprint, ComponentInstanceId, + MaterialImportPolicy, ModelMaterialSelection, ModelMaterialSlotSelection, + RuntimeContentCatalog, +}; +use std::collections::{HashMap, HashSet}; +use std::ffi::OsStr; +use std::fs; +use std::path::{Component, Path, PathBuf}; +use walkdir::{DirEntry, WalkDir}; + +pub mod animation; +mod fingerprint; +mod import; +mod pbr_grouping; +pub mod static_mesh; +mod texture; +mod transaction; +mod trash; +mod watcher; +pub use fingerprint::*; +pub use import::*; +pub use pbr_grouping::*; +pub use texture::*; +pub use transaction::*; +pub use trash::*; +pub use watcher::*; + +pub const ASSETS_DIRECTORY: &str = "assets"; +pub const REGISTRY_PATH: &str = "assets/.index/registry.ron"; +pub const RUNTIME_CATALOG_PATH: &str = "assets/content.catalog.ron"; + +const MANAGED_DIRECTORIES: &[&str] = &[".index", ".thumbnails", ".trash", ".import-cache"]; +const MANAGED_PATH_PREFIXES: &[&str] = &[ + "meshes/generated", + "animations/generated", + "navigation/generated", +]; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ContentDiagnostic { + pub path: String, + pub message: String, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] +pub struct ProcessingReport { + pub discovered: usize, + pub added: usize, + pub moved: usize, + pub removed: usize, + pub changed: bool, + pub diagnostics: Vec, +} + +#[derive(Debug, Clone)] +pub struct ProcessedContent { + pub registry: AssetRegistryDocument, + pub runtime_catalog: RuntimeContentCatalog, + pub report: ProcessingReport, +} + +/// One imported file whose current bytes match more than one missing registry record. Automatic +/// reconciliation must stop so the editor can ask which stable identity actually moved. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ExternalMoveConflict { + pub new_path: String, + pub candidate_paths: Vec, + pub kind: AssetKind, + pub fingerprint: AssetSourceFingerprint, +} + +pub fn find_ambiguous_external_moves( + project_root: &Path, + previous: &AssetRegistryDocument, +) -> Result, String> { + let assets_root = project_root.join(ASSETS_DIRECTORY); + if !assets_root.is_dir() { + return Err(format!( + "project has no assets directory: {}", + assets_root.display() + )); + } + let mut discovered = Vec::new(); + for entry in WalkDir::new(&assets_root) + .follow_links(false) + .into_iter() + .filter_entry(|entry| should_descend(entry, &assets_root)) + { + let entry = entry.map_err(|error| format!("content scan failed: {error}"))?; + if !entry.file_type().is_file() { + continue; + } + let kind = classify_asset_file(entry.path()); + if !kind.is_imported_source() { + continue; + } + let relative = entry + .path() + .strip_prefix(project_root) + .map_err(|error| format!("content path escaped project: {error}"))?; + let path = relative.to_string_lossy().replace('\\', "/"); + let bytes = fs::read(entry.path()) + .map_err(|error| format!("could not fingerprint {path}: {error}"))?; + discovered.push((path, kind, AssetSourceFingerprint::from_bytes(&bytes))); + } + let current_paths = discovered + .iter() + .map(|(path, _, _)| path.clone()) + .collect::>(); + let previous_paths = previous + .records + .iter() + .map(|record| record.path.as_str()) + .collect::>(); + let mut conflicts = Vec::new(); + for (new_path, kind, fingerprint) in discovered { + if previous_paths.contains(new_path.as_str()) { + continue; + } + let mut candidate_paths = previous + .records + .iter() + .filter(|record| { + !current_paths.contains(record.path.as_str()) + && record.kind == kind + && record.source_fingerprint.as_ref() == Some(&fingerprint) + }) + .map(|record| record.path.clone()) + .collect::>(); + candidate_paths.sort(); + candidate_paths.dedup(); + if candidate_paths.len() > 1 { + conflicts.push(ExternalMoveConflict { + new_path, + candidate_paths, + kind, + fingerprint, + }); + } + } + conflicts.sort_by(|left, right| left.new_path.cmp(&right.new_path)); + Ok(conflicts) +} + +pub fn is_managed_path(relative_to_assets: &Path) -> bool { + let managed_directory = relative_to_assets + .components() + .next() + .is_some_and(|component| { + let Component::Normal(name) = component else { + return false; + }; + MANAGED_DIRECTORIES + .iter() + .any(|managed| name == OsStr::new(managed)) + }); + let normalized = relative_to_assets.to_string_lossy().replace('\\', "/"); + managed_directory + || MANAGED_PATH_PREFIXES.iter().any(|prefix| { + normalized == *prefix + || normalized + .strip_prefix(prefix) + .is_some_and(|suffix| suffix.starts_with('/')) + }) +} + +/// Validates a user-selected project content path without consulting the filesystem. +pub fn validate_asset_path(path: &Path) -> Result<(), String> { + if path.is_absolute() { + return Err("content paths must be project-relative".into()); + } + let mut components = path.components(); + if components.next() != Some(Component::Normal(OsStr::new(ASSETS_DIRECTORY))) { + return Err("content paths must be located under `assets/`".into()); + } + let remainder = components.collect::(); + if remainder.as_os_str().is_empty() { + return Ok(()); + } + if remainder.components().any(|component| { + matches!( + component, + Component::ParentDir | Component::RootDir | Component::Prefix(_) + ) + }) { + return Err("content paths cannot escape `assets/`".into()); + } + if is_managed_path(&remainder) { + return Err("engine-managed content directories cannot be edited".into()); + } + Ok(()) +} + +/// Classifies an asset by its filename/schema suffix rather than its containing folder. +pub fn classify_asset(path: &Path) -> AssetKind { + let name = path + .file_name() + .and_then(OsStr::to_str) + .unwrap_or_default() + .to_ascii_lowercase(); + if name.ends_with(".material-instance.ron") { + return AssetKind::MaterialInstance; + } + if name.ends_with(".material.ron") { + return AssetKind::Material; + } + if name.ends_with(".scn.ron") { + return AssetKind::Level; + } + if name.ends_with(".prefab.ron") { + return AssetKind::Prefab; + } + if name.ends_with(".post-process.ron") { + return AssetKind::PostProcessEffect; + } + if name.ends_with(".rendering-profile.ron") { + return AssetKind::RenderingProfile; + } + if name.ends_with(".shader-schema.ron") { + return AssetKind::ShaderSchema; + } + match path + .extension() + .and_then(OsStr::to_str) + .unwrap_or_default() + .to_ascii_lowercase() + .as_str() + { + "gltf" | "glb" | "fbx" => AssetKind::Model, + "png" | "jpg" | "jpeg" | "webp" | "ktx2" | "dds" | "tga" | "exr" | "hdr" => { + AssetKind::Texture + } + "ogg" | "oga" | "spx" | "wav" | "mp3" | "flac" => AssetKind::AudioClip, + "mat" | "material" => AssetKind::Material, + _ => AssetKind::Unknown, + } +} + +/// Adds schema-based classification for authored RON assets whose filename is user-controlled. +pub fn classify_asset_file(path: &Path) -> AssetKind { + let path_kind = classify_asset(path); + if path_kind != AssetKind::Unknown && !path.to_string_lossy().ends_with(".scn.ron") { + return path_kind; + } + if path.extension().and_then(OsStr::to_str) != Some("ron") { + return path_kind; + } + let Ok(source) = fs::read_to_string(path) else { + return path_kind; + }; + if ron::from_str::(&source).is_ok() { + return AssetKind::MaterialInstance; + } + if ron::from_str::(&source).is_ok() { + return AssetKind::Material; + } + if ron::from_str::(&source).is_ok() { + return AssetKind::ShaderSchema; + } + if ron::from_str::(&source).is_ok() { + return AssetKind::RenderingProfile; + } + if ron::from_str::(&source).is_ok() { + return AssetKind::PostProcessEffect; + } + path_kind +} + +fn should_descend(entry: &DirEntry, assets_root: &Path) -> bool { + if entry.file_type().is_symlink() { + return false; + } + entry + .path() + .strip_prefix(assets_root) + .ok() + .is_none_or(|relative| !is_managed_path(relative)) +} + +pub fn scan_project( + project_root: &Path, + previous: &AssetRegistryDocument, +) -> Result { + let assets_root = project_root.join(ASSETS_DIRECTORY); + if !assets_root.is_dir() { + return Err(format!( + "project has no assets directory: {}", + assets_root.display() + )); + } + + let mut discovered = Vec::new(); + let mut diagnostics = Vec::new(); + let previous_kinds = previous + .records + .iter() + .map(|record| (record.path.as_str(), record.kind)) + .collect::>(); + for entry in WalkDir::new(&assets_root) + .follow_links(false) + .into_iter() + .filter_entry(|entry| should_descend(entry, &assets_root)) + { + let entry = entry.map_err(|error| format!("content scan failed: {error}"))?; + if !entry.file_type().is_file() { + continue; + } + let relative = entry + .path() + .strip_prefix(project_root) + .map_err(|error| format!("content path escaped project: {error}"))?; + let path = relative.to_string_lossy().replace('\\', "/"); + let mut kind = classify_asset_file(entry.path()); + if matches!(kind, AssetKind::Level | AssetKind::Unknown) { + kind = previous_kinds.get(path.as_str()).copied().unwrap_or(kind); + } + if kind == AssetKind::Unknown { + continue; + } + let fingerprint = if kind.is_imported_source() { + match fs::read(entry.path()) { + Ok(bytes) => Some(AssetSourceFingerprint::from_bytes(&bytes)), + Err(error) => { + diagnostics.push(ContentDiagnostic { + path: path.clone(), + message: format!("could not fingerprint imported source: {error}"), + }); + None + } + } + } else { + None + }; + discovered.push((path, kind, fingerprint)); + } + + let mut by_path = previous + .records + .iter() + .cloned() + .map(|record| (record.path.clone(), record)) + .collect::>(); + let current_paths = discovered + .iter() + .map(|(path, _, _)| path.clone()) + .collect::>(); + let mut records = Vec::with_capacity(discovered.len()); + let mut report = ProcessingReport { + discovered: discovered.len(), + diagnostics, + ..Default::default() + }; + + for (path, kind, fingerprint) in discovered { + let label = Path::new(&path) + .file_stem() + .and_then(OsStr::to_str) + .unwrap_or("Asset") + .to_string(); + let mut record = by_path.remove(&path); + if record.is_none() { + if let Some(fingerprint) = fingerprint.as_ref() { + let mut candidates = by_path + .iter() + .filter(|(old_path, record)| { + !current_paths.contains(*old_path) + && record.kind == kind + && record.source_fingerprint.as_ref() == Some(fingerprint) + }) + .map(|(old_path, _)| old_path.clone()) + .collect::>(); + candidates.sort(); + match candidates.as_slice() { + [candidate] => record = by_path.remove(candidate), + [] => {} + _ => { + return Err(format!( + "ambiguous external move for {path}: source fingerprint matches {}; resolve the stable identity in the editor Content Browser before refreshing or running headless processing", + candidates.join(", ") + )); + } + } + } + } + if let Some(existing) = record.as_mut() { + if existing.path != path { + report.moved += 1; + } + existing.path = path; + existing.label = label; + existing.kind = kind; + existing.source_fingerprint = fingerprint; + } else { + report.added += 1; + record = Some(AssetRecord { + id: shared::AssetId::new(), + path, + label, + kind, + source_fingerprint: fingerprint, + import_settings: shared::AssetImportSettings::for_kind(kind), + dependencies: Vec::new(), + }); + } + let mut record = record.expect("record is initialized"); + migrate_legacy_model_material_policy(project_root, &mut record, &mut report.diagnostics); + records.push(record); + } + report.removed = by_path.len(); + records.sort_by(|left, right| left.path.cmp(&right.path)); + let registry = AssetRegistryDocument { + schema_version: shared::ASSET_REGISTRY_SCHEMA_VERSION, + defaults: previous.defaults.clone(), + records, + }; + report.changed = ®istry != previous; + let runtime_catalog = RuntimeContentCatalog::from(®istry); + Ok(ProcessedContent { + registry, + runtime_catalog, + report, + }) +} + +#[derive(Deserialize)] +struct ModelManifestSlotView { + #[serde(default)] + parts: Vec, +} + +#[derive(Deserialize)] +struct ModelManifestPartView { + #[serde(default)] + id: String, + #[serde(default)] + material_id: Option, + #[serde(default)] + material_label: Option, +} + +fn migrate_legacy_model_material_policy( + project_root: &Path, + record: &mut AssetRecord, + diagnostics: &mut Vec, +) { + if record.kind != AssetKind::Model { + return; + } + if record.model_import().material_policy != MaterialImportPolicy::AuthoringOverride { + return; + } + let Some(manifest_path) = record.model_import().static_mesh_manifest_path.as_deref() else { + diagnostics.push(ContentDiagnostic { + path: record.path.clone(), + message: "legacy Authoring Override needs a regenerated model manifest before per-slot migration" + .into(), + }); + return; + }; + let path = project_root.join(manifest_path); + let manifest = fs::read_to_string(&path) + .map_err(|error| format!("could not read {}: {error}", path.display())) + .and_then(|source| { + ron::from_str::(&source) + .map_err(|error| format!("could not parse {}: {error}", path.display())) + }); + let manifest = match manifest { + Ok(manifest) => manifest, + Err(message) => { + diagnostics.push(ContentDiagnostic { + path: record.path.clone(), + message, + }); + return; + } + }; + let mut migrated = record.model_import().material_slots.clone(); + for part in manifest.parts { + if part.material_id.is_none() && part.material_label.is_none() { + continue; + } + if part.id.trim().is_empty() { + diagnostics.push(ContentDiagnostic { + path: record.path.clone(), + message: "legacy material policy cannot migrate a model part with no stable ID; regenerate its manifest in the editor" + .into(), + }); + return; + } + let slot_id = ComponentInstanceId::new(format!("slot:{}", part.id)); + if !migrated + .iter() + .any(|selection| selection.slot_id == slot_id) + { + migrated.push(ModelMaterialSlotSelection { + slot_id, + selection: ModelMaterialSelection::Default, + }); + } + } + migrated.sort_by(|left, right| left.slot_id.0.cmp(&right.slot_id.0)); + record.model_import_mut().material_slots = migrated; + record.model_import_mut().material_policy = MaterialImportPolicy::SourceMaterials; +} + +pub fn serialize_registry(document: &AssetRegistryDocument) -> Result, String> { + ron::ser::to_string_pretty(document, ron::ser::PrettyConfig::default()) + .map(|source| source.into_bytes()) + .map_err(|error| format!("could not serialize asset registry: {error}")) +} + +pub fn serialize_runtime_catalog(catalog: &RuntimeContentCatalog) -> Result, String> { + ron::ser::to_string_pretty(catalog, ron::ser::PrettyConfig::default()) + .map(|source| source.into_bytes()) + .map_err(|error| format!("could not serialize runtime catalog: {error}")) +} + +/// Publishes the editor registry and stripped runtime catalog as one rollback-capable pair. +pub fn publish_content_documents( + project_root: &Path, + document: &AssetRegistryDocument, +) -> Result<(), String> { + let runtime = RuntimeContentCatalog::from(document); + publish_content_documents_with_catalog(project_root, document, &runtime) +} + +pub fn publish_content_documents_with_catalog( + project_root: &Path, + document: &AssetRegistryDocument, + runtime: &RuntimeContentCatalog, +) -> Result<(), String> { + let registry_path = project_root.join(REGISTRY_PATH); + let runtime_path = project_root.join(RUNTIME_CATALOG_PATH); + let original_registry = fs::read(®istry_path).ok(); + let original_runtime = fs::read(&runtime_path).ok(); + let registry_bytes = serialize_registry(document)?; + let runtime_bytes = serialize_runtime_catalog(runtime)?; + if let Err(error) = write_if_changed(®istry_path, ®istry_bytes) + .and_then(|_| write_if_changed(&runtime_path, &runtime_bytes)) + { + restore_published_file(®istry_path, original_registry.as_deref()); + restore_published_file(&runtime_path, original_runtime.as_deref()); + return Err(format!("content catalog publication rolled back: {error}")); + } + Ok(()) +} + +fn restore_published_file(path: &Path, bytes: Option<&[u8]>) { + if let Some(bytes) = bytes { + let _ = fs::write(path, bytes); + } else { + let _ = fs::remove_file(path); + } +} + +pub fn write_if_changed(path: &Path, bytes: &[u8]) -> Result { + if fs::read(path).ok().as_deref() == Some(bytes) { + return Ok(false); + } + if let Some(parent) = path.parent() { + fs::create_dir_all(parent) + .map_err(|error| format!("could not create {}: {error}", parent.display()))?; + } + let temporary = path.with_extension("tmp"); + fs::write(&temporary, bytes) + .map_err(|error| format!("could not stage {}: {error}", path.display()))?; + fs::rename(&temporary, path) + .map_err(|error| format!("could not publish {}: {error}", path.display()))?; + Ok(true) +} + +#[derive(Debug, Clone)] +pub struct PlannedModelArtifacts { + pub record: shared::AssetRecord, + pub static_manifest: static_mesh::StaticMeshManifest, + pub static_path: std::path::PathBuf, + pub static_bytes: Vec, + pub animation_path: std::path::PathBuf, + pub animation_bytes: Vec, +} + +pub fn plan_model_artifacts(record: &shared::AssetRecord) -> Result { + plan_model_artifacts_at(std::path::Path::new("."), record) +} + +pub fn plan_model_artifacts_at( + project_root: &std::path::Path, + record: &shared::AssetRecord, +) -> Result { + let source_path = record.path.clone(); + let mut planned_record = record.clone(); + planned_record.path = project_root + .join(&source_path) + .to_string_lossy() + .into_owned(); + let (static_manifest, static_path) = + static_mesh::plan_static_mesh_artifact(&mut planned_record) + .map_err(|error| format!("static mesh processor failed: {error}"))?; + let (mut animation_manifest, animation_path) = + animation::plan_animation_artifact(&mut planned_record) + .map_err(|error| format!("animation processor failed: {error}"))?; + let mut static_manifest = static_manifest; + static_manifest.source.path.clone_from(&source_path); + animation_manifest.source.path.clone_from(&source_path); + for dependency in &mut static_manifest.source.dependencies { + *dependency = project_catalog_path(project_root, dependency); + } + for dependency in &mut animation_manifest.source.dependencies { + *dependency = project_catalog_path(project_root, dependency); + } + planned_record.path = source_path; + planned_record.dependencies = static_manifest.source.dependencies.clone(); + planned_record + .dependencies + .extend(animation_manifest.source.dependencies.iter().cloned()); + planned_record.dependencies.sort(); + planned_record.dependencies.dedup(); + let pretty = ron::ser::PrettyConfig::default(); + let static_bytes = ron::ser::to_string_pretty(&static_manifest, pretty.clone()) + .map(|source| format!("{source}\n").into_bytes()) + .map_err(|error| format!("could not serialize static mesh artifact: {error}"))?; + let animation_bytes = ron::ser::to_string_pretty(&animation_manifest, pretty) + .map(|source| format!("{source}\n").into_bytes()) + .map_err(|error| format!("could not serialize animation artifact: {error}"))?; + Ok(PlannedModelArtifacts { + record: planned_record, + static_manifest, + static_path: project_root.join(static_path), + static_bytes, + animation_path: project_root.join(animation_path), + animation_bytes, + }) +} + +fn project_catalog_path(project_root: &std::path::Path, path: &str) -> String { + let path = std::path::Path::new(path); + let relative = path.strip_prefix(project_root).unwrap_or(path); + relative.to_string_lossy().replace('\\', "/") +} + +pub fn publish_model_artifacts(plan: &PlannedModelArtifacts) -> Result<(), String> { + let original_static = std::fs::read(&plan.static_path).ok(); + let original_animation = std::fs::read(&plan.animation_path).ok(); + let result = write_if_changed(&plan.static_path, &plan.static_bytes) + .and_then(|_| write_if_changed(&plan.animation_path, &plan.animation_bytes)); + if let Err(error) = result { + restore_artifact(&plan.static_path, original_static.as_deref()); + restore_artifact(&plan.animation_path, original_animation.as_deref()); + return Err(format!("model artifact publication rolled back: {error}")); + } + Ok(()) +} + +fn restore_artifact(path: &std::path::Path, bytes: Option<&[u8]>) { + if let Some(bytes) = bytes { + let _ = std::fs::write(path, bytes); + } else { + let _ = std::fs::remove_file(path); + } +} + +/// Refreshes both generated contracts derived from one imported model source. +pub fn refresh_model_artifacts( + record: &mut shared::AssetRecord, +) -> Result { + let plan = plan_model_artifacts(record)?; + publish_model_artifacts(&plan)?; + *record = plan.record.clone(); + Ok(plan.static_manifest) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn classification_is_folder_independent() { + assert_eq!( + classify_asset(Path::new("assets/Anything/hero.glb")), + AssetKind::Model + ); + assert_eq!( + classify_asset(Path::new("assets/Props/Office/wall.material.ron")), + AssetKind::Material + ); + } + + #[test] + fn managed_and_escaping_paths_are_rejected() { + assert!(validate_asset_path(Path::new("assets/Props/Office")).is_ok()); + assert!(validate_asset_path(Path::new("assets/.index/registry.ron")).is_err()); + assert!(validate_asset_path(Path::new("assets/meshes/generated/a.ron")).is_err()); + assert!(validate_asset_path(Path::new("../outside")).is_err()); + } + + #[test] + fn registry_publication_always_updates_the_runtime_catalog() { + let root = std::env::temp_dir().join(format!( + "blacksite-content-publish-{}", + shared::AssetId::new().as_string() + )); + let document = AssetRegistryDocument { + records: vec![AssetRecord { + id: shared::AssetId::new(), + path: "assets/Props/a.png".into(), + label: "A".into(), + kind: AssetKind::Texture, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::for_kind(AssetKind::Texture), + dependencies: Vec::new(), + }], + ..Default::default() + }; + + publish_content_documents(&root, &document).unwrap(); + + let runtime: RuntimeContentCatalog = + ron::from_str(&fs::read_to_string(root.join(RUNTIME_CATALOG_PATH)).unwrap()).unwrap(); + assert_eq!(runtime.records[0].path, "assets/Props/a.png"); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn headless_scan_migrates_legacy_authoring_override_to_stable_slots() { + let root = std::env::temp_dir().join(format!( + "blacksite-content-policy-migration-{}", + shared::AssetId::new().as_string() + )); + fs::create_dir_all(root.join("assets/meshes/generated")).unwrap(); + fs::write(root.join("assets/chair.fbx"), b"chair").unwrap(); + fs::write( + root.join("assets/meshes/generated/chair.ron"), + "(parts:[(id:\"draw:0\",material_id:Some(\"material:0\"))])", + ) + .unwrap(); + let previous = AssetRegistryDocument { + records: vec![AssetRecord { + id: shared::AssetId::new(), + path: "assets/chair.fbx".into(), + label: "Chair".into(), + kind: AssetKind::Model, + source_fingerprint: Some(AssetSourceFingerprint::from_bytes(b"chair")), + import_settings: shared::AssetImportSettings::Model(shared::ImportSettings { + material_policy: MaterialImportPolicy::AuthoringOverride, + static_mesh_manifest_path: Some("assets/meshes/generated/chair.ron".into()), + ..Default::default() + }), + dependencies: Vec::new(), + }], + ..Default::default() + }; + + let processed = scan_project(&root, &previous).unwrap(); + let settings = processed.registry.records[0].model_import(); + + assert_eq!( + settings.material_policy, + MaterialImportPolicy::SourceMaterials + ); + assert_eq!(settings.material_slots.len(), 1); + assert_eq!(settings.material_slots[0].slot_id.0, "slot:draw:0"); + assert!(matches!( + settings.material_slots[0].selection, + ModelMaterialSelection::Default + )); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn scan_refuses_ambiguous_external_moves_instead_of_replacing_stable_identity() { + let root = std::env::temp_dir().join(format!( + "blacksite-content-ambiguous-move-{}", + shared::AssetId::new().as_string() + )); + fs::create_dir_all(root.join("assets/New")).unwrap(); + fs::write(root.join("assets/New/desk.png"), b"duplicate pixels").unwrap(); + let fingerprint = AssetSourceFingerprint::from_bytes(b"duplicate pixels"); + let previous = AssetRegistryDocument { + records: ["assets/OldA/desk.png", "assets/OldB/desk.png"] + .into_iter() + .map(|path| AssetRecord { + id: shared::AssetId::new(), + path: path.into(), + label: "Desk".into(), + kind: AssetKind::Texture, + source_fingerprint: Some(fingerprint.clone()), + import_settings: shared::AssetImportSettings::for_kind(AssetKind::Texture), + dependencies: Vec::new(), + }) + .collect(), + ..Default::default() + }; + + let conflicts = find_ambiguous_external_moves(&root, &previous).unwrap(); + assert_eq!(conflicts.len(), 1); + assert_eq!(conflicts[0].new_path, "assets/New/desk.png"); + assert_eq!( + conflicts[0].candidate_paths, + ["assets/OldA/desk.png", "assets/OldB/desk.png"] + ); + + let error = scan_project(&root, &previous).unwrap_err(); + + assert!(error.contains("ambiguous external move")); + assert!(error.contains("assets/OldA/desk.png")); + assert!(error.contains("assets/OldB/desk.png")); + assert!(error.contains("Content Browser")); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn scan_preserves_unique_imported_source_ids_across_external_moves() { + let root = std::env::temp_dir().join(format!( + "blacksite-content-unique-moves-{}", + shared::AssetId::new().as_string() + )); + fs::create_dir_all(root.join("assets/New")).unwrap(); + let fixtures = [ + ("model.glb", AssetKind::Model, b"model bytes".as_slice()), + ( + "texture.png", + AssetKind::Texture, + b"texture bytes".as_slice(), + ), + ("audio.ogg", AssetKind::AudioClip, b"audio bytes".as_slice()), + ]; + let mut expected = Vec::new(); + let mut records = Vec::new(); + for (name, kind, bytes) in fixtures { + fs::write(root.join("assets/New").join(name), bytes).unwrap(); + let id = shared::AssetId::new(); + expected.push((format!("assets/New/{name}"), id.clone())); + records.push(AssetRecord { + id, + path: format!("assets/Old/{name}"), + label: name.into(), + kind, + source_fingerprint: Some(AssetSourceFingerprint::from_bytes(bytes)), + import_settings: shared::AssetImportSettings::for_kind(kind), + dependencies: Vec::new(), + }); + } + let previous = AssetRegistryDocument { + records, + ..Default::default() + }; + + let processed = scan_project(&root, &previous).unwrap(); + + assert_eq!(processed.report.moved, 3); + for (path, id) in expected { + assert_eq!( + processed + .registry + .records + .iter() + .find(|record| record.path == path) + .map(|record| &record.id), + Some(&id) + ); + } + fs::remove_dir_all(root).unwrap(); + } +} diff --git a/crates/content_pipeline/src/pbr_grouping.rs b/crates/content_pipeline/src/pbr_grouping.rs new file mode 100644 index 0000000..5b86389 --- /dev/null +++ b/crates/content_pipeline/src/pbr_grouping.rs @@ -0,0 +1,302 @@ +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use std::path::{Path, PathBuf}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum PbrTextureRole { + BaseColor, + Normal, + Roughness, + Metallic, + Occlusion, + PackedOrm, + Height, + Unknown, +} + +impl PbrTextureRole { + pub const ALL: [Self; 8] = [ + Self::BaseColor, + Self::Normal, + Self::Roughness, + Self::Metallic, + Self::Occlusion, + Self::PackedOrm, + Self::Height, + Self::Unknown, + ]; + + pub const fn label(self) -> &'static str { + match self { + Self::BaseColor => "Base color", + Self::Normal => "Normal", + Self::Roughness => "Roughness", + Self::Metallic => "Metallic", + Self::Occlusion => "Occlusion", + Self::PackedOrm => "Packed ORM/ARM", + Self::Height => "Height", + Self::Unknown => "Unresolved", + } + } +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +pub enum PbrMatchConfidence { + High, + Medium, + Low, + Unresolved, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DetectedPbrTexture { + pub path: PathBuf, + pub group_key: String, + pub role: PbrTextureRole, + pub confidence: PbrMatchConfidence, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DetectedPbrGroup { + pub key: String, + pub textures: Vec, +} + +pub fn detect_pbr_texture_groups( + paths: impl IntoIterator, +) -> Vec { + let mut groups: BTreeMap> = BTreeMap::new(); + for path in paths { + if !is_texture_path(&path) { + continue; + } + let (group_key, role, confidence) = classify_texture_name(&path); + groups + .entry(group_key.clone()) + .or_default() + .push(DetectedPbrTexture { + path, + group_key, + role, + confidence, + }); + } + groups + .into_iter() + .map(|(key, mut textures)| { + textures.sort_by(|left, right| left.path.cmp(&right.path)); + DetectedPbrGroup { key, textures } + }) + .collect() +} + +fn classify_texture_name(path: &Path) -> (String, PbrTextureRole, PbrMatchConfidence) { + let stem = path + .file_stem() + .and_then(|stem| stem.to_str()) + .unwrap_or("texture") + .to_ascii_lowercase(); + let mut tokens: Vec<&str> = stem + .split(|character: char| !character.is_ascii_alphanumeric()) + .filter(|token| !token.is_empty()) + .collect(); + while tokens + .last() + .is_some_and(|token| is_resolution_token(token)) + { + tokens.pop(); + } + let joined = tokens.join("_"); + let aliases: &[(&[&str], PbrTextureRole, PbrMatchConfidence)] = &[ + ( + &["occlusion", "roughness", "metallic"], + PbrTextureRole::PackedOrm, + PbrMatchConfidence::High, + ), + ( + &["base", "color"], + PbrTextureRole::BaseColor, + PbrMatchConfidence::High, + ), + ( + &["ambient", "occlusion"], + PbrTextureRole::Occlusion, + PbrMatchConfidence::High, + ), + ( + &["metallic", "roughness"], + PbrTextureRole::PackedOrm, + PbrMatchConfidence::Medium, + ), + ( + &["basecolor"], + PbrTextureRole::BaseColor, + PbrMatchConfidence::High, + ), + ( + &["albedo"], + PbrTextureRole::BaseColor, + PbrMatchConfidence::High, + ), + ( + &["diffuse"], + PbrTextureRole::BaseColor, + PbrMatchConfidence::High, + ), + ( + &["diff"], + PbrTextureRole::BaseColor, + PbrMatchConfidence::Medium, + ), + ( + &["normal"], + PbrTextureRole::Normal, + PbrMatchConfidence::High, + ), + ( + &["nor", "gl"], + PbrTextureRole::Normal, + PbrMatchConfidence::High, + ), + ( + &["nor", "dx"], + PbrTextureRole::Normal, + PbrMatchConfidence::High, + ), + (&["nrm"], PbrTextureRole::Normal, PbrMatchConfidence::Medium), + ( + &["roughness"], + PbrTextureRole::Roughness, + PbrMatchConfidence::High, + ), + ( + &["rough"], + PbrTextureRole::Roughness, + PbrMatchConfidence::Medium, + ), + ( + &["metallic"], + PbrTextureRole::Metallic, + PbrMatchConfidence::High, + ), + ( + &["metalness"], + PbrTextureRole::Metallic, + PbrMatchConfidence::High, + ), + ( + &["metal"], + PbrTextureRole::Metallic, + PbrMatchConfidence::Medium, + ), + ( + &["occlusion"], + PbrTextureRole::Occlusion, + PbrMatchConfidence::High, + ), + (&["ao"], PbrTextureRole::Occlusion, PbrMatchConfidence::High), + ( + &["orm"], + PbrTextureRole::PackedOrm, + PbrMatchConfidence::High, + ), + ( + &["arm"], + PbrTextureRole::PackedOrm, + PbrMatchConfidence::High, + ), + ( + &["height"], + PbrTextureRole::Height, + PbrMatchConfidence::High, + ), + ( + &["displacement"], + PbrTextureRole::Height, + PbrMatchConfidence::High, + ), + ( + &["disp"], + PbrTextureRole::Height, + PbrMatchConfidence::Medium, + ), + (&["n"], PbrTextureRole::Normal, PbrMatchConfidence::Low), + (&["r"], PbrTextureRole::Roughness, PbrMatchConfidence::Low), + (&["m"], PbrTextureRole::Metallic, PbrMatchConfidence::Low), + ]; + for (suffix, role, confidence) in aliases { + if tokens.ends_with(suffix) { + let base_len = tokens.len().saturating_sub(suffix.len()); + let group = tokens[..base_len].join("_"); + return ( + if group.is_empty() { + joined.clone() + } else { + group + }, + *role, + *confidence, + ); + } + } + ( + joined, + PbrTextureRole::Unknown, + PbrMatchConfidence::Unresolved, + ) +} + +fn is_resolution_token(token: &str) -> bool { + token + .strip_suffix('k') + .is_some_and(|number| matches!(number, "1" | "2" | "4" | "8" | "16")) +} + +fn is_texture_path(path: &Path) -> bool { + matches!( + path.extension() + .and_then(|extension| extension.to_str()) + .unwrap_or_default() + .to_ascii_lowercase() + .as_str(), + "png" | "jpg" | "jpeg" | "webp" | "ktx2" | "dds" | "tga" | "exr" | "hdr" + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn poly_haven_suffixes_form_one_high_confidence_group() { + let groups = detect_pbr_texture_groups([ + "assets/metal_office_desk_diff_2k.jpg".into(), + "assets/metal_office_desk_nor_gl_2k.jpg".into(), + "assets/metal_office_desk_arm_2k.jpg".into(), + ]); + assert_eq!(groups.len(), 1); + assert_eq!(groups[0].key, "metal_office_desk"); + assert!(groups[0] + .textures + .iter() + .any(|texture| texture.role == PbrTextureRole::BaseColor)); + assert!(groups[0] + .textures + .iter() + .any(|texture| texture.role == PbrTextureRole::Normal)); + assert!(groups[0] + .textures + .iter() + .any(|texture| texture.role == PbrTextureRole::PackedOrm)); + } + + #[test] + fn unknown_images_remain_visible_for_manual_resolution() { + let groups = detect_pbr_texture_groups(["assets/wood_preview.png".into()]); + assert_eq!(groups[0].textures[0].role, PbrTextureRole::Unknown); + assert_eq!( + groups[0].textures[0].confidence, + PbrMatchConfidence::Unresolved + ); + } +} diff --git a/crates/content_pipeline/src/static_mesh.rs b/crates/content_pipeline/src/static_mesh.rs new file mode 100644 index 0000000..474c6fb --- /dev/null +++ b/crates/content_pipeline/src/static_mesh.rs @@ -0,0 +1,963 @@ +//! Normalized static mesh artifacts generated from model source files. + +use std::fs; +use std::path::Path; + +use bevy::gltf::GltfAssetLabel; +use bevy::prelude::*; +use bevy_ufbx::label::FbxAssetLabel; +use bevy_ufbx::mesh::group_faces_by_material; +use bevy_ufbx::texture::external_texture_paths; +use bevy_ufbx::utils::convert_matrix; +use serde::{Deserialize, Serialize}; + +use shared::{ + AssetRecord, ImportSettings, MaterialImportPolicy, ModelHierarchyMode, ModelMaterialSelection, + ModelPlacementMode, +}; +use shared::{ + AssetSourceFingerprint, ComponentInstanceId, EditorAssetRef, MaterialSlot, MaterialSlotSet, + ModelMaterialSlotSelection, OrphanedModelMaterialSelection, StaticMeshRenderer, + StaticMeshRendererEntry, +}; + +use crate::fingerprint::{fingerprint_file, write_pretty_ron_if_changed}; + +pub const STATIC_MESH_MANIFEST_SCHEMA: u32 = 4; +pub const STATIC_MESH_ARTIFACT_DIR: &str = "assets/meshes/generated"; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct StaticMeshManifest { + pub schema_version: u32, + pub asset_id: String, + pub label: String, + pub source: StaticMeshSource, + pub import: StaticMeshImportSnapshot, + pub metadata: StaticMeshMetadata, + pub parts: Vec, + pub warnings: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct StaticMeshSource { + pub path: String, + pub format: String, + pub fingerprint: StaticMeshSourceFingerprint, + pub dependencies: Vec, +} + +pub type StaticMeshSourceFingerprint = AssetSourceFingerprint; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct StaticMeshImportSnapshot { + pub scale: f32, + pub generate_collider: bool, + pub lod0_only: bool, + pub placement_mode: ModelPlacementMode, + pub hierarchy_mode: ModelHierarchyMode, + #[serde(default, skip_serializing_if = "material_policy_is_default")] + pub material_policy: MaterialImportPolicy, + #[serde(default)] + pub material_slots: Vec, + #[serde(default)] + pub orphaned_material_slots: Vec, +} + +fn material_policy_is_default(policy: &MaterialImportPolicy) -> bool { + *policy == MaterialImportPolicy::SourceMaterials +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct StaticMeshMetadata { + pub mesh_count: usize, + pub material_count: usize, + pub node_count: usize, + pub animation_count: usize, + pub skin_count: usize, + pub light_count: usize, + pub camera_count: usize, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct StaticMeshPart { + #[serde(default)] + pub id: String, + pub name: String, + pub mesh_label: String, + #[serde(default)] + pub material_id: Option, + pub material_slot_name: String, + pub material_label: Option, + pub local_transform: Transform, + pub source_node: Option, + pub source_mesh: Option, + pub source_material: Option, + /// Whether the source primitive is bound to a skin and therefore must never become a static + /// renderer slot. + #[serde(default)] + pub skinned: bool, +} + +pub fn static_mesh_manifest_path(asset_id: &str) -> String { + format!("{STATIC_MESH_ARTIFACT_DIR}/{asset_id}.static_mesh.ron") +} + +pub fn part_id_from_label(label: &str) -> String { + format!("mesh:{}", stable_sub_asset_slug(label)) +} + +pub fn material_id_from_label(label: &str) -> String { + format!("material:{}", stable_sub_asset_slug(label)) +} + +fn gltf_draw_id(node_index: Option, mesh_index: usize, primitive_index: usize) -> String { + let node = node_index + .map(|index| index.to_string()) + .unwrap_or_else(|| "unbound".into()); + format!("draw:scene0:node{node}:mesh{mesh_index}:primitive{primitive_index}") +} + +fn fbx_draw_id(node_index: usize, material_index: usize) -> String { + format!("draw:scene0:node{node_index}:material{material_index}") +} + +fn stable_sub_asset_slug(label: &str) -> String { + let mut slug = String::new(); + for ch in label.chars() { + if ch.is_ascii_alphanumeric() { + slug.push(ch.to_ascii_lowercase()); + } else if !slug.ends_with('_') { + slug.push('_'); + } + } + slug.trim_matches('_').to_string() +} + +pub fn refresh_static_mesh_artifact( + record: &mut AssetRecord, +) -> Result { + let (manifest, path) = plan_static_mesh_artifact(record)?; + + if write_pretty_ron_if_changed(&path, &manifest) + .map_err(|error| format!("could not publish static mesh manifest {path}: {error}"))? + { + info!( + "Static mesh manifest refreshed: source={} artifact={} parts={}", + record.path, + path, + manifest.parts.len() + ); + } + + Ok(manifest) +} + +pub fn plan_static_mesh_artifact( + record: &mut AssetRecord, +) -> Result<(StaticMeshManifest, String), String> { + let mut manifest = build_static_mesh_manifest(record)?; + reconcile_model_material_slots(&manifest, record.model_import_mut()); + manifest.import.material_policy = MaterialImportPolicy::SourceMaterials; + manifest.import.material_slots = record.model_import().material_slots.clone(); + manifest.import.orphaned_material_slots = record.model_import().orphaned_material_slots.clone(); + let path = static_mesh_manifest_path(&record.id.as_string()); + record.model_import_mut().static_mesh_manifest_path = Some(path.clone()); + manifest.source.dependencies.sort(); + manifest.source.dependencies.dedup(); + record.dependencies = manifest.source.dependencies.clone(); + Ok((manifest, path)) +} + +pub fn load_static_mesh_manifest(path: &str) -> Result { + let text = fs::read_to_string(path).map_err(|err| format!("could not read {path}: {err}"))?; + ron::from_str(&text).map_err(|err| format!("could not parse {path}: {err}")) +} + +pub fn renderer_from_manifest( + manifest: &StaticMeshManifest, + _settings: &ImportSettings, +) -> StaticMeshRenderer { + let parts: Vec<_> = manifest + .parts + .iter() + .filter(|part| !part.skinned && manifest.metadata.animation_count == 0) + .map(|part| StaticMeshRendererEntry { + id: ComponentInstanceId::new(part_effective_id(part)), + name: part.name.clone(), + mesh: EditorAssetRef::new( + manifest.asset_id.clone(), + part_effective_id(part), + part.name.clone(), + ), + material_slot_id: ComponentInstanceId::new(material_slot_id(part)), + local_transform: part.local_transform, + visible: true, + cast_shadows: true, + receive_shadows: true, + }) + .collect(); + let materials = MaterialSlotSet { + slots: manifest + .parts + .iter() + .filter(|part| !part.skinned && manifest.metadata.animation_count == 0) + .map(|part| MaterialSlot { + id: ComponentInstanceId::new(material_slot_id(part)), + name: part.material_slot_name.clone(), + material: None, + }) + .collect(), + orphaned_assignments: Vec::new(), + }; + + StaticMeshRenderer { + slots: parts, + materials, + } +} + +/// Builds the shared material slots for a full imported hierarchy. Unlike static renderer +/// construction this intentionally includes skin-bound and rigid animated draw bindings. +pub fn renderer_materials_from_manifest( + manifest: &StaticMeshManifest, + _settings: &ImportSettings, +) -> MaterialSlotSet { + MaterialSlotSet { + slots: manifest + .parts + .iter() + .map(|part| MaterialSlot { + id: ComponentInstanceId::new(material_slot_id(part)), + name: part.material_slot_name.clone(), + material: None, + }) + .collect(), + orphaned_assignments: Vec::new(), + } +} + +pub fn material_selection<'a>( + settings: &'a ImportSettings, + slot_id: &str, +) -> &'a ModelMaterialSelection { + settings + .material_slots + .iter() + .find(|entry| entry.slot_id.0 == slot_id) + .map(|entry| &entry.selection) + .unwrap_or(&ModelMaterialSelection::Source) +} + +fn reconcile_model_material_slots(manifest: &StaticMeshManifest, settings: &mut ImportSettings) { + let names = manifest + .parts + .iter() + .map(|part| (material_slot_id(part), part.material_slot_name.clone())) + .collect::>(); + if settings.material_policy == MaterialImportPolicy::AuthoringOverride { + for slot_id in names.keys() { + if !settings + .material_slots + .iter() + .any(|selection| selection.slot_id.0 == *slot_id) + { + settings.material_slots.push(ModelMaterialSlotSelection { + slot_id: ComponentInstanceId::new(slot_id.clone()), + selection: ModelMaterialSelection::Default, + }); + } + } + } + settings.material_policy = MaterialImportPolicy::SourceMaterials; + let mut retained = Vec::with_capacity(settings.material_slots.len()); + for selection in settings.material_slots.drain(..) { + if names.contains_key(&selection.slot_id.0) { + retained.push(selection); + } else if let ModelMaterialSelection::Project(material) = selection.selection { + settings + .orphaned_material_slots + .push(OrphanedModelMaterialSelection { + slot_id: selection.slot_id, + last_known_name: "Removed imported material slot".into(), + material, + }); + } + } + retained.sort_by(|left, right| left.slot_id.0.cmp(&right.slot_id.0)); + settings.material_slots = retained; + settings + .orphaned_material_slots + .retain(|orphan| !names.contains_key(&orphan.slot_id.0)); + settings + .orphaned_material_slots + .sort_by(|left, right| left.slot_id.0.cmp(&right.slot_id.0)); +} + +fn material_slot_id(part: &StaticMeshPart) -> String { + format!("slot:{}", part_effective_id(part)) +} + +fn part_effective_id(part: &StaticMeshPart) -> String { + if part.id.trim().is_empty() { + part_id_from_label(&part.mesh_label) + } else { + part.id.clone() + } +} + +fn build_static_mesh_manifest(record: &AssetRecord) -> Result { + let format = source_format(&record.path)?; + let fingerprint = fingerprint_file(&record.path)?; + let import = StaticMeshImportSnapshot { + scale: record.model_import().scale, + generate_collider: record.model_import().generate_collider, + lod0_only: record.model_import().lod0_only, + placement_mode: record.model_import().placement_mode, + hierarchy_mode: record.model_import().hierarchy_mode, + material_policy: MaterialImportPolicy::SourceMaterials, + material_slots: record.model_import().material_slots.clone(), + orphaned_material_slots: record.model_import().orphaned_material_slots.clone(), + }; + + let mut manifest = match format.as_str() { + "gltf" | "glb" => build_gltf_manifest(record, format, fingerprint, import)?, + "fbx" => build_fbx_manifest(record, format, fingerprint, import)?, + _ => return Err(format!("unsupported static mesh source format `{format}`")), + }; + + if manifest.parts.is_empty() { + manifest + .warnings + .push("No renderable static mesh parts were found.".into()); + } + + Ok(manifest) +} + +fn build_gltf_manifest( + record: &AssetRecord, + format: String, + fingerprint: StaticMeshSourceFingerprint, + import: StaticMeshImportSnapshot, +) -> Result { + let gltf = gltf::Gltf::open(&record.path) + .map_err(|err| format!("could not parse glTF {}: {err}", record.path))?; + let mut parts = Vec::new(); + let mut dependencies = Vec::new(); + let mut warnings = Vec::new(); + + for buffer in gltf.document.buffers() { + if let gltf::buffer::Source::Uri(uri) = buffer.source() { + dependencies.push(resolve_dependency(&record.path, uri)); + } + } + for image in gltf.document.images() { + if let gltf::image::Source::Uri { uri, .. } = image.source() { + dependencies.push(resolve_dependency(&record.path, uri)); + } + } + + if let Some(scene) = gltf + .document + .default_scene() + .or_else(|| gltf.document.scenes().next()) + { + for node in scene.nodes() { + collect_gltf_node_parts(node, Mat4::IDENTITY, "", &mut parts); + } + } else { + for mesh in gltf.document.meshes() { + collect_gltf_mesh_parts(None, None, None, mesh, Mat4::IDENTITY, false, &mut parts); + } + } + + if gltf.document.animations().count() > 0 { + warnings.push( + "Animations are recorded as metadata; animated placement uses SkinnedMeshRenderer." + .into(), + ); + } + if gltf.document.skins().count() > 0 { + warnings.push( + "Skinned primitives are excluded from StaticMeshRenderer and use SkinnedMeshRenderer." + .into(), + ); + } + + parts.sort_by(|a, b| a.mesh_label.cmp(&b.mesh_label).then(a.name.cmp(&b.name))); + + Ok(StaticMeshManifest { + schema_version: STATIC_MESH_MANIFEST_SCHEMA, + asset_id: record.id.as_string(), + label: record.label.clone(), + source: StaticMeshSource { + path: record.path.clone(), + format, + fingerprint, + dependencies, + }, + import, + metadata: StaticMeshMetadata { + mesh_count: gltf.document.meshes().count(), + material_count: gltf.document.materials().count(), + node_count: gltf.document.nodes().count(), + animation_count: gltf.document.animations().count(), + skin_count: gltf.document.skins().count(), + light_count: 0, + camera_count: gltf.document.cameras().count(), + }, + parts, + warnings, + }) +} + +fn collect_gltf_node_parts( + node: gltf::Node<'_>, + parent_transform: Mat4, + parent_path: &str, + parts: &mut Vec, +) { + let local = Mat4::from_cols_array_2d(&node.transform().matrix()); + let world_transform = parent_transform * local; + let segment = node + .name() + .map(str::to_string) + .unwrap_or_else(|| format!("Node{}", node.index())); + let node_path = if parent_path.is_empty() { + segment + } else { + format!("{parent_path}/{segment}") + }; + let skinned = node.skin().is_some(); + if let Some(mesh) = node.mesh() { + collect_gltf_mesh_parts( + node.name().map(str::to_string), + Some(node.index()), + Some(node_path.clone()), + mesh, + world_transform, + skinned, + parts, + ); + } + for child in node.children() { + collect_gltf_node_parts(child, world_transform, &node_path, parts); + } +} + +fn collect_gltf_mesh_parts( + node_name: Option, + node_index: Option, + node_path: Option, + mesh: gltf::Mesh<'_>, + transform: Mat4, + skinned: bool, + parts: &mut Vec, +) { + let mesh_index = mesh.index(); + let mesh_name = mesh.name().map(str::to_string); + for primitive in mesh.primitives() { + let primitive_index = primitive.index(); + let mesh_label = GltfAssetLabel::Primitive { + mesh: mesh_index, + primitive: primitive_index, + } + .to_string(); + let material = primitive.material(); + let material_label = material + .index() + .map(|index| { + GltfAssetLabel::Material { + index, + is_scale_inverted: false, + } + .to_string() + }) + .or_else(|| Some(GltfAssetLabel::DefaultMaterial.to_string())); + let material_name = material + .name() + .map(str::to_string) + .unwrap_or_else(|| "Default Material".into()); + let name = node_name + .clone() + .or_else(|| mesh_name.clone()) + .unwrap_or_else(|| format!("Mesh {mesh_index}")); + let source_node = node_path + .clone() + .or_else(|| node_index.map(|index| format!("Node{index}"))); + parts.push(StaticMeshPart { + id: gltf_draw_id(node_index, mesh_index, primitive_index), + name: format!("{name} / Primitive {primitive_index}"), + material_id: material_label + .as_ref() + .map(|label| material_id_from_label(label)), + mesh_label, + material_slot_name: material_name.clone(), + material_label, + local_transform: Transform::from_matrix(transform), + source_node, + source_mesh: Some(format!("Mesh{mesh_index}")), + source_material: Some(material_name), + skinned, + }); + } +} + +fn build_fbx_manifest( + record: &AssetRecord, + format: String, + fingerprint: StaticMeshSourceFingerprint, + import: StaticMeshImportSnapshot, +) -> Result { + let bytes = + fs::read(&record.path).map_err(|err| format!("could not read {}: {err}", record.path))?; + let scene = ufbx::load_memory( + &bytes, + ufbx::LoadOpts { + target_unit_meters: 1.0, + target_axes: ufbx::CoordinateAxes::right_handed_y_up(), + filename: ufbx::StringOpt::Ref(&record.path), + ..Default::default() + }, + ) + .map_err(|err| format!("could not parse FBX {}: {err:?}", record.path))?; + + let mut parts = Vec::new(); + let mut warnings = Vec::new(); + for (node_index, node) in scene.nodes.as_ref().iter().enumerate() { + let Some(mesh_ref) = node.mesh.as_ref() else { + continue; + }; + let mesh = mesh_ref.as_ref(); + if mesh.num_vertices == 0 || mesh.faces.as_ref().is_empty() { + continue; + } + let skinned = !mesh.skin_deformers.as_ref().is_empty(); + + let mut groups: Vec<(usize, Vec)> = + group_faces_by_material(mesh).into_iter().collect(); + groups.sort_by_key(|(material_index, _)| *material_index); + for (material_index, indices) in groups { + if indices.is_empty() { + continue; + } + let material = mesh.materials.get(material_index).map(|mat| mat.as_ref()); + let material_label = material + .and_then(|mat| fbx_material_label(&scene, mat.element.element_id)) + .or_else(|| Some(FbxAssetLabel::DefaultMaterial.to_string())); + let material_name = material + .map(|mat| mat.element.name.to_string()) + .filter(|name| !name.is_empty()) + .unwrap_or_else(|| "Default Material".into()); + let node_name = if node.element.name.is_empty() { + format!("Node {node_index}") + } else { + node.element.name.to_string() + }; + let mesh_label = FbxAssetLabel::Mesh(node_index * 1000 + material_index).to_string(); + parts.push(StaticMeshPart { + id: fbx_draw_id(node_index, material_index), + name: format!("{node_name} / Material {material_index}"), + material_id: material_label + .as_ref() + .map(|label| material_id_from_label(label)), + mesh_label, + material_slot_name: material_name.clone(), + material_label, + local_transform: Transform::from_matrix(convert_matrix(&node.geometry_to_world)), + source_node: Some(format!("Node{node_index}")), + source_mesh: Some(format!("Mesh{node_index}")), + source_material: Some(material_name), + skinned, + }); + } + } + + if !scene.anim_stacks.as_ref().is_empty() { + warnings.push( + "Animations are recorded as metadata; animated placement uses SkinnedMeshRenderer." + .into(), + ); + } + if !scene.skin_deformers.as_ref().is_empty() { + warnings.push( + "Skinned primitives are excluded from StaticMeshRenderer and use SkinnedMeshRenderer." + .into(), + ); + } + + parts.sort_by(|a, b| a.mesh_label.cmp(&b.mesh_label).then(a.name.cmp(&b.name))); + + Ok(StaticMeshManifest { + schema_version: STATIC_MESH_MANIFEST_SCHEMA, + asset_id: record.id.as_string(), + label: record.label.clone(), + source: StaticMeshSource { + path: record.path.clone(), + format, + fingerprint, + dependencies: fbx_dependencies(&record.path, &scene)?, + }, + import, + metadata: StaticMeshMetadata { + mesh_count: scene.meshes.as_ref().len(), + material_count: scene.materials.as_ref().len(), + node_count: scene.nodes.as_ref().len(), + animation_count: scene.anim_stacks.as_ref().len(), + skin_count: scene.skin_deformers.as_ref().len(), + light_count: scene.lights.as_ref().len(), + camera_count: scene.cameras.as_ref().len(), + }, + parts, + warnings, + }) +} + +fn fbx_material_label(scene: &ufbx::Scene, element_id: u32) -> Option { + if element_id == 0 { + return None; + } + scene + .materials + .as_ref() + .iter() + .position(|material| material.element.element_id == element_id) + .map(|index| FbxAssetLabel::Material(index).to_string()) +} + +fn fbx_dependencies(source_path: &str, scene: &ufbx::Scene) -> Result, String> { + let path = Path::new(source_path); + let parent = path.parent().unwrap_or_else(|| Path::new("")); + external_texture_paths(scene) + .map_err(|errors| { + format!( + "unsafe FBX texture reference(s) in {source_path}: {}", + errors + .into_iter() + .map(|error| error.to_string()) + .collect::>() + .join("; ") + ) + }) + .map(|paths| { + paths + .into_iter() + .map(|relative| parent.join(relative).to_string_lossy().replace('\\', "/")) + .collect() + }) +} + +fn source_format(path: &str) -> Result { + Path::new(path) + .extension() + .and_then(|ext| ext.to_str()) + .map(|ext| ext.to_ascii_lowercase()) + .ok_or_else(|| format!("asset path `{path}` has no extension")) +} + +fn resolve_dependency(source_path: &str, uri: &str) -> String { + if uri.starts_with("data:") || uri.contains("://") { + return uri.to_string(); + } + Path::new(source_path) + .parent() + .unwrap_or_else(|| Path::new("")) + .join(uri) + .to_string_lossy() + .replace('\\', "/") +} + +#[cfg(test)] +mod tests { + use super::*; + use shared::{AssetId, MaterialRef}; + + fn test_manifest() -> StaticMeshManifest { + StaticMeshManifest { + schema_version: STATIC_MESH_MANIFEST_SCHEMA, + asset_id: "asset-1".into(), + label: "Crate".into(), + source: StaticMeshSource { + path: "assets/models/crate.glb".into(), + format: "glb".into(), + fingerprint: StaticMeshSourceFingerprint { + byte_len: 42, + content_hash: "a".repeat(64), + }, + dependencies: Vec::new(), + }, + import: StaticMeshImportSnapshot { + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: ModelPlacementMode::StaticAsset, + hierarchy_mode: ModelHierarchyMode::SingleActor, + material_policy: MaterialImportPolicy::SourceMaterials, + material_slots: Vec::new(), + orphaned_material_slots: Vec::new(), + }, + metadata: StaticMeshMetadata { + mesh_count: 1, + material_count: 1, + node_count: 1, + animation_count: 0, + skin_count: 0, + light_count: 0, + camera_count: 0, + }, + parts: vec![StaticMeshPart { + id: "mesh:mesh0_primitive0".into(), + name: "Crate / Primitive 0".into(), + mesh_label: "Mesh0/Primitive0".into(), + material_id: Some("material:material0".into()), + material_slot_name: "Wood".into(), + material_label: Some("Material0".into()), + local_transform: Transform::from_xyz(1.0, 2.0, 3.0), + source_node: Some("Node0".into()), + source_mesh: Some("Mesh0".into()), + source_material: Some("Wood".into()), + skinned: false, + }], + warnings: Vec::new(), + } + } + + #[test] + fn static_mesh_manifest_path_uses_asset_id() { + assert_eq!( + static_mesh_manifest_path("abc"), + "assets/meshes/generated/abc.static_mesh.ron" + ); + } + + #[test] + fn renderer_from_manifest_preserves_labels_and_collider_policy() { + let manifest = test_manifest(); + let settings = ImportSettings { + generate_collider: true, + ..Default::default() + }; + + let renderer = renderer_from_manifest(&manifest, &settings); + + assert_eq!(renderer.slots.len(), 1); + let entry = &renderer.slots[0]; + assert_eq!(entry.mesh.asset_id, manifest.asset_id); + assert_eq!(entry.mesh.sub_asset_id, "mesh:mesh0_primitive0"); + assert!(renderer.materials.slots[0].material.is_none()); + } + + #[test] + fn model_slot_selection_remains_asset_owned() { + let manifest = test_manifest(); + let project = MaterialRef::new( + EditorAssetRef::new("project-material", "", "Paint") + .with_source_path("assets/Props/paint.material.ron"), + ); + let mut settings = ImportSettings::default(); + settings + .material_slots + .push(shared::ModelMaterialSlotSelection { + slot_id: ComponentInstanceId::new("slot:mesh:mesh0_primitive0"), + selection: ModelMaterialSelection::Project(project.clone()), + }); + + let renderer = renderer_from_manifest(&manifest, &settings); + assert!(renderer.materials.slots[0].material.is_none()); + assert_eq!( + material_selection(&settings, "slot:mesh:mesh0_primitive0"), + &ModelMaterialSelection::Project(project) + ); + + settings.material_slots[0].selection = ModelMaterialSelection::Default; + let renderer = renderer_from_manifest(&manifest, &settings); + assert!(renderer.materials.slots[0].material.is_none()); + assert_eq!( + material_selection(&settings, "slot:mesh:mesh0_primitive0"), + &ModelMaterialSelection::Default + ); + } + + #[test] + fn removed_project_selection_becomes_an_orphan() { + let manifest = test_manifest(); + let material = MaterialRef::new(EditorAssetRef::new("paint", "", "Paint")); + let mut settings = ImportSettings::default(); + settings + .material_slots + .push(shared::ModelMaterialSlotSelection { + slot_id: ComponentInstanceId::new("slot:removed"), + selection: ModelMaterialSelection::Project(material.clone()), + }); + + reconcile_model_material_slots(&manifest, &mut settings); + + assert!(settings.material_slots.is_empty()); + assert_eq!(settings.orphaned_material_slots.len(), 1); + assert_eq!(settings.orphaned_material_slots[0].material, material); + } + + #[test] + fn schema_v3_manifest_without_hash_migrates_to_content_fingerprint() { + let root = std::env::temp_dir().join(format!( + "blacksite-static-mesh-legacy-{}", + uuid::Uuid::new_v4() + )); + fs::create_dir_all(&root).unwrap(); + let path = root.join("legacy.static_mesh.ron"); + let expected = test_manifest(); + let canonical = + ron::ser::to_string_pretty(&expected, ron::ser::PrettyConfig::default()).unwrap(); + let legacy = canonical + .replacen("schema_version: 4", "schema_version: 3", 1) + .lines() + .filter(|line| !line.contains("content_hash:")) + .collect::>() + .join("\n"); + fs::write(&path, legacy).unwrap(); + + assert!(write_pretty_ron_if_changed(&path, &expected).unwrap()); + assert_eq!( + load_static_mesh_manifest(&path.to_string_lossy()).unwrap(), + expected + ); + + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn equivalent_static_manifest_preserves_existing_formatting_and_newline() { + let root = std::env::temp_dir().join(format!( + "blacksite-static-mesh-semantic-{}", + uuid::Uuid::new_v4() + )); + fs::create_dir_all(&root).unwrap(); + let path = root.join("stable.static_mesh.ron"); + let manifest = test_manifest(); + let exact = format!( + "{}\n\n", + ron::ser::to_string_pretty(&manifest, ron::ser::PrettyConfig::default()).unwrap() + ); + fs::write(&path, &exact).unwrap(); + + assert!(!write_pretty_ron_if_changed(&path, &manifest).unwrap()); + assert_eq!(fs::read_to_string(&path).unwrap(), exact); + + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn renderer_from_manifest_can_select_default_per_slot() { + let manifest = test_manifest(); + let settings = ImportSettings { + material_slots: vec![ModelMaterialSlotSelection { + slot_id: ComponentInstanceId::new(format!( + "slot:{}", + part_effective_id(&manifest.parts[0]) + )), + selection: ModelMaterialSelection::Default, + }], + ..Default::default() + }; + + let renderer = renderer_from_manifest(&manifest, &settings); + + assert!(renderer.materials.slots[0].material.is_none()); + assert_eq!( + material_selection(&settings, &renderer.materials.slots[0].id.0), + &ModelMaterialSelection::Default + ); + } + + #[test] + fn legacy_whole_model_policy_migrates_to_explicit_default_slots() { + let manifest = test_manifest(); + let mut settings = ImportSettings { + material_policy: MaterialImportPolicy::AuthoringOverride, + ..Default::default() + }; + + reconcile_model_material_slots(&manifest, &mut settings); + + assert_eq!( + settings.material_policy, + MaterialImportPolicy::SourceMaterials + ); + assert_eq!(settings.material_slots.len(), 1); + assert!(matches!( + settings.material_slots[0].selection, + ModelMaterialSelection::Default + )); + } + + #[test] + fn renderer_from_manifest_excludes_skinned_primitives() { + let mut manifest = test_manifest(); + manifest.parts[0].skinned = true; + + let renderer = renderer_from_manifest(&manifest, &ImportSettings::default()); + + assert!(renderer.slots.is_empty()); + } + + #[test] + fn renderer_from_manifest_excludes_node_animated_geometry() { + let mut manifest = test_manifest(); + manifest.metadata.animation_count = 1; + + let renderer = renderer_from_manifest(&manifest, &ImportSettings::default()); + + assert!(renderer.slots.is_empty()); + } + + #[test] + fn committed_rigged_fixture_never_builds_static_renderer_slots() { + let path = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../assets/models/robot_expressive.glb") + .to_string_lossy() + .into_owned(); + let record = AssetRecord { + id: AssetId::new(), + path, + label: "Robot Expressive".into(), + kind: shared::AssetKind::Model, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::Model(ImportSettings::default()), + dependencies: Vec::new(), + }; + + let manifest = build_static_mesh_manifest(&record).unwrap(); + let renderer = renderer_from_manifest(&manifest, record.model_import()); + + assert!(manifest.metadata.skin_count > 0); + assert!(manifest.metadata.animation_count > 0); + assert!(manifest.parts.iter().any(|part| part.skinned)); + assert!(renderer.slots.is_empty()); + } + + #[test] + fn committed_fbx_records_sibling_texture_dependencies() { + let path = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../assets/models/painted_wooden_chair_02_2k.fbx") + .to_string_lossy() + .into_owned(); + let record = AssetRecord { + id: AssetId::new(), + path, + label: "Painted Chair".into(), + kind: shared::AssetKind::Model, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::Model(ImportSettings::default()), + dependencies: Vec::new(), + }; + + let manifest = build_static_mesh_manifest(&record).unwrap(); + + assert_eq!(manifest.source.dependencies.len(), 3); + assert!(manifest + .source + .dependencies + .iter() + .all(|path| path.contains("assets/models/textures/painted_wooden_chair_02_"))); + } +} diff --git a/crates/content_pipeline/src/texture.rs b/crates/content_pipeline/src/texture.rs new file mode 100644 index 0000000..b4f769c --- /dev/null +++ b/crates/content_pipeline/src/texture.rs @@ -0,0 +1,978 @@ +//! Deterministic, GPU-free texture processing for editor, watcher, CI, and packaging. + +use image::{imageops::FilterType, Rgba, RgbaImage}; +use shared::{ + resolves_srgb, AssetKind, AssetRecord, AssetRegistryDocument, MaterialAsset, MaterialInputSet, + MaterialInstanceAsset, MaterialRuntimeData, MaterialTextureBinding, NormalMapConvention, + TextureAssetSemantic, TextureChannel, TextureColorSpace, TextureCompression, + TextureImportSettings, TextureMipmapMode, TextureRuntimeData, +}; +use std::path::{Path, PathBuf}; + +pub const TEXTURE_PROCESSOR_VERSION: u32 = 1; + +#[derive(Debug, Clone)] +pub struct TextureArtifactPlan { + pub output_path: PathBuf, + pub output_bytes: Vec, + pub runtime: TextureRuntimeData, + pub reused: bool, +} + +#[derive(Debug, Clone)] +pub struct MaterialArtifactPlan { + pub output_path: PathBuf, + pub output_bytes: Vec, + pub runtime: MaterialRuntimeData, + pub reused: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct MaterialPackingSignature(pub String); + +pub fn plan_texture_artifact( + project_root: &Path, + record: &AssetRecord, +) -> Result { + if record.kind != AssetKind::Texture { + return Err(format!("{} is not a Texture asset", record.path)); + } + let source_path = project_root.join(&record.path); + let source_bytes = std::fs::read(&source_path) + .map_err(|error| format!("could not read texture {}: {error}", source_path.display()))?; + let mut settings = record + .texture_import() + .cloned() + .ok_or_else(|| format!("{} has no Texture import settings", record.path))?; + normalize_texture_settings(&record.path, &mut settings); + + let settings_bytes = ron::ser::to_string(&settings) + .map_err(|error| format!("could not hash Texture import settings: {error}"))?; + let mut hasher = blake3::Hasher::new(); + hasher.update(&source_bytes); + hasher.update(settings_bytes.as_bytes()); + hasher.update(&TEXTURE_PROCESSOR_VERSION.to_le_bytes()); + let processing_key = hasher.finalize().to_hex()[..24].to_string(); + + let is_srgb = resolves_srgb(&settings); + let extension = match settings.compression { + TextureCompression::Uastc | TextureCompression::Auto => "basis", + TextureCompression::Uncompressed => "ktx2", + }; + let relative_output = PathBuf::from(format!( + "assets/.import-cache/runtime/textures/{}/{processing_key}/texture.{extension}", + record.id.as_string() + )); + let output_path = project_root.join(&relative_output); + let runtime = TextureRuntimeData { + source_path: record.path.clone(), + processed_path: Some(normalize_path(&relative_output)), + processing_key: Some(processing_key), + settings, + is_srgb, + }; + if output_path.is_file() { + return Ok(TextureArtifactPlan { + output_path, + output_bytes: Vec::new(), + runtime, + reused: true, + }); + } + + let mut image = image::load_from_memory(&source_bytes) + .map_err(|error| format!("could not decode texture {}: {error}", record.path))? + .to_rgba8(); + image = resize_to_limit(image, runtime.settings.max_dimension); + if runtime.settings.semantic == TextureAssetSemantic::Normal + && runtime.settings.normal_map_convention == NormalMapConvention::DirectX + { + flip_normal_green(&mut image); + } + + let output_bytes = match runtime.settings.compression { + TextureCompression::Uastc | TextureCompression::Auto => { + let mip_count = + requested_mip_count(image.width(), image.height(), runtime.settings.mipmaps); + encode_uastc(&image, is_srgb, mip_count > 1)? + } + TextureCompression::Uncompressed => { + let mips = generate_mips(&image, runtime.settings.mipmaps); + encode_uncompressed_ktx2(&mips, is_srgb)? + } + }; + Ok(TextureArtifactPlan { + output_path, + output_bytes, + runtime, + reused: false, + }) +} + +pub fn publish_texture_artifact(plan: &TextureArtifactPlan) -> Result { + if plan.reused { + return Ok(false); + } + crate::write_if_changed(&plan.output_path, &plan.output_bytes) +} + +pub fn plan_material_artifact( + project_root: &Path, + record: &AssetRecord, + registry: &AssetRegistryDocument, +) -> Result, String> { + if !matches!( + record.kind, + AssetKind::Material | AssetKind::MaterialInstance + ) { + return Ok(None); + } + let inputs = load_resolved_material_inputs(project_root, record)?; + let scalar_bindings = [ + assigned_texture(&inputs, "occlusion"), + assigned_texture(&inputs, "roughness"), + assigned_texture(&inputs, "metallic"), + ]; + if scalar_bindings.iter().all(|binding| binding.is_none()) { + return Ok(None); + } + + let signature = material_packing_signature_from_inputs(project_root, registry, &inputs)?; + let processing_key = signature.0; + let relative_output = PathBuf::from(format!( + "assets/.import-cache/runtime/materials/{}/{}-arm.basis", + record.id.as_string(), + processing_key + )); + let output_path = project_root.join(&relative_output); + if output_path.is_file() { + return Ok(Some(MaterialArtifactPlan { + output_path, + output_bytes: Vec::new(), + runtime: MaterialRuntimeData { + packed_arm_path: Some(normalize_path(&relative_output)), + processing_key: Some(processing_key), + }, + reused: true, + })); + } + + let loaded = scalar_bindings + .iter() + .map(|binding| { + (*binding) + .map(|binding| load_binding_image(project_root, registry, binding)) + .transpose() + }) + .collect::, _>>()?; + let (width, height) = loaded + .iter() + .flatten() + .map(|(_, image)| (image.width(), image.height())) + .next() + .ok_or_else(|| format!("{} has packed inputs but no readable Texture", record.path))?; + let loaded = loaded + .into_iter() + .map(|entry| { + entry.map(|(bytes, image)| { + let image = if image.width() == width && image.height() == height { + image + } else { + image::imageops::resize(&image, width, height, FilterType::Lanczos3) + }; + (bytes, image) + }) + }) + .collect::>(); + let mut packed = RgbaImage::new(width, height); + for y in 0..height { + for x in 0..width { + let ao = sample_scalar(loaded[0].as_ref(), scalar_bindings[0], x, y, 255); + let roughness = sample_scalar(loaded[1].as_ref(), scalar_bindings[1], x, y, 255); + let metallic = sample_scalar(loaded[2].as_ref(), scalar_bindings[2], x, y, 0); + packed.put_pixel(x, y, Rgba([ao, roughness, metallic, 255])); + } + } + Ok(Some(MaterialArtifactPlan { + output_path, + output_bytes: encode_uastc(&packed, false, true)?, + runtime: MaterialRuntimeData { + packed_arm_path: Some(normalize_path(&relative_output)), + processing_key: Some(processing_key), + }, + reused: false, + })) +} + +pub fn publish_material_artifact(plan: &MaterialArtifactPlan) -> Result { + if plan.reused { + return Ok(false); + } + crate::write_if_changed(&plan.output_path, &plan.output_bytes) +} + +pub fn material_packing_signature( + project_root: &Path, + record: &AssetRecord, + registry: &AssetRegistryDocument, +) -> Result, String> { + if !matches!( + record.kind, + AssetKind::Material | AssetKind::MaterialInstance + ) { + return Ok(None); + } + let inputs = load_resolved_material_inputs(project_root, record)?; + if ["occlusion", "roughness", "metallic"] + .into_iter() + .all(|name| assigned_texture(&inputs, name).is_none()) + { + return Ok(None); + } + material_packing_signature_from_inputs(project_root, registry, &inputs).map(Some) +} + +fn material_packing_signature_from_inputs( + project_root: &Path, + registry: &AssetRegistryDocument, + inputs: &MaterialInputSet, +) -> Result { + let mut hasher = blake3::Hasher::new(); + hasher.update(&TEXTURE_PROCESSOR_VERSION.to_le_bytes()); + for name in ["occlusion", "roughness", "metallic"] { + hasher.update(name.as_bytes()); + let Some(binding) = assigned_texture(inputs, name) else { + hasher.update(b"unassigned"); + continue; + }; + hasher.update(format!("{:?}", binding.channel).as_bytes()); + let (path, bytes, settings) = binding_source(project_root, registry, binding)?; + hasher.update(path.as_bytes()); + hasher.update(blake3::hash(&bytes).as_bytes()); + let settings = ron::ser::to_string(&settings) + .map_err(|error| format!("could not hash Texture import settings: {error}"))?; + hasher.update(settings.as_bytes()); + } + Ok(MaterialPackingSignature( + hasher.finalize().to_hex()[..24].to_string(), + )) +} + +fn assigned_texture<'a>( + inputs: &'a MaterialInputSet, + name: &str, +) -> Option<&'a MaterialTextureBinding> { + inputs + .texture(name) + .filter(|binding| binding.texture.is_some()) +} + +pub fn apply_material_plan_to_catalog( + catalog: &mut shared::RuntimeContentCatalog, + asset_id: &shared::AssetId, + plan: &MaterialArtifactPlan, +) -> Result<(), String> { + let record = catalog + .records + .iter_mut() + .find(|record| &record.id == asset_id) + .ok_or_else(|| format!("runtime catalog is missing Material asset {asset_id:?}"))?; + record.material = Some(plan.runtime.clone()); + Ok(()) +} + +pub fn apply_texture_plan_to_catalog( + catalog: &mut shared::RuntimeContentCatalog, + asset_id: &shared::AssetId, + plan: &TextureArtifactPlan, +) -> Result<(), String> { + let record = catalog + .records + .iter_mut() + .find(|record| &record.id == asset_id) + .ok_or_else(|| format!("runtime catalog is missing Texture asset {asset_id:?}"))?; + record.texture = Some(plan.runtime.clone()); + Ok(()) +} + +pub fn normalize_texture_settings(path: &str, settings: &mut TextureImportSettings) { + if settings.semantic == TextureAssetSemantic::Auto { + settings.semantic = infer_texture_semantic(path); + } + if settings.color_space == TextureColorSpace::Auto { + settings.color_space = match settings.semantic { + TextureAssetSemantic::Color | TextureAssetSemantic::Ui => TextureColorSpace::Srgb, + TextureAssetSemantic::Auto + | TextureAssetSemantic::Normal + | TextureAssetSemantic::MaskData + | TextureAssetSemantic::Hdr => TextureColorSpace::Linear, + }; + } + if settings.compression == TextureCompression::Auto { + settings.compression = if settings.semantic == TextureAssetSemantic::Hdr { + TextureCompression::Uncompressed + } else { + TextureCompression::Uastc + }; + } + settings.anisotropy = settings.anisotropy.clamp(1, 16); + settings.max_dimension = settings.max_dimension.filter(|dimension| *dimension > 0); +} + +pub fn infer_texture_semantic(path: &str) -> TextureAssetSemantic { + let lowercase = path.to_ascii_lowercase(); + if lowercase.ends_with(".hdr") || lowercase.ends_with(".exr") { + TextureAssetSemantic::Hdr + } else if ["_normal", "_nor", "_nrm", "normal.", "nor_gl", "nor_dx"] + .iter() + .any(|marker| lowercase.contains(marker)) + { + TextureAssetSemantic::Normal + } else if [ + "_arm", + "_orm", + "_rma", + "_mask", + "_rough", + "_metal", + "_ao", + "occlusion", + "height", + ] + .iter() + .any(|marker| lowercase.contains(marker)) + { + TextureAssetSemantic::MaskData + } else { + TextureAssetSemantic::Color + } +} + +fn resize_to_limit(image: RgbaImage, max_dimension: Option) -> RgbaImage { + let Some(limit) = max_dimension else { + return image; + }; + let largest = image.width().max(image.height()); + if largest <= limit { + return image; + } + let scale = limit as f64 / largest as f64; + let width = ((image.width() as f64 * scale).round() as u32).max(1); + let height = ((image.height() as f64 * scale).round() as u32).max(1); + image::imageops::resize(&image, width, height, FilterType::Lanczos3) +} + +pub fn load_resolved_material_inputs( + project_root: &Path, + record: &AssetRecord, +) -> Result { + let path = project_root.join(&record.path); + match record.kind { + AssetKind::Material => Ok(load_ron::(&path)?.inputs), + AssetKind::MaterialInstance => { + let instance = load_ron::(&path)?; + let base_path = instance + .base + .0 + .source_path + .as_deref() + .ok_or_else(|| format!("{} has no loadable base Material path", record.path))?; + let mut inputs = load_ron::(&project_root.join(base_path))?.inputs; + merge_input_sets(&mut inputs, &instance.overrides); + Ok(inputs) + } + _ => Err(format!("{} is not a Material asset", record.path)), + } +} + +/// Returns direct Material Instance consumers of one base Material. +/// +/// Blacksite currently supports direct-base instances only, so this is the complete dependency +/// closure for a base Material packing change. +pub fn direct_material_instance_dependents( + project_root: &Path, + registry: &AssetRegistryDocument, + base: &AssetRecord, +) -> Vec { + registry + .records + .iter() + .filter(|record| record.kind == AssetKind::MaterialInstance) + .filter_map(|record| { + let instance = + load_ron::(&project_root.join(&record.path)).ok()?; + reference_targets_record(&instance.base.0, base).then(|| record.clone()) + }) + .collect() +} + +/// Returns project Materials and direct Material Instances whose effective inputs reference a +/// Texture through its stable registry identity (with source path as a guarded legacy fallback). +pub fn material_dependents_of_texture( + project_root: &Path, + registry: &AssetRegistryDocument, + texture: &AssetRecord, +) -> Vec { + registry + .records + .iter() + .filter(|record| { + matches!( + record.kind, + AssetKind::Material | AssetKind::MaterialInstance + ) + }) + .filter_map(|record| { + let inputs = load_resolved_material_inputs(project_root, record).ok()?; + inputs + .textures + .iter() + .filter_map(|binding| binding.texture.as_ref()) + .any(|reference| reference_targets_record(reference, texture)) + .then(|| record.clone()) + }) + .collect() +} + +fn reference_targets_record(reference: &shared::EditorAssetRef, record: &AssetRecord) -> bool { + (!reference.asset_id.is_empty() && reference.asset_id == record.id.as_string()) + || reference.source_path.as_deref() == Some(record.path.as_str()) +} + +fn load_ron(path: &Path) -> Result { + let source = std::fs::read_to_string(path) + .map_err(|error| format!("could not read {}: {error}", path.display()))?; + ron::from_str(&source).map_err(|error| format!("invalid RON in {}: {error}", path.display())) +} + +fn merge_input_sets(base: &mut MaterialInputSet, overrides: &MaterialInputSet) { + for value in &overrides.values { + if let Some(existing) = base + .values + .iter_mut() + .find(|entry| entry.name == value.name) + { + *existing = value.clone(); + } else { + base.values.push(value.clone()); + } + } + for texture in &overrides.textures { + if let Some(existing) = base + .textures + .iter_mut() + .find(|entry| entry.name == texture.name) + { + *existing = texture.clone(); + } else { + base.textures.push(texture.clone()); + } + } +} + +fn load_binding_image( + project_root: &Path, + registry: &AssetRegistryDocument, + binding: &MaterialTextureBinding, +) -> Result<(Vec, RgbaImage), String> { + let (_, bytes, _) = binding_source(project_root, registry, binding)?; + let image = image::load_from_memory(&bytes) + .map_err(|error| format!("could not decode Texture for {}: {error}", binding.name))? + .to_rgba8(); + Ok((bytes, image)) +} + +fn binding_source( + project_root: &Path, + registry: &AssetRegistryDocument, + binding: &MaterialTextureBinding, +) -> Result<(String, Vec, TextureImportSettings), String> { + let reference = binding + .texture + .as_ref() + .ok_or_else(|| format!("Material input {} is unassigned", binding.name))?; + let record = registry.records.iter().find(|record| { + record.id.as_string() == reference.asset_id + || reference + .source_path + .as_deref() + .is_some_and(|path| record.path == path) + }); + let path = record + .map(|record| record.path.clone()) + .or_else(|| reference.source_path.clone()) + .ok_or_else(|| format!("Texture {} has no project path", reference.label))?; + let bytes = std::fs::read(project_root.join(&path)) + .map_err(|error| format!("could not read Texture {path}: {error}"))?; + let mut settings = record + .and_then(|record| record.texture_import().cloned()) + .unwrap_or_default(); + normalize_texture_settings(&path, &mut settings); + Ok((path, bytes, settings)) +} + +fn sample_scalar( + image: Option<&(Vec, RgbaImage)>, + binding: Option<&MaterialTextureBinding>, + x: u32, + y: u32, + fallback: u8, +) -> u8 { + let (Some((_, image)), Some(binding)) = (image, binding) else { + return fallback; + }; + let pixel = image.get_pixel(x, y).0; + match binding.channel { + TextureChannel::R | TextureChannel::Rgb | TextureChannel::Rgba => pixel[0], + TextureChannel::G => pixel[1], + TextureChannel::B => pixel[2], + TextureChannel::A => pixel[3], + } +} + +fn flip_normal_green(image: &mut RgbaImage) { + for pixel in image.pixels_mut() { + pixel.0[1] = 255_u8.saturating_sub(pixel.0[1]); + } +} + +fn requested_mip_count(width: u32, height: u32, mode: TextureMipmapMode) -> u32 { + if mode != TextureMipmapMode::Generate { + return 1; + } + width.max(height).ilog2() + 1 +} + +fn generate_mips(image: &RgbaImage, mode: TextureMipmapMode) -> Vec { + let mut levels = vec![image.clone()]; + if mode != TextureMipmapMode::Generate { + return levels; + } + while levels + .last() + .is_some_and(|level| level.width() > 1 || level.height() > 1) + { + let previous = levels.last().expect("mip chain has a base level"); + let width = (previous.width() / 2).max(1); + let height = (previous.height() / 2).max(1); + levels.push(image::imageops::resize( + previous, + width, + height, + FilterType::Lanczos3, + )); + } + levels +} + +fn encode_uastc( + image: &RgbaImage, + is_srgb: bool, + generate_mipmaps: bool, +) -> Result, String> { + let mut params = basis_universal::CompressorParams::new(); + params.set_basis_format(basis_universal::BasisTextureFormat::UASTC4x4); + params.set_uastc_quality_level(basis_universal::UASTC_QUALITY_DEFAULT); + params.set_generate_mipmaps(generate_mipmaps); + params.set_print_status_to_stdout(false); + params.set_color_space(if is_srgb { + basis_universal::ColorSpace::Srgb + } else { + basis_universal::ColorSpace::Linear + }); + params + .source_image_mut(0) + .init(image.as_raw(), image.width(), image.height(), 4); + let mut compressor = basis_universal::Compressor::new(4); + // SAFETY: the image is tightly packed RGBA8 and all compressor parameters above are valid. + unsafe { + compressor.init(¶ms); + compressor + .process() + .map_err(|error| format!("UASTC compression failed: {error:?}"))?; + } + Ok(compressor.basis_file().to_vec()) +} + +fn encode_uncompressed_ktx2(mips: &[RgbaImage], is_srgb: bool) -> Result, String> { + let Some(base) = mips.first() else { + return Err("cannot encode an empty mip chain".into()); + }; + let level_count = u32::try_from(mips.len()).map_err(|_| "too many mip levels".to_string())?; + let dfd = rgba8_data_format_descriptor(is_srgb); + let header_len = 80_usize; + let level_index_len = mips.len() * 24; + let dfd_offset = header_len + level_index_len; + let data_offset = align_to(dfd_offset + dfd.len(), 8); + let mut level_offsets = Vec::with_capacity(mips.len()); + let mut cursor = data_offset; + for level in mips { + cursor = align_to(cursor, 8); + level_offsets.push(cursor); + cursor += level.as_raw().len(); + } + let mut bytes = Vec::with_capacity(cursor); + bytes.extend_from_slice(&[ + 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x32, 0x30, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A, + ]); + push_u32(&mut bytes, if is_srgb { 43 } else { 37 }); + push_u32(&mut bytes, 1); + push_u32(&mut bytes, base.width()); + push_u32(&mut bytes, base.height()); + push_u32(&mut bytes, 0); + push_u32(&mut bytes, 0); + push_u32(&mut bytes, 1); + push_u32(&mut bytes, level_count); + push_u32(&mut bytes, 0); + push_u32( + &mut bytes, + u32::try_from(dfd_offset).map_err(|_| "KTX2 is too large".to_string())?, + ); + push_u32(&mut bytes, u32::try_from(dfd.len()).unwrap_or(u32::MAX)); + push_u32(&mut bytes, 0); + push_u32(&mut bytes, 0); + push_u64(&mut bytes, 0); + push_u64(&mut bytes, 0); + for (level, offset) in mips.iter().zip(&level_offsets) { + push_u64( + &mut bytes, + u64::try_from(*offset).map_err(|_| "KTX2 is too large".to_string())?, + ); + push_u64(&mut bytes, level.as_raw().len() as u64); + push_u64(&mut bytes, level.as_raw().len() as u64); + } + bytes.extend_from_slice(&dfd); + bytes.resize(data_offset, 0); + for (level, offset) in mips.iter().zip(level_offsets) { + bytes.resize(offset, 0); + bytes.extend_from_slice(level.as_raw()); + } + Ok(bytes) +} + +fn rgba8_data_format_descriptor(is_srgb: bool) -> Vec { + let mut dfd = Vec::with_capacity(92); + push_u32(&mut dfd, 92); + push_u16(&mut dfd, 0); + push_u16(&mut dfd, 0); + push_u16(&mut dfd, 2); + push_u16(&mut dfd, 88); + dfd.extend_from_slice(&[1, 1, if is_srgb { 2 } else { 1 }, 0]); + dfd.extend_from_slice(&[0, 0, 0, 0]); + dfd.extend_from_slice(&[4, 0, 0, 0, 0, 0, 0, 0]); + for (bit_offset, channel) in [(0_u16, 0_u8), (8, 1), (16, 2), (24, 15)] { + push_u16(&mut dfd, bit_offset); + dfd.extend_from_slice(&[7, channel]); + dfd.extend_from_slice(&[0, 0, 0, 0]); + push_u32(&mut dfd, 0); + push_u32(&mut dfd, 255); + } + dfd +} + +fn align_to(value: usize, alignment: usize) -> usize { + value.div_ceil(alignment) * alignment +} + +fn push_u16(bytes: &mut Vec, value: u16) { + bytes.extend_from_slice(&value.to_le_bytes()); +} + +fn push_u32(bytes: &mut Vec, value: u32) { + bytes.extend_from_slice(&value.to_le_bytes()); +} + +fn push_u64(bytes: &mut Vec, value: u64) { + bytes.extend_from_slice(&value.to_le_bytes()); +} + +fn normalize_path(path: &Path) -> String { + path.to_string_lossy().replace('\\', "/") +} + +#[cfg(test)] +mod tests { + use super::*; + use image::Rgba; + use shared::{ + AssetId, AssetImportSettings, EditorAssetRef, MaterialParameter, MaterialParameterValue, + MaterialRef, ShaderRefDesc, + }; + use uuid::Uuid; + + fn test_root(name: &str) -> PathBuf { + std::env::temp_dir().join(format!( + "blacksite-texture-{name}-{}-{}", + std::process::id(), + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos() + )) + } + + fn record(id: u128, path: &str, kind: AssetKind) -> AssetRecord { + AssetRecord { + id: AssetId(Uuid::from_u128(id)), + path: path.into(), + label: path.into(), + kind, + source_fingerprint: None, + import_settings: if kind == AssetKind::Texture { + AssetImportSettings::Texture(TextureImportSettings::default()) + } else { + AssetImportSettings::None + }, + dependencies: Vec::new(), + } + } + + fn material(label: &str, texture: Option, metallic: f32) -> MaterialAsset { + MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: label.into(), + shader: ShaderRefDesc::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: MaterialInputSet { + values: vec![MaterialParameter { + name: "metallic".into(), + value: MaterialParameterValue::Float(metallic), + }], + textures: texture + .map(|texture| MaterialTextureBinding { + name: "metallic".into(), + texture: Some(texture), + channel: TextureChannel::B, + }) + .into_iter() + .collect(), + }, + } + } + + fn write_ron(path: &Path, value: &impl serde::Serialize) { + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + std::fs::write( + path, + ron::ser::to_string_pretty(value, ron::ser::PrettyConfig::default()).unwrap(), + ) + .unwrap(); + } + + #[test] + fn infers_poly_haven_texture_roles() { + assert_eq!( + infer_texture_semantic("metal_office_desk_diff_2k.jpg"), + TextureAssetSemantic::Color + ); + assert_eq!( + infer_texture_semantic("metal_office_desk_nor_gl_2k.png"), + TextureAssetSemantic::Normal + ); + assert_eq!( + infer_texture_semantic("metal_office_desk_arm_2k.jpg"), + TextureAssetSemantic::MaskData + ); + } + + #[test] + fn normal_y_conversion_is_exact() { + let mut image = RgbaImage::from_pixel(1, 1, Rgba([1, 64, 3, 255])); + flip_normal_green(&mut image); + assert_eq!(image.get_pixel(0, 0).0, [1, 191, 3, 255]); + } + + #[test] + fn uncompressed_ktx2_contains_all_mips() { + let image = RgbaImage::from_pixel(4, 2, Rgba([1, 2, 3, 4])); + let mips = generate_mips(&image, TextureMipmapMode::Generate); + let encoded = encode_uncompressed_ktx2(&mips, false).expect("KTX2 should encode"); + assert_eq!( + &encoded[..12], + &[0xAB, 0x4B, 0x54, 0x58, 0x20, 0x32, 0x30, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A] + ); + assert_eq!(u32::from_le_bytes(encoded[40..44].try_into().unwrap()), 3); + } + + #[test] + fn existing_texture_artifact_is_reused_before_source_decode() { + let root = test_root("texture-reuse"); + let texture = record(21, "assets/textures/cached.png", AssetKind::Texture); + let source_bytes = b"intentionally not an image"; + std::fs::create_dir_all(root.join("assets/textures")).unwrap(); + std::fs::write(root.join(&texture.path), source_bytes).unwrap(); + + let mut settings = texture.texture_import().cloned().unwrap(); + normalize_texture_settings(&texture.path, &mut settings); + let settings_bytes = ron::ser::to_string(&settings).unwrap(); + let mut hasher = blake3::Hasher::new(); + hasher.update(source_bytes); + hasher.update(settings_bytes.as_bytes()); + hasher.update(&TEXTURE_PROCESSOR_VERSION.to_le_bytes()); + let processing_key = &hasher.finalize().to_hex()[..24]; + let output = root.join(format!( + "assets/.import-cache/runtime/textures/{}/{processing_key}/texture.basis", + texture.id.as_string() + )); + std::fs::create_dir_all(output.parent().unwrap()).unwrap(); + std::fs::write(&output, b"cached artifact").unwrap(); + + let plan = plan_texture_artifact(&root, &texture).unwrap(); + assert!(plan.reused); + assert!(plan.output_bytes.is_empty()); + assert_eq!(plan.output_path, output); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn packing_signature_ignores_owner_and_scalar_multipliers() { + let root = test_root("signature"); + let texture = record(1, "assets/textures/arm.bin", AssetKind::Texture); + std::fs::create_dir_all(root.join("assets/textures")).unwrap(); + std::fs::write(root.join(&texture.path), b"stable packed source").unwrap(); + let texture_ref = EditorAssetRef::new(texture.id.as_string(), "texture:source", "ARM") + .with_source_path(&texture.path); + let first = record(2, "assets/materials/first.ron", AssetKind::Material); + let second = record(3, "assets/materials/second.ron", AssetKind::Material); + write_ron( + &root.join(&first.path), + &material("First", Some(texture_ref.clone()), 0.1), + ); + write_ron( + &root.join(&second.path), + &material("Second", Some(texture_ref), 0.9), + ); + let registry = AssetRegistryDocument { + records: vec![texture, first.clone(), second.clone()], + ..Default::default() + }; + + assert_eq!( + material_packing_signature(&root, &first, ®istry).unwrap(), + material_packing_signature(&root, &second, ®istry).unwrap(), + "owner identity and scalar multipliers must not invalidate identical packed data" + ); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn unassigned_scalar_texture_rows_do_not_request_packing() { + let root = test_root("unassigned-packing"); + let material_record = record(22, "assets/materials/plain.ron", AssetKind::Material); + let mut authored = material("Plain", None, 0.5); + authored.inputs.textures.push(MaterialTextureBinding { + name: "occlusion".into(), + texture: None, + channel: TextureChannel::R, + }); + write_ron(&root.join(&material_record.path), &authored); + let registry = AssetRegistryDocument { + records: vec![material_record.clone()], + ..Default::default() + }; + + assert!( + material_packing_signature(&root, &material_record, ®istry) + .unwrap() + .is_none() + ); + assert!(plan_material_artifact(&root, &material_record, ®istry) + .unwrap() + .is_none()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn existing_material_artifact_is_reused_before_texture_decode() { + let root = test_root("material-reuse"); + let texture = record(31, "assets/textures/arm.bin", AssetKind::Texture); + let material_record = record(32, "assets/materials/cached.ron", AssetKind::Material); + std::fs::create_dir_all(root.join("assets/textures")).unwrap(); + std::fs::write(root.join(&texture.path), b"intentionally not an image").unwrap(); + let texture_ref = EditorAssetRef::new(texture.id.as_string(), "texture:source", "ARM") + .with_source_path(&texture.path); + write_ron( + &root.join(&material_record.path), + &material("Cached", Some(texture_ref), 1.0), + ); + let registry = AssetRegistryDocument { + records: vec![texture, material_record.clone()], + ..Default::default() + }; + let signature = material_packing_signature(&root, &material_record, ®istry) + .unwrap() + .unwrap(); + let output = root.join(format!( + "assets/.import-cache/runtime/materials/{}/{}-arm.basis", + material_record.id.as_string(), + signature.0 + )); + std::fs::create_dir_all(output.parent().unwrap()).unwrap(); + std::fs::write(&output, b"cached artifact").unwrap(); + + let plan = plan_material_artifact(&root, &material_record, ®istry) + .unwrap() + .unwrap(); + assert!(plan.reused); + assert!(plan.output_bytes.is_empty()); + assert_eq!(plan.output_path, output); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn dependency_closure_uses_stable_material_and_texture_references() { + let root = test_root("dependencies"); + let texture = record(11, "assets/textures/arm.bin", AssetKind::Texture); + let base = record(12, "assets/materials/base.ron", AssetKind::Material); + let instance = record( + 13, + "assets/materials/base_instance.ron", + AssetKind::MaterialInstance, + ); + let unrelated = record(14, "assets/materials/unrelated.ron", AssetKind::Material); + let texture_ref = EditorAssetRef::new(texture.id.as_string(), "texture:source", "ARM") + .with_source_path(&texture.path); + write_ron( + &root.join(&base.path), + &material("Base", Some(texture_ref), 1.0), + ); + write_ron( + &root.join(&unrelated.path), + &material("Unrelated", None, 1.0), + ); + write_ron( + &root.join(&instance.path), + &MaterialInstanceAsset { + schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, + label: "Base Instance".into(), + base: MaterialRef::new( + EditorAssetRef::new(base.id.as_string(), "material:source", "Base") + .with_source_path(&base.path), + ), + overrides: MaterialInputSet::default(), + }, + ); + let registry = AssetRegistryDocument { + records: vec![texture.clone(), base.clone(), instance.clone(), unrelated], + ..Default::default() + }; + + assert_eq!( + direct_material_instance_dependents(&root, ®istry, &base) + .into_iter() + .map(|record| record.id) + .collect::>(), + vec![instance.id.clone()] + ); + let dependents = material_dependents_of_texture(&root, ®istry, &texture) + .into_iter() + .map(|record| record.id) + .collect::>(); + assert!(dependents.contains(&base.id)); + assert!(dependents.contains(&instance.id)); + assert_eq!(dependents.len(), 2); + std::fs::remove_dir_all(root).unwrap(); + } +} diff --git a/crates/content_pipeline/src/transaction.rs b/crates/content_pipeline/src/transaction.rs new file mode 100644 index 0000000..ea31800 --- /dev/null +++ b/crates/content_pipeline/src/transaction.rs @@ -0,0 +1,1544 @@ +use crate::{validate_asset_path, write_if_changed, REGISTRY_PATH, RUNTIME_CATALOG_PATH}; +use serde::{Deserialize, Serialize}; +use shared::AssetRegistryDocument; +use std::collections::{HashMap, HashSet}; +use std::fs; +use std::path::{Path, PathBuf}; +use walkdir::WalkDir; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub enum ContentOperation { + CreateFolder { + path: PathBuf, + }, + Move { + source: PathBuf, + destination: PathBuf, + }, + Copy { + source: PathBuf, + destination: PathBuf, + }, + WriteFile { + path: PathBuf, + bytes: Vec, + }, + /// Replace one existing authored file only if its reviewed bytes are still current. + ReplaceFile { + path: PathBuf, + bytes: Vec, + expected_fingerprint: String, + previous_bytes: Vec, + }, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ReferenceRewrite { + pub document: PathBuf, + pub from: String, + pub to: String, +} + +/// One authored or registry-owned reference that will become unresolved if selected content is +/// removed. This is intentionally read-only: callers use it to build destructive-operation +/// previews and watcher diagnostics. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub struct ContentReferenceUsage { + pub document: PathBuf, + pub reference: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ContentTransactionPreview { + pub operations: Vec, + pub affected_asset_ids: Vec, + pub reference_rewrites: Vec, + pub collisions: Vec, +} + +/// Returns a deterministic digest for a file or directory tree used by guarded content undo. +pub fn tree_fingerprint(path: &Path) -> Result { + if !path.exists() { + return Err(format!("content path no longer exists: {}", path.display())); + } + let mut hasher = blake3::Hasher::new(); + if path.is_file() { + hasher.update(b"file\0"); + hasher.update( + &fs::read(path) + .map_err(|error| format!("could not read {}: {error}", path.display()))?, + ); + } else { + hasher.update(b"directory\0"); + let mut entries: Vec = WalkDir::new(path) + .follow_links(false) + .into_iter() + .collect::, _>>() + .map_err(|error| format!("could not inspect {}: {error}", path.display()))? + .into_iter() + .filter(|entry| entry.path() != path) + .map(|entry| entry.into_path()) + .collect(); + entries.sort(); + for entry in entries { + let relative = entry.strip_prefix(path).unwrap_or(&entry); + hasher.update(relative.to_string_lossy().replace('\\', "/").as_bytes()); + hasher.update(&[0]); + if entry.is_file() { + hasher.update(b"file\0"); + hasher.update( + &fs::read(&entry) + .map_err(|error| format!("could not read {}: {error}", entry.display()))?, + ); + } else { + hasher.update(b"directory\0"); + } + } + } + Ok(hasher.finalize().to_hex().to_string()) +} + +impl ContentTransactionPreview { + pub fn is_committable(&self) -> bool { + self.collisions.is_empty() + } +} + +pub fn preview_transaction( + project_root: &Path, + operations: Vec, + registry: &AssetRegistryDocument, +) -> Result { + let mut collisions = Vec::new(); + let mut affected_asset_ids = Vec::new(); + let mut reference_rewrites = Vec::new(); + let mut planned_destinations = HashSet::new(); + for operation in &operations { + match operation { + ContentOperation::CreateFolder { path } => { + validate_asset_path(path)?; + if project_root.join(path).exists() { + collisions.push(path.clone()); + } + if !planned_destinations.insert(normalize(path)) { + collisions.push(path.clone()); + } + } + ContentOperation::WriteFile { path, .. } => { + validate_asset_path(path)?; + if project_root.join(path).exists() { + collisions.push(path.clone()); + } + if !planned_destinations.insert(normalize(path)) { + collisions.push(path.clone()); + } + } + ContentOperation::ReplaceFile { + path, + expected_fingerprint, + .. + } => { + validate_asset_path(path)?; + let destination = project_root.join(path); + validate_regular_tree(&destination)?; + if !destination.is_file() { + return Err(format!( + "replacement target is not a file: {}", + path.display() + )); + } + let actual = tree_fingerprint(&destination)?; + if actual != *expected_fingerprint { + return Err(format!( + "replacement target changed after review: {}", + path.display() + )); + } + if !planned_destinations.insert(normalize(path)) { + collisions.push(path.clone()); + } + } + ContentOperation::Move { + source, + destination, + } + | ContentOperation::Copy { + source, + destination, + } => { + validate_asset_path(source)?; + validate_asset_path(destination)?; + validate_regular_tree(&project_root.join(source))?; + if project_root.join(destination).exists() { + collisions.push(destination.clone()); + } + if !planned_destinations.insert(normalize(destination)) { + collisions.push(destination.clone()); + } + if path_is_or_descendant(&normalize(destination), &normalize(source)) { + return Err(format!( + "destination cannot be inside its source: {} -> {}", + source.display(), + destination.display() + )); + } + let from = normalize(source); + let to = normalize(destination); + for record in ®istry.records { + if path_is_or_descendant(&record.path, &from) { + affected_asset_ids.push(record.id.as_string()); + } + } + if matches!(operation, ContentOperation::Move { .. }) { + reference_rewrites.extend(find_reference_rewrites(project_root, &from, &to)?); + } + } + } + } + affected_asset_ids.sort(); + affected_asset_ids.dedup(); + reference_rewrites.sort_by(|left, right| left.document.cmp(&right.document)); + reference_rewrites.dedup(); + Ok(ContentTransactionPreview { + operations, + affected_asset_ids, + reference_rewrites, + collisions, + }) +} + +/// Commits filesystem, reference-cache, and registry changes as one rollback-capable unit. +pub fn commit_transaction( + project_root: &Path, + preview: &ContentTransactionPreview, + registry: &mut AssetRegistryDocument, +) -> Result<(), String> { + commit_transaction_with_registry_update(project_root, preview, registry, |_| Ok(())) +} + +/// Commits a content transaction and applies a dependent registry edit after new files have +/// received stable asset IDs, but before the registry and runtime catalog are published. +/// Registry-edit failures participate in the same byte-restoring rollback as filesystem errors. +pub fn commit_transaction_with_registry_update( + project_root: &Path, + preview: &ContentTransactionPreview, + registry: &mut AssetRegistryDocument, + registry_update: impl FnOnce(&mut AssetRegistryDocument) -> Result<(), String>, +) -> Result<(), String> { + if !preview.is_committable() { + return Err(format!( + "content transaction has {} collision(s)", + preview.collisions.len() + )); + } + let original_registry = registry.clone(); + let registry_path = project_root.join(REGISTRY_PATH); + let original_registry_bytes = fs::read(®istry_path).ok(); + let runtime_catalog_path = project_root.join(RUNTIME_CATALOG_PATH); + let original_runtime_catalog_bytes = fs::read(&runtime_catalog_path).ok(); + let backup_root = project_root + .join("assets/.index/transactions") + .join(uuid::Uuid::new_v4().to_string()); + fs::create_dir_all(&backup_root) + .map_err(|error| format!("could not create transaction staging: {error}"))?; + let mut applied_operations = vec![false; preview.operations.len()]; + + let result: Result<(), String> = (|| { + for (index, rewrite) in preview.reference_rewrites.iter().enumerate() { + let path = project_root.join(&rewrite.document); + let bytes = fs::read(&path) + .map_err(|error| format!("could not read {}: {error}", path.display()))?; + fs::write(backup_root.join(format!("reference-{index}.bak")), &bytes) + .map_err(|error| format!("could not back up {}: {error}", path.display()))?; + let source = String::from_utf8(bytes) + .map_err(|_| format!("reference document is not UTF-8: {}", path.display()))?; + let replaced = replace_quoted_path_prefix(&source, &rewrite.from, &rewrite.to); + write_if_changed(&path, replaced.as_bytes())?; + } + + for (index, operation) in preview.operations.iter().enumerate() { + match operation { + ContentOperation::CreateFolder { path } => { + fs::create_dir_all(project_root.join(path)) + .map_err(|error| format!("could not create {}: {error}", path.display()))?; + applied_operations[index] = true; + } + ContentOperation::Move { + source, + destination, + } => { + let source_path = project_root.join(source); + let destination_path = project_root.join(destination); + if let Some(parent) = destination_path.parent() { + fs::create_dir_all(parent).map_err(|error| { + format!("could not create {}: {error}", parent.display()) + })?; + } + fs::rename(&source_path, &destination_path).map_err(|error| { + format!( + "could not move {} to {}: {error}", + source.display(), + destination.display() + ) + })?; + applied_operations[index] = true; + fs::write( + backup_root.join(format!("move-{index}.ron")), + format!("{}\n{}", source.display(), destination.display()), + ) + .map_err(|error| format!("could not record move rollback: {error}"))?; + rewrite_registry_paths( + registry, + &normalize(source), + &normalize(destination), + false, + ); + } + ContentOperation::Copy { + source, + destination, + } => { + if let Err(error) = + copy_tree(&project_root.join(source), &project_root.join(destination)) + { + let target = project_root.join(destination); + let _ = if target.is_dir() { + fs::remove_dir_all(target) + } else { + fs::remove_file(target) + }; + return Err(error); + } + applied_operations[index] = true; + let id_remap = duplicate_registry_records( + registry, + &normalize(source), + &normalize(destination), + ); + rewrite_copied_reference_tree( + &project_root.join(destination), + &normalize(source), + &normalize(destination), + &id_remap, + )?; + } + ContentOperation::WriteFile { path, bytes } => { + let destination = project_root.join(path); + if let Some(parent) = destination.parent() { + fs::create_dir_all(parent).map_err(|error| { + format!("could not create {}: {error}", parent.display()) + })?; + } + fs::write(&destination, bytes).map_err(|error| { + format!("could not write {}: {error}", destination.display()) + })?; + applied_operations[index] = true; + register_written_asset(registry, path, bytes)?; + } + ContentOperation::ReplaceFile { + path, + bytes, + expected_fingerprint, + previous_bytes, + } => { + let destination = project_root.join(path); + let actual = tree_fingerprint(&destination)?; + if actual != *expected_fingerprint { + return Err(format!( + "replacement target changed after review: {}", + path.display() + )); + } + let original = fs::read(&destination).map_err(|error| { + format!("could not read {}: {error}", destination.display()) + })?; + if original != *previous_bytes { + return Err(format!( + "replacement target bytes changed after review: {}", + path.display() + )); + } + fs::write(backup_root.join(format!("replace-{index}.bak")), original).map_err( + |error| format!("could not back up {}: {error}", destination.display()), + )?; + // A failed write may have truncated the file, so rollback owns it from here. + applied_operations[index] = true; + fs::write(&destination, bytes).map_err(|error| { + format!("could not replace {}: {error}", destination.display()) + })?; + update_replaced_asset(registry, path, bytes)?; + } + } + } + registry_update(registry)?; + registry + .records + .sort_by(|left, right| left.path.cmp(&right.path)); + let bytes = crate::serialize_registry(registry)?; + write_if_changed(®istry_path, &bytes)?; + let runtime_catalog = shared::RuntimeContentCatalog::from(&*registry); + let runtime_bytes = crate::serialize_runtime_catalog(&runtime_catalog)?; + write_if_changed(&runtime_catalog_path, &runtime_bytes)?; + Ok(()) + })(); + + if let Err(error) = result { + rollback_transaction( + project_root, + preview, + &applied_operations, + &backup_root, + original_registry_bytes.as_deref(), + original_runtime_catalog_bytes.as_deref(), + ); + *registry = original_registry; + let _ = fs::remove_dir_all(&backup_root); + return Err(format!("content transaction rolled back: {error}")); + } + fs::remove_dir_all(&backup_root) + .map_err(|error| format!("transaction committed but staging cleanup failed: {error}"))?; + Ok(()) +} + +fn rollback_transaction( + project_root: &Path, + preview: &ContentTransactionPreview, + applied_operations: &[bool], + backup_root: &Path, + original_registry: Option<&[u8]>, + original_runtime_catalog: Option<&[u8]>, +) { + for (index, operation) in preview.operations.iter().enumerate().rev() { + if !applied_operations.get(index).copied().unwrap_or(false) { + continue; + } + match operation { + ContentOperation::CreateFolder { path } => { + let _ = fs::remove_dir(project_root.join(path)); + } + ContentOperation::Move { + source, + destination, + } => { + let _ = fs::rename(project_root.join(destination), project_root.join(source)); + } + ContentOperation::Copy { destination, .. } => { + let target = project_root.join(destination); + let _ = if target.is_dir() { + fs::remove_dir_all(target) + } else { + fs::remove_file(target) + }; + } + ContentOperation::WriteFile { path, .. } => { + let _ = fs::remove_file(project_root.join(path)); + } + ContentOperation::ReplaceFile { path, .. } => { + if let Ok(bytes) = fs::read(backup_root.join(format!("replace-{index}.bak"))) { + let _ = fs::write(project_root.join(path), bytes); + } + } + } + } + for (index, rewrite) in preview.reference_rewrites.iter().enumerate() { + if let Ok(bytes) = fs::read(backup_root.join(format!("reference-{index}.bak"))) { + let _ = fs::write(project_root.join(&rewrite.document), bytes); + } + } + if let Some(bytes) = original_registry { + let _ = fs::write(project_root.join(REGISTRY_PATH), bytes); + } else { + let _ = fs::remove_file(project_root.join(REGISTRY_PATH)); + } + if let Some(bytes) = original_runtime_catalog { + let _ = fs::write(project_root.join(RUNTIME_CATALOG_PATH), bytes); + } else { + let _ = fs::remove_file(project_root.join(RUNTIME_CATALOG_PATH)); + } +} + +fn register_written_asset( + registry: &mut AssetRegistryDocument, + path: &Path, + bytes: &[u8], +) -> Result<(), String> { + let normalized = normalize(path); + if registry + .records + .iter() + .any(|record| record.path == normalized) + { + return Err(format!("registry already contains {}", path.display())); + } + let kind = crate::classify_asset(path); + let label = if kind == shared::AssetKind::Material { + ron::de::from_bytes::(bytes) + .map(|asset| asset.label) + .unwrap_or_else(|_| file_label(path)) + } else if kind == shared::AssetKind::MaterialInstance { + ron::de::from_bytes::(bytes) + .map(|asset| asset.label) + .unwrap_or_else(|_| file_label(path)) + } else { + file_label(path) + }; + registry.records.push(shared::AssetRecord { + id: shared::AssetId::new(), + path: normalized, + label, + kind, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::for_kind(kind), + dependencies: Vec::new(), + }); + Ok(()) +} + +fn update_replaced_asset( + registry: &mut AssetRegistryDocument, + path: &Path, + bytes: &[u8], +) -> Result<(), String> { + let normalized = normalize(path); + let record = registry + .records + .iter_mut() + .find(|record| record.path == normalized) + .ok_or_else(|| { + format!( + "registry does not contain replacement target {}", + path.display() + ) + })?; + record.kind = crate::classify_asset(path); + record.label = if record.kind == shared::AssetKind::Material { + ron::de::from_bytes::(bytes) + .map(|asset| asset.label) + .map_err(|error| format!("replacement Material is invalid: {error}"))? + } else if record.kind == shared::AssetKind::MaterialInstance { + ron::de::from_bytes::(bytes) + .map(|asset| asset.label) + .map_err(|error| format!("replacement Material Instance is invalid: {error}"))? + } else { + file_label(path) + }; + Ok(()) +} + +fn file_label(path: &Path) -> String { + path.file_stem() + .and_then(|stem| stem.to_str()) + .unwrap_or("Asset") + .to_string() +} + +fn rewrite_registry_paths( + registry: &mut AssetRegistryDocument, + from: &str, + to: &str, + regenerate_ids: bool, +) { + if let Some(reference) = &mut registry.defaults.default_material { + rewrite_material_reference_path(reference, from, to); + } + for record in &mut registry.records { + let moved = path_is_or_descendant(&record.path, from); + rewrite_asset_record_paths(record, from, to); + if moved && regenerate_ids { + record.id = shared::AssetId::new(); + } + } +} + +fn rewrite_asset_record_paths(record: &mut shared::AssetRecord, from: &str, to: &str) { + if path_is_or_descendant(&record.path, from) { + record.path = replace_prefix(&record.path, from, to); + } + for dependency in &mut record.dependencies { + if path_is_or_descendant(dependency, from) { + *dependency = replace_prefix(dependency, from, to); + } + } + if let Some(settings) = record.import_settings.model_mut() { + for slot in &mut settings.material_slots { + if let shared::ModelMaterialSelection::Project(reference) = &mut slot.selection { + rewrite_material_reference_path(reference, from, to); + } + } + for orphan in &mut settings.orphaned_material_slots { + rewrite_editor_asset_reference_path(&mut orphan.material.0, from, to); + } + rewrite_optional_path(&mut settings.static_mesh_manifest_path, from, to); + rewrite_optional_path(&mut settings.animation_manifest_path, from, to); + } +} + +fn rewrite_material_reference_path(reference: &mut shared::MaterialRef, from: &str, to: &str) { + rewrite_editor_asset_reference_path(&mut reference.0, from, to); +} + +fn rewrite_editor_asset_reference_path( + reference: &mut shared::EditorAssetRef, + from: &str, + to: &str, +) { + rewrite_optional_path(&mut reference.source_path, from, to); +} + +fn rewrite_optional_path(path: &mut Option, from: &str, to: &str) { + if let Some(path) = path { + if path_is_or_descendant(path, from) { + *path = replace_prefix(path, from, to); + } + } +} + +fn duplicate_registry_records( + registry: &mut AssetRegistryDocument, + from: &str, + to: &str, +) -> HashMap { + let mut duplicates = registry + .records + .iter() + .filter(|record| path_is_or_descendant(&record.path, from)) + .cloned() + .collect::>(); + let id_remap = duplicates + .iter() + .map(|record| (record.id.as_string(), shared::AssetId::new())) + .collect::>(); + for record in &mut duplicates { + let old_id = record.id.as_string(); + record.id = id_remap + .get(&old_id) + .expect("every duplicated record has a replacement ID") + .clone(); + rewrite_asset_record_paths(record, from, to); + remap_asset_record_references(record, &id_remap); + if let Some(settings) = record.import_settings.model_mut() { + settings.static_mesh_manifest_path = None; + settings.animation_manifest_path = None; + } + } + registry.records.extend(duplicates); + id_remap +} + +fn remap_asset_record_references( + record: &mut shared::AssetRecord, + ids: &HashMap, +) { + if let Some(settings) = record.import_settings.model_mut() { + for slot in &mut settings.material_slots { + if let shared::ModelMaterialSelection::Project(reference) = &mut slot.selection { + remap_editor_asset_reference(&mut reference.0, ids); + } + } + for orphan in &mut settings.orphaned_material_slots { + remap_editor_asset_reference(&mut orphan.material.0, ids); + } + } +} + +fn remap_editor_asset_reference( + reference: &mut shared::EditorAssetRef, + ids: &HashMap, +) { + if let Some(replacement) = ids.get(&reference.asset_id) { + reference.asset_id = replacement.as_string(); + } +} + +fn rewrite_copied_reference_tree( + destination: &Path, + from: &str, + to: &str, + id_remap: &HashMap, +) -> Result<(), String> { + for entry in WalkDir::new(destination).follow_links(false) { + let entry = entry.map_err(|error| { + format!( + "could not inspect copied references in {}: {error}", + destination.display() + ) + })?; + if !entry.file_type().is_file() + || entry.path().extension().and_then(|value| value.to_str()) != Some("ron") + { + continue; + } + let bytes = fs::read(entry.path()) + .map_err(|error| format!("could not read {}: {error}", entry.path().display()))?; + let mut source = String::from_utf8(bytes).map_err(|_| { + format!( + "copied reference document is not UTF-8: {}", + entry.path().display() + ) + })?; + source = replace_quoted_path_prefix(&source, from, to); + for (old_id, new_id) in id_remap { + source = source.replace( + &format!("\"{old_id}\""), + &format!("\"{}\"", new_id.as_string()), + ); + } + write_if_changed(entry.path(), source.as_bytes())?; + } + Ok(()) +} + +fn find_reference_rewrites( + project_root: &Path, + from: &str, + to: &str, +) -> Result, String> { + let mut rewrites = Vec::new(); + for entry in WalkDir::new(project_root.join("assets")).follow_links(false) { + let entry = entry.map_err(|error| format!("could not inspect references: {error}"))?; + if !entry.file_type().is_file() + || entry.path().extension().and_then(|value| value.to_str()) != Some("ron") + { + continue; + } + let relative = entry + .path() + .strip_prefix(project_root) + .map_err(|error| error.to_string())?; + if relative.starts_with("assets/.index") || relative.starts_with("assets/.trash") { + continue; + } + if fs::read_to_string(entry.path()) + .is_ok_and(|source| contains_quoted_path_prefix(&source, from)) + { + rewrites.push(ReferenceRewrite { + document: relative.to_path_buf(), + from: from.into(), + to: to.into(), + }); + } + } + Ok(rewrites) +} + +fn push_material_reference_usage( + usages: &mut Vec, + document: &Path, + owner: &shared::AssetRecord, + reference: &shared::MaterialRef, + sources: &[String], + selected_ids: &[String], +) { + let selected_by_id = selected_ids.iter().any(|id| id == &reference.0.asset_id); + let selected_by_path = reference.0.source_path.as_deref().is_some_and(|path| { + sources + .iter() + .any(|source| path_is_or_descendant(path, source)) + }); + if selected_by_id || selected_by_path { + usages.push(ContentReferenceUsage { + document: document.to_path_buf(), + reference: format!("model {}", owner.path), + }); + } +} + +/// Finds external usages of selected files or folders. References inside the selected tree are +/// excluded because they are removed as part of the same operation. +pub fn find_reference_usages( + project_root: &Path, + sources: &[PathBuf], + registry: &AssetRegistryDocument, +) -> Result, String> { + let sources = sources + .iter() + .map(|path| normalize(path)) + .collect::>(); + for source in &sources { + validate_asset_path(Path::new(source))?; + } + let selected_records = registry + .records + .iter() + .filter(|record| { + sources + .iter() + .any(|source| path_is_or_descendant(&record.path, source)) + }) + .collect::>(); + let selected_ids = selected_records + .iter() + .map(|record| record.id.as_string()) + .collect::>(); + let mut usages = Vec::new(); + + for entry in WalkDir::new(project_root.join("assets")).follow_links(false) { + let entry = entry.map_err(|error| format!("could not inspect references: {error}"))?; + if !entry.file_type().is_file() + || entry.path().extension().and_then(|value| value.to_str()) != Some("ron") + { + continue; + } + let relative = entry + .path() + .strip_prefix(project_root) + .map_err(|error| error.to_string())?; + let relative_normalized = normalize(relative); + if relative.starts_with("assets/.index") + || relative.starts_with("assets/.trash") + || sources + .iter() + .any(|source| path_is_or_descendant(&relative_normalized, source)) + { + continue; + } + let Ok(source) = fs::read_to_string(entry.path()) else { + continue; + }; + for selected in &sources { + if contains_quoted_path_prefix(&source, selected) { + usages.push(ContentReferenceUsage { + document: relative.to_path_buf(), + reference: selected.clone(), + }); + } + } + for selected_id in &selected_ids { + if source.contains(&format!("\"{selected_id}\"")) { + usages.push(ContentReferenceUsage { + document: relative.to_path_buf(), + reference: selected_id.clone(), + }); + } + } + } + + let registry_path = PathBuf::from(REGISTRY_PATH); + for owner in ®istry.records { + if sources + .iter() + .any(|source| path_is_or_descendant(&owner.path, source)) + { + continue; + } + let Some(settings) = owner.import_settings.model() else { + continue; + }; + for slot in &settings.material_slots { + if let shared::ModelMaterialSelection::Project(reference) = &slot.selection { + push_material_reference_usage( + &mut usages, + ®istry_path, + owner, + reference, + &sources, + &selected_ids, + ); + } + } + for orphan in &settings.orphaned_material_slots { + push_material_reference_usage( + &mut usages, + ®istry_path, + owner, + &orphan.material, + &sources, + &selected_ids, + ); + } + for dependency in &owner.dependencies { + if sources + .iter() + .any(|source| path_is_or_descendant(dependency, source)) + { + usages.push(ContentReferenceUsage { + document: registry_path.clone(), + reference: format!("dependency of {}", owner.path), + }); + } + } + } + if let Some(reference) = ®istry.defaults.default_material { + let selected_by_id = selected_ids.iter().any(|id| id == &reference.0.asset_id); + let selected_by_path = reference.0.source_path.as_deref().is_some_and(|path| { + sources + .iter() + .any(|source| path_is_or_descendant(path, source)) + }); + if selected_by_id || selected_by_path { + usages.push(ContentReferenceUsage { + document: registry_path, + reference: "project default material".into(), + }); + } + } + usages.sort_by(|left, right| { + left.document + .cmp(&right.document) + .then_with(|| left.reference.cmp(&right.reference)) + }); + usages.dedup(); + Ok(usages) +} + +fn validate_regular_tree(path: &Path) -> Result<(), String> { + if !path.exists() { + return Err(format!("content source does not exist: {}", path.display())); + } + for entry in WalkDir::new(path).follow_links(false) { + let entry = + entry.map_err(|error| format!("could not inspect {}: {error}", path.display()))?; + if entry.file_type().is_symlink() { + return Err(format!( + "content transactions reject symlinks: {}", + entry.path().display() + )); + } + } + Ok(()) +} + +fn contains_quoted_path_prefix(source: &str, path: &str) -> bool { + source.contains(&format!("\"{path}\"")) || source.contains(&format!("\"{path}/")) +} + +fn replace_quoted_path_prefix(source: &str, from: &str, to: &str) -> String { + source + .replace(&format!("\"{from}\""), &format!("\"{to}\"")) + .replace(&format!("\"{from}/"), &format!("\"{to}/")) +} + +fn copy_tree(source: &Path, destination: &Path) -> Result<(), String> { + if source.is_file() { + if let Some(parent) = destination.parent() { + fs::create_dir_all(parent).map_err(|error| error.to_string())?; + } + fs::copy(source, destination).map_err(|error| error.to_string())?; + return Ok(()); + } + for entry in WalkDir::new(source).follow_links(false) { + let entry = entry.map_err(|error| error.to_string())?; + let relative = entry + .path() + .strip_prefix(source) + .map_err(|error| error.to_string())?; + let target = destination.join(relative); + if entry.file_type().is_dir() { + fs::create_dir_all(&target).map_err(|error| error.to_string())?; + } else if entry.file_type().is_file() { + fs::copy(entry.path(), &target).map_err(|error| error.to_string())?; + } else { + return Err(format!( + "unsupported filesystem entry: {}", + entry.path().display() + )); + } + } + Ok(()) +} + +fn path_is_or_descendant(candidate: &str, parent: &str) -> bool { + candidate == parent + || candidate + .strip_prefix(parent) + .is_some_and(|suffix| suffix.starts_with('/')) +} + +fn replace_prefix(candidate: &str, from: &str, to: &str) -> String { + format!("{to}{}", &candidate[from.len()..]) +} + +fn normalize(path: &Path) -> String { + path.to_string_lossy() + .replace('\\', "/") + .trim_end_matches('/') + .to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + use shared::{AssetImportSettings, AssetKind, AssetRecord, ImportSettings}; + + fn fixture() -> (PathBuf, AssetRegistryDocument) { + let root = std::env::temp_dir().join(format!( + "blacksite-content-transaction-{}", + uuid::Uuid::new_v4() + )); + fs::create_dir_all(root.join("assets/Props/Office")).unwrap(); + fs::create_dir_all(root.join("assets/levels")).unwrap(); + fs::create_dir_all(root.join("assets/.index")).unwrap(); + fs::write(root.join("assets/Props/Office/desk.glb"), b"desk").unwrap(); + fs::write( + root.join("assets/levels/main.scn.ron"), + r#"(source_path:"assets/Props/Office/desk.glb")"#, + ) + .unwrap(); + let registry = AssetRegistryDocument { + records: vec![AssetRecord { + id: shared::AssetId::new(), + path: "assets/Props/Office/desk.glb".into(), + label: "Desk".into(), + kind: AssetKind::Model, + source_fingerprint: None, + import_settings: AssetImportSettings::Model(ImportSettings::default()), + dependencies: Vec::new(), + }], + ..Default::default() + }; + fs::write( + root.join(REGISTRY_PATH), + crate::serialize_registry(®istry).unwrap(), + ) + .unwrap(); + (root, registry) + } + + #[test] + fn quoted_path_rewrite_respects_path_component_boundaries() { + let source = r#"(exact:"assets/Props",child:"assets/Props/Desk.glb",neighbor:"assets/Props2/Desk.glb")"#; + + assert!(contains_quoted_path_prefix(source, "assets/Props")); + assert!(!contains_quoted_path_prefix(source, "assets/Prop")); + assert_eq!( + replace_quoted_path_prefix(source, "assets/Props", "assets/Furniture"), + r#"(exact:"assets/Furniture",child:"assets/Furniture/Desk.glb",neighbor:"assets/Props2/Desk.glb")"# + ); + } + + #[test] + fn move_preserves_id_and_rewrites_cached_references() { + let (root, mut registry) = fixture(); + let id = registry.records[0].id.clone(); + let material = shared::MaterialRef::new( + shared::EditorAssetRef::new("material-id", "", "Desk") + .with_source_path("assets/Props/Office/desk.material.ron"), + ); + registry.defaults.default_material = Some(material.clone()); + let settings = registry.records[0].model_import_mut(); + settings + .material_slots + .push(shared::ModelMaterialSlotSelection { + slot_id: shared::ComponentInstanceId::new("slot:desk"), + selection: shared::ModelMaterialSelection::Project(material.clone()), + }); + settings + .orphaned_material_slots + .push(shared::OrphanedModelMaterialSelection { + slot_id: shared::ComponentInstanceId::new("slot:removed"), + last_known_name: "Removed".into(), + material, + }); + settings.static_mesh_manifest_path = + Some("assets/Props/Office/generated.static_mesh.ron".into()); + settings.animation_manifest_path = + Some("assets/Props/Office/generated.animation.ron".into()); + let preview = preview_transaction( + &root, + vec![ContentOperation::Move { + source: "assets/Props/Office".into(), + destination: "assets/Furniture/Office".into(), + }], + ®istry, + ) + .unwrap(); + assert!(preview.is_committable()); + assert_eq!(preview.reference_rewrites.len(), 1); + commit_transaction(&root, &preview, &mut registry).unwrap(); + assert_eq!(registry.records[0].id, id); + assert_eq!(registry.records[0].path, "assets/Furniture/Office/desk.glb"); + let project_material = match ®istry.records[0].model_import().material_slots[0].selection + { + shared::ModelMaterialSelection::Project(reference) => reference, + selection => panic!("expected project material, got {selection:?}"), + }; + assert_eq!( + project_material.0.source_path.as_deref(), + Some("assets/Furniture/Office/desk.material.ron") + ); + assert_eq!( + registry.records[0].model_import().orphaned_material_slots[0] + .material + .0 + .source_path + .as_deref(), + Some("assets/Furniture/Office/desk.material.ron") + ); + assert_eq!( + registry + .defaults + .default_material + .as_ref() + .and_then(|reference| reference.0.source_path.as_deref()), + Some("assets/Furniture/Office/desk.material.ron") + ); + assert_eq!( + registry.records[0] + .model_import() + .static_mesh_manifest_path + .as_deref(), + Some("assets/Furniture/Office/generated.static_mesh.ron") + ); + assert_eq!( + registry.records[0] + .model_import() + .animation_manifest_path + .as_deref(), + Some("assets/Furniture/Office/generated.animation.ron") + ); + assert!(fs::read_to_string(root.join("assets/levels/main.scn.ron")) + .unwrap() + .contains("assets/Furniture/Office/desk.glb")); + let registry_source = fs::read_to_string(root.join(REGISTRY_PATH)).unwrap(); + assert!(!registry_source.contains("assets/Props/Office")); + let catalog_source = fs::read_to_string(root.join(RUNTIME_CATALOG_PATH)).unwrap(); + assert!(!catalog_source.contains("assets/Props/Office")); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn reference_usage_preview_reports_external_documents_and_registry_consumers() { + let (root, mut registry) = fixture(); + let selected_id = registry.records[0].id.clone(); + let material_reference = shared::MaterialRef::new( + shared::EditorAssetRef::new(selected_id.as_string(), "", "Desk") + .with_source_path("assets/Props/Office/desk.glb"), + ); + registry.defaults.default_material = Some(material_reference.clone()); + registry.records.push(AssetRecord { + id: shared::AssetId::new(), + path: "assets/consumer.gltf".into(), + label: "Consumer".into(), + kind: AssetKind::Model, + source_fingerprint: None, + import_settings: AssetImportSettings::Model(ImportSettings { + material_slots: vec![shared::ModelMaterialSlotSelection { + slot_id: shared::ComponentInstanceId::new("slot:0"), + selection: shared::ModelMaterialSelection::Project(material_reference), + }], + ..Default::default() + }), + dependencies: vec!["assets/Props/Office/desk.glb".into()], + }); + fs::write(root.join("assets/consumer.gltf"), b"consumer").unwrap(); + fs::write( + root.join("assets/Props/Office/internal.ron"), + format!("(asset_id:\"{}\")", selected_id.as_string()), + ) + .unwrap(); + + let usages = + find_reference_usages(&root, &[PathBuf::from("assets/Props/Office")], ®istry) + .unwrap(); + + assert!(usages.iter().any(|usage| { + usage.document == Path::new("assets/levels/main.scn.ron") + && usage.reference == "assets/Props/Office" + })); + assert!(usages.iter().any(|usage| { + usage.document == Path::new(REGISTRY_PATH) + && usage.reference == "project default material" + })); + assert!(usages.iter().any(|usage| { + usage.document == Path::new(REGISTRY_PATH) + && usage.reference == "model assets/consumer.gltf" + })); + assert!(usages.iter().any(|usage| { + usage.document == Path::new(REGISTRY_PATH) + && usage.reference == "dependency of assets/consumer.gltf" + })); + assert!(!usages + .iter() + .any(|usage| usage.document == Path::new("assets/Props/Office/internal.ron"))); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn copy_assigns_new_ids_and_rewrites_only_internal_duplicate_references() { + let (root, mut registry) = fixture(); + let material_id = shared::AssetId::new(); + let material_path = "assets/Props/Office/desk.material.ron"; + fs::write( + root.join(material_path), + format!( + r#"(asset_id:"{}",source_path:"{material_path}")"#, + material_id.as_string() + ), + ) + .unwrap(); + registry.records.push(AssetRecord { + id: material_id.clone(), + path: material_path.into(), + label: "Desk Material".into(), + kind: AssetKind::Material, + source_fingerprint: None, + import_settings: AssetImportSettings::None, + dependencies: Vec::new(), + }); + registry.records[0].model_import_mut().material_slots.push( + shared::ModelMaterialSlotSelection { + slot_id: shared::ComponentInstanceId::new("slot:desk"), + selection: shared::ModelMaterialSelection::Project(shared::MaterialRef::new( + shared::EditorAssetRef::new(material_id.as_string(), "", "Desk Material") + .with_source_path(material_path), + )), + }, + ); + registry.records[0] + .model_import_mut() + .static_mesh_manifest_path = + Some("assets/meshes/generated/original.static_mesh.ron".into()); + registry.records[0] + .model_import_mut() + .animation_manifest_path = + Some("assets/animations/generated/original.animation.ron".into()); + let source_model_id = registry.records[0].id.clone(); + + let preview = preview_transaction( + &root, + vec![ContentOperation::Copy { + source: "assets/Props/Office".into(), + destination: "assets/Furniture/Office Copy".into(), + }], + ®istry, + ) + .unwrap(); + commit_transaction(&root, &preview, &mut registry).unwrap(); + + let copied_model = registry + .records + .iter() + .find(|record| record.path == "assets/Furniture/Office Copy/desk.glb") + .unwrap(); + let copied_material = registry + .records + .iter() + .find(|record| record.path == "assets/Furniture/Office Copy/desk.material.ron") + .unwrap(); + assert_ne!(copied_model.id, source_model_id); + assert_ne!(copied_material.id, material_id); + assert!(copied_model + .model_import() + .static_mesh_manifest_path + .is_none()); + assert!(copied_model + .model_import() + .animation_manifest_path + .is_none()); + let copied_reference = match &copied_model.model_import().material_slots[0].selection { + shared::ModelMaterialSelection::Project(reference) => reference, + selection => panic!("expected project material, got {selection:?}"), + }; + assert_eq!(copied_reference.0.asset_id, copied_material.id.as_string()); + assert_eq!( + copied_reference.0.source_path.as_deref(), + Some("assets/Furniture/Office Copy/desk.material.ron") + ); + let copied_source = + fs::read_to_string(root.join("assets/Furniture/Office Copy/desk.material.ron")) + .unwrap(); + assert!(copied_source.contains("assets/Furniture/Office Copy/desk.material.ron")); + assert!(copied_source.contains(&copied_material.id.as_string())); + let original_source = fs::read_to_string(root.join(material_path)).unwrap(); + assert!(original_source.contains(material_path)); + assert!(original_source.contains(&material_id.as_string())); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn collisions_are_previewed_without_mutation() { + let (root, registry) = fixture(); + fs::create_dir_all(root.join("assets/Existing")).unwrap(); + let preview = preview_transaction( + &root, + vec![ContentOperation::Move { + source: "assets/Props/Office".into(), + destination: "assets/Existing".into(), + }], + ®istry, + ) + .unwrap(); + assert!(!preview.is_committable()); + assert!(root.join("assets/Props/Office/desk.glb").is_file()); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn duplicate_batch_destinations_are_reported_as_collisions() { + let (root, registry) = fixture(); + fs::write(root.join("assets/Props/chair.glb"), b"chair").unwrap(); + let destination = PathBuf::from("assets/Furniture/item.glb"); + let preview = preview_transaction( + &root, + vec![ + ContentOperation::Copy { + source: "assets/Props/Office/desk.glb".into(), + destination: destination.clone(), + }, + ContentOperation::Copy { + source: "assets/Props/chair.glb".into(), + destination: destination.clone(), + }, + ], + ®istry, + ) + .unwrap(); + assert_eq!(preview.collisions, vec![destination]); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn failed_batch_rolls_back_only_operations_that_ran() { + let (root, mut registry) = fixture(); + fs::write(root.join("assets/Props/chair.glb"), b"chair").unwrap(); + let preview = preview_transaction( + &root, + vec![ + ContentOperation::Move { + source: "assets/Props/Office/desk.glb".into(), + destination: "assets/Furniture/desk.glb".into(), + }, + ContentOperation::Move { + source: "assets/Props/chair.glb".into(), + destination: "assets/Furniture/chair.glb".into(), + }, + ], + ®istry, + ) + .unwrap(); + fs::remove_file(root.join("assets/Props/chair.glb")).unwrap(); + + let error = commit_transaction(&root, &preview, &mut registry).unwrap_err(); + assert!(error.contains("rolled back")); + assert_eq!( + fs::read(root.join("assets/Props/Office/desk.glb")).unwrap(), + b"desk" + ); + assert!(!root.join("assets/Furniture/desk.glb").exists()); + assert!(!root.join("assets/Furniture/chair.glb").exists()); + assert_eq!(registry.records[0].path, "assets/Props/Office/desk.glb"); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn tree_fingerprint_detects_external_file_changes() { + let (root, _registry) = fixture(); + let folder = root.join("assets/Props/Office"); + let before = tree_fingerprint(&folder).unwrap(); + fs::write(folder.join("desk.glb"), b"changed").unwrap(); + let after = tree_fingerprint(&folder).unwrap(); + assert_ne!(before, after); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn write_file_publishes_bytes_and_registry_record_atomically() { + let (root, mut registry) = fixture(); + let material = shared::MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Desk Steel".into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: Default::default(), + }; + let bytes = ron::ser::to_string(&material).unwrap().into_bytes(); + let path = PathBuf::from("assets/Props/desk_steel.material.ron"); + let preview = preview_transaction( + &root, + vec![ContentOperation::WriteFile { + path: path.clone(), + bytes: bytes.clone(), + }], + ®istry, + ) + .unwrap(); + commit_transaction(&root, &preview, &mut registry).unwrap(); + + assert_eq!(fs::read(root.join(&path)).unwrap(), bytes); + let record = registry + .records + .iter() + .find(|record| record.path == "assets/Props/desk_steel.material.ron") + .unwrap(); + assert_eq!(record.label, "Desk Steel"); + assert_eq!(record.kind, shared::AssetKind::Material); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn dependent_registry_update_sees_written_asset_and_publishes_atomically() { + let (root, mut registry) = fixture(); + let path = PathBuf::from("assets/Props/desk_steel.material.ron"); + let material = shared::MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Desk Steel".into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: Default::default(), + }; + let preview = preview_transaction( + &root, + vec![ContentOperation::WriteFile { + path: path.clone(), + bytes: ron::ser::to_string(&material).unwrap().into_bytes(), + }], + ®istry, + ) + .unwrap(); + + commit_transaction_with_registry_update(&root, &preview, &mut registry, |document| { + let material_id = document + .records + .iter() + .find(|record| record.path == "assets/Props/desk_steel.material.ron") + .map(|record| record.id.as_string()) + .ok_or_else(|| "written material was not registered".to_string())?; + document.records[0].dependencies.push(material_id); + Ok(()) + }) + .unwrap(); + + assert_eq!(registry.records[0].dependencies.len(), 1); + let published = fs::read_to_string(root.join(REGISTRY_PATH)).unwrap(); + assert!(published.contains(®istry.records[0].dependencies[0])); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn failed_dependent_registry_update_rolls_back_written_assets() { + let (root, mut registry) = fixture(); + let original = registry.clone(); + let path = PathBuf::from("assets/Props/invalid.material.ron"); + let preview = preview_transaction( + &root, + vec![ContentOperation::WriteFile { + path: path.clone(), + bytes: b"invalid".to_vec(), + }], + ®istry, + ) + .unwrap(); + + let error = commit_transaction_with_registry_update(&root, &preview, &mut registry, |_| { + Err("dependent registry edit failed".into()) + }) + .unwrap_err(); + + assert!(error.contains("dependent registry edit failed")); + assert!(!root.join(path).exists()); + assert_eq!(registry, original); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn reviewed_replace_preserves_id_and_rolls_back_exact_bytes() { + let (root, mut registry) = fixture(); + let path = PathBuf::from("assets/Props/desk_steel.material.ron"); + let old_material = shared::MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Edited Desk Steel".into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: Default::default(), + }; + let previous_bytes = ron::ser::to_string(&old_material).unwrap().into_bytes(); + fs::write(root.join(&path), &previous_bytes).unwrap(); + let id = shared::AssetId::new(); + registry.records.push(shared::AssetRecord { + id: id.clone(), + path: normalize(&path), + label: old_material.label.clone(), + kind: shared::AssetKind::Material, + source_fingerprint: None, + import_settings: Default::default(), + dependencies: Vec::new(), + }); + let original_registry = registry.clone(); + let mut replacement = old_material.clone(); + replacement.label = "Reimported Desk Steel".into(); + let replacement_bytes = ron::ser::to_string(&replacement).unwrap().into_bytes(); + let preview = preview_transaction( + &root, + vec![ContentOperation::ReplaceFile { + path: path.clone(), + bytes: replacement_bytes, + expected_fingerprint: tree_fingerprint(&root.join(&path)).unwrap(), + previous_bytes: previous_bytes.clone(), + }], + ®istry, + ) + .unwrap(); + + let error = commit_transaction_with_registry_update(&root, &preview, &mut registry, |_| { + Err("dependent mapping failed".into()) + }) + .unwrap_err(); + + assert!(error.contains("dependent mapping failed")); + assert_eq!(fs::read(root.join(&path)).unwrap(), previous_bytes); + assert_eq!(registry, original_registry); + assert_eq!( + registry + .records + .iter() + .find(|record| record.path == normalize(&path)) + .unwrap() + .id, + id + ); + commit_transaction(&root, &preview, &mut registry).unwrap(); + assert_eq!( + fs::read(root.join(&path)).unwrap(), + ron::ser::to_string(&replacement).unwrap().into_bytes() + ); + let replaced_record = registry + .records + .iter() + .find(|record| record.path == normalize(&path)) + .unwrap(); + assert_eq!(replaced_record.id, id); + assert_eq!(replaced_record.label, "Reimported Desk Steel"); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn reviewed_replace_rejects_external_changes_before_publish() { + let (root, mut registry) = fixture(); + let path = PathBuf::from("assets/Props/desk_steel.material.ron"); + let previous_bytes = b"reviewed bytes".to_vec(); + fs::write(root.join(&path), &previous_bytes).unwrap(); + registry.records.push(shared::AssetRecord { + id: shared::AssetId::new(), + path: normalize(&path), + label: "Desk Steel".into(), + kind: shared::AssetKind::Material, + source_fingerprint: None, + import_settings: Default::default(), + dependencies: Vec::new(), + }); + let preview = preview_transaction( + &root, + vec![ContentOperation::ReplaceFile { + path: path.clone(), + bytes: b"replacement".to_vec(), + expected_fingerprint: tree_fingerprint(&root.join(&path)).unwrap(), + previous_bytes, + }], + ®istry, + ) + .unwrap(); + fs::write(root.join(&path), b"external edit").unwrap(); + + let error = commit_transaction(&root, &preview, &mut registry).unwrap_err(); + + assert!(error.contains("changed after review")); + assert_eq!(fs::read(root.join(path)).unwrap(), b"external edit"); + fs::remove_dir_all(root).unwrap(); + } +} diff --git a/crates/content_pipeline/src/trash.rs b/crates/content_pipeline/src/trash.rs new file mode 100644 index 0000000..3eea81e --- /dev/null +++ b/crates/content_pipeline/src/trash.rs @@ -0,0 +1,605 @@ +use crate::{ + serialize_registry, serialize_runtime_catalog, validate_asset_path, write_if_changed, + REGISTRY_PATH, RUNTIME_CATALOG_PATH, +}; +use serde::{Deserialize, Serialize}; +use shared::{AssetRecord, AssetRegistryDocument}; +use std::fs; +use std::path::{Path, PathBuf}; +use std::time::{SystemTime, UNIX_EPOCH}; + +const TRASH_ROOT: &str = "assets/.trash"; +const TRASH_MANIFEST: &str = ".blacksite-trash.ron"; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct TrashManifest { + pub schema_version: u32, + pub batch_id: String, + pub original_paths: Vec, + #[serde(default)] + pub derived_paths: Vec, + pub records: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TrashBatchSummary { + pub path: PathBuf, + pub batch_id: String, + pub original_paths: Vec, +} + +pub fn trash_content( + project_root: &Path, + original_paths: &[PathBuf], + registry: &mut AssetRegistryDocument, +) -> Result { + let originals = normalize_originals(project_root, original_paths)?; + let batch_id = trash_batch_id(); + let batch_path = PathBuf::from(TRASH_ROOT).join(&batch_id); + let absolute_batch = project_root.join(&batch_path); + fs::create_dir_all(&absolute_batch) + .map_err(|error| format!("could not create {}: {error}", absolute_batch.display()))?; + let records = registry + .records + .iter() + .filter(|record| originals.iter().any(|path| descendant(&record.path, path))) + .cloned() + .collect::>(); + let derived_paths = collect_derived_paths(project_root, &records, &originals)?; + let manifest = TrashManifest { + schema_version: 2, + batch_id: batch_id.clone(), + original_paths: originals.clone(), + derived_paths, + records, + }; + let original_registry = registry.clone(); + let registry_path = project_root.join(REGISTRY_PATH); + let original_registry_bytes = fs::read(®istry_path).ok(); + let runtime_path = project_root.join(RUNTIME_CATALOG_PATH); + let original_runtime_bytes = fs::read(&runtime_path).ok(); + let mut moved = Vec::new(); + let result: Result<(), String> = (|| { + for original in &originals { + let source = project_root.join(original); + let destination = absolute_batch.join(original); + if let Some(parent) = destination.parent() { + fs::create_dir_all(parent) + .map_err(|error| format!("could not create {}: {error}", parent.display()))?; + } + fs::rename(&source, &destination).map_err(|error| { + format!( + "could not move {} to {}: {error}", + source.display(), + destination.display() + ) + })?; + moved.push((source, destination)); + } + for derived in &manifest.derived_paths { + let source = project_root.join(derived); + let destination = absolute_batch.join(derived); + if let Some(parent) = destination.parent() { + fs::create_dir_all(parent) + .map_err(|error| format!("could not create {}: {error}", parent.display()))?; + } + fs::rename(&source, &destination).map_err(|error| { + format!( + "could not move derived artifact {} to trash: {error}", + source.display() + ) + })?; + moved.push((source, destination)); + } + let manifest_ron = ron::ser::to_string_pretty(&manifest, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("could not serialize trash manifest: {error}"))?; + fs::write(absolute_batch.join(TRASH_MANIFEST), manifest_ron) + .map_err(|error| format!("could not write trash manifest: {error}"))?; + registry + .records + .retain(|record| !originals.iter().any(|path| descendant(&record.path, path))); + write_if_changed(®istry_path, &serialize_registry(registry)?)?; + write_runtime_catalog(&runtime_path, registry)?; + Ok(()) + })(); + if let Err(error) = result { + rollback_moves(moved); + restore_registry(®istry_path, original_registry_bytes.as_deref()); + restore_registry(&runtime_path, original_runtime_bytes.as_deref()); + *registry = original_registry; + let _ = fs::remove_dir_all(&absolute_batch); + return Err(format!("trash transaction rolled back: {error}")); + } + Ok(TrashBatchSummary { + path: batch_path, + batch_id, + original_paths: originals, + }) +} + +pub fn list_trash_batches(project_root: &Path) -> Result, String> { + let root = project_root.join(TRASH_ROOT); + if !root.exists() { + return Ok(Vec::new()); + } + let mut batches = Vec::new(); + for entry in fs::read_dir(&root) + .map_err(|error| format!("could not inspect {}: {error}", root.display()))? + { + let entry = entry.map_err(|error| format!("could not inspect trash entry: {error}"))?; + if !entry + .file_type() + .map_err(|error| format!("could not inspect trash entry: {error}"))? + .is_dir() + { + continue; + } + let absolute = entry.path(); + let manifest = load_or_infer_manifest(&absolute)?; + batches.push(TrashBatchSummary { + path: PathBuf::from(TRASH_ROOT).join(&manifest.batch_id), + batch_id: manifest.batch_id, + original_paths: manifest.original_paths, + }); + } + batches.sort_by(|left, right| right.batch_id.cmp(&left.batch_id)); + Ok(batches) +} + +pub fn restore_trash_batch( + project_root: &Path, + batch_path: &Path, + registry: &mut AssetRegistryDocument, +) -> Result { + let normalized_batch = normalize(batch_path); + if !normalized_batch.starts_with("assets/.trash/") { + return Err("restore path must identify a managed trash batch".into()); + } + let absolute_batch = project_root.join(batch_path); + let manifest = load_or_infer_manifest(&absolute_batch)?; + for original in &manifest.original_paths { + validate_asset_path(Path::new(original))?; + if project_root.join(original).exists() { + return Err(format!("restore collision: {original} already exists")); + } + if !trashed_source(&absolute_batch, original).exists() { + return Err(format!("trash batch is missing {original}")); + } + } + for derived in &manifest.derived_paths { + validate_derived_path(Path::new(derived))?; + if project_root.join(derived).exists() { + return Err(format!("restore collision: {derived} already exists")); + } + if !trashed_source(&absolute_batch, derived).exists() { + return Err(format!("trash batch is missing derived artifact {derived}")); + } + } + for record in &manifest.records { + if registry + .records + .iter() + .any(|existing| existing.path == record.path || existing.id == record.id) + { + return Err(format!( + "registry collision prevents restoring {}", + record.path + )); + } + } + + let original_registry = registry.clone(); + let registry_path = project_root.join(REGISTRY_PATH); + let original_registry_bytes = fs::read(®istry_path).ok(); + let runtime_path = project_root.join(RUNTIME_CATALOG_PATH); + let original_runtime_bytes = fs::read(&runtime_path).ok(); + let mut moved = Vec::new(); + let result: Result<(), String> = (|| { + for original in &manifest.original_paths { + let source = trashed_source(&absolute_batch, original); + let destination = project_root.join(original); + if let Some(parent) = destination.parent() { + fs::create_dir_all(parent) + .map_err(|error| format!("could not create {}: {error}", parent.display()))?; + } + fs::rename(&source, &destination).map_err(|error| { + format!( + "could not restore {} to {}: {error}", + source.display(), + destination.display() + ) + })?; + moved.push((source, destination)); + } + for derived in &manifest.derived_paths { + let source = trashed_source(&absolute_batch, derived); + let destination = project_root.join(derived); + if let Some(parent) = destination.parent() { + fs::create_dir_all(parent) + .map_err(|error| format!("could not create {}: {error}", parent.display()))?; + } + fs::rename(&source, &destination).map_err(|error| { + format!( + "could not restore derived artifact {} to {}: {error}", + source.display(), + destination.display() + ) + })?; + moved.push((source, destination)); + } + registry.records.extend(manifest.records.iter().cloned()); + registry + .records + .sort_by(|left, right| left.path.cmp(&right.path)); + write_if_changed(®istry_path, &serialize_registry(registry)?)?; + write_runtime_catalog(&runtime_path, registry)?; + Ok(()) + })(); + if let Err(error) = result { + rollback_moves(moved); + restore_registry(®istry_path, original_registry_bytes.as_deref()); + restore_registry(&runtime_path, original_runtime_bytes.as_deref()); + *registry = original_registry; + return Err(format!("restore transaction rolled back: {error}")); + } + let _ = fs::remove_dir_all(&absolute_batch); + Ok(TrashBatchSummary { + path: batch_path.to_path_buf(), + batch_id: manifest.batch_id, + original_paths: manifest.original_paths, + }) +} + +fn normalize_originals(project_root: &Path, paths: &[PathBuf]) -> Result, String> { + if paths.is_empty() { + return Err("no content paths were selected for trash".into()); + } + let mut originals: Vec = Vec::new(); + for path in paths { + validate_asset_path(path)?; + let normalized = normalize(path); + if !project_root.join(path).exists() { + return Err(format!("content path does not exist: {}", path.display())); + } + if originals + .iter() + .any(|parent| descendant(&normalized, parent)) + { + continue; + } + originals.retain(|child| !descendant(child, &normalized)); + originals.push(normalized); + } + originals.sort(); + Ok(originals) +} + +fn load_or_infer_manifest(batch: &Path) -> Result { + let manifest_path = batch.join(TRASH_MANIFEST); + if let Ok(text) = fs::read_to_string(&manifest_path) { + return ron::from_str(&text).map_err(|error| { + format!( + "invalid trash manifest {}: {error}", + manifest_path.display() + ) + }); + } + let batch_id = batch + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or("legacy") + .to_string(); + let scan_root = if batch.join("assets").is_dir() { + batch.join("assets") + } else { + batch.to_path_buf() + }; + let mut original_paths = Vec::new(); + for entry in fs::read_dir(&scan_root) + .map_err(|error| format!("could not inspect legacy trash batch: {error}"))? + { + let entry = + entry.map_err(|error| format!("could not inspect legacy trash item: {error}"))?; + if entry.file_name() == TRASH_MANIFEST { + continue; + } + original_paths.push(format!("assets/{}", entry.file_name().to_string_lossy())); + } + original_paths.sort(); + Ok(TrashManifest { + schema_version: 0, + batch_id, + original_paths, + derived_paths: Vec::new(), + records: Vec::new(), + }) +} + +fn collect_derived_paths( + project_root: &Path, + records: &[AssetRecord], + originals: &[String], +) -> Result, String> { + let mut derived = Vec::new(); + for record in records { + let Some(settings) = record.import_settings.model() else { + continue; + }; + for path in [ + settings.static_mesh_manifest_path.as_deref(), + settings.animation_manifest_path.as_deref(), + ] + .into_iter() + .flatten() + { + validate_derived_path(Path::new(path))?; + if originals.iter().any(|original| descendant(path, original)) { + continue; + } + let absolute = project_root.join(path); + let Ok(metadata) = fs::symlink_metadata(&absolute) else { + continue; + }; + if metadata.file_type().is_symlink() { + return Err(format!( + "derived artifact may not be a symlink: {}", + absolute.display() + )); + } + if metadata.is_file() { + derived.push(path.to_string()); + } + } + } + derived.sort(); + derived.dedup(); + Ok(derived) +} + +fn validate_derived_path(path: &Path) -> Result<(), String> { + if validate_asset_path(path).is_ok() { + return Ok(()); + } + if path.is_absolute() + || path.components().any(|component| { + matches!( + component, + std::path::Component::ParentDir + | std::path::Component::RootDir + | std::path::Component::Prefix(_) + ) + }) + { + return Err("derived artifact paths must remain project-relative".into()); + } + let normalized = normalize(path); + if descendant(&normalized, "assets/meshes/generated") + || descendant(&normalized, "assets/animations/generated") + { + Ok(()) + } else { + Err(format!( + "unsupported derived artifact path outside generated manifest roots: {normalized}" + )) + } +} + +fn trashed_source(batch: &Path, original: &str) -> PathBuf { + let preserved = batch.join(original); + if preserved.exists() { + preserved + } else { + batch.join(original.strip_prefix("assets/").unwrap_or(original)) + } +} + +fn rollback_moves(moved: Vec<(PathBuf, PathBuf)>) { + for (source, destination) in moved.into_iter().rev() { + if let Some(parent) = source.parent() { + let _ = fs::create_dir_all(parent); + } + let _ = fs::rename(destination, source); + } +} + +fn restore_registry(path: &Path, bytes: Option<&[u8]>) { + if let Some(bytes) = bytes { + let _ = fs::write(path, bytes); + } else { + let _ = fs::remove_file(path); + } +} + +fn write_runtime_catalog(path: &Path, registry: &AssetRegistryDocument) -> Result<(), String> { + let catalog = shared::RuntimeContentCatalog::from(registry); + write_if_changed(path, &serialize_runtime_catalog(&catalog)?)?; + Ok(()) +} + +fn trash_batch_id() -> String { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| format!("{}-{:09}", duration.as_secs(), duration.subsec_nanos())) + .unwrap_or_else(|_| "now".into()) +} + +fn normalize(path: &Path) -> String { + path.to_string_lossy().replace('\\', "/") +} + +fn descendant(path: &str, parent: &str) -> bool { + path == parent + || path + .strip_prefix(parent) + .is_some_and(|suffix| suffix.starts_with('/')) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn trash_and_restore_preserve_bytes_and_registry_ids() { + let root = std::env::temp_dir().join(format!( + "blacksite-trash-{}", + shared::AssetId::new().as_string() + )); + fs::create_dir_all(root.join("assets/Props")).unwrap(); + fs::create_dir_all(root.join("assets/.index")).unwrap(); + fs::write(root.join("assets/Props/box.png"), b"asset bytes").unwrap(); + let record = AssetRecord { + id: shared::AssetId::new(), + path: "assets/Props/box.png".into(), + label: "Box".into(), + kind: shared::AssetKind::Texture, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::for_kind(shared::AssetKind::Texture), + dependencies: Vec::new(), + }; + let mut registry = AssetRegistryDocument { + records: vec![record.clone()], + ..Default::default() + }; + fs::write( + root.join(REGISTRY_PATH), + serialize_registry(®istry).unwrap(), + ) + .unwrap(); + + let batch = trash_content( + &root, + &[PathBuf::from("assets/Props/box.png")], + &mut registry, + ) + .unwrap(); + assert!(!root.join("assets/Props/box.png").exists()); + assert!(registry.records.is_empty()); + restore_trash_batch(&root, &batch.path, &mut registry).unwrap(); + assert_eq!( + fs::read(root.join("assets/Props/box.png")).unwrap(), + b"asset bytes" + ); + assert_eq!(registry.records, vec![record]); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn trash_and_restore_include_model_derived_manifests() { + let root = std::env::temp_dir().join(format!( + "blacksite-trash-derived-{}", + shared::AssetId::new().as_string() + )); + fs::create_dir_all(root.join("assets/Props")).unwrap(); + fs::create_dir_all(root.join("assets/meshes/generated")).unwrap(); + fs::create_dir_all(root.join("assets/animations/generated")).unwrap(); + fs::create_dir_all(root.join("assets/.index")).unwrap(); + fs::write(root.join("assets/Props/desk.glb"), b"model bytes").unwrap(); + fs::write( + root.join("assets/meshes/generated/desk.static_mesh.ron"), + b"static manifest", + ) + .unwrap(); + fs::write( + root.join("assets/animations/generated/desk.animation.ron"), + b"animation manifest", + ) + .unwrap(); + let mut record = AssetRecord { + id: shared::AssetId::new(), + path: "assets/Props/desk.glb".into(), + label: "Desk".into(), + kind: shared::AssetKind::Model, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::Model(shared::ImportSettings::default()), + dependencies: Vec::new(), + }; + record.model_import_mut().static_mesh_manifest_path = + Some("assets/meshes/generated/desk.static_mesh.ron".into()); + record.model_import_mut().animation_manifest_path = + Some("assets/animations/generated/desk.animation.ron".into()); + let mut registry = AssetRegistryDocument { + records: vec![record.clone()], + ..Default::default() + }; + fs::write( + root.join(REGISTRY_PATH), + serialize_registry(®istry).unwrap(), + ) + .unwrap(); + + let batch = trash_content( + &root, + &[PathBuf::from("assets/Props/desk.glb")], + &mut registry, + ) + .unwrap(); + + assert!(!root.join("assets/Props/desk.glb").exists()); + assert!(!root + .join("assets/meshes/generated/desk.static_mesh.ron") + .exists()); + assert!(!root + .join("assets/animations/generated/desk.animation.ron") + .exists()); + let manifest: TrashManifest = ron::from_str( + &fs::read_to_string(root.join(&batch.path).join(TRASH_MANIFEST)).unwrap(), + ) + .unwrap(); + assert_eq!(manifest.schema_version, 2); + assert_eq!( + manifest.derived_paths, + vec![ + "assets/animations/generated/desk.animation.ron", + "assets/meshes/generated/desk.static_mesh.ron", + ] + ); + + restore_trash_batch(&root, &batch.path, &mut registry).unwrap(); + assert_eq!( + fs::read(root.join("assets/Props/desk.glb")).unwrap(), + b"model bytes" + ); + assert_eq!( + fs::read(root.join("assets/meshes/generated/desk.static_mesh.ron")).unwrap(), + b"static manifest" + ); + assert_eq!( + fs::read(root.join("assets/animations/generated/desk.animation.ron")).unwrap(), + b"animation manifest" + ); + assert_eq!(registry.records, vec![record]); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn restore_collision_keeps_trash_untouched() { + let root = std::env::temp_dir().join(format!( + "blacksite-trash-{}", + shared::AssetId::new().as_string() + )); + fs::create_dir_all(root.join("assets/Props")).unwrap(); + fs::create_dir_all(root.join("assets/.index")).unwrap(); + fs::write(root.join("assets/Props/box.png"), b"original").unwrap(); + let mut registry = AssetRegistryDocument::default(); + fs::write( + root.join(REGISTRY_PATH), + serialize_registry(®istry).unwrap(), + ) + .unwrap(); + let batch = trash_content( + &root, + &[PathBuf::from("assets/Props/box.png")], + &mut registry, + ) + .unwrap(); + fs::write(root.join("assets/Props/box.png"), b"external").unwrap(); + + assert!(restore_trash_batch(&root, &batch.path, &mut registry).is_err()); + assert_eq!( + fs::read(root.join("assets/Props/box.png")).unwrap(), + b"external" + ); + assert!(root.join(&batch.path).join("assets/Props/box.png").exists()); + fs::remove_dir_all(root).unwrap(); + } +} diff --git a/crates/content_pipeline/src/watcher.rs b/crates/content_pipeline/src/watcher.rs new file mode 100644 index 0000000..fa80649 --- /dev/null +++ b/crates/content_pipeline/src/watcher.rs @@ -0,0 +1,187 @@ +//! Debounced project-content watching shared by editor hosts and automation. + +use notify::{RecommendedWatcher, RecursiveMode, Watcher}; +use std::collections::{BTreeMap, BTreeSet}; +use std::path::{Path, PathBuf}; +use std::sync::mpsc::{self, Receiver}; +use std::time::{Duration, Instant}; + +#[derive(Debug, Default)] +pub struct DebouncedContentChanges { + paths: BTreeSet, + last_change: Option, + suppressed: usize, +} + +impl DebouncedContentChanges { + pub fn begin_transaction(&mut self) { + self.suppressed += 1; + } + + pub fn end_transaction(&mut self) { + self.suppressed = self.suppressed.saturating_sub(1); + } + + pub fn record(&mut self, path: PathBuf, now: Instant) { + if self.suppressed == 0 { + self.paths.insert(path); + self.last_change = Some(now); + } + } + + pub fn take_ready(&mut self, now: Instant, debounce: Duration) -> Vec { + if self.suppressed > 0 + || self + .last_change + .is_none_or(|last_change| now.duration_since(last_change) < debounce) + { + return Vec::new(); + } + self.last_change = None; + std::mem::take(&mut self.paths).into_iter().collect() + } +} + +pub struct ContentWatchService { + _watcher: RecommendedWatcher, + events: Receiver>, + changes: DebouncedContentChanges, + assets_root: PathBuf, + suppressed_paths: BTreeMap, +} + +impl ContentWatchService { + pub fn watch_project(project_root: &Path) -> Result { + let (sender, events) = mpsc::channel(); + let mut watcher = notify::recommended_watcher(move |event| { + let _ = sender.send(event); + }) + .map_err(|error| format!("could not create content watcher: {error}"))?; + let assets = project_root.join(crate::ASSETS_DIRECTORY); + watcher + .watch(&assets, RecursiveMode::Recursive) + .map_err(|error| format!("could not watch {}: {error}", assets.display()))?; + Ok(Self { + _watcher: watcher, + events, + changes: DebouncedContentChanges::default(), + assets_root: assets, + suppressed_paths: BTreeMap::new(), + }) + } + + pub fn begin_transaction(&mut self) { + self.changes.begin_transaction(); + } + + pub fn end_transaction(&mut self) { + while self.events.try_recv().is_ok() {} + self.changes.end_transaction(); + } + + /// Ignores watcher noise for one host-authored file while direct runtime consumers observe + /// its new revision. This prevents an inline Material slider edit from starting a full project + /// processing pass without hiding unrelated external changes. + pub fn suppress_path(&mut self, path: &Path, duration: Duration) { + let path = if path.is_absolute() { + path.to_path_buf() + } else { + self.assets_root + .parent() + .unwrap_or(&self.assets_root) + .join(path) + }; + self.suppressed_paths + .insert(path, Instant::now() + duration); + } + + /// Drains host events and returns one deterministic path set after the debounce window. + pub fn poll(&mut self, debounce: Duration) -> Result, String> { + let now = Instant::now(); + self.suppressed_paths.retain(|_, deadline| *deadline >= now); + while let Ok(event) = self.events.try_recv() { + let event = event.map_err(|error| format!("content watch failed: {error}"))?; + for path in event.paths { + if self + .suppressed_paths + .get(&path) + .is_some_and(|deadline| *deadline >= now) + { + continue; + } + if self.is_user_content_path(&path) { + self.changes.record(path, now); + } + } + } + Ok(self.changes.take_ready(now, debounce)) + } + + fn is_user_content_path(&self, path: &Path) -> bool { + is_user_content_path(&self.assets_root, path) + } +} + +fn is_user_content_path(assets_root: &Path, path: &Path) -> bool { + let Ok(relative) = path.strip_prefix(assets_root) else { + return false; + }; + !crate::is_managed_path(relative) + && relative != Path::new("content.catalog.ron") + && relative + .extension() + .and_then(|extension| extension.to_str()) + != Some("tmp") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn debounce_deduplicates_and_transaction_suppression_discards_noise() { + let start = Instant::now(); + let mut changes = DebouncedContentChanges::default(); + changes.record(PathBuf::from("assets/a.png"), start); + changes.record(PathBuf::from("assets/a.png"), start); + assert!(changes + .take_ready(start, Duration::from_millis(50)) + .is_empty()); + assert_eq!( + changes.take_ready(start + Duration::from_millis(51), Duration::from_millis(50)), + vec![PathBuf::from("assets/a.png")] + ); + + changes.begin_transaction(); + changes.record(PathBuf::from("assets/internal.ron"), start); + changes.end_transaction(); + assert!(changes + .take_ready(start + Duration::from_secs(1), Duration::ZERO) + .is_empty()); + } + + #[test] + fn watcher_ignores_managed_and_generated_publication_noise() { + let root = Path::new("/project/assets"); + assert!(is_user_content_path( + root, + Path::new("/project/assets/Props/a.png") + )); + assert!(!is_user_content_path( + root, + Path::new("/project/assets/.index/registry.ron") + )); + assert!(!is_user_content_path( + root, + Path::new("/project/assets/content.catalog.ron") + )); + assert!(!is_user_content_path( + root, + Path::new("/project/assets/meshes/generated/model.static_mesh.ron") + )); + assert!(!is_user_content_path( + root, + Path::new("/project/assets/Props/a.tmp") + )); + } +} diff --git a/crates/editor/AGENTS.md b/crates/editor/AGENTS.md new file mode 100644 index 0000000..22c4d95 --- /dev/null +++ b/crates/editor/AGENTS.md @@ -0,0 +1,21 @@ +# Editor subtree rules + +- Define an explicit interaction-state matrix before implementing new editor UI behavior. +- Keep egui rendering thin. Move selection models, transaction planning, path rewriting, material + resolution, import review, and reusable logic into lightweight modules or crates. +- Test an invariant in its lightest owning crate; do not put it in `editor` merely because the UI + calls it. +- A small UI change does not justify full-workspace testing. +- Use `cargo check -p editor --lib` through the development lane in the fast loop unless a binary + target is directly affected. +- Use focused editor tests only for editor-owned behavior. +- Use named native scenarios for interaction and visual acceptance. +- Do not use all-features or hot-reload/dynamic-linking combinations for ordinary editor QA unless + that feature is under test. +- Screenshots alone do not establish UX completion; exercise the interaction. +- Reuse established editor components and visual language instead of creating bespoke panel + controls. +- Treat sustainable extension seams and debt-at-the-point-of-change as a feature requirement. + Inspector and Content Browser shells dispatch; they do not own domain behavior. Do not grow a + frozen-baseline module, and run `scripts/codex/architecture_audit.py check` after structural UI + changes. diff --git a/crates/editor/Cargo.toml b/crates/editor/Cargo.toml index be885a7..7361fa1 100644 --- a/crates/editor/Cargo.toml +++ b/crates/editor/Cargo.toml @@ -26,11 +26,13 @@ hot-reload = ["game/hot-reload", "dep:hot-lib-reloader", "dep:notify"] avian3d.workspace = true bevy = { workspace = true, default-features = true, features = ["bevy_remote"] } bevy_solari.workspace = true +blacksite_surface.workspace = true bevy_egui.workspace = true bevy-inspector-egui.workspace = true egui_dock.workspace = true egui_phosphor_icons.workspace = true bevy_ufbx.workspace = true +content_pipeline.workspace = true ufbx = "0.9" game.workspace = true polyanya.workspace = true diff --git a/crates/editor/assets/fonts/source-sans/LICENSE.md b/crates/editor/assets/fonts/source-sans/LICENSE.md new file mode 100644 index 0000000..69fa3e4 --- /dev/null +++ b/crates/editor/assets/fonts/source-sans/LICENSE.md @@ -0,0 +1,93 @@ +Copyright 2010-2024 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/crates/editor/assets/fonts/source-sans/SourceSansPro-Bold.ttf b/crates/editor/assets/fonts/source-sans/SourceSansPro-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4d80fce21b2ada8b93dff62d02ae1356c943267f GIT binary patch literal 253344 zcmce<2YeO9`u{((yX=OL-s_%|UVxAu2%)4vLP$tRD53Y>d#DM$w@{_`-aB?t0Toe1 z0a57!f&wA}g5>-^&&~;=->diD-}m+X<9(mco;kZSv-3PN^UUlyxr{T$99b!o*}$~a z!Uo;+c5gAMx*t*-W)wEcgmNZ-w-joVnbDx(lYr-C_`EA)@~q7Kyh5J&`~{PuA28l} zTxMbOw89h}eaLKelizGIhuod&Kx%^xvl-osepu^xR#c8^}L zw?1RtZ!kWjXU}e(x_XRYTXF91AdwPmOYDc?`gpt#?%8i>@%uH;euMWH7}GEG9nhuI zeoNucjI|t!o9N%KQ}ICUG<$;2i*UZVf2V%kTpzS}!T7}-R6layfFVO$MSkYM_%+lg zdp+)qF{#RA+ot>abZ|`hm2vqtQrLxdYbF`m-nmM7Quzlq{p6pi6_`Y+_=oG{3+4Bb z=Tdy0WYf>cNqlC!YKJHVuk)B4>%z3Ze6AobS&Ee2WR*~X84}gDu~6Qg#qtQMmL|)J zEJ;d7CgF~7h4o)*Mp_;-Gqc4a-Lt4v6Ygwgd^LT{A4m%!X5_w)<+GE>r;g>B)Q;s! z4Ox^l8X64jz&N~L$8vdf@Pau>-I1n(XW%uk1D`juYBy*#76iQUStF^MabLP7RPm181f3{&6$_v!2+e)NOxmN+{5xI%1`AwOO;!(R4D~i zHO^0^Yxo>|_6Bq3CCpi>$x@^$%ucpJ9umr`%B$SAl( z_z>tA+v&Y-c?xypg_a*_9IU_?4{1#N8{`6(X^fXNX8uQ@{r~1XIq^TpgT`|jljkrG ztI~12!19YRR?~R>FOZ6H9mes04cf6{jHhw_{}7r#UWMk7e}d+izamA8xsB{%%wdr% z3BHsp)kR+9-$h9O7QX$HrTkBRTo-=r1pAhX`A|BKb564;oEspa{ds50!n@{9Vg4{x0nPF;jpu|CIT$r^Xl?EzO55HiF%l)AvAsWL|t0?rj$4DxrQ* z2An~SSJLPlBFL)o#vD^IX8d1CV$ch~(fM*ZbFF;1ZED*Cw_?u+6bH}nxV%&Cnm z_Yo&hT7+Rw*zsjtRvBY*DcY7|1{%L<4#ymc`B==qh_znMt+iPKeI_lzXEeWspzUdX zqB-Fyi#Fo12P|GX!Kz99F>WunJd(ZOFB<^nez~&ck@POW`En5IP>Ax1SbfPIv1Bmn zM*jH)i;!YjBJz$#9a5!0lo`(Kr2-sRf!}-ue~7?!qnQirT?cI$%zwl@*&q;Iy|HmHaLPgtHvCy>6}a>uyu-Z-xp&hH5A0L_4A80~R~+C;vE_cx)J zpx;7EEw>5&x#bC9dJoGTYG3&R-rs

RgnkmB0t0X-|+qc^ggs7>PB?2Jd+P1 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 B!CwFX literal 0 HcmV?d00001 diff --git a/crates/editor/assets/fonts/source-sans/SourceSansPro-Regular.ttf b/crates/editor/assets/fonts/source-sans/SourceSansPro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a8eae164ea11967a4c12fabab6ef9169a797f1bc GIT binary patch literal 254076 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

$mi!mFVL0u}A-QzTH) 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 literal 0 HcmV?d00001 diff --git a/crates/editor/src/assets/animation.rs b/crates/editor/src/assets/animation.rs index acf10a7..1dbdab3 100644 --- a/crates/editor/src/assets/animation.rs +++ b/crates/editor/src/assets/animation.rs @@ -1,904 +1,3 @@ -//! Generated animation artifacts for imported model sources. +//! Compatibility re-exports for UI-independent animation artifact processing. -use std::collections::BTreeSet; -use std::fs; -use std::path::Path; - -use serde::Deserialize; -use shared::{ - animation_clip_sub_asset_id, animation_skeleton_sub_asset_id, AnimationClipRecord, - AnimationDiagnosticSeverity, AnimationEventDesc, AnimationImportDiagnostic, AnimationManifest, - AnimationManifestSource, AnimationSkeletonRecord, AnimationSkeletonSignature, - AnimationSourceFingerprint, ANIMATION_ARTIFACT_DIR, ANIMATION_MANIFEST_SCHEMA_VERSION, -}; - -use crate::asset_db::AssetRecord; -use crate::assets::fingerprint::write_pretty_ron_if_changed; - -pub fn animation_manifest_path(asset_id: &str) -> String { - format!("{ANIMATION_ARTIFACT_DIR}/{asset_id}.animation.ron") -} - -pub fn refresh_animation_artifact(record: &mut AssetRecord) -> Result { - let mut manifest = build_animation_manifest(record)?; - manifest.source.dependencies.sort(); - manifest.source.dependencies.dedup(); - - let path = animation_manifest_path(&record.id.as_string()); - record.import_settings.animation_manifest_path = Some(path.clone()); - record - .dependencies - .extend(manifest.source.dependencies.iter().cloned()); - record.dependencies.sort(); - record.dependencies.dedup(); - - if write_pretty_ron_if_changed(&path, &manifest) - .map_err(|error| format!("could not publish animation manifest {path}: {error}"))? - { - bevy::log::info!( - "Animation manifest refreshed: source={} artifact={} skeletons={} clips={} runtime_supported={}", - record.path, - path, - manifest.skeletons.len(), - manifest.clips.len(), - manifest.runtime_supported - ); - } - - Ok(manifest) -} - -pub fn load_animation_manifest(path: &str) -> Result { - let text = - fs::read_to_string(path).map_err(|error| format!("could not read {path}: {error}"))?; - ron::from_str(&text).map_err(|error| format!("could not parse {path}: {error}")) -} - -pub fn build_animation_manifest(record: &AssetRecord) -> Result { - let bytes = fs::read(&record.path) - .map_err(|error| format!("could not read {}: {error}", record.path))?; - let fingerprint = source_fingerprint(&bytes); - let format = source_format(&record.path)?; - match format.as_str() { - "gltf" | "glb" => build_gltf_manifest(record, format, fingerprint, &bytes), - "fbx" => build_fbx_manifest(record, format, fingerprint, &bytes), - _ => Err(format!("unsupported animation source format `{format}`")), - } -} - -#[derive(Debug, Clone)] -struct SkeletonCandidate { - compatible_nodes: BTreeSet, - signature: AnimationSkeletonSignature, -} - -fn build_gltf_manifest( - record: &AssetRecord, - format: String, - fingerprint: AnimationSourceFingerprint, - bytes: &[u8], -) -> Result { - let gltf = gltf::Gltf::from_slice(bytes) - .map_err(|error| format!("could not parse glTF {}: {error}", record.path))?; - let base = Path::new(&record.path).parent(); - let buffers = gltf::import_buffers(&gltf.document, base, gltf.blob.clone()) - .map_err(|error| format!("could not load glTF buffers for {}: {error}", record.path))?; - - let mut dependencies = gltf - .document - .buffers() - .filter_map(|buffer| match buffer.source() { - gltf::buffer::Source::Uri(uri) if !uri.starts_with("data:") => { - Some(resolve_dependency(&record.path, uri)) - } - _ => None, - }) - .collect::>(); - dependencies.sort(); - dependencies.dedup(); - - let node_identity_names = gltf - .document - .nodes() - .map(|node| bevy_node_segment(node.name(), node.index())) - .collect::>(); - let readable_node_names = gltf - .document - .nodes() - .map(|node| normalized_node_segment(node.name(), node.index())) - .collect::>(); - let mut parents = vec![None; node_identity_names.len()]; - for node in gltf.document.nodes() { - for child in node.children() { - parents[child.index()] = Some(node.index()); - } - } - - let mut skeletons = Vec::new(); - let mut candidates = Vec::new(); - for skin in gltf.document.skins() { - let source_index = skin.index(); - let label = skin - .name() - .filter(|name| !name.trim().is_empty()) - .map(str::to_string) - .unwrap_or_else(|| format!("Skeleton {source_index}")); - let joint_indices = skin.joints().map(|joint| joint.index()).collect::>(); - let joint_identity_paths = joint_indices - .iter() - .map(|index| node_path_segments(*index, &node_identity_names, &parents)) - .collect::>(); - let joint_paths = joint_indices - .iter() - .map(|index| node_path(*index, &readable_node_names, &parents)) - .collect::>(); - let bind_poses = skin - .reader(|buffer| Some(buffers[buffer.index()].0.as_slice())) - .read_inverse_bind_matrices() - .map(|matrices| matrices.map(gltf_matrix_bytes).collect::>()) - .unwrap_or_else(|| vec![identity_matrix_bytes(); joint_paths.len()]); - let signature = skeleton_signature(&joint_identity_paths, &bind_poses); - let mut compatible_nodes = joint_indices.into_iter().collect::>(); - if let Some(root) = skin.skeleton() { - compatible_nodes.insert(root.index()); - } - candidates.push(SkeletonCandidate { - compatible_nodes, - signature: signature.clone(), - }); - skeletons.push(AnimationSkeletonRecord { - id: animation_skeleton_sub_asset_id(source_index, &label), - label, - source_index, - signature, - joint_paths, - }); - } - - let mut diagnostics = Vec::new(); - let mut clips = Vec::new(); - let mut animation_roots = BTreeSet::new(); - for animation in gltf.document.animations() { - let source_index = animation.index(); - let label = animation - .name() - .filter(|name| !name.trim().is_empty()) - .map(str::to_string) - .unwrap_or_else(|| format!("Animation {source_index}")); - let mut duration_seconds = 0.0_f32; - let mut target_nodes = BTreeSet::new(); - for channel in animation.channels() { - let target_index = channel.target().node().index(); - target_nodes.insert(target_index); - animation_roots.insert(top_level_node(target_index, &parents)); - if let Some(inputs) = channel - .reader(|buffer| Some(buffers[buffer.index()].0.as_slice())) - .read_inputs() - { - for input in inputs { - if input.is_finite() { - duration_seconds = duration_seconds.max(input); - } - } - } - } - let target_skeleton_signature = matching_skeleton_signature(&target_nodes, &candidates); - if !candidates.is_empty() && target_skeleton_signature.is_none() { - diagnostics.push(AnimationImportDiagnostic { - severity: AnimationDiagnosticSeverity::Warning, - code: "animation.clip_skeleton_unresolved".into(), - message: format!( - "clip `{label}` does not target a uniquely identifiable imported skeleton" - ), - repair: "Export the clip with channels targeting one skeleton, or split unrelated rigs into separate glTF assets.".into(), - }); - } - let events = gltf_animation_events(&animation, duration_seconds, &label, &mut diagnostics); - clips.push(AnimationClipRecord { - id: animation_clip_sub_asset_id(source_index, &label), - label, - source_index, - duration_seconds, - target_skeleton_signature, - events, - }); - } - - let default_animation_clip_id = record.import_settings.default_animation_clip_id.clone(); - validate_default_animation_clip( - default_animation_clip_id.as_deref(), - &clips, - &mut diagnostics, - ); - - let runtime_supported = animation_roots.len() <= 1; - if !runtime_supported { - let roots = animation_roots - .iter() - .map(|index| format!("`{}` (node {index})", node_identity_names[*index])) - .collect::>() - .join(", "); - diagnostics.push(AnimationImportDiagnostic { - severity: AnimationDiagnosticSeverity::Error, - code: "animation.multiple_roots_unsupported".into(), - message: format!( - "animation channels target {} distinct top-level roots ({roots}); Bevy requires a separate AnimationPlayer for each root", - animation_roots.len() - ), - repair: "Split the source into one animated rig per glTF asset, or export every clip under one common top-level root, then reimport.".into(), - }); - } - - Ok(AnimationManifest { - schema_version: ANIMATION_MANIFEST_SCHEMA_VERSION, - asset_id: record.id.as_string(), - label: record.label.clone(), - default_animation_clip_id, - source: AnimationManifestSource { - path: record.path.clone(), - format, - fingerprint, - dependencies, - }, - runtime_supported, - skeletons, - clips, - diagnostics, - }) -} - -fn build_fbx_manifest( - record: &AssetRecord, - format: String, - fingerprint: AnimationSourceFingerprint, - bytes: &[u8], -) -> Result { - let scene = ufbx::load_memory( - bytes, - ufbx::LoadOpts { - target_unit_meters: 1.0, - target_axes: ufbx::CoordinateAxes::right_handed_y_up(), - ..Default::default() - }, - ) - .map_err(|error| format!("could not parse FBX {}: {error:?}", record.path))?; - - let mut skeletons = Vec::new(); - for (source_index, skin) in scene.skin_deformers.as_ref().iter().enumerate() { - let label = if skin.element.name.is_empty() { - format!("Skeleton {source_index}") - } else { - skin.element.name.to_string() - }; - let mut joint_identity_paths = Vec::new(); - let mut joint_paths = Vec::new(); - let mut bind_poses = Vec::new(); - for cluster in skin.clusters.as_ref() { - let Some(bone) = cluster.bone_node.as_ref() else { - continue; - }; - let segments = fbx_node_path_segments(bone.as_ref()); - joint_paths.push(segments.join("/")); - joint_identity_paths.push(segments); - bind_poses.push(fbx_matrix_bytes(&cluster.bind_to_world)); - } - let signature = skeleton_signature(&joint_identity_paths, &bind_poses); - skeletons.push(AnimationSkeletonRecord { - id: animation_skeleton_sub_asset_id(source_index, &label), - label, - source_index, - signature, - joint_paths, - }); - } - - let fallback_signature = (skeletons.len() == 1).then(|| skeletons[0].signature.clone()); - let clips = scene - .anim_stacks - .as_ref() - .iter() - .enumerate() - .map(|(source_index, stack)| { - let label = if stack.element.name.is_empty() { - format!("Animation {source_index}") - } else { - stack.element.name.to_string() - }; - AnimationClipRecord { - id: animation_clip_sub_asset_id(source_index, &label), - label, - source_index, - duration_seconds: (stack.time_end - stack.time_begin).max(0.0) as f32, - target_skeleton_signature: fallback_signature.clone(), - events: Vec::new(), - } - }) - .collect::>(); - - let (runtime_supported, mut diagnostics) = fbx_runtime_support( - scene.anim_stacks.as_ref().len(), - scene.skin_deformers.as_ref().len(), - ); - let default_animation_clip_id = record.import_settings.default_animation_clip_id.clone(); - validate_default_animation_clip( - default_animation_clip_id.as_deref(), - &clips, - &mut diagnostics, - ); - - Ok(AnimationManifest { - schema_version: ANIMATION_MANIFEST_SCHEMA_VERSION, - asset_id: record.id.as_string(), - label: record.label.clone(), - default_animation_clip_id, - source: AnimationManifestSource { - path: record.path.clone(), - format, - fingerprint, - dependencies: Vec::new(), - }, - runtime_supported, - skeletons, - clips, - diagnostics, - }) -} - -fn validate_default_animation_clip( - default_clip_id: Option<&str>, - clips: &[AnimationClipRecord], - diagnostics: &mut Vec, -) { - let Some(default_clip_id) = default_clip_id.filter(|id| !id.trim().is_empty()) else { - return; - }; - if clips.iter().any(|clip| clip.id == default_clip_id) { - return; - } - diagnostics.push(AnimationImportDiagnostic { - severity: AnimationDiagnosticSeverity::Error, - code: "animation.default_clip_missing".into(), - message: format!( - "configured default animation clip `{default_clip_id}` no longer exists in the imported source" - ), - repair: "Choose an existing Default animation in Model Import Settings, or select Imported rest pose, then reimport.".into(), - }); -} - -fn fbx_runtime_support( - animation_count: usize, - skin_count: usize, -) -> (bool, Vec) { - let mut diagnostics = Vec::new(); - if animation_count > 0 || skin_count > 0 { - diagnostics.push(AnimationImportDiagnostic { - severity: AnimationDiagnosticSeverity::Error, - code: "animation.fbx_runtime_unsupported".into(), - message: format!( - "FBX contains {animation_count} animation stack(s) and {skin_count} skin deformer(s), but Blacksite's current FBX loader cannot build a runtime skeleton or clips" - ), - repair: "Export the animated source as glTF 2.0 (.glb or .gltf). Keep FBX only for static mesh import until hierarchy, SkinnedMesh, and AnimationClip conversion are implemented.".into(), - }); - } - (false, diagnostics) -} - -#[derive(Debug, Default, Deserialize)] -struct GltfAnimationExtras { - #[serde(default)] - blacksite_events: Vec, -} - -#[derive(Debug, Deserialize)] -struct GltfAnimationEvent { - id: String, - time_seconds: f32, - #[serde(default)] - payload: Option, -} - -fn gltf_animation_events( - animation: &gltf::Animation<'_>, - duration_seconds: f32, - clip_label: &str, - diagnostics: &mut Vec, -) -> Vec { - let Some(raw) = animation.extras().as_ref() else { - return Vec::new(); - }; - let extras = match serde_json::from_str::(raw.get()) { - Ok(extras) => extras, - Err(error) => { - diagnostics.push(AnimationImportDiagnostic { - severity: AnimationDiagnosticSeverity::Warning, - code: "animation.events_invalid".into(), - message: format!("clip `{clip_label}` has invalid animation event metadata: {error}"), - repair: "Use an animation extras object with `blacksite_events` entries containing `id`, `time_seconds`, and optional string `payload`.".into(), - }); - return Vec::new(); - } - }; - - let mut events = Vec::new(); - for event in extras.blacksite_events { - let valid_time = event.time_seconds.is_finite() - && event.time_seconds >= 0.0 - && event.time_seconds <= duration_seconds; - if event.id.trim().is_empty() || !valid_time { - diagnostics.push(AnimationImportDiagnostic { - severity: AnimationDiagnosticSeverity::Warning, - code: "animation.event_out_of_range".into(), - message: format!( - "clip `{clip_label}` contains an event with an empty ID or time outside 0..={duration_seconds:.3}s" - ), - repair: "Give every event a stable non-empty ID and place it within the imported clip duration.".into(), - }); - continue; - } - events.push(AnimationEventDesc { - id: event.id, - time_seconds: event.time_seconds, - payload: event.payload, - }); - } - events.sort_by(|left, right| { - left.time_seconds - .total_cmp(&right.time_seconds) - .then(left.id.cmp(&right.id)) - .then(left.payload.cmp(&right.payload)) - }); - events -} - -fn matching_skeleton_signature( - target_nodes: &BTreeSet, - candidates: &[SkeletonCandidate], -) -> Option { - let scored = candidates - .iter() - .map(|candidate| { - ( - candidate - .compatible_nodes - .intersection(target_nodes) - .count(), - candidate, - ) - }) - .filter(|(score, _)| *score > 0) - .collect::>(); - let best_score = scored.iter().map(|(score, _)| *score).max()?; - let mut best = scored - .into_iter() - .filter(|(score, _)| *score == best_score) - .map(|(_, candidate)| candidate); - let candidate = best.next()?; - best.all(|other| other.signature == candidate.signature) - .then(|| candidate.signature.clone()) -} - -fn node_path(index: usize, names: &[String], parents: &[Option]) -> String { - node_path_segments(index, names, parents).join("/") -} - -fn node_path_segments(index: usize, names: &[String], parents: &[Option]) -> Vec { - let mut segments = Vec::new(); - let mut current = Some(index); - while let Some(node_index) = current { - segments.push(names[node_index].clone()); - current = parents[node_index]; - } - segments.reverse(); - segments -} - -fn top_level_node(index: usize, parents: &[Option]) -> usize { - let mut current = index; - while let Some(parent) = parents[current] { - current = parent; - } - current -} - -fn bevy_node_segment(name: Option<&str>, index: usize) -> String { - name.map(str::to_string) - .unwrap_or_else(|| format!("GltfNode{index}")) -} - -fn normalized_node_segment(name: Option<&str>, index: usize) -> String { - name.map(str::trim) - .filter(|name| !name.is_empty()) - .map(|name| name.replace(['/', '\\'], "_")) - .unwrap_or_else(|| format!("Node{index}")) -} - -fn fbx_node_path_segments(node: &ufbx::Node) -> Vec { - let mut segments = Vec::new(); - let mut current = Some(node); - while let Some(node) = current { - segments.push(normalized_node_segment( - (!node.element.name.is_empty()).then(|| node.element.name.as_ref()), - node.element.element_id as usize, - )); - current = node.parent.as_ref().map(|parent| parent.as_ref()); - } - segments.reverse(); - segments -} - -fn skeleton_signature( - joint_path_segments: &[Vec], - bind_pose_bytes: &[Vec], -) -> AnimationSkeletonSignature { - let mut hasher = blake3::Hasher::new(); - hasher.update(b"blacksite-animation-skeleton-v2\0"); - hasher.update(&(joint_path_segments.len() as u64).to_le_bytes()); - for path in joint_path_segments { - hasher.update(&(path.len() as u64).to_le_bytes()); - for segment in path { - let bytes = segment.as_bytes(); - hasher.update(&(bytes.len() as u64).to_le_bytes()); - hasher.update(bytes); - } - } - hasher.update(&(bind_pose_bytes.len() as u64).to_le_bytes()); - for bytes in bind_pose_bytes { - hasher.update(&(bytes.len() as u64).to_le_bytes()); - hasher.update(bytes); - } - AnimationSkeletonSignature::new(hasher.finalize().to_hex().to_string()) -} - -fn gltf_matrix_bytes(matrix: [[f32; 4]; 4]) -> Vec { - matrix - .into_iter() - .flatten() - .flat_map(f32::to_le_bytes) - .collect() -} - -fn identity_matrix_bytes() -> Vec { - gltf_matrix_bytes([ - [1.0, 0.0, 0.0, 0.0], - [0.0, 1.0, 0.0, 0.0], - [0.0, 0.0, 1.0, 0.0], - [0.0, 0.0, 0.0, 1.0], - ]) -} - -fn fbx_matrix_bytes(matrix: &ufbx::Matrix) -> Vec { - [ - matrix.m00, matrix.m10, matrix.m20, matrix.m01, matrix.m11, matrix.m21, matrix.m02, - matrix.m12, matrix.m22, matrix.m03, matrix.m13, matrix.m23, - ] - .into_iter() - .flat_map(f64::to_le_bytes) - .collect() -} - -fn source_fingerprint(bytes: &[u8]) -> AnimationSourceFingerprint { - AnimationSourceFingerprint::from_bytes(bytes) -} - -fn source_format(path: &str) -> Result { - Path::new(path) - .extension() - .and_then(|extension| extension.to_str()) - .map(|extension| extension.to_ascii_lowercase()) - .ok_or_else(|| format!("asset path `{path}` has no extension")) -} - -fn resolve_dependency(source_path: &str, uri: &str) -> String { - Path::new(source_path) - .parent() - .unwrap_or_else(|| Path::new("")) - .join(uri) - .to_string_lossy() - .replace('\\', "/") -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::asset_db::{AssetId, ImportSettings}; - use uuid::Uuid; - - fn fixture_record(path: &Path) -> AssetRecord { - AssetRecord { - id: AssetId(Uuid::nil()), - path: path.to_string_lossy().replace('\\', "/"), - label: "Animated Hero".into(), - kind_tag: "Model".into(), - source_fingerprint: None, - import_settings: ImportSettings::default(), - dependencies: Vec::new(), - } - } - - fn write_animated_gltf(root: &Path) -> std::path::PathBuf { - fs::create_dir_all(root).unwrap(); - let mut buffer = Vec::new(); - for value in [0.0_f32, 1.25] { - buffer.extend_from_slice(&value.to_le_bytes()); - } - for value in [0.0_f32, 0.0, 0.0, 1.0, 0.0, 0.38268343, 0.0, 0.9238795] { - buffer.extend_from_slice(&value.to_le_bytes()); - } - fs::write(root.join("animated.bin"), buffer).unwrap(); - let gltf = r#"{ - "asset":{"version":"2.0"}, - "scene":0, - "scenes":[{"nodes":[0]}], - "nodes":[{"name":"Armature","children":[1]},{"name":"Hip"}], - "skins":[{"name":"Hero Rig","skeleton":0,"joints":[1]}], - "buffers":[{"uri":"animated.bin","byteLength":40}], - "bufferViews":[ - {"buffer":0,"byteOffset":0,"byteLength":8}, - {"buffer":0,"byteOffset":8,"byteLength":32} - ], - "accessors":[ - {"bufferView":0,"componentType":5126,"count":2,"type":"SCALAR","min":[0.0],"max":[1.25]}, - {"bufferView":1,"componentType":5126,"count":2,"type":"VEC4"} - ], - "animations":[{ - "name":"Idle Loop", - "samplers":[{"input":0,"output":1,"interpolation":"LINEAR"}], - "channels":[{"sampler":0,"target":{"node":1,"path":"rotation"}}], - "extras":{"blacksite_events":[{"id":"footstep.left","time_seconds":0.5,"payload":"stone"}]} - }] - }"#; - let path = root.join("animated.gltf"); - fs::write(&path, gltf).unwrap(); - path - } - - fn write_multi_root_animated_gltf(root: &Path) -> std::path::PathBuf { - fs::create_dir_all(root).unwrap(); - let mut buffer = Vec::new(); - for value in [0.0_f32, 1.0] { - buffer.extend_from_slice(&value.to_le_bytes()); - } - for value in [0.0_f32, 0.0, 0.0, 1.0, 0.0, 0.38268343, 0.0, 0.9238795] { - buffer.extend_from_slice(&value.to_le_bytes()); - } - fs::write(root.join("multi-root.bin"), buffer).unwrap(); - let gltf = r#"{ - "asset":{"version":"2.0"}, - "scene":0, - "scenes":[{"nodes":[0,2]}], - "nodes":[ - {"name":"Character A","children":[1]}, - {"name":"Joint A"}, - {"name":"Character B","children":[3]}, - {"name":"Joint B"} - ], - "buffers":[{"uri":"multi-root.bin","byteLength":40}], - "bufferViews":[ - {"buffer":0,"byteOffset":0,"byteLength":8}, - {"buffer":0,"byteOffset":8,"byteLength":32} - ], - "accessors":[ - {"bufferView":0,"componentType":5126,"count":2,"type":"SCALAR","min":[0.0],"max":[1.0]}, - {"bufferView":1,"componentType":5126,"count":2,"type":"VEC4"} - ], - "animations":[{ - "name":"Two Players Required", - "samplers":[ - {"input":0,"output":1,"interpolation":"LINEAR"}, - {"input":0,"output":1,"interpolation":"LINEAR"} - ], - "channels":[ - {"sampler":0,"target":{"node":1,"path":"rotation"}}, - {"sampler":1,"target":{"node":3,"path":"rotation"}} - ] - }] - }"#; - let path = root.join("multi-root.gltf"); - fs::write(&path, gltf).unwrap(); - path - } - - #[test] - fn animation_manifest_path_uses_registry_uuid() { - assert_eq!( - animation_manifest_path("abc"), - "assets/animations/generated/abc.animation.ron" - ); - } - - #[test] - fn gltf_extraction_is_deterministic_and_preserves_duration_events_and_signature() { - let root = std::env::temp_dir().join(format!("blacksite-animation-{}", Uuid::new_v4())); - let path = write_animated_gltf(&root); - let record = fixture_record(&path); - - let first = build_animation_manifest(&record).unwrap(); - let second = build_animation_manifest(&record).unwrap(); - - assert_eq!(first, second); - assert_eq!(first.schema_version, ANIMATION_MANIFEST_SCHEMA_VERSION); - assert!(first.default_animation_clip_id.is_none()); - assert!(first.runtime_supported); - assert_eq!(first.source.dependencies.len(), 1); - assert_eq!(first.skeletons.len(), 1); - assert_eq!(first.clips.len(), 1); - assert_eq!(first.skeletons[0].id, "animation:skeleton:0:hero_rig"); - assert!(!first.skeletons[0].signature.is_empty()); - assert_eq!(first.clips[0].id, "animation:clip:0:idle_loop"); - assert_eq!(first.clips[0].duration_seconds, 1.25); - assert_eq!( - first.clips[0].target_skeleton_signature, - Some(first.skeletons[0].signature.clone()) - ); - assert_eq!(first.clips[0].events.len(), 1); - assert_eq!(first.clips[0].events[0].id, "footstep.left"); - assert_eq!(first.clips[0].events[0].time_seconds, 0.5); - assert_eq!(first.diagnostics, Vec::new()); - - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn legacy_mtime_metadata_does_not_rewrite_equivalent_animation_manifest() { - let root = - std::env::temp_dir().join(format!("blacksite-animation-legacy-{}", Uuid::new_v4())); - let path = write_animated_gltf(&root); - let manifest = build_animation_manifest(&fixture_record(&path)).unwrap(); - let canonical = - ron::ser::to_string_pretty(&manifest, ron::ser::PrettyConfig::default()).unwrap(); - let marker = format!("byte_len: {},", manifest.source.fingerprint.byte_len); - let legacy = canonical.replacen( - &marker, - &format!("{marker}\n modified_unix_secs: 123456,"), - 1, - ); - assert_ne!(legacy, canonical); - let artifact = root.join("legacy.animation.ron"); - fs::write(&artifact, &legacy).unwrap(); - - assert!(!write_pretty_ron_if_changed(&artifact, &manifest).unwrap()); - assert_eq!(fs::read_to_string(&artifact).unwrap(), legacy); - - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn explicit_default_clip_is_stable_and_stale_ids_are_diagnostic() { - let root = - std::env::temp_dir().join(format!("blacksite-animation-default-{}", Uuid::new_v4())); - let path = write_animated_gltf(&root); - let mut record = fixture_record(&path); - record.import_settings.default_animation_clip_id = - Some("animation:clip:0:idle_loop".into()); - - let manifest = build_animation_manifest(&record).unwrap(); - assert_eq!( - manifest.default_animation_clip_id.as_deref(), - Some("animation:clip:0:idle_loop") - ); - assert!(manifest.diagnostics.is_empty()); - - record.import_settings.default_animation_clip_id = Some("animation:clip:99:removed".into()); - let stale = build_animation_manifest(&record).unwrap(); - assert!(stale.diagnostics.iter().any(|diagnostic| { - diagnostic.code == "animation.default_clip_missing" - && diagnostic.severity == AnimationDiagnosticSeverity::Error - })); - - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn exact_signature_changes_with_joint_path_or_bind_pose() { - let identity = identity_matrix_bytes(); - let first = skeleton_signature( - &[vec!["Armature".into(), "Hip".into()]], - std::slice::from_ref(&identity), - ); - let renamed = skeleton_signature( - &[vec!["Armature".into(), "Pelvis".into()]], - std::slice::from_ref(&identity), - ); - let mut changed_pose = identity; - changed_pose[0] ^= 1; - let rebound = skeleton_signature(&[vec!["Armature".into(), "Hip".into()]], &[changed_pose]); - assert_ne!(first, renamed); - assert_ne!(first, rebound); - } - - #[test] - fn exact_signature_preserves_bevy_node_bytes_and_segment_boundaries() { - let identity = identity_matrix_bytes(); - let slash_in_name = vec![vec!["Armature".into(), "Hip/Joint".into()]]; - let slash_as_boundary = vec![vec!["Armature/Hip".into(), "Joint".into()]]; - - assert_eq!(slash_in_name[0].join("/"), slash_as_boundary[0].join("/")); - assert_ne!( - skeleton_signature(&slash_in_name, std::slice::from_ref(&identity)), - skeleton_signature(&slash_as_boundary, std::slice::from_ref(&identity)) - ); - - let backslash = vec![vec!["Armature".into(), "Hip\\Joint".into()]]; - assert_eq!( - normalized_node_segment(Some("Hip/Joint"), 1), - normalized_node_segment(Some("Hip\\Joint"), 1) - ); - assert_ne!( - skeleton_signature(&slash_in_name, std::slice::from_ref(&identity)), - skeleton_signature(&backslash, std::slice::from_ref(&identity)) - ); - assert_eq!(bevy_node_segment(Some(" /Joint "), 7), " /Joint "); - assert_eq!(bevy_node_segment(None, 7), "GltfNode7"); - } - - #[test] - fn gltf_with_multiple_animation_roots_is_runtime_unsupported() { - let root = - std::env::temp_dir().join(format!("blacksite-animation-multi-root-{}", Uuid::new_v4())); - let path = write_multi_root_animated_gltf(&root); - let manifest = build_animation_manifest(&fixture_record(&path)).unwrap(); - - assert!(!manifest.runtime_supported); - let diagnostic = manifest - .diagnostics - .iter() - .find(|diagnostic| diagnostic.code == "animation.multiple_roots_unsupported") - .expect("multi-root glTF should include an actionable blocking diagnostic"); - assert_eq!(diagnostic.severity, AnimationDiagnosticSeverity::Error); - assert!(diagnostic.message.contains("2 distinct top-level roots")); - assert!(diagnostic.repair.contains("one common top-level root")); - - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn animated_or_skinned_fbx_is_runtime_unsupported_with_repair_guidance() { - let (supported, diagnostics) = fbx_runtime_support(2, 1); - assert!(!supported); - assert_eq!(diagnostics.len(), 1); - assert_eq!(diagnostics[0].severity, AnimationDiagnosticSeverity::Error); - assert_eq!(diagnostics[0].code, "animation.fbx_runtime_unsupported"); - assert!(diagnostics[0].repair.contains("glTF 2.0")); - - let (supported, diagnostics) = fbx_runtime_support(0, 0); - assert!(!supported); - assert!(diagnostics.is_empty()); - } - - #[test] - fn committed_robot_fixture_exposes_a_skin_and_multiple_named_states() { - let path = - Path::new(env!("CARGO_MANIFEST_DIR")).join("../../assets/models/robot_expressive.glb"); - let manifest = build_animation_manifest(&fixture_record(&path)).unwrap(); - - assert!(manifest.runtime_supported); - assert_eq!(manifest.skeletons.len(), 2); - assert_eq!(manifest.skeletons[0].id, "animation:skeleton:0:skeleton_0"); - assert_eq!(manifest.skeletons[1].id, "animation:skeleton:1:skeleton_1"); - assert!(manifest - .skeletons - .iter() - .all(|skeleton| skeleton.joint_paths.len() == 43)); - let signature = &manifest.skeletons[0].signature; - assert!(manifest - .skeletons - .iter() - .all(|skeleton| &skeleton.signature == signature)); - assert_eq!(manifest.clips.len(), 14); - for expected in ["Idle", "Walking", "Running", "Jump", "Wave"] { - assert!( - manifest.clips.iter().any(|clip| clip.label == expected), - "missing expected fixture clip {expected}" - ); - } - assert!(manifest - .clips - .iter() - .all(|clip| clip.duration_seconds.is_finite() && clip.duration_seconds > 0.0)); - assert!(manifest - .clips - .iter() - .all(|clip| { clip.target_skeleton_signature.as_ref() == Some(signature) })); - assert!(manifest.diagnostics.is_empty()); - } -} +pub use content_pipeline::animation::*; diff --git a/crates/editor/src/assets/asset_db.rs b/crates/editor/src/assets/asset_db.rs index 0a34de4..e7dc904 100644 --- a/crates/editor/src/assets/asset_db.rs +++ b/crates/editor/src/assets/asset_db.rs @@ -1,277 +1,63 @@ //! Project asset registry (stable IDs + import metadata). Phase 5 foundation. use bevy::prelude::*; -use serde::{Deserialize, Serialize}; -use shared::AssetSourceFingerprint; -use std::collections::{HashMap, HashSet}; +use shared::{ + parse_asset_registry, AssetRegistryDocument, ProjectContentDefaults, + ASSET_REGISTRY_SCHEMA_VERSION, +}; +pub use shared::{ + AssetId, AssetKind, AssetRecord, ImportSettings, MaterialImportPolicy, ModelHierarchyMode, + ModelMaterialSelection, ModelMaterialSlotSelection, ModelPlacementMode, +}; +use std::path::Path; +#[cfg(test)] use uuid::Uuid; -use crate::assets::fingerprint::{fingerprint_file, write_pretty_ron_if_changed}; +use crate::assets::fingerprint::fingerprint_file; -/// Stable asset identity for dependency tracking and prefab references. -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] -pub struct AssetId(pub Uuid); - -impl AssetId { - pub fn new() -> Self { - Self(Uuid::new_v4()) - } - - pub fn as_string(&self) -> String { - self.0.to_string() - } +#[derive(Resource, Debug)] +pub struct AssetRegistry { + pub schema_version: u32, + pub defaults: ProjectContentDefaults, + pub records: Vec, + pub index_dirty: bool, + pub migration_required: bool, } -impl Default for AssetId { - fn default() -> Self { - Self::new() - } -} - -#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] -pub enum ModelPlacementMode { - /// Place renderable content through the appropriate normalized renderer. Imports containing - /// skins or animation route to `SkinnedMeshRenderer`; unrigged, non-animated content routes to - /// `StaticMeshRenderer`. - #[default] - StaticAsset, - /// Instantiate the complete source scene as a generic imported model. - SceneInstance, -} - -#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] -pub enum ModelHierarchyMode { - #[default] - SingleActor, - SourceHierarchy, -} - -#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] -pub enum MaterialImportPolicy { - #[default] - SourceMaterials, - AuthoringOverride, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct ImportSettings { - pub scale: f32, - pub generate_collider: bool, - pub lod0_only: bool, - #[serde(default)] - pub placement_mode: ModelPlacementMode, - #[serde(default)] - pub hierarchy_mode: ModelHierarchyMode, - #[serde(default)] - pub material_policy: MaterialImportPolicy, - #[serde(default)] - pub static_mesh_manifest_path: Option, - #[serde(default)] - pub animation_manifest_path: Option, - /// Stable animation clip sub-asset ID used as this model's edit-mode rest presentation. - /// `None` preserves the imported node pose and never guesses a clip. - #[serde(default)] - pub default_animation_clip_id: Option, -} - -impl Default for ImportSettings { +impl Default for AssetRegistry { fn default() -> Self { Self { - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: ModelPlacementMode::default(), - hierarchy_mode: ModelHierarchyMode::default(), - material_policy: MaterialImportPolicy::default(), - static_mesh_manifest_path: None, - animation_manifest_path: None, - default_animation_clip_id: None, + schema_version: ASSET_REGISTRY_SCHEMA_VERSION, + defaults: ProjectContentDefaults::default(), + records: Vec::new(), + index_dirty: false, + migration_required: false, } } } -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct AssetRecord { - pub id: AssetId, - pub path: String, - pub label: String, - pub kind_tag: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub source_fingerprint: Option, - #[serde(default)] - pub import_settings: ImportSettings, - #[serde(default)] - pub dependencies: Vec, -} - -#[derive(Resource, Debug, Default)] -pub struct AssetRegistry { - pub records: Vec, - pub index_dirty: bool, +impl AssetRegistry { + pub fn document(&self) -> AssetRegistryDocument { + AssetRegistryDocument { + schema_version: self.schema_version, + defaults: self.defaults.clone(), + records: self.records.clone(), + } + } } pub struct AssetDbPlugin; impl Plugin for AssetDbPlugin { fn build(&self, app: &mut App) { - app.insert_resource(load_registry()) - .add_systems(Update, sync_registry_from_browser); + let registry = load_registry(); + app.insert_resource(registry.defaults.clone()) + .insert_resource(registry); } } -fn sync_registry_from_browser( - assets: Res, - mut registry: ResMut, -) { - if !assets.is_changed() { - return; - } - - let previous_records = std::mem::take(&mut registry.records); - let mut existing: HashMap = previous_records - .iter() - .cloned() - .map(|record| (record.path.clone(), record)) - .collect(); - let current_paths = assets - .assets - .iter() - .filter_map(|asset| asset.path.clone()) - .collect::>(); - - let mut next_records = Vec::new(); - let mut seen_paths = HashMap::new(); - - for asset in &assets.assets { - let Some(path) = asset.path.clone() else { - continue; - }; - if path.is_empty() || seen_paths.contains_key(&path) { - continue; - } - seen_paths.insert(path.clone(), ()); - - let kind_tag = format!("{:?}", asset.kind); - let source_fingerprint = if imported_source_kind(&kind_tag) { - match fingerprint_file(&path) { - Ok(fingerprint) => Some(fingerprint), - Err(error) => { - warn!("Imported source fingerprint failed for {path}: {error}"); - None - } - } - } else { - None - }; - let mut record = if let Some(mut prior) = existing.remove(&path).or_else(|| { - source_fingerprint.as_ref().and_then(|fingerprint| { - take_uniquely_moved_import_record( - &mut existing, - ¤t_paths, - &kind_tag, - fingerprint, - ) - }) - }) { - if prior.path != path { - info!( - "Asset registry preserved imported source identity {} across move {} -> {}", - prior.id.as_string(), - prior.path, - path - ); - prior.path = path.clone(); - } - prior.label = asset.label.clone(); - prior.kind_tag = kind_tag.clone(); - prior - } else { - AssetRecord { - id: AssetId::new(), - path: path.clone(), - label: asset.label.clone(), - kind_tag: kind_tag.clone(), - source_fingerprint: None, - import_settings: ImportSettings::default(), - dependencies: Vec::new(), - } - }; - if imported_source_kind(&kind_tag) { - if let Some(source_fingerprint) = source_fingerprint { - record.source_fingerprint = Some(source_fingerprint); - } - } else { - record.source_fingerprint = None; - } - if record.kind_tag == "Model" { - if let Err(error) = super::refresh_model_artifacts(&mut record) { - warn!( - "Model artifact refresh failed for {} (asset id {}): {error}", - record.path, - record.id.as_string() - ); - } - } - next_records.push(record); - } - - sort_registry_records(&mut next_records); - let changed = previous_records != next_records; - registry.records = next_records; - if changed { - registry.index_dirty = true; - } - - if registry.index_dirty { - if let Err(error) = save_registry(®istry) { - warn!("Asset registry save failed: {error}"); - } else { - registry.index_dirty = false; - } - } -} - -fn imported_source_kind(kind_tag: &str) -> bool { - matches!(kind_tag, "Model" | "Texture" | "AudioClip") -} - -fn sort_registry_records(records: &mut [AssetRecord]) { - records.sort_by(|left, right| left.path.cmp(&right.path)); -} - -fn take_uniquely_moved_import_record( - existing: &mut HashMap, - current_paths: &HashSet, - kind_tag: &str, - fingerprint: &AssetSourceFingerprint, -) -> Option { - if !imported_source_kind(kind_tag) { - return None; - } - let candidates = existing - .iter() - .filter_map(|(old_path, record)| { - if current_paths.contains(old_path) || record.kind_tag != kind_tag { - return None; - } - recorded_source_fingerprint(record) - .is_some_and(|prior| prior == *fingerprint) - .then(|| old_path.clone()) - }) - .collect::>(); - if candidates.len() != 1 { - return None; - } - existing.remove(&candidates[0]) -} - -fn recorded_source_fingerprint(record: &AssetRecord) -> Option { - record.source_fingerprint.clone().or_else(|| { - let manifest_path = record.import_settings.animation_manifest_path.as_deref()?; - super::animation::load_animation_manifest(manifest_path) - .ok() - .map(|manifest| manifest.source.fingerprint) - }) +fn imported_source_kind(kind: AssetKind) -> bool { + kind.is_imported_source() } pub fn find_asset_by_path(registry: &AssetRegistry, path: &str) -> Option { @@ -305,27 +91,37 @@ pub fn ensure_asset_record( path: impl Into, label: impl Into, kind_tag: impl Into, +) -> Result { + ensure_asset_record_at(registry, Path::new("."), path, label, kind_tag) +} + +pub fn ensure_asset_record_at( + registry: &mut AssetRegistry, + project_root: &Path, + path: impl Into, + label: impl Into, + kind_tag: impl Into, ) -> Result { let path = path.into(); if let Some(record) = find_asset_by_path(registry, &path) { return Ok(record); } - let kind_tag = kind_tag.into(); - let source_fingerprint = imported_source_kind(&kind_tag) - .then(|| fingerprint_file(&path).ok()) + let kind = AssetKind::from_legacy_tag(&kind_tag.into()); + let source_fingerprint = imported_source_kind(kind) + .then(|| fingerprint_file(project_root.join(&path)).ok()) .flatten(); let record = AssetRecord { - id: AssetId::new(), + id: shared::AssetId::new(), path, label: label.into(), - kind_tag, + kind, source_fingerprint, - import_settings: ImportSettings::default(), + import_settings: shared::AssetImportSettings::for_kind(kind), dependencies: Vec::new(), }; registry.records.push(record.clone()); registry.index_dirty = true; - if let Err(error) = save_registry(registry) { + if let Err(error) = save_registry_at(registry, project_root) { registry.records.pop(); return Err(error); } @@ -345,10 +141,10 @@ pub fn update_import_settings( else { return false; }; - if record.import_settings == settings { + if record.import_settings.model() == Some(&settings) { return false; } - record.import_settings = settings; + record.import_settings = settings.into(); registry.index_dirty = true; true } @@ -358,19 +154,29 @@ pub fn registry_index_path() -> &'static str { } pub fn save_registry(registry: &AssetRegistry) -> Result<(), String> { - write_pretty_ron_if_changed(registry_index_path(), ®istry.records).map(|_| ()) + save_registry_at(registry, Path::new(".")) +} + +pub fn save_registry_at(registry: &AssetRegistry, project_root: &Path) -> Result<(), String> { + content_pipeline::publish_content_documents(project_root, ®istry.document()) } pub fn load_registry() -> AssetRegistry { let path = registry_index_path(); match std::fs::read_to_string(path) { - Ok(text) => { - let records: Vec = ron::from_str(&text).unwrap_or_default(); - AssetRegistry { - records, + Ok(text) => match parse_asset_registry(&text) { + Ok(loaded) => AssetRegistry { + schema_version: loaded.document.schema_version, + defaults: loaded.document.defaults, + records: loaded.document.records, index_dirty: false, + migration_required: loaded.migration_required, + }, + Err(error) => { + warn!("Asset registry load failed: {error}"); + AssetRegistry::default() } - } + }, Err(_) => AssetRegistry::default(), } } @@ -378,188 +184,64 @@ pub fn load_registry() -> AssetRegistry { #[cfg(test)] mod tests { use super::*; - use shared::{ - AnimationManifest, AnimationManifestSource, AnimationSourceFingerprint, - ANIMATION_MANIFEST_SCHEMA_VERSION, - }; #[test] fn imported_source_policy_covers_model_texture_and_audio_only() { - for kind in ["Model", "Texture", "AudioClip"] { - assert!(imported_source_kind(kind), "missing imported kind {kind}"); + for kind in [AssetKind::Model, AssetKind::Texture, AssetKind::AudioClip] { + assert!(imported_source_kind(kind), "missing imported kind {kind:?}"); } - for kind in ["Material", "Level", "Prefab", "PostProcessEffect"] { + for kind in [ + AssetKind::Material, + AssetKind::Level, + AssetKind::Prefab, + AssetKind::PostProcessEffect, + ] { assert!( !imported_source_kind(kind), - "authored kind {kind} was hashed" + "authored kind {kind:?} was hashed" ); } } #[test] - fn registry_publication_order_is_stable_across_discovery_orders() { - let records = [ - ("assets/textures/z.png", "Texture"), - ("assets/audio/a.ogg", "AudioClip"), - ("assets/models/m.glb", "Model"), - ] - .into_iter() - .map(|(path, kind_tag)| AssetRecord { - id: AssetId::new(), - path: path.into(), - label: path.into(), - kind_tag: kind_tag.into(), - source_fingerprint: None, - import_settings: ImportSettings::default(), - dependencies: Vec::new(), - }) - .collect::>(); - let mut forward = records.clone(); - let mut reverse = records.into_iter().rev().collect::>(); - - sort_registry_records(&mut forward); - sort_registry_records(&mut reverse); - - assert_eq!(forward, reverse); + fn shared_classification_preserves_schema_classified_material_instance_kind() { + let root = std::env::temp_dir().join(format!( + "blacksite-browser-material-instance-{}", + uuid::Uuid::new_v4() + )); + std::fs::create_dir_all(&root).unwrap(); + let path = root.join("user_named_variant.ron"); + let instance = shared::MaterialInstanceAsset { + schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, + label: "User Named Variant".into(), + base: shared::MaterialRef::new(shared::EditorAssetRef::new( + "base-id", + "material:source", + "Base", + )), + overrides: shared::MaterialInputSet::default(), + }; + std::fs::write(&path, ron::ser::to_string(&instance).unwrap()).unwrap(); assert_eq!( - forward - .iter() - .map(|record| record.path.as_str()) - .collect::>(), - [ - "assets/audio/a.ogg", - "assets/models/m.glb", - "assets/textures/z.png", - ] + content_pipeline::classify_asset_file(&path), + AssetKind::MaterialInstance ); + std::fs::remove_dir_all(root).unwrap(); } #[test] fn legacy_registry_record_loads_without_forcing_a_new_identity() { - let source = r#"( - id: ("00000000-0000-0000-0000-000000000000"), - path: "assets/textures/legacy.png", - label: "Legacy", - kind_tag: "Texture", - )"#; - let record: AssetRecord = ron::from_str(source).unwrap(); + let source = r#"[(id:("00000000-0000-0000-0000-000000000000"),path:"assets/textures/legacy.png",label:"Legacy",kind_tag:"Texture")]"#; + let loaded = parse_asset_registry(source).unwrap(); + let record = &loaded.document.records[0]; assert_eq!(record.id, AssetId(Uuid::nil())); assert!(record.source_fingerprint.is_none()); - assert_eq!(record.import_settings, ImportSettings::default()); - } - - #[test] - fn content_match_preserves_every_imported_source_kind_across_move() { - let fingerprint = AssetSourceFingerprint::from_bytes(b"stable imported bytes"); - for kind in ["Model", "Texture", "AudioClip"] { - let record = AssetRecord { - id: AssetId::new(), - path: format!("assets/old/{kind}"), - label: kind.into(), - kind_tag: kind.into(), - source_fingerprint: Some(fingerprint.clone()), - import_settings: ImportSettings::default(), - dependencies: Vec::new(), - }; - let expected_id = record.id.clone(); - let mut existing = HashMap::from([(record.path.clone(), record)]); - - let moved = take_uniquely_moved_import_record( - &mut existing, - &HashSet::new(), - kind, - &fingerprint, - ) - .expect("unique content identity should preserve the record"); - - assert_eq!(moved.id, expected_id); - assert!(existing.is_empty()); - } - } - - fn moved_model_fixture(bytes: &[u8]) -> (std::path::PathBuf, std::path::PathBuf, AssetRecord) { - let key = Uuid::new_v4(); - let source_path = std::env::temp_dir().join(format!("blacksite-moved-model-{key}.glb")); - let manifest_path = - std::env::temp_dir().join(format!("blacksite-moved-model-{key}.animation.ron")); - std::fs::write(&source_path, bytes).unwrap(); - let id = AssetId::new(); - let old_path = format!("assets/models/old-{key}.glb"); - let manifest = AnimationManifest { - schema_version: ANIMATION_MANIFEST_SCHEMA_VERSION, - asset_id: id.as_string(), - label: "Moved Model".into(), - default_animation_clip_id: None, - source: AnimationManifestSource { - path: old_path.clone(), - format: "glb".into(), - fingerprint: AnimationSourceFingerprint { - byte_len: bytes.len() as u64, - content_hash: blake3::hash(bytes).to_hex().to_string(), - }, - dependencies: Vec::new(), - }, - runtime_supported: true, - skeletons: Vec::new(), - clips: Vec::new(), - diagnostics: Vec::new(), - }; - std::fs::write( - &manifest_path, - ron::ser::to_string_pretty(&manifest, ron::ser::PrettyConfig::default()).unwrap(), - ) - .unwrap(); - let record = AssetRecord { - id, - path: old_path, - label: "Moved Model".into(), - kind_tag: "Model".into(), - source_fingerprint: None, - import_settings: ImportSettings { - animation_manifest_path: Some(manifest_path.to_string_lossy().into_owned()), - ..Default::default() - }, - dependencies: Vec::new(), - }; - (source_path, manifest_path, record) - } - - #[test] - fn unique_content_match_preserves_model_record_across_move() { - let (source_path, manifest_path, record) = moved_model_fixture(b"stable model bytes"); - let expected_id = record.id.clone(); - let mut existing = HashMap::from([(record.path.clone(), record)]); - let fingerprint = fingerprint_file(&source_path).unwrap(); - - let moved = take_uniquely_moved_import_record( - &mut existing, - &HashSet::new(), - "Model", - &fingerprint, - ) - .expect("unique moved model should retain its registry record"); - - assert_eq!(moved.id, expected_id); - assert!(existing.is_empty()); - let _ = std::fs::remove_file(source_path); - let _ = std::fs::remove_file(manifest_path); - } - - #[test] - fn existing_source_path_is_not_reconciled_as_a_copy_move() { - let (source_path, manifest_path, record) = moved_model_fixture(b"copied model bytes"); - let old_path = record.path.clone(); - let mut existing = HashMap::from([(old_path.clone(), record)]); - let current_paths = HashSet::from([old_path]); - let fingerprint = fingerprint_file(&source_path).unwrap(); - - let moved = - take_uniquely_moved_import_record(&mut existing, ¤t_paths, "Model", &fingerprint); - - assert!(moved.is_none()); - assert_eq!(existing.len(), 1); - let _ = std::fs::remove_file(source_path); - let _ = std::fs::remove_file(manifest_path); + assert_eq!( + record.import_settings, + shared::AssetImportSettings::for_kind(AssetKind::Texture) + ); + assert_eq!(record.kind, AssetKind::Texture); + assert!(loaded.migration_required); } } diff --git a/crates/editor/src/assets/catalog.rs b/crates/editor/src/assets/catalog.rs index f2f40f0..9e3a5ac 100644 --- a/crates/editor/src/assets/catalog.rs +++ b/crates/editor/src/assets/catalog.rs @@ -1,18 +1,21 @@ +use std::collections::{BTreeSet, HashSet}; use std::fs; use std::path::{Path, PathBuf}; +use std::sync::Mutex; +use std::time::Duration; use bevy::prelude::*; use settings::ProjectSettings; use shared::{ - ActorKind, AuthoringLightKind, ColliderDesc, ColorDesc, EditorVisibility, LightDesc, - MaterialDesc, ModelRef, PostProcessVolumeDesc, PrefabRef, Primitive, PrimitiveShape, - RigidBodyDesc, AUDIO_CLIP_SUB_ASSET_ID, + ActorKind, AuthoringLightKind, ColliderDesc, EditorVisibility, LightDesc, ModelRef, + PostProcessVolumeDesc, PrefabRef, Primitive, PrimitiveShape, RigidBodyDesc, + AUDIO_CLIP_SUB_ASSET_ID, }; use walkdir::WalkDir; use crate::asset_db::{ ensure_asset_record, find_asset_by_id, find_asset_by_path, find_asset_mut_by_path, - AssetRegistry, MaterialImportPolicy, ModelPlacementMode, + AssetRegistry, ModelPlacementMode, }; use crate::assets::animation::load_animation_manifest; use crate::assets::static_mesh::{load_static_mesh_manifest, renderer_from_manifest}; @@ -38,6 +41,7 @@ pub enum AssetSubAssetKind { #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum AssetSelection { Builtin(String), + Folder(String), File(String), SubAsset { parent_path: String, @@ -59,14 +63,16 @@ impl AssetSelection { pub fn parent_path(&self) -> Option<&str> { match self { AssetSelection::Builtin(_) => None, - AssetSelection::File(path) => Some(path), + AssetSelection::Folder(path) | AssetSelection::File(path) => Some(path), AssetSelection::SubAsset { parent_path, .. } => Some(parent_path), } } pub fn display_label(&self) -> &str { match self { - AssetSelection::Builtin(label) | AssetSelection::File(label) => label, + AssetSelection::Builtin(label) + | AssetSelection::Folder(label) + | AssetSelection::File(label) => label, AssetSelection::SubAsset { label, .. } => label, } } @@ -108,9 +114,16 @@ pub struct EditorAssets { pub folders: Vec, pub assets: Vec, pub current_folder: String, + /// Primary selection used by the Details pane and single-item operators. pub selected: Option, + /// Ordered file-manager selection. The primary selection is always the last item. + pub selections: Vec, + pub selection_anchor: Option, pub dragging: Option, pub status: String, + /// Advances only when the visible filesystem catalog is rescanned. Selection and Details + /// changes must not trigger registry/fingerprint work. + pub catalog_revision: u64, } impl Default for EditorAssets { @@ -120,8 +133,11 @@ impl Default for EditorAssets { assets: Vec::new(), current_folder: ASSETS_ROOT.to_string(), selected: None, + selections: Vec::new(), + selection_anchor: None, dragging: None, status: "Assets not scanned yet".to_string(), + catalog_revision: 0, }; assets.refresh(); assets @@ -130,6 +146,7 @@ impl Default for EditorAssets { impl EditorAssets { pub fn refresh(&mut self) { + self.catalog_revision = self.catalog_revision.wrapping_add(1); self.folders.clear(); self.assets.clear(); @@ -147,10 +164,24 @@ impl EditorAssets { self.current_folder = ASSETS_ROOT.to_string(); } + let folders = &self.folders; + let assets = &self.assets; + self.selections + .retain(|selection| selection_exists_in(folders, assets, selection)); self.selected = self .selected .take() - .filter(|selection| self.asset_for_selection(selection).is_some()); + .filter(|selection| selection_exists_in(folders, assets, selection)) + .or_else(|| self.selections.last().cloned()); + if let Some(primary) = self.selected.clone() { + if !self.selections.contains(&primary) { + self.selections.push(primary); + } + } + self.selection_anchor = self + .selection_anchor + .take() + .filter(|selection| selection_exists_in(folders, assets, selection)); let folder_count = self.folders.len(); self.status = format!( @@ -174,6 +205,7 @@ impl EditorAssets { .assets .iter() .find(|asset| asset.path.as_deref() == Some(path.as_str())), + AssetSelection::Folder(_) => None, AssetSelection::SubAsset { parent_path, .. } => self .assets .iter() @@ -198,20 +230,109 @@ impl EditorAssets { } pub fn select(&mut self, selection: AssetSelection) { - if let Some(asset) = self.asset_for_selection(&selection).cloned() { + if self.selection_exists(&selection) { let selected_label = match &selection { AssetSelection::SubAsset { label, kind, .. } => { format!("{kind:?}: {label}") } - _ => asset.label.clone(), + AssetSelection::Folder(path) => Path::new(path) + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or(path) + .to_string(), + _ => self + .asset_for_selection(&selection) + .map(|asset| asset.label.clone()) + .unwrap_or_else(|| selection.display_label().to_string()), }; - self.selected = Some(selection); + self.selected = Some(selection.clone()); + self.selections = vec![selection.clone()]; + self.selection_anchor = Some(selection); self.status = format!("Selected {selected_label}"); } } + pub fn selection_exists(&self, selection: &AssetSelection) -> bool { + selection_exists_in(&self.folders, &self.assets, selection) + } + + pub fn is_selected(&self, selection: &AssetSelection) -> bool { + self.selections.contains(selection) + } + + pub fn clear_selection(&mut self) { + self.selected = None; + self.selections.clear(); + self.selection_anchor = None; + self.status = "Selection cleared".to_string(); + } + + pub fn toggle_selection(&mut self, selection: AssetSelection) { + if !self.selection_exists(&selection) { + return; + } + if let Some(index) = self.selections.iter().position(|item| item == &selection) { + self.selections.remove(index); + self.selected = self.selections.last().cloned(); + } else { + self.selections.push(selection.clone()); + self.selected = Some(selection.clone()); + } + self.selection_anchor = Some(selection); + self.status = format!("{} item(s) selected", self.selections.len()); + } + + pub fn select_range( + &mut self, + target: AssetSelection, + ordered: &[AssetSelection], + additive: bool, + ) { + if !self.selection_exists(&target) { + return; + } + let anchor = self + .selection_anchor + .as_ref() + .and_then(|anchor| ordered.iter().position(|item| item == anchor)) + .unwrap_or_else(|| ordered.iter().position(|item| item == &target).unwrap_or(0)); + let target_index = ordered + .iter() + .position(|item| item == &target) + .unwrap_or(anchor); + let (start, end) = if anchor <= target_index { + (anchor, target_index) + } else { + (target_index, anchor) + }; + if !additive { + self.selections.clear(); + } + for selection in &ordered[start..=end] { + if self.selection_exists(selection) && !self.selections.contains(selection) { + self.selections.push(selection.clone()); + } + } + self.selected = Some(target); + self.status = format!("{} item(s) selected", self.selections.len()); + } + + pub fn select_all(&mut self, ordered: &[AssetSelection]) { + self.selections = ordered + .iter() + .filter(|selection| self.selection_exists(selection)) + .cloned() + .collect(); + self.selected = self.selections.last().cloned(); + self.selection_anchor = self.selections.first().cloned(); + self.status = format!("{} item(s) selected", self.selections.len()); + } + pub fn start_drag(&mut self, selection: AssetSelection) { - if self.asset_for_selection(&selection).is_some() { + if self.selection_exists(&selection) { + if !self.is_selected(&selection) { + self.select(selection.clone()); + } self.dragging = Some(selection); } } @@ -221,31 +342,37 @@ impl EditorAssets { } } +fn selection_exists_in( + folders: &[AssetFolder], + assets: &[EditorAsset], + selection: &AssetSelection, +) -> bool { + match selection { + AssetSelection::Folder(path) => folders.iter().any(|folder| folder.path == *path), + AssetSelection::Builtin(label) => assets + .iter() + .any(|asset| asset.path.is_none() && asset.label == *label), + AssetSelection::File(path) => assets + .iter() + .any(|asset| asset.path.as_deref() == Some(path.as_str())), + AssetSelection::SubAsset { parent_path, .. } => assets + .iter() + .any(|asset| asset.path.as_deref() == Some(parent_path.as_str())), + } +} + pub struct EditorAssetsPlugin; -impl Plugin for EditorAssetsPlugin { - fn build(&self, app: &mut App) { - app.init_resource::() - .init_resource::() - .add_observer(super::prefab_overrides::invalidate_prefab_health_on_ready) - .add_systems( - Update, - ( - refresh_assets_on_settings_change, - super::prefab_overrides::guard_prefab_reimports, - ), - ); - } -} +#[path = "catalog/content_watch.rs"] +mod content_watch; -fn refresh_assets_on_settings_change( - settings: Res, - mut assets: ResMut, -) { - if settings.is_changed() { - assets.refresh(); - } -} +pub(crate) use content_watch::{ + begin_content_watch_transaction, commit_external_move_repairs, end_content_watch_transaction, + refresh_content_browser, suppress_content_watch_path, ExternalMoveRepairChoice, + ExternalMoveRepairReview, PendingExternalMoveRepair, +}; +#[cfg(test)] +use content_watch::{process_or_queue_content_refresh, registry_after_external_move_repairs}; fn builtin_assets() -> Vec { vec![ @@ -291,11 +418,20 @@ fn builtin_assets() -> Vec { folder_path: BUILTINS_FOLDER.to_string(), kind: EditorAssetKind::PostProcessVolume, }, + EditorAsset { + label: blacksite_surface::DEFAULT_GRID_LABEL.to_string(), + path: None, + folder_path: BUILTINS_FOLDER.to_string(), + kind: EditorAssetKind::Material, + }, ] } fn register_folder_tree(folders: &mut Vec, root: &str) { let normalized = normalize_path(root); + if is_managed_catalog_folder(&normalized) { + return; + } if folders.iter().any(|folder| folder.path == normalized) { return; } @@ -325,6 +461,14 @@ fn register_folder_tree(folders: &mut Vec, root: &str) { } } +fn is_managed_catalog_folder(path: &str) -> bool { + let path = Path::new(path); + let Ok(relative) = path.strip_prefix(ASSETS_ROOT) else { + return false; + }; + !relative.as_os_str().is_empty() && content_pipeline::is_managed_path(relative) +} + fn scan_assets_directory(assets: &mut Vec) { let root_path = Path::new(ASSETS_ROOT); if !root_path.exists() { @@ -359,54 +503,31 @@ fn should_skip_asset_path(path: &Path) -> bool { } let normalized = normalize_asset_path(path); - normalized == "assets/project.ron" - || normalized.starts_with("assets/.index/") - || normalized.starts_with("assets/.trash/") - || normalized.starts_with(crate::assets::static_mesh::STATIC_MESH_ARTIFACT_DIR) + let managed = Path::new(&normalized) + .strip_prefix(ASSETS_ROOT) + .is_ok_and(content_pipeline::is_managed_path); + normalized == "assets/project.ron" || managed } fn asset_from_file_path(path: &Path) -> Option { - let extension = path.extension()?.to_str()?.to_ascii_lowercase(); let normalized_path = normalize_asset_path(path); - let (kinds, extensions) = if is_audio_asset_extension(&extension) { - ( - vec![EditorAssetKind::AudioClip], - AUDIO_ASSET_EXTENSIONS.to_vec(), - ) - } else { - match extension.as_str() { - "gltf" | "glb" | "fbx" => (vec![EditorAssetKind::Model], vec!["gltf", "glb", "fbx"]), - "png" | "jpg" | "jpeg" | "webp" | "ktx2" => ( - vec![EditorAssetKind::Texture], - vec!["png", "jpg", "jpeg", "webp", "ktx2"], - ), - "ron" | "mat" | "material" => { - if normalized_path.contains("/materials/") { - ( - vec![EditorAssetKind::Material], - vec!["ron", "mat", "material"], - ) - } else if normalized_path.contains("/post_fx/") { - (vec![EditorAssetKind::PostProcessEffect], vec!["ron"]) - } else if normalized_path.contains("/rendering_profiles/") { - (vec![EditorAssetKind::RenderingProfile], vec!["ron"]) - } else if normalized_path.contains("/shaders/") { - (vec![EditorAssetKind::ShaderSchema], vec!["ron"]) - } else if normalized_path.ends_with(".scn.ron") - && (normalized_path.starts_with("assets/prefabs/") - || normalized_path.contains("/assets/prefabs/")) - { - (vec![EditorAssetKind::Prefab], vec!["ron"]) - } else { - (vec![EditorAssetKind::Level], vec!["ron"]) - } - } - _ => return None, - } + let mut kind = match content_pipeline::classify_asset_file(path) { + shared::AssetKind::Model => EditorAssetKind::Model, + shared::AssetKind::Texture => EditorAssetKind::Texture, + shared::AssetKind::Material => EditorAssetKind::Material, + shared::AssetKind::MaterialInstance => EditorAssetKind::Material, + shared::AssetKind::AudioClip => EditorAssetKind::AudioClip, + shared::AssetKind::Level => EditorAssetKind::Level, + shared::AssetKind::Prefab => EditorAssetKind::Prefab, + shared::AssetKind::PostProcessEffect => EditorAssetKind::PostProcessEffect, + shared::AssetKind::RenderingProfile => EditorAssetKind::RenderingProfile, + shared::AssetKind::ShaderSchema => EditorAssetKind::ShaderSchema, + shared::AssetKind::Unknown => return None, }; - - if !has_extension(path, &extensions) { - return None; + // Registry-v1 prefabs share the scene suffix. Preserve their classification until the explicit + // project upgrader gives them an unambiguous registry-v2 kind. + if matches!(kind, EditorAssetKind::Level) && normalized_path.starts_with("assets/prefabs/") { + kind = EditorAssetKind::Prefab; } let path_string = normalized_path; @@ -416,8 +537,6 @@ fn asset_from_file_path(path: &Path) -> Option { .and_then(|stem| stem.to_str()) .unwrap_or(&path_string) .to_string(); - let kind = kinds[0].clone(); - Some(EditorAsset { label, path: Some(path_string), @@ -458,22 +577,6 @@ fn folder_name(path: &str) -> String { .to_string() } -fn has_extension(path: &Path, extensions: &[&str]) -> bool { - path.extension() - .and_then(|ext| ext.to_str()) - .is_some_and(|ext| { - extensions - .iter() - .any(|candidate| ext.eq_ignore_ascii_case(candidate)) - }) -} - -fn is_audio_asset_extension(extension: &str) -> bool { - AUDIO_ASSET_EXTENSIONS - .iter() - .any(|candidate| extension.eq_ignore_ascii_case(candidate)) -} - pub fn audio_clip_ref_for_asset( world: &mut World, asset: &EditorAsset, @@ -575,7 +678,6 @@ pub fn snapshot_for_asset(asset: &EditorAsset, translation: Vec3) -> Option Primitive::sphere(size.x * 0.5), PrimitiveShape::Ramp => Primitive::ramp(size), }); - snapshot.material = Some(default_material_for(shape)); snapshot.rigid_body = Some(RigidBodyDesc::default()); snapshot.collider = Some(match shape { PrimitiveShape::Sphere => ColliderDesc::static_sphere(size.x * 0.5), @@ -675,14 +777,12 @@ pub fn spawn_asset_at(world: &mut World, asset: &EditorAsset, translation: Vec3) if let Some(record) = record { match asset.kind { EditorAssetKind::Model => { + let settings = record.model_import(); if let Some(model) = snapshot.model.as_mut() { model.asset_id = record.id.as_string(); } - snapshot.transform.scale *= record.import_settings.scale; - if matches!( - record.import_settings.placement_mode, - ModelPlacementMode::StaticAsset - ) { + snapshot.transform.scale *= settings.scale; + if matches!(settings.placement_mode, ModelPlacementMode::StaticAsset) { if let Some((renderer, requires_skinned_renderer)) = static_mesh_renderer_for_asset(world, path) { @@ -699,15 +799,14 @@ pub fn spawn_asset_at(world: &mut World, asset: &EditorAsset, translation: Vec3) ), } } else { - let collider = record - .import_settings + let collider = settings .generate_collider .then(|| static_mesh_collider_for_renderer(&renderer)); apply_static_mesh_placement_mode( &mut snapshot, renderer, collider, - record.import_settings.hierarchy_mode, + settings.hierarchy_mode, ); } } else { @@ -778,10 +877,8 @@ pub fn spawn_subasset_at( let record = world .get_resource::() .and_then(|registry| find_asset_by_path(registry, parent_path))?; - let manifest_path = record - .import_settings - .static_mesh_manifest_path - .as_deref()?; + let settings = record.model_import(); + let manifest_path = settings.static_mesh_manifest_path.as_deref()?; let manifest = load_static_mesh_manifest(manifest_path).ok()?; let part = manifest .parts @@ -798,34 +895,18 @@ pub fn spawn_subasset_at( sub_asset_id.clone(), label.clone(), ); - let material = matches!( - record.import_settings.material_policy, - MaterialImportPolicy::SourceMaterials - ) - .then(|| { - part_effective_material_id_for_selection(part).map(|id| { - shared::EditorAssetRef::new( - manifest.asset_id.clone(), - id, - part.material_slot_name.clone(), - ) - }) - }) - .flatten(); + let model_slot_id = format!("slot:{}", part_effective_id_for_selection(part)); let slot = shared::StaticMeshRendererEntry { id: shared::ComponentInstanceId::new("slot:0"), name: label.clone(), mesh: mesh_ref.clone(), - material_slot_id: shared::ComponentInstanceId::new(format!( - "slot:{}", - part_effective_id_for_selection(part) - )), - material, + material_slot_id: shared::ComponentInstanceId::new(model_slot_id.clone()), local_transform: part.local_transform, visible: true, cast_shadows: true, receive_shadows: true, }; + let static_renderer = shared::StaticMeshRenderer::single(slot); let mut snapshot = EditorEntitySnapshot { actor_id: None, @@ -835,7 +916,7 @@ pub fn spawn_subasset_at( transform: Transform::from_translation(translation + Vec3::Y * 0.1), primitive: None, brush: None, - static_mesh_renderer: Some(shared::StaticMeshRenderer::single(slot)), + static_mesh_renderer: Some(static_renderer), skinned_mesh_renderer: None, material: None, material_override: None, @@ -869,14 +950,13 @@ pub fn spawn_subasset_at( component_states: None, children: Vec::new(), }; - snapshot.transform.scale *= record.import_settings.scale; + snapshot.transform.scale *= settings.scale; if part_requires_skinned_renderer { snapshot.actor_kind = ActorKind::SkinnedMesh; snapshot.static_mesh_renderer = None; snapshot.skinned_mesh_renderer = Some(shared::SkinnedMeshRenderer { materials: crate::assets::static_mesh::renderer_materials_from_manifest( - &manifest, - &record.import_settings, + &manifest, settings, ), ..shared::SkinnedMeshRenderer::new(parent_path.clone()) .with_asset_id(record.id.as_string()) @@ -890,7 +970,7 @@ pub fn spawn_subasset_at( } return Some(spawn_with_history(world, snapshot)); } - if record.import_settings.generate_collider { + if settings.generate_collider { snapshot.rigid_body = Some(RigidBodyDesc::default()); snapshot.collider = Some(ColliderDesc::static_mesh(vec![mesh_ref])); } @@ -907,7 +987,7 @@ pub struct AnimationClipAuthoringData { pub skeleton: shared::EditorAssetRef, pub skeleton_signature: shared::AnimationSkeletonSignature, pub state: shared::AnimationStateDesc, - pub renderer_materials: shared::RendererMaterialSet, + pub renderer_materials: shared::MaterialSlotSet, } pub fn animation_clip_authoring_data( @@ -927,8 +1007,8 @@ pub fn animation_clip_authoring_data( .get_resource::() .and_then(|registry| find_asset_by_path(registry, parent_path)) .ok_or_else(|| format!("model `{parent_path}` is missing from the asset registry"))?; - let manifest_path = record - .import_settings + let settings = record.model_import(); + let manifest_path = settings .animation_manifest_path .as_deref() .ok_or_else(|| format!("model `{parent_path}` has no generated animation manifest"))?; @@ -973,23 +1053,19 @@ pub fn animation_clip_authoring_data( let clip_ref = shared::EditorAssetRef::new(asset_id, clip.id.clone(), clip.label.clone()) .with_source_path(parent_path); let state_id = animation_state_id(&clip.label, clip.source_index); - let renderer_materials = record - .import_settings + let renderer_materials = settings .static_mesh_manifest_path .as_deref() .and_then(|path| load_static_mesh_manifest(path).ok()) .map(|render_manifest| { - crate::assets::static_mesh::renderer_materials_from_manifest( - &render_manifest, - &record.import_settings, - ) + crate::assets::static_mesh::renderer_materials_from_manifest(&render_manifest, settings) }) .unwrap_or_default(); Ok(AnimationClipAuthoringData { model_asset_id: record.id.as_string(), model_path: parent_path.clone(), - model_label: record.label, - model_scale: record.import_settings.scale, + model_label: record.label.clone(), + model_scale: settings.scale, skeleton: skeleton_ref, skeleton_signature: skeleton.signature.clone(), state: shared::AnimationStateDesc { @@ -1018,7 +1094,7 @@ pub fn animation_skeleton_signature_for_ref( ) })?; let manifest_path = record - .import_settings + .model_import() .animation_manifest_path .as_deref() .ok_or_else(|| format!("model `{}` has no animation manifest", record.path))?; @@ -1058,7 +1134,7 @@ pub fn compatible_animation_skeleton_for_model( })?; let model_path = record.path.as_str(); let manifest_path = record - .import_settings + .model_import() .animation_manifest_path .as_deref() .ok_or_else(|| format!("model `{model_path}` has no animation manifest"))?; @@ -1101,11 +1177,12 @@ fn animation_state_id(label: &str, source_index: usize) -> String { fn default_animation_controller_for_record( record: &crate::asset_db::AssetRecord, ) -> Result, String> { - let Some(manifest_path) = record.import_settings.animation_manifest_path.as_deref() else { + let settings = record.model_import(); + let Some(manifest_path) = settings.animation_manifest_path.as_deref() else { return Ok(None); }; let manifest = load_animation_manifest(manifest_path)?; - if manifest.default_animation_clip_id != record.import_settings.default_animation_clip_id { + if manifest.default_animation_clip_id != settings.default_animation_clip_id { return Err( "model import settings and generated animation manifest disagree; reimport the model" .into(), @@ -1331,15 +1408,12 @@ fn apply_static_mesh_placement_mode( #[cfg(test)] fn apply_skinned_mesh_placement_mode(snapshot: &mut EditorEntitySnapshot) { - apply_skinned_mesh_placement_mode_with_materials( - snapshot, - shared::RendererMaterialSet::default(), - ); + apply_skinned_mesh_placement_mode_with_materials(snapshot, shared::MaterialSlotSet::default()); } fn apply_skinned_mesh_placement_mode_with_materials( snapshot: &mut EditorEntitySnapshot, - materials: shared::RendererMaterialSet, + materials: shared::MaterialSlotSet, ) { let Some(model) = snapshot.model.take() else { return; @@ -1376,16 +1450,6 @@ fn part_effective_id_for_selection(part: &crate::assets::static_mesh::StaticMesh } } -fn part_effective_material_id_for_selection( - part: &crate::assets::static_mesh::StaticMeshPart, -) -> Option { - part.material_id.clone().or_else(|| { - part.material_label - .as_ref() - .map(|label| crate::assets::static_mesh::material_id_from_label(label)) - }) -} - fn static_mesh_renderer_for_asset( world: &mut World, path: &str, @@ -1396,16 +1460,15 @@ fn static_mesh_renderer_for_asset( if let Some(record) = find_asset_mut_by_path(&mut registry, path) { match super::refresh_model_artifacts(record) { Ok(manifest) => { + let settings = record.model_import(); let requires_skinned_renderer = manifest.metadata.animation_count > 0 || manifest.metadata.skin_count > 0 || manifest.parts.iter().any(|part| part.skinned); - let mut authored_renderer = - renderer_from_manifest(&manifest, &record.import_settings); + let mut authored_renderer = renderer_from_manifest(&manifest, settings); if requires_skinned_renderer { authored_renderer.materials = crate::assets::static_mesh::renderer_materials_from_manifest( - &manifest, - &record.import_settings, + &manifest, settings, ); } renderer = Some((authored_renderer, requires_skinned_renderer)); @@ -1413,7 +1476,7 @@ fn static_mesh_renderer_for_asset( } Err(error) => { warn!("Model artifact refresh failed for {path}: {error}"); - manifest_path = record.import_settings.static_mesh_manifest_path.clone(); + manifest_path = record.model_import().static_mesh_manifest_path.clone(); } } } @@ -1430,75 +1493,43 @@ fn static_mesh_renderer_for_asset( let manifest_path = manifest_path?; let registry = world.get_resource::()?; let record = find_asset_by_path(registry, path)?; + let settings = record.model_import(); let manifest = load_static_mesh_manifest(&manifest_path).ok()?; let requires_skinned_renderer = manifest.metadata.animation_count > 0 || manifest.metadata.skin_count > 0 || manifest.parts.iter().any(|part| part.skinned); - let mut renderer = renderer_from_manifest(&manifest, &record.import_settings); + let mut renderer = renderer_from_manifest(&manifest, settings); if requires_skinned_renderer { - renderer.materials = crate::assets::static_mesh::renderer_materials_from_manifest( - &manifest, - &record.import_settings, - ); + renderer.materials = + crate::assets::static_mesh::renderer_materials_from_manifest(&manifest, settings); } Some((renderer, requires_skinned_renderer)) } -pub fn import_external_assets(paths: &[PathBuf]) -> Result { - let mut copied = 0; - for source in paths { - let Some(file_name) = source.file_name() else { - continue; - }; - let Some(extension) = source.extension().and_then(|ext| ext.to_str()) else { - continue; - }; - let dest_dir = import_dir_for_extension(extension); - if extension.eq_ignore_ascii_case("fbx") { - super::import::copy_fbx_bundle(source, Path::new(dest_dir))?; - copied += 1; - continue; - } - fs::create_dir_all(dest_dir) - .map_err(|err| format!("could not create {dest_dir}: {err}"))?; - let dest = Path::new(dest_dir).join(file_name); - fs::copy(source, &dest).map_err(|err| { - format!( - "could not copy {} to {}: {err}", - source.display(), - dest.display() - ) - })?; - copied += 1; - } - Ok(copied) -} - -fn import_dir_for_extension(extension: &str) -> &'static str { - if is_audio_asset_extension(extension) { - return "assets/audio"; - } - match extension.to_ascii_lowercase().as_str() { - "gltf" | "glb" | "fbx" => "assets/models", - "png" | "jpg" | "jpeg" | "webp" | "ktx2" => "assets/textures", - "ron" => "assets/levels", - "mat" | "material" => "assets/materials", - _ => "assets", - } -} - -fn default_material_for(shape: &PrimitiveShape) -> MaterialDesc { - match shape { - PrimitiveShape::Box => MaterialDesc::default(), - PrimitiveShape::Sphere => MaterialDesc::new(ColorDesc::srgb(0.9, 0.9, 0.92), 1.0, 0.25), - PrimitiveShape::Ramp => MaterialDesc::new(ColorDesc::srgb(0.30, 0.45, 0.70), 0.05, 0.55), - } -} +pub use content_pipeline::{ + commit_external_assets_import, import_external_assets, import_external_assets_to, + plan_external_assets_import, plan_external_assets_import_at, rollback_external_assets_import, + ExternalAssetImportEntry, ExternalAssetImportPlan, +}; pub fn asset_cache_key(asset: &EditorAsset) -> String { + let kind = match asset.kind { + EditorAssetKind::Primitive(_) => "primitive", + EditorAssetKind::Light(_) => "light", + EditorAssetKind::Model => "model", + EditorAssetKind::Texture => "texture", + EditorAssetKind::Material => "material", + EditorAssetKind::AudioClip => "audio", + EditorAssetKind::Level => "level", + EditorAssetKind::Prefab => "prefab", + EditorAssetKind::PostProcessVolume => "post-process-volume", + EditorAssetKind::PostProcessEffect => "post-process-effect", + EditorAssetKind::RenderingProfile => "rendering-profile", + EditorAssetKind::ShaderSchema => "shader-schema", + }; match &asset.path { - Some(path) => path.clone(), - None => format!("builtin:{}", asset.label), + Some(path) => format!("{kind}:{path}"), + None => format!("builtin:{kind}:{}", asset.label), } } @@ -1508,6 +1539,119 @@ mod tests { use crate::asset_db::{AssetId, AssetRecord}; use uuid::Uuid; + const TINY_RGBA_PNG: &[u8] = include_bytes!("../../assets/icons/01_actor_empty.png"); + + fn selection_fixture() -> EditorAssets { + EditorAssets { + folders: vec![ + AssetFolder { + path: "assets".into(), + name: "assets".into(), + parent: None, + }, + AssetFolder { + path: "assets/Props".into(), + name: "Props".into(), + parent: Some("assets".into()), + }, + ], + assets: vec![ + EditorAsset { + label: "A".into(), + path: Some("assets/a.glb".into()), + folder_path: "assets".into(), + kind: EditorAssetKind::Model, + }, + EditorAsset { + label: "B".into(), + path: Some("assets/b.glb".into()), + folder_path: "assets".into(), + kind: EditorAssetKind::Model, + }, + ], + current_folder: "assets".into(), + selected: None, + selections: Vec::new(), + selection_anchor: None, + dragging: None, + status: String::new(), + catalog_revision: 1, + } + } + + #[test] + fn file_manager_selection_supports_toggle_ranges_and_folders() { + let mut assets = selection_fixture(); + let ordered = vec![ + AssetSelection::Folder("assets/Props".into()), + AssetSelection::File("assets/a.glb".into()), + AssetSelection::File("assets/b.glb".into()), + ]; + assets.select(ordered[0].clone()); + assets.select_range(ordered[2].clone(), &ordered, false); + assert_eq!(assets.selections, ordered); + assert_eq!(assets.selected, Some(ordered[2].clone())); + + assets.toggle_selection(ordered[1].clone()); + assert_eq!( + assets.selections, + vec![ordered[0].clone(), ordered[2].clone()] + ); + assets.clear_selection(); + assert!(assets.selected.is_none()); + assert!(assets.selections.is_empty()); + } + + #[test] + fn selection_changes_do_not_advance_the_filesystem_catalog_revision() { + let mut assets = selection_fixture(); + let revision = assets.catalog_revision; + assets.select(AssetSelection::File("assets/a.glb".into())); + assets.toggle_selection(AssetSelection::File("assets/b.glb".into())); + assets.clear_selection(); + + assert_eq!(assets.catalog_revision, revision); + assets.refresh(); + assert_eq!(assets.catalog_revision, revision.wrapping_add(1)); + } + + #[test] + fn dragging_an_unselected_item_replaces_selection_but_preserves_a_selected_batch() { + let mut assets = selection_fixture(); + let first = AssetSelection::File("assets/a.glb".into()); + let second = AssetSelection::File("assets/b.glb".into()); + + assets.select(first.clone()); + assets.start_drag(second.clone()); + assert_eq!(assets.selections, vec![second.clone()]); + assert_eq!(assets.dragging, Some(second.clone())); + + assets.select(first.clone()); + assets.toggle_selection(second); + let batch = assets.selections.clone(); + assets.start_drag(first); + assert_eq!(assets.selections, batch); + } + + #[test] + fn managed_content_directories_never_enter_the_visible_folder_catalog() { + for path in [ + "assets/.index", + "assets/.index/transactions", + "assets/.trash", + "assets/.thumbnails", + "assets/.import-cache", + "assets/meshes/generated", + "assets/animations/generated", + "assets/navigation/generated", + ] { + assert!(is_managed_catalog_folder(path), "{path}"); + } + for path in ["assets", "assets/Props", "assets/meshes"] { + assert!(!is_managed_catalog_folder(path), "{path}"); + } + } + #[test] fn scene_assets_are_classified_by_authoring_folder() { let level = asset_from_file_path(Path::new("assets/levels/arena.scn.ron")).unwrap(); @@ -1518,18 +1662,35 @@ mod tests { } #[test] - fn bevy_audio_extensions_are_classified_and_imported_to_audio() { + fn thumbnail_cache_keys_are_typed_even_when_paths_match() { + let at_path = |kind| EditorAsset { + label: "Shared Path".into(), + path: Some("assets/Props/shared.asset".into()), + folder_path: "assets/Props".into(), + kind, + }; + + let model = asset_cache_key(&at_path(EditorAssetKind::Model)); + let texture = asset_cache_key(&at_path(EditorAssetKind::Texture)); + let material = asset_cache_key(&at_path(EditorAssetKind::Material)); + + assert_eq!(model, "model:assets/Props/shared.asset"); + assert_ne!(model, texture); + assert_ne!(model, material); + assert_ne!(texture, material); + } + + #[test] + fn bevy_audio_extensions_are_classified_in_any_folder() { for extension in AUDIO_ASSET_EXTENSIONS { - let path = format!("assets/audio/impact.{extension}"); + let path = format!("assets/Props/Office/impact.{extension}"); let asset = asset_from_file_path(Path::new(&path)).unwrap(); assert_eq!(asset.kind, EditorAssetKind::AudioClip); - assert_eq!(asset.folder_path, "assets/audio"); - assert_eq!(import_dir_for_extension(extension), "assets/audio"); + assert_eq!(asset.folder_path, "assets/Props/Office"); assert!(IMPORTABLE_ASSET_EXTENSIONS.contains(extension)); } assert!(asset_from_file_path(Path::new("assets/audio/impact.m4a")).is_none()); - assert_eq!(import_dir_for_extension("WAV"), "assets/audio"); } #[test] @@ -1547,12 +1708,13 @@ mod tests { id: stable_id.clone(), path: asset.path.clone().unwrap(), label: asset.label.clone(), - kind_tag: "AudioClip".into(), + kind: shared::AssetKind::AudioClip, source_fingerprint: None, import_settings: Default::default(), dependencies: Vec::new(), }], index_dirty: false, + ..Default::default() }); world.init_resource::(); world.init_resource::(); @@ -1662,13 +1824,13 @@ mod tests { id: AssetId(key), path: "assets/models/robot.glb".into(), label: "Robot".into(), - kind_tag: "Model".into(), + kind: shared::AssetKind::Model, source_fingerprint: None, - import_settings: crate::asset_db::ImportSettings { + import_settings: shared::AssetImportSettings::Model(crate::asset_db::ImportSettings { animation_manifest_path: Some(manifest_path.to_string_lossy().into_owned()), default_animation_clip_id: Some(clip_id.clone()), ..Default::default() - }, + }), dependencies: Vec::new(), }; @@ -1685,4 +1847,389 @@ mod tests { std::fs::remove_file(manifest_path).unwrap(); } + + fn import_plan_fixture(label: &str) -> (PathBuf, PathBuf, PathBuf) { + let root = std::env::temp_dir().join(format!( + "blacksite-import-review-{label}-{}", + Uuid::new_v4() + )); + let project = root.join("project"); + let destination = PathBuf::from("assets/Chosen/Office"); + std::fs::create_dir_all(project.join(&destination)).unwrap(); + let source = root.join("source.png"); + std::fs::write(&source, b"reviewed source").unwrap(); + (root, project, source) + } + + #[test] + fn destination_first_import_plan_is_non_mutating_until_commit() { + let (root, project, source) = import_plan_fixture("commit"); + let destination = Path::new("assets/Chosen/Office"); + let plan = + plan_external_assets_import_at(&project, std::slice::from_ref(&source), destination) + .unwrap(); + + assert!(plan.can_commit()); + assert_eq!(plan.entries.len(), 1); + assert_eq!( + plan.entries[0].targets, + vec![PathBuf::from("assets/Chosen/Office/source.png")] + ); + assert!(!project.join(&plan.entries[0].targets[0]).exists()); + + assert_eq!(commit_external_assets_import(&plan).unwrap(), 1); + assert_eq!( + std::fs::read(project.join("assets/Chosen/Office/source.png")).unwrap(), + b"reviewed source" + ); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn import_review_reports_collisions_without_overwriting_destination() { + let (root, project, source) = import_plan_fixture("collision"); + let target = project.join("assets/Chosen/Office/source.png"); + std::fs::write(&target, b"authored destination").unwrap(); + let plan = plan_external_assets_import_at( + &project, + std::slice::from_ref(&source), + Path::new("assets/Chosen/Office"), + ) + .unwrap(); + + assert!(!plan.can_commit()); + assert_eq!(plan.conflicts.len(), 1); + assert!(commit_external_assets_import(&plan) + .unwrap_err() + .contains("unresolved conflicts")); + assert_eq!(std::fs::read(&target).unwrap(), b"authored destination"); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn import_commit_rejects_source_changes_after_review() { + let (root, project, source) = import_plan_fixture("source-change"); + let plan = plan_external_assets_import_at( + &project, + std::slice::from_ref(&source), + Path::new("assets/Chosen/Office"), + ) + .unwrap(); + std::fs::write(&source, b"changed outside editor").unwrap(); + + assert!(commit_external_assets_import(&plan) + .unwrap_err() + .contains("changed after review")); + assert!(!project.join("assets/Chosen/Office/source.png").exists()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn import_commit_rejects_registry_and_runtime_catalog_changes_after_review() { + for (label, guarded_path, expected_error) in [ + ( + "registry-change", + content_pipeline::REGISTRY_PATH, + "asset registry changed after import review", + ), + ( + "runtime-catalog-change", + content_pipeline::RUNTIME_CATALOG_PATH, + "runtime content catalog changed after import review", + ), + ] { + let (root, project, source) = import_plan_fixture(label); + let guarded_path = project.join(guarded_path); + std::fs::create_dir_all(guarded_path.parent().unwrap()).unwrap(); + std::fs::write(&guarded_path, b"reviewed catalog").unwrap(); + let plan = plan_external_assets_import_at( + &project, + std::slice::from_ref(&source), + Path::new("assets/Chosen/Office"), + ) + .unwrap(); + std::fs::write(&guarded_path, b"external catalog edit").unwrap(); + + assert_eq!( + commit_external_assets_import(&plan).unwrap_err(), + expected_error + ); + assert!(!project.join("assets/Chosen/Office/source.png").exists()); + std::fs::remove_dir_all(root).unwrap(); + } + } + + #[test] + fn reviewed_import_rollback_removes_published_files_but_never_adopted_assets() { + let (root, project, source) = import_plan_fixture("rollback"); + let plan = plan_external_assets_import_at( + &project, + std::slice::from_ref(&source), + Path::new("assets/Chosen/Office"), + ) + .unwrap(); + commit_external_assets_import(&plan).unwrap(); + let target = project.join("assets/Chosen/Office/source.png"); + assert!(target.exists()); + + rollback_external_assets_import(&plan).unwrap(); + assert!(!target.exists()); + assert_eq!(std::fs::read(&source).unwrap(), b"reviewed source"); + + let adopted = project.join("assets/Chosen/Office/adopted.png"); + std::fs::write(&adopted, b"project authored").unwrap(); + let adopted_plan = plan_external_assets_import_at( + &project, + std::slice::from_ref(&adopted), + Path::new("assets/Chosen/Office"), + ) + .unwrap(); + commit_external_assets_import(&adopted_plan).unwrap(); + rollback_external_assets_import(&adopted_plan).unwrap(); + assert_eq!(std::fs::read(&adopted).unwrap(), b"project authored"); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn gltf_import_review_fingerprints_every_relative_dependency() { + let root = + std::env::temp_dir().join(format!("blacksite-import-review-gltf-{}", Uuid::new_v4())); + let project = root.join("project"); + let source = root.join("source"); + std::fs::create_dir_all(project.join("assets/Chosen/Office")).unwrap(); + std::fs::create_dir_all(source.join("textures")).unwrap(); + std::fs::write(source.join("mesh.bin"), [0_u8; 12]).unwrap(); + std::fs::write(source.join("textures/base color.png"), b"png").unwrap(); + std::fs::write( + source.join("mesh.gltf"), + r#"{"asset":{"version":"2.0"},"buffers":[{"uri":"mesh.bin","byteLength":12}],"images":[{"uri":"textures/base%20color.png"}]}"#, + ) + .unwrap(); + let plan = plan_external_assets_import_at( + &project, + &[source.join("mesh.gltf")], + Path::new("assets/Chosen/Office"), + ) + .unwrap(); + + assert_eq!(plan.entries[0].source_files.len(), 3); + assert_eq!(plan.entries[0].targets.len(), 3); + std::fs::write(source.join("mesh.bin"), [1_u8; 12]).unwrap(); + assert!(commit_external_assets_import(&plan) + .unwrap_err() + .contains("mesh.bin changed after review")); + assert!(!project.join("assets/Chosen/Office/mesh.gltf").exists()); + std::fs::remove_dir_all(root).unwrap(); + } + + fn external_move_repair_fixture() -> ExternalMoveRepairReview { + let fingerprint = shared::AssetSourceFingerprint::from_bytes(TINY_RGBA_PNG); + let records = ["assets/OldA/desk.png", "assets/OldB/desk.png"] + .into_iter() + .map(|path| AssetRecord { + id: AssetId::new(), + path: path.into(), + label: "Desk".into(), + kind: shared::AssetKind::Texture, + source_fingerprint: Some(fingerprint.clone()), + import_settings: shared::AssetImportSettings::for_kind(shared::AssetKind::Texture), + dependencies: Vec::new(), + }) + .collect(); + ExternalMoveRepairReview { + root: PathBuf::from("/unused"), + previous: shared::AssetRegistryDocument { + records, + ..Default::default() + }, + conflicts: vec![content_pipeline::ExternalMoveConflict { + new_path: "assets/New/desk.png".into(), + candidate_paths: vec!["assets/OldA/desk.png".into(), "assets/OldB/desk.png".into()], + kind: shared::AssetKind::Texture, + fingerprint, + }], + choices: vec![Some(ExternalMoveRepairChoice::Preserve( + "assets/OldA/desk.png".into(), + ))], + open: true, + } + } + + #[test] + fn external_move_repair_preserves_only_the_chosen_stable_identity() { + let mut review = external_move_repair_fixture(); + let root = + std::env::temp_dir().join(format!("blacksite-external-move-repair-{}", Uuid::new_v4())); + std::fs::create_dir_all(root.join("assets/New")).unwrap(); + std::fs::write(root.join("assets/New/desk.png"), TINY_RGBA_PNG).unwrap(); + review.root.clone_from(&root); + let old_id = review.previous.records[0].id.clone(); + let repaired = registry_after_external_move_repairs(&review).unwrap(); + + let moved = repaired + .records + .iter() + .find(|record| record.path == "assets/New/desk.png") + .unwrap(); + assert_eq!(moved.id, old_id); + assert!(moved.source_fingerprint.is_some()); + let unchosen = repaired + .records + .iter() + .find(|record| record.path == "assets/OldB/desk.png") + .unwrap(); + assert!(unchosen.source_fingerprint.is_none()); + + let processed = content_pipeline::scan_project(&root, &repaired).unwrap(); + assert_eq!(processed.registry.records.len(), 1); + assert_eq!(processed.registry.records[0].id, old_id); + assert_eq!(processed.registry.records[0].path, "assets/New/desk.png"); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn external_move_repair_register_new_clears_every_ambiguous_candidate() { + let mut review = external_move_repair_fixture(); + review.choices[0] = Some(ExternalMoveRepairChoice::RegisterNew); + let repaired = registry_after_external_move_repairs(&review).unwrap(); + + assert!(repaired + .records + .iter() + .all(|record| record.source_fingerprint.is_none())); + assert!(repaired + .records + .iter() + .all(|record| record.path != "assets/New/desk.png")); + } + + #[test] + fn external_move_repair_commit_publishes_registry_catalog_and_world_together() { + let mut review = external_move_repair_fixture(); + let root = + std::env::temp_dir().join(format!("blacksite-external-move-commit-{}", Uuid::new_v4())); + std::fs::create_dir_all(root.join("assets/New")).unwrap(); + std::fs::write(root.join("assets/New/desk.png"), TINY_RGBA_PNG).unwrap(); + review.root.clone_from(&root); + let expected_id = review.previous.records[0].id.clone(); + let mut world = World::new(); + world.insert_resource(AssetRegistry { + schema_version: review.previous.schema_version, + defaults: review.previous.defaults.clone(), + records: review.previous.records.clone(), + index_dirty: false, + migration_required: false, + }); + world.insert_resource(PendingExternalMoveRepair { + review: Some(review), + }); + world.insert_resource(EditorAssets::default()); + world.insert_resource(crate::assets::AssetThumbnailCache::default()); + world.insert_resource(crate::scene_io::SceneIo::default()); + + commit_external_move_repairs(&mut world).unwrap(); + + let document = world.resource::().document(); + assert_eq!(document.records.len(), 1); + assert_eq!(document.records[0].id, expected_id); + assert_eq!(document.records[0].path, "assets/New/desk.png"); + assert!(world + .resource::() + .review + .is_none()); + assert!(root.join(content_pipeline::REGISTRY_PATH).is_file()); + assert!(root.join(content_pipeline::RUNTIME_CATALOG_PATH).is_file()); + let published_source = + std::fs::read_to_string(root.join(content_pipeline::REGISTRY_PATH)).unwrap(); + let published = shared::parse_asset_registry(&published_source) + .unwrap() + .document; + assert_eq!(published, document); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn startup_move_inspection_queues_ambiguous_identity_review_without_registry_mutation() { + let mut review = external_move_repair_fixture(); + let root = std::env::temp_dir().join(format!( + "blacksite-external-move-startup-{}", + Uuid::new_v4() + )); + std::fs::create_dir_all(root.join("assets/New")).unwrap(); + std::fs::write(root.join("assets/New/desk.png"), TINY_RGBA_PNG).unwrap(); + review.root.clone_from(&root); + let original = review.previous.clone(); + let mut world = World::new(); + world.insert_resource(AssetRegistry { + schema_version: original.schema_version, + defaults: original.defaults.clone(), + records: original.records.clone(), + index_dirty: false, + migration_required: false, + }); + world.init_resource::(); + world.init_resource::(); + world.insert_resource(EditorAssets::default()); + world.init_resource::(); + + process_or_queue_content_refresh(&mut world, root.clone(), 0, "Startup content refresh") + .unwrap(); + + assert_eq!(world.resource::().document(), original); + let pending = world.resource::(); + let queued = pending.review.as_ref().unwrap(); + assert!(queued.open); + assert_eq!(queued.root, root); + assert_eq!(queued.conflicts, review.conflicts); + assert!(world + .resource::() + .status + .contains("require identity repair")); + assert!(!root.join(content_pipeline::REGISTRY_PATH).exists()); + assert!(!root.join(content_pipeline::RUNTIME_CATALOG_PATH).exists()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn shared_startup_refresh_registers_new_content_and_publishes_both_catalogs() { + let root = std::env::temp_dir().join(format!( + "blacksite-shared-startup-refresh-{}", + Uuid::new_v4() + )); + std::fs::create_dir_all(root.join("assets/Props")).unwrap(); + std::fs::write(root.join("assets/Props/new.png"), TINY_RGBA_PNG).unwrap(); + let mut world = World::new(); + world.init_resource::(); + world.init_resource::(); + world.init_resource::(); + world.insert_resource(EditorAssets::default()); + world.init_resource::(); + + content_watch::process_content_refresh_for_test(&mut world, root.clone()).unwrap(); + + let registry = world.resource::().document(); + assert_eq!(registry.records.len(), 1); + assert_eq!(registry.records[0].path, "assets/Props/new.png"); + assert_eq!(registry.records[0].kind, shared::AssetKind::Texture); + assert!(world + .resource::() + .review + .is_none()); + assert!(root.join(content_pipeline::REGISTRY_PATH).is_file()); + assert!(root.join(content_pipeline::RUNTIME_CATALOG_PATH).is_file()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn external_move_repair_rejects_reusing_one_identity_for_two_new_paths() { + let mut review = external_move_repair_fixture(); + let mut second = review.conflicts[0].clone(); + second.new_path = "assets/Newer/desk.png".into(); + review.conflicts.push(second); + review.choices.push(review.choices[0].clone()); + + assert!(registry_after_external_move_repairs(&review) + .unwrap_err() + .contains("cannot be assigned to more than one new path")); + } } diff --git a/crates/editor/src/assets/catalog/content_watch.rs b/crates/editor/src/assets/catalog/content_watch.rs new file mode 100644 index 0000000..cffb2b1 --- /dev/null +++ b/crates/editor/src/assets/catalog/content_watch.rs @@ -0,0 +1,548 @@ +use super::*; + +#[derive(Resource)] +pub(super) struct EditorContentWatch { + root: PathBuf, + service: Mutex>, +} + +#[derive(Resource, Default)] +pub(super) struct ExternalContentRefreshQueue { + active: Option, + pending: Option, +} + +pub(super) struct ExternalContentRefreshJob { + handle: std::thread::JoinHandle>, +} + +pub(super) struct PendingExternalContentRefresh { + root: PathBuf, + changed_path_count: usize, + status_prefix: String, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub(crate) enum ExternalMoveRepairChoice { + Preserve(String), + RegisterNew, +} + +#[derive(Debug, Clone)] +pub(crate) struct ExternalMoveRepairReview { + pub(crate) root: PathBuf, + pub(crate) previous: shared::AssetRegistryDocument, + pub(crate) conflicts: Vec, + pub(crate) choices: Vec>, + pub(crate) open: bool, +} + +#[derive(Resource, Debug, Default, Clone)] +pub(crate) struct PendingExternalMoveRepair { + pub(crate) review: Option, +} + +impl Plugin for EditorAssetsPlugin { + fn build(&self, app: &mut App) { + let root = PathBuf::from( + &app.world() + .resource::() + .root, + ); + let service = match content_pipeline::ContentWatchService::watch_project(&root) { + Ok(service) => Some(service), + Err(error) => { + warn!("Live content watching is unavailable: {error}"); + None + } + }; + app.init_resource::() + .init_resource::() + .init_resource::() + .insert_resource(EditorContentWatch { + root, + service: Mutex::new(service), + }) + .init_resource::() + .add_observer(crate::assets::prefab_overrides::invalidate_prefab_health_on_ready) + .add_systems( + Update, + ( + refresh_assets_on_settings_change, + crate::assets::prefab_overrides::guard_prefab_reimports, + ), + ) + .add_systems(Startup, refresh_content_on_startup) + .add_systems( + Update, + (poll_content_watcher, drive_external_content_refresh).chain(), + ); + } +} + +pub(crate) fn begin_content_watch_transaction(world: &World) { + let Some(watcher) = world.get_resource::() else { + return; + }; + if let Ok(mut service) = watcher.service.lock() { + if let Some(service) = service.as_mut() { + service.begin_transaction(); + } + } +} + +pub(crate) fn end_content_watch_transaction(world: &World) { + let Some(watcher) = world.get_resource::() else { + return; + }; + if let Ok(mut service) = watcher.service.lock() { + if let Some(service) = service.as_mut() { + service.end_transaction(); + } + } +} + +pub(crate) fn suppress_content_watch_path(world: &World, path: &Path) { + let Some(watcher) = world.get_resource::() else { + return; + }; + if let Ok(mut service) = watcher.service.lock() { + if let Some(service) = service.as_mut() { + service.suppress_path(path, Duration::from_millis(750)); + } + } +} + +pub(super) fn poll_content_watcher(world: &mut World) { + let Some(watcher) = world.get_resource::() else { + return; + }; + let root = watcher.root.clone(); + let changes = { + let Ok(mut service) = watcher.service.lock() else { + return; + }; + let Some(service) = service.as_mut() else { + return; + }; + match service.poll(Duration::from_millis(150)) { + Ok(changes) => changes, + Err(error) => { + warn!("Content watcher failed: {error}"); + return; + } + } + }; + if changes.is_empty() { + return; + } + if let Some(mut cache) = world.get_resource_mut::() { + cache.invalidate_disk_documents(); + } + + if let Err(error) = + process_or_queue_content_refresh(world, root, changes.len(), "Live content refresh") + { + world.resource_mut::().status = + format!("Live content refresh failed: {error}"); + } +} + +pub(super) fn refresh_content_on_startup(world: &mut World) { + let root = world + .get_resource::() + .map(|workspace| PathBuf::from(&workspace.root)) + .unwrap_or_else(|| PathBuf::from(".")); + if let Err(error) = process_or_queue_content_refresh(world, root, 0, "Startup content refresh") + { + warn!("Startup content refresh failed: {error}"); + } +} + +pub(super) fn process_or_queue_content_refresh( + world: &mut World, + root: PathBuf, + changed_path_count: usize, + status_prefix: &str, +) -> Result<(), String> { + let previous = world.resource::().document(); + if queue_external_move_repair(world, root.clone(), previous.clone())? { + world.resource_mut::().refresh(); + crate::assets::invalidate_on_catalog_refresh(world); + return Ok(()); + } + let mut queue = world.resource_mut::(); + if queue.active.is_some() { + let pending = queue + .pending + .get_or_insert_with(|| PendingExternalContentRefresh { + root: root.clone(), + changed_path_count: 0, + status_prefix: status_prefix.to_string(), + }); + pending.root = root; + pending.changed_path_count = pending + .changed_path_count + .saturating_add(changed_path_count); + pending.status_prefix = status_prefix.to_string(); + return Ok(()); + } + let status_prefix = status_prefix.to_string(); + let handle = std::thread::spawn(move || { + process_content_refresh(&root, &previous, changed_path_count, &status_prefix) + }); + queue.active = Some(ExternalContentRefreshJob { handle }); + Ok(()) +} + +pub(super) fn drive_external_content_refresh(world: &mut World) { + let completed = { + let mut queue = world.resource_mut::(); + if queue + .active + .as_ref() + .is_some_and(|job| job.handle.is_finished()) + { + queue.active.take() + } else { + None + } + }; + let Some(job) = completed else { + return; + }; + match job + .handle + .join() + .unwrap_or_else(|_| Err("content refresh worker panicked".into())) + { + Ok((document, status)) => { + apply_processed_content(world, document); + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = status; + } + } + Err(error) => { + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = format!("Content refresh failed: {error}"); + } + } + } + let pending = world + .resource_mut::() + .pending + .take(); + if let Some(pending) = pending { + let _ = process_or_queue_content_refresh( + world, + pending.root, + pending.changed_path_count, + &pending.status_prefix, + ); + } +} + +#[cfg(test)] +pub(super) fn process_content_refresh_for_test( + world: &mut World, + root: PathBuf, +) -> Result<(), String> { + world.init_resource::(); + process_or_queue_content_refresh(world, root, 0, "Startup content refresh")?; + for _ in 0..1_000 { + drive_external_content_refresh(world); + let queue = world.resource::(); + if queue.active.is_none() && queue.pending.is_none() { + return Ok(()); + } + std::thread::sleep(std::time::Duration::from_millis(1)); + } + Err("content refresh worker did not finish within one second".into()) +} + +pub(super) fn queue_external_move_repair( + world: &mut World, + root: PathBuf, + previous: shared::AssetRegistryDocument, +) -> Result { + let conflicts = content_pipeline::find_ambiguous_external_moves(&root, &previous)?; + if conflicts.is_empty() { + return Ok(false); + } + let count = conflicts.len(); + world.resource_mut::().review = Some(ExternalMoveRepairReview { + root, + previous, + choices: vec![None; count], + conflicts, + open: true, + }); + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = format!( + "{count} ambiguous external move(s) require identity repair in the Content Browser" + ); + } + Ok(true) +} + +pub(crate) fn refresh_content_browser(world: &mut World) { + let root = world + .get_resource::() + .map(|workspace| PathBuf::from(&workspace.root)) + .unwrap_or_else(|| PathBuf::from(".")); + match process_or_queue_content_refresh(world, root, 0, "Manual content refresh") { + Ok(()) => {} + Err(error) => { + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = format!("Manual content refresh failed: {error}"); + } + } + } +} + +pub(super) fn process_content_refresh( + root: &Path, + previous: &shared::AssetRegistryDocument, + changed_path_count: usize, + status_prefix: &str, +) -> Result<(shared::AssetRegistryDocument, String), String> { + let mut processed = content_pipeline::scan_project(root, previous)?; + let current_ids = processed + .registry + .records + .iter() + .map(|record| record.id.as_string()) + .collect::>(); + let removed_paths = previous + .records + .iter() + .filter(|record| !current_ids.contains(&record.id.as_string())) + .map(|record| PathBuf::from(&record.path)) + .collect::>(); + let removed_usages = if removed_paths.is_empty() { + Vec::new() + } else { + content_pipeline::find_reference_usages(root, &removed_paths, previous) + .map_err(|error| format!("could not inspect removed-asset usages: {error}"))? + }; + let mut model_plans = Vec::new(); + for record in processed + .registry + .records + .iter_mut() + .filter(|record| record.kind == shared::AssetKind::Model) + { + let plan = crate::assets::plan_model_artifacts_at(root, record) + .map_err(|error| format!("model processing failed for {}: {error}", record.path))?; + *record = plan.record.clone(); + model_plans.push(plan); + } + processed.runtime_catalog = shared::RuntimeContentCatalog::from(&processed.registry); + let mut texture_plans = Vec::new(); + for record in processed + .registry + .records + .iter() + .filter(|record| record.kind == shared::AssetKind::Texture) + { + let plan = content_pipeline::plan_texture_artifact(root, record) + .map_err(|error| format!("Texture processing failed for {}: {error}", record.path))?; + content_pipeline::apply_texture_plan_to_catalog( + &mut processed.runtime_catalog, + &record.id, + &plan, + )?; + texture_plans.push(plan); + } + let mut material_plans = Vec::new(); + for record in processed.registry.records.iter().filter(|record| { + matches!( + record.kind, + shared::AssetKind::Material | shared::AssetKind::MaterialInstance + ) + }) { + if let Some(plan) = + content_pipeline::plan_material_artifact(root, record, &processed.registry)? + { + content_pipeline::apply_material_plan_to_catalog( + &mut processed.runtime_catalog, + &record.id, + &plan, + )?; + material_plans.push(plan); + } + } + let mut publication_paths = model_plans + .iter() + .flat_map(|plan| [plan.static_path.clone(), plan.animation_path.clone()]) + .collect::>(); + publication_paths.extend(texture_plans.iter().map(|plan| plan.output_path.clone())); + publication_paths.extend(material_plans.iter().map(|plan| plan.output_path.clone())); + publication_paths.push(root.join(content_pipeline::REGISTRY_PATH)); + publication_paths.push(root.join(content_pipeline::RUNTIME_CATALOG_PATH)); + publication_paths.sort(); + publication_paths.dedup(); + let backups = publication_paths + .iter() + .map(|path| (path.clone(), fs::read(path).ok())) + .collect::>(); + let publication = (|| { + for plan in &model_plans { + crate::assets::publish_model_artifacts(plan)?; + } + for plan in &texture_plans { + content_pipeline::publish_texture_artifact(plan)?; + } + for plan in &material_plans { + content_pipeline::publish_material_artifact(plan)?; + } + content_pipeline::publish_content_documents_with_catalog( + root, + &processed.registry, + &processed.runtime_catalog, + ) + })(); + if let Err(error) = publication { + for (path, bytes) in &backups { + if let Some(bytes) = bytes { + let _ = fs::write(path, bytes); + } else { + let _ = fs::remove_file(path); + } + } + return Err(format!("content publication rolled back: {error}")); + } + + let mut status = format!( + "{status_prefix}: {changed_path_count} changed path(s), {} model artifact set(s), {} Texture artifact(s), {} packed Material artifact(s), {} added, {} moved, {} removed", + model_plans.len(), + texture_plans.len(), + material_plans.len(), + processed.report.added, + processed.report.moved, + processed.report.removed + ); + if !removed_usages.is_empty() { + let documents = removed_usages + .iter() + .map(|usage| usage.document.display().to_string()) + .collect::>() + .into_iter() + .take(3) + .collect::>() + .join(", "); + status.push_str(&format!( + "; {} reference(s) now unresolved in {}", + removed_usages.len(), + documents + )); + } + Ok((processed.registry, status)) +} + +pub(super) fn apply_processed_content(world: &mut World, document: shared::AssetRegistryDocument) { + if world.contains_resource::() { + crate::asset_documents::adopt_external_registry_document(world, &document); + } else { + let mut registry = world.resource_mut::(); + registry.schema_version = document.schema_version; + registry.defaults = document.defaults; + registry.records = document.records; + registry.index_dirty = false; + registry.migration_required = false; + } + world.resource_mut::().refresh(); + crate::assets::invalidate_on_catalog_refresh(world); +} + +pub(crate) fn commit_external_move_repairs(world: &mut World) -> Result<(), String> { + let review = world + .resource::() + .review + .clone() + .ok_or_else(|| "no external move repair is pending".to_string())?; + if review.choices.iter().any(Option::is_none) { + return Err("choose an identity for every ambiguous external move".into()); + } + let current_registry = world.resource::().document(); + if current_registry != review.previous { + return Err("asset registry changed after the external move review opened".into()); + } + let current_conflicts = + content_pipeline::find_ambiguous_external_moves(&review.root, &review.previous)?; + if current_conflicts != review.conflicts { + let count = current_conflicts.len(); + world.resource_mut::().review = (!current_conflicts.is_empty()) + .then(|| ExternalMoveRepairReview { + root: review.root, + previous: current_registry, + choices: vec![None; count], + conflicts: current_conflicts, + open: true, + }); + return Err("external files changed after review; inspect the refreshed conflicts".into()); + } + + let repaired = registry_after_external_move_repairs(&review)?; + + let (document, status) = + process_content_refresh(&review.root, &repaired, 0, "External move repair")?; + apply_processed_content(world, document); + world.resource_mut::().review = None; + world.resource_mut::().status = status; + Ok(()) +} + +pub(super) fn registry_after_external_move_repairs( + review: &ExternalMoveRepairReview, +) -> Result { + if review.choices.len() != review.conflicts.len() || review.choices.iter().any(Option::is_none) + { + return Err("choose an identity for every ambiguous external move".into()); + } + + let mut repaired = review.previous.clone(); + let mut preserved = HashSet::new(); + for (conflict, choice) in review.conflicts.iter().zip(review.choices.iter()) { + if let Some(ExternalMoveRepairChoice::Preserve(old_path)) = choice { + if !conflict.candidate_paths.contains(old_path) { + return Err(format!( + "selected identity {old_path} is not a candidate for {}", + conflict.new_path + )); + } + if !preserved.insert(old_path.clone()) { + return Err(format!( + "stable identity {old_path} cannot be assigned to more than one new path" + )); + } + let record = repaired + .records + .iter_mut() + .find(|record| record.path == *old_path) + .ok_or_else(|| format!("candidate registry record disappeared: {old_path}"))?; + record.path.clone_from(&conflict.new_path); + } + } + let candidate_paths = review + .conflicts + .iter() + .flat_map(|conflict| conflict.candidate_paths.iter()) + .cloned() + .collect::>(); + for record in &mut repaired.records { + if candidate_paths.contains(&record.path) && !preserved.contains(&record.path) { + record.source_fingerprint = None; + } + } + Ok(repaired) +} + +pub(super) fn refresh_assets_on_settings_change( + settings: Res, + mut assets: ResMut, +) { + if settings.is_changed() { + assets.refresh(); + } +} diff --git a/crates/editor/src/assets/fingerprint.rs b/crates/editor/src/assets/fingerprint.rs index e2a0330..dda0d15 100644 --- a/crates/editor/src/assets/fingerprint.rs +++ b/crates/editor/src/assets/fingerprint.rs @@ -1,114 +1,3 @@ -use std::fs; -use std::path::Path; +//! Compatibility re-exports for the shared content-pipeline fingerprint helpers. -use serde::de::DeserializeOwned; -use serde::Serialize; -use shared::AssetSourceFingerprint; - -pub(crate) fn fingerprint_file(path: impl AsRef) -> Result { - let path = path.as_ref(); - let bytes = fs::read(path) - .map_err(|error| format!("could not read imported source {}: {error}", path.display()))?; - Ok(AssetSourceFingerprint::from_bytes(&bytes)) -} - -/// Writes canonical pretty RON only when the parsed document changes semantically. -/// -/// Equivalent existing bytes, including custom formatting and final-newline policy, stay intact. -pub(crate) fn write_pretty_ron_if_changed( - path: impl AsRef, - value: &T, -) -> Result -where - T: DeserializeOwned + PartialEq + Serialize, -{ - let path = path.as_ref(); - if fs::read_to_string(path) - .ok() - .and_then(|text| ron::from_str::(&text).ok()) - .is_some_and(|existing| existing == *value) - { - return Ok(false); - } - - let text = ron::ser::to_string_pretty(value, ron::ser::PrettyConfig::default()) - .map_err(|error| format!("could not serialize RON: {error}"))?; - if fs::read(path).ok().as_deref() == Some(text.as_bytes()) { - return Ok(false); - } - if let Some(parent) = path.parent() { - fs::create_dir_all(parent) - .map_err(|error| format!("could not create {}: {error}", parent.display()))?; - } - fs::write(path, text) - .map_err(|error| format!("could not write {}: {error}", path.display()))?; - Ok(true) -} - -#[cfg(test)] -mod tests { - use super::*; - use serde::Deserialize; - use std::fs::{File, FileTimes}; - use std::time::{Duration, SystemTime}; - use uuid::Uuid; - - #[derive(Debug, Deserialize, PartialEq, Serialize)] - struct Fixture { - count: u32, - label: String, - } - - fn fixture_path(name: &str) -> std::path::PathBuf { - std::env::temp_dir().join(format!( - "blacksite-fingerprint-{name}-{}.ron", - Uuid::new_v4() - )) - } - - #[test] - fn metadata_only_drift_does_not_change_content_identity() { - let path = fixture_path("mtime"); - fs::write(&path, b"stable source bytes").unwrap(); - let before = fingerprint_file(&path).unwrap(); - File::options() - .write(true) - .open(&path) - .unwrap() - .set_times( - FileTimes::new().set_modified(SystemTime::now() + Duration::from_secs(86_400)), - ) - .unwrap(); - - assert_eq!(fingerprint_file(&path).unwrap(), before); - fs::remove_file(path).unwrap(); - } - - #[test] - fn same_size_byte_change_updates_content_identity() { - let path = fixture_path("same-size"); - fs::write(&path, b"source-a").unwrap(); - let before = fingerprint_file(&path).unwrap(); - fs::write(&path, b"source-b").unwrap(); - let after = fingerprint_file(&path).unwrap(); - - assert_eq!(before.byte_len, after.byte_len); - assert_ne!(before.content_hash, after.content_hash); - fs::remove_file(path).unwrap(); - } - - #[test] - fn equivalent_ron_preserves_exact_existing_bytes() { - let path = fixture_path("semantic"); - let existing = b"( label: \"stable\", count: 7, )\n\n"; - fs::write(&path, existing).unwrap(); - let value = Fixture { - count: 7, - label: "stable".into(), - }; - - assert!(!write_pretty_ron_if_changed(&path, &value).unwrap()); - assert_eq!(fs::read(&path).unwrap(), existing); - fs::remove_file(path).unwrap(); - } -} +pub(crate) use content_pipeline::fingerprint_file; diff --git a/crates/editor/src/assets/import.rs b/crates/editor/src/assets/import.rs index 4e333f5..ea931fc 100644 --- a/crates/editor/src/assets/import.rs +++ b/crates/editor/src/assets/import.rs @@ -1,564 +1,7 @@ -//! External asset bundle inspection and transactional import. +//! Editor-facing re-exports of the shared UI-independent content importer. -use std::collections::BTreeMap; -use std::fs; -use std::path::{Component, Path, PathBuf}; - -use bevy_ufbx::texture::external_texture_paths; - -#[derive(Debug, Clone, PartialEq, Eq)] -pub(crate) struct FbxDependencyInspection { - pub relative_paths: Vec, - pub resolved_paths: Vec, - pub missing_paths: Vec, -} - -/// Parses every external FBX texture reference without loading it through Bevy. -pub(crate) fn inspect_fbx_dependencies(source: &Path) -> Result { - let bytes = fs::read(source) - .map_err(|error| format!("could not read FBX {}: {error}", source.display()))?; - let filename_hint = source.to_string_lossy(); - let scene = ufbx::load_memory( - &bytes, - ufbx::LoadOpts { - target_unit_meters: 1.0, - target_axes: ufbx::CoordinateAxes::right_handed_y_up(), - filename: ufbx::StringOpt::Ref(&filename_hint), - ..Default::default() - }, - ) - .map_err(|error| format!("could not parse FBX {}: {error:?}", source.display()))?; - let relative_paths = external_texture_paths(&scene).map_err(|errors| { - format!( - "unsafe FBX texture reference(s) in {}: {}", - source.display(), - errors - .into_iter() - .map(|error| error.to_string()) - .collect::>() - .join("; ") - ) - })?; - let source_root = source.parent().unwrap_or_else(|| Path::new("")); - let canonical_root = fs::canonicalize(source_root).map_err(|error| { - format!( - "could not resolve FBX source directory {}: {error}", - source_root.display() - ) - })?; - let mut resolved_paths = Vec::new(); - let mut missing_paths = Vec::new(); - for relative_path in &relative_paths { - let resolved = source_root.join(relative_path); - if !resolved.is_file() { - missing_paths.push(resolved.clone()); - resolved_paths.push(resolved); - continue; - } - let canonical = fs::canonicalize(&resolved).map_err(|error| { - format!( - "could not resolve FBX dependency {}: {error}", - resolved.display() - ) - })?; - if !canonical.starts_with(&canonical_root) { - return Err(format!( - "FBX dependency {} resolves outside source directory {}", - resolved.display(), - source_root.display() - )); - } - resolved_paths.push(resolved); - } - missing_paths.sort(); - Ok(FbxDependencyInspection { - relative_paths, - resolved_paths, - missing_paths, - }) -} - -/// Returns one stable browser-facing error for all missing FBX source textures. -pub(crate) fn validate_fbx_dependencies(source: &Path) -> Result<(), String> { - let inspection = inspect_fbx_dependencies(source)?; - if inspection.missing_paths.is_empty() { - return Ok(()); - } - Err(format!( - "missing {} FBX source texture(s): {}", - inspection.missing_paths.len(), - inspection - .missing_paths - .iter() - .map(|path| path.to_string_lossy().replace('\\', "/")) - .collect::>() - .join(", ") - )) -} - -/// Copies an FBX and every referenced external texture as one staged filesystem transaction. -pub fn copy_fbx_bundle(source: &Path, dest_dir: &Path) -> Result<(), String> { - let inspection = inspect_fbx_dependencies(source)?; - if !inspection.missing_paths.is_empty() { - return Err(format!( - "FBX import is missing {} required texture(s): {}", - inspection.missing_paths.len(), - inspection - .missing_paths - .iter() - .map(|path| path.display().to_string()) - .collect::>() - .join(", ") - )); - } - let file_name = source - .file_name() - .ok_or_else(|| "FBX import path has no file name".to_string())?; - let mut entries = BTreeMap::new(); - entries.insert(PathBuf::from(file_name), source.to_path_buf()); - for (relative, resolved) in inspection - .relative_paths - .iter() - .zip(inspection.resolved_paths.iter()) - { - let relative = PathBuf::from(relative); - if let Some(existing) = entries.insert(relative.clone(), resolved.clone()) { - if existing != *resolved { - return Err(format!( - "FBX import maps multiple source files to {}", - relative.display() - )); - } - } - } - copy_bundle_transactionally(&entries, dest_dir) -} - -fn copy_bundle_transactionally( - entries: &BTreeMap, - dest_dir: &Path, -) -> Result<(), String> { - fs::create_dir_all(dest_dir) - .map_err(|error| format!("could not create {}: {error}", dest_dir.display()))?; - let canonical_dest_dir = fs::canonicalize(dest_dir).map_err(|error| { - format!( - "could not resolve FBX import destination {}: {error}", - dest_dir.display() - ) - })?; - for relative in entries.keys() { - validate_bundle_relative_path(relative)?; - validate_existing_destination_parents(dest_dir, &canonical_dest_dir, relative)?; - let target = dest_dir.join(relative); - if target.is_dir() { - return Err(format!( - "FBX import target {} is an existing directory", - target.display() - )); - } - } - - let stage_root = dest_dir.join(format!(".blacksite-import-{}", uuid::Uuid::new_v4())); - let staged_root = stage_root.join("new"); - let backup_root = stage_root.join("backup"); - let stage_result = (|| { - for (relative, source) in entries { - let staged = staged_root.join(relative); - if let Some(parent) = staged.parent() { - fs::create_dir_all(parent).map_err(|error| { - format!( - "could not create import staging {}: {error}", - parent.display() - ) - })?; - } - fs::copy(source, &staged).map_err(|error| { - format!( - "could not stage FBX bundle file {} as {}: {error}", - source.display(), - relative.display() - ) - })?; - } - commit_staged_bundle( - entries, - dest_dir, - &canonical_dest_dir, - &staged_root, - &backup_root, - ) - })(); - let cleanup_result = fs::remove_dir_all(&stage_root); - match (stage_result, cleanup_result) { - (Err(error), _) => Err(error), - (Ok(()), Ok(())) => Ok(()), - (Ok(()), Err(error)) if error.kind() == std::io::ErrorKind::NotFound => Ok(()), - (Ok(()), Err(error)) => { - bevy::log::warn!( - "FBX bundle imported but staging cleanup failed for {}: {error}", - stage_root.display() - ); - Ok(()) - } - } -} - -fn validate_bundle_relative_path(relative: &Path) -> Result<(), String> { - if relative.as_os_str().is_empty() - || !relative - .components() - .all(|component| matches!(component, Component::Normal(_))) - { - return Err(format!( - "FBX import target path {} is not a safe relative path", - relative.display() - )); - } - Ok(()) -} - -fn validate_existing_destination_parents( - dest_dir: &Path, - canonical_dest_dir: &Path, - relative: &Path, -) -> Result<(), String> { - let mut current = dest_dir.to_path_buf(); - let Some(parent) = relative.parent() else { - return Ok(()); - }; - for component in parent.components() { - let Component::Normal(segment) = component else { - return Err(format!( - "FBX import target path {} is not a safe relative path", - relative.display() - )); - }; - current.push(segment); - let metadata = match fs::symlink_metadata(¤t) { - Ok(metadata) => metadata, - Err(error) if error.kind() == std::io::ErrorKind::NotFound => break, - Err(error) => { - return Err(format!( - "could not inspect FBX import target {}: {error}", - current.display() - )); - } - }; - if metadata.file_type().is_symlink() { - return Err(format!( - "FBX import target parent {} is a symbolic link", - current.display() - )); - } - if !metadata.is_dir() { - return Err(format!( - "FBX import target parent {} is not a directory", - current.display() - )); - } - let canonical = fs::canonicalize(¤t).map_err(|error| { - format!( - "could not resolve FBX import target parent {}: {error}", - current.display() - ) - })?; - if !canonical.starts_with(canonical_dest_dir) { - return Err(format!( - "FBX import target parent {} resolves outside destination {}", - current.display(), - dest_dir.display() - )); - } - } - Ok(()) -} - -fn commit_staged_bundle( - entries: &BTreeMap, - dest_dir: &Path, - canonical_dest_dir: &Path, - staged_root: &Path, - backup_root: &Path, -) -> Result<(), String> { - let mut installed = Vec::new(); - let mut backups = Vec::new(); - for relative in entries.keys() { - let target = dest_dir.join(relative); - let staged = staged_root.join(relative); - if let Some(parent) = target.parent() { - if let Err(error) = fs::create_dir_all(parent) { - return rollback_bundle( - &installed, - &backups, - format!( - "could not create import target {}: {error}", - parent.display() - ), - ); - } - let canonical_parent = match fs::canonicalize(parent) { - Ok(canonical_parent) => canonical_parent, - Err(error) => { - return rollback_bundle( - &installed, - &backups, - format!( - "could not resolve import target {}: {error}", - parent.display() - ), - ); - } - }; - if !canonical_parent.starts_with(canonical_dest_dir) { - return rollback_bundle( - &installed, - &backups, - format!( - "FBX import target {} resolves outside destination {}", - parent.display(), - dest_dir.display() - ), - ); - } - } - if target.exists() { - let backup = backup_root.join(relative); - if let Some(parent) = backup.parent() { - if let Err(error) = fs::create_dir_all(parent) { - return rollback_bundle( - &installed, - &backups, - format!( - "could not create import backup {}: {error}", - parent.display() - ), - ); - } - } - if let Err(error) = fs::rename(&target, &backup) { - return rollback_bundle( - &installed, - &backups, - format!( - "could not back up import target {}: {error}", - target.display() - ), - ); - } - backups.push((backup, target.clone())); - } - if let Err(error) = fs::rename(&staged, &target) { - return rollback_bundle( - &installed, - &backups, - format!( - "could not publish import target {}: {error}", - target.display() - ), - ); - } - installed.push(target); - } - Ok(()) -} - -fn rollback_bundle( - installed: &[PathBuf], - backups: &[(PathBuf, PathBuf)], - cause: String, -) -> Result<(), String> { - let mut rollback_errors = Vec::new(); - for target in installed.iter().rev() { - if let Err(error) = fs::remove_file(target) { - if error.kind() != std::io::ErrorKind::NotFound { - rollback_errors.push(format!("remove {}: {error}", target.display())); - } - } - } - for (backup, target) in backups.iter().rev() { - if let Err(error) = fs::rename(backup, target) { - rollback_errors.push(format!( - "restore {} to {}: {error}", - backup.display(), - target.display() - )); - } - } - if rollback_errors.is_empty() { - Err(cause) - } else { - Err(format!( - "{cause}; rollback also failed: {}", - rollback_errors.join("; ") - )) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - fn temp_root(label: &str) -> PathBuf { - std::env::temp_dir().join(format!("blacksite-fbx-{label}-{}", uuid::Uuid::new_v4())) - } - - fn committed_chair_bytes() -> Vec { - fs::read( - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../assets/models/painted_wooden_chair_02_2k.fbx"), - ) - .unwrap() - } - - fn replace_equal_length(bytes: &mut [u8], from: &[u8], to: &[u8]) -> usize { - assert_eq!(from.len(), to.len()); - let mut count = 0; - let mut offset = 0; - while let Some(index) = bytes[offset..] - .windows(from.len()) - .position(|window| window == from) - { - let start = offset + index; - bytes[start..start + from.len()].copy_from_slice(to); - offset = start + from.len(); - count += 1; - } - count - } - - fn write_textures(root: &Path, folder: &str) { - let folder = root.join(folder); - fs::create_dir_all(&folder).unwrap(); - for name in [ - "painted_wooden_chair_02_diff_2k.jpg", - "painted_wooden_chair_02_nor_gl_2k.exr", - "painted_wooden_chair_02_rough_2k.exr", - ] { - fs::write(folder.join(name), name.as_bytes()).unwrap(); - } - } - - #[test] - fn committed_chair_reports_one_stable_missing_dependency_state() { - let path = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../assets/models/painted_wooden_chair_02_2k.fbx"); - - let error = validate_fbx_dependencies(&path).unwrap_err(); - - assert!(error.starts_with("missing 3 FBX source texture(s):")); - assert_eq!(error.matches("painted_wooden_chair_02_").count(), 3); - } - - #[test] - fn sibling_texture_bundle_is_copied_with_relative_layout() { - let root = temp_root("sibling"); - let source_root = root.join("source"); - let destination = root.join("destination"); - fs::create_dir_all(&source_root).unwrap(); - let source = source_root.join("chair.fbx"); - fs::write(&source, committed_chair_bytes()).unwrap(); - write_textures(&source_root, "textures"); - - copy_fbx_bundle(&source, &destination).unwrap(); - - assert!(destination.join("chair.fbx").is_file()); - assert!(destination - .join("textures/painted_wooden_chair_02_diff_2k.jpg") - .is_file()); - assert!(!destination.read_dir().unwrap().any(|entry| entry - .unwrap() - .file_name() - .to_string_lossy() - .starts_with(".blacksite-import-"))); - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn fbm_texture_bundle_is_copied_with_relative_layout() { - let root = temp_root("fbm"); - let source_root = root.join("source"); - let destination = root.join("destination"); - fs::create_dir_all(&source_root).unwrap(); - let source = source_root.join("chair.fbx"); - let mut bytes = committed_chair_bytes(); - assert!(replace_equal_length(&mut bytes, b"textures/", b"test.fbm/") > 0); - fs::write(&source, bytes).unwrap(); - write_textures(&source_root, "test.fbm"); - - copy_fbx_bundle(&source, &destination).unwrap(); - - assert!(destination - .join("test.fbm/painted_wooden_chair_02_diff_2k.jpg") - .is_file()); - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn traversal_reference_is_rejected_before_destination_changes() { - let root = temp_root("traversal"); - let source_root = root.join("source"); - let destination = root.join("destination"); - fs::create_dir_all(&source_root).unwrap(); - fs::create_dir_all(&destination).unwrap(); - let source = source_root.join("chair.fbx"); - let mut bytes = committed_chair_bytes(); - assert!(replace_equal_length(&mut bytes, b"textures/", b"../evil//") > 0); - fs::write(&source, bytes).unwrap(); - fs::write(destination.join("chair.fbx"), b"original").unwrap(); - - let error = copy_fbx_bundle(&source, &destination).unwrap_err(); - - assert!(error.contains("parent traversal")); - assert_eq!( - fs::read(destination.join("chair.fbx")).unwrap(), - b"original" - ); - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn missing_bundle_preserves_existing_destination() { - let root = temp_root("missing"); - let source_root = root.join("source"); - let destination = root.join("destination"); - fs::create_dir_all(&source_root).unwrap(); - fs::create_dir_all(&destination).unwrap(); - let source = source_root.join("chair.fbx"); - fs::write(&source, committed_chair_bytes()).unwrap(); - fs::write(destination.join("chair.fbx"), b"original").unwrap(); - - let error = copy_fbx_bundle(&source, &destination).unwrap_err(); - - assert!(error.contains("missing 3 required texture(s)")); - assert_eq!( - fs::read(destination.join("chair.fbx")).unwrap(), - b"original" - ); - fs::remove_dir_all(root).unwrap(); - } - - #[cfg(unix)] - #[test] - fn destination_symlink_escape_is_rejected_before_external_changes() { - use std::os::unix::fs::symlink; - - let root = temp_root("destination-symlink"); - let source_root = root.join("source"); - let destination = root.join("destination"); - let outside = root.join("outside"); - fs::create_dir_all(&source_root).unwrap(); - fs::create_dir_all(&destination).unwrap(); - fs::create_dir_all(&outside).unwrap(); - let source = source_root.join("chair.fbx"); - fs::write(&source, committed_chair_bytes()).unwrap(); - write_textures(&source_root, "textures"); - symlink(&outside, destination.join("textures")).unwrap(); - - let error = copy_fbx_bundle(&source, &destination).unwrap_err(); - - assert!(error.contains("symbolic link")); - assert!(!destination.join("chair.fbx").exists()); - assert!(!outside.join("painted_wooden_chair_02_diff_2k.jpg").exists()); - fs::remove_dir_all(root).unwrap(); - } -} +pub use content_pipeline::{ + extract_gltf_materials, find_matching_extracted_material, plan_fbx_material_extraction, + plan_gltf_material_extraction, plan_model_material_extraction, validate_fbx_dependencies, + ExtractedGltfMaterial, PlannedGltfMaterial, +}; diff --git a/crates/editor/src/assets/materials.rs b/crates/editor/src/assets/materials.rs index ccb9d87..7df3117 100644 --- a/crates/editor/src/assets/materials.rs +++ b/crates/editor/src/assets/materials.rs @@ -3,8 +3,7 @@ use bevy::prelude::*; use bevy_egui::egui; use shared::{ - ComponentInstanceId, LevelObject, MaterialAsset, MaterialDesc, MaterialRef, - RendererMaterialSlot, + ComponentInstanceId, LevelObject, MaterialAsset, MaterialDesc, MaterialRef, MaterialSlot, }; use crate::assets::{EditorAsset, EditorAssetKind, EditorAssets}; @@ -92,6 +91,22 @@ pub fn apply_material_asset_to_selection( renderer_changes += 1; continue; } + if let Some(mut primitive) = world.get::(entity).cloned() { + primitive.surface.material = Some(material_ref.clone()); + reflected_component_transaction( + world, + entity, + "Assign Primitive Material", + shared::AUTHORING_COMPONENT_PRIMITIVE, + shared::COMPONENT_PRIMITIVE, + move |world, entity| { + world.entity_mut(entity).insert(primitive); + Ok(()) + }, + )?; + renderer_changes += 1; + continue; + } if let Some(desc) = desc.as_ref() { legacy_changes.push((entity, desc.clone())); } @@ -117,10 +132,9 @@ pub(crate) fn ensure_static_material_slots(renderer: &mut shared::StaticMeshRend }; } if renderer.materials.slot(&part.material_slot_id).is_none() { - renderer.materials.slots.push(RendererMaterialSlot { + renderer.materials.slots.push(MaterialSlot { id: part.material_slot_id.clone(), name: part.name.clone(), - source_material: part.material.clone().map(MaterialRef::new), material: None, }); } diff --git a/crates/editor/src/assets/mod.rs b/crates/editor/src/assets/mod.rs index 48ca69d..4516997 100644 --- a/crates/editor/src/assets/mod.rs +++ b/crates/editor/src/assets/mod.rs @@ -12,26 +12,18 @@ pub mod static_mesh; pub mod thumbnails; pub use catalog::*; +pub use import::{ + extract_gltf_materials, find_matching_extracted_material, plan_fbx_material_extraction, + plan_gltf_material_extraction, plan_model_material_extraction, ExtractedGltfMaterial, + PlannedGltfMaterial, +}; pub use thumbnails::{ - draw_asset_cell_with, gltf_skinned_primitive_labels, invalidate_on_catalog_refresh, kind_icon, - prefetch_asset_thumbnails, prefetch_folder_thumbnails, AssetThumbnailCache, + gltf_skinned_primitive_labels, invalidate_on_catalog_refresh, kind_icon, + prefetch_asset_thumbnails, prefetch_folder_thumbnails, retry_thumbnail, AssetThumbnailCache, ThumbnailCacheSnapshot, ThumbnailState, ThumbnailStudio, ThumbnailsPlugin, }; -/// Refreshes both generated contracts derived from one imported model source. -pub fn refresh_model_artifacts( - record: &mut asset_db::AssetRecord, -) -> Result { - let static_mesh = static_mesh::refresh_static_mesh_artifact(record); - let animation = animation::refresh_animation_artifact(record); - match (static_mesh, animation) { - (Ok(static_mesh), Ok(_)) => Ok(static_mesh), - (Err(static_error), Ok(_)) => Err(format!("static mesh processor failed: {static_error}")), - (Ok(_), Err(animation_error)) => { - Err(format!("animation processor failed: {animation_error}")) - } - (Err(static_error), Err(animation_error)) => Err(format!( - "static mesh processor failed: {static_error}; animation processor failed: {animation_error}" - )), - } -} +pub use content_pipeline::{ + plan_model_artifacts, plan_model_artifacts_at, publish_model_artifacts, + refresh_model_artifacts, PlannedModelArtifacts, +}; diff --git a/crates/editor/src/assets/operators.rs b/crates/editor/src/assets/operators.rs index 1f4129d..83f3f8a 100644 --- a/crates/editor/src/assets/operators.rs +++ b/crates/editor/src/assets/operators.rs @@ -263,12 +263,12 @@ mod tests { id: asset_id, path: model_path.clone(), label: "Operator Fixture".into(), - kind_tag: "Model".into(), + kind: shared::AssetKind::Model, source_fingerprint: None, - import_settings: ImportSettings { + import_settings: shared::AssetImportSettings::Model(ImportSettings { animation_manifest_path: Some(path.to_string_lossy().into_owned()), ..Default::default() - }, + }), dependencies: Vec::new(), }; let selection = AssetSelection::SubAsset { @@ -313,6 +313,7 @@ mod tests { world.insert_resource(AssetRegistry { records: vec![record], index_dirty: false, + ..Default::default() }); let harness = OperatorInvariantHarness::capture(&mut world); @@ -351,12 +352,13 @@ mod tests { id: AssetId::new(), path: path.clone(), label: "Impact".into(), - kind_tag: "AudioClip".into(), + kind: shared::AssetKind::AudioClip, source_fingerprint: None, import_settings: Default::default(), dependencies: Vec::new(), }], index_dirty: false, + ..Default::default() }); let entity = world .spawn(( @@ -398,6 +400,7 @@ mod tests { world.insert_resource(AssetRegistry { records: vec![record], index_dirty: false, + ..Default::default() }); let entity = world .spawn(( @@ -483,13 +486,14 @@ mod tests { let fixture = shared::MaterialAsset { schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, label: "Concrete".into(), - shader: None, + shader: shared::ShaderRefDesc::default(), shader_ref: None, render_state: Default::default(), - material: MaterialDesc { + provenance: None, + inputs: shared::MaterialInputSet::from_material_desc(&MaterialDesc { roughness: 0.85, ..Default::default() - }, + }), }; std::fs::write( &material_path, @@ -502,12 +506,13 @@ mod tests { id: AssetId::new(), path: material_path.clone(), label: "Concrete".into(), - kind_tag: "Material".into(), + kind: shared::AssetKind::Material, source_fingerprint: None, import_settings: Default::default(), dependencies: Vec::new(), }], index_dirty: false, + ..Default::default() }); let first = world.spawn((LevelObject, MaterialDesc::default())).id(); let second = world.spawn((LevelObject, MaterialDesc::default())).id(); diff --git a/crates/editor/src/assets/static_mesh.rs b/crates/editor/src/assets/static_mesh.rs index 32bece9..97eaabc 100644 --- a/crates/editor/src/assets/static_mesh.rs +++ b/crates/editor/src/assets/static_mesh.rs @@ -1,855 +1,3 @@ -//! Normalized static mesh artifacts generated from model source files. +//! Compatibility re-exports for UI-independent static-mesh artifact processing. -use std::fs; -use std::path::Path; - -use bevy::gltf::GltfAssetLabel; -use bevy::prelude::*; -use bevy_ufbx::label::FbxAssetLabel; -use bevy_ufbx::mesh::group_faces_by_material; -use bevy_ufbx::texture::external_texture_paths; -use bevy_ufbx::utils::convert_matrix; -use serde::{Deserialize, Serialize}; - -use crate::asset_db::{ - AssetRecord, ImportSettings, MaterialImportPolicy, ModelHierarchyMode, ModelPlacementMode, -}; -use shared::{ - AssetSourceFingerprint, ComponentInstanceId, EditorAssetRef, MaterialRef, RendererMaterialSet, - RendererMaterialSlot, StaticMeshRenderer, StaticMeshRendererEntry, -}; - -use crate::assets::fingerprint::{fingerprint_file, write_pretty_ron_if_changed}; - -pub const STATIC_MESH_MANIFEST_SCHEMA: u32 = 4; -pub const STATIC_MESH_ARTIFACT_DIR: &str = "assets/meshes/generated"; - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct StaticMeshManifest { - pub schema_version: u32, - pub asset_id: String, - pub label: String, - pub source: StaticMeshSource, - pub import: StaticMeshImportSnapshot, - pub metadata: StaticMeshMetadata, - pub parts: Vec, - pub warnings: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct StaticMeshSource { - pub path: String, - pub format: String, - pub fingerprint: StaticMeshSourceFingerprint, - pub dependencies: Vec, -} - -pub type StaticMeshSourceFingerprint = AssetSourceFingerprint; - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct StaticMeshImportSnapshot { - pub scale: f32, - pub generate_collider: bool, - pub lod0_only: bool, - pub placement_mode: ModelPlacementMode, - pub hierarchy_mode: ModelHierarchyMode, - pub material_policy: MaterialImportPolicy, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct StaticMeshMetadata { - pub mesh_count: usize, - pub material_count: usize, - pub node_count: usize, - pub animation_count: usize, - pub skin_count: usize, - pub light_count: usize, - pub camera_count: usize, -} - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct StaticMeshPart { - #[serde(default)] - pub id: String, - pub name: String, - pub mesh_label: String, - #[serde(default)] - pub material_id: Option, - pub material_slot_name: String, - pub material_label: Option, - pub local_transform: Transform, - pub source_node: Option, - pub source_mesh: Option, - pub source_material: Option, - /// Whether the source primitive is bound to a skin and therefore must never become a static - /// renderer slot. - #[serde(default)] - pub skinned: bool, -} - -pub fn static_mesh_manifest_path(asset_id: &str) -> String { - format!("{STATIC_MESH_ARTIFACT_DIR}/{asset_id}.static_mesh.ron") -} - -pub fn part_id_from_label(label: &str) -> String { - format!("mesh:{}", stable_sub_asset_slug(label)) -} - -pub fn material_id_from_label(label: &str) -> String { - format!("material:{}", stable_sub_asset_slug(label)) -} - -fn gltf_draw_id(node_index: Option, mesh_index: usize, primitive_index: usize) -> String { - let node = node_index - .map(|index| index.to_string()) - .unwrap_or_else(|| "unbound".into()); - format!("draw:scene0:node{node}:mesh{mesh_index}:primitive{primitive_index}") -} - -fn fbx_draw_id(node_index: usize, material_index: usize) -> String { - format!("draw:scene0:node{node_index}:material{material_index}") -} - -fn stable_sub_asset_slug(label: &str) -> String { - let mut slug = String::new(); - for ch in label.chars() { - if ch.is_ascii_alphanumeric() { - slug.push(ch.to_ascii_lowercase()); - } else if !slug.ends_with('_') { - slug.push('_'); - } - } - slug.trim_matches('_').to_string() -} - -pub fn refresh_static_mesh_artifact( - record: &mut AssetRecord, -) -> Result { - let mut manifest = build_static_mesh_manifest(record)?; - let path = static_mesh_manifest_path(&record.id.as_string()); - record.import_settings.static_mesh_manifest_path = Some(path.clone()); - manifest.source.dependencies.sort(); - manifest.source.dependencies.dedup(); - record.dependencies = manifest.source.dependencies.clone(); - - if write_pretty_ron_if_changed(&path, &manifest) - .map_err(|error| format!("could not publish static mesh manifest {path}: {error}"))? - { - info!( - "Static mesh manifest refreshed: source={} artifact={} parts={}", - record.path, - path, - manifest.parts.len() - ); - } - - Ok(manifest) -} - -pub fn load_static_mesh_manifest(path: &str) -> Result { - let text = fs::read_to_string(path).map_err(|err| format!("could not read {path}: {err}"))?; - ron::from_str(&text).map_err(|err| format!("could not parse {path}: {err}")) -} - -pub fn renderer_from_manifest( - manifest: &StaticMeshManifest, - settings: &ImportSettings, -) -> StaticMeshRenderer { - let use_source_materials = matches!( - settings.material_policy, - MaterialImportPolicy::SourceMaterials - ); - - let parts: Vec<_> = manifest - .parts - .iter() - .filter(|part| !part.skinned && manifest.metadata.animation_count == 0) - .map(|part| StaticMeshRendererEntry { - id: ComponentInstanceId::new(part_effective_id(part)), - name: part.name.clone(), - mesh: EditorAssetRef::new( - manifest.asset_id.clone(), - part_effective_id(part), - part.name.clone(), - ), - material_slot_id: ComponentInstanceId::new(material_slot_id(part)), - material: use_source_materials - .then(|| { - part_effective_material_id(part).map(|id| { - EditorAssetRef::new( - manifest.asset_id.clone(), - id, - part.material_slot_name.clone(), - ) - }) - }) - .flatten(), - local_transform: part.local_transform, - visible: true, - cast_shadows: true, - receive_shadows: true, - }) - .collect(); - let materials = RendererMaterialSet { - slots: manifest - .parts - .iter() - .filter(|part| !part.skinned && manifest.metadata.animation_count == 0) - .map(|part| RendererMaterialSlot { - id: ComponentInstanceId::new(material_slot_id(part)), - name: part.material_slot_name.clone(), - source_material: use_source_materials - .then(|| { - part_effective_material_id(part).map(|id| { - MaterialRef::new(EditorAssetRef::new( - manifest.asset_id.clone(), - id, - part.material_slot_name.clone(), - )) - }) - }) - .flatten(), - material: None, - }) - .collect(), - orphaned_assignments: Vec::new(), - }; - - StaticMeshRenderer { - slots: parts, - materials, - } -} - -/// Builds the shared material slots for a full imported hierarchy. Unlike static renderer -/// construction this intentionally includes skin-bound and rigid animated draw bindings. -pub fn renderer_materials_from_manifest( - manifest: &StaticMeshManifest, - settings: &ImportSettings, -) -> RendererMaterialSet { - let use_source_materials = matches!( - settings.material_policy, - MaterialImportPolicy::SourceMaterials - ); - RendererMaterialSet { - slots: manifest - .parts - .iter() - .map(|part| RendererMaterialSlot { - id: ComponentInstanceId::new(material_slot_id(part)), - name: part.material_slot_name.clone(), - source_material: use_source_materials - .then(|| { - part_effective_material_id(part).map(|id| { - MaterialRef::new(EditorAssetRef::new( - manifest.asset_id.clone(), - id, - part.material_slot_name.clone(), - )) - }) - }) - .flatten(), - material: None, - }) - .collect(), - orphaned_assignments: Vec::new(), - } -} - -fn material_slot_id(part: &StaticMeshPart) -> String { - format!("slot:{}", part_effective_id(part)) -} - -fn part_effective_id(part: &StaticMeshPart) -> String { - if part.id.trim().is_empty() { - part_id_from_label(&part.mesh_label) - } else { - part.id.clone() - } -} - -fn part_effective_material_id(part: &StaticMeshPart) -> Option { - part.material_id.clone().or_else(|| { - part.material_label - .as_ref() - .map(|label| material_id_from_label(label)) - }) -} - -fn build_static_mesh_manifest(record: &AssetRecord) -> Result { - let format = source_format(&record.path)?; - let fingerprint = fingerprint_file(&record.path)?; - let import = StaticMeshImportSnapshot { - scale: record.import_settings.scale, - generate_collider: record.import_settings.generate_collider, - lod0_only: record.import_settings.lod0_only, - placement_mode: record.import_settings.placement_mode, - hierarchy_mode: record.import_settings.hierarchy_mode, - material_policy: record.import_settings.material_policy, - }; - - let mut manifest = match format.as_str() { - "gltf" | "glb" => build_gltf_manifest(record, format, fingerprint, import)?, - "fbx" => build_fbx_manifest(record, format, fingerprint, import)?, - _ => return Err(format!("unsupported static mesh source format `{format}`")), - }; - - if manifest.parts.is_empty() { - manifest - .warnings - .push("No renderable static mesh parts were found.".into()); - } - - Ok(manifest) -} - -fn build_gltf_manifest( - record: &AssetRecord, - format: String, - fingerprint: StaticMeshSourceFingerprint, - import: StaticMeshImportSnapshot, -) -> Result { - let gltf = gltf::Gltf::open(&record.path) - .map_err(|err| format!("could not parse glTF {}: {err}", record.path))?; - let mut parts = Vec::new(); - let mut dependencies = Vec::new(); - let mut warnings = Vec::new(); - - for buffer in gltf.document.buffers() { - if let gltf::buffer::Source::Uri(uri) = buffer.source() { - dependencies.push(resolve_dependency(&record.path, uri)); - } - } - for image in gltf.document.images() { - if let gltf::image::Source::Uri { uri, .. } = image.source() { - dependencies.push(resolve_dependency(&record.path, uri)); - } - } - - if let Some(scene) = gltf - .document - .default_scene() - .or_else(|| gltf.document.scenes().next()) - { - for node in scene.nodes() { - collect_gltf_node_parts(node, Mat4::IDENTITY, "", &mut parts); - } - } else { - for mesh in gltf.document.meshes() { - collect_gltf_mesh_parts(None, None, None, mesh, Mat4::IDENTITY, false, &mut parts); - } - } - - if gltf.document.animations().count() > 0 { - warnings.push( - "Animations are recorded as metadata; animated placement uses SkinnedMeshRenderer." - .into(), - ); - } - if gltf.document.skins().count() > 0 { - warnings.push( - "Skinned primitives are excluded from StaticMeshRenderer and use SkinnedMeshRenderer." - .into(), - ); - } - - parts.sort_by(|a, b| a.mesh_label.cmp(&b.mesh_label).then(a.name.cmp(&b.name))); - - Ok(StaticMeshManifest { - schema_version: STATIC_MESH_MANIFEST_SCHEMA, - asset_id: record.id.as_string(), - label: record.label.clone(), - source: StaticMeshSource { - path: record.path.clone(), - format, - fingerprint, - dependencies, - }, - import, - metadata: StaticMeshMetadata { - mesh_count: gltf.document.meshes().count(), - material_count: gltf.document.materials().count(), - node_count: gltf.document.nodes().count(), - animation_count: gltf.document.animations().count(), - skin_count: gltf.document.skins().count(), - light_count: 0, - camera_count: gltf.document.cameras().count(), - }, - parts, - warnings, - }) -} - -fn collect_gltf_node_parts( - node: gltf::Node<'_>, - parent_transform: Mat4, - parent_path: &str, - parts: &mut Vec, -) { - let local = Mat4::from_cols_array_2d(&node.transform().matrix()); - let world_transform = parent_transform * local; - let segment = node - .name() - .map(str::to_string) - .unwrap_or_else(|| format!("Node{}", node.index())); - let node_path = if parent_path.is_empty() { - segment - } else { - format!("{parent_path}/{segment}") - }; - let skinned = node.skin().is_some(); - if let Some(mesh) = node.mesh() { - collect_gltf_mesh_parts( - node.name().map(str::to_string), - Some(node.index()), - Some(node_path.clone()), - mesh, - world_transform, - skinned, - parts, - ); - } - for child in node.children() { - collect_gltf_node_parts(child, world_transform, &node_path, parts); - } -} - -fn collect_gltf_mesh_parts( - node_name: Option, - node_index: Option, - node_path: Option, - mesh: gltf::Mesh<'_>, - transform: Mat4, - skinned: bool, - parts: &mut Vec, -) { - let mesh_index = mesh.index(); - let mesh_name = mesh.name().map(str::to_string); - for primitive in mesh.primitives() { - let primitive_index = primitive.index(); - let mesh_label = GltfAssetLabel::Primitive { - mesh: mesh_index, - primitive: primitive_index, - } - .to_string(); - let material = primitive.material(); - let material_label = material - .index() - .map(|index| { - GltfAssetLabel::Material { - index, - is_scale_inverted: false, - } - .to_string() - }) - .or_else(|| Some(GltfAssetLabel::DefaultMaterial.to_string())); - let material_name = material - .name() - .map(str::to_string) - .unwrap_or_else(|| "Default Material".into()); - let name = node_name - .clone() - .or_else(|| mesh_name.clone()) - .unwrap_or_else(|| format!("Mesh {mesh_index}")); - let source_node = node_path - .clone() - .or_else(|| node_index.map(|index| format!("Node{index}"))); - parts.push(StaticMeshPart { - id: gltf_draw_id(node_index, mesh_index, primitive_index), - name: format!("{name} / Primitive {primitive_index}"), - material_id: material_label - .as_ref() - .map(|label| material_id_from_label(label)), - mesh_label, - material_slot_name: material_name.clone(), - material_label, - local_transform: Transform::from_matrix(transform), - source_node, - source_mesh: Some(format!("Mesh{mesh_index}")), - source_material: Some(material_name), - skinned, - }); - } -} - -fn build_fbx_manifest( - record: &AssetRecord, - format: String, - fingerprint: StaticMeshSourceFingerprint, - import: StaticMeshImportSnapshot, -) -> Result { - let bytes = - fs::read(&record.path).map_err(|err| format!("could not read {}: {err}", record.path))?; - let scene = ufbx::load_memory( - &bytes, - ufbx::LoadOpts { - target_unit_meters: 1.0, - target_axes: ufbx::CoordinateAxes::right_handed_y_up(), - filename: ufbx::StringOpt::Ref(&record.path), - ..Default::default() - }, - ) - .map_err(|err| format!("could not parse FBX {}: {err:?}", record.path))?; - - let mut parts = Vec::new(); - let mut warnings = Vec::new(); - for (node_index, node) in scene.nodes.as_ref().iter().enumerate() { - let Some(mesh_ref) = node.mesh.as_ref() else { - continue; - }; - let mesh = mesh_ref.as_ref(); - if mesh.num_vertices == 0 || mesh.faces.as_ref().is_empty() { - continue; - } - let skinned = !mesh.skin_deformers.as_ref().is_empty(); - - let mut groups: Vec<(usize, Vec)> = - group_faces_by_material(mesh).into_iter().collect(); - groups.sort_by_key(|(material_index, _)| *material_index); - for (material_index, indices) in groups { - if indices.is_empty() { - continue; - } - let material = mesh.materials.get(material_index).map(|mat| mat.as_ref()); - let material_label = material - .and_then(|mat| fbx_material_label(&scene, mat.element.element_id)) - .or_else(|| Some(FbxAssetLabel::DefaultMaterial.to_string())); - let material_name = material - .map(|mat| mat.element.name.to_string()) - .filter(|name| !name.is_empty()) - .unwrap_or_else(|| "Default Material".into()); - let node_name = if node.element.name.is_empty() { - format!("Node {node_index}") - } else { - node.element.name.to_string() - }; - let mesh_label = FbxAssetLabel::Mesh(node_index * 1000 + material_index).to_string(); - parts.push(StaticMeshPart { - id: fbx_draw_id(node_index, material_index), - name: format!("{node_name} / Material {material_index}"), - material_id: material_label - .as_ref() - .map(|label| material_id_from_label(label)), - mesh_label, - material_slot_name: material_name.clone(), - material_label, - local_transform: Transform::from_matrix(convert_matrix(&node.geometry_to_world)), - source_node: Some(format!("Node{node_index}")), - source_mesh: Some(format!("Mesh{node_index}")), - source_material: Some(material_name), - skinned, - }); - } - } - - if !scene.anim_stacks.as_ref().is_empty() { - warnings.push( - "Animations are recorded as metadata; animated placement uses SkinnedMeshRenderer." - .into(), - ); - } - if !scene.skin_deformers.as_ref().is_empty() { - warnings.push( - "Skinned primitives are excluded from StaticMeshRenderer and use SkinnedMeshRenderer." - .into(), - ); - } - - parts.sort_by(|a, b| a.mesh_label.cmp(&b.mesh_label).then(a.name.cmp(&b.name))); - - Ok(StaticMeshManifest { - schema_version: STATIC_MESH_MANIFEST_SCHEMA, - asset_id: record.id.as_string(), - label: record.label.clone(), - source: StaticMeshSource { - path: record.path.clone(), - format, - fingerprint, - dependencies: fbx_dependencies(&record.path, &scene)?, - }, - import, - metadata: StaticMeshMetadata { - mesh_count: scene.meshes.as_ref().len(), - material_count: scene.materials.as_ref().len(), - node_count: scene.nodes.as_ref().len(), - animation_count: scene.anim_stacks.as_ref().len(), - skin_count: scene.skin_deformers.as_ref().len(), - light_count: scene.lights.as_ref().len(), - camera_count: scene.cameras.as_ref().len(), - }, - parts, - warnings, - }) -} - -fn fbx_material_label(scene: &ufbx::Scene, element_id: u32) -> Option { - if element_id == 0 { - return None; - } - scene - .materials - .as_ref() - .iter() - .position(|material| material.element.element_id == element_id) - .map(|index| FbxAssetLabel::Material(index).to_string()) -} - -fn fbx_dependencies(source_path: &str, scene: &ufbx::Scene) -> Result, String> { - let path = Path::new(source_path); - let parent = path.parent().unwrap_or_else(|| Path::new("")); - external_texture_paths(scene) - .map_err(|errors| { - format!( - "unsafe FBX texture reference(s) in {source_path}: {}", - errors - .into_iter() - .map(|error| error.to_string()) - .collect::>() - .join("; ") - ) - }) - .map(|paths| { - paths - .into_iter() - .map(|relative| parent.join(relative).to_string_lossy().replace('\\', "/")) - .collect() - }) -} - -fn source_format(path: &str) -> Result { - Path::new(path) - .extension() - .and_then(|ext| ext.to_str()) - .map(|ext| ext.to_ascii_lowercase()) - .ok_or_else(|| format!("asset path `{path}` has no extension")) -} - -fn resolve_dependency(source_path: &str, uri: &str) -> String { - if uri.starts_with("data:") || uri.contains("://") { - return uri.to_string(); - } - Path::new(source_path) - .parent() - .unwrap_or_else(|| Path::new("")) - .join(uri) - .to_string_lossy() - .replace('\\', "/") -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::asset_db::AssetId; - - fn test_manifest() -> StaticMeshManifest { - StaticMeshManifest { - schema_version: STATIC_MESH_MANIFEST_SCHEMA, - asset_id: "asset-1".into(), - label: "Crate".into(), - source: StaticMeshSource { - path: "assets/models/crate.glb".into(), - format: "glb".into(), - fingerprint: StaticMeshSourceFingerprint { - byte_len: 42, - content_hash: "a".repeat(64), - }, - dependencies: Vec::new(), - }, - import: StaticMeshImportSnapshot { - scale: 1.0, - generate_collider: true, - lod0_only: true, - placement_mode: ModelPlacementMode::StaticAsset, - hierarchy_mode: ModelHierarchyMode::SingleActor, - material_policy: MaterialImportPolicy::SourceMaterials, - }, - metadata: StaticMeshMetadata { - mesh_count: 1, - material_count: 1, - node_count: 1, - animation_count: 0, - skin_count: 0, - light_count: 0, - camera_count: 0, - }, - parts: vec![StaticMeshPart { - id: "mesh:mesh0_primitive0".into(), - name: "Crate / Primitive 0".into(), - mesh_label: "Mesh0/Primitive0".into(), - material_id: Some("material:material0".into()), - material_slot_name: "Wood".into(), - material_label: Some("Material0".into()), - local_transform: Transform::from_xyz(1.0, 2.0, 3.0), - source_node: Some("Node0".into()), - source_mesh: Some("Mesh0".into()), - source_material: Some("Wood".into()), - skinned: false, - }], - warnings: Vec::new(), - } - } - - #[test] - fn static_mesh_manifest_path_uses_asset_id() { - assert_eq!( - static_mesh_manifest_path("abc"), - "assets/meshes/generated/abc.static_mesh.ron" - ); - } - - #[test] - fn renderer_from_manifest_preserves_labels_and_collider_policy() { - let manifest = test_manifest(); - let settings = ImportSettings { - generate_collider: true, - ..Default::default() - }; - - let renderer = renderer_from_manifest(&manifest, &settings); - - assert_eq!(renderer.slots.len(), 1); - let entry = &renderer.slots[0]; - assert_eq!(entry.mesh.asset_id, manifest.asset_id); - assert_eq!(entry.mesh.sub_asset_id, "mesh:mesh0_primitive0"); - assert_eq!( - entry - .material - .as_ref() - .map(|material| material.sub_asset_id.as_str()), - Some("material:material0") - ); - } - - #[test] - fn schema_v3_manifest_without_hash_migrates_to_content_fingerprint() { - let root = std::env::temp_dir().join(format!( - "blacksite-static-mesh-legacy-{}", - uuid::Uuid::new_v4() - )); - fs::create_dir_all(&root).unwrap(); - let path = root.join("legacy.static_mesh.ron"); - let expected = test_manifest(); - let canonical = - ron::ser::to_string_pretty(&expected, ron::ser::PrettyConfig::default()).unwrap(); - let legacy = canonical - .replacen("schema_version: 4", "schema_version: 3", 1) - .lines() - .filter(|line| !line.contains("content_hash:")) - .collect::>() - .join("\n"); - fs::write(&path, legacy).unwrap(); - - assert!(write_pretty_ron_if_changed(&path, &expected).unwrap()); - assert_eq!( - load_static_mesh_manifest(&path.to_string_lossy()).unwrap(), - expected - ); - - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn equivalent_static_manifest_preserves_existing_formatting_and_newline() { - let root = std::env::temp_dir().join(format!( - "blacksite-static-mesh-semantic-{}", - uuid::Uuid::new_v4() - )); - fs::create_dir_all(&root).unwrap(); - let path = root.join("stable.static_mesh.ron"); - let manifest = test_manifest(); - let exact = format!( - "{}\n\n", - ron::ser::to_string_pretty(&manifest, ron::ser::PrettyConfig::default()).unwrap() - ); - fs::write(&path, &exact).unwrap(); - - assert!(!write_pretty_ron_if_changed(&path, &manifest).unwrap()); - assert_eq!(fs::read_to_string(&path).unwrap(), exact); - - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn renderer_from_manifest_can_ignore_source_materials() { - let manifest = test_manifest(); - let settings = ImportSettings { - material_policy: MaterialImportPolicy::AuthoringOverride, - ..Default::default() - }; - - let renderer = renderer_from_manifest(&manifest, &settings); - - assert!(renderer.slots[0].material.is_none()); - } - - #[test] - fn renderer_from_manifest_excludes_skinned_primitives() { - let mut manifest = test_manifest(); - manifest.parts[0].skinned = true; - - let renderer = renderer_from_manifest(&manifest, &ImportSettings::default()); - - assert!(renderer.slots.is_empty()); - } - - #[test] - fn renderer_from_manifest_excludes_node_animated_geometry() { - let mut manifest = test_manifest(); - manifest.metadata.animation_count = 1; - - let renderer = renderer_from_manifest(&manifest, &ImportSettings::default()); - - assert!(renderer.slots.is_empty()); - } - - #[test] - fn committed_rigged_fixture_never_builds_static_renderer_slots() { - let path = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../assets/models/robot_expressive.glb") - .to_string_lossy() - .into_owned(); - let record = AssetRecord { - id: AssetId::new(), - path, - label: "Robot Expressive".into(), - kind_tag: "Model".into(), - source_fingerprint: None, - import_settings: ImportSettings::default(), - dependencies: Vec::new(), - }; - - let manifest = build_static_mesh_manifest(&record).unwrap(); - let renderer = renderer_from_manifest(&manifest, &record.import_settings); - - assert!(manifest.metadata.skin_count > 0); - assert!(manifest.metadata.animation_count > 0); - assert!(manifest.parts.iter().any(|part| part.skinned)); - assert!(renderer.slots.is_empty()); - } - - #[test] - fn committed_fbx_records_sibling_texture_dependencies() { - let path = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("../../assets/models/painted_wooden_chair_02_2k.fbx") - .to_string_lossy() - .into_owned(); - let record = AssetRecord { - id: AssetId::new(), - path, - label: "Painted Chair".into(), - kind_tag: "Model".into(), - source_fingerprint: None, - import_settings: ImportSettings::default(), - dependencies: Vec::new(), - }; - - let manifest = build_static_mesh_manifest(&record).unwrap(); - - assert_eq!(manifest.source.dependencies.len(), 3); - assert!(manifest - .source - .dependencies - .iter() - .all(|path| path.contains("assets/models/textures/painted_wooden_chair_02_"))); - } -} +pub use content_pipeline::static_mesh::*; diff --git a/crates/editor/src/assets/thumbnails/cache.rs b/crates/editor/src/assets/thumbnails/cache.rs index 66fbd60..836aed6 100644 --- a/crates/editor/src/assets/thumbnails/cache.rs +++ b/crates/editor/src/assets/thumbnails/cache.rs @@ -3,12 +3,12 @@ use std::collections::{HashMap, HashSet}; use std::path::Path; -use bevy::asset::LoadState; +use bevy::asset::{AssetId, LoadState}; use bevy::prelude::*; use bevy_egui::{egui, EguiPrimaryContextPass, EguiTextureHandle, EguiUserTextures}; use egui_phosphor_icons::icons; -use super::sources::gltf::{gltf_base_color_texture_path, validate_gltf_dependencies}; +use super::sources::gltf::validate_gltf_dependencies; use super::studio::{model_file_exists, ThumbnailStudio}; use super::ThumbnailJobSource; use crate::assets::{ @@ -31,6 +31,7 @@ struct ThumbnailFailure { #[derive(Resource, Default)] pub struct AssetThumbnailCache { pub texture_ids: HashMap, + registered_images: HashMap>, pending: HashMap>, pub(crate) studio_pending: HashSet, failed: HashMap, @@ -64,11 +65,15 @@ impl AssetThumbnailCache { None } - pub fn retry(&mut self, key: &str) { + /// Clears one thumbnail and returns the image registration when this key was its last owner. + /// The caller must remove that registration from `EguiUserTextures` after releasing the cache + /// borrow. + pub fn retry(&mut self, key: &str) -> Option> { self.failed.remove(key); self.pending.remove(key); self.studio_pending.remove(key); self.texture_ids.remove(key); + self.release_registered_image(key) } pub fn request_texture(&mut self, key: String, path: String, asset_server: &AssetServer) { @@ -88,13 +93,7 @@ impl AssetThumbnailCache { self.pending.insert(key, handle); } - pub fn request_model( - &mut self, - key: String, - model_path: String, - asset_server: &AssetServer, - studio: &mut ThumbnailStudio, - ) { + pub fn request_model(&mut self, key: String, model_path: String, studio: &mut ThumbnailStudio) { if matches!( self.state(&key), Some(ThumbnailState::Ready | ThumbnailState::Pending) @@ -109,11 +108,6 @@ impl AssetThumbnailCache { return; } - if let Some(texture_path) = gltf_base_color_texture_path(&model_path) { - self.request_texture(key, texture_path, asset_server); - return; - } - if studio.enqueue(key.clone(), model_path) { self.studio_pending.insert(key); } @@ -263,10 +257,7 @@ impl AssetThumbnailCache { ) { self.studio_pending.remove(key); self.failed.remove(key); - let texture_id = textures - .image_id(&image) - .unwrap_or_else(|| textures.add_image(EguiTextureHandle::Strong(image))); - self.texture_ids.insert(key.to_string(), texture_id); + self.register_thumbnail(key, image, textures); } pub(crate) fn mark_studio_failed(&mut self, key: &str, reason: &str, retryable: bool) { @@ -281,12 +272,48 @@ impl AssetThumbnailCache { ); } - pub fn invalidate_all(&mut self) { + /// Invalidates every cache entry and returns each distinct Egui image registration exactly + /// once so the world-level invalidation path can relinquish GPU ownership. + pub fn invalidate_all(&mut self) -> Vec> { self.texture_ids.clear(); self.pending.clear(); self.studio_pending.clear(); self.failed.clear(); self.prefetched_folder = None; + self.registered_images + .drain() + .map(|(_, image)| image) + .collect::>() + .into_iter() + .collect() + } + + fn register_thumbnail( + &mut self, + key: &str, + image: Handle, + textures: &mut EguiUserTextures, + ) { + let image_id = image.id(); + if self.registered_images.get(key).copied() != Some(image_id) { + if let Some(previous) = self.release_registered_image(key) { + textures.remove_image(previous); + } + self.registered_images.insert(key.to_string(), image_id); + } + let texture_id = textures + .image_id(image_id) + .unwrap_or_else(|| textures.add_image(EguiTextureHandle::Strong(image))); + self.texture_ids.insert(key.to_string(), texture_id); + } + + fn release_registered_image(&mut self, key: &str) -> Option> { + let image = self.registered_images.remove(key)?; + (!self + .registered_images + .values() + .any(|registered| *registered == image)) + .then_some(image) } pub fn snapshot(&self) -> ThumbnailCacheSnapshot { @@ -335,10 +362,7 @@ fn register_loaded_thumbnails( for (key, handle) in ready { cache.pending.remove(&key); cache.failed.remove(&key); - let texture_id = textures - .image_id(&handle) - .unwrap_or_else(|| textures.add_image(EguiTextureHandle::Strong(handle))); - cache.texture_ids.insert(key, texture_id); + cache.register_thumbnail(&key, handle, &mut textures); } } @@ -359,99 +383,6 @@ pub fn kind_icon(kind: &EditorAssetKind) -> egui_phosphor_icons::Icon { } } -pub fn draw_asset_cell_with( - ui: &mut egui::Ui, - asset: &EditorAsset, - texture_id: Option, - pending: bool, - failed: Option<&str>, - selected: bool, - thumbnail_size: f32, -) -> egui::Response { - let thumb_size = thumbnail_size.clamp(48.0, 112.0); - let cell_size = egui::vec2(thumb_size + 20.0, thumb_size + 30.0); - let (rect, response) = ui.allocate_exact_size(cell_size, egui::Sense::click_and_drag()); - - let fill = if selected { - crate::ui::theme::SELECTION_BG_MUTED - } else if response.hovered() { - crate::ui::theme::ELEVATED_BG - } else { - crate::ui::theme::WIDGET_BG - }; - ui.painter().rect( - rect, - 4.0, - fill, - egui::Stroke::new( - 1.0, - if selected { - crate::ui::theme::ACCENT_HOVER - } else { - crate::ui::theme::BORDER - }, - ), - egui::StrokeKind::Inside, - ); - - let thumb_rect = egui::Rect::from_min_size( - rect.min + egui::vec2(10.0, 8.0), - egui::vec2(thumb_size, thumb_size), - ); - - if let Some(texture_id) = texture_id { - ui.painter().image( - texture_id, - thumb_rect, - egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)), - egui::Color32::WHITE, - ); - } else if pending { - ui.painter().text( - thumb_rect.center(), - egui::Align2::CENTER_CENTER, - icons::CIRCLE_NOTCH.as_str(), - egui::FontId::new(24.0, egui::FontFamily::Name("phosphor-regular".into())), - crate::ui::theme::TEXT_DIM, - ); - } else if failed.is_some() { - ui.painter().text( - thumb_rect.center(), - egui::Align2::CENTER_CENTER, - icons::WARNING_CIRCLE.as_str(), - egui::FontId::new(24.0, egui::FontFamily::Name("phosphor-regular".into())), - crate::ui::theme::TEXT_DIM, - ); - } else { - let icon = kind_icon(&asset.kind); - ui.painter().text( - thumb_rect.center(), - egui::Align2::CENTER_CENTER, - icon.as_str(), - egui::FontId::new(28.0, egui::FontFamily::Name("phosphor-regular".into())), - crate::ui::theme::TEXT, - ); - } - - ui.painter().text( - egui::pos2(rect.center().x, rect.max.y - 6.0), - egui::Align2::CENTER_BOTTOM, - asset.label.as_str(), - egui::FontId::new(11.0, egui::FontFamily::Proportional), - if selected { - crate::ui::theme::TEXT_SELECTED - } else { - crate::ui::theme::TEXT - }, - ); - - if let Some(reason) = failed { - response.on_hover_text(reason) - } else { - response - } -} - #[derive(Clone)] pub struct ThumbnailCacheSnapshot { pub texture_ids: HashMap, @@ -533,9 +464,7 @@ pub fn prefetch_folder_thumbnails(world: &mut World, folder: &str) { for (key, path, kind) in requests { match kind { EditorAssetKind::Texture => cache.request_texture(key, path, &asset_server), - EditorAssetKind::Model => { - cache.request_model(key, path, &asset_server, &mut studio) - } + EditorAssetKind::Model => cache.request_model(key, path, &mut studio), EditorAssetKind::Material => { cache.request_material_asset(key, path, &mut studio) } @@ -567,9 +496,7 @@ pub fn prefetch_asset_thumbnails(world: &mut World, assets: &[EditorAsset]) { for (key, path, kind) in requests { match kind { EditorAssetKind::Texture => cache.request_texture(key, path, &asset_server), - EditorAssetKind::Model => { - cache.request_model(key, path, &asset_server, &mut studio) - } + EditorAssetKind::Model => cache.request_model(key, path, &mut studio), EditorAssetKind::Material => { cache.request_material_asset(key, path, &mut studio) } @@ -580,8 +507,23 @@ pub fn prefetch_asset_thumbnails(world: &mut World, assets: &[EditorAsset]) { }); } +/// Evicts one thumbnail while releasing the backing Egui image if no other cache key shares it. +pub fn retry_thumbnail(world: &mut World, key: &str) { + let registration = world.resource_mut::().retry(key); + if let Some(registration) = registration { + if let Some(mut textures) = world.get_resource_mut::() { + textures.remove_image(registration); + } + } +} + pub fn invalidate_on_catalog_refresh(world: &mut World) { - world.resource_mut::().invalidate_all(); + let registrations = world.resource_mut::().invalidate_all(); + if let Some(mut textures) = world.get_resource_mut::() { + for registration in registrations { + textures.remove_image(registration); + } + } if !world.contains_resource::() { return; } @@ -644,4 +586,66 @@ mod tests { assert_eq!(reason, format!("missing texture: {path}")); assert!(cache.pending.is_empty()); } + + #[test] + fn poly_haven_desk_model_queues_geometry_instead_of_its_albedo_texture() { + let model_path = Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../assets/Furniture/Office/metal_office_desk_2k.gltf") + .to_string_lossy() + .into_owned(); + let mut cache = AssetThumbnailCache::default(); + let mut studio = ThumbnailStudio::for_test(); + + cache.request_model("model:desk".into(), model_path.clone(), &mut studio); + + let jobs = studio.queued_jobs_for_test(); + assert_eq!(jobs.len(), 1); + assert_eq!(jobs[0].cache_key, "model:desk"); + assert!(matches!( + &jobs[0].source, + ThumbnailJobSource::Model { model_path: queued } if queued == &model_path + )); + assert!(!jobs[0].source.label().contains("_diff_")); + } + + #[test] + fn endurance_guard_repeated_thumbnail_replacement_and_invalidation_release_egui_images() { + let mut cache = AssetThumbnailCache::default(); + let mut textures = EguiUserTextures::default(); + let mut images = Assets::::default(); + + for revision in 0..32 { + let image = images.add(Image::default()); + let image_id = image.id(); + cache.complete_studio_thumbnail("material:shared", image, &mut textures); + assert!(textures.image_id(image_id).is_some(), "revision {revision}"); + assert_eq!(cache.registered_images.len(), 1); + } + + let registrations = cache.invalidate_all(); + assert_eq!(registrations.len(), 1); + for registration in registrations { + assert!(textures.remove_image(registration).is_some()); + } + assert!(cache.registered_images.is_empty()); + assert!(cache.texture_ids.is_empty()); + } + + #[test] + fn endurance_guard_shared_thumbnail_image_is_released_only_after_the_last_key() { + let mut cache = AssetThumbnailCache::default(); + let mut textures = EguiUserTextures::default(); + let mut images = Assets::::default(); + let image = images.add(Image::default()); + let image_id = image.id(); + + cache.complete_studio_thumbnail("first", image.clone(), &mut textures); + cache.complete_studio_thumbnail("second", image, &mut textures); + assert!(cache.retry("first").is_none()); + assert!(textures.image_id(image_id).is_some()); + let registration = cache.retry("second").expect("last owner releases image"); + assert_eq!(registration, image_id); + textures.remove_image(registration); + assert!(textures.image_id(image_id).is_none()); + } } diff --git a/crates/editor/src/assets/thumbnails/mod.rs b/crates/editor/src/assets/thumbnails/mod.rs index 411d4d9..5ab3ee0 100644 --- a/crates/editor/src/assets/thumbnails/mod.rs +++ b/crates/editor/src/assets/thumbnails/mod.rs @@ -1,4 +1,4 @@ -//! Unified asset thumbnail pipeline (texture fast-path + model studio). +//! Unified asset thumbnail pipeline (typed texture loads + model render studio). use bevy::prelude::*; @@ -8,9 +8,9 @@ mod sources; mod studio; pub use cache::{ - draw_asset_cell_with, invalidate_on_catalog_refresh, kind_icon, prefetch_asset_thumbnails, - prefetch_folder_thumbnails, AssetThumbnailCache, AssetThumbnailsPlugin, ThumbnailCacheSnapshot, - ThumbnailState, + invalidate_on_catalog_refresh, kind_icon, prefetch_asset_thumbnails, + prefetch_folder_thumbnails, retry_thumbnail, AssetThumbnailCache, AssetThumbnailsPlugin, + ThumbnailCacheSnapshot, ThumbnailState, }; pub use job::{ThumbnailJob, ThumbnailJobSource}; pub use sources::{ diff --git a/crates/editor/src/assets/thumbnails/sources/gltf.rs b/crates/editor/src/assets/thumbnails/sources/gltf.rs index 9c36594..603f5c1 100644 --- a/crates/editor/src/assets/thumbnails/sources/gltf.rs +++ b/crates/editor/src/assets/thumbnails/sources/gltf.rs @@ -1,35 +1,8 @@ -//! glTF/GLB fast-path texture extraction for asset browser thumbnails. +//! glTF/GLB dependency validation and thumbnail source inspection. use std::collections::HashSet; use std::path::Path; -/// Returns an asset-server path for the first base-color texture referenced by a glTF/GLB file. -/// -/// Embedded GLB buffers are skipped so callers can fall back to the render studio. -pub fn gltf_base_color_texture_path(model_asset_path: &str) -> Option { - let model_path = Path::new(model_asset_path); - if !is_gltf_path(model_path) { - return None; - } - - let (document, ..) = gltf::import(model_path).ok()?; - for material in document.materials() { - let Some(tex_info) = material.pbr_metallic_roughness().base_color_texture() else { - continue; - }; - let texture = document.textures().nth(tex_info.texture().index())?; - let image = document.images().nth(texture.source().index())?; - let uri = match image.source() { - gltf::image::Source::Uri { uri, .. } => uri, - gltf::image::Source::View { .. } => continue, - }; - if let Some(path) = resolve_texture_uri(model_path, uri) { - return Some(path); - } - } - None -} - /// Verifies local external buffers and images before Bevy starts an async glTF load. pub fn validate_gltf_dependencies(model_asset_path: &str) -> Result<(), String> { let model_path = Path::new(model_asset_path); @@ -99,15 +72,6 @@ fn is_gltf_path(path: &Path) -> bool { .is_some_and(|ext| matches!(ext.to_ascii_lowercase().as_str(), "gltf" | "glb")) } -fn resolve_texture_uri(model_path: &Path, uri: &str) -> Option { - if uri.starts_with("data:") { - return None; - } - let model_dir = model_path.parent()?; - let texture_path = model_dir.join(uri); - normalize_asset_path(&texture_path) -} - fn normalize_asset_path(path: &Path) -> Option { let raw = path.to_string_lossy().replace('\\', "/"); if raw.starts_with("assets/") { @@ -124,7 +88,6 @@ fn normalize_asset_path(path: &Path) -> Option { mod tests { use super::*; use std::fs; - use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; #[test] @@ -135,15 +98,6 @@ mod tests { ); } - #[test] - fn resolve_texture_uri_relative_to_model() { - let model = PathBuf::from("assets/models/chair.gltf"); - assert_eq!( - resolve_texture_uri(&model, "textures/chair_albedo.png"), - Some("assets/models/textures/chair_albedo.png".into()) - ); - } - #[test] fn dependency_validation_reports_missing_external_buffer() { let nonce = SystemTime::now() diff --git a/crates/editor/src/assets/thumbnails/studio.rs b/crates/editor/src/assets/thumbnails/studio.rs index a4d1baa..684514b 100644 --- a/crates/editor/src/assets/thumbnails/studio.rs +++ b/crates/editor/src/assets/thumbnails/studio.rs @@ -129,6 +129,24 @@ impl ThumbnailStudio { active_root: self.active.take().map(|active| active.root), } } + + #[cfg(test)] + pub(crate) fn for_test() -> Self { + Self { + camera: Entity::PLACEHOLDER, + render_image: Handle::default(), + _lights: Vec::new(), + queue: VecDeque::new(), + active: None, + cooldown_frames: 0, + render_pipeline_warmed: false, + } + } + + #[cfg(test)] + pub(crate) fn queued_jobs_for_test(&self) -> Vec { + self.queue.iter().cloned().collect() + } } pub struct StudioCleanup { diff --git a/crates/editor/src/infra.rs b/crates/editor/src/infra.rs index e9560d0..95f7cb4 100644 --- a/crates/editor/src/infra.rs +++ b/crates/editor/src/infra.rs @@ -20,6 +20,37 @@ fn make_editor_only_non_pickable( editor_only: Query>, ) { for entity in &editor_only { - commands.entity(entity).insert(Pickable::IGNORE); + // Editor helpers can be created and retired within the same update (for + // example while a thumbnail studio refreshes). A regular deferred + // insert panics if another system queued the despawn first. + commands.entity(entity).try_insert(Pickable::IGNORE); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn despawn_added_editor_only( + mut commands: Commands, + editor_only: Query>, + ) { + for entity in &editor_only { + commands.entity(entity).despawn(); + } + } + + #[test] + fn same_frame_helper_retirement_does_not_panic_during_pickable_tagging() { + let mut app = App::new(); + app.add_plugins(EditorInfraPlugin).add_systems( + Update, + despawn_added_editor_only.before(make_editor_only_non_pickable), + ); + let helper = app.world_mut().spawn(EditorOnly).id(); + + app.update(); + + assert!(app.world().get_entity(helper).is_err()); } } diff --git a/crates/editor/src/lib.rs b/crates/editor/src/lib.rs index 8453b0a..639787f 100644 --- a/crates/editor/src/lib.rs +++ b/crates/editor/src/lib.rs @@ -22,6 +22,7 @@ pub use ext::extensibility; pub use ext::hot_reload; pub use play::net_editor; pub use play::state; +pub use project::asset_documents; pub use project::collaboration; pub use project::diagnostics_bundle; pub use project::launcher; @@ -74,6 +75,7 @@ use operators::OperatorPlugin; use physics_placement::PhysicsPlacementPlugin; use play::audio_preview::AudioPreviewPlugin; use play::PlaySessionPlugin; +use project::asset_documents::AuthoredAssetDocumentsPlugin; use project::collaboration::CollaborationPlugin; use project::native_dialog::NativeDialogPlugin; use project::samples::SampleCatalogPlugin; @@ -108,6 +110,7 @@ impl PluginGroup for EditorPluginGroup { .add(scene_schema::SceneSchemaPlugin) .add(net_editor::NetEditorPlugin) .add(AssetDbPlugin) + .add(AuthoredAssetDocumentsPlugin) .add(OperatorPlugin) .add(ExtensibilityPlugin) .add(SettingsUiPlugin) diff --git a/crates/editor/src/project/asset_documents.rs b/crates/editor/src/project/asset_documents.rs new file mode 100644 index 0000000..d95cb47 --- /dev/null +++ b/crates/editor/src/project/asset_documents.rs @@ -0,0 +1,51 @@ +//! Editor-owned authored asset documents and explicit save boundaries. +//! +//! Interactive UI mutates these documents and live runtime handles only. Source publication, +//! collaboration checks, watcher suppression, and derived processing happen exclusively here. + +use std::collections::{HashMap, VecDeque}; +use std::fs; +use std::path::{Path, PathBuf}; +use std::thread::JoinHandle; +use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; + +use bevy::prelude::*; +use blacksite_surface::LiveMaterialDocument; +use serde::{Deserialize, Serialize}; +use shared::{ + AssetId, AssetKind, AssetRegistryDocument, MaterialAsset, MaterialInstanceAsset, + ModelImportSettings, ProjectContentDefaults, RuntimeContentCatalog, TextureImportSettings, +}; + +use crate::asset_db::{AssetRecord, AssetRegistry}; +use crate::assets::EditorAssets; +use crate::project::collaboration::{ + publish_authored_file, FileRevision, FileSnapshot, FileWriteIntent, +}; +use crate::project_io::ProjectWorkspace; +use crate::scene::recovery::{atomic_write, default_state_root}; +use crate::scene_io::{SceneIo, SceneIoRequest}; + +mod processing_impact; +pub use processing_impact::DerivedProcessingImpact; +use processing_impact::{instance_impact, material_impact}; + +#[path = "asset_documents/document_store/live_updates.rs"] +mod live_updates; +#[path = "asset_documents/document_store/processing.rs"] +mod processing; +#[path = "asset_documents/document_store/publication.rs"] +mod publication; +#[path = "asset_documents/document_store/recovery.rs"] +mod recovery; +#[path = "asset_documents/document_store/service.rs"] +mod service; +#[path = "asset_documents/document_store/store.rs"] +mod store; + +pub use live_updates::*; +use processing::*; +pub use publication::*; +pub use recovery::*; +pub use service::*; +pub use store::*; diff --git a/crates/editor/src/project/asset_documents/document_store/live_updates.rs b/crates/editor/src/project/asset_documents/document_store/live_updates.rs new file mode 100644 index 0000000..0e68e18 --- /dev/null +++ b/crates/editor/src/project/asset_documents/document_store/live_updates.rs @@ -0,0 +1,111 @@ +use super::*; + +/// Applies one interactive Material edit to both the authored document and the renderer overlay. +/// No filesystem, watcher, Git, thumbnail, or derived-processing work is performed here. +pub fn update_material_document( + world: &mut World, + key: &AuthoredAssetDocumentKey, + asset: MaterialAsset, +) { + let revision = { + let mut store = world.resource_mut::(); + store.update_material(key, asset.clone()); + store + .documents + .get(key) + .map(|document| document.revision) + .unwrap_or_default() + }; + if let Some(mut overlay) = + world.get_resource_mut::() + { + overlay.update_material(key.asset_id.clone(), revision, asset); + } +} + +/// Applies one interactive Material Instance edit to the same live authority as Materials. +pub fn update_material_instance_document( + world: &mut World, + key: &AuthoredAssetDocumentKey, + instance: MaterialInstanceAsset, +) { + let revision = { + let mut store = world.resource_mut::(); + store.update_material_instance(key, instance.clone()); + store + .documents + .get(key) + .map(|document| document.revision) + .unwrap_or_default() + }; + if let Some(mut overlay) = + world.get_resource_mut::() + { + overlay.update_instance(key.asset_id.clone(), revision, instance); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn material(label: &str) -> MaterialAsset { + MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: label.into(), + shader: Default::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: Default::default(), + } + } + + #[test] + fn live_edit_marks_one_document_dirty_without_writing_or_queueing_processing() { + let path = std::env::temp_dir().join(format!( + "blacksite-live-edit-no-publish-{}.material.ron", + uuid::Uuid::new_v4() + )); + std::fs::write(&path, b"disk baseline").unwrap(); + let key = AuthoredAssetDocumentKey::new( + "live-edit-material", + AuthoredAssetDocumentKind::Material, + ); + let mut store = AuthoredAssetDocumentStore::default(); + store.documents.insert( + key.clone(), + AuthoredAssetDocument::new( + key.clone(), + path.to_string_lossy().into_owned(), + AuthoredAssetValue::Material(material("Clean")), + FileSnapshot::capture(&path).unwrap(), + ), + ); + let mut world = World::new(); + world.insert_resource(store); + world.init_resource::(); + world.init_resource::(); + + update_material_document(&mut world, &key, material("Live edit")); + + assert_eq!(std::fs::read(&path).unwrap(), b"disk baseline"); + let snapshot = world + .resource::() + .snapshot(&key) + .unwrap(); + assert!(snapshot.dirty); + assert_eq!(snapshot.state, AuthoredDocumentState::Dirty); + let queue = world.resource::(); + assert!(queue.pending.is_empty()); + assert!(queue.active.is_none()); + assert_eq!( + world + .resource::() + .revision_for_asset(&key.asset_id), + Some(1) + ); + + std::fs::remove_file(path).unwrap(); + } +} diff --git a/crates/editor/src/project/asset_documents/document_store/processing.rs b/crates/editor/src/project/asset_documents/document_store/processing.rs new file mode 100644 index 0000000..18d5b3b --- /dev/null +++ b/crates/editor/src/project/asset_documents/document_store/processing.rs @@ -0,0 +1,304 @@ +use super::*; + +pub(super) fn enqueue_processing(world: &mut World, key: &AuthoredAssetDocumentKey, revision: u64) { + let root = project_root(world); + let registry = world + .resource::() + .registry_clean + .clone() + .unwrap_or_else(|| world.resource::().document()); + let request = match key.kind { + AuthoredAssetDocumentKind::Material | AuthoredAssetDocumentKind::MaterialInstance => { + let Some(record) = registry + .records + .iter() + .find(|record| record.id.as_string() == key.asset_id) + .cloned() + else { + return; + }; + ProcessingRequest::Material { + key: key.clone(), + revision, + root, + record, + registry, + } + } + AuthoredAssetDocumentKind::TextureImportSettings => { + let Some(record) = registry + .records + .iter() + .find(|record| record.id.as_string() == key.asset_id) + .cloned() + else { + return; + }; + ProcessingRequest::Texture { + key: key.clone(), + revision, + root, + record, + registry, + } + } + AuthoredAssetDocumentKind::ModelImportSettings => { + let Some(record) = registry + .records + .iter() + .find(|record| record.id.as_string() == key.asset_id) + .cloned() + else { + return; + }; + ProcessingRequest::Model { + key: key.clone(), + revision, + root, + record, + registry, + } + } + AuthoredAssetDocumentKind::ProjectContentDefaults => ProcessingRequest::Defaults { + key: key.clone(), + revision, + root, + registry, + }, + }; + let mut queue = world.resource_mut::(); + queue.pending.retain(|pending| pending.key() != key); + queue.pending.push_back(request); +} + +pub(super) fn drive_content_processing(world: &mut World) { + let completed = { + let mut queue = world.resource_mut::(); + if queue + .active + .as_ref() + .is_some_and(|job| job.handle.is_finished()) + { + queue.active.take() + } else { + None + } + }; + if let Some(job) = completed { + let result = job + .handle + .join() + .unwrap_or_else(|_| Err("content processing worker panicked".into())); + finish_processing(world, job.key, job.revision, result); + } + + let request = { + let mut queue = world.resource_mut::(); + if queue.active.is_none() { + queue.pending.pop_front() + } else { + None + } + }; + let Some(request) = request else { + return; + }; + let key = request.key().clone(); + let revision = request.revision(); + if let Some(document) = world + .resource_mut::() + .documents + .get_mut(&key) + { + document.processing = DerivedProcessingState::Processing; + } + let handle = std::thread::spawn(move || process_request(request)); + world.resource_mut::().active = Some(ActiveProcessingJob { + key, + revision, + handle, + }); +} + +pub(super) fn process_request(request: ProcessingRequest) -> Result { + match request { + ProcessingRequest::Material { + root, + record, + registry, + .. + } => { + let mut runtime = runtime_catalog_with_previous_artifacts(&root, ®istry); + let mut affected = vec![record.clone()]; + if record.kind == AssetKind::Material { + affected.extend(content_pipeline::direct_material_instance_dependents( + &root, ®istry, &record, + )); + } + for affected_record in affected { + if let Some(plan) = + content_pipeline::plan_material_artifact(&root, &affected_record, ®istry)? + { + content_pipeline::publish_material_artifact(&plan)?; + content_pipeline::apply_material_plan_to_catalog( + &mut runtime, + &affected_record.id, + &plan, + )?; + } + } + Ok(ProcessingOutput::RuntimeCatalog(runtime)) + } + ProcessingRequest::Texture { + root, + record, + registry, + .. + } => { + let mut runtime = runtime_catalog_with_previous_artifacts(&root, ®istry); + let plan = content_pipeline::plan_texture_artifact(&root, &record)?; + content_pipeline::publish_texture_artifact(&plan)?; + content_pipeline::apply_texture_plan_to_catalog(&mut runtime, &record.id, &plan)?; + for material in + content_pipeline::material_dependents_of_texture(&root, ®istry, &record) + { + if let Some(plan) = + content_pipeline::plan_material_artifact(&root, &material, ®istry)? + { + content_pipeline::publish_material_artifact(&plan)?; + content_pipeline::apply_material_plan_to_catalog( + &mut runtime, + &material.id, + &plan, + )?; + } + } + Ok(ProcessingOutput::RuntimeCatalog(runtime)) + } + ProcessingRequest::Model { + root, + record, + mut registry, + .. + } => { + let plan = content_pipeline::plan_model_artifacts_at(&root, &record)?; + content_pipeline::publish_model_artifacts(&plan)?; + if let Some(current) = registry + .records + .iter_mut() + .find(|entry| entry.id == record.id) + { + *current = plan.record.clone(); + } + let runtime = runtime_catalog_with_previous_artifacts(&root, ®istry); + Ok(ProcessingOutput::Model { registry, runtime }) + } + ProcessingRequest::Defaults { root, registry, .. } => Ok(ProcessingOutput::RuntimeCatalog( + runtime_catalog_with_previous_artifacts(&root, ®istry), + )), + } +} + +pub(super) fn runtime_catalog_with_previous_artifacts( + root: &Path, + registry: &AssetRegistryDocument, +) -> RuntimeContentCatalog { + let mut runtime = RuntimeContentCatalog::from(registry); + let previous = fs::read_to_string(root.join(content_pipeline::RUNTIME_CATALOG_PATH)) + .ok() + .and_then(|source| ron::from_str::(&source).ok()); + if let Some(previous) = previous { + for record in &mut runtime.records { + if let Some(old) = previous.records.iter().find(|old| old.id == record.id) { + if old.texture.is_some() { + record.texture.clone_from(&old.texture); + } + if old.material.is_some() { + record.material.clone_from(&old.material); + } + } + } + } + runtime +} + +pub(super) fn finish_processing( + world: &mut World, + key: AuthoredAssetDocumentKey, + revision: u64, + result: Result, +) { + let current_revision = world + .resource::() + .documents + .get(&key) + .map(|document| document.revision); + if current_revision != Some(revision) { + return; + } + match result { + Ok(output) => { + let root = project_root(world); + let (runtime, processed_registry) = match output { + ProcessingOutput::RuntimeCatalog(runtime) => (runtime, None), + ProcessingOutput::Model { registry, runtime } => (runtime, Some(registry)), + }; + let catalog_path = root.join(content_pipeline::RUNTIME_CATALOG_PATH); + crate::assets::suppress_content_watch_path(world, &catalog_path); + if processed_registry.is_some() { + crate::assets::suppress_content_watch_path( + world, + &root.join(content_pipeline::REGISTRY_PATH), + ); + } + let publication = (|| { + if let Some(registry) = processed_registry.as_ref() { + let registry_path = root.join(content_pipeline::REGISTRY_PATH); + let bytes = content_pipeline::serialize_registry(registry)?; + content_pipeline::write_if_changed(®istry_path, &bytes)?; + } + let bytes = content_pipeline::serialize_runtime_catalog(&runtime)?; + content_pipeline::write_if_changed(&catalog_path, &bytes).map(|_| ()) + })(); + if publication.is_ok() { + if let Some(registry) = processed_registry.as_ref() { + let registry_path = root.join(content_pipeline::REGISTRY_PATH); + let snapshot = FileSnapshot::capture(®istry_path) + .unwrap_or_else(|_| FileSnapshot::missing()); + { + let mut store = world.resource_mut::(); + store.registry_clean = Some(registry.clone()); + store.registry_snapshot = Some(snapshot); + } + apply_registry_to_world(world, registry); + reapply_unsaved_registry_overlays(world); + } + } + let mut store = world.resource_mut::(); + let document = store + .documents + .get_mut(&key) + .expect("processing document exists"); + match publication { + Ok(()) => { + document.processing = DerivedProcessingState::Idle; + document.error = None; + } + Err(error) => { + document.processing = DerivedProcessingState::Failed; + document.error = Some(error); + } + } + } + Err(error) => { + let mut store = world.resource_mut::(); + if let Some(document) = store.documents.get_mut(&key) { + document.processing = DerivedProcessingState::Failed; + document.error = Some(error.clone()); + } + world + .resource_mut::() + .set_status(format!("Derived asset processing failed: {error}")); + } + } +} diff --git a/crates/editor/src/project/asset_documents/document_store/publication.rs b/crates/editor/src/project/asset_documents/document_store/publication.rs new file mode 100644 index 0000000..a60d51d --- /dev/null +++ b/crates/editor/src/project/asset_documents/document_store/publication.rs @@ -0,0 +1,456 @@ +use super::*; + +pub fn request_contextual_save(world: &mut World) { + let active_dirty = world + .resource::() + .active + .as_ref() + .and_then(|key| { + world + .resource::() + .documents + .get(key) + }) + .is_some_and(AuthoredAssetDocument::dirty); + if active_dirty { + world + .resource_mut::() + .request_save(AssetSaveRequest::Active); + } else if world + .get_resource::() + .is_some_and(|io| io.dirty) + { + match crate::settings_ui::save_project_settings_if_dirty(world) { + Ok(_) => world + .resource_mut::() + .set_status("Saved project settings"), + Err(error) => world + .resource_mut::() + .set_status(format!("Save project settings failed: {error}")), + } + } else { + world.resource_mut::().request = Some(SceneIoRequest::Save); + } +} + +pub fn request_save_all(world: &mut World) { + if let Err(error) = crate::settings_ui::save_project_settings_if_dirty(world) { + world + .resource_mut::() + .set_status(format!("Save All project settings failed: {error}")); + return; + } + world + .resource_mut::() + .request_save(AssetSaveRequest::All); + crate::scene_io::request_scene_save_all(world); +} + +pub fn save_all_authored_assets(world: &mut World) -> Result { + if !world.contains_resource::() { + return Ok(0); + } + save_documents(world, AssetSaveRequest::All) +} + +pub fn discard_all_authored_assets(world: &mut World) { + if !world.contains_resource::() { + return; + } + let keys = world + .resource::() + .documents + .keys() + .cloned() + .collect::>(); + for key in &keys { + discard_document_recovery(world, key); + } + world + .resource_mut::() + .discard_all(); + let clean_materials = world + .resource::() + .documents + .iter() + .filter_map(|(key, document)| match &document.clean { + AuthoredAssetValue::Material(asset) => Some(( + key.asset_id.clone(), + document.revision, + LiveMaterialDocument::Material(asset.clone()), + )), + AuthoredAssetValue::MaterialInstance(instance) => Some(( + key.asset_id.clone(), + document.revision, + LiveMaterialDocument::Instance(instance.clone()), + )), + _ => None, + }) + .collect::>(); + if let Some(mut overlay) = + world.get_resource_mut::() + { + for (asset_id, revision, document) in clean_materials { + match document { + LiveMaterialDocument::Material(asset) => { + overlay.update_material(asset_id, revision, asset); + } + LiveMaterialDocument::Instance(instance) => { + overlay.update_instance(asset_id, revision, instance); + } + } + } + } + if let Some(clean) = world + .resource::() + .registry_clean + .clone() + { + apply_registry_to_world(world, &clean); + } +} + +pub(super) fn drive_asset_save_requests(world: &mut World) { + let request = world + .resource_mut::() + .pending_save + .take(); + let Some(request) = request else { + return; + }; + match save_documents(world, request) { + Ok(0) => world + .resource_mut::() + .set_status("No dirty asset documents to save"), + Ok(count) => world + .resource_mut::() + .set_status(format!("Saved {count} asset document(s)")), + Err(error) => world.resource_mut::().set_status(error), + } +} + +pub(super) fn save_documents( + world: &mut World, + request: AssetSaveRequest, +) -> Result { + let keys = { + let store = world.resource::(); + match request { + AssetSaveRequest::Active => store + .active + .iter() + .filter(|key| { + store + .documents + .get(*key) + .is_some_and(AuthoredAssetDocument::dirty) + }) + .cloned() + .collect::>(), + AssetSaveRequest::All => store + .documents + .iter() + .filter(|(_, document)| document.dirty()) + .map(|(key, _)| key.clone()) + .collect::>(), + } + }; + if keys.is_empty() { + return Ok(0); + } + + let mut registry_keys = Vec::new(); + let mut saved = 0; + for key in keys { + if matches!( + key.kind, + AuthoredAssetDocumentKind::ModelImportSettings + | AuthoredAssetDocumentKind::TextureImportSettings + | AuthoredAssetDocumentKind::ProjectContentDefaults + ) { + registry_keys.push(key); + continue; + } + save_file_document(world, &key)?; + saved += 1; + } + if !registry_keys.is_empty() { + saved += save_registry_documents(world, ®istry_keys)?; + } + Ok(saved) +} + +pub(super) fn save_file_document( + world: &mut World, + key: &AuthoredAssetDocumentKey, +) -> Result<(), String> { + let (path, clean, value, snapshot, revision) = { + let mut store = world.resource_mut::(); + let document = store + .documents + .get_mut(key) + .ok_or_else(|| "authored asset document disappeared before save".to_string())?; + document.state = AuthoredDocumentState::Saving; + ( + document.path.clone(), + document.clean.clone(), + document.current.clone(), + document.disk_snapshot.clone(), + document.revision, + ) + }; + let processing_impact = derived_processing_impact(&clean, &value); + let (bytes, intent) = match &value { + AuthoredAssetValue::Material(asset) => ( + ron::ser::to_string_pretty(asset, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("could not serialize Material {path}: {error}"))? + .into_bytes(), + FileWriteIntent::Material, + ), + AuthoredAssetValue::MaterialInstance(asset) => ( + ron::ser::to_string_pretty(asset, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("could not serialize Material Instance {path}: {error}"))? + .into_bytes(), + FileWriteIntent::MaterialInstance, + ), + _ => return Err("registry-backed document used the file-document save path".into()), + }; + crate::assets::suppress_content_watch_path(world, Path::new(&path)); + match publish_authored_file(world, Path::new(&path), &bytes, &snapshot, intent) { + Ok(disk_snapshot) => { + let label = match &value { + AuthoredAssetValue::Material(asset) => asset.label.as_str(), + AuthoredAssetValue::MaterialInstance(asset) => asset.label.as_str(), + _ => "", + } + .to_string(); + { + let mut store = world.resource_mut::(); + let document = store.documents.get_mut(key).expect("saved document exists"); + document.clean = value; + document.disk_snapshot = disk_snapshot; + document.state = AuthoredDocumentState::Clean; + document.processing = if processing_impact == DerivedProcessingImpact::None { + DerivedProcessingState::Idle + } else { + DerivedProcessingState::Queued + }; + document.error = None; + document.changed_at = None; + } + if let Some(asset) = world + .resource_mut::() + .assets + .iter_mut() + .find(|asset| asset.path.as_deref() == Some(path.as_str())) + { + asset.label = label; + } + discard_document_recovery(world, key); + if processing_impact != DerivedProcessingImpact::None { + enqueue_processing(world, key, revision); + } + Ok(()) + } + Err(error) => { + let mut store = world.resource_mut::(); + let document = store + .documents + .get_mut(key) + .expect("failed document exists"); + document.state = if error.contains("changed outside") || error.contains("read-only") { + AuthoredDocumentState::ExternalConflict + } else { + AuthoredDocumentState::SaveFailed + }; + document.error = Some(error.clone()); + Err(error) + } + } +} + +pub(super) fn save_registry_documents( + world: &mut World, + keys: &[AuthoredAssetDocumentKey], +) -> Result { + let root = project_root(world); + let path = root.join(content_pipeline::REGISTRY_PATH); + let (mut document, snapshot) = { + let store = world.resource::(); + ( + store + .registry_clean + .clone() + .unwrap_or_else(|| world.resource::().document()), + store + .registry_snapshot + .clone() + .unwrap_or_else(FileSnapshot::missing), + ) + }; + for key in keys { + let store = world.resource::(); + let authored = store + .documents + .get(key) + .ok_or_else(|| "registry-backed document disappeared before save".to_string())?; + apply_registry_value(&mut document, key, &authored.current)?; + } + let bytes = content_pipeline::serialize_registry(&document)?; + crate::assets::suppress_content_watch_path(world, &path); + let intent = FileWriteIntent::AssetRegistry; + let disk_snapshot = match publish_authored_file(world, &path, &bytes, &snapshot, intent) { + Ok(snapshot) => snapshot, + Err(error) => { + let mut store = world.resource_mut::(); + for key in keys { + if let Some(authored) = store.documents.get_mut(key) { + authored.state = AuthoredDocumentState::ExternalConflict; + authored.error = Some(error.clone()); + } + } + return Err(error); + } + }; + let impacts = { + let mut store = world.resource_mut::(); + let impacts = keys + .iter() + .filter_map(|key| { + store.documents.get(key).map(|document| { + ( + key.clone(), + derived_processing_impact(&document.clean, &document.current), + ) + }) + }) + .collect::>(); + store.registry_clean = Some(document.clone()); + store.registry_snapshot = Some(disk_snapshot.clone()); + for key in keys { + if let Some(authored) = store.documents.get_mut(key) { + authored.clean = authored.current.clone(); + authored.disk_snapshot = disk_snapshot.clone(); + authored.state = AuthoredDocumentState::Clean; + authored.processing = if impacts.get(key).copied().unwrap_or_default() + == DerivedProcessingImpact::None + { + DerivedProcessingState::Idle + } else { + DerivedProcessingState::Queued + }; + authored.error = None; + authored.changed_at = None; + } + } + impacts + }; + apply_registry_to_world(world, &document); + reapply_unsaved_registry_overlays(world); + for key in keys { + discard_document_recovery(world, key); + let revision = world + .resource::() + .documents + .get(key) + .map(|document| document.revision) + .unwrap_or_default(); + if impacts.get(key).copied().unwrap_or_default() != DerivedProcessingImpact::None { + enqueue_processing(world, key, revision); + } + } + Ok(keys.len()) +} + +pub(super) fn derived_processing_impact( + clean: &AuthoredAssetValue, + current: &AuthoredAssetValue, +) -> DerivedProcessingImpact { + match (clean, current) { + (AuthoredAssetValue::Material(clean), AuthoredAssetValue::Material(current)) => { + material_impact(clean, current) + } + ( + AuthoredAssetValue::MaterialInstance(clean), + AuthoredAssetValue::MaterialInstance(current), + ) => instance_impact(clean, current), + ( + AuthoredAssetValue::TextureImportSettings(_), + AuthoredAssetValue::TextureImportSettings(_), + ) => DerivedProcessingImpact::TextureAndDependents, + ( + AuthoredAssetValue::ModelImportSettings(_), + AuthoredAssetValue::ModelImportSettings(_), + ) => DerivedProcessingImpact::ModelArtifacts, + ( + AuthoredAssetValue::ProjectContentDefaults(_), + AuthoredAssetValue::ProjectContentDefaults(_), + ) => DerivedProcessingImpact::CatalogDefaults, + _ => DerivedProcessingImpact::None, + } +} + +pub(super) fn apply_registry_value( + document: &mut AssetRegistryDocument, + key: &AuthoredAssetDocumentKey, + value: &AuthoredAssetValue, +) -> Result<(), String> { + match value { + AuthoredAssetValue::ModelImportSettings(settings) => { + let record = document + .records + .iter_mut() + .find(|record| record.id.as_string() == key.asset_id) + .ok_or_else(|| format!("registry is missing model {}", key.asset_id))?; + record.import_settings = settings.clone().into(); + } + AuthoredAssetValue::TextureImportSettings(settings) => { + let record = document + .records + .iter_mut() + .find(|record| record.id.as_string() == key.asset_id) + .ok_or_else(|| format!("registry is missing Texture {}", key.asset_id))?; + record.import_settings = settings.clone().into(); + } + AuthoredAssetValue::ProjectContentDefaults(defaults) => { + document.defaults = defaults.clone(); + } + _ => return Err("file-backed document used the registry save path".into()), + } + Ok(()) +} + +pub(super) fn apply_registry_to_world(world: &mut World, document: &AssetRegistryDocument) { + { + let mut registry = world.resource_mut::(); + registry.schema_version = document.schema_version; + registry.defaults = document.defaults.clone(); + registry.records = document.records.clone(); + registry.index_dirty = false; + registry.migration_required = false; + } + *world.resource_mut::() = document.defaults.clone(); +} + +pub(super) fn reapply_unsaved_registry_overlays(world: &mut World) { + let overlays = world + .resource::() + .documents + .iter() + .filter(|(key, document)| { + document.dirty() + && matches!( + key.kind, + AuthoredAssetDocumentKind::ModelImportSettings + | AuthoredAssetDocumentKind::TextureImportSettings + | AuthoredAssetDocumentKind::ProjectContentDefaults + ) + }) + .map(|(key, document)| (key.clone(), document.current.clone())) + .collect::>(); + let mut effective = world.resource::().document(); + for (key, value) in overlays { + let _ = apply_registry_value(&mut effective, &key, &value); + } + apply_registry_to_world(world, &effective); +} diff --git a/crates/editor/src/project/asset_documents/document_store/recovery.rs b/crates/editor/src/project/asset_documents/document_store/recovery.rs new file mode 100644 index 0000000..682e42f --- /dev/null +++ b/crates/editor/src/project/asset_documents/document_store/recovery.rs @@ -0,0 +1,608 @@ +use super::*; + +pub(super) fn tick_asset_recovery(world: &mut World) { + let (ready, stale) = { + let now = Instant::now(); + let store = world.resource::(); + let ready = store + .documents + .values() + .filter(|document| { + document.dirty() + && document.recovery_revision != Some(document.revision) + && document + .changed_at + .is_some_and(|changed| now.duration_since(changed) >= RECOVERY_IDLE) + }) + .map(|document| document.key.clone()) + .collect::>(); + let stale = stale_recovery_keys(store); + (ready, stale) + }; + for key in stale { + if let Err(error) = remove_document_recovery(world, &key) { + if let Some(document) = world + .resource_mut::() + .documents + .get_mut(&key) + { + document.error = Some(format!("Recovery cleanup failed: {error}")); + } + continue; + } + if let Some(document) = world + .resource_mut::() + .documents + .get_mut(&key) + { + document.recovery_revision = None; + } + } + for key in ready { + if let Err(error) = write_document_recovery(world, &key) { + if let Some(document) = world + .resource_mut::() + .documents + .get_mut(&key) + { + document.error = Some(format!("Recovery snapshot failed: {error}")); + } + } + } +} + +fn stale_recovery_keys(store: &AuthoredAssetDocumentStore) -> Vec { + store + .documents + .values() + .filter(|document| !document.dirty() && document.recovery_revision.is_some()) + .map(|document| document.key.clone()) + .collect() +} + +pub(super) fn write_document_recovery( + world: &mut World, + key: &AuthoredAssetDocumentKey, +) -> Result<(), String> { + let root = project_root(world); + let state_root = + default_state_root().ok_or_else(|| "editor state directory is unavailable".to_string())?; + let (envelope, revision) = { + let store = world.resource::(); + let document = store + .documents + .get(key) + .ok_or_else(|| "recovery document is missing".to_string())?; + ( + RecoveryEnvelope { + key: key.clone(), + path: document.path.clone(), + baseline_revision: revision_label(&document.disk_snapshot.revision), + value: document.current.clone(), + }, + document.revision, + ) + }; + let directory = recovery_directory(&state_root, &root, key); + fs::create_dir_all(&directory) + .map_err(|error| format!("could not create {}: {error}", directory.display()))?; + let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis(); + let path = directory.join(format!("recovery-{timestamp:020}.ron")); + let bytes = ron::ser::to_string_pretty(&envelope, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("could not serialize asset recovery: {error}"))?; + atomic_write(&path, bytes.as_bytes())?; + prune_recovery(&directory)?; + if let Some(document) = world + .resource_mut::() + .documents + .get_mut(key) + { + document.recovery_revision = Some(revision); + } + Ok(()) +} + +pub(super) fn discover_asset_recovery(world: &mut World) { + let root = project_root(world); + let Some(state_root) = default_state_root() else { + return; + }; + let base = state_root + .join("asset-recovery") + .join(blake3::hash(normalize_path(&root.to_string_lossy()).as_bytes()).to_hex()); + let Ok(entries) = fs::read_dir(base) else { + return; + }; + let mut recovered = Vec::new(); + for directory in entries.filter_map(Result::ok).map(|entry| entry.path()) { + let Ok(files) = fs::read_dir(directory) else { + continue; + }; + let latest = files + .filter_map(Result::ok) + .map(|entry| entry.path()) + .max_by_key(|path| path.file_name().map(|name| name.to_os_string())); + if let Some(envelope) = latest + .and_then(|path| fs::read_to_string(path).ok()) + .and_then(|source| ron::from_str::(&source).ok()) + { + if !recovery_requires_prompt( + load_clean_recovery_value(world, &envelope).as_ref(), + &envelope.value, + ) { + let _ = remove_document_recovery(world, &envelope.key); + continue; + } + recovered.push(envelope); + } + } + if !recovered.is_empty() { + let mut store = world.resource_mut::(); + store.pending_recovery = recovered; + store.recovery_prompt_open = true; + } +} + +fn recovery_requires_prompt( + clean: Option<&AuthoredAssetValue>, + recovered: &AuthoredAssetValue, +) -> bool { + clean != Some(recovered) +} + +pub fn asset_recovery_modal(world: &mut World, ctx: &bevy_egui::egui::Context) { + let open = world + .resource::() + .recovery_prompt_open; + if !open { + return; + } + let pending = world + .resource::() + .pending_recovery + .clone(); + let mut restore = false; + let mut discard = false; + let mut review = false; + let mut restore_one = None; + let mut discard_one = None; + let reviewing = world + .resource::() + .recovery_reviewing; + bevy_egui::egui::Modal::new(bevy_egui::egui::Id::new("asset_document_recovery")).show(ctx, |ui| { + ui.heading("Unsaved asset recovery"); + ui.label("Blacksite found editor-local asset edits that were never written to project source files."); + bevy_egui::egui::ScrollArea::vertical() + .max_height(180.0) + .show(ui, |ui| { + for envelope in &pending { + ui.horizontal(|ui| { + ui.strong(envelope.key.kind.slug()); + ui.monospace(&envelope.path); + if reviewing { + if ui.small_button("Restore").clicked() { + restore_one = Some(envelope.key.clone()); + } + if ui.small_button("Discard").clicked() { + discard_one = Some(envelope.key.clone()); + } + } + }); + } + }); + ui.horizontal(|ui| { + restore = ui.button("Restore All").clicked(); + review = ui.button("Review").clicked(); + discard = ui.button("Discard All").clicked(); + }); + }); + if let Some(key) = restore_one { + restore_pending_recovery_key(world, &key, true); + } else if let Some(key) = discard_one { + restore_pending_recovery_key(world, &key, false); + } else if review { + world + .resource_mut::() + .recovery_reviewing = true; + } else if restore { + restore_pending_recovery(world); + } else if discard { + discard_pending_recovery(world); + } +} + +pub(crate) fn reload_registry_documents_after_file_conflict( + world: &mut World, +) -> Result { + let root = project_root(world); + let path = root.join(content_pipeline::REGISTRY_PATH); + let source = fs::read_to_string(&path) + .map_err(|error| format!("could not read {}: {error}", path.display()))?; + let loaded = shared::parse_asset_registry(&source)?; + let snapshot = FileSnapshot::from_loaded_bytes(&path, source.as_bytes()); + let registry_kinds = [ + AuthoredAssetDocumentKind::ModelImportSettings, + AuthoredAssetDocumentKind::TextureImportSettings, + AuthoredAssetDocumentKind::ProjectContentDefaults, + ]; + let keys = world + .resource::() + .documents + .keys() + .filter(|key| registry_kinds.contains(&key.kind)) + .cloned() + .collect::>(); + for key in &keys { + discard_document_recovery(world, key); + } + { + let mut store = world.resource_mut::(); + for key in &keys { + store.documents.remove(key); + } + store + .path_index + .retain(|_, key| !registry_kinds.contains(&key.kind)); + store.registry_clean = Some(loaded.document.clone()); + store.registry_snapshot = Some(snapshot); + } + apply_registry_to_world(world, &loaded.document); + Ok(format!("Reloaded asset registry from {}", path.display())) +} + +pub(crate) fn adopt_external_registry_document( + world: &mut World, + document: &AssetRegistryDocument, +) { + if !world.contains_resource::() { + apply_registry_to_world(world, document); + return; + } + let path = project_root(world).join(content_pipeline::REGISTRY_PATH); + let snapshot = FileSnapshot::capture(&path).unwrap_or_else(|_| FileSnapshot::missing()); + { + let mut store = world.resource_mut::(); + store.registry_clean = Some(document.clone()); + store.registry_snapshot = Some(snapshot); + } + apply_registry_to_world(world, document); + reapply_unsaved_registry_overlays(world); +} + +pub(super) fn restore_pending_recovery(world: &mut World) { + let pending = { + let mut store = world.resource_mut::(); + store.recovery_prompt_open = false; + std::mem::take(&mut store.pending_recovery) + }; + for envelope in pending { + restore_recovery_envelope(world, envelope); + } + reapply_unsaved_registry_overlays(world); +} + +pub(super) fn restore_pending_recovery_key( + world: &mut World, + key: &AuthoredAssetDocumentKey, + restore: bool, +) { + let envelope = { + let mut store = world.resource_mut::(); + let Some(index) = store + .pending_recovery + .iter() + .position(|envelope| &envelope.key == key) + else { + return; + }; + let envelope = store.pending_recovery.remove(index); + if store.pending_recovery.is_empty() { + store.recovery_prompt_open = false; + store.recovery_reviewing = false; + } + envelope + }; + if restore { + restore_recovery_envelope(world, envelope); + reapply_unsaved_registry_overlays(world); + } else { + discard_document_recovery(world, &envelope.key); + } +} + +pub(super) fn restore_recovery_envelope(world: &mut World, envelope: RecoveryEnvelope) { + let snapshot_path = source_path_for_recovery(world, &envelope); + let snapshot = + FileSnapshot::capture(&snapshot_path).unwrap_or_else(|_| FileSnapshot::missing()); + let state = if revision_label(&snapshot.revision) == envelope.baseline_revision { + AuthoredDocumentState::Dirty + } else { + AuthoredDocumentState::ExternalConflict + }; + let clean = + load_clean_recovery_value(world, &envelope).unwrap_or_else(|| envelope.value.clone()); + let mut document = + AuthoredAssetDocument::new(envelope.key.clone(), envelope.path.clone(), clean, snapshot); + document.current = envelope.value; + document.revision = 1; + document.state = state; + document.changed_at = Some(Instant::now()); + if state == AuthoredDocumentState::ExternalConflict { + document.error = Some("Source changed since this recovery snapshot was created".into()); + } + let mut store = world.resource_mut::(); + store + .path_index + .insert(normalize_path(&document.path), envelope.key.clone()); + store.documents.insert(envelope.key.clone(), document); + store.active = Some(envelope.key); +} + +pub(super) fn discard_pending_recovery(world: &mut World) { + let keys = { + let mut store = world.resource_mut::(); + store.recovery_prompt_open = false; + store.recovery_reviewing = false; + std::mem::take(&mut store.pending_recovery) + .into_iter() + .map(|envelope| envelope.key) + .collect::>() + }; + for key in keys { + discard_document_recovery(world, &key); + } +} + +pub(super) fn load_clean_recovery_value( + world: &World, + envelope: &RecoveryEnvelope, +) -> Option { + match envelope.key.kind { + AuthoredAssetDocumentKind::Material => MaterialAsset::load_from_path(&envelope.path) + .ok() + .map(AuthoredAssetValue::Material), + AuthoredAssetDocumentKind::MaterialInstance => { + MaterialInstanceAsset::load_from_path(&envelope.path) + .ok() + .map(AuthoredAssetValue::MaterialInstance) + } + AuthoredAssetDocumentKind::ModelImportSettings => world + .resource::() + .records + .iter() + .find(|record| record.id.as_string() == envelope.key.asset_id) + .map(|record| AuthoredAssetValue::ModelImportSettings(record.model_import().clone())), + AuthoredAssetDocumentKind::TextureImportSettings => world + .resource::() + .records + .iter() + .find(|record| record.id.as_string() == envelope.key.asset_id) + .and_then(|record| record.texture_import().cloned()) + .map(AuthoredAssetValue::TextureImportSettings), + AuthoredAssetDocumentKind::ProjectContentDefaults => { + Some(AuthoredAssetValue::ProjectContentDefaults( + world.resource::().defaults.clone(), + )) + } + } +} + +pub(super) fn source_path_for_recovery(world: &World, envelope: &RecoveryEnvelope) -> PathBuf { + match envelope.key.kind { + AuthoredAssetDocumentKind::Material | AuthoredAssetDocumentKind::MaterialInstance => { + PathBuf::from(&envelope.path) + } + _ => project_root(world).join(content_pipeline::REGISTRY_PATH), + } +} + +pub(super) fn discard_document_recovery(world: &World, key: &AuthoredAssetDocumentKey) { + let _ = remove_document_recovery(world, key); +} + +fn remove_document_recovery(world: &World, key: &AuthoredAssetDocumentKey) -> Result<(), String> { + let Some(state_root) = default_state_root() else { + return Ok(()); + }; + let directory = recovery_directory(&state_root, &project_root(world), key); + match fs::remove_dir_all(&directory) { + Ok(()) => Ok(()), + Err(error) if error.kind() == std::io::ErrorKind::NotFound => Ok(()), + Err(error) => Err(format!("could not remove {}: {error}", directory.display())), + } +} + +pub(super) fn recovery_directory( + state_root: &Path, + project_root: &Path, + key: &AuthoredAssetDocumentKey, +) -> PathBuf { + let project = blake3::hash(normalize_path(&project_root.to_string_lossy()).as_bytes()); + state_root + .join("asset-recovery") + .join(project.to_hex()) + .join(format!("{}-{}", key.kind.slug(), key.asset_id)) +} + +pub(super) fn prune_recovery(directory: &Path) -> Result<(), String> { + let mut files = fs::read_dir(directory) + .map_err(|error| format!("could not read {}: {error}", directory.display()))? + .filter_map(Result::ok) + .map(|entry| entry.path()) + .collect::>(); + files.sort(); + let remove = files.len().saturating_sub(RECOVERY_GENERATIONS); + for path in files.into_iter().take(remove) { + fs::remove_file(&path) + .map_err(|error| format!("could not prune {}: {error}", path.display()))?; + } + Ok(()) +} + +pub(super) fn revision_label(revision: &FileRevision) -> String { + match revision { + FileRevision::Missing => "missing".into(), + FileRevision::Present(hash) => hash.iter().map(|byte| format!("{byte:02x}")).collect(), + } +} + +pub(super) fn project_root(world: &World) -> PathBuf { + world + .get_resource::() + .map(|workspace| PathBuf::from(&workspace.root)) + .unwrap_or_else(|| PathBuf::from(".")) +} + +pub(super) fn normalize_path(path: &str) -> String { + path.replace('\\', "/") +} + +#[cfg(test)] +mod tests { + use super::*; + + fn material(label: &str) -> MaterialAsset { + MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: label.into(), + shader: Default::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: Default::default(), + } + } + + #[test] + fn dirty_state_is_derived_from_the_clean_document() { + let key = AuthoredAssetDocumentKey::new("material-id", AuthoredAssetDocumentKind::Material); + let mut store = AuthoredAssetDocumentStore::default(); + store.documents.insert( + key.clone(), + AuthoredAssetDocument::new( + key.clone(), + "assets/materials/test.ron".into(), + AuthoredAssetValue::Material(material("Clean")), + FileSnapshot::missing(), + ), + ); + + store.update_material(&key, material("Dirty")); + assert!(store.snapshot(&key).unwrap().dirty); + assert_eq!(store.active_key(), Some(&key)); + + store.update_material(&key, material("Clean")); + assert!(!store.snapshot(&key).unwrap().dirty); + assert_eq!( + store.snapshot(&key).unwrap().state, + AuthoredDocumentState::Clean + ); + assert!(store + .documents + .get(&key) + .is_some_and(|document| document.recovery_revision.is_none())); + } + + #[test] + fn returning_to_clean_marks_an_existing_recovery_for_cleanup() { + let key = AuthoredAssetDocumentKey::new("material-id", AuthoredAssetDocumentKind::Material); + let mut store = AuthoredAssetDocumentStore::default(); + store.documents.insert( + key.clone(), + AuthoredAssetDocument::new( + key.clone(), + "assets/materials/test.ron".into(), + AuthoredAssetValue::Material(material("Clean")), + FileSnapshot::missing(), + ), + ); + + store.update_material(&key, material("Dirty")); + let document = store.documents.get_mut(&key).unwrap(); + document.recovery_revision = Some(document.revision); + store.update_material(&key, material("Clean")); + + assert_eq!(stale_recovery_keys(&store), vec![key]); + } + + #[test] + fn recovery_equal_to_authoritative_source_never_prompts() { + let clean = AuthoredAssetValue::Material(material("Clean")); + let dirty = AuthoredAssetValue::Material(material("Dirty")); + + assert!(!recovery_requires_prompt(Some(&clean), &clean)); + assert!(recovery_requires_prompt(Some(&clean), &dirty)); + assert!(recovery_requires_prompt(None, &dirty)); + } + + #[test] + fn dirty_documents_survive_switching_active_context() { + let first = AuthoredAssetDocumentKey::new("first", AuthoredAssetDocumentKind::Material); + let second = AuthoredAssetDocumentKey::new("second", AuthoredAssetDocumentKind::Material); + let mut store = AuthoredAssetDocumentStore::default(); + for key in [&first, &second] { + store.documents.insert( + key.clone(), + AuthoredAssetDocument::new( + key.clone(), + format!("assets/{key:?}.ron"), + AuthoredAssetValue::Material(material("Clean")), + FileSnapshot::missing(), + ), + ); + } + store.update_material(&first, material("First dirty")); + store.update_material(&second, material("Second dirty")); + + assert_eq!(store.dirty_count(), 2); + assert_eq!(store.active_key(), Some(&second)); + } + + #[test] + fn registry_patch_updates_only_the_selected_record() { + let first_id = AssetId::new(); + let second_id = AssetId::new(); + let mut document = AssetRegistryDocument { + records: vec![ + AssetRecord { + id: first_id.clone(), + path: "assets/first.glb".into(), + label: "First".into(), + kind: AssetKind::Model, + source_fingerprint: None, + import_settings: ModelImportSettings::default().into(), + dependencies: Vec::new(), + }, + AssetRecord { + id: second_id.clone(), + path: "assets/second.glb".into(), + label: "Second".into(), + kind: AssetKind::Model, + source_fingerprint: None, + import_settings: ModelImportSettings::default().into(), + dependencies: Vec::new(), + }, + ], + ..Default::default() + }; + let changed = ModelImportSettings { + scale: 2.0, + ..Default::default() + }; + apply_registry_value( + &mut document, + &AuthoredAssetDocumentKey::new( + first_id.as_string(), + AuthoredAssetDocumentKind::ModelImportSettings, + ), + &AuthoredAssetValue::ModelImportSettings(changed), + ) + .unwrap(); + + assert_eq!(document.records[0].model_import().scale, 2.0); + assert_eq!(document.records[1].model_import().scale, 1.0); + } +} diff --git a/crates/editor/src/project/asset_documents/document_store/service.rs b/crates/editor/src/project/asset_documents/document_store/service.rs new file mode 100644 index 0000000..74179ce --- /dev/null +++ b/crates/editor/src/project/asset_documents/document_store/service.rs @@ -0,0 +1,320 @@ +use super::*; + +#[derive(Resource, Default)] +pub struct ContentProcessingQueue { + pub(super) pending: VecDeque, + pub(super) active: Option, +} + +#[derive(Debug, Clone)] +pub(super) enum ProcessingRequest { + Material { + key: AuthoredAssetDocumentKey, + revision: u64, + root: PathBuf, + record: AssetRecord, + registry: AssetRegistryDocument, + }, + Texture { + key: AuthoredAssetDocumentKey, + revision: u64, + root: PathBuf, + record: AssetRecord, + registry: AssetRegistryDocument, + }, + Model { + key: AuthoredAssetDocumentKey, + revision: u64, + root: PathBuf, + record: AssetRecord, + registry: AssetRegistryDocument, + }, + Defaults { + key: AuthoredAssetDocumentKey, + revision: u64, + root: PathBuf, + registry: AssetRegistryDocument, + }, +} + +impl ProcessingRequest { + pub(super) fn key(&self) -> &AuthoredAssetDocumentKey { + match self { + Self::Material { key, .. } + | Self::Texture { key, .. } + | Self::Model { key, .. } + | Self::Defaults { key, .. } => key, + } + } + + pub(super) fn revision(&self) -> u64 { + match self { + Self::Material { revision, .. } + | Self::Texture { revision, .. } + | Self::Model { revision, .. } + | Self::Defaults { revision, .. } => *revision, + } + } +} + +pub(super) struct ActiveProcessingJob { + pub(super) key: AuthoredAssetDocumentKey, + pub(super) revision: u64, + pub(super) handle: JoinHandle>, +} + +pub(super) enum ProcessingOutput { + RuntimeCatalog(RuntimeContentCatalog), + Model { + registry: AssetRegistryDocument, + runtime: RuntimeContentCatalog, + }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub(super) struct RecoveryEnvelope { + pub(super) key: AuthoredAssetDocumentKey, + pub(super) path: String, + pub(super) baseline_revision: String, + pub(super) value: AuthoredAssetValue, +} + +pub struct AuthoredAssetDocumentsPlugin; + +impl Plugin for AuthoredAssetDocumentsPlugin { + fn build(&self, app: &mut App) { + app.init_resource::() + .init_resource::() + .add_systems(Startup, discover_asset_recovery) + .add_systems( + Update, + ( + drive_asset_save_requests, + drive_content_processing, + tick_asset_recovery, + ) + .chain(), + ); + } +} + +pub fn ensure_material_document( + world: &mut World, + path: &str, + fallback_label: &str, +) -> AuthoredAssetDocumentKey { + ensure_file_document(world, path, AuthoredAssetDocumentKind::Material, || { + MaterialAsset::load_from_path(path) + .map(AuthoredAssetValue::Material) + .unwrap_or_else(|_| { + AuthoredAssetValue::Material(MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: fallback_label.to_string(), + shader: Default::default(), + shader_ref: None, + render_state: shared::MaterialRenderState::default(), + provenance: None, + inputs: shared::MaterialInputSet::default(), + }) + }) + }) +} + +pub fn ensure_material_instance_document( + world: &mut World, + path: &str, + fallback_label: &str, +) -> AuthoredAssetDocumentKey { + ensure_file_document( + world, + path, + AuthoredAssetDocumentKind::MaterialInstance, + || { + MaterialInstanceAsset::load_from_path(path) + .map(AuthoredAssetValue::MaterialInstance) + .unwrap_or_else(|_| { + AuthoredAssetValue::MaterialInstance(MaterialInstanceAsset { + schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, + label: fallback_label.to_string(), + base: Default::default(), + overrides: Default::default(), + }) + }) + }, + ) +} + +pub(crate) fn reload_file_document_after_conflict( + world: &mut World, + path: &Path, + kind: AuthoredAssetDocumentKind, +) -> Result { + let normalized = normalize_path(&path.to_string_lossy()); + let key = world + .resource::() + .path_index + .get(&normalized) + .filter(|key| key.kind == kind) + .cloned() + .ok_or_else(|| "the conflicted asset document is no longer open".to_string())?; + discard_document_recovery(world, &key); + { + let mut store = world.resource_mut::(); + store.documents.remove(&key); + store.path_index.remove(&normalized); + if store.active.as_ref() == Some(&key) { + store.active = None; + } + } + if let Some(mut overlay) = + world.get_resource_mut::() + { + overlay.remove(&key.asset_id); + } + if let Some(mut cache) = world.get_resource_mut::() { + cache.invalidate_disk_documents(); + } + Ok(format!("Reloaded {} from disk", path.display())) +} + +pub(crate) fn adopt_material_conflict_save_as( + world: &mut World, + original_path: &Path, + catalog_path: &str, + kind: AuthoredAssetDocumentKind, +) -> Result { + let original = normalize_path(&original_path.to_string_lossy()); + if let Some(key) = world + .resource::() + .path_index + .get(&original) + .filter(|key| key.kind == kind) + .cloned() + { + discard_document_recovery(world, &key); + let mut store = world.resource_mut::(); + store.documents.remove(&key); + store.path_index.remove(&original); + if store.active.as_ref() == Some(&key) { + store.active = None; + } + } + match kind { + AuthoredAssetDocumentKind::Material => { + ensure_material_document(world, catalog_path, "Material copy"); + } + AuthoredAssetDocumentKind::MaterialInstance => { + ensure_material_instance_document(world, catalog_path, "Material Instance copy"); + } + _ => return Err("Save As adoption requires a Material document".into()), + } + Ok(format!("Saved material copy to {catalog_path}")) +} + +pub(super) fn ensure_file_document( + world: &mut World, + path: &str, + kind: AuthoredAssetDocumentKind, + load: impl FnOnce() -> AuthoredAssetValue, +) -> AuthoredAssetDocumentKey { + let normalized = normalize_path(path); + if let Some(key) = world + .resource::() + .path_index + .get(&normalized) + .filter(|key| key.kind == kind) + .cloned() + { + return key; + } + let asset_id = world + .resource::() + .records + .iter() + .find(|record| normalize_path(&record.path) == normalized) + .map(|record| record.id.as_string()) + .unwrap_or_else(|| format!("path:{}", blake3::hash(normalized.as_bytes()).to_hex())); + let key = AuthoredAssetDocumentKey::new(asset_id, kind); + let snapshot = + FileSnapshot::capture(Path::new(path)).unwrap_or_else(|_| FileSnapshot::missing()); + let document = AuthoredAssetDocument::new(key.clone(), normalized.clone(), load(), snapshot); + let mut store = world.resource_mut::(); + store.path_index.insert(normalized, key.clone()); + store.documents.insert(key.clone(), document); + key +} + +pub fn ensure_model_import_document( + world: &mut World, + record: &AssetRecord, +) -> AuthoredAssetDocumentKey { + ensure_registry_document( + world, + record.id.clone(), + &record.path, + AuthoredAssetDocumentKind::ModelImportSettings, + AuthoredAssetValue::ModelImportSettings(record.model_import().clone()), + ) +} + +pub fn ensure_texture_import_document( + world: &mut World, + record: &AssetRecord, +) -> AuthoredAssetDocumentKey { + ensure_registry_document( + world, + record.id.clone(), + &record.path, + AuthoredAssetDocumentKind::TextureImportSettings, + AuthoredAssetValue::TextureImportSettings( + record.texture_import().cloned().unwrap_or_default(), + ), + ) +} + +pub fn ensure_content_defaults_document(world: &mut World) -> AuthoredAssetDocumentKey { + let defaults = world.resource::().defaults.clone(); + ensure_registry_document( + world, + AssetId(uuid::Uuid::nil()), + content_pipeline::REGISTRY_PATH, + AuthoredAssetDocumentKind::ProjectContentDefaults, + AuthoredAssetValue::ProjectContentDefaults(defaults), + ) +} + +pub(super) fn ensure_registry_document( + world: &mut World, + asset_id: AssetId, + logical_path: &str, + kind: AuthoredAssetDocumentKind, + value: AuthoredAssetValue, +) -> AuthoredAssetDocumentKey { + let key = AuthoredAssetDocumentKey::new(asset_id.as_string(), kind); + if world + .resource::() + .documents + .contains_key(&key) + { + return key; + } + let root = project_root(world); + let registry_path = root.join(content_pipeline::REGISTRY_PATH); + let snapshot = + FileSnapshot::capture(®istry_path).unwrap_or_else(|_| FileSnapshot::missing()); + let registry = world.resource::().document(); + let document = AuthoredAssetDocument::new( + key.clone(), + normalize_path(logical_path), + value, + snapshot.clone(), + ); + let mut store = world.resource_mut::(); + store.registry_clean.get_or_insert(registry); + store.registry_snapshot.get_or_insert(snapshot); + store + .path_index + .insert(normalize_path(logical_path), key.clone()); + store.documents.insert(key.clone(), document); + key +} diff --git a/crates/editor/src/project/asset_documents/document_store/store.rs b/crates/editor/src/project/asset_documents/document_store/store.rs new file mode 100644 index 0000000..39eadd6 --- /dev/null +++ b/crates/editor/src/project/asset_documents/document_store/store.rs @@ -0,0 +1,338 @@ +use super::*; + +pub(super) const RECOVERY_IDLE: Duration = Duration::from_secs(2); +pub(super) const RECOVERY_GENERATIONS: usize = 5; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub enum AuthoredAssetDocumentKind { + Material, + MaterialInstance, + ModelImportSettings, + TextureImportSettings, + ProjectContentDefaults, +} + +impl AuthoredAssetDocumentKind { + pub(super) fn slug(self) -> &'static str { + match self { + Self::Material => "material", + Self::MaterialInstance => "material-instance", + Self::ModelImportSettings => "model-import", + Self::TextureImportSettings => "texture-import", + Self::ProjectContentDefaults => "content-defaults", + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct AuthoredAssetDocumentKey { + pub asset_id: String, + pub kind: AuthoredAssetDocumentKind, +} + +impl AuthoredAssetDocumentKey { + pub(super) fn new(asset_id: impl Into, kind: AuthoredAssetDocumentKind) -> Self { + Self { + asset_id: asset_id.into(), + kind, + } + } +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum AuthoredDocumentState { + #[default] + Clean, + Dirty, + Saving, + ExternalConflict, + SaveFailed, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum DerivedProcessingState { + #[default] + Idle, + Queued, + Processing, + Failed, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub(super) enum AuthoredAssetValue { + Material(MaterialAsset), + MaterialInstance(MaterialInstanceAsset), + ModelImportSettings(ModelImportSettings), + TextureImportSettings(TextureImportSettings), + ProjectContentDefaults(ProjectContentDefaults), +} + +impl PartialEq for AuthoredAssetValue { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::Material(left), Self::Material(right)) => left == right, + (Self::MaterialInstance(left), Self::MaterialInstance(right)) => left == right, + (Self::ModelImportSettings(left), Self::ModelImportSettings(right)) => left == right, + (Self::TextureImportSettings(left), Self::TextureImportSettings(right)) => { + left == right + } + (Self::ProjectContentDefaults(left), Self::ProjectContentDefaults(right)) => { + left == right + } + _ => false, + } + } +} + +#[derive(Debug, Clone)] +pub(super) struct AuthoredAssetDocument { + pub(super) key: AuthoredAssetDocumentKey, + pub(super) path: String, + pub(super) clean: AuthoredAssetValue, + pub(super) current: AuthoredAssetValue, + pub(super) disk_snapshot: FileSnapshot, + pub(super) revision: u64, + pub(super) state: AuthoredDocumentState, + pub(super) processing: DerivedProcessingState, + pub(super) error: Option, + pub(super) changed_at: Option, + pub(super) recovery_revision: Option, +} + +impl AuthoredAssetDocument { + pub(super) fn new( + key: AuthoredAssetDocumentKey, + path: String, + value: AuthoredAssetValue, + disk_snapshot: FileSnapshot, + ) -> Self { + Self { + key, + path, + clean: value.clone(), + current: value, + disk_snapshot, + revision: 0, + state: AuthoredDocumentState::Clean, + processing: DerivedProcessingState::Idle, + error: None, + changed_at: None, + recovery_revision: None, + } + } + + pub(super) fn dirty(&self) -> bool { + self.current != self.clean + } + + pub(super) fn mark_edited(&mut self) { + self.revision = self.revision.wrapping_add(1); + self.state = AuthoredDocumentState::Dirty; + self.error = None; + self.changed_at = Some(Instant::now()); + } + + pub(super) fn refresh_state_from_value(&mut self) { + if self.dirty() { + self.mark_edited(); + } else { + self.state = AuthoredDocumentState::Clean; + self.error = None; + self.changed_at = None; + } + } +} + +#[derive(Debug, Clone)] +pub struct AuthoredDocumentSnapshot { + pub key: AuthoredAssetDocumentKey, + pub path: String, + pub state: AuthoredDocumentState, + pub processing: DerivedProcessingState, + pub dirty: bool, + pub error: Option, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum AssetSaveRequest { + Active, + All, +} + +#[derive(Resource, Debug, Default)] +pub struct AuthoredAssetDocumentStore { + pub(super) documents: HashMap, + pub(super) path_index: HashMap, + pub(super) active: Option, + pub(super) pending_save: Option, + pub(super) registry_clean: Option, + pub(super) registry_snapshot: Option, + pub(super) pending_recovery: Vec, + pub(super) recovery_prompt_open: bool, + pub(super) recovery_reviewing: bool, +} + +impl AuthoredAssetDocumentStore { + pub fn active_key(&self) -> Option<&AuthoredAssetDocumentKey> { + self.active.as_ref() + } + + pub fn set_active_scene(&mut self) { + self.active = None; + } + + pub fn request_save(&mut self, request: AssetSaveRequest) { + self.pending_save = Some(request); + } + + pub fn dirty_count(&self) -> usize { + self.documents + .values() + .filter(|document| document.dirty()) + .count() + } + + pub fn has_dirty_documents(&self) -> bool { + self.dirty_count() > 0 + } + + pub fn has_pending_or_failed_processing(&self) -> bool { + self.documents.values().any(|document| { + matches!( + document.processing, + DerivedProcessingState::Queued + | DerivedProcessingState::Processing + | DerivedProcessingState::Failed + ) + }) + } + + pub fn snapshot_for_path(&self, path: &str) -> Option { + let key = self.path_index.get(&normalize_path(path))?; + self.snapshot(key) + } + + pub fn snapshot(&self, key: &AuthoredAssetDocumentKey) -> Option { + let document = self.documents.get(key)?; + Some(AuthoredDocumentSnapshot { + key: key.clone(), + path: document.path.clone(), + state: document.state, + processing: document.processing, + dirty: document.dirty(), + error: document.error.clone(), + }) + } + + pub fn material(&self, key: &AuthoredAssetDocumentKey) -> Option<&MaterialAsset> { + match &self.documents.get(key)?.current { + AuthoredAssetValue::Material(asset) => Some(asset), + _ => None, + } + } + + pub fn material_instance( + &self, + key: &AuthoredAssetDocumentKey, + ) -> Option<&MaterialInstanceAsset> { + match &self.documents.get(key)?.current { + AuthoredAssetValue::MaterialInstance(asset) => Some(asset), + _ => None, + } + } + + pub fn model_import(&self, key: &AuthoredAssetDocumentKey) -> Option<&ModelImportSettings> { + match &self.documents.get(key)?.current { + AuthoredAssetValue::ModelImportSettings(settings) => Some(settings), + _ => None, + } + } + + pub fn texture_import(&self, key: &AuthoredAssetDocumentKey) -> Option<&TextureImportSettings> { + match &self.documents.get(key)?.current { + AuthoredAssetValue::TextureImportSettings(settings) => Some(settings), + _ => None, + } + } + + pub fn content_defaults( + &self, + key: &AuthoredAssetDocumentKey, + ) -> Option<&ProjectContentDefaults> { + match &self.documents.get(key)?.current { + AuthoredAssetValue::ProjectContentDefaults(defaults) => Some(defaults), + _ => None, + } + } + + pub fn update_material(&mut self, key: &AuthoredAssetDocumentKey, asset: MaterialAsset) { + self.update_value(key, AuthoredAssetValue::Material(asset)); + } + + pub fn update_material_instance( + &mut self, + key: &AuthoredAssetDocumentKey, + asset: MaterialInstanceAsset, + ) { + self.update_value(key, AuthoredAssetValue::MaterialInstance(asset)); + } + + pub fn update_model_import( + &mut self, + key: &AuthoredAssetDocumentKey, + settings: ModelImportSettings, + ) { + self.update_value(key, AuthoredAssetValue::ModelImportSettings(settings)); + } + + pub fn update_texture_import( + &mut self, + key: &AuthoredAssetDocumentKey, + settings: TextureImportSettings, + ) { + self.update_value(key, AuthoredAssetValue::TextureImportSettings(settings)); + } + + pub fn update_content_defaults( + &mut self, + key: &AuthoredAssetDocumentKey, + defaults: ProjectContentDefaults, + ) { + self.update_value(key, AuthoredAssetValue::ProjectContentDefaults(defaults)); + } + + pub(super) fn update_value( + &mut self, + key: &AuthoredAssetDocumentKey, + value: AuthoredAssetValue, + ) { + let Some(document) = self.documents.get_mut(key) else { + return; + }; + if document.current == value { + self.active = Some(key.clone()); + return; + } + document.current = value; + document.refresh_state_from_value(); + self.active = Some(key.clone()); + } + + pub fn discard(&mut self, key: &AuthoredAssetDocumentKey) -> bool { + let Some(document) = self.documents.get_mut(key) else { + return false; + }; + document.current = document.clean.clone(); + document.state = AuthoredDocumentState::Clean; + document.error = None; + document.changed_at = None; + true + } + + pub fn discard_all(&mut self) { + let keys = self.documents.keys().cloned().collect::>(); + for key in keys { + self.discard(&key); + } + } +} diff --git a/crates/editor/src/project/asset_documents/processing_impact.rs b/crates/editor/src/project/asset_documents/processing_impact.rs new file mode 100644 index 0000000..244a82c --- /dev/null +++ b/crates/editor/src/project/asset_documents/processing_impact.rs @@ -0,0 +1,134 @@ +//! Derived-processing classification for authored document saves. + +use shared::{ + EditorAssetRef, MaterialAsset, MaterialInputSet, MaterialInstanceAsset, TextureChannel, +}; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum DerivedProcessingImpact { + #[default] + None, + MaterialPacking, + TextureAndDependents, + ModelArtifacts, + CatalogDefaults, +} + +pub fn material_impact(clean: &MaterialAsset, current: &MaterialAsset) -> DerivedProcessingImpact { + if packing_bindings(&clean.inputs) != packing_bindings(¤t.inputs) { + DerivedProcessingImpact::MaterialPacking + } else { + DerivedProcessingImpact::None + } +} + +pub fn instance_impact( + clean: &MaterialInstanceAsset, + current: &MaterialInstanceAsset, +) -> DerivedProcessingImpact { + if clean.base != current.base + || packing_bindings(&clean.overrides) != packing_bindings(¤t.overrides) + { + DerivedProcessingImpact::MaterialPacking + } else { + DerivedProcessingImpact::None + } +} + +fn packing_bindings( + inputs: &MaterialInputSet, +) -> Vec<(String, Option, TextureChannel)> { + ["occlusion", "roughness", "metallic"] + .into_iter() + .map(|name| { + let binding = inputs.texture(name); + ( + name.to_string(), + binding.and_then(|binding| binding.texture.clone()), + binding.map(|binding| binding.channel).unwrap_or_default(), + ) + }) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + use shared::{MaterialParameter, MaterialParameterValue, MaterialTextureBinding}; + + #[test] + fn scalar_values_do_not_require_material_repacking() { + let clean = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Test".into(), + shader: Default::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: Default::default(), + }; + let mut current = clean.clone(); + current.inputs.values.push(MaterialParameter { + name: "roughness".into(), + value: MaterialParameterValue::Float(0.25), + }); + assert_eq!( + material_impact(&clean, ¤t), + DerivedProcessingImpact::None + ); + } + + #[test] + fn render_state_and_color_changes_do_not_require_material_repacking() { + let clean = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Test".into(), + shader: Default::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: Default::default(), + }; + let mut current = clean.clone(); + current.render_state.double_sided = true; + current.inputs.values.push(MaterialParameter { + name: "base_color".into(), + value: MaterialParameterValue::Color(shared::ColorDesc::srgb(0.2, 0.3, 0.4)), + }); + + assert_eq!( + material_impact(&clean, ¤t), + DerivedProcessingImpact::None + ); + } + + #[test] + fn arm_texture_or_channel_changes_require_one_material_pack() { + let clean = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Test".into(), + shader: Default::default(), + shader_ref: None, + render_state: Default::default(), + provenance: None, + inputs: Default::default(), + }; + let mut current = clean.clone(); + current.inputs.textures.push(MaterialTextureBinding { + name: "roughness".into(), + texture: Some(EditorAssetRef::new("arm", "texture:source", "ARM")), + channel: TextureChannel::G, + }); + assert_eq!( + material_impact(&clean, ¤t), + DerivedProcessingImpact::MaterialPacking + ); + + let mut channel_change = current.clone(); + channel_change.inputs.textures[0].channel = TextureChannel::R; + assert_eq!( + material_impact(¤t, &channel_change), + DerivedProcessingImpact::MaterialPacking + ); + } +} diff --git a/crates/editor/src/project/collaboration.rs b/crates/editor/src/project/collaboration.rs index 120fbe0..de40ba6 100644 --- a/crates/editor/src/project/collaboration.rs +++ b/crates/editor/src/project/collaboration.rs @@ -285,6 +285,7 @@ pub(crate) enum FileWriteIntent { Scene { tab_id: u64, entity_count: usize }, Material, MaterialInstance, + AssetRegistry, ProjectSettings, PrefabSource { instance_root: Entity }, PrefabSourceHistory { instance_root: Entity }, @@ -297,6 +298,7 @@ impl FileWriteIntent { Self::Scene { .. } => "scene", Self::Material => "material", Self::MaterialInstance => "material instance", + Self::AssetRegistry => "asset registry settings", Self::ProjectSettings => "project settings", Self::PrefabSource { .. } => "prefab source", Self::PrefabSourceHistory { .. } => "prefab source history", @@ -452,7 +454,7 @@ pub(crate) fn file_status_indicator_ui( let fill = egui::Color32::from_rgba_unmultiplied(color.r(), color.g(), color.b(), 18); let response = egui::Frame::new() .fill(fill) - .stroke(egui::Stroke::new(1.0, color.linear_multiply(0.55))) + .stroke(egui::Stroke::new(1.0_f32, color.linear_multiply(0.55))) .corner_radius(2.0) .inner_margin(egui::Margin::symmetric(5, 1)) .show(ui, |ui| { @@ -679,7 +681,7 @@ pub(crate) fn file_conflict_modal(world: &mut World, ctx: &egui::Context) { ui.add_space(10.0); egui::Frame::new() .fill(crate::ui::theme::PANEL_BG_DARK) - .stroke(egui::Stroke::new(1.0, crate::ui::theme::BORDER)) + .stroke(egui::Stroke::new(1.0_f32, crate::ui::theme::BORDER)) .corner_radius(3.0) .inner_margin(egui::Margin::same(9)) .show(ui, |ui| { @@ -850,7 +852,16 @@ fn resolve_conflict_reload(world: &mut World, conflict: &PendingFileConflict) { crate::scene_io::reload_scene_after_file_conflict(world, *tab_id, &conflict.path) } FileWriteIntent::Material | FileWriteIntent::MaterialInstance => { - crate::ui::reload_material_after_file_conflict(world, &conflict.path, &conflict.intent) + let kind = match conflict.intent { + FileWriteIntent::Material => { + crate::asset_documents::AuthoredAssetDocumentKind::Material + } + _ => crate::asset_documents::AuthoredAssetDocumentKind::MaterialInstance, + }; + crate::asset_documents::reload_file_document_after_conflict(world, &conflict.path, kind) + } + FileWriteIntent::AssetRegistry => { + crate::asset_documents::reload_registry_documents_after_file_conflict(world) } FileWriteIntent::ProjectSettings => { crate::settings_ui::reload_project_settings_after_file_conflict(world, &conflict.path) @@ -973,14 +984,23 @@ fn finish_conflict_save_as( *entity_count, ), FileWriteIntent::Material | FileWriteIntent::MaterialInstance => { - crate::ui::adopt_material_conflict_save_as( + let kind = match conflict.intent { + FileWriteIntent::Material => { + crate::asset_documents::AuthoredAssetDocumentKind::Material + } + _ => crate::asset_documents::AuthoredAssetDocumentKind::MaterialInstance, + }; + crate::asset_documents::adopt_material_conflict_save_as( world, &conflict.path, - material_catalog_path.expect("validated material path"), - disk_snapshot, - &conflict.intent, + &material_catalog_path.expect("validated material path"), + kind, ) } + FileWriteIntent::AssetRegistry => Ok(format!( + "Saved asset registry recovery copy to {}; active registry and dirty documents unchanged", + destination.display() + )), FileWriteIntent::ProjectSettings => { crate::settings_ui::project_settings_conflict_copy_saved(world); Ok(format!( @@ -1616,8 +1636,11 @@ mod tests { assets: Vec::new(), current_folder: "assets".into(), selected: None, + selections: Vec::new(), + selection_anchor: None, dragging: None, status: String::new(), + catalog_revision: 1, }; let mut world = World::new(); world.insert_resource(workspace); diff --git a/crates/editor/src/project/launcher.rs b/crates/editor/src/project/launcher.rs index c0db77b..d903d47 100644 --- a/crates/editor/src/project/launcher.rs +++ b/crates/editor/src/project/launcher.rs @@ -201,7 +201,7 @@ fn project_launcher_ui(world: &mut World, context: &egui::Context, state: &mut P fn launcher_actions(world: &mut World, ui: &mut egui::Ui, state: &mut ProjectLauncherUi) { egui::Frame::new() .fill(PANEL_BG_DARK) - .stroke(egui::Stroke::new(1.0, BORDER)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) .inner_margin(egui::Margin::same(16)) .show(ui, |ui| { ui.set_min_height(455.0); @@ -303,7 +303,7 @@ fn recent_projects(world: &mut World, ui: &mut egui::Ui, state: &mut ProjectLaun if state.recents.is_empty() { egui::Frame::new() .fill(PANEL_BG) - .stroke(egui::Stroke::new(1.0, BORDER)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) .inner_margin(egui::Margin::same(16)) .show(ui, |ui| { ui.label(egui::RichText::new("No valid recent projects").color(TEXT)); @@ -322,7 +322,7 @@ fn recent_projects(world: &mut World, ui: &mut egui::Ui, state: &mut ProjectLaun for summary in recents { let response = egui::Frame::new() .fill(PANEL_BG) - .stroke(egui::Stroke::new(1.0, BORDER)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) .inner_margin(egui::Margin::same(14)) .show(ui, |ui| { ui.horizontal(|ui| { @@ -363,7 +363,7 @@ fn recent_projects(world: &mut World, ui: &mut egui::Ui, state: &mut ProjectLaun ui.painter().rect_stroke( response.response.rect, 0.0, - egui::Stroke::new(1.0, SELECTION), + egui::Stroke::new(1.0_f32, SELECTION), egui::StrokeKind::Inside, ); } @@ -666,14 +666,7 @@ pub fn scaffold_sandbox_project(destination: &Path, name: &str) -> Result() + .content_defaults(&document_key) + .cloned() + .unwrap_or_default(); + let current = defaults.default_material.clone(); + let materials = world + .resource::() + .records + .iter() + .filter(|record| { + matches!( + record.kind, + shared::AssetKind::Material | shared::AssetKind::MaterialInstance + ) + }) + .cloned() + .collect::>(); + let selected_label = current + .as_ref() + .map(|reference| reference.0.label.as_str()) + .unwrap_or(blacksite_surface::DEFAULT_GRID_LABEL); + let mut next = current.clone(); + ui.collapsing("Content", |ui| { + ui.label("Default material"); + egui::ComboBox::from_id_salt("project_default_material") + .selected_text(selected_label) + .show_ui(ui, |ui| { + if ui + .selectable_label(next.is_none(), blacksite_surface::DEFAULT_GRID_LABEL) + .clicked() + { + next = None; + } + for record in &materials { + let selected = next + .as_ref() + .is_some_and(|reference| reference.0.asset_id == record.id.as_string()); + if ui.selectable_label(selected, &record.label).clicked() { + let sub_asset_id = if record.kind == shared::AssetKind::MaterialInstance { + "material:instance" + } else { + "material:source" + }; + next = Some(shared::MaterialRef::new( + shared::EditorAssetRef::new( + record.id.as_string(), + sub_asset_id, + record.label.clone(), + ) + .with_source_path(record.path.clone()), + )); + } + } + }); + ui.small("Clear restores the immutable engine Default Grid fallback."); + if ui + .add_enabled(next.is_some(), egui::Button::new("Clear")) + .clicked() + { + next = None; + } + }); + if next == current { + return; + } + defaults.default_material = next; + world + .resource_mut::() + .update_content_defaults(&document_key, defaults.clone()); + world + .resource_mut::() + .defaults = defaults.clone(); + *world.resource_mut::() = defaults; +} + fn persist_project_settings( world: &mut World, settings: &ProjectSettings, @@ -458,6 +541,34 @@ fn persist_project_settings( Ok((snapshot, source)) } +pub fn save_project_settings_if_dirty(world: &mut World) -> Result { + if !world + .get_resource::() + .is_some_and(|io| io.dirty) + { + return Ok(false); + } + let settings = world.resource::().clone(); + let expected = { + let io = world.resource::(); + io.loaded_source + .as_deref() + .map(|source| FileSnapshot::from_loaded_bytes(Path::new(&io.path), source.as_bytes())) + .unwrap_or_else(FileSnapshot::missing) + }; + let (snapshot, source) = persist_project_settings(world, &settings, &expected)?; + { + let mut io = world.resource_mut::(); + io.dirty = false; + io.loaded_source = Some(source); + } + if let Some(mut panel) = world.get_resource_mut::() { + panel.disk_snapshot = Some(snapshot); + panel.save_error = None; + } + Ok(true) +} + fn read_project_settings_document( path: &Path, ) -> Result<(ProjectSettings, String, FileSnapshot), String> { diff --git a/crates/editor/src/project/shutdown.rs b/crates/editor/src/project/shutdown.rs index 0ad9428..66de86a 100644 --- a/crates/editor/src/project/shutdown.rs +++ b/crates/editor/src/project/shutdown.rs @@ -103,6 +103,16 @@ impl ShutdownCoordinator { } } +#[cfg(test)] +pub(crate) fn arm_shutdown_save_for_test(world: &mut World) { + world.init_resource::(); + world + .resource_mut::() + .set_intent_for_test(ShutdownIntent::Saving { + source: ShutdownSource::Programmatic, + }); +} + /// Emitted once when the guarded dialog chooses `Save All`. /// /// Scene persistence owns the actual save sequence and must finish it with @@ -145,7 +155,7 @@ pub fn request_project_switch(world: &mut World) -> bool { /// Resolve the dirty-scene confirmation through the shared coordinator. pub fn resolve_shutdown_decision(world: &mut World, decision: ShutdownDecision) -> bool { - let (save_request, status) = { + let (save_request, discard_assets, status) = { let Some(mut coordinator) = world.get_resource_mut::() else { return false; }; @@ -157,6 +167,7 @@ pub fn resolve_shutdown_decision(world: &mut World, decision: ShutdownDecision) coordinator.intent = ShutdownIntent::Saving { source }; ( Some(source), + false, Some("Saving all modified scene tabs before shutdown"), ) } @@ -165,24 +176,37 @@ pub fn resolve_shutdown_decision(world: &mut World, decision: ShutdownDecision) source, require_clean_scenes: false, }; - (None, None) + (None, true, None) } ShutdownDecision::Cancel => { coordinator.intent = ShutdownIntent::Idle; ( None, + false, Some("Shutdown cancelled; unsaved scene tabs retained"), ) } } }; + if discard_assets { + crate::asset_documents::discard_all_authored_assets(world); + } + if let Some(status) = status { if let Some(mut scene_io) = world.get_resource_mut::() { scene_io.set_status(status); } } if let Some(source) = save_request { + if let Err(error) = crate::settings_ui::save_project_settings_if_dirty(world) { + complete_shutdown_save(world, ShutdownSaveOutcome::Failed(error)); + return true; + } + if let Err(error) = crate::asset_documents::save_all_authored_assets(world) { + complete_shutdown_save(world, ShutdownSaveOutcome::Failed(error)); + return true; + } world.write_message(ShutdownSaveAllRequested { source }); } true @@ -191,7 +215,9 @@ pub fn resolve_shutdown_decision(world: &mut World, decision: ShutdownDecision) /// Finish the save-all handoff. A reported success is authorized only after /// every scene tab is observably clean. pub fn complete_shutdown_save(world: &mut World, outcome: ShutdownSaveOutcome) -> bool { - let scenes_are_clean = !scene_has_unsaved_changes(world); + let documents_are_clean = !scene_has_unsaved_changes(world) + && !asset_documents_have_unsaved_changes(world) + && !project_settings_have_unsaved_changes(world); let Some(mut coordinator) = world.get_resource_mut::() else { return false; }; @@ -200,7 +226,7 @@ pub fn complete_shutdown_save(world: &mut World, outcome: ShutdownSaveOutcome) - }; match outcome { - ShutdownSaveOutcome::Saved if scenes_are_clean => { + ShutdownSaveOutcome::Saved if documents_are_clean => { coordinator.intent = ShutdownIntent::Authorized { source, require_clean_scenes: true, @@ -210,8 +236,10 @@ pub fn complete_shutdown_save(world: &mut World, outcome: ShutdownSaveOutcome) - } ShutdownSaveOutcome::Saved => { coordinator.intent = ShutdownIntent::Idle; - coordinator.last_blocker = - Some("Save All completed while unsaved scene tabs remain".into()); + coordinator.last_blocker = Some( + "Save All completed while unsaved scenes, assets, or project settings remain" + .into(), + ); false } ShutdownSaveOutcome::Cancelled => { @@ -271,7 +299,7 @@ fn drive_shutdown(world: &mut World) { | ShutdownIntent::Saving { .. } | ShutdownIntent::ExitSent { .. } => {} ShutdownIntent::WaitingForBroker { source } => { - let unsaved_count = unsaved_scene_count(world); + let unsaved_count = unsaved_document_count(world); if unsaved_count == 0 { world.resource_mut::().intent = ShutdownIntent::Authorized { source, @@ -289,10 +317,10 @@ fn drive_shutdown(world: &mut World) { "quitting" }; let description = if unsaved_count == 1 { - format!("One scene tab has unsaved changes. Save it before {action}?") + format!("One editor document has unsaved changes. Save it before {action}?") } else { format!( - "{unsaved_count} scene tabs have unsaved changes. Save all before {action}?" + "{unsaved_count} editor documents have unsaved changes. Save all before {action}?" ) }; let title = if source == ShutdownSource::SwitchProject { @@ -339,7 +367,11 @@ pub(crate) fn finalize_authorized_shutdown(world: &mut World) { }; (source, require_clean_scenes) }; - if require_clean_scenes && scene_has_unsaved_changes(world) { + if require_clean_scenes + && (scene_has_unsaved_changes(world) + || asset_documents_have_unsaved_changes(world) + || project_settings_have_unsaved_changes(world)) + { world.resource_mut::().intent = ShutdownIntent::WaitingForBroker { source }; return; @@ -386,6 +418,26 @@ fn unsaved_scene_count(world: &World) -> usize { } } +fn unsaved_document_count(world: &World) -> usize { + unsaved_scene_count(world) + + world + .get_resource::() + .map_or(0, |store| store.dirty_count()) + + usize::from(project_settings_have_unsaved_changes(world)) +} + +fn asset_documents_have_unsaved_changes(world: &World) -> bool { + world + .get_resource::() + .is_some_and(|store| store.has_dirty_documents()) +} + +fn project_settings_have_unsaved_changes(world: &World) -> bool { + world + .get_resource::() + .is_some_and(|io| io.dirty) +} + fn decision_from_dialog(result: rfd::MessageDialogResult) -> ShutdownDecision { match result { rfd::MessageDialogResult::Custom(label) if label == SAVE_ALL_LABEL => { diff --git a/crates/editor/src/render_target.rs b/crates/editor/src/render_target.rs index 994eaf7..cbcba46 100644 --- a/crates/editor/src/render_target.rs +++ b/crates/editor/src/render_target.rs @@ -1,7 +1,7 @@ //! Shared HDR render-to-texture helpers for editor viewport panels. use bevy::prelude::*; -use bevy::render::render_resource::TextureFormat; +use bevy::render::render_resource::{Extent3d, TextureFormat}; /// Offscreen render target displayed by the primary editor viewport. #[derive(Debug, Clone)] @@ -13,16 +13,33 @@ pub struct ViewportTarget { #[derive(Resource, Default, Debug, Clone)] pub struct ViewportRenderTarget(pub Option); -/// Allocates or reuses an HDR offscreen color target when the panel size changes. +/// Allocates or resizes the HDR offscreen color target when the panel size changes. +/// +/// The asset identity remains stable across ordinary panel resizing. Besides avoiding needless +/// camera and bind-group churn, this prevents Egui's strong image registration from retaining one +/// full-resolution HDR target for every splitter movement. pub fn ensure_hdr_panel_target( physical_size: UVec2, last_size: &mut Option, + current: Option<&Handle>, images: &mut Assets, ) -> Option> { if *last_size == Some(physical_size) { return None; } *last_size = Some(physical_size); + + if let Some(current) = current { + if let Some(mut image) = images.get_mut(current) { + image.resize(Extent3d { + width: physical_size.x, + height: physical_size.y, + depth_or_array_layers: 1, + }); + return None; + } + } + Some(images.add(Image::new_target_texture( physical_size.x, physical_size.y, @@ -33,3 +50,37 @@ pub fn ensure_hdr_panel_target( /// Standard HDR format for editor panel render targets. pub const PANEL_TARGET_FORMAT: TextureFormat = TextureFormat::Rgba16Float; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn repeated_panel_resize_reuses_one_hdr_image_asset() { + let mut images = Assets::::default(); + let mut last_size = None; + let initial = + ensure_hdr_panel_target(UVec2::new(1920, 1080), &mut last_size, None, &mut images) + .expect("first size allocates the viewport target"); + let initial_id = initial.id(); + + for width in [1600, 1280, 900, 1280, 1600, 1920] { + assert!( + ensure_hdr_panel_target( + UVec2::new(width, 1080), + &mut last_size, + Some(&initial), + &mut images, + ) + .is_none(), + "resize should mutate the existing image" + ); + assert_eq!(initial.id(), initial_id); + assert_eq!( + images.get(&initial).expect("target remains live").width(), + width + ); + assert_eq!(images.len(), 1); + } + } +} diff --git a/crates/editor/src/scene/scene_io.rs b/crates/editor/src/scene/scene_io.rs index d37e4d7..7b481b8 100644 --- a/crates/editor/src/scene/scene_io.rs +++ b/crates/editor/src/scene/scene_io.rs @@ -24,7 +24,10 @@ use shared::{ AnimationControllerDesc, AudioSourceDesc, BrushDesc, ColliderDesc, SkinnedMeshRenderer, }; -use crate::assets::{import_external_assets, EditorAssets, IMPORTABLE_ASSET_EXTENSIONS}; +use crate::assets::{ + plan_external_assets_import_at, EditorAssets, ExternalAssetImportPlan, + IMPORTABLE_ASSET_EXTENSIONS, +}; use crate::history::{clear_level_objects, snapshot_entity, EditorHistory}; use crate::native_dialog::NativeDialogBroker; use crate::project::collaboration::{publish_authored_file, FileSnapshot, FileWriteIntent}; @@ -48,7 +51,7 @@ pub enum SceneIoRequest { Open, Save, SaveAs, - ImportAssets, + ImportAssets { destination: String }, ExportSelection, SaveSelectionAsPrefab, SwitchProject, @@ -63,6 +66,15 @@ pub enum SceneIoRequest { ReloadComposition, } +#[derive(Debug, Clone)] +pub struct PlannedAssetImportReview { + pub plan: ExternalAssetImportPlan, + pub previous_status: String, +} + +#[derive(Resource, Debug, Default, Clone)] +pub struct PendingAssetImportReview(pub Option); + #[derive(Debug, Clone)] pub struct SceneTab { pub id: u64, @@ -235,6 +247,7 @@ struct RecoveryClock { #[derive(Resource, Debug, Default)] struct SceneSaveAllTransaction { start_requested: bool, + shutdown_requested: bool, active: Option, } @@ -256,6 +269,7 @@ pub struct SceneIoPlugin; impl Plugin for SceneIoPlugin { fn build(&self, app: &mut App) { app.init_resource::() + .init_resource::() .init_resource::() .init_resource::() .init_resource::() @@ -280,9 +294,17 @@ fn receive_shutdown_save_all_requests( ) { if requests.read().next().is_some() { transaction.start_requested = true; + transaction.shutdown_requested = true; } } +/// Save every dirty scene tab without entering the guarded shutdown flow. +pub fn request_scene_save_all(world: &mut World) { + let mut transaction = world.resource_mut::(); + transaction.start_requested = true; + transaction.shutdown_requested = false; +} + fn load_startup_scene(world: &mut World) { let active_path = world.resource::().active_path.clone(); let default_path = PathBuf::from( @@ -353,7 +375,7 @@ fn process_scene_io_requests(world: &mut World) { SceneIoRequest::Save => save_active_or_prompt(world), SceneIoRequest::SaveAs => save_with_dialog(world), SceneIoRequest::Open => open_with_dialog(world), - SceneIoRequest::ImportAssets => import_with_dialog(world), + SceneIoRequest::ImportAssets { destination } => import_with_dialog(world, destination), SceneIoRequest::ExportSelection => export_selection_with_dialog(world), SceneIoRequest::SaveSelectionAsPrefab => save_selection_as_prefab(world), SceneIoRequest::SwitchProject => { @@ -1095,7 +1117,13 @@ fn finish_save_all_without_run(world: &mut World, outcome: ShutdownSaveOutcome) ShutdownSaveOutcome::Cancelled => "Save All cancelled; editor remains open".to_string(), ShutdownSaveOutcome::Failed(error) => format!("Save All failed: {error}"), }; - complete_shutdown_save(world, outcome); + let shutdown_requested = { + let mut transaction = world.resource_mut::(); + std::mem::take(&mut transaction.shutdown_requested) + }; + if shutdown_requested { + complete_shutdown_save(world, outcome); + } world.resource_mut::().set_status(status); } @@ -1411,23 +1439,51 @@ fn open_with_dialog(world: &mut World) -> String { } } -fn import_with_dialog(world: &mut World) -> String { +fn import_with_dialog(world: &mut World, destination: String) -> String { + let destination = if destination == crate::assets::BUILTINS_FOLDER { + crate::assets::ASSETS_ROOT.to_string() + } else { + destination + }; + let previous_status = world.resource::().status.clone(); let request = world.resource::().request( || { rfd::FileDialog::new() .add_filter("Editor assets", IMPORTABLE_ASSET_EXTENSIONS) .pick_files() }, - |world, paths| { + move |world, paths| { let status = match paths { - None => "Import cancelled".to_string(), - Some(paths) => match import_external_assets(&paths) { - Ok(count) => { - world.resource_mut::().refresh(); - format!("Imported {count} asset(s)") + None => previous_status.clone(), + Some(paths) => { + let project_root = world + .resource::() + .root + .clone(); + match plan_external_assets_import_at( + Path::new(&project_root), + &paths, + Path::new(&destination), + ) { + Ok(plan) => { + let count = plan.imported_count(); + let conflicts = plan.conflicts.len(); + world.resource_mut::().0 = + Some(PlannedAssetImportReview { + plan, + previous_status: previous_status.clone(), + }); + if conflicts == 0 { + format!("Review {count} planned asset import(s)") + } else { + format!( + "Review {count} planned import(s) with {conflicts} conflict(s)" + ) + } + } + Err(err) => format!("Import planning failed: {err}"), } - Err(err) => format!("Import failed: {err}"), - }, + } }; world.resource_mut::().set_status(status); }, @@ -2665,17 +2721,22 @@ fn update_window_title( workspace: Res, settings: Res, settings_io: Res, + asset_documents: Res, mut window: Single<&mut Window, With>, ) { if !io.is_changed() && !workspace.is_changed() && !settings.is_changed() && !settings_io.is_changed() + && !asset_documents.is_changed() { return; } window.title = crate::project_io::window_title(&io, &workspace, &settings); + if asset_documents.has_dirty_documents() { + window.title.push_str(" [assets*]"); + } } #[cfg(test)] @@ -2687,7 +2748,6 @@ mod tests { use bevy::world_serialization::{ DynamicWorldRoot, WorldInstanceSpawner, WorldSerializationPlugin, }; - struct NoAssetLoads; #[derive(Component, Reflect, Default)] @@ -2742,12 +2802,10 @@ mod tests { } fn arm_shutdown_save(world: &mut World) { - world.init_resource::(); world - .resource_mut::() - .set_intent_for_test(crate::shutdown::ShutdownIntent::Saving { - source: crate::shutdown::ShutdownSource::Programmatic, - }); + .resource_mut::() + .shutdown_requested = true; + crate::shutdown::arm_shutdown_save_for_test(world); } fn prepare_saved_dirty_checkpoint_scene(app: &mut App, root: &Path) -> PathBuf { diff --git a/crates/editor/src/scene/scene_view.rs b/crates/editor/src/scene/scene_view.rs index 5725d33..966b802 100644 --- a/crates/editor/src/scene/scene_view.rs +++ b/crates/editor/src/scene/scene_view.rs @@ -34,10 +34,15 @@ pub(crate) fn ensure_viewport_render_target( mut last_size: Local>, ) { let Some(physical_size) = panel_physical_size(&window, ui_state.viewport_rect) else { + target.0 = None; + *last_size = None; return; }; - if let Some(handle) = ensure_hdr_panel_target(physical_size, &mut last_size, &mut images) { + let current = target.0.as_ref().map(|target| &target.image); + if let Some(handle) = + ensure_hdr_panel_target(physical_size, &mut last_size, current, &mut images) + { target.0 = Some(ViewportTarget { image: handle }); } } diff --git a/crates/editor/src/ui/actor_inspector/layout.rs b/crates/editor/src/ui/actor_inspector/layout.rs new file mode 100644 index 0000000..974cbb3 --- /dev/null +++ b/crates/editor/src/ui/actor_inspector/layout.rs @@ -0,0 +1,63 @@ +//! Testable Inspector body containment geometry. + +use bevy_egui::egui; + +pub(super) fn configure_component_scroll_style(style: &mut egui::Style) { + let scroll = &mut style.spacing.scroll; + scroll.floating = true; + scroll.bar_width = 8.0; + scroll.floating_width = 3.0; + scroll.floating_allocated_width = 4.0; + scroll.content_margin.right = 4; +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(super) struct InspectorBodyLayout { + pub body: egui::Rect, + pub clip: egui::Rect, +} + +impl InspectorBodyLayout { + pub(super) fn contained(available: egui::Rect, parent_clip: egui::Rect) -> Option { + let clip = available.intersect(parent_clip); + (available.is_positive() && clip.is_positive()).then_some(Self { + body: available, + clip, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn penpot_component_body_never_paints_above_fixed_header() { + let header_bottom = 96.0; + let available = + egui::Rect::from_min_max(egui::pos2(400.0, header_bottom), egui::pos2(1040.0, 900.0)); + let parent_clip = + egui::Rect::from_min_max(egui::pos2(400.0, 48.0), egui::pos2(1040.0, 860.0)); + let layout = InspectorBodyLayout::contained(available, parent_clip).unwrap(); + assert_eq!(layout.body.top(), header_bottom); + assert!(layout.clip.top() >= header_bottom); + assert_eq!(layout.clip.bottom(), 860.0); + } + + #[test] + fn penpot_component_body_rejects_empty_intersection_after_resize() { + let available = egui::Rect::from_min_max(egui::pos2(0.0, 120.0), egui::pos2(200.0, 200.0)); + let parent_clip = egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(200.0, 100.0)); + assert!(InspectorBodyLayout::contained(available, parent_clip).is_none()); + } + + #[test] + fn component_scrollbar_keeps_a_stable_content_width_when_overflow_changes() { + let mut style = egui::Style::default(); + configure_component_scroll_style(&mut style); + + assert!(style.spacing.scroll.floating); + assert_eq!(style.spacing.scroll.floating_allocated_width, 4.0); + assert_eq!(style.spacing.scroll.content_margin.right, 4); + } +} diff --git a/crates/editor/src/ui/actor_inspector/mod.rs b/crates/editor/src/ui/actor_inspector/mod.rs index 3d17092..447c64b 100644 --- a/crates/editor/src/ui/actor_inspector/mod.rs +++ b/crates/editor/src/ui/actor_inspector/mod.rs @@ -1,5 +1,6 @@ //! Actor-centric inspector (authoring components only). +mod layout; mod transform; use bevy::prelude::*; @@ -13,11 +14,31 @@ use crate::ui::selection_ops::is_linked_read_only; use crate::ui::theme::{panel_heading, BORDER, SELECTION, TEXT, TEXT_DIM, WIDGET_BG}; use crate::ui::widgets::phosphor_icon; +use layout::{configure_component_scroll_style, InspectorBodyLayout}; use transform::transform_inspector_ui; const COMPACT_ACTOR_HEADER_WIDTH: f32 = 360.0; pub fn draw_actor_inspector(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let actor_widget_key = stable_actor_widget_key(world, entity); + ui.push_id(("actor_inspector", actor_widget_key.as_str()), |ui| { + draw_actor_inspector_contents(world, ui, entity, &actor_widget_key); + }); +} + +fn stable_actor_widget_key(world: &World, entity: Entity) -> String { + world + .get::(entity) + .map(|actor_id| format!("actor:{}", actor_id.0)) + .unwrap_or_else(|| format!("runtime:{entity:?}")) +} + +fn draw_actor_inspector_contents( + world: &mut World, + ui: &mut egui::Ui, + entity: Entity, + actor_widget_key: &str, +) { let linked_read_only = is_linked_read_only(world, entity); let prefab_member = world.get::(entity).is_some(); let Some(entity_ref) = world.get_entity(entity).ok() else { @@ -35,7 +56,7 @@ pub fn draw_actor_inspector(world: &mut World, ui: &mut egui::Ui, entity: Entity egui::Frame::new() .fill(WIDGET_BG) - .stroke(egui::Stroke::new(1.0, BORDER)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) .corner_radius(egui::CornerRadius::same(4)) .inner_margin(egui::Margin::symmetric(8, 8)) .show(ui, |ui| { @@ -94,48 +115,73 @@ pub fn draw_actor_inspector(world: &mut World, ui: &mut egui::Ui, entity: Entity } if prefab_member { - egui::ScrollArea::vertical() - .auto_shrink([false, false]) - .show(ui, |ui| { - crate::assets::prefab_overrides::prefab_member_inspector_ui(world, ui, entity); - }); + component_scroll_region(ui, actor_widget_key, true, |ui| { + crate::assets::prefab_overrides::prefab_member_inspector_ui(world, ui, entity); + }); return; } - ui.add_enabled_ui(!linked_read_only, |ui| { + component_scroll_region(ui, actor_widget_key, !linked_read_only, |ui| { + transform_inspector_ui(world, ui, entity); + + match kind { + ActorKind::StaticMesh + | ActorKind::SkinnedMesh + | ActorKind::Brush + | ActorKind::Terrain + | ActorKind::ImportedModel + | ActorKind::Light + | ActorKind::Empty + | ActorKind::PrefabAnchor + | ActorKind::PlayerSpawn + | ActorKind::WeaponSpawn + | ActorKind::TriggerVolume + | ActorKind::PostProcessVolume + | ActorKind::TeamSpawn + | ActorKind::Objective + | ActorKind::AudioSource + | ActorKind::AudioListener + | ActorKind::Navigation => { + inspector::authoring_inspector_ui(world, ui, entity); + } + } + + world.resource_scope(|world, registry: Mut| { + registry.draw_sections(world, ui, entity); + }); + + inspector::add_component_footer(world, ui, entity); + }); + inspector::property_block_promotion_review_ui(world, ui.ctx()); +} + +fn component_scroll_region( + ui: &mut egui::Ui, + actor_widget_key: &str, + enabled: bool, + add_contents: impl FnOnce(&mut egui::Ui), +) { + let available = ui.available_rect_before_wrap(); + let Some(layout) = InspectorBodyLayout::contained(available, ui.clip_rect()) else { + return; + }; + ui.allocate_rect(layout.body, egui::Sense::hover()); + let mut body = ui.new_child( + egui::UiBuilder::new() + .max_rect(layout.body) + .layout(egui::Layout::top_down(egui::Align::Min)), + ); + body.set_clip_rect(layout.clip); + // A solid scrollbar changes the component body's available width when content crosses the + // vertical overflow threshold. That can flip responsive component cards between layouts while + // the user resizes the Inspector. Keep the scrollbar floating and reserve only a stable, small + // interaction rail so every component receives the same width at every height. + configure_component_scroll_style(body.style_mut()); + body.add_enabled_ui(enabled, |ui| { egui::ScrollArea::vertical() + .id_salt(("actor_component_scroll", actor_widget_key)) .auto_shrink([false, false]) - .show(ui, |ui| { - transform_inspector_ui(world, ui, entity); - - match kind { - ActorKind::StaticMesh - | ActorKind::SkinnedMesh - | ActorKind::Brush - | ActorKind::Terrain - | ActorKind::ImportedModel - | ActorKind::Light - | ActorKind::Empty - | ActorKind::PrefabAnchor - | ActorKind::PlayerSpawn - | ActorKind::WeaponSpawn - | ActorKind::TriggerVolume - | ActorKind::PostProcessVolume - | ActorKind::TeamSpawn - | ActorKind::Objective - | ActorKind::AudioSource - | ActorKind::AudioListener - | ActorKind::Navigation => { - inspector::authoring_inspector_ui(world, ui, entity); - } - } - - world.resource_scope(|world, registry: Mut| { - registry.draw_sections(world, ui, entity); - }); - - inspector::add_component_footer(world, ui, entity); - }); + .show(ui, add_contents); }); } @@ -164,7 +210,7 @@ pub fn draw_multi_actor_inspector(world: &mut World, ui: &mut egui::Ui, entities if entities.is_empty() { egui::Frame::new() .fill(WIDGET_BG) - .stroke(egui::Stroke::new(1.0, BORDER)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) .corner_radius(egui::CornerRadius::same(4)) .inner_margin(egui::Margin::symmetric(10, 10)) .show(ui, |ui| { @@ -182,7 +228,7 @@ pub fn draw_multi_actor_inspector(world: &mut World, ui: &mut egui::Ui, entities egui::Frame::new() .fill(WIDGET_BG) - .stroke(egui::Stroke::new(1.0, BORDER)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) .corner_radius(egui::CornerRadius::same(4)) .inner_margin(egui::Margin::symmetric(10, 10)) .show(ui, |ui| { @@ -203,3 +249,20 @@ pub fn draw_multi_actor_inspector(world: &mut World, ui: &mut egui::Ui, entities }); }); } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn inspector_widget_identity_survives_runtime_entity_replacement() { + let mut world = World::new(); + let first = world.spawn(ActorId::new("persistent-actor")).id(); + let first_key = stable_actor_widget_key(&world, first); + world.despawn(first); + let replacement = world.spawn(ActorId::new("persistent-actor")).id(); + + assert_eq!(first_key, stable_actor_widget_key(&world, replacement)); + assert_eq!(first_key, "actor:persistent-actor"); + } +} diff --git a/crates/editor/src/ui/actor_inspector/transform.rs b/crates/editor/src/ui/actor_inspector/transform.rs index 7ae8d03..e591abd 100644 --- a/crates/editor/src/ui/actor_inspector/transform.rs +++ b/crates/editor/src/ui/actor_inspector/transform.rs @@ -11,7 +11,10 @@ use crate::ui::inspector::{ }; use crate::ui::theme::TEXT_DIM; -const WIDE_TRANSFORM_ROW_WIDTH: f32 = 360.0; +/// Minimum component-body width that can contain the label and all three fixed axis controls. +/// The Inspector's 420 px dock floor leaves a narrower component body, so it must use the wrapped +/// two-line form instead of clipping the Z field beyond the Inspector edge. +const WIDE_TRANSFORM_ROW_WIDTH: f32 = 440.0; const TRANSFORM_LABEL_WIDTH: f32 = 124.0; const AXIS_FIELD_WIDTH: f32 = 76.0; @@ -22,11 +25,10 @@ pub fn transform_inspector_ui(world: &mut World, ui: &mut egui::Ui, entity: Enti let old = transform; let mut changed = false; - let card = component_card_context( - world, - entity, - ComponentCardOptions::fixed(COMPONENT_TRANSFORM, "Transform", icons::ARROWS_OUT_CARDINAL), - ); + let mut options = + ComponentCardOptions::fixed(COMPONENT_TRANSFORM, "Transform", icons::ARROWS_OUT_CARDINAL); + options.summary = "Position · Rotation · Scale"; + let card = component_card_context(world, entity, options); let card_response = component_card(ui, &card, |ui| { if transform_row(ui, "Position", &mut transform.translation, 0.1) { changed = true; @@ -61,7 +63,7 @@ pub fn transform_inspector_ui(world: &mut World, ui: &mut egui::Ui, entity: Enti fn transform_row(ui: &mut egui::Ui, label: &str, value: &mut Vec3, speed: f64) -> bool { let mut changed = false; - if ui.available_width() < WIDE_TRANSFORM_ROW_WIDTH { + if transform_row_is_compact(ui.available_width()) { ui.vertical(|ui| { ui.label(label); ui.horizontal_wrapped(|ui| { @@ -84,6 +86,10 @@ fn transform_row(ui: &mut egui::Ui, label: &str, value: &mut Vec3, speed: f64) - changed } +fn transform_row_is_compact(width: f32) -> bool { + width + f32::EPSILON < WIDE_TRANSFORM_ROW_WIDTH +} + fn axis_drag(ui: &mut egui::Ui, axis: &str, value: &mut f32, speed: f64) -> bool { ui.horizontal(|ui| { ui.label(egui::RichText::new(axis).color(axis_color(axis)).strong()); @@ -107,3 +113,15 @@ fn axis_color(axis: &str) -> egui::Color32 { _ => TEXT_DIM, } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn transform_rows_wrap_at_the_inspector_floor_without_clipping_z() { + assert!(transform_row_is_compact(364.0)); + assert!(transform_row_is_compact(420.0)); + assert!(!transform_row_is_compact(584.0)); + } +} diff --git a/crates/editor/src/ui/animation_inspector.rs b/crates/editor/src/ui/animation_inspector.rs index 4c19765..c242b33 100644 --- a/crates/editor/src/ui/animation_inspector.rs +++ b/crates/editor/src/ui/animation_inspector.rs @@ -676,7 +676,7 @@ fn manifest_for_actor(world: &World, entity: Entity) -> Result { - Path(Option<&'a str>), - Reference(Option<&'a EditorAssetRef>), -} - -#[derive(Default)] -struct TextureSlotResponse { - selected: Option, - clear: bool, - accepted_drop: bool, } fn fit_width(ui: &egui::Ui, min: f32, max: f32) -> f32 { @@ -139,6 +124,65 @@ fn exact_region( add_contents(&mut child) } +fn exact_region_with_pointer( + ui: &mut egui::Ui, + size: egui::Vec2, + layout: egui::Layout, + add_contents: impl FnOnce(&mut egui::Ui, bool) -> R, +) -> (R, egui::Response) { + let (rect, _response) = ui.allocate_exact_size(size, egui::Sense::hover()); + let contains_pointer = ui + .ctx() + .pointer_hover_pos() + .is_some_and(|position| rect.contains(position)); + let mut child = ui.new_child( + egui::UiBuilder::new() + .max_rect(rect) + .layout(layout) + .sense(egui::Sense::click()), + ); + let result = add_contents(&mut child, contains_pointer); + let response = child.response(); + (result, response) +} + +fn details_width_for_layout(available_width: f32, tree_width: f32, requested: f32) -> f32 { + let separator_budget = if tree_width > 0.0 { 10.0 } else { 0.0 }; + let max_width = (available_width + - tree_width + - separator_budget + - DETAILS_RESIZE_HANDLE_WIDTH + - MIN_CONTENT_WIDTH) + .max(DETAILS_MIN_WIDTH); + requested.clamp(DETAILS_MIN_WIDTH, max_width) +} + +fn details_resize_handle(ui: &mut egui::Ui, height: f32) -> egui::Response { + let rect = egui::Rect::from_min_size( + ui.next_widget_position(), + egui::vec2(DETAILS_RESIZE_HANDLE_WIDTH, height), + ); + let response = ui.interact( + rect, + egui::Id::new("asset_details_resize_handle"), + egui::Sense::drag(), + ); + ui.advance_cursor_after_rect(rect); + let stroke_color = if response.hovered() || response.dragged() { + ACCENT + } else { + BORDER + }; + ui.painter().vline( + rect.center().x, + rect.y_range().shrink(4.0), + egui::Stroke::new(2.0_f32, stroke_color), + ); + response + .on_hover_cursor(egui::CursorIcon::ResizeHorizontal) + .on_hover_text("Drag to resize asset details; double-click to reset") +} + pub fn asset_browser_ui( world: &mut World, ui: &mut egui::Ui, @@ -147,12 +191,16 @@ pub fn asset_browser_ui( let available_width = ui.available_width().max(1.0); let available_height = ui.available_height().max(1.0); let body_height = (available_height - TOOLBAR_HEIGHT - FOOTER_HEIGHT - 4.0).max(40.0); + let browser_interactions_enabled = !content_browser_modal_active(world); exact_region( ui, egui::vec2(available_width, available_height), egui::Layout::top_down(egui::Align::Min), |ui| { + if !browser_interactions_enabled { + ui.disable(); + } exact_region( ui, egui::vec2(available_width, TOOLBAR_HEIGHT), @@ -207,11 +255,12 @@ pub fn asset_browser_ui( 0.0 }; let details_width = if show_details { - DETAILS_WIDTH.min((available_width * 0.28).max(DETAILS_MIN_WIDTH)) + details_width_for_layout(available_width, tree_width, state_snapshot.details_width) } else { 0.0 }; - let separator_budget = (show_tree as u8 as f32 + show_details as u8 as f32) * 10.0; + let separator_budget = (show_tree as u8 as f32) * 10.0 + + (show_details as u8 as f32) * DETAILS_RESIZE_HANDLE_WIDTH; let content_width = (available_width - tree_width - details_width - separator_budget) .max(MIN_CONTENT_WIDTH.min(available_width)); @@ -248,11 +297,11 @@ pub fn asset_browser_ui( ui.separator(); } - exact_region( + let (visible_order, content_response) = exact_region_with_pointer( ui, egui::vec2(content_width, body_height), egui::Layout::top_down(egui::Align::Min), - |ui| { + |ui, content_contains_pointer| { content_header(world, ui, ¤t_folder, &folders, &assets); egui::ScrollArea::vertical() .id_salt("asset_content_area") @@ -266,6 +315,14 @@ pub fn asset_browser_ui( ); let visible_assets = visible_assets(&assets, ¤t_folder, &state_snapshot); + let visible_order = + visible_selection_order(&child_folders, &visible_assets); + handle_content_shortcuts( + world, + ui.ctx(), + &visible_order, + content_contains_pointer, + ); prefetch_asset_row_thumbnails(world, &visible_assets); if child_folders.is_empty() && visible_assets.is_empty() { @@ -283,6 +340,7 @@ pub fn asset_browser_ui( &visible_assets, &cache_snapshot, thumbnail_size, + &visible_order, ); } else { asset_list( @@ -293,14 +351,33 @@ pub fn asset_browser_ui( &child_folders, &visible_assets, &cache_snapshot, + &visible_order, ); } - }); + visible_order + }) + .inner }, ); + content_empty_space(world, content_response, ¤t_folder, &visible_order); if show_details { - ui.separator(); + let resize_response = details_resize_handle(ui, body_height); + let requested_width = if resize_response.double_clicked() { + Some(ASSET_DETAILS_DEFAULT_WIDTH) + } else if resize_response.dragged() { + Some(details_width - resize_response.drag_delta().x) + } else { + None + }; + if let Some(requested_width) = requested_width { + world.resource_mut::().details_width = + details_width_for_layout( + available_width, + tree_width, + requested_width, + ); + } exact_region( ui, egui::vec2(details_width, body_height), @@ -338,4393 +415,65 @@ pub fn asset_browser_ui( ); draw_delete_modal(world, ui.ctx()); -} - -#[derive(Clone)] -struct AssetBrowserStateSnapshot { - search: String, - view: AssetBrowserView, - sort: AssetSort, - kind_filter: AssetKindFilter, - thumbnail_size: f32, - recursive: bool, - show_details: bool, -} - -fn state_snapshot(state: &AssetBrowserUiState) -> AssetBrowserStateSnapshot { - AssetBrowserStateSnapshot { - search: state.search.clone(), - view: state.view, - sort: state.sort, - kind_filter: state.kind_filter, - thumbnail_size: state.thumbnail_size, - recursive: state.recursive, - show_details: state.show_details, - } -} - -fn embedded_assets_for_asset(world: &World, asset: &EditorAsset) -> Vec { - if !matches!(asset.kind, EditorAssetKind::Model) { - return Vec::new(); - } - let Some(parent_path) = asset.path.as_ref() else { - return Vec::new(); - }; - let Some(record) = world - .get_resource::() - .and_then(|registry| find_asset_by_path(registry, parent_path)) - else { - return Vec::new(); - }; - let mut embedded = Vec::new(); - let use_source_materials = matches!( - record.import_settings.material_policy, - MaterialImportPolicy::SourceMaterials - ); - let static_manifest = record - .import_settings - .static_mesh_manifest_path - .as_deref() - .and_then(|path| load_static_mesh_manifest(path).ok()); - let legacy_skinned_primitives = static_manifest - .as_ref() - .filter(|manifest| manifest.schema_version < 2) - .map(|_| crate::assets::gltf_skinned_primitive_labels(parent_path.as_str())) - .unwrap_or_default(); - if let Some(manifest) = static_manifest.as_ref() { - for part in &manifest.parts { - let mesh_id = part_effective_id(part); - let material_label = part.material_label.clone(); - let requires_skinned_hierarchy = manifest.metadata.animation_count > 0 - || part.skinned - || legacy_skinned_primitives.contains(&part.mesh_label); - embedded.push(EmbeddedAsset { - selection: AssetSelection::SubAsset { - parent_path: parent_path.clone(), - sub_asset_id: mesh_id, - label: part.name.clone(), - kind: AssetSubAssetKind::Mesh, - source_path: None, - }, - label: part.name.clone(), - kind: AssetSubAssetKind::Mesh, - detail: if requires_skinned_hierarchy { - "Skinned | dedicated renderer".to_string() - } else { - part.source_mesh - .clone() - .unwrap_or_else(|| part.mesh_label.clone()) - }, - texture_path: None, - thumbnail_key: subasset_thumbnail_key( - parent_path, - AssetSubAssetKind::Mesh, - &part_effective_id(part), - ), - mesh_label: Some(part.mesh_label.clone()), - material_label, - requires_skinned_hierarchy, - }); - } - - let mut material_ids = HashSet::new(); - for part in &manifest.parts { - let Some(material_id) = part_effective_material_id(part) else { - continue; - }; - if !material_ids.insert(material_id.clone()) { - continue; - } - let label = if part.material_slot_name.trim().is_empty() { - part.material_label - .clone() - .unwrap_or_else(|| "Source Material".to_string()) - } else { - part.material_slot_name.clone() - }; - embedded.push(EmbeddedAsset { - selection: AssetSelection::SubAsset { - parent_path: parent_path.clone(), - sub_asset_id: material_id, - label: label.clone(), - kind: AssetSubAssetKind::Material, - source_path: None, - }, - label, - kind: AssetSubAssetKind::Material, - detail: if use_source_materials { - "Embedded source material".to_string() - } else { - "Source material disabled by Authoring Override".to_string() - }, - texture_path: None, - thumbnail_key: subasset_thumbnail_key( - parent_path, - AssetSubAssetKind::Material, - &part_effective_material_id(part).unwrap_or_else(|| { - material_id_from_label( - part.material_label - .as_deref() - .unwrap_or(&part.material_slot_name), - ) - }), - ), - mesh_label: None, - material_label: part.material_label.clone(), - requires_skinned_hierarchy: false, - }); - } - - let mut texture_paths = HashSet::new(); - for dependency in &manifest.source.dependencies { - if !is_texture_path(dependency) || !texture_paths.insert(dependency.clone()) { - continue; - } - let label = Path::new(dependency) - .file_stem() - .and_then(|stem| stem.to_str()) - .unwrap_or(dependency) - .to_string(); - embedded.push(EmbeddedAsset { - selection: AssetSelection::SubAsset { - parent_path: parent_path.clone(), - sub_asset_id: format!("texture:{}", stable_subasset_slug(dependency)), - label: label.clone(), - kind: AssetSubAssetKind::Texture, - source_path: Some(dependency.clone()), - }, - label, - kind: AssetSubAssetKind::Texture, - detail: dependency.clone(), - texture_path: Some(dependency.clone()), - thumbnail_key: subasset_thumbnail_key( - parent_path, - AssetSubAssetKind::Texture, - &stable_subasset_slug(dependency), - ), - mesh_label: None, - material_label: None, - requires_skinned_hierarchy: false, - }); - } - } - - let animation_manifest = record - .import_settings - .animation_manifest_path - .as_deref() - .and_then(|path| load_animation_manifest(path).ok()); - if let Some(manifest) = animation_manifest { - for skeleton in manifest.skeletons { - let signature = skeleton.signature.0; - let signature_short = signature.get(..8).unwrap_or(&signature); - embedded.push(EmbeddedAsset { - selection: AssetSelection::SubAsset { - parent_path: parent_path.clone(), - sub_asset_id: skeleton.id.clone(), - label: skeleton.label.clone(), - kind: AssetSubAssetKind::Skeleton, - source_path: Some(parent_path.clone()), - }, - label: skeleton.label, - kind: AssetSubAssetKind::Skeleton, - detail: format!( - "{} joints | rig {}", - skeleton.joint_paths.len(), - signature_short - ), - texture_path: None, - thumbnail_key: subasset_thumbnail_key( - parent_path, - AssetSubAssetKind::Skeleton, - &skeleton.id, - ), - mesh_label: None, - material_label: None, - requires_skinned_hierarchy: false, - }); - } - for clip in manifest.clips { - let event_suffix = if clip.events.is_empty() { - String::new() - } else { - format!(" | {} events", clip.events.len()) - }; - embedded.push(EmbeddedAsset { - selection: AssetSelection::SubAsset { - parent_path: parent_path.clone(), - sub_asset_id: clip.id.clone(), - label: clip.label.clone(), - kind: AssetSubAssetKind::AnimationClip, - source_path: Some(parent_path.clone()), - }, - label: clip.label, - kind: AssetSubAssetKind::AnimationClip, - detail: format!("{:.2}s{event_suffix}", clip.duration_seconds), - texture_path: None, - thumbnail_key: subasset_thumbnail_key( - parent_path, - AssetSubAssetKind::AnimationClip, - &clip.id, - ), - mesh_label: None, - material_label: None, - requires_skinned_hierarchy: false, - }); - } - } - - embedded -} - -fn embedded_asset_for_selection( - world: &World, - selection: &AssetSelection, -) -> Option { - let AssetSelection::SubAsset { parent_path, .. } = selection else { - return None; - }; - let asset = world - .resource::() - .assets - .iter() - .find(|asset| asset.path.as_deref() == Some(parent_path.as_str()))? - .clone(); - embedded_assets_for_asset(world, &asset) - .into_iter() - .find(|embedded| &embedded.selection == selection) -} - -fn has_embedded_assets(world: &World, asset: &EditorAsset) -> bool { - !embedded_assets_for_asset(world, asset).is_empty() -} - -fn part_effective_id(part: &crate::assets::static_mesh::StaticMeshPart) -> String { - if part.id.trim().is_empty() { - part_id_from_label(&part.mesh_label) - } else { - part.id.clone() - } -} - -fn part_effective_material_id(part: &crate::assets::static_mesh::StaticMeshPart) -> Option { - part.material_id.clone().or_else(|| { - part.material_label - .as_ref() - .map(|label| material_id_from_label(label)) - }) -} - -fn is_texture_path(path: &str) -> bool { - Path::new(path) - .extension() - .and_then(|extension| extension.to_str()) - .is_some_and(|extension| { - matches!( - extension.to_ascii_lowercase().as_str(), - "png" | "jpg" | "jpeg" | "webp" | "ktx2" - ) - }) -} - -fn stable_subasset_slug(label: &str) -> String { - let mut slug = String::new(); - for ch in label.chars() { - if ch.is_ascii_alphanumeric() { - slug.push(ch.to_ascii_lowercase()); - } else if !slug.ends_with('_') { - slug.push('_'); - } - } - slug.trim_matches('_').to_string() -} - -fn subasset_thumbnail_key( - parent_path: &str, - kind: AssetSubAssetKind, - sub_asset_id: &str, -) -> String { - format!( - "{}#{}:{}", - parent_path, - subasset_kind_label(kind).to_ascii_lowercase(), - sub_asset_id - ) -} - -fn asset_toolbar(world: &mut World, ui: &mut egui::Ui) { - ui.horizontal(|ui| { - if icon_button_small(ui, icons::ARROWS_CLOCKWISE, "Refresh").clicked() { - world.resource_mut::().refresh(); - invalidate_on_catalog_refresh(world); - } - if icon_button_small(ui, icons::UPLOAD, "Import assets").clicked() { - world.resource_mut::().request = Some(SceneIoRequest::ImportAssets); - } - if icon_button_small(ui, icons::ARROW_UP, "Parent folder").clicked() { - navigate_to_parent(world); - } - - ui.separator(); - - let mut state = world.resource_mut::(); - ui.add( - egui::TextEdit::singleline(&mut state.search) - .hint_text("Search assets...") - .desired_width(fit_width(ui, 120.0, 190.0)), - ); - ui.checkbox(&mut state.recursive, "Subfolders"); - - egui::ComboBox::from_id_salt("asset_kind_filter") - .selected_text(kind_filter_label(state.kind_filter)) - .show_ui(ui, |ui| { - ui.selectable_value(&mut state.kind_filter, AssetKindFilter::All, "All"); - ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Model, "Models"); - ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Texture, "Textures"); - ui.selectable_value( - &mut state.kind_filter, - AssetKindFilter::Material, - "Materials", - ); - ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Audio, "Audio"); - ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Level, "Levels"); - ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Prefab, "Prefabs"); - ui.selectable_value( - &mut state.kind_filter, - AssetKindFilter::Builtin, - "Built-ins", - ); - }); - - egui::ComboBox::from_id_salt("asset_sort") - .selected_text(sort_label(state.sort)) - .show_ui(ui, |ui| { - ui.selectable_value(&mut state.sort, AssetSort::Name, "Name"); - ui.selectable_value(&mut state.sort, AssetSort::Kind, "Type"); - ui.selectable_value(&mut state.sort, AssetSort::Modified, "Modified"); - ui.selectable_value(&mut state.sort, AssetSort::Size, "Size"); - }); - - ui.separator(); - if tool_button( - ui, - icons::GRID_FOUR, - state.view == AssetBrowserView::Grid, - "Grid view", - ) - .clicked() - { - state.view = AssetBrowserView::Grid; - } - if tool_button( - ui, - icons::LIST, - state.view == AssetBrowserView::List, - "List view", - ) - .clicked() - { - state.view = AssetBrowserView::List; - } - if ui.available_width() > 180.0 { - ui.label(icon_text(icons::IMAGE_SQUARE, 13.0).color(TEXT_DIM)); - ui.add_sized( - [96.0, 20.0], - egui::Slider::new(&mut state.thumbnail_size, 48.0..=112.0).show_value(false), - ); - } - ui.checkbox(&mut state.show_details, "Details"); - }); -} - -fn content_header( - world: &mut World, - ui: &mut egui::Ui, - current_folder: &str, - folders: &[FolderSnapshot], - assets: &[AssetRow], -) { - ui.horizontal_wrapped(|ui| { - ui.label(panel_heading("Assets")); - ui.separator(); - breadcrumb(world, ui, current_folder); - }); - let direct_assets = assets - .iter() - .filter(|row| row.asset.folder_path == current_folder) - .count(); - let direct_folders = folders - .iter() - .filter(|folder| folder.parent.as_deref() == Some(current_folder)) - .count(); - ui.small( - egui::RichText::new(format!("{direct_folders} folders, {direct_assets} assets")) - .color(TEXT_DIM), - ); -} - -fn prefetch_asset_row_thumbnails(world: &mut World, rows: &[AssetRow]) { - let requests: Vec<(String, String, EditorAssetKind)> = rows - .iter() - .filter(|row| { - matches!( - row.asset.kind, - EditorAssetKind::Texture | EditorAssetKind::Model | EditorAssetKind::Material - ) - }) - .filter_map(|row| { - Some(( - asset_cache_key(&row.asset), - row.asset.path.clone()?, - row.asset.kind.clone(), - )) - }) - .collect(); - if requests.is_empty() { - return; - } - let asset_server = world.resource::().clone(); - world.resource_scope(|world, mut cache: Mut| { - world.resource_scope(|_world, mut studio: Mut| { - for (key, path, kind) in &requests { - match kind { - EditorAssetKind::Texture => { - cache.request_texture(key.clone(), path.clone(), &asset_server); - } - EditorAssetKind::Model => { - cache.request_model(key.clone(), path.clone(), &asset_server, &mut studio); - } - EditorAssetKind::Material => { - cache.request_material_asset(key.clone(), path.clone(), &mut studio); - } - _ => {} - } - } - }); - }); -} - -fn breadcrumb(world: &mut World, ui: &mut egui::Ui, current_folder: &str) { - let mut parts = Vec::new(); - let mut cursor = Some(current_folder.to_string()); - while let Some(path) = cursor { - let label = if path == BUILTINS_FOLDER { - "Built-ins".to_string() - } else { - Path::new(&path) - .file_name() - .and_then(|name| name.to_str()) - .unwrap_or(&path) - .to_string() - }; - cursor = path.rfind('/').map(|index| path[..index].to_string()); - parts.push((path, label)); - } - parts.reverse(); - for (index, (path, label)) in parts.iter().enumerate() { - if index > 0 { - ui.label(egui::RichText::new("/").color(TEXT_DIM)); - } - if ui.link(label).clicked() { - world.resource_mut::().current_folder = path.clone(); - } - } -} - -fn selection_footer(world: &mut World, ui: &mut egui::Ui, selected_entities: &SelectedEntities) { - let selection = world.resource::().selected.clone(); - let selected_embedded = selection - .as_ref() - .and_then(|selection| embedded_asset_for_selection(world, selection)); - if let Some(AssetSelection::SubAsset { label, kind, .. }) = selection.clone() { - ui.add( - egui::Label::new(format!( - "Selected: {}: {}", - subasset_kind_label(kind), - label - )) - .truncate(), - ); - ui.horizontal_wrapped(|ui| match kind { - AssetSubAssetKind::Mesh => { - if selected_embedded - .as_ref() - .is_some_and(|embedded| embedded.requires_skinned_hierarchy) - { - if ui.button("Place Skinned Model").clicked() { - if let Some(selection) = selection.as_ref() { - place_subasset_operator(world, selection.clone(), Vec3::ZERO); - } - } - } else if ui.button("Place At Origin").clicked() { - if let Some(selection) = selection.as_ref() { - place_subasset_operator(world, selection.clone(), Vec3::ZERO); - } - } - } - AssetSubAssetKind::Texture => { - if ui.button("Apply Texture To Selection").clicked() { - if let Some(asset) = texture_asset_from_subasset_selection(world, &selection) { - apply_texture_operator(world, asset, selected_entities); - } - } - } - AssetSubAssetKind::Material => { - ui.small(egui::RichText::new("Embedded source material").color(TEXT_DIM)); - } - AssetSubAssetKind::Skeleton => { - ui.small(egui::RichText::new("Inspect-only rig metadata").color(TEXT_DIM)); - } - AssetSubAssetKind::AnimationClip => { - let animated_actor = selected_entities - .as_slice() - .iter() - .copied() - .find(|entity| world.get::(*entity).is_some()); - let action = if animated_actor.is_some() { - "Assign To Selected Actor" - } else { - "Create Animated Actor" - }; - if ui.button(action).clicked() { - if let Some(selection) = selection.as_ref() { - if let Some(entity) = animated_actor { - assign_animation_clip_operator(world, selection.clone(), entity); - } else { - place_subasset_operator(world, selection.clone(), Vec3::ZERO); - } - } - } - } - }); - } else if let Some(asset) = world.resource::().selected_asset().cloned() { - ui.add(egui::Label::new(format!("Selected: {}", asset_label(&asset))).truncate()); - ui.horizontal_wrapped(|ui| { - if matches!(asset.kind, EditorAssetKind::Texture) - && ui.button("Apply Texture To Selection").clicked() - { - apply_texture_operator(world, asset.clone(), selected_entities); - } - if matches!( - asset.kind, - EditorAssetKind::Primitive(_) - | EditorAssetKind::Light(_) - | EditorAssetKind::Model - | EditorAssetKind::AudioClip - | EditorAssetKind::Prefab - ) && ui.button("Place At Origin").clicked() - { - place_asset_operator(world, asset.clone(), Vec3::ZERO); - } - if matches!(asset.kind, EditorAssetKind::Level) && ui.button("Open Scene").clicked() { - open_level_asset(world, &asset); - } - }); - } else { - ui.label(egui::RichText::new("No asset selected").color(TEXT_DIM)); - } -} - -fn folder_tree_branch( - world: &mut World, - ui: &mut egui::Ui, - folders: &[FolderSnapshot], - node_path: &str, - depth: usize, - current_folder: &str, -) { - let Some(folder) = folders.iter().find(|folder| folder.path == node_path) else { - return; - }; - let path = &folder.path; - let name = &folder.name; - let children: Vec<&FolderSnapshot> = folders - .iter() - .filter(|child| child.parent.as_deref() == Some(path.as_str())) - .collect(); - let expanded = children.is_empty() - || world - .resource::() - .expanded_folders - .contains(path); - - let selected = current_folder == *path; - ui.horizontal(|ui| { - ui.add_space(depth as f32 * 12.0); - if children.is_empty() { - ui.add_sized( - [18.0, 20.0], - egui::Label::new(icon_text(icons::DOT_OUTLINE, 12.0).color(TEXT_DIM)), - ); - } else { - let icon = if expanded { - icons::CARET_DOWN - } else { - icons::CARET_RIGHT - }; - if ui - .add_sized( - [18.0, 18.0], - egui::Button::new(icon_text(icon, 12.0)).frame(false), - ) - .clicked() - { - let mut state = world.resource_mut::(); - if expanded { - state.expanded_folders.remove(path); - } else { - state.expanded_folders.insert(path.clone()); - } - } - } - ui.label(icon_text(icons::FOLDER, 14.0).color(TEXT_DIM)); - if ui - .add_sized( - [fit_width(ui, 72.0, f32::INFINITY), 20.0], - egui::Button::selectable(selected, name.as_str()), - ) - .clicked() - { - world.resource_mut::().current_folder = path.clone(); - } - }); - - if expanded { - for child in children { - folder_tree_branch(world, ui, folders, &child.path, depth + 1, current_folder); - } - } -} - -fn child_folders_for_content( - folders: &[FolderSnapshot], - current_folder: &str, - search: &str, -) -> Vec { - if !search.trim().is_empty() { - return Vec::new(); - } - let mut children: Vec = folders - .iter() - .filter(|folder| folder.parent.as_deref() == Some(current_folder)) - .cloned() - .collect(); - children.sort_by(|a, b| natural_cmp(&a.name, &b.name)); - children -} - -fn visible_assets( - assets: &[AssetRow], - current_folder: &str, - state: &AssetBrowserStateSnapshot, -) -> Vec { - let search = state.search.trim().to_ascii_lowercase(); - let mut rows: Vec = assets - .iter() - .filter(|row| { - if state.recursive { - row.asset.folder_path == current_folder - || row - .asset - .folder_path - .strip_prefix(current_folder) - .is_some_and(|rest| rest.starts_with('/')) - } else { - row.asset.folder_path == current_folder - } - }) - .filter(|row| asset_matches_kind_filter(&row.asset, state.kind_filter)) - .filter(|row| { - search.is_empty() - || row.asset.label.to_ascii_lowercase().contains(&search) - || row - .asset - .path - .as_deref() - .unwrap_or_default() - .to_ascii_lowercase() - .contains(&search) - }) - .cloned() - .collect(); - - rows.sort_by(|a, b| match state.sort { - AssetSort::Name => natural_cmp(&a.asset.label, &b.asset.label), - AssetSort::Kind => kind_label(&a.asset.kind).cmp(kind_label(&b.asset.kind)), - AssetSort::Modified => b.modified.cmp(&a.modified), - AssetSort::Size => b.file_size.cmp(&a.file_size), - }); - rows -} - -#[expect( - clippy::too_many_arguments, - reason = "asset grid rendering keeps immediate-mode UI inputs explicit" -)] -fn asset_grid( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - selected: &Option, - folders: &[FolderSnapshot], - assets: &[AssetRow], - cache_snapshot: &ThumbnailCacheSnapshot, - thumbnail_size: f32, -) { - let thumb_size = thumbnail_size.clamp(48.0, 112.0); - let cell_width = thumb_size + 20.0; - let gap = 6.0; - let columns = ((ui.available_width() + gap) / (cell_width + gap)) - .floor() - .max(1.0) as usize; - - for folder_row in folders.chunks(columns) { - ui.horizontal(|ui| { - ui.spacing_mut().item_spacing = egui::vec2(gap, gap); - for folder in folder_row { - let response = draw_folder_cell(ui, folder, thumbnail_size); - if response.double_clicked() || response.clicked() { - world.resource_mut::().current_folder = folder.path.clone(); - } - } - }); - } - - for asset_row in assets.chunks(columns) { - ui.horizontal(|ui| { - ui.spacing_mut().item_spacing = egui::vec2(gap, gap); - for row in asset_row { - draw_asset_grid_item( - world, - ui, - selected_entities, - selected, - row, - cache_snapshot, - thumbnail_size, - ); - } - }); - - for row in asset_row { - if row.asset.path.as_deref().is_some_and(|path| { - world - .resource::() - .expanded_assets - .contains(path) - }) { - embedded_asset_shelf( - world, - ui, - selected_entities, - selected, - &row.asset, - cache_snapshot, - thumbnail_size, - ); - } - } - } -} - -fn draw_asset_grid_item( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - selected: &Option, - row: &AssetRow, - cache_snapshot: &ThumbnailCacheSnapshot, - thumbnail_size: f32, -) { - let selection = &row.selection; - let asset = &row.asset; - let is_selected = selected.as_ref() == Some(selection); - let failure = cache_snapshot.failure_reason(asset); - let has_children = has_embedded_assets(world, asset); - let response = draw_asset_cell_with( - ui, - asset, - cache_snapshot.texture_for(asset), - cache_snapshot.is_pending(asset), - failure, - is_selected, - thumbnail_size, - ); - - if has_children { - let expanded = asset.path.as_deref().is_some_and(|path| { - world - .resource::() - .expanded_assets - .contains(path) - }); - let icon = if expanded { - icons::CARET_DOWN - } else { - icons::CARET_RIGHT - }; - let button_rect = egui::Rect::from_min_size( - response.rect.min + egui::vec2(6.0, 6.0), - egui::vec2(18.0, 18.0), - ); - let expand_response = ui.interact( - button_rect, - egui::Id::new(( - "asset_expand", - asset.path.as_deref().unwrap_or(&asset.label), - )), - egui::Sense::click(), - ); - ui.painter().rect( - button_rect, - 3.0, - if expand_response.hovered() { - ELEVATED_BG - } else { - WIDGET_BG.linear_multiply(1.15) - }, - egui::Stroke::new(1.0, BORDER), - egui::StrokeKind::Inside, - ); - ui.painter().text( - button_rect.center(), - egui::Align2::CENTER_CENTER, - icon.as_str(), - egui::FontId::new(11.0, egui::FontFamily::Name(PHOSPHOR.into())), - TEXT, - ); - if expand_response.clicked() { - if let Some(path) = asset.path.as_ref() { - toggle_asset_expanded(world, path); - } - } - } - - if failure.is_some() && response.double_clicked() { - let key = crate::assets::asset_cache_key(asset); - world - .resource_mut::() - .retry(&key); - } - - if response.clicked() { - world - .resource_mut::() - .select(selection.clone()); - } - if response.drag_started() { - world - .resource_mut::() - .start_drag(selection.clone()); - } - response.context_menu(|ui| { - asset_context_menu(world, ui, asset, selected_entities); - }); -} - -fn embedded_asset_shelf( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - selected: &Option, - parent_asset: &EditorAsset, - cache_snapshot: &ThumbnailCacheSnapshot, - thumbnail_size: f32, -) { - let embedded = embedded_assets_for_asset(world, parent_asset); - if embedded.is_empty() { - return; - } - prefetch_embedded_thumbnails(world, parent_asset, &embedded); - let parent_texture = cache_snapshot.texture_for(parent_asset); - - ui.add_space(4.0); - egui::Frame::new() - .fill(WIDGET_BG.linear_multiply(0.72)) - .stroke(egui::Stroke::new(1.0, BORDER.linear_multiply(0.85))) - .corner_radius(egui::CornerRadius::same(4)) - .inner_margin(egui::Margin::symmetric(8, 5)) - .show(ui, |ui| { - ui.set_min_width(ui.available_width()); - ui.horizontal(|ui| { - ui.label(icon_text(icons::TREE_STRUCTURE, 13.0).color(TEXT_DIM)); - ui.small( - egui::RichText::new(format!("{} contents", parent_asset.label)).color(TEXT_DIM), - ); - }); - egui::ScrollArea::horizontal() - .id_salt(format!( - "embedded_shelf_{}", - parent_asset.path.as_deref().unwrap_or(&parent_asset.label) - )) - .max_height(thumbnail_size.clamp(48.0, 88.0) + 56.0) - .auto_shrink([false, true]) - .show(ui, |ui| { - ui.horizontal(|ui| { - ui.spacing_mut().item_spacing = egui::vec2(7.0, 5.0); - for embedded_asset in &embedded { - draw_embedded_asset_cell( - world, - ui, - selected_entities, - selected, - embedded_asset, - cache_snapshot, - parent_texture, - thumbnail_size, - ); - } - }); - }); - }); - ui.add_space(4.0); -} - -fn prefetch_embedded_thumbnails( - world: &mut World, - parent_asset: &EditorAsset, - embedded: &[EmbeddedAsset], -) { - let Some(parent_path) = parent_asset.path.clone() else { - return; - }; - let asset_server = world.resource::().clone(); - let requests: Vec = embedded.to_vec(); - world.resource_scope(|world, mut cache: Mut| { - world.resource_scope(|_world, mut studio: Mut| { - for embedded_asset in &requests { - match embedded_asset.kind { - AssetSubAssetKind::Mesh => { - let Some(mesh_label) = embedded_asset.mesh_label.clone() else { - continue; - }; - cache.request_mesh_subasset( - embedded_asset.thumbnail_key.clone(), - parent_path.clone(), - mesh_label, - embedded_asset.material_label.clone(), - embedded_asset.requires_skinned_hierarchy, - &mut studio, - ); - } - AssetSubAssetKind::Material => { - let Some(material_label) = embedded_asset.material_label.clone() else { - continue; - }; - cache.request_source_material( - embedded_asset.thumbnail_key.clone(), - parent_path.clone(), - material_label, - &mut studio, - ); - } - AssetSubAssetKind::Texture => { - let Some(texture_path) = embedded_asset.texture_path.clone() else { - continue; - }; - cache.request_texture( - embedded_asset.thumbnail_key.clone(), - texture_path, - &asset_server, - ); - } - AssetSubAssetKind::Skeleton | AssetSubAssetKind::AnimationClip => {} - } - } - }); - }); -} - -#[expect( - clippy::too_many_arguments, - reason = "embedded asset rendering keeps immediate-mode UI inputs explicit" -)] -fn draw_embedded_asset_cell( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - selected: &Option, - embedded: &EmbeddedAsset, - cache_snapshot: &ThumbnailCacheSnapshot, - _parent_texture: Option, - thumbnail_size: f32, -) { - let selected = selected.as_ref() == Some(&embedded.selection); - let texture_id = cache_snapshot - .texture_for_key(&embedded.thumbnail_key) - .or_else(|| { - embedded - .texture_path - .as_deref() - .and_then(|path| thumbnail_for_path(world, cache_snapshot, path)) - }); - let pending = cache_snapshot.is_pending_key(&embedded.thumbnail_key); - let failure = cache_snapshot.failure_reason_for_key(&embedded.thumbnail_key); - let failed = failure.is_some(); - let thumb_size = thumbnail_size.clamp(44.0, 64.0); - let cell_size = egui::vec2(104.0, thumb_size + 50.0); - let (rect, response) = ui.allocate_exact_size(cell_size, egui::Sense::click_and_drag()); - let response = if embedded.requires_skinned_hierarchy { - response.on_hover_text( - "Skinned primitives place through the dedicated renderer so their joint hierarchy remains intact.", - ) - } else { - response - }; - let response = if let Some(reason) = failure { - response.on_hover_text(reason) - } else { - response - }; - let fill = if selected { - crate::ui::theme::SELECTION_BG_MUTED - } else if response.hovered() { - WIDGET_BG.linear_multiply(1.2) - } else { - WIDGET_BG - }; - ui.painter().rect( - rect, - 4.0, - fill, - egui::Stroke::new(1.0, if selected { ACCENT } else { BORDER }), - egui::StrokeKind::Inside, - ); - let thumb_rect = egui::Rect::from_min_size( - egui::pos2(rect.center().x - thumb_size * 0.5, rect.min.y + 8.0), - egui::vec2(thumb_size, thumb_size), - ); - if let Some(texture_id) = texture_id { - ui.painter().image( - texture_id, - thumb_rect, - egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)), - egui::Color32::WHITE, - ); - } else { - ui.painter().rect( - thumb_rect, - 4.0, - ELEVATED_BG.linear_multiply(0.6), - egui::Stroke::new(1.0, BORDER), - egui::StrokeKind::Inside, - ); - let icon = if pending { - icons::CIRCLE_NOTCH - } else if failed { - icons::WARNING_CIRCLE - } else { - subasset_icon(embedded.kind) - }; - ui.painter().text( - thumb_rect.center(), - egui::Align2::CENTER_CENTER, - icon.as_str(), - egui::FontId::new(24.0, egui::FontFamily::Name(PHOSPHOR.into())), - TEXT, - ); - } - - let label = compact_subasset_label(embedded); - let detail = compact_text(&embedded.detail, 18); - let label_pos = egui::pos2(rect.center().x, thumb_rect.max.y + 7.0); - ui.painter().text( - label_pos, - egui::Align2::CENTER_TOP, - label.as_str(), - egui::FontId::new(12.0, egui::FontFamily::Proportional), - if selected { - crate::ui::theme::TEXT_SELECTED - } else { - TEXT - }, - ); - ui.painter().text( - label_pos + egui::vec2(0.0, 17.0), - egui::Align2::CENTER_TOP, - format!("{} | {}", subasset_kind_label(embedded.kind), detail), - egui::FontId::new(10.0, egui::FontFamily::Proportional), - TEXT_DIM, - ); - - if response.clicked() { - world - .resource_mut::() - .select(embedded.selection.clone()); - } - if response.drag_started() && embedded.kind != AssetSubAssetKind::Skeleton { - world - .resource_mut::() - .start_drag(embedded.selection.clone()); - } - response.context_menu(|ui| { - subasset_context_menu(world, ui, embedded, selected_entities); - }); -} - -fn compact_subasset_label(embedded: &EmbeddedAsset) -> String { - let base = match embedded.kind { - AssetSubAssetKind::Mesh => embedded - .label - .split_once(" / ") - .map(|(head, _)| head) - .unwrap_or(&embedded.label), - AssetSubAssetKind::Material - | AssetSubAssetKind::Texture - | AssetSubAssetKind::Skeleton - | AssetSubAssetKind::AnimationClip => embedded.label.as_str(), - }; - compact_text(base, 16) -} - -fn compact_text(text: &str, max_chars: usize) -> String { - let mut chars = text.chars(); - let mut compact = String::new(); - for _ in 0..max_chars { - let Some(ch) = chars.next() else { - return text.to_string(); - }; - compact.push(ch); - } - if chars.next().is_some() { - compact.push_str("..."); - } - compact -} - -fn thumbnail_for_path( - world: &World, - cache_snapshot: &ThumbnailCacheSnapshot, - path: &str, -) -> Option { - let assets = world.resource::(); - assets - .assets - .iter() - .find(|asset| asset.path.as_deref() == Some(path)) - .and_then(|asset| cache_snapshot.texture_for(asset)) -} - -fn toggle_asset_expanded(world: &mut World, path: &str) { - let mut state = world.resource_mut::(); - if !state.expanded_assets.insert(path.to_string()) { - state.expanded_assets.remove(path); - } -} - -fn subasset_icon(kind: AssetSubAssetKind) -> Icon { - match kind { - AssetSubAssetKind::Mesh => icons::CUBE, - AssetSubAssetKind::Material => icons::PALETTE, - AssetSubAssetKind::Texture => icons::IMAGE, - AssetSubAssetKind::Skeleton => icons::BONE, - AssetSubAssetKind::AnimationClip => icons::FILM_STRIP, - } -} - -fn subasset_kind_label(kind: AssetSubAssetKind) -> &'static str { - match kind { - AssetSubAssetKind::Mesh => "Mesh", - AssetSubAssetKind::Material => "Material", - AssetSubAssetKind::Texture => "Texture", - AssetSubAssetKind::Skeleton => "Skeleton", - AssetSubAssetKind::AnimationClip => "Animation Clip", - } -} - -fn asset_list( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - selected: &Option, - folders: &[FolderSnapshot], - assets: &[AssetRow], - cache_snapshot: &ThumbnailCacheSnapshot, -) { - if ui.available_width() < COMPACT_LIST_WIDTH { - compact_asset_list( - world, - ui, - selected_entities, - selected, - folders, - assets, - cache_snapshot, - ); - return; - } - - ui.horizontal(|ui| { - ui.add_sized([236.0, 18.0], egui::Label::new("Name")); - ui.add_sized([80.0, 18.0], egui::Label::new("Type")); - ui.add_sized([72.0, 18.0], egui::Label::new("Size")); - ui.add_sized([88.0, 18.0], egui::Label::new("Modified")); - ui.label("Path"); - }); - - for folder in folders { - let response = egui::Frame::new() - .fill(WIDGET_BG.linear_multiply(0.9)) - .inner_margin(egui::Margin::symmetric(6, 3)) - .show(ui, |ui| { - ui.horizontal(|ui| { - ui.add_sized([20.0, 20.0], egui::Label::new("")); - ui.label(icon_text(icons::FOLDER, 14.0).color(TEXT_DIM)); - ui.add_sized( - [196.0, 20.0], - egui::Button::selectable(false, folder.name.as_str()), - ) - }) - .inner - }) - .inner; - if response.clicked() { - world.resource_mut::().current_folder = folder.path.clone(); - } - } - - for row in assets { - draw_asset_list_item(world, ui, selected_entities, selected, row); - if row.asset.path.as_deref().is_some_and(|path| { - world - .resource::() - .expanded_assets - .contains(path) - }) { - embedded_asset_shelf( - world, - ui, - selected_entities, - selected, - &row.asset, - cache_snapshot, - 56.0, - ); - } - } -} - -fn draw_asset_list_item( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - selected: &Option, - row: &AssetRow, -) { - let has_children = has_embedded_assets(world, &row.asset); - let expanded = row.asset.path.as_deref().is_some_and(|path| { - world - .resource::() - .expanded_assets - .contains(path) - }); - let is_selected = selected.as_ref() == Some(&row.selection); - let response = egui::Frame::new() - .fill(if is_selected { - crate::ui::theme::SELECTION_BG_MUTED - } else { - WIDGET_BG.linear_multiply(0.9) - }) - .stroke(egui::Stroke::new( - 1.0, - if is_selected { ACCENT } else { BORDER }, - )) - .inner_margin(egui::Margin::symmetric(6, 3)) - .show(ui, |ui| { - ui.horizontal(|ui| { - if has_children { - let icon = if expanded { - icons::CARET_DOWN - } else { - icons::CARET_RIGHT - }; - if ui - .add_sized( - [20.0, 20.0], - egui::Button::new(icon_text(icon, 12.0)).frame(false), - ) - .clicked() - { - if let Some(path) = row.asset.path.as_ref() { - toggle_asset_expanded(world, path); - } - } - } else { - ui.add_sized([20.0, 20.0], egui::Label::new("")); - } - ui.label(icon_text(kind_icon(&row.asset.kind), 14.0).color(TEXT_DIM)); - let response = ui.add_sized( - [196.0, 20.0], - egui::Button::selectable(is_selected, row.asset.label.as_str()), - ); - ui.add_sized([80.0, 20.0], egui::Label::new(kind_label(&row.asset.kind))); - ui.add_sized( - [72.0, 20.0], - egui::Label::new( - row.file_size - .map(format_bytes) - .unwrap_or_else(|| "-".to_string()), - ), - ); - ui.add_sized( - [88.0, 20.0], - egui::Label::new( - row.modified - .map(format_modified) - .unwrap_or_else(|| "-".to_string()), - ), - ); - ui.add( - egui::Label::new(row.asset.path.as_deref().unwrap_or("Built-in")).truncate(), - ); - ui.menu_button(icon_text(icons::DOTS_THREE_VERTICAL, 13.0), |ui| { - asset_context_menu(world, ui, &row.asset, selected_entities); - }); - response - }) - .inner - }) - .inner; - - if response.clicked() { - world - .resource_mut::() - .select(row.selection.clone()); - } - if response.drag_started() { - world - .resource_mut::() - .start_drag(row.selection.clone()); - } - response.context_menu(|ui| { - asset_context_menu(world, ui, &row.asset, selected_entities); - }); -} - -fn compact_asset_list( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - selected: &Option, - folders: &[FolderSnapshot], - assets: &[AssetRow], - cache_snapshot: &ThumbnailCacheSnapshot, -) { - for folder in folders { - let mut clicked = false; - ui.horizontal(|ui| { - ui.label(icon_text(icons::FOLDER, 14.0).color(TEXT_DIM)); - clicked = ui - .add_sized( - [fit_width(ui, 120.0, f32::INFINITY), 22.0], - egui::Button::selectable(false, folder.name.as_str()), - ) - .clicked(); - }); - if clicked { - world.resource_mut::().current_folder = folder.path.clone(); - } - ui.small(egui::RichText::new("Folder").color(TEXT_DIM)); - ui.add_space(4.0); - } - - for row in assets { - let is_selected = selected.as_ref() == Some(&row.selection); - let has_children = has_embedded_assets(world, &row.asset); - let expanded = row.asset.path.as_deref().is_some_and(|path| { - world - .resource::() - .expanded_assets - .contains(path) - }); - let mut response = None; - ui.horizontal(|ui| { - if has_children { - let icon = if expanded { - icons::CARET_DOWN - } else { - icons::CARET_RIGHT - }; - if ui - .add_sized( - [20.0, 20.0], - egui::Button::new(icon_text(icon, 12.0)).frame(false), - ) - .clicked() - { - if let Some(path) = row.asset.path.as_ref() { - toggle_asset_expanded(world, path); - } - } - } - ui.label(icon_text(kind_icon(&row.asset.kind), 14.0).color(TEXT_DIM)); - response = Some(ui.add_sized( - [fit_width(ui, 120.0, f32::INFINITY), 22.0], - egui::Button::selectable(is_selected, row.asset.label.as_str()), - )); - ui.menu_button(icon_text(icons::DOTS_THREE_VERTICAL, 13.0), |ui| { - asset_context_menu(world, ui, &row.asset, selected_entities); - }); - }); - let response = response.expect("compact asset list response"); - let size = row - .file_size - .map(format_bytes) - .unwrap_or_else(|| "-".to_string()); - let modified = row - .modified - .map(format_modified) - .unwrap_or_else(|| "-".to_string()); - let path = row.asset.path.as_deref().unwrap_or("Built-in"); - ui.add( - egui::Label::new( - egui::RichText::new(format!( - "{} | {} | {} | {}", - kind_label(&row.asset.kind), - size, - modified, - path - )) - .color(TEXT_DIM), - ) - .truncate(), - ); - ui.add_space(4.0); - - if response.clicked() { - world - .resource_mut::() - .select(row.selection.clone()); - } - if response.drag_started() { - world - .resource_mut::() - .start_drag(row.selection.clone()); - } - response.context_menu(|ui| { - asset_context_menu(world, ui, &row.asset, selected_entities); - }); - if expanded { - embedded_asset_shelf( - world, - ui, - selected_entities, - selected, - &row.asset, - cache_snapshot, - 56.0, - ); - } - } -} - -fn draw_folder_cell( - ui: &mut egui::Ui, - folder: &FolderSnapshot, - thumbnail_size: f32, -) -> egui::Response { - let thumb_size = thumbnail_size.clamp(48.0, 112.0); - let cell_size = egui::vec2(thumb_size + 20.0, thumb_size + 30.0); - let (rect, response) = ui.allocate_exact_size(cell_size, egui::Sense::click()); - let fill = if response.hovered() { - ELEVATED_BG - } else { - WIDGET_BG - }; - ui.painter().rect( - rect, - 4.0, - fill, - egui::Stroke::new(1.0, BORDER), - egui::StrokeKind::Inside, - ); - ui.painter().text( - rect.center_top() + egui::vec2(0.0, 10.0 + thumb_size * 0.45), - egui::Align2::CENTER_CENTER, - icons::FOLDER_SIMPLE.as_str(), - egui::FontId::new( - (thumb_size * 0.48).max(24.0), - egui::FontFamily::Name("phosphor-regular".into()), - ), - TEXT, - ); - ui.painter().text( - egui::pos2(rect.center().x, rect.max.y - 6.0), - egui::Align2::CENTER_BOTTOM, - folder.name.as_str(), - egui::FontId::new(11.0, egui::FontFamily::Proportional), - TEXT, - ); - response -} - -fn details_panel(world: &mut World, ui: &mut egui::Ui, selected_entities: &SelectedEntities) { - ui.label(panel_heading("Details")); - ui.separator(); - let selection = world.resource::().selected.clone(); - if let Some(selection @ AssetSelection::SubAsset { .. }) = selection { - subasset_details_panel(world, ui, selected_entities, &selection); - } else if let Some(asset) = world.resource::().selected_asset().cloned() { - top_level_asset_details_panel(world, ui, selected_entities, &asset); - } else { - ui.label(egui::RichText::new("No asset selected").color(TEXT_DIM)); - } -} - -pub(crate) fn top_level_asset_details_panel( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - asset: &EditorAsset, -) { - asset_details_header(world, ui, asset); - ui.add_space(8.0); - detail_row(ui, "Path", asset.path.as_deref().unwrap_or("Built-in")); - detail_row(ui, "Folder", asset.folder_path.as_str()); - - if let Some(path) = asset.path.as_deref() { - if let Some(record) = world - .get_resource::() - .and_then(|registry| find_asset_by_path(registry, path)) - { - detail_row(ui, "Asset ID", &record.id.as_string()); - if matches!(asset.kind, EditorAssetKind::Model) { - ui.separator(); - ui.label(panel_heading("Import Settings")); - import_settings_editor(world, ui, asset, path, &record.import_settings); - if let Some(manifest) = record.import_settings.static_mesh_manifest_path.as_deref() - { - detail_row(ui, "Static mesh artifact", manifest); - } - } - if !record.dependencies.is_empty() { - ui.separator(); - let missing_count = record - .dependencies - .iter() - .filter(|dependency| !dependency_path(dependency).is_file()) - .count(); - ui.horizontal_wrapped(|ui| { - ui.label(panel_heading("Dependencies")); - if missing_count > 0 { - let optional = matches!( - record.import_settings.material_policy, - MaterialImportPolicy::AuthoringOverride - ); - ui.small( - egui::RichText::new(if optional { - format!("{missing_count} missing | override") - } else { - format!("{missing_count} missing") - }) - .color(if optional { - WARNING - } else { - ERROR - }), - ); - } - }); - for dep in &record.dependencies { - let exists = dependency_path(dep).is_file(); - ui.horizontal(|ui| { - ui.label( - egui::RichText::new(if exists { - icons::CHECK_CIRCLE.as_str() - } else { - icons::WARNING_CIRCLE.as_str() - }) - .font(egui::FontId::new( - 12.0, - egui::FontFamily::Name(PHOSPHOR.into()), - )) - .color(if exists { - SUCCESS - } else { - WARNING - }), - ); - ui.add(egui::Label::new(dep).truncate()).on_hover_text(dep); - }); - } - } - } - detail_row( - ui, - "Size", - file_size(path).map(format_bytes).as_deref().unwrap_or("-"), - ); - detail_row( - ui, - "Modified", - modified_time(path) - .map(format_modified) - .as_deref() - .unwrap_or("-"), - ); - if matches!(asset.kind, EditorAssetKind::Material) { - ui.separator(); - ui.label(panel_heading("Material")); - if MaterialInstanceAsset::load_from_path(path).is_ok() { - material_instance_asset_editor(world, ui, asset, path); - } else { - material_asset_editor(world, ui, asset, path); - } - } - if matches!(asset.kind, EditorAssetKind::AudioClip) { - detail_row(ui, "Format", audio_format_label(path)); - let previewing = world - .resource::() - .clip_path - .as_deref() - == Some(path); - ui.horizontal_wrapped(|ui| { - if ui - .add_enabled( - !previewing, - egui::Button::new(format!("{} Audition", icons::PLAY.as_str())), - ) - .clicked() - { - if let Err(error) = - crate::play::audio_preview::audition_audio_asset(world, asset) - { - world.resource_mut::().status = - format!("Audio audition failed: {error}"); - } - } - if ui - .add_enabled( - previewing, - egui::Button::new(format!("{} Stop", icons::STOP.as_str())), - ) - .clicked() - { - crate::play::audio_preview::stop_audio_preview(world); - } - }); - } - } - - ui.separator(); - asset_action_buttons(world, ui, selected_entities, asset); -} - -fn asset_details_header(world: &World, ui: &mut egui::Ui, asset: &EditorAsset) { - ui.horizontal_wrapped(|ui| { - ui.label( - egui::RichText::new(kind_icon(&asset.kind).as_str()) - .font(egui::FontId::new( - 30.0, - egui::FontFamily::Name(PHOSPHOR.into()), - )) - .color(ACCENT), - ); - ui.vertical(|ui| { - ui.strong(asset.label.as_str()); - ui.small(egui::RichText::new(kind_label(&asset.kind)).color(TEXT_DIM)); - if let (Some(state), Some(path)) = ( - world.get_resource::(), - asset.path.as_deref(), - ) { - let status = state.file_status(Path::new(path)); - let _ = file_status_indicator_ui(ui, &status, Path::new(path)); - } - }); - }); -} - -fn subasset_details_panel( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - selection: &AssetSelection, -) { - let Some(embedded) = embedded_asset_for_selection(world, selection) else { - ui.colored_label(egui::Color32::YELLOW, "Embedded asset is not available."); - return; - }; - let AssetSelection::SubAsset { - parent_path, - sub_asset_id, - .. - } = selection - else { - return; - }; - ui.horizontal_wrapped(|ui| { - ui.label( - egui::RichText::new(subasset_icon(embedded.kind).as_str()) - .font(egui::FontId::new( - 30.0, - egui::FontFamily::Name(PHOSPHOR.into()), - )) - .color(ACCENT), - ); - ui.vertical(|ui| { - ui.strong(embedded.label.as_str()); - ui.small(egui::RichText::new(subasset_kind_label(embedded.kind)).color(TEXT_DIM)); - }); - }); - ui.add_space(8.0); - detail_row(ui, "Parent", parent_path); - detail_row(ui, "ID", sub_asset_id); - detail_row(ui, "Source", &embedded.detail); - - ui.separator(); - match embedded.kind { - AssetSubAssetKind::Mesh => { - if embedded.requires_skinned_hierarchy { - if ui.button("Place Skinned Model At Origin").clicked() { - place_subasset_operator(world, selection.clone(), Vec3::ZERO); - } - } else if ui.button("Place At Origin").clicked() { - place_subasset_operator(world, selection.clone(), Vec3::ZERO); - } - } - AssetSubAssetKind::Texture => { - if ui.button("Apply Texture To Selection").clicked() { - if let Some(asset) = - texture_asset_from_subasset_selection(world, &Some(selection.clone())) - { - apply_texture_operator(world, asset, selected_entities); - } - } - } - AssetSubAssetKind::Material => { - let status = if embedded.detail.contains("Authoring Override") { - "Authoring Override is active; this source material is not assigned." - } else { - "Source material is assigned through static mesh renderer slots." - }; - ui.small(egui::RichText::new(status).color(TEXT_DIM)); - } - AssetSubAssetKind::Skeleton => { - ui.small( - egui::RichText::new("Skeleton metadata is generated from the model source.") - .color(TEXT_DIM), - ); - } - AssetSubAssetKind::AnimationClip => { - let animated_actor = selected_entities - .as_slice() - .iter() - .copied() - .find(|entity| world.get::(*entity).is_some()); - let action = if animated_actor.is_some() { - "Assign To Selected Actor" - } else { - "Create Animated Actor" - }; - if ui.button(action).clicked() { - if let Some(entity) = animated_actor { - assign_animation_clip_operator(world, selection.clone(), entity); - } else { - place_subasset_operator(world, selection.clone(), Vec3::ZERO); - } - } - } - } - if ui.button("Select Parent Asset").clicked() { - world - .resource_mut::() - .select(AssetSelection::File(parent_path.clone())); - } -} - -fn dependency_path(reference: &str) -> PathBuf { - let path = Path::new(reference); - if path.starts_with("assets") { - path.to_path_buf() - } else { - Path::new("assets").join(path) - } -} - -fn asset_action_buttons( - world: &mut World, - ui: &mut egui::Ui, - selected_entities: &SelectedEntities, - asset: &EditorAsset, -) { - ui.horizontal_wrapped(|ui| { - if matches!(asset.kind, EditorAssetKind::Texture) && ui.button("Apply Texture").clicked() { - apply_texture_operator(world, asset.clone(), selected_entities); - } - if matches!(asset.kind, EditorAssetKind::Material) && ui.button("Apply Material").clicked() - { - apply_material_operator(world, asset.clone(), selected_entities); - } - if matches!( - asset.kind, - EditorAssetKind::Primitive(_) - | EditorAssetKind::Light(_) - | EditorAssetKind::Model - | EditorAssetKind::AudioClip - | EditorAssetKind::Prefab - ) && ui.button("Place At Origin").clicked() - { - place_asset_operator(world, asset.clone(), Vec3::ZERO); - } - if matches!(asset.kind, EditorAssetKind::Level) && ui.button("Open Scene").clicked() { - open_level_asset(world, asset); - } - if matches!(asset.kind, EditorAssetKind::Model) - && has_embedded_assets(world, asset) - && ui.button("Toggle Contents").clicked() - { - if let Some(path) = asset.path.as_ref() { - toggle_asset_expanded(world, path); - } - } - if matches!(asset.kind, EditorAssetKind::Model) && ui.button("Reimport").clicked() { - reimport_asset(world, asset); - } - if asset.path.is_some() && ui.button("Move To Trash").clicked() { - request_delete_for_asset(world, asset); - } - }); -} - -fn open_level_asset(world: &mut World, asset: &EditorAsset) { - let Some(path) = asset.path.as_deref() else { - return; - }; - world.resource_mut::().request = Some(SceneIoRequest::OpenPath(PathBuf::from(path))); -} - -fn import_settings_editor( - world: &mut World, - ui: &mut egui::Ui, - asset: &EditorAsset, - path: &str, - current: &ImportSettings, -) { - let animation_clip_options = current - .animation_manifest_path - .as_deref() - .and_then(|manifest_path| load_animation_manifest(manifest_path).ok()) - .map(|manifest| { - manifest - .clips - .into_iter() - .map(|clip| (clip.id, clip.label)) - .collect::>() - }) - .unwrap_or_default(); - { - let mut state = world.resource_mut::(); - let reset = state - .import_draft - .as_ref() - .is_none_or(|draft| draft.path != path); - if reset { - state.import_draft = Some(ImportSettingsDraft { - path: path.to_string(), - settings: current.clone(), - }); - } - } - - let mut apply = None; - let mut revert = false; - { - let mut state = world.resource_mut::(); - let Some(draft) = state.import_draft.as_mut() else { - return; - }; - ui.add(egui::Slider::new(&mut draft.settings.scale, 0.01..=10.0).text("Scale")); - ui.checkbox(&mut draft.settings.generate_collider, "Generate collider"); - ui.checkbox(&mut draft.settings.lod0_only, "LOD0 only"); - egui::ComboBox::from_id_salt("model_placement_mode") - .selected_text(match draft.settings.placement_mode { - ModelPlacementMode::StaticAsset => "Renderable Asset (Auto)", - ModelPlacementMode::SceneInstance => "Scene Instance", - }) - .show_ui(ui, |ui| { - ui.selectable_value( - &mut draft.settings.placement_mode, - ModelPlacementMode::StaticAsset, - "Renderable Asset (Auto)", - ); - ui.selectable_value( - &mut draft.settings.placement_mode, - ModelPlacementMode::SceneInstance, - "Scene Instance", - ); - }); - egui::ComboBox::from_id_salt("model_hierarchy_mode") - .selected_text(match draft.settings.hierarchy_mode { - ModelHierarchyMode::SingleActor => "One Actor", - ModelHierarchyMode::SourceHierarchy => "Source Hierarchy", - }) - .show_ui(ui, |ui| { - ui.selectable_value( - &mut draft.settings.hierarchy_mode, - ModelHierarchyMode::SingleActor, - "One Actor", - ); - ui.selectable_value( - &mut draft.settings.hierarchy_mode, - ModelHierarchyMode::SourceHierarchy, - "Source Hierarchy", - ); - }); - egui::ComboBox::from_id_salt("model_material_policy") - .selected_text(match draft.settings.material_policy { - MaterialImportPolicy::SourceMaterials => "Source Materials", - MaterialImportPolicy::AuthoringOverride => "Authoring Override", - }) - .show_ui(ui, |ui| { - ui.selectable_value( - &mut draft.settings.material_policy, - MaterialImportPolicy::SourceMaterials, - "Source Materials", - ); - ui.selectable_value( - &mut draft.settings.material_policy, - MaterialImportPolicy::AuthoringOverride, - "Authoring Override", - ); - }); - if !animation_clip_options.is_empty() { - let selected_default = draft - .settings - .default_animation_clip_id - .as_deref() - .and_then(|id| { - animation_clip_options - .iter() - .find(|(clip_id, _)| clip_id == id) - .map(|(_, label)| label.as_str()) - }) - .unwrap_or_else(|| { - if draft.settings.default_animation_clip_id.is_some() { - "Missing clip" - } else { - "Imported rest pose" - } - }); - egui::ComboBox::from_id_salt("model_default_animation_clip") - .selected_text(selected_default) - .show_ui(ui, |ui| { - ui.selectable_value( - &mut draft.settings.default_animation_clip_id, - None, - "Imported rest pose", - ); - for (clip_id, label) in &animation_clip_options { - ui.selectable_value( - &mut draft.settings.default_animation_clip_id, - Some(clip_id.clone()), - label, - ); - } - }); - ui.small("Default animation is sampled and paused in edit mode; no clip is guessed."); - } - ui.horizontal(|ui| { - if ui.button("Apply").clicked() { - apply = Some(draft.settings.clone()); - } - if ui.button("Revert").clicked() { - revert = true; - } - }); - } - - if revert { - world.resource_mut::().import_draft = Some(ImportSettingsDraft { - path: path.to_string(), - settings: current.clone(), - }); - } - if let Some(settings) = apply { - apply_import_settings(world, asset, path, settings); - } -} - -fn apply_import_settings( - world: &mut World, - asset: &EditorAsset, - path: &str, - settings: ImportSettings, -) { - let mut status = format!("Updated import settings for {}", asset.label); - if let Some(mut registry) = world.get_resource_mut::() { - update_import_settings(&mut registry, path, settings); - if matches!(asset.kind, EditorAssetKind::Model) { - if let Some(record) = find_asset_mut_by_path(&mut registry, path) { - if let Err(error) = refresh_model_artifacts(record) { - status = format!("Model artifact refresh failed for {}: {error}", asset.label); - warn!("{status}"); - } - } - } - if let Err(error) = save_registry(®istry) { - status = format!("Asset registry save failed: {error}"); - warn!("{status}"); - } else { - registry.index_dirty = false; - } - } - invalidate_on_catalog_refresh(world); - world.resource_mut::().status = status; -} - -fn material_asset_editor(world: &mut World, ui: &mut egui::Ui, asset: &EditorAsset, path: &str) { - ensure_material_draft(world, path, &asset.label); - let shader_schemas = shader_schema_assets(world); - let texture_assets = material_texture_candidates(world); - let texture_drop_candidate = world - .resource::() - .dragging_selection() - .and_then(|selection| { - texture_assets - .iter() - .find(|candidate| candidate.selection == *selection) - }) - .cloned(); - let mut apply = false; - let mut revert = false; - let mut create_instance = false; - let mut accepted_texture_drop = false; - { - let mut state = world.resource_mut::(); - let Some(draft) = state.material_draft.as_mut() else { - return; - }; - if let Some(error) = draft.error.as_ref() { - ui.colored_label(egui::Color32::YELLOW, error); - } - compact_text_edit(ui, "Label", &mut draft.asset.label); - material_shader_interface( - ui, - &mut draft.asset, - &shader_schemas, - &texture_assets, - texture_drop_candidate.as_ref(), - &mut accepted_texture_drop, - ); - ui.separator(); - ui.label(panel_heading("Render State")); - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new("Alpha mode")); - egui::ComboBox::from_id_salt("material_alpha_mode") - .selected_text(match draft.asset.render_state.alpha_mode { - MaterialAlphaMode::Opaque => "Opaque", - MaterialAlphaMode::Cutout => "Cutout", - }) - .show_ui(ui, |ui| { - ui.selectable_value( - &mut draft.asset.render_state.alpha_mode, - MaterialAlphaMode::Opaque, - "Opaque", - ); - ui.selectable_value( - &mut draft.asset.render_state.alpha_mode, - MaterialAlphaMode::Cutout, - "Cutout", - ); - }); - }); - if draft.asset.render_state.alpha_mode == MaterialAlphaMode::Cutout { - ui.add( - egui::Slider::new(&mut draft.asset.render_state.alpha_cutoff, 0.0..=1.0) - .text("Alpha cutoff"), - ); - } - ui.checkbox(&mut draft.asset.render_state.double_sided, "Double sided"); - ui.separator(); - ui.label(panel_heading("Standard Surface")); - color_desc_edit(ui, "Base color", &mut draft.asset.material.base_color); - ui.add(egui::Slider::new(&mut draft.asset.material.metallic, 0.0..=1.0).text("Metallic")); - ui.add(egui::Slider::new(&mut draft.asset.material.roughness, 0.0..=1.0).text("Roughness")); - color_desc_edit(ui, "Emissive", &mut draft.asset.material.emissive_color); - ui.add( - egui::Slider::new(&mut draft.asset.material.emissive_intensity, 0.0..=50_000.0) - .text("Emissive nits"), - ); - accepted_texture_drop |= material_texture_path_ui( - ui, - "Base texture", - "standard_base_color", - &mut draft.asset.material.base_color_texture, - &texture_assets, - texture_drop_candidate.as_ref(), - ); - accepted_texture_drop |= material_texture_path_ui( - ui, - "Emissive texture", - "standard_emissive", - &mut draft.asset.material.emissive_texture, - &texture_assets, - texture_drop_candidate.as_ref(), - ); - accepted_texture_drop |= material_texture_path_ui( - ui, - "Normal map", - "standard_normal_map", - &mut draft.asset.material.normal_map_texture, - &texture_assets, - texture_drop_candidate.as_ref(), - ); - accepted_texture_drop |= material_texture_path_ui( - ui, - "Metal/rough", - "standard_metallic_roughness", - &mut draft.asset.material.metallic_roughness_texture, - &texture_assets, - texture_drop_candidate.as_ref(), - ); - ui.horizontal(|ui| { - if ui.button("Apply").clicked() { - apply = true; - } - if ui.button("Revert").clicked() { - revert = true; - } - if ui.button("Create Instance").clicked() { - create_instance = true; - } - }); - } - - if revert { - world.resource_mut::().material_draft = None; - ensure_material_draft(world, path, &asset.label); - } - if apply { - save_material_draft(world); - } - if create_instance { - create_material_instance_from_base(world, path, &asset.label); - } - if accepted_texture_drop { - world.resource_mut::().clear_drag(); - } -} - -fn ensure_material_draft(world: &mut World, path: &str, fallback_label: &str) { - let needs_load = world - .resource::() - .material_draft - .as_ref() - .is_none_or(|draft| draft.path != path); - if !needs_load { - return; - } - let loaded = fs::read_to_string(path) - .map_err(|error| format!("could not read {path}: {error}")) - .and_then(|text| { - let snapshot = FileSnapshot::from_loaded_bytes(Path::new(path), text.as_bytes()); - ron::from_str::(&text) - .map(|asset| (asset, snapshot)) - .map_err(|error| format!("invalid material RON in {path}: {error}")) - }); - let draft = match loaded { - Ok((asset, disk_snapshot)) => MaterialAssetDraft { - path: path.to_string(), - asset, - disk_snapshot, - error: None, - }, - Err(error) => MaterialAssetDraft { - path: path.to_string(), - asset: MaterialAsset { - schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, - label: fallback_label.to_string(), - shader: None, - shader_ref: None, - render_state: shared::MaterialRenderState::default(), - material: MaterialDesc::default(), - }, - disk_snapshot: FileSnapshot::capture(Path::new(path)) - .unwrap_or_else(|_| FileSnapshot::missing()), - error: Some(error), - }, - }; - world.resource_mut::().material_draft = Some(draft); -} - -fn save_material_draft(world: &mut World) { - let Some(draft) = world - .resource::() - .material_draft - .clone() - else { - return; - }; - let result = ron::ser::to_string_pretty(&draft.asset, ron::ser::PrettyConfig::default()) - .map_err(|error| format!("could not serialize material {}: {error}", draft.path)) - .and_then(|text| { - publish_authored_file( - world, - Path::new(&draft.path), - text.as_bytes(), - &draft.disk_snapshot, - FileWriteIntent::Material, - ) - }); - match result { - Ok(disk_snapshot) => { - if let Some(current) = world - .resource_mut::() - .material_draft - .as_mut() - { - current.error = None; - current.disk_snapshot = disk_snapshot; - } - world.resource_mut::().refresh(); - invalidate_on_catalog_refresh(world); - world.resource_mut::().status = format!("Saved material {}", draft.path); - } - Err(error) => { - if let Some(current) = world - .resource_mut::() - .material_draft - .as_mut() - { - current.error = Some(error.clone()); - } - world.resource_mut::().status = error; - } - } -} - -pub(crate) fn create_material_instance_from_base( - world: &mut World, - base_path: &str, - base_label: &str, -) { - let base_reference = world - .get_resource_mut::() - .ok_or_else(|| "Asset registry is unavailable".to_string()) - .and_then(|mut registry| { - ensure_asset_record( - &mut registry, - base_path.to_string(), - base_label.to_string(), - "Material", - ) - .map(|record| { - MaterialRef::new( - EditorAssetRef::new( - record.id.as_string(), - "material:source", - base_label.to_string(), - ) - .with_source_path(base_path), - ) - }) - }); - let base_reference = match base_reference { - Ok(reference) => reference, - Err(error) => { - world.resource_mut::().status = error; - return; - } - }; - let base = Path::new(base_path); - let parent = base - .parent() - .unwrap_or_else(|| Path::new("assets/materials")); - let stem = base - .file_stem() - .and_then(|value| value.to_str()) - .unwrap_or("material"); - let mut index = 1usize; - let path = loop { - let suffix = if index == 1 { - "instance".to_string() - } else { - format!("instance_{index}") - }; - let candidate = parent.join(format!("{stem}_{suffix}.ron")); - if !candidate.exists() { - break candidate; - } - index += 1; - }; - let instance = MaterialInstanceAsset { - schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, - label: format!("{base_label} Instance"), - base: base_reference, - parameters: Vec::new(), - textures: Vec::new(), - }; - let result = ron::ser::to_string_pretty(&instance, ron::ser::PrettyConfig::default()) - .map_err(|error| format!("could not serialize material instance: {error}")) - .and_then(|text| { - publish_authored_file( - world, - &path, - text.as_bytes(), - &FileSnapshot::missing(), - FileWriteIntent::MaterialInstance, - ) - }); - if let Err(error) = result { - world.resource_mut::().status = error; - return; - } - let normalized = path.to_string_lossy().replace('\\', "/"); - let registry_error = - if let Some(mut registry) = world.get_resource_mut::() { - ensure_asset_record( - &mut registry, - normalized.clone(), - instance.label.clone(), - "Material", - ) - .map(|_| ()) - .and_then(|_| save_registry(®istry)) - .err() - } else { - Some("Asset registry is unavailable".to_string()) - }; - if let Some(error) = registry_error { - world.resource_mut::().status = - format!("Created {normalized}, but registry update failed: {error}"); - return; - } - world.resource_mut::().refresh(); - world - .resource_mut::() - .select(AssetSelection::File(normalized.clone())); - invalidate_on_catalog_refresh(world); - world.resource_mut::().status = format!("Created material instance {normalized}"); -} - -fn material_base_candidates(world: &World) -> Vec<(String, MaterialRef)> { - let registry = world.get_resource::(); - let mut candidates = world - .resource::() - .assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::Material)) - .filter_map(|asset| { - let path = asset.path.as_deref()?; - MaterialAsset::load_from_path(path).ok()?; - let record = registry.and_then(|registry| find_asset_by_path(registry, path))?; - Some(( - asset.label.clone(), - MaterialRef::new( - EditorAssetRef::new( - record.id.as_string(), - "material:source", - asset.label.clone(), - ) - .with_source_path(path), - ), - )) - }) - .collect::>(); - candidates.sort_by(|left, right| natural_cmp(&left.0, &right.0)); - candidates -} - -fn material_instance_asset_editor( - world: &mut World, - ui: &mut egui::Ui, - asset: &EditorAsset, - path: &str, -) { - ensure_material_instance_draft(world, path, &asset.label); - let base_candidates = material_base_candidates(world); - let texture_assets = material_texture_candidates(world); - let texture_drop_candidate = world - .resource::() - .dragging_selection() - .and_then(|selection| { - texture_assets - .iter() - .find(|candidate| candidate.selection == *selection) - }) - .cloned(); - let base_asset = world - .resource::() - .material_instance_draft - .as_ref() - .and_then(|draft| draft.asset.base.0.source_path.as_deref()) - .and_then(|path| MaterialAsset::load_from_path(path).ok()); - let schema = base_asset.as_ref().and_then(material_schema_for_asset); - let mut apply = false; - let mut revert = false; - let mut accepted_texture_drop = false; - { - let mut state = world.resource_mut::(); - let Some(draft) = state.material_instance_draft.as_mut() else { - return; - }; - if let Some(error) = draft.error.as_ref() { - ui.colored_label(egui::Color32::YELLOW, error); - } - compact_text_edit(ui, "Label", &mut draft.asset.label); - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new("Base material")); - let selected = base_candidates - .iter() - .find(|(_, candidate)| candidate.0.asset_id == draft.asset.base.0.asset_id) - .map(|(label, _)| label.as_str()) - .unwrap_or("Missing base"); - egui::ComboBox::from_id_salt("material_instance_base") - .selected_text(selected) - .show_ui(ui, |ui| { - for (label, reference) in &base_candidates { - if ui - .selectable_label( - reference.0.asset_id == draft.asset.base.0.asset_id, - label, - ) - .clicked() - { - draft.asset.base = reference.clone(); - } - } - }); - }); - ui.small("Overrides are sparse; unchecked properties continue to inherit the base asset."); - ui.separator(); - ui.label(panel_heading("Standard Overrides")); - let base_desc = base_asset - .as_ref() - .map(|asset| &asset.material) - .cloned() - .unwrap_or_default(); - material_instance_parameter_override_ui( - ui, - "Base color", - "base_color", - ShaderPropertyType::Color, - MaterialParameterValue::Color(base_desc.base_color), - &mut draft.asset.parameters, - ); - material_instance_parameter_override_ui( - ui, - "Metallic", - "metallic", - ShaderPropertyType::Float { - min: Some(0.0), - max: Some(1.0), - }, - MaterialParameterValue::Float(base_desc.metallic), - &mut draft.asset.parameters, - ); - material_instance_parameter_override_ui( - ui, - "Roughness", - "roughness", - ShaderPropertyType::Float { - min: Some(0.0), - max: Some(1.0), - }, - MaterialParameterValue::Float(base_desc.roughness), - &mut draft.asset.parameters, - ); - material_instance_parameter_override_ui( - ui, - "Emissive", - "emissive_color", - ShaderPropertyType::Color, - MaterialParameterValue::Color(base_desc.emissive_color), - &mut draft.asset.parameters, - ); - material_instance_parameter_override_ui( - ui, - "Emissive nits", - "emissive_intensity", - ShaderPropertyType::Float { - min: Some(0.0), - max: Some(50_000.0), - }, - MaterialParameterValue::Float(base_desc.emissive_intensity), - &mut draft.asset.parameters, - ); - if let Some(schema) = schema.as_ref() { - let custom = schema - .parameters - .iter() - .filter(|property| { - !matches!(property.property_type, ShaderPropertyType::Texture) - && !matches!( - property.name.as_str(), - "base_color" - | "metallic" - | "roughness" - | "emissive_color" - | "emissive_intensity" - ) - }) - .collect::>(); - if !custom.is_empty() { - ui.separator(); - ui.label(panel_heading("Shader Overrides")); - for property in custom { - let inherited = base_desc - .parameters - .iter() - .find(|value| value.name == property.name) - .or_else(|| { - schema - .default_values - .iter() - .find(|value| value.name == property.name) - }) - .map(|value| value.value.clone()) - .unwrap_or_else(|| { - default_value_for_shader_property(&property.property_type) - }); - material_instance_parameter_override_ui( - ui, - &property.display_name, - &property.name, - property.property_type.clone(), - inherited, - &mut draft.asset.parameters, - ); - } - } - } - ui.separator(); - ui.label(panel_heading("Texture Overrides")); - let mut texture_properties = vec![ - ("Base color", "base_color_texture"), - ("Normal map", "normal_map_texture"), - ("Metallic / roughness", "metallic_roughness_texture"), - ("Emissive", "emissive_texture"), - ]; - if let Some(schema) = schema.as_ref() { - for property in schema - .parameters - .iter() - .filter(|property| matches!(property.property_type, ShaderPropertyType::Texture)) - { - if !texture_properties - .iter() - .any(|(_, name)| *name == property.name) - { - texture_properties.push((&property.display_name, &property.name)); - } - } - } - for (label, name) in texture_properties { - accepted_texture_drop |= material_instance_texture_override_ui( - ui, - label, - name, - &mut draft.asset.textures, - &texture_assets, - texture_drop_candidate.as_ref(), - ); - } - ui.horizontal(|ui| { - if ui.button("Apply").clicked() { - apply = true; - } - if ui.button("Revert").clicked() { - revert = true; - } - }); - } - if revert { - world - .resource_mut::() - .material_instance_draft = None; - ensure_material_instance_draft(world, path, &asset.label); - } - if apply { - save_material_instance_draft(world); - } - if accepted_texture_drop { - world.resource_mut::().clear_drag(); - } -} - -fn ensure_material_instance_draft(world: &mut World, path: &str, fallback_label: &str) { - let needs_load = world - .resource::() - .material_instance_draft - .as_ref() - .is_none_or(|draft| draft.path != path); - if !needs_load { - return; - } - let loaded = fs::read_to_string(path) - .map_err(|error| format!("could not read {path}: {error}")) - .and_then(|text| { - let snapshot = FileSnapshot::from_loaded_bytes(Path::new(path), text.as_bytes()); - ron::from_str::(&text) - .map(|asset| (asset, snapshot)) - .map_err(|error| format!("invalid material-instance RON in {path}: {error}")) - }); - let draft = match loaded { - Ok((asset, disk_snapshot)) => MaterialInstanceAssetDraft { - path: path.to_string(), - asset, - disk_snapshot, - error: None, - }, - Err(error) => MaterialInstanceAssetDraft { - path: path.to_string(), - asset: MaterialInstanceAsset { - schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, - label: fallback_label.to_string(), - base: MaterialRef::default(), - parameters: Vec::new(), - textures: Vec::new(), - }, - disk_snapshot: FileSnapshot::capture(Path::new(path)) - .unwrap_or_else(|_| FileSnapshot::missing()), - error: Some(error), - }, - }; - world - .resource_mut::() - .material_instance_draft = Some(draft); -} - -fn save_material_instance_draft(world: &mut World) { - let Some(draft) = world - .resource::() - .material_instance_draft - .clone() - else { - return; - }; - let result = if !draft.asset.base.is_resolved() - || draft.asset.base.0.sub_asset_id != "material:source" - { - Err("Material Instance base must resolve directly to a Material asset".to_string()) - } else { - ron::ser::to_string_pretty(&draft.asset, ron::ser::PrettyConfig::default()) - .map_err(|error| format!("could not serialize material instance: {error}")) - .and_then(|text| { - publish_authored_file( - world, - Path::new(&draft.path), - text.as_bytes(), - &draft.disk_snapshot, - FileWriteIntent::MaterialInstance, - ) - }) - }; - match result { - Ok(disk_snapshot) => { - if let Some(current) = world - .resource_mut::() - .material_instance_draft - .as_mut() - { - current.error = None; - current.disk_snapshot = disk_snapshot; - } - world.resource_mut::().refresh(); - invalidate_on_catalog_refresh(world); - world.resource_mut::().status = - format!("Saved material instance {}", draft.path); - } - Err(error) => { - if let Some(current) = world - .resource_mut::() - .material_instance_draft - .as_mut() - { - current.error = Some(error.clone()); - } - world.resource_mut::().status = error; - } - } -} - -fn material_schema_for_asset(asset: &MaterialAsset) -> Option { - asset - .shader_ref - .as_ref() - .and_then(|reference| reference.source_path.as_deref()) - .or(asset.material.shader.schema_path.as_deref()) - .or(asset - .shader - .as_deref() - .filter(|path| path.ends_with(".ron"))) - .and_then(|path| ShaderSchemaAsset::load_from_path(path).ok()) -} - -fn material_instance_parameter_override_ui( - ui: &mut egui::Ui, - label: &str, - name: &str, - property_type: ShaderPropertyType, - inherited: MaterialParameterValue, - parameters: &mut Vec, -) { - let index = parameters.iter().position(|value| value.name == name); - let mut enabled = index.is_some(); - if ui - .checkbox(&mut enabled, format!("Override {label}")) - .changed() - { - if enabled { - parameters.push(MaterialParameter { - name: name.to_string(), - value: inherited, - }); - } else { - parameters.retain(|value| value.name != name); - } - } - if let Some(value) = parameters.iter_mut().find(|value| value.name == name) { - material_parameter_value_ui(ui, label, &property_type, &mut value.value); - } -} - -fn material_instance_texture_override_ui( - ui: &mut egui::Ui, - label: &str, - name: &str, - textures: &mut Vec, - texture_assets: &[MaterialTextureCandidate], - drop_candidate: Option<&MaterialTextureCandidate>, -) -> bool { - let mut enabled = textures.iter().any(|value| value.name == name); - if ui - .checkbox(&mut enabled, format!("Override {label}")) - .changed() - { - if enabled { - textures.push(MaterialTextureBinding { - name: name.to_string(), - texture: None, - }); - } else { - textures.retain(|value| value.name != name); - } - } - - let current = textures - .iter() - .find(|value| value.name == name) - .and_then(|binding| binding.texture.as_ref()) - .cloned(); - let response = texture_slot_ui( - ui, - label, - format!("instance_{name}"), - TextureSlotSelection::Reference(current.as_ref()), - if enabled { "(none)" } else { "(inherits base)" }, - texture_assets, - drop_candidate, - ); - let accepted_drop = response.accepted_drop; - if response.clear { - textures.retain(|value| value.name != name); - } else if let Some(candidate) = response.selected { - set_material_instance_texture_override(textures, name, Some(candidate.reference)); - } - accepted_drop -} - -fn set_material_instance_texture_override( - textures: &mut Vec, - name: &str, - texture: Option, -) { - match texture { - Some(texture) => { - if let Some(binding) = textures.iter_mut().find(|value| value.name == name) { - binding.texture = Some(texture); - } else { - textures.push(MaterialTextureBinding { - name: name.to_string(), - texture: Some(texture), - }); - } - } - None => textures.retain(|value| value.name != name), - } -} - -fn shader_schema_assets(world: &World) -> Vec<(String, String, EditorAssetRef)> { - let registry = world.get_resource::(); - let mut schemas: Vec<(String, String, EditorAssetRef)> = world - .resource::() - .assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::ShaderSchema)) - .filter_map(|asset| { - let path = asset.path.clone()?; - let record = registry.and_then(|registry| find_asset_by_path(registry, &path))?; - Some(( - asset.label.clone(), - path.clone(), - EditorAssetRef::new(record.id.as_string(), "shader:schema", asset.label.clone()) - .with_source_path(path), - )) - }) - .collect(); - schemas.sort_by(|a, b| natural_cmp(&a.0, &b.0)); - schemas -} - -fn material_texture_candidates(world: &World) -> Vec { - let Some(registry) = world.get_resource::() else { - return Vec::new(); - }; - let assets = &world.resource::().assets; - let mut textures = Vec::new(); - let mut seen = HashSet::new(); - - for asset in assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) - { - let Some(path) = asset.path.as_deref() else { - continue; - }; - let Some(record) = find_asset_by_path(registry, path) else { - continue; - }; - let reference = - EditorAssetRef::new(record.id.as_string(), "texture:source", asset.label.clone()) - .with_source_path(path); - if !seen.insert((reference.asset_id.clone(), reference.sub_asset_id.clone())) { - continue; - } - textures.push(MaterialTextureCandidate { - label: asset.label.clone(), - detail: path.to_string(), - path: path.to_string(), - reference, - selection: AssetSelection::File(path.to_string()), - }); - } - - for asset in assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::Model)) - { - let Some(parent_path) = asset.path.as_deref() else { - continue; - }; - let Some(record) = find_asset_by_path(registry, parent_path) else { - continue; - }; - for embedded in embedded_assets_for_asset(world, asset) - .into_iter() - .filter(|embedded| embedded.kind == AssetSubAssetKind::Texture) - { - let AssetSelection::SubAsset { - sub_asset_id, - source_path: Some(source_path), - .. - } = &embedded.selection - else { - continue; - }; - let reference = EditorAssetRef::new( - record.id.as_string(), - sub_asset_id.clone(), - embedded.label.clone(), - ) - .with_source_path(source_path); - if !seen.insert((reference.asset_id.clone(), reference.sub_asset_id.clone())) { - continue; - } - textures.push(MaterialTextureCandidate { - label: embedded.label, - detail: format!("{} | {source_path}", asset.label), - path: source_path.clone(), - reference, - selection: embedded.selection, - }); - } - } - - textures.sort_by(|left, right| { - natural_cmp(&left.label, &right.label) - .then_with(|| natural_cmp(&left.detail, &right.detail)) - }); - textures -} - -fn material_shader_interface( - ui: &mut egui::Ui, - asset: &mut MaterialAsset, - shader_schemas: &[(String, String, EditorAssetRef)], - texture_assets: &[MaterialTextureCandidate], - drop_candidate: Option<&MaterialTextureCandidate>, - accepted_texture_drop: &mut bool, -) { - shader_kind_picker(ui, &mut asset.material.shader.kind); - if matches!(asset.material.shader.kind, MaterialShaderKind::Custom) { - let mut selected_schema = asset.material.shader.schema_path.clone(); - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new("Schema")); - egui::ComboBox::from_id_salt("asset_material_shader_schema") - .selected_text( - selected_schema - .as_deref() - .and_then(|path| { - shader_schemas - .iter() - .find(|(_, schema_path, _)| schema_path == path) - .map(|(label, _, _)| label.as_str()) - }) - .unwrap_or("(none)"), - ) - .show_ui(ui, |ui| { - if ui - .selectable_label(selected_schema.is_none(), "(none)") - .clicked() - { - selected_schema = None; - } - for (label, path, _) in shader_schemas { - if ui - .selectable_label(selected_schema.as_deref() == Some(path), label) - .clicked() - { - selected_schema = Some(path.clone()); - } - } - }); - }); - if selected_schema != asset.material.shader.schema_path { - asset.material.shader.schema_path = selected_schema.clone(); - if let Some(path) = selected_schema.as_deref() { - asset.shader_ref = shader_schemas - .iter() - .find(|(_, schema_path, _)| schema_path == path) - .map(|(_, _, reference)| reference.clone()); - if let Err(error) = apply_shader_schema(asset, path) { - ui.colored_label(egui::Color32::YELLOW, error); - } - } else { - asset.shader_ref = None; - } - } - optional_path_edit(ui, "WGSL shader", &mut asset.material.shader.shader_path); - if let Some(path) = asset.material.shader.schema_path.clone() { - ui.horizontal(|ui| { - if ui.button("Reload Schema").clicked() { - if let Err(error) = apply_shader_schema(asset, &path) { - ui.colored_label(egui::Color32::YELLOW, error); - } - } - ui.small(egui::RichText::new(path).color(TEXT_DIM)); - }); - } - } else { - asset.shader_ref = None; - asset.material.shader.schema_path = None; - asset.material.shader.shader_path = None; - } - - let schema = asset - .material - .shader - .schema_path - .as_deref() - .and_then(|path| ShaderSchemaAsset::load_from_path(path).ok()); - if let Some(schema) = schema.as_ref() { - ui.separator(); - ui.label(panel_heading("Shader Parameters")); - shader_schema_parameter_editor(ui, &schema.parameters, &mut asset.material.parameters); - shader_schema_texture_editor( - ui, - &schema.parameters, - &mut asset.material.textures, - texture_assets, - drop_candidate, - accepted_texture_drop, - ); - } else if !asset.material.parameters.is_empty() || !asset.material.textures.is_empty() { - ui.separator(); - ui.label(panel_heading("Stored Shader Values")); - raw_material_parameter_editor(ui, &mut asset.material.parameters); - raw_material_texture_editor( - ui, - &mut asset.material.textures, - texture_assets, - drop_candidate, - accepted_texture_drop, - ); - } -} - -fn apply_shader_schema(asset: &mut MaterialAsset, path: &str) -> Result<(), String> { - let schema = ShaderSchemaAsset::load_from_path(path)?; - asset.shader = Some(schema.label.clone()); - asset.material.shader.kind = schema.kind; - asset.material.shader.schema_path = Some(path.to_string()); - if asset.material.shader.shader_path.is_none() { - asset.material.shader.shader_path = schema.wgsl_path.clone(); - } - - for property in &schema.parameters { - if matches!(property.property_type, ShaderPropertyType::Texture) { - if !asset - .material - .textures - .iter() - .any(|texture| texture.name == property.name) - { - let default = schema - .default_textures - .iter() - .find(|texture| texture.name == property.name) - .cloned() - .unwrap_or(MaterialTextureBinding { - name: property.name.clone(), - texture: None, - }); - asset.material.textures.push(default); - } - continue; - } - - let default = schema - .default_values - .iter() - .find(|parameter| parameter.name == property.name) - .map(|parameter| parameter.value.clone()) - .unwrap_or_else(|| default_value_for_shader_property(&property.property_type)); - match asset - .material - .parameters - .iter_mut() - .find(|parameter| parameter.name == property.name) - { - Some(parameter) => { - if !parameter_value_matches_property(¶meter.value, &property.property_type) { - parameter.value = default; - } - } - None => asset.material.parameters.push(MaterialParameter { - name: property.name.clone(), - value: default, - }), - } - } - - Ok(()) -} - -fn shader_schema_parameter_editor( - ui: &mut egui::Ui, - properties: &[ShaderPropertyDesc], - parameters: &mut Vec, -) { - for property in properties - .iter() - .filter(|property| !matches!(property.property_type, ShaderPropertyType::Texture)) - { - let value = ensure_material_parameter(parameters, property); - material_parameter_value_ui(ui, &property.display_name, &property.property_type, value); - } -} - -fn shader_schema_texture_editor( - ui: &mut egui::Ui, - properties: &[ShaderPropertyDesc], - textures: &mut Vec, - texture_assets: &[MaterialTextureCandidate], - drop_candidate: Option<&MaterialTextureCandidate>, - accepted_texture_drop: &mut bool, -) { - let texture_props: Vec<&ShaderPropertyDesc> = properties - .iter() - .filter(|property| matches!(property.property_type, ShaderPropertyType::Texture)) - .collect(); - if texture_props.is_empty() { - return; - } - ui.separator(); - ui.label(panel_heading("Shader Textures")); - for property in texture_props { - let texture = ensure_material_texture_binding(textures, &property.name); - *accepted_texture_drop |= texture_binding_ui( - ui, - &property.display_name, - texture, - texture_assets, - drop_candidate, - ); - } -} - -fn raw_material_parameter_editor(ui: &mut egui::Ui, parameters: &mut [MaterialParameter]) { - for parameter in parameters { - let property_type = property_type_for_value(¶meter.value); - material_parameter_value_ui(ui, ¶meter.name, &property_type, &mut parameter.value); - } -} - -fn raw_material_texture_editor( - ui: &mut egui::Ui, - textures: &mut [MaterialTextureBinding], - texture_assets: &[MaterialTextureCandidate], - drop_candidate: Option<&MaterialTextureCandidate>, - accepted_texture_drop: &mut bool, -) { - if textures.is_empty() { - return; - } - ui.separator(); - ui.label(panel_heading("Stored Shader Textures")); - for texture in textures { - let label = texture.name.clone(); - *accepted_texture_drop |= - texture_binding_ui(ui, &label, texture, texture_assets, drop_candidate); - } -} - -fn ensure_material_parameter<'a>( - parameters: &'a mut Vec, - property: &ShaderPropertyDesc, -) -> &'a mut MaterialParameterValue { - let index = parameters - .iter() - .position(|parameter| parameter.name == property.name) - .unwrap_or_else(|| { - parameters.push(MaterialParameter { - name: property.name.clone(), - value: default_value_for_shader_property(&property.property_type), - }); - parameters.len() - 1 - }); - if !parameter_value_matches_property(¶meters[index].value, &property.property_type) { - parameters[index].value = default_value_for_shader_property(&property.property_type); - } - &mut parameters[index].value -} - -fn ensure_material_texture_binding<'a>( - textures: &'a mut Vec, - name: &str, -) -> &'a mut MaterialTextureBinding { - let index = textures - .iter() - .position(|texture| texture.name == name) - .unwrap_or_else(|| { - textures.push(MaterialTextureBinding { - name: name.to_string(), - texture: None, - }); - textures.len() - 1 - }); - &mut textures[index] -} - -fn material_parameter_value_ui( - ui: &mut egui::Ui, - label: &str, - property_type: &ShaderPropertyType, - value: &mut MaterialParameterValue, -) { - if !parameter_value_matches_property(value, property_type) { - *value = default_value_for_shader_property(property_type); - } - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new(label)); - match value { - MaterialParameterValue::Bool(value) => { - ui.checkbox(value, ""); - } - MaterialParameterValue::Float(value) => { - let (min, max) = match property_type { - ShaderPropertyType::Float { min, max } => (*min, *max), - _ => (None, None), - }; - match (min, max) { - (Some(min), Some(max)) => { - ui.add(egui::Slider::new(value, min..=max)); - } - _ => { - ui.add(egui::DragValue::new(value).speed(0.01)); - } - } - } - MaterialParameterValue::Vec2(value) => { - ui.add_sized([64.0, 20.0], egui::DragValue::new(&mut value.x).speed(0.01)); - ui.add_sized([64.0, 20.0], egui::DragValue::new(&mut value.y).speed(0.01)); - } - MaterialParameterValue::Vec3(value) => { - ui.add_sized([52.0, 20.0], egui::DragValue::new(&mut value.x).speed(0.01)); - ui.add_sized([52.0, 20.0], egui::DragValue::new(&mut value.y).speed(0.01)); - ui.add_sized([52.0, 20.0], egui::DragValue::new(&mut value.z).speed(0.01)); - } - MaterialParameterValue::Color(value) => { - let mut rgba = [value.r, value.g, value.b, value.a]; - if ui.color_edit_button_rgba_unmultiplied(&mut rgba).changed() { - *value = ColorDesc { - r: rgba[0], - g: rgba[1], - b: rgba[2], - a: rgba[3], - }; - } - } - MaterialParameterValue::Enum(value) => { - let options = match property_type { - ShaderPropertyType::Enum { options } => options.as_slice(), - _ => &[], - }; - egui::ComboBox::from_id_salt(format!("material_enum_{label}")) - .selected_text(value.as_str()) - .show_ui(ui, |ui| { - for option in options { - ui.selectable_value(value, option.clone(), option); - } - }); - } - } - }); -} - -fn texture_binding_ui( - ui: &mut egui::Ui, - label: &str, - binding: &mut MaterialTextureBinding, - texture_assets: &[MaterialTextureCandidate], - drop_candidate: Option<&MaterialTextureCandidate>, -) -> bool { - let response = texture_slot_ui( - ui, - label, - format!("binding_{}", binding.name), - TextureSlotSelection::Reference(binding.texture.as_ref()), - "(none)", - texture_assets, - drop_candidate, - ); - let accepted_drop = response.accepted_drop; - if response.clear { - binding.texture = None; - } else if let Some(candidate) = response.selected { - binding.texture = Some(candidate.reference); - } - accepted_drop -} - -fn material_texture_path_ui( - ui: &mut egui::Ui, - label: &str, - slot_id: &str, - value: &mut Option, - texture_assets: &[MaterialTextureCandidate], - drop_candidate: Option<&MaterialTextureCandidate>, -) -> bool { - let response = texture_slot_ui( - ui, - label, - slot_id, - TextureSlotSelection::Path(value.as_deref()), - "(none)", - texture_assets, - drop_candidate, - ); - let accepted_drop = response.accepted_drop; - if response.clear { - *value = None; - } else if let Some(candidate) = response.selected { - *value = Some(candidate.path); - } - accepted_drop -} - -fn texture_slot_ui( - ui: &mut egui::Ui, - label: &str, - slot_id: impl std::hash::Hash, - current: TextureSlotSelection<'_>, - empty_label: &str, - candidates: &[MaterialTextureCandidate], - drop_candidate: Option<&MaterialTextureCandidate>, -) -> TextureSlotResponse { - let mut result = TextureSlotResponse::default(); - ui.push_id(slot_id, |ui| { - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new(label)); - let width = ui.available_width().max(1.0); - let (rect, hover) = - ui.allocate_exact_size(egui::vec2(width, 30.0), egui::Sense::hover()); - let valid_drag = drop_candidate.is_some(); - let drop_hovered = valid_drag && ui.rect_contains_pointer(rect); - let row_hovered = hover.hovered(); - let stroke = if drop_hovered { - egui::Stroke::new(2.0, egui::Color32::from_rgb(125, 198, 255)) - } else if valid_drag { - egui::Stroke::new(1.0, egui::Color32::from_rgb(58, 88, 122)) - } else if row_hovered { - egui::Stroke::new(1.0, egui::Color32::from_rgb(92, 102, 118)) - } else { - egui::Stroke::new(1.0, BORDER) - }; - let fill = if drop_hovered { - egui::Color32::from_rgb(29, 57, 86) - } else if row_hovered { - WIDGET_BG.linear_multiply(1.05) - } else { - WIDGET_BG.linear_multiply(0.75) - }; - ui.painter() - .rect(rect, 4.0, fill, stroke, egui::StrokeKind::Inside); - - let selected_candidate = candidates.iter().find(|candidate| match current { - TextureSlotSelection::Path(path) => path == Some(candidate.path.as_str()), - TextureSlotSelection::Reference(reference) => reference.is_some_and(|reference| { - reference.asset_id == candidate.reference.asset_id - && reference.sub_asset_id == candidate.reference.sub_asset_id - }), - }); - let current_present = match current { - TextureSlotSelection::Path(path) => path.is_some(), - TextureSlotSelection::Reference(reference) => reference.is_some(), - }; - let display_label = selected_candidate - .map(|candidate| candidate.label.as_str()) - .or_else(|| match current { - TextureSlotSelection::Path(path) => path, - TextureSlotSelection::Reference(reference) => { - reference.map(|reference| reference.label.as_str()) - } - }) - .unwrap_or(empty_label); - - let mut child = ui.new_child( - egui::UiBuilder::new() - .max_rect(rect.shrink2(egui::vec2(5.0, 3.0))) - .layout(egui::Layout::left_to_right(egui::Align::Center)), - ); - child.set_clip_rect(rect); - child.add_sized( - [18.0, 20.0], - egui::Label::new(icon_text(icons::IMAGE, 13.0).color(TEXT_DIM)), - ); - let action_width = 56.0; - let text_width = - (child.available_width() - action_width - child.spacing().item_spacing.x).max(1.0); - child.allocate_ui_with_layout( - egui::vec2(text_width, 22.0), - egui::Layout::left_to_right(egui::Align::Center), - |ui| { - ui.add_sized( - [text_width, 20.0], - egui::Label::new(display_label).truncate(), - ); - }, - ); - child.allocate_ui_with_layout( - egui::vec2(action_width, 24.0), - egui::Layout::right_to_left(egui::Align::Center), - |ui| { - let clear = ui.add_enabled( - current_present, - egui::Button::new(icon_text(icons::X, 14.0)) - .frame(false) - .min_size(egui::vec2(20.0, 20.0)), - ); - if clear.on_hover_text("Clear texture").clicked() { - result.clear = true; - } - if candidates.is_empty() { - ui.add_enabled( - false, - egui::Button::new(icon_text(icons::FOLDER_OPEN, 14.0)) - .frame(false) - .min_size(egui::vec2(20.0, 20.0)), - ) - .on_hover_text("No project textures available"); - } else { - let menu = ui.menu_button(icon_text(icons::FOLDER_OPEN, 14.0), |ui| { - ui.set_min_width(240.0); - for candidate in candidates { - let selected = selected_candidate.is_some_and(|selected| { - selected.reference.asset_id == candidate.reference.asset_id - && selected.reference.sub_asset_id - == candidate.reference.sub_asset_id - }); - if ui - .selectable_label(selected, candidate.label.as_str()) - .on_hover_text(candidate.detail.as_str()) - .clicked() - { - result.selected = Some(candidate.clone()); - ui.close(); - } - } - }); - menu.response.on_hover_text("Select a project texture"); - } - }, - ); - - if drop_hovered && ui.input(|input| input.pointer.any_released()) { - if let Some(candidate) = drop_candidate { - result.selected = Some(candidate.clone()); - result.accepted_drop = true; - } - } - }); - }); - result -} - -fn default_value_for_shader_property(property_type: &ShaderPropertyType) -> MaterialParameterValue { - match property_type { - ShaderPropertyType::Bool => MaterialParameterValue::Bool(false), - ShaderPropertyType::Float { .. } => MaterialParameterValue::Float(0.0), - ShaderPropertyType::Vec2 => MaterialParameterValue::Vec2(Vec2::ZERO), - ShaderPropertyType::Vec3 => MaterialParameterValue::Vec3(Vec3::ZERO), - ShaderPropertyType::Color => MaterialParameterValue::Color(ColorDesc::default()), - ShaderPropertyType::Enum { options } => { - MaterialParameterValue::Enum(options.first().cloned().unwrap_or_default()) - } - ShaderPropertyType::Texture => MaterialParameterValue::Float(0.0), - } -} - -fn parameter_value_matches_property( - value: &MaterialParameterValue, - property_type: &ShaderPropertyType, -) -> bool { - matches!( - (value, property_type), - (MaterialParameterValue::Bool(_), ShaderPropertyType::Bool) - | ( - MaterialParameterValue::Float(_), - ShaderPropertyType::Float { .. } - ) - | (MaterialParameterValue::Vec2(_), ShaderPropertyType::Vec2) - | (MaterialParameterValue::Vec3(_), ShaderPropertyType::Vec3) - | (MaterialParameterValue::Color(_), ShaderPropertyType::Color) - | ( - MaterialParameterValue::Enum(_), - ShaderPropertyType::Enum { .. } - ) - ) -} - -fn property_type_for_value(value: &MaterialParameterValue) -> ShaderPropertyType { - match value { - MaterialParameterValue::Bool(_) => ShaderPropertyType::Bool, - MaterialParameterValue::Float(_) => ShaderPropertyType::Float { - min: None, - max: None, - }, - MaterialParameterValue::Vec2(_) => ShaderPropertyType::Vec2, - MaterialParameterValue::Vec3(_) => ShaderPropertyType::Vec3, - MaterialParameterValue::Color(_) => ShaderPropertyType::Color, - MaterialParameterValue::Enum(_) => ShaderPropertyType::Enum { - options: Vec::new(), - }, - } -} - -fn compact_text_edit(ui: &mut egui::Ui, label: &str, value: &mut String) { - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new(label)); - ui.add_sized( - [fit_width(ui, 100.0, f32::INFINITY), 22.0], - egui::TextEdit::singleline(value), - ); - }); -} - -fn shader_kind_picker(ui: &mut egui::Ui, kind: &mut MaterialShaderKind) { - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new("Shader")); - egui::ComboBox::from_id_salt("asset_material_shader_kind") - .selected_text(match kind { - MaterialShaderKind::StandardLit => "Standard Lit", - MaterialShaderKind::Unlit => "Unlit", - MaterialShaderKind::Custom => "Custom", - }) - .show_ui(ui, |ui| { - ui.selectable_value(kind, MaterialShaderKind::StandardLit, "Standard Lit"); - ui.selectable_value(kind, MaterialShaderKind::Unlit, "Unlit"); - ui.selectable_value(kind, MaterialShaderKind::Custom, "Custom"); - }); - }); -} - -fn color_desc_edit(ui: &mut egui::Ui, label: &str, color: &mut ColorDesc) { - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new(label)); - let mut rgba = [color.r, color.g, color.b, color.a]; - if ui.color_edit_button_rgba_unmultiplied(&mut rgba).changed() { - *color = ColorDesc { - r: rgba[0], - g: rgba[1], - b: rgba[2], - a: rgba[3], - }; - } - }); -} - -fn optional_path_edit(ui: &mut egui::Ui, label: &str, value: &mut Option) { - ui.horizontal(|ui| { - ui.add_sized([92.0, 20.0], egui::Label::new(label)); - let mut text = value.clone().unwrap_or_default(); - if ui - .add_sized( - [fit_width(ui, 80.0, f32::INFINITY), 22.0], - egui::TextEdit::singleline(&mut text), - ) - .changed() - { - *value = if text.trim().is_empty() { - None - } else { - Some(text) - }; - } - if ui.button("Clear").clicked() { - *value = None; - } - }); -} - -fn texture_asset_from_subasset_selection( - world: &World, - selection: &Option, -) -> Option { - let Some(AssetSelection::SubAsset { - label, - kind: AssetSubAssetKind::Texture, - source_path: Some(path), - .. - }) = selection - else { - return None; - }; - if let Some(asset) = world - .resource::() - .assets - .iter() - .find(|asset| asset.path.as_deref() == Some(path.as_str())) - { - return Some(asset.clone()); - } - Some(EditorAsset { - label: label.clone(), - path: Some(path.clone()), - folder_path: Path::new(path) - .parent() - .map(|parent| parent.to_string_lossy().replace('\\', "/")) - .unwrap_or_else(|| ASSETS_ROOT.to_string()), - kind: EditorAssetKind::Texture, - }) -} - -fn detail_row(ui: &mut egui::Ui, label: &str, value: &str) { - ui.horizontal_wrapped(|ui| { - ui.label(egui::RichText::new(label).color(TEXT_DIM)); - ui.add(egui::Label::new(value).wrap().selectable(false)); - }); -} - -fn empty_content(ui: &mut egui::Ui, search: &str) { - ui.add_space(24.0); - ui.vertical_centered(|ui| { - ui.label( - egui::RichText::new(icons::FOLDER_OPEN.as_str()).font(egui::FontId::new( - 28.0, - egui::FontFamily::Name("phosphor-regular".into()), - )), - ); - if search.trim().is_empty() { - ui.label(egui::RichText::new("Folder is empty").color(TEXT_DIM)); - } else { - ui.label(egui::RichText::new("No matching assets").color(TEXT_DIM)); - } - }); -} - -fn navigate_to_parent(world: &mut World) { - let current = world.resource::().current_folder.clone(); - if let Some(parent) = current.rfind('/').map(|index| current[..index].to_string()) { - world.resource_mut::().current_folder = parent; - } -} - -fn asset_matches_kind_filter(asset: &EditorAsset, filter: AssetKindFilter) -> bool { - match filter { - AssetKindFilter::All => true, - AssetKindFilter::Model => matches!(asset.kind, EditorAssetKind::Model), - AssetKindFilter::Texture => matches!(asset.kind, EditorAssetKind::Texture), - AssetKindFilter::Material => matches!(asset.kind, EditorAssetKind::Material), - AssetKindFilter::Audio => matches!(asset.kind, EditorAssetKind::AudioClip), - AssetKindFilter::Level => matches!(asset.kind, EditorAssetKind::Level), - AssetKindFilter::Prefab => matches!(asset.kind, EditorAssetKind::Prefab), - AssetKindFilter::Builtin => asset.path.is_none(), - } -} - -fn kind_filter_label(filter: AssetKindFilter) -> &'static str { - match filter { - AssetKindFilter::All => "All", - AssetKindFilter::Model => "Models", - AssetKindFilter::Texture => "Textures", - AssetKindFilter::Material => "Materials", - AssetKindFilter::Audio => "Audio", - AssetKindFilter::Level => "Levels", - AssetKindFilter::Prefab => "Prefabs", - AssetKindFilter::Builtin => "Built-ins", - } -} - -fn sort_label(sort: AssetSort) -> &'static str { - match sort { - AssetSort::Name => "Name", - AssetSort::Kind => "Type", - AssetSort::Modified => "Modified", - AssetSort::Size => "Size", - } -} - -fn kind_label(kind: &EditorAssetKind) -> &'static str { - match kind { - EditorAssetKind::Primitive(_) => "Primitive", - EditorAssetKind::Light(_) => "Light", - EditorAssetKind::Model => "Model", - EditorAssetKind::Texture => "Texture", - EditorAssetKind::Material => "Material", - EditorAssetKind::AudioClip => "Audio Clip", - EditorAssetKind::Level => "Level", - EditorAssetKind::Prefab => "Prefab", - EditorAssetKind::PostProcessVolume => "Post Process Volume", - EditorAssetKind::PostProcessEffect => "Post FX", - EditorAssetKind::RenderingProfile => "Rendering Profile", - EditorAssetKind::ShaderSchema => "Shader Schema", - } -} - -fn file_size(path: &str) -> Option { - fs::metadata(path).ok().map(|metadata| metadata.len()) -} - -fn audio_format_label(path: &str) -> &'static str { - match Path::new(path) - .extension() - .and_then(|extension| extension.to_str()) - .map(str::to_ascii_lowercase) - .as_deref() - { - Some("ogg" | "oga") => "Ogg audio", - Some("spx") => "Speex", - Some("wav") => "WAV", - Some("mp3") => "MP3", - Some("flac") => "FLAC", - _ => "Unknown", - } -} - -fn modified_time(path: &str) -> Option { - fs::metadata(path) - .ok() - .and_then(|metadata| metadata.modified().ok()) -} - -fn format_bytes(bytes: u64) -> String { - const KIB: f64 = 1024.0; - const MIB: f64 = KIB * 1024.0; - const GIB: f64 = MIB * 1024.0; - let bytes = bytes as f64; - if bytes >= GIB { - format!("{:.1} GB", bytes / GIB) - } else if bytes >= MIB { - format!("{:.1} MB", bytes / MIB) - } else if bytes >= KIB { - format!("{:.1} KB", bytes / KIB) - } else { - format!("{bytes:.0} B") - } -} - -fn format_modified(time: SystemTime) -> String { - let Ok(duration) = SystemTime::now().duration_since(time) else { - return "Just now".to_string(); - }; - let days = duration.as_secs() / 86_400; - if days == 0 { - "Today".to_string() - } else if days == 1 { - "Yesterday".to_string() - } else if days < 30 { - format!("{days} days ago") - } else if days < 365 { - format!("{} months ago", days / 30) - } else { - format!("{} years ago", days / 365) - } -} - -fn natural_cmp(a: &str, b: &str) -> std::cmp::Ordering { - a.to_ascii_lowercase().cmp(&b.to_ascii_lowercase()) -} - -fn asset_context_menu( - world: &mut World, - ui: &mut egui::Ui, - asset: &EditorAsset, - selected_entities: &SelectedEntities, -) { - if ui.button("Select").clicked() { - world - .resource_mut::() - .select(AssetSelection::from_asset(asset)); - ui.close(); - } - if matches!( - asset.kind, - EditorAssetKind::Primitive(_) - | EditorAssetKind::Light(_) - | EditorAssetKind::Model - | EditorAssetKind::AudioClip - | EditorAssetKind::Prefab - ) && ui.button("Place at Origin").clicked() - { - place_asset_operator(world, asset.clone(), Vec3::ZERO); - ui.close(); - } - if matches!(asset.kind, EditorAssetKind::Level) && ui.button("Open Scene").clicked() { - open_level_asset(world, asset); - ui.close(); - } - if matches!(asset.kind, EditorAssetKind::Model) && has_embedded_assets(world, asset) { - let expanded = asset.path.as_deref().is_some_and(|path| { - world - .resource::() - .expanded_assets - .contains(path) - }); - if ui - .button(if expanded { - "Collapse Contents" - } else { - "Expand Contents" - }) - .clicked() - { - if let Some(path) = asset.path.as_ref() { - toggle_asset_expanded(world, path); - } - ui.close(); - } - } - if matches!(asset.kind, EditorAssetKind::Texture) - && ui.button("Apply as Base Color Texture").clicked() - { - apply_texture_operator(world, asset.clone(), selected_entities); - ui.close(); - } - if matches!(asset.kind, EditorAssetKind::Material) - && ui.button("Apply Material To Selection").clicked() - { - apply_material_operator(world, asset.clone(), selected_entities); - ui.close(); - } - if matches!(asset.kind, EditorAssetKind::Model) && ui.button("Reimport").clicked() { - reimport_asset(world, asset); - ui.close(); - } - if matches!( - asset.kind, - EditorAssetKind::Texture | EditorAssetKind::Model | EditorAssetKind::Material - ) && ui.button("Regenerate Thumbnail").clicked() - { - regenerate_asset_thumbnail(world, asset); - ui.close(); - } - if asset.path.is_some() { - ui.separator(); - if ui.button("Move To Trash").clicked() { - request_delete_for_asset(world, asset); - ui.close(); - } - } -} - -fn subasset_context_menu( - world: &mut World, - ui: &mut egui::Ui, - embedded: &EmbeddedAsset, - selected_entities: &SelectedEntities, -) { - if ui.button("Select").clicked() { - world - .resource_mut::() - .select(embedded.selection.clone()); - ui.close(); - } - match embedded.kind { - AssetSubAssetKind::Mesh => { - if embedded.requires_skinned_hierarchy { - if ui.button("Place Skinned Model at Origin").clicked() { - place_subasset_operator(world, embedded.selection.clone(), Vec3::ZERO); - ui.close(); - } - } else if ui.button("Place at Origin").clicked() { - place_subasset_operator(world, embedded.selection.clone(), Vec3::ZERO); - ui.close(); - } - } - AssetSubAssetKind::Texture => { - if ui.button("Apply as Base Color Texture").clicked() { - if let Some(asset) = - texture_asset_from_subasset_selection(world, &Some(embedded.selection.clone())) - { - apply_texture_operator(world, asset, selected_entities); - } - ui.close(); - } - } - AssetSubAssetKind::Material => { - ui.label(egui::RichText::new("Embedded source material").color(TEXT_DIM)); - } - AssetSubAssetKind::Skeleton => { - ui.label(egui::RichText::new("Inspect-only rig metadata").color(TEXT_DIM)); - } - AssetSubAssetKind::AnimationClip => { - let animated_actor = selected_entities - .as_slice() - .iter() - .copied() - .find(|entity| world.get::(*entity).is_some()); - let action = if animated_actor.is_some() { - "Assign To Selected Actor" - } else { - "Create Animated Actor" - }; - if ui.button(action).clicked() { - if let Some(entity) = animated_actor { - assign_animation_clip_operator(world, embedded.selection.clone(), entity); - } else { - place_subasset_operator(world, embedded.selection.clone(), Vec3::ZERO); - } - ui.close(); - } - } - } - if matches!( - embedded.kind, - AssetSubAssetKind::Mesh | AssetSubAssetKind::Material | AssetSubAssetKind::Texture - ) && ui.button("Regenerate Thumbnail").clicked() - { - regenerate_subasset_thumbnail(world, embedded); - ui.close(); - } - if let AssetSelection::SubAsset { parent_path, .. } = &embedded.selection { - if ui.button("Select Parent Asset").clicked() { - world - .resource_mut::() - .select(AssetSelection::File(parent_path.clone())); - ui.close(); - } - } -} - -fn regenerate_asset_thumbnail(world: &mut World, asset: &EditorAsset) { - let Some(path) = asset.path.clone() else { - return; - }; - let key = asset_cache_key(asset); - let kind = asset.kind.clone(); - let asset_server = world.resource::().clone(); - world.resource_scope(|world, mut cache: Mut| { - cache.retry(&key); - match kind { - EditorAssetKind::Texture => { - cache.request_texture(key.clone(), path.clone(), &asset_server); - } - EditorAssetKind::Model => { - world.resource_scope(|_world, mut studio: Mut| { - cache.request_model(key.clone(), path.clone(), &asset_server, &mut studio); - }); - } - EditorAssetKind::Material => { - world.resource_scope(|_world, mut studio: Mut| { - cache.request_material_asset(key.clone(), path.clone(), &mut studio); - }); - } - _ => {} - } - }); - world.resource_mut::().status = format!("Regenerating thumbnail for {}", asset.label); -} - -fn regenerate_subasset_thumbnail(world: &mut World, embedded: &EmbeddedAsset) { - let AssetSelection::SubAsset { parent_path, .. } = &embedded.selection else { - return; - }; - let key = embedded.thumbnail_key.clone(); - let asset_server = world.resource::().clone(); - world.resource_scope(|world, mut cache: Mut| { - cache.retry(&key); - match embedded.kind { - AssetSubAssetKind::Mesh => { - let Some(mesh_label) = embedded.mesh_label.clone() else { - return; - }; - world.resource_scope(|_world, mut studio: Mut| { - cache.request_mesh_subasset( - key.clone(), - parent_path.clone(), - mesh_label, - embedded.material_label.clone(), - embedded.requires_skinned_hierarchy, - &mut studio, - ); - }); - } - AssetSubAssetKind::Material => { - let Some(material_label) = embedded.material_label.clone() else { - return; - }; - world.resource_scope(|_world, mut studio: Mut| { - cache.request_source_material( - key.clone(), - parent_path.clone(), - material_label, - &mut studio, - ); - }); - } - AssetSubAssetKind::Texture => { - if let Some(texture_path) = embedded.texture_path.clone() { - cache.request_texture(key.clone(), texture_path, &asset_server); - } - } - AssetSubAssetKind::Skeleton | AssetSubAssetKind::AnimationClip => {} - } - }); - world.resource_mut::().status = - format!("Regenerating thumbnail for {}", embedded.label); -} - -fn reimport_asset(world: &mut World, asset: &EditorAsset) { - let Some(path) = asset.path.as_deref() else { - return; - }; - let mut status = format!("Reimported {}", asset.label); - if let Some(mut registry) = world.get_resource_mut::() { - if let Some(record) = find_asset_mut_by_path(&mut registry, path) { - if let Err(error) = refresh_model_artifacts(record) { - status = format!("Reimport failed for {}: {error}", asset.label); - warn!("{status}"); - } - } - if let Err(error) = save_registry(®istry) { - status = format!("Asset registry save failed: {error}"); - warn!("{status}"); - } else { - registry.index_dirty = false; - } - } - invalidate_on_catalog_refresh(world); - world.resource_mut::().status = status; -} - -fn request_delete_for_asset(world: &mut World, asset: &EditorAsset) { - if let Some(request) = build_delete_request(world, asset) { - world.resource_mut::().pending_delete = Some(request); - } -} - -fn build_delete_request(world: &World, asset: &EditorAsset) -> Option { - let path = asset.path.clone()?; - let mut files = vec![path.clone()]; - let mut warnings = Vec::new(); - if matches!(asset.kind, EditorAssetKind::Model) { - if let Some(record) = world - .get_resource::() - .and_then(|registry| find_asset_by_path(registry, &path)) - { - if let Some(manifest) = record.import_settings.static_mesh_manifest_path { - files.push(manifest); - } - if let Some(manifest) = record.import_settings.animation_manifest_path { - files.push(manifest); - } - if !record.dependencies.is_empty() { - warnings.push(format!( - "{} imported dependencies will be kept because they may be shared.", - record.dependencies.len() - )); - } - } - } - warnings.push("Scene and prefab references are not rewritten automatically.".to_string()); - dedup_strings(&mut files); - Some(AssetDeleteRequest { - selection: AssetSelection::from_asset(asset), - label: asset.label.clone(), - files, - warnings, - }) -} - -fn draw_delete_modal(world: &mut World, ctx: &egui::Context) { - let pending = world - .resource::() - .pending_delete - .clone(); - let Some(request) = pending else { - return; - }; - let mut action = None; - egui::Window::new("Move Asset To Trash") - .collapsible(false) - .resizable(false) - .default_width(360.0) - .show(ctx, |ui| { - ui.label(format!("Move {} to assets/.trash?", request.label)); - ui.separator(); - ui.label(panel_heading("Files")); - for file in &request.files { - ui.add(egui::Label::new(file).wrap()); - } - if !request.warnings.is_empty() { - ui.separator(); - ui.label(panel_heading("Warnings")); - for warning in &request.warnings { - ui.small(egui::RichText::new(warning).color(TEXT_DIM)); - } - } - ui.separator(); - ui.horizontal(|ui| { - if ui.button("Cancel").clicked() { - action = Some(false); - } - if ui.button("Move To Trash").clicked() { - action = Some(true); - } - }); - }); - - match action { - Some(false) => { - world.resource_mut::().pending_delete = None; - } - Some(true) => { - execute_delete_request(world, &request); - world.resource_mut::().pending_delete = None; - } - None => {} - } -} - -fn execute_delete_request(world: &mut World, request: &AssetDeleteRequest) { - let trash_root = PathBuf::from("assets/.trash").join(trash_timestamp()); - let mut moved = 0usize; - let mut errors = Vec::new(); - for file in &request.files { - let source = Path::new(file); - if !source.exists() { - continue; - } - match move_file_to_trash(source, &trash_root) { - Ok(()) => moved += 1, - Err(error) => errors.push(format!("{file}: {error}")), - } - } - if !errors.is_empty() { - world.resource_mut::().status = format!( - "Could not move {} file(s) to trash: {}", - errors.len(), - errors.join("; ") - ); - return; - } - - if let Some(parent_path) = request.selection.parent_path().map(str::to_string) { - if let Some(mut registry) = world.get_resource_mut::() { - registry.records.retain(|record| record.path != parent_path); - registry.index_dirty = true; - if let Err(error) = save_registry(®istry) { - warn!("Asset registry save failed after delete: {error}"); - } else { - registry.index_dirty = false; - } - } - } - - { - let mut assets = world.resource_mut::(); - if let Some(parent_path) = request.selection.parent_path() { - if assets - .selected - .as_ref() - .and_then(AssetSelection::parent_path) - == Some(parent_path) - { - assets.selected = None; - } - } - assets.refresh(); - } - invalidate_on_catalog_refresh(world); - world.resource_mut::().status = format!( - "Moved {} file(s) for {} to {}", - moved, - request.label, - trash_root.to_string_lossy() - ); -} - -fn move_file_to_trash(source: &Path, trash_root: &Path) -> Result<(), String> { - let target = trash_root.join(source); - if let Some(parent) = target.parent() { - fs::create_dir_all(parent) - .map_err(|error| format!("could not create {}: {error}", parent.display()))?; - } - fs::rename(source, &target) - .or_else(|_| { - fs::copy(source, &target)?; - fs::remove_file(source) - }) - .map_err(|error| format!("could not move to {}: {error}", target.display()))?; - Ok(()) -} - -fn trash_timestamp() -> String { - SystemTime::now() - .duration_since(UNIX_EPOCH) - .map(|duration| duration.as_secs().to_string()) - .unwrap_or_else(|_| "now".to_string()) -} - -fn dedup_strings(values: &mut Vec) { - let mut seen = HashSet::new(); - values.retain(|value| seen.insert(value.clone())); -} - -pub(crate) fn validate_material_conflict_destination( - world: &World, - destination: &Path, -) -> Result { - let root = PathBuf::from(&world.resource::().root); - let root = root.canonicalize().unwrap_or(root); - let absolute = if destination.is_absolute() { - destination.to_path_buf() - } else { - root.join(destination) - }; - let absolute = absolute - .parent() - .and_then(|parent| parent.canonicalize().ok()) - .and_then(|parent| destination.file_name().map(|name| parent.join(name))) - .unwrap_or(absolute); - let relative = absolute.strip_prefix(&root).map_err(|_| { - format!( - "Material assets must stay inside {}", - root.join("assets").display() - ) - })?; - if !relative.starts_with("assets") { - return Err(format!( - "Material assets must stay inside {}", - root.join("assets").display() - )); - } - Ok(relative.to_string_lossy().replace('\\', "/")) -} - -pub(crate) fn reload_material_after_file_conflict( - world: &mut World, - path: &Path, - intent: &FileWriteIntent, -) -> Result { - let path = path.to_string_lossy(); - { - let mut state = world.resource_mut::(); - match intent { - FileWriteIntent::Material => { - if state - .material_draft - .as_ref() - .is_some_and(|draft| draft.path == path) - { - state.material_draft = None; - } - } - FileWriteIntent::MaterialInstance => { - if state - .material_instance_draft - .as_ref() - .is_some_and(|draft| draft.path == path) - { - state.material_instance_draft = None; - } - } - _ => return Err("the conflict is not an editable material document".into()), - } - } - world.resource_mut::().refresh(); - invalidate_on_catalog_refresh(world); - Ok(format!("Reloaded {} from disk", path)) -} - -pub(crate) fn adopt_material_conflict_save_as( - world: &mut World, - original_path: &Path, - catalog_path: String, - disk_snapshot: FileSnapshot, - intent: &FileWriteIntent, -) -> Result { - let original_path = original_path.to_string_lossy(); - { - let mut state = world.resource_mut::(); - match intent { - FileWriteIntent::Material => { - if let Some(draft) = state - .material_draft - .as_mut() - .filter(|draft| draft.path == original_path) - { - draft.path.clone_from(&catalog_path); - draft.disk_snapshot = disk_snapshot; - draft.error = None; - } else { - let asset = MaterialAsset::load_from_path(&catalog_path)?; - state.material_draft = Some(MaterialAssetDraft { - path: catalog_path.clone(), - asset, - disk_snapshot, - error: None, - }); - } - } - FileWriteIntent::MaterialInstance => { - if let Some(draft) = state - .material_instance_draft - .as_mut() - .filter(|draft| draft.path == original_path) - { - draft.path.clone_from(&catalog_path); - draft.disk_snapshot = disk_snapshot; - draft.error = None; - } else { - let asset = MaterialInstanceAsset::load_from_path(&catalog_path)?; - state.material_instance_draft = Some(MaterialInstanceAssetDraft { - path: catalog_path.clone(), - asset, - disk_snapshot, - error: None, - }); - } - } - _ => return Err("the conflict is not an editable material document".into()), - } - } - { - let mut assets = world.resource_mut::(); - assets.refresh(); - assets.select(AssetSelection::File(catalog_path.clone())); - } - invalidate_on_catalog_refresh(world); - Ok(format!("Saved material copy to {catalog_path}")) -} + draw_import_to_modal(world, ui.ctx()); + draw_path_edit_modal(world, ui.ctx()); + draw_content_transaction_modal(world, ui.ctx()); + draw_gltf_material_extraction_modal(world, ui.ctx()); + draw_pbr_grouping_modal(world, ui.ctx()); + draw_trash_modal(world, ui.ctx()); + draw_external_move_repair_modal(world, ui.ctx()); +} + +#[path = "panel/details.rs"] +mod details; +#[path = "panel/embedded.rs"] +mod embedded; +#[path = "panel/file_operations.rs"] +mod file_operations; +#[path = "panel/grid.rs"] +mod grid; +#[path = "panel/import_settings.rs"] +mod import_settings; +#[path = "panel/list.rs"] +mod list; +#[path = "panel/material_extraction.rs"] +mod material_extraction; +#[path = "panel/navigation.rs"] +mod navigation; +#[path = "panel/pbr_transactions.rs"] +mod pbr_transactions; +#[path = "panel/toolbar_import.rs"] +mod toolbar_import; +#[path = "panel/undo_trash.rs"] +mod undo_trash; +#[path = "panel/utilities.rs"] +mod utilities; +#[path = "panel/validation.rs"] +mod validation; + +use crate::ui::materials::{ + create_material_instance_from_base, material_asset_editor, material_instance_asset_editor, +}; +pub(crate) use details::top_level_asset_details_panel; +use details::*; +use embedded::*; +use file_operations::*; +use grid::*; +use import_settings::*; +use list::*; +pub(crate) use material_extraction::begin_actor_material_extraction; +use material_extraction::*; +use navigation::*; +use pbr_transactions::*; +pub(crate) use toolbar_import::draw_asset_import_review_modal; +use toolbar_import::*; +use undo_trash::*; +use utilities::*; +pub(crate) use validation::validate_material_conflict_destination; #[cfg(test)] mod tests { use super::*; - - #[test] - fn material_apply_refuses_an_external_revision() { - let root = std::env::temp_dir().join(format!( - "blacksite-material-external-write-{}", - uuid::Uuid::new_v4() - )); - let path = root.join("assets/materials/test.ron"); - fs::create_dir_all(path.parent().unwrap()).unwrap(); - fs::write(&path, b"loaded").unwrap(); - let disk_snapshot = FileSnapshot::capture(&path).unwrap(); - let draft = MaterialAssetDraft { - path: path.to_string_lossy().into_owned(), - asset: MaterialAsset { - schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, - label: "Test".into(), - shader: None, - shader_ref: None, - render_state: shared::MaterialRenderState::default(), - material: MaterialDesc::default(), - }, - disk_snapshot, - error: None, - }; - let state = AssetBrowserUiState { - material_draft: Some(draft), - ..Default::default() - }; - let mut world = World::new(); - world.insert_resource(state); - world.insert_resource(SceneIo::default()); - fs::write(&path, b"external").unwrap(); - - save_material_draft(&mut world); - - assert_eq!(fs::read(&path).unwrap(), b"external"); - assert!(world - .resource::() - .material_draft - .as_ref() - .and_then(|draft| draft.error.as_deref()) - .is_some_and(|error| error.contains("changed outside Blacksite"))); - fs::remove_dir_all(root).unwrap(); - } - - #[test] - fn audio_filter_matches_only_audio_clips() { - let audio = EditorAsset { - label: "Impact".into(), - path: Some("assets/audio/impact.ogg".into()), - folder_path: "assets/audio".into(), - kind: EditorAssetKind::AudioClip, - }; - let texture = EditorAsset { - kind: EditorAssetKind::Texture, - ..audio.clone() - }; - - assert!(asset_matches_kind_filter(&audio, AssetKindFilter::Audio)); - assert!(!asset_matches_kind_filter(&texture, AssetKindFilter::Audio)); - assert_eq!(kind_filter_label(AssetKindFilter::Audio), "Audio"); - } - - #[test] - fn audio_details_label_supported_formats() { - assert_eq!(audio_format_label("assets/audio/music.oga"), "Ogg audio"); - assert_eq!(audio_format_label("assets/audio/voice.spx"), "Speex"); - assert_eq!(audio_format_label("assets/audio/source.WAV"), "WAV"); - assert_eq!(audio_format_label("assets/audio/source.mp3"), "MP3"); - assert_eq!(audio_format_label("assets/audio/source.flac"), "FLAC"); - } - - #[test] - fn material_instance_texture_override_stays_sparse() { - let first = EditorAssetRef::new("texture-a", "texture:source", "First") - .with_source_path("assets/textures/first.png"); - let second = EditorAssetRef::new("texture-b", "texture:source", "Second") - .with_source_path("assets/textures/second.png"); - let mut textures = Vec::new(); - - set_material_instance_texture_override(&mut textures, "base_color_texture", Some(first)); - set_material_instance_texture_override( - &mut textures, - "base_color_texture", - Some(second.clone()), - ); - - assert_eq!(textures.len(), 1); - assert_eq!(textures[0].name, "base_color_texture"); - assert_eq!(textures[0].texture.as_ref(), Some(&second)); - - set_material_instance_texture_override(&mut textures, "base_color_texture", None); - assert!(textures.is_empty()); - } + include!("panel/tests/a.rs"); + include!("panel/tests/b.rs"); } diff --git a/crates/editor/src/ui/asset_browser/panel/details.rs b/crates/editor/src/ui/asset_browser/panel/details.rs new file mode 100644 index 0000000..c902798 --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/details.rs @@ -0,0 +1,439 @@ +use super::*; + +pub(super) fn detail_row(ui: &mut egui::Ui, label: &str, value: &str) { + ui.horizontal_wrapped(|ui| { + ui.label(egui::RichText::new(label).color(TEXT_DIM)); + ui.add(egui::Label::new(value).wrap().selectable(false)); + }); +} + +pub(super) fn details_panel( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, +) { + ui.label(panel_heading("Details")); + ui.separator(); + let selections = world.resource::().selections.clone(); + if selections.len() > 1 { + let has_authored_content = !selected_content_paths(world).is_empty(); + ui.label(panel_heading(&format!( + "{} items selected", + selections.len() + ))); + ui.small( + egui::RichText::new("Batch file operations apply to every selected item.") + .color(TEXT_DIM), + ); + ui.add_space(6.0); + for selection in selections.iter().take(12) { + ui.add(egui::Label::new(selection.display_label()).truncate()); + } + if selections.len() > 12 { + ui.small(format!("…and {} more", selections.len() - 12)); + } + ui.separator(); + if ui + .add_enabled( + has_authored_content, + egui::Button::new("Duplicate Selection"), + ) + .clicked() + { + duplicate_selection(world); + } + if ui + .add_enabled( + has_authored_content, + egui::Button::new("Move Selection To Trash"), + ) + .clicked() + { + request_delete_for_selection(world); + } + return; + } + let selection = world.resource::().selected.clone(); + if let Some(AssetSelection::Folder(path)) = selection { + ui.label(panel_heading( + Path::new(&path) + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or(&path), + )); + detail_row(ui, "Path", &path); + ui.separator(); + if ui.button("Open Folder").clicked() { + navigate_content_folder(world, path); + } + } else if let Some(selection @ AssetSelection::SubAsset { .. }) = selection { + subasset_details_panel(world, ui, selected_entities, &selection); + } else if let Some(asset) = world.resource::().selected_asset().cloned() { + top_level_asset_details_panel(world, ui, selected_entities, &asset); + } else { + ui.label(egui::RichText::new("No asset selected").color(TEXT_DIM)); + } +} + +pub(crate) fn top_level_asset_details_panel( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + asset: &EditorAsset, +) { + asset_details_header(world, ui, asset); + ui.add_space(8.0); + detail_row(ui, "Path", asset.path.as_deref().unwrap_or("Built-in")); + detail_row(ui, "Folder", asset.folder_path.as_str()); + + if asset.path.is_none() && asset.label == blacksite_surface::DEFAULT_GRID_LABEL { + ui.separator(); + ui.label(egui::RichText::new("Engine built-in · read-only").color(TEXT_DIM)); + ui.small("World-space tri-planar checker used when no valid project material resolves."); + return; + } + + if let Some(path) = asset.path.as_deref() { + if let Some(record) = world + .get_resource::() + .and_then(|registry| find_asset_by_path(registry, path)) + { + detail_row(ui, "Asset ID", &record.id.as_string()); + if matches!(asset.kind, EditorAssetKind::Model) { + let settings = record.model_import(); + ui.separator(); + ui.label(panel_heading("Import Settings")); + import_settings_editor(world, ui, asset, path, settings); + if let Some(manifest) = settings.static_mesh_manifest_path.as_deref() { + detail_row(ui, "Static mesh artifact", manifest); + } + } + if matches!(asset.kind, EditorAssetKind::Texture) { + if let Some(settings) = record.texture_import() { + ui.separator(); + ui.label(panel_heading("Texture Properties")); + texture_import_settings_editor(world, ui, path, &record, settings); + } + } + if !record.dependencies.is_empty() { + ui.separator(); + let missing_count = record + .dependencies + .iter() + .filter(|dependency| !dependency_path(dependency).is_file()) + .count(); + ui.horizontal_wrapped(|ui| { + ui.label(panel_heading("Dependencies")); + if missing_count > 0 { + let optional = !model_uses_source_materials(&record); + ui.small( + egui::RichText::new(if optional { + format!("{missing_count} missing | override") + } else { + format!("{missing_count} missing") + }) + .color(if optional { + WARNING + } else { + ERROR + }), + ); + } + }); + for dep in &record.dependencies { + let exists = dependency_path(dep).is_file(); + ui.horizontal(|ui| { + ui.label( + egui::RichText::new(if exists { + icons::CHECK_CIRCLE.as_str() + } else { + icons::WARNING_CIRCLE.as_str() + }) + .font(egui::FontId::new( + 12.0, + egui::FontFamily::Name(PHOSPHOR.into()), + )) + .color(if exists { + SUCCESS + } else { + WARNING + }), + ); + ui.add(egui::Label::new(dep).truncate()).on_hover_text(dep); + }); + } + } + } + detail_row( + ui, + "Size", + file_size(path).map(format_bytes).as_deref().unwrap_or("-"), + ); + detail_row( + ui, + "Modified", + modified_time(path) + .map(format_modified) + .as_deref() + .unwrap_or("-"), + ); + if matches!(asset.kind, EditorAssetKind::Material) { + ui.separator(); + ui.label(panel_heading("Material")); + crate::ui::design_system::scope(ui, |ui| { + if MaterialInstanceAsset::load_from_path(path).is_ok() { + material_instance_asset_editor(world, ui, asset, path, true); + } else { + material_asset_editor(world, ui, asset, path, true); + } + }); + } + if matches!(asset.kind, EditorAssetKind::AudioClip) { + detail_row(ui, "Format", audio_format_label(path)); + let previewing = world + .resource::() + .clip_path + .as_deref() + == Some(path); + ui.horizontal_wrapped(|ui| { + if ui + .add_enabled( + !previewing, + egui::Button::new(format!("{} Audition", icons::PLAY.as_str())), + ) + .clicked() + { + if let Err(error) = + crate::play::audio_preview::audition_audio_asset(world, asset) + { + world.resource_mut::().status = + format!("Audio audition failed: {error}"); + } + } + if ui + .add_enabled( + previewing, + egui::Button::new(format!("{} Stop", icons::STOP.as_str())), + ) + .clicked() + { + crate::play::audio_preview::stop_audio_preview(world); + } + }); + } + } + + ui.separator(); + asset_action_buttons(world, ui, selected_entities, asset); +} + +pub(super) fn asset_details_header(world: &World, ui: &mut egui::Ui, asset: &EditorAsset) { + ui.horizontal_wrapped(|ui| { + ui.label( + egui::RichText::new(kind_icon(&asset.kind).as_str()) + .font(egui::FontId::new( + 30.0, + egui::FontFamily::Name(PHOSPHOR.into()), + )) + .color(ACCENT), + ); + ui.vertical(|ui| { + ui.strong(asset.label.as_str()); + ui.small(egui::RichText::new(kind_label(&asset.kind)).color(TEXT_DIM)); + if let (Some(state), Some(path)) = ( + world.get_resource::(), + asset.path.as_deref(), + ) { + let status = state.file_status(Path::new(path)); + let _ = file_status_indicator_ui(ui, &status, Path::new(path)); + } + if let Some(snapshot) = asset.path.as_deref().and_then(|path| { + world + .get_resource::() + .and_then(|store| store.snapshot_for_path(path)) + }) { + if snapshot.dirty { + ui.small(egui::RichText::new("UNSAVED").color(WARNING).strong()); + } + } + }); + }); +} + +pub(super) fn subasset_details_panel( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + selection: &AssetSelection, +) { + let Some(embedded) = embedded_asset_for_selection(world, selection) else { + ui.colored_label(egui::Color32::YELLOW, "Embedded asset is not available."); + return; + }; + let AssetSelection::SubAsset { + parent_path, + sub_asset_id, + .. + } = selection + else { + return; + }; + ui.horizontal_wrapped(|ui| { + ui.label( + egui::RichText::new(subasset_icon(embedded.kind).as_str()) + .font(egui::FontId::new( + 30.0, + egui::FontFamily::Name(PHOSPHOR.into()), + )) + .color(ACCENT), + ); + ui.vertical(|ui| { + ui.strong(embedded.label.as_str()); + ui.small(egui::RichText::new(subasset_kind_label(embedded.kind)).color(TEXT_DIM)); + }); + }); + ui.add_space(8.0); + detail_row(ui, "Parent", parent_path); + detail_row(ui, "ID", sub_asset_id); + detail_row(ui, "Source", &embedded.detail); + + ui.separator(); + match embedded.kind { + AssetSubAssetKind::Mesh => { + if embedded.requires_skinned_hierarchy { + if ui.button("Place Skinned Model At Origin").clicked() { + place_subasset_operator(world, selection.clone(), Vec3::ZERO); + } + } else if ui.button("Place At Origin").clicked() { + place_subasset_operator(world, selection.clone(), Vec3::ZERO); + } + } + AssetSubAssetKind::Texture => { + if ui.button("Apply Texture To Selection").clicked() { + if let Some(asset) = + texture_asset_from_subasset_selection(world, &Some(selection.clone())) + { + apply_texture_operator(world, asset, selected_entities); + } + } + } + AssetSubAssetKind::Material => { + let status = if embedded.detail.contains("Authoring Override") { + "Authoring Override is active; this source material is not assigned." + } else { + "Source material is assigned through static mesh renderer slots." + }; + ui.small(egui::RichText::new(status).color(TEXT_DIM)); + } + AssetSubAssetKind::Skeleton => { + ui.small( + egui::RichText::new("Skeleton metadata is generated from the model source.") + .color(TEXT_DIM), + ); + } + AssetSubAssetKind::AnimationClip => { + let animated_actor = selected_entities + .as_slice() + .iter() + .copied() + .find(|entity| world.get::(*entity).is_some()); + let action = if animated_actor.is_some() { + "Assign To Selected Actor" + } else { + "Create Animated Actor" + }; + if ui.button(action).clicked() { + if let Some(entity) = animated_actor { + assign_animation_clip_operator(world, selection.clone(), entity); + } else { + place_subasset_operator(world, selection.clone(), Vec3::ZERO); + } + } + } + } + if ui.button("Select Parent Asset").clicked() { + world + .resource_mut::() + .select(AssetSelection::File(parent_path.clone())); + } +} + +pub(super) fn dependency_path(reference: &str) -> PathBuf { + let path = Path::new(reference); + if path.starts_with("assets") { + path.to_path_buf() + } else { + Path::new("assets").join(path) + } +} + +pub(super) fn asset_action_buttons( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + asset: &EditorAsset, +) { + ui.horizontal_wrapped(|ui| { + if matches!(asset.kind, EditorAssetKind::Texture) && ui.button("Apply Texture").clicked() { + apply_texture_operator(world, asset.clone(), selected_entities); + } + if asset.path.is_some() + && matches!(asset.kind, EditorAssetKind::Material) + && ui.button("Apply Material").clicked() + { + apply_material_operator(world, asset.clone(), selected_entities); + } + if matches!( + asset.kind, + EditorAssetKind::Primitive(_) + | EditorAssetKind::Light(_) + | EditorAssetKind::Model + | EditorAssetKind::AudioClip + | EditorAssetKind::Prefab + ) && ui.button("Place At Origin").clicked() + { + place_asset_operator(world, asset.clone(), Vec3::ZERO); + } + if matches!(asset.kind, EditorAssetKind::Level) && ui.button("Open Scene").clicked() { + open_level_asset(world, asset); + } + if matches!(asset.kind, EditorAssetKind::Model) + && has_embedded_assets(world, asset) + && ui.button("Toggle Contents").clicked() + { + if let Some(path) = asset.path.as_ref() { + toggle_asset_expanded(world, path); + } + } + if matches!(asset.kind, EditorAssetKind::Model) && ui.button("Reimport").clicked() { + reimport_asset(world, asset); + } + if asset.path.is_some() && ui.button("Move To Trash").clicked() { + request_delete_for_asset(world, asset); + } + }); +} + +pub(super) fn open_level_asset(world: &mut World, asset: &EditorAsset) { + let Some(path) = asset.path.as_deref() else { + return; + }; + world.resource_mut::().request = Some(SceneIoRequest::OpenPath(PathBuf::from(path))); +} + +pub(super) fn activate_content_asset(world: &mut World, asset: &EditorAsset) { + world + .resource_mut::() + .select(AssetSelection::from_asset(asset)); + match asset.kind { + EditorAssetKind::Level => open_level_asset(world, asset), + EditorAssetKind::Model if has_embedded_assets(world, asset) => { + if let Some(path) = asset.path.as_deref() { + toggle_asset_expanded(world, path); + } + } + _ => { + world.resource_mut::().show_details = true; + } + } +} diff --git a/crates/editor/src/ui/asset_browser/panel/embedded.rs b/crates/editor/src/ui/asset_browser/panel/embedded.rs new file mode 100644 index 0000000..d139826 --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/embedded.rs @@ -0,0 +1,374 @@ +use super::*; + +#[derive(Clone)] +pub(super) struct AssetBrowserStateSnapshot { + pub(super) search: String, + pub(super) view: AssetBrowserView, + pub(super) sort: AssetSort, + pub(super) kind_filter: AssetKindFilter, + pub(super) thumbnail_size: f32, + pub(super) recursive: bool, + pub(super) show_details: bool, + pub(super) details_width: f32, +} + +pub(super) fn state_snapshot(state: &AssetBrowserUiState) -> AssetBrowserStateSnapshot { + AssetBrowserStateSnapshot { + search: state.search.clone(), + view: state.view, + sort: state.sort, + kind_filter: state.kind_filter, + thumbnail_size: state.thumbnail_size, + recursive: state.recursive, + show_details: state.show_details, + details_width: state.details_width, + } +} + +pub(super) fn embedded_assets_for_asset(world: &World, asset: &EditorAsset) -> Vec { + if !matches!(asset.kind, EditorAssetKind::Model) { + return Vec::new(); + } + let Some(parent_path) = asset.path.as_ref() else { + return Vec::new(); + }; + let Some(record) = world + .get_resource::() + .and_then(|registry| find_asset_by_path(registry, parent_path)) + else { + return Vec::new(); + }; + let mut embedded = Vec::new(); + let settings = record.model_import(); + let static_manifest = settings + .static_mesh_manifest_path + .as_deref() + .and_then(|path| load_static_mesh_manifest(path).ok()); + let legacy_skinned_primitives = static_manifest + .as_ref() + .filter(|manifest| manifest.schema_version < 2) + .map(|_| crate::assets::gltf_skinned_primitive_labels(parent_path.as_str())) + .unwrap_or_default(); + if let Some(manifest) = static_manifest.as_ref() { + for part in &manifest.parts { + let mesh_id = part_effective_id(part); + let material_label = part.material_label.clone(); + let requires_skinned_hierarchy = manifest.metadata.animation_count > 0 + || part.skinned + || legacy_skinned_primitives.contains(&part.mesh_label); + embedded.push(EmbeddedAsset { + selection: AssetSelection::SubAsset { + parent_path: parent_path.clone(), + sub_asset_id: mesh_id, + label: part.name.clone(), + kind: AssetSubAssetKind::Mesh, + source_path: None, + }, + label: part.name.clone(), + kind: AssetSubAssetKind::Mesh, + detail: if requires_skinned_hierarchy { + "Skinned | dedicated renderer".to_string() + } else { + part.source_mesh + .clone() + .unwrap_or_else(|| part.mesh_label.clone()) + }, + texture_path: None, + thumbnail_key: subasset_thumbnail_key( + parent_path, + AssetSubAssetKind::Mesh, + &part_effective_id(part), + ), + mesh_label: Some(part.mesh_label.clone()), + material_label, + requires_skinned_hierarchy, + }); + } + + let mut material_ids = HashSet::new(); + for part in &manifest.parts { + let Some(material_id) = part_effective_material_id(part) else { + continue; + }; + if !material_ids.insert(material_id.clone()) { + continue; + } + let label = if part.material_slot_name.trim().is_empty() { + part.material_label + .clone() + .unwrap_or_else(|| "Source Material".to_string()) + } else { + part.material_slot_name.clone() + }; + let source_used = manifest.parts.iter().any(|candidate| { + part_effective_material_id(candidate).as_deref() == Some(material_id.as_str()) + && matches!( + crate::assets::static_mesh::material_selection( + settings, + &format!("slot:{}", part_effective_id(candidate)), + ), + ModelMaterialSelection::Source + ) + }); + embedded.push(EmbeddedAsset { + selection: AssetSelection::SubAsset { + parent_path: parent_path.clone(), + sub_asset_id: material_id, + label: label.clone(), + kind: AssetSubAssetKind::Material, + source_path: None, + }, + label, + kind: AssetSubAssetKind::Material, + detail: if source_used { + "Embedded source material · active model default".to_string() + } else { + "Embedded source material · available".to_string() + }, + texture_path: None, + thumbnail_key: subasset_thumbnail_key( + parent_path, + AssetSubAssetKind::Material, + &part_effective_material_id(part).unwrap_or_else(|| { + material_id_from_label( + part.material_label + .as_deref() + .unwrap_or(&part.material_slot_name), + ) + }), + ), + mesh_label: None, + material_label: part.material_label.clone(), + requires_skinned_hierarchy: false, + }); + } + + let mut texture_paths = HashSet::new(); + for dependency in &manifest.source.dependencies { + if !is_texture_path(dependency) || !texture_paths.insert(dependency.clone()) { + continue; + } + let label = Path::new(dependency) + .file_stem() + .and_then(|stem| stem.to_str()) + .unwrap_or(dependency) + .to_string(); + embedded.push(EmbeddedAsset { + selection: AssetSelection::SubAsset { + parent_path: parent_path.clone(), + sub_asset_id: format!("texture:{}", stable_subasset_slug(dependency)), + label: label.clone(), + kind: AssetSubAssetKind::Texture, + source_path: Some(dependency.clone()), + }, + label, + kind: AssetSubAssetKind::Texture, + detail: dependency.clone(), + texture_path: Some(dependency.clone()), + thumbnail_key: subasset_thumbnail_key( + parent_path, + AssetSubAssetKind::Texture, + &stable_subasset_slug(dependency), + ), + mesh_label: None, + material_label: None, + requires_skinned_hierarchy: false, + }); + } + } + + let animation_manifest = settings + .animation_manifest_path + .as_deref() + .and_then(|path| load_animation_manifest(path).ok()); + if let Some(manifest) = animation_manifest { + for skeleton in manifest.skeletons { + let signature = skeleton.signature.0; + let signature_short = signature.get(..8).unwrap_or(&signature); + embedded.push(EmbeddedAsset { + selection: AssetSelection::SubAsset { + parent_path: parent_path.clone(), + sub_asset_id: skeleton.id.clone(), + label: skeleton.label.clone(), + kind: AssetSubAssetKind::Skeleton, + source_path: Some(parent_path.clone()), + }, + label: skeleton.label, + kind: AssetSubAssetKind::Skeleton, + detail: format!( + "{} joints | rig {}", + skeleton.joint_paths.len(), + signature_short + ), + texture_path: None, + thumbnail_key: subasset_thumbnail_key( + parent_path, + AssetSubAssetKind::Skeleton, + &skeleton.id, + ), + mesh_label: None, + material_label: None, + requires_skinned_hierarchy: false, + }); + } + for clip in manifest.clips { + let event_suffix = if clip.events.is_empty() { + String::new() + } else { + format!(" | {} events", clip.events.len()) + }; + embedded.push(EmbeddedAsset { + selection: AssetSelection::SubAsset { + parent_path: parent_path.clone(), + sub_asset_id: clip.id.clone(), + label: clip.label.clone(), + kind: AssetSubAssetKind::AnimationClip, + source_path: Some(parent_path.clone()), + }, + label: clip.label, + kind: AssetSubAssetKind::AnimationClip, + detail: format!("{:.2}s{event_suffix}", clip.duration_seconds), + texture_path: None, + thumbnail_key: subasset_thumbnail_key( + parent_path, + AssetSubAssetKind::AnimationClip, + &clip.id, + ), + mesh_label: None, + material_label: None, + requires_skinned_hierarchy: false, + }); + } + } + + embedded +} + +pub(super) fn texture_asset_from_subasset_selection( + world: &World, + selection: &Option, +) -> Option { + let Some(AssetSelection::SubAsset { + label, + kind: AssetSubAssetKind::Texture, + source_path: Some(path), + .. + }) = selection + else { + return None; + }; + if let Some(asset) = world + .resource::() + .assets + .iter() + .find(|asset| asset.path.as_deref() == Some(path.as_str())) + { + return Some(asset.clone()); + } + Some(EditorAsset { + label: label.clone(), + path: Some(path.clone()), + folder_path: Path::new(path) + .parent() + .map(|parent| parent.to_string_lossy().replace('\\', "/")) + .unwrap_or_else(|| ASSETS_ROOT.to_string()), + kind: EditorAssetKind::Texture, + }) +} + +pub(super) fn model_uses_source_materials(record: &crate::asset_db::AssetRecord) -> bool { + let settings = record.model_import(); + let Some(manifest_path) = settings.static_mesh_manifest_path.as_deref() else { + return true; + }; + let Ok(manifest) = load_static_mesh_manifest(manifest_path) else { + return true; + }; + manifest.parts.iter().any(|part| { + part_effective_material_id(part).is_some() + && matches!( + crate::assets::static_mesh::material_selection( + settings, + &format!("slot:{}", part_effective_id(part)), + ), + ModelMaterialSelection::Source + ) + }) +} + +pub(super) fn embedded_asset_for_selection( + world: &World, + selection: &AssetSelection, +) -> Option { + let AssetSelection::SubAsset { parent_path, .. } = selection else { + return None; + }; + let asset = world + .resource::() + .assets + .iter() + .find(|asset| asset.path.as_deref() == Some(parent_path.as_str()))? + .clone(); + embedded_assets_for_asset(world, &asset) + .into_iter() + .find(|embedded| &embedded.selection == selection) +} + +pub(super) fn has_embedded_assets(world: &World, asset: &EditorAsset) -> bool { + !embedded_assets_for_asset(world, asset).is_empty() +} + +pub(super) fn part_effective_id(part: &crate::assets::static_mesh::StaticMeshPart) -> String { + if part.id.trim().is_empty() { + part_id_from_label(&part.mesh_label) + } else { + part.id.clone() + } +} + +pub(super) fn part_effective_material_id( + part: &crate::assets::static_mesh::StaticMeshPart, +) -> Option { + part.material_id.clone().or_else(|| { + part.material_label + .as_ref() + .map(|label| material_id_from_label(label)) + }) +} + +pub(super) fn is_texture_path(path: &str) -> bool { + Path::new(path) + .extension() + .and_then(|extension| extension.to_str()) + .is_some_and(|extension| { + matches!( + extension.to_ascii_lowercase().as_str(), + "png" | "jpg" | "jpeg" | "webp" | "ktx2" + ) + }) +} + +pub(super) fn stable_subasset_slug(label: &str) -> String { + let mut slug = String::new(); + for ch in label.chars() { + if ch.is_ascii_alphanumeric() { + slug.push(ch.to_ascii_lowercase()); + } else if !slug.ends_with('_') { + slug.push('_'); + } + } + slug.trim_matches('_').to_string() +} + +pub(super) fn subasset_thumbnail_key( + parent_path: &str, + kind: AssetSubAssetKind, + sub_asset_id: &str, +) -> String { + format!( + "subasset:{}#{}:{}", + parent_path, + subasset_kind_label(kind).to_ascii_lowercase(), + sub_asset_id + ) +} diff --git a/crates/editor/src/ui/asset_browser/panel/file_operations.rs b/crates/editor/src/ui/asset_browser/panel/file_operations.rs new file mode 100644 index 0000000..aa5af2e --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/file_operations.rs @@ -0,0 +1,544 @@ +use super::*; + +pub(super) fn begin_new_folder(world: &mut World, parent: String) { + world + .resource_mut::() + .pending_path_edit = Some(ContentPathEdit { + kind: ContentPathEditKind::NewFolder { parent }, + name: "New Folder".into(), + }); +} + +pub(super) fn create_material_here(world: &mut World, folder: &str) { + if let Err(error) = + crate::ui::material_library::create_material_asset_in(world, Path::new(folder)) + { + world.resource_mut::().status = error; + } +} + +pub(super) fn begin_rename(world: &mut World) { + if world.resource::().selections.len() > 1 { + world.resource_mut::().status = "Rename requires one selected item".into(); + return; + } + let Some(source) = selected_content_path(world) else { + world.resource_mut::().status = "Select an asset or folder to rename".into(); + return; + }; + let name = Path::new(&source) + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or("Asset") + .to_string(); + world + .resource_mut::() + .pending_path_edit = Some(ContentPathEdit { + kind: ContentPathEditKind::Rename { source }, + name, + }); +} + +pub(super) fn set_content_clipboard(world: &mut World, cut: bool) { + let sources = selected_content_paths(world); + if sources.is_empty() { + world.resource_mut::().status = "Select an asset or folder first".into(); + return; + } + world.resource_mut::().clipboard = Some(ContentClipboard { + sources: sources.clone(), + cut, + }); + world.resource_mut::().status = format!( + "{} {} item(s)", + if cut { "Cut" } else { "Copied" }, + sources.len() + ); +} + +pub(super) fn duplicate_selection(world: &mut World) { + let sources = selected_content_paths(world); + if sources.is_empty() { + world.resource_mut::().status = "Select an asset or folder to duplicate".into(); + return; + } + let operations = sources + .into_iter() + .map(|source| { + let source_path = Path::new(&source); + let parent = source_path + .parent() + .unwrap_or_else(|| Path::new(ASSETS_ROOT)); + content_pipeline::ContentOperation::Copy { + source: source.clone().into(), + destination: unique_copy_destination(parent, source_path), + } + }) + .collect(); + queue_content_operations(world, operations, false, false); +} + +pub(super) fn paste_content_clipboard(world: &mut World) { + let destination_folder = world.resource::().current_folder.clone(); + paste_content_clipboard_into(world, &destination_folder); +} + +pub(super) fn paste_content_clipboard_into(world: &mut World, destination_folder: &str) { + let Some(clipboard) = world.resource::().clipboard.clone() else { + return; + }; + let mut reserved = HashSet::new(); + let operations: Vec<_> = clipboard + .sources + .iter() + .filter_map(|source| { + let source_path = Path::new(source); + if clipboard.cut && source_path.parent() == Some(Path::new(destination_folder)) { + return None; + } + let destination = paste_destination( + Path::new(destination_folder), + source_path, + clipboard.cut, + &mut reserved, + ); + Some(if clipboard.cut { + content_pipeline::ContentOperation::Move { + source: source.clone().into(), + destination, + } + } else { + content_pipeline::ContentOperation::Copy { + source: source.clone().into(), + destination, + } + }) + }) + .collect(); + if operations.is_empty() { + world.resource_mut::().status = "Content is already in this folder".into(); + return; + } + queue_content_operations(world, operations, clipboard.cut, false); +} + +pub(super) fn paste_destination( + parent: &Path, + source: &Path, + cut: bool, + reserved: &mut HashSet, +) -> PathBuf { + let direct = parent.join(source.file_name().unwrap_or_default()); + if cut { + // Moves keep their intended filename. Existing or duplicate targets must remain visible as + // review collisions instead of silently turning a move into a renamed copy. + return direct; + } + if !direct.exists() && reserved.insert(direct.clone()) { + return direct; + } + let mut candidate = unique_copy_destination(parent, source); + while !reserved.insert(candidate.clone()) { + candidate = unique_copy_destination(parent, &candidate); + } + candidate +} + +pub(super) fn unique_copy_destination(parent: &Path, source: &Path) -> PathBuf { + let name = source + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or("Asset"); + let (stem, suffix) = name + .split_once('.') + .map_or((name, ""), |(stem, suffix)| (stem, suffix)); + for index in 1.. { + let marker = if index == 1 { + "_copy".into() + } else { + format!("_copy_{index}") + }; + let candidate_name = if suffix.is_empty() { + format!("{stem}{marker}") + } else { + format!("{stem}{marker}.{suffix}") + }; + let candidate = parent.join(candidate_name); + if !candidate.exists() { + return candidate; + } + } + unreachable!() +} + +pub(super) fn draw_path_edit_modal(world: &mut World, ctx: &egui::Context) { + let Some(mut edit) = world + .resource::() + .pending_path_edit + .clone() + else { + return; + }; + let title = match edit.kind { + ContentPathEditKind::Rename { .. } => "Rename Content", + ContentPathEditKind::NewFolder { .. } => "Create Folder", + }; + let mut apply = false; + let mut cancel = false; + egui::Window::new(title) + .collapsible(false) + .resizable(false) + .show(ctx, |ui| { + ui.label("Name"); + let response = ui.add_sized([300.0, 24.0], egui::TextEdit::singleline(&mut edit.name)); + let valid = valid_content_name(&edit.name); + if !valid { + ui.colored_label( + crate::ui::theme::ERROR, + "Use a normal file/folder name without slashes.", + ); + } + ui.horizontal(|ui| { + apply = ui.add_enabled(valid, egui::Button::new("Apply")).clicked() + || (valid + && response.lost_focus() + && ui.input(|input| input.key_pressed(egui::Key::Enter))); + cancel = ui.button("Cancel").clicked(); + }); + }); + if cancel { + world + .resource_mut::() + .pending_path_edit = None; + } else if apply { + let operation = match &edit.kind { + ContentPathEditKind::Rename { source } => { + let source_path = Path::new(source); + let destination = source_path + .parent() + .unwrap_or_else(|| Path::new(ASSETS_ROOT)) + .join(&edit.name); + content_pipeline::ContentOperation::Move { + source: source.into(), + destination, + } + } + ContentPathEditKind::NewFolder { parent } => { + content_pipeline::ContentOperation::CreateFolder { + path: Path::new(parent).join(&edit.name), + } + } + }; + if queue_content_operations(world, vec![operation], false, false) { + world + .resource_mut::() + .pending_path_edit = None; + } + } else { + world + .resource_mut::() + .pending_path_edit = Some(edit); + } +} + +pub(super) fn valid_content_name(name: &str) -> bool { + let trimmed = name.trim(); + !trimmed.is_empty() + && !matches!(trimmed, "." | "..") + && !trimmed.contains(['/', '\\']) + && !trimmed.starts_with('.') +} + +pub(super) fn queue_content_operations( + world: &mut World, + operations: Vec, + clear_cut_clipboard: bool, + clear_drag: bool, +) -> bool { + if operations.is_empty() { + return false; + } + let document = world + .resource::() + .document(); + let preview = match content_pipeline::preview_transaction(Path::new("."), operations, &document) + { + Ok(preview) => preview, + Err(error) => { + world.resource_mut::().status = + format!("Content operation preview failed: {error}"); + return false; + } + }; + let operation_count = preview.operations.len(); + let affected_count = preview.affected_asset_ids.len(); + let rewrite_count = preview.reference_rewrites.len(); + let mut guarded_paths = HashSet::new(); + for operation in &preview.operations { + if let content_pipeline::ContentOperation::Move { source, .. } + | content_pipeline::ContentOperation::Copy { source, .. } = operation + { + guarded_paths.insert(source.clone()); + } + } + guarded_paths.extend( + preview + .reference_rewrites + .iter() + .map(|rewrite| rewrite.document.clone()), + ); + let mut guarded_paths = guarded_paths + .into_iter() + .map(|path| { + content_pipeline::tree_fingerprint(&path).map(|fingerprint| (path, fingerprint)) + }) + .collect::, _>>() + .map_err(|error| { + world.resource_mut::().status = + format!("Content operation guard failed: {error}"); + }); + let Ok(ref mut guarded_paths) = guarded_paths else { + return false; + }; + guarded_paths.sort_by(|left, right| left.0.cmp(&right.0)); + let browser_snapshot = capture_content_browser_snapshot(world); + world + .resource_mut::() + .pending_content_transaction = Some(PendingContentTransaction { + preview, + guarded_paths: std::mem::take(guarded_paths), + clear_cut_clipboard, + clear_drag, + browser_snapshot, + }); + world.resource_mut::().status = format!( + "Review {operation_count} content operation(s): {affected_count} asset ID(s), {rewrite_count} cached reference rewrite(s)" + ); + true +} + +pub(super) fn draw_content_transaction_modal(world: &mut World, ctx: &egui::Context) { + let Some(pending) = world + .resource::() + .pending_content_transaction + .clone() + else { + return; + }; + let mut cancel = false; + let mut commit = false; + let collaboration_statuses = + content_transaction_collaboration_statuses(world, &pending.preview); + let has_collaboration_blocker = collaboration_statuses + .iter() + .any(|(_, _, _, blocked)| *blocked); + let externally_changed = pending + .guarded_paths + .iter() + .filter(|(path, expected)| { + content_pipeline::tree_fingerprint(path).as_deref() != Ok(expected.as_str()) + }) + .map(|(path, _)| path.clone()) + .collect::>(); + egui::Window::new("Review Content Operation") + .collapsible(false) + .resizable(true) + .default_width(660.0) + .min_width(520.0) + .show(ctx, |ui| { + ui.small( + egui::RichText::new( + "Filesystem paths, registry identity, generated catalog entries, and cached project references commit together or roll back together.", + ) + .color(TEXT_DIM), + ); + ui.separator(); + egui::ScrollArea::vertical() + .max_height(260.0) + .show(ui, |ui| { + for operation in &pending.preview.operations { + ui.label(content_operation_summary(operation)); + } + }); + ui.separator(); + ui.label(format!( + "Affected registered assets: {}", + pending.preview.affected_asset_ids.len() + )); + ui.label(format!( + "Cached reference documents to rewrite: {}", + pending.preview.reference_rewrites.len() + )); + for rewrite in pending.preview.reference_rewrites.iter().take(8) { + ui.small(format!( + "{}: {} → {}", + rewrite.document.display(), + rewrite.from, + rewrite.to + )); + } + if pending.preview.reference_rewrites.len() > 8 { + ui.small(format!( + "…and {} more", + pending.preview.reference_rewrites.len() - 8 + )); + } + if !pending.preview.collisions.is_empty() { + ui.separator(); + ui.colored_label(ERROR, "Resolve these path collisions before committing:"); + for collision in &pending.preview.collisions { + ui.small(collision.display().to_string()); + } + } + if !collaboration_statuses.is_empty() { + ui.separator(); + ui.label("Source-control / ownership state"); + for (path, label, tooltip, blocked) in &collaboration_statuses { + ui.horizontal(|ui| { + ui.small(path.display().to_string()); + ui.colored_label(if *blocked { ERROR } else { WARNING }, label) + .on_hover_text(tooltip); + }); + } + } + if !externally_changed.is_empty() { + ui.separator(); + ui.colored_label( + ERROR, + "Content changed after this preview. Cancel and review the operation again:", + ); + for path in &externally_changed { + ui.small(path.display().to_string()); + } + } + ui.separator(); + ui.horizontal(|ui| { + cancel = ui.button("Cancel").clicked(); + commit = ui + .add_enabled( + pending.preview.is_committable() + && !has_collaboration_blocker + && externally_changed.is_empty(), + egui::Button::new("Commit Transaction"), + ) + .clicked(); + }); + }); + + if cancel { + restore_cancelled_content_transaction(world, &pending); + world + .resource_mut::() + .pending_content_transaction = None; + } else if commit { + let operations = pending.preview.operations.clone(); + if commit_content_operations_internal(world, operations, true) { + if pending.clear_cut_clipboard { + world.resource_mut::().clipboard = None; + } + if pending.clear_drag { + world.resource_mut::().clear_drag(); + } + world + .resource_mut::() + .pending_content_transaction = None; + } + } +} + +pub(super) fn capture_content_browser_snapshot(world: &World) -> ContentBrowserSnapshot { + let assets = world.resource::(); + ContentBrowserSnapshot { + current_folder: assets.current_folder.clone(), + selected: assets.selected.clone(), + selections: assets.selections.clone(), + selection_anchor: assets.selection_anchor.clone(), + dragging: assets.dragging.clone(), + asset_status: assets.status.clone(), + scene_status: world.resource::().status.clone(), + } +} + +pub(super) fn restore_cancelled_content_transaction( + world: &mut World, + pending: &PendingContentTransaction, +) { + let snapshot = &pending.browser_snapshot; + { + let mut assets = world.resource_mut::(); + assets.current_folder.clone_from(&snapshot.current_folder); + assets.selected.clone_from(&snapshot.selected); + assets.selections.clone_from(&snapshot.selections); + assets + .selection_anchor + .clone_from(&snapshot.selection_anchor); + assets.dragging = if pending.clear_drag { + None + } else { + snapshot.dragging.clone() + }; + assets.status.clone_from(&snapshot.asset_status); + } + world + .resource_mut::() + .status + .clone_from(&snapshot.scene_status); +} + +pub(super) fn content_transaction_collaboration_statuses( + world: &World, + preview: &content_pipeline::ContentTransactionPreview, +) -> Vec<(PathBuf, String, String, bool)> { + let Some(collaboration) = world.get_resource::() else { + return Vec::new(); + }; + let mut paths = HashSet::new(); + for operation in &preview.operations { + if let content_pipeline::ContentOperation::Move { source, .. } + | content_pipeline::ContentOperation::Copy { source, .. } = operation + { + paths.insert(source.clone()); + } + } + paths.extend( + preview + .reference_rewrites + .iter() + .map(|rewrite| rewrite.document.clone()), + ); + let mut statuses = paths + .into_iter() + .filter_map(|path| { + let status = collaboration.file_status(&path); + let indicator = status.indicator()?; + let label = indicator.label.to_string(); + let blocked = status.readonly || status.locked_by_other || label == "CONFLICT"; + let tooltip = status.tooltip(&path); + Some((path, label, tooltip, blocked)) + }) + .collect::>(); + statuses.sort_by(|left, right| left.0.cmp(&right.0)); + statuses +} + +pub(super) fn content_operation_summary(operation: &content_pipeline::ContentOperation) -> String { + match operation { + content_pipeline::ContentOperation::CreateFolder { path } => { + format!("Create folder {}", path.display()) + } + content_pipeline::ContentOperation::Move { + source, + destination, + } => format!("Move {} → {}", source.display(), destination.display()), + content_pipeline::ContentOperation::Copy { + source, + destination, + } => format!("Copy {} → {}", source.display(), destination.display()), + content_pipeline::ContentOperation::WriteFile { path, bytes } => { + format!("Create asset {} ({} bytes)", path.display(), bytes.len()) + } + content_pipeline::ContentOperation::ReplaceFile { path, bytes, .. } => { + format!("Replace asset {} ({} bytes)", path.display(), bytes.len()) + } + } +} diff --git a/crates/editor/src/ui/asset_browser/panel/grid.rs b/crates/editor/src/ui/asset_browser/panel/grid.rs new file mode 100644 index 0000000..7dce05e --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/grid.rs @@ -0,0 +1,567 @@ +use super::*; + +pub(super) fn content_empty_space( + world: &mut World, + response: egui::Response, + current_folder: &str, + visible_order: &[AssetSelection], +) { + if response.clicked() || response.secondary_clicked() { + world.resource_mut::().clear_selection(); + } + response.context_menu(|ui| { + empty_space_context_menu(world, ui, current_folder, visible_order); + }); +} + +#[expect( + clippy::too_many_arguments, + reason = "asset grid rendering keeps immediate-mode UI inputs explicit" +)] +pub(super) fn asset_grid( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + selected: &Option, + folders: &[FolderSnapshot], + assets: &[AssetRow], + cache_snapshot: &ThumbnailCacheSnapshot, + thumbnail_size: f32, + visible_order: &[AssetSelection], +) { + let thumb_size = thumbnail_size.clamp(48.0, 112.0); + let cell_width = thumb_size + 20.0; + let gap = 6.0; + let columns = ((ui.available_width() + gap) / (cell_width + gap)) + .floor() + .max(1.0) as usize; + + for folder_row in folders.chunks(columns) { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing = egui::vec2(gap, gap); + for folder in folder_row { + let selection = AssetSelection::Folder(folder.path.clone()); + let is_selected = world.resource::().is_selected(&selection); + let response = draw_folder_cell(ui, folder, thumbnail_size, is_selected); + handle_asset_drop_to_folder(world, ui, &response, &folder.path); + if response.secondary_clicked() { + prepare_context_menu_selection(world, selection.clone()); + } + if response.double_clicked() { + navigate_content_folder(world, folder.path.clone()); + } else if response.clicked() { + apply_content_click_selection(world, ui, selection.clone(), visible_order); + } + if response.drag_started() { + world + .resource_mut::() + .start_drag(selection.clone()); + } + response.context_menu(|ui| folder_context_menu(world, ui, folder)); + } + }); + } + + for asset_row in assets.chunks(columns) { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing = egui::vec2(gap, gap); + for row in asset_row { + draw_asset_grid_item( + world, + ui, + selected_entities, + selected, + row, + cache_snapshot, + thumbnail_size, + visible_order, + ); + } + }); + + for row in asset_row { + if row.asset.path.as_deref().is_some_and(|path| { + world + .resource::() + .expanded_assets + .contains(path) + }) { + embedded_asset_shelf( + world, + ui, + selected_entities, + selected, + &row.asset, + cache_snapshot, + thumbnail_size, + ); + } + } + } +} + +pub(super) fn handle_asset_drop_to_folder( + world: &mut World, + ui: &egui::Ui, + response: &egui::Response, + destination_folder: &str, +) { + if !response.hovered() || !ui.input(|input| input.pointer.any_released()) { + return; + } + let dragging = world + .resource::() + .dragging_selection() + .cloned(); + let Some(dragging) = dragging else { + return; + }; + let sources = if world.resource::().is_selected(&dragging) { + selected_content_paths(world) + } else { + dragging + .parent_path() + .map(|path| vec![path.to_string()]) + .unwrap_or_default() + }; + let operations: Vec<_> = sources + .into_iter() + .filter_map(|source| { + let file_name = Path::new(&source).file_name()?; + let destination = Path::new(destination_folder).join(file_name); + (destination.as_path() != Path::new(&source)).then_some( + content_pipeline::ContentOperation::Move { + source: PathBuf::from(source), + destination, + }, + ) + }) + .collect(); + if !operations.is_empty() { + queue_content_operations(world, operations, false, true); + } +} + +#[expect( + clippy::too_many_arguments, + reason = "asset rows keep selection, thumbnail, and visible-order UI inputs explicit" +)] +pub(super) fn draw_asset_grid_item( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + _selected: &Option, + row: &AssetRow, + cache_snapshot: &ThumbnailCacheSnapshot, + thumbnail_size: f32, + visible_order: &[AssetSelection], +) { + let selection = &row.selection; + let asset = &row.asset; + let is_selected = world.resource::().is_selected(selection); + let failure = cache_snapshot.failure_reason(asset); + let has_children = has_embedded_assets(world, asset); + let document_status = asset.path.as_deref().and_then(|path| { + world + .get_resource::() + .and_then(|store| store.snapshot_for_path(path)) + }); + let response = draw_asset_card( + ui, + asset, + cache_snapshot.texture_for(asset), + cache_snapshot.is_pending(asset), + failure, + is_selected, + thumbnail_size, + AssetCardStatus::for_document( + document_status.as_ref(), + document_status.as_ref().is_some_and(|status| status.dirty), + failure.is_some(), + ), + ); + + if has_children { + let expanded = asset.path.as_deref().is_some_and(|path| { + world + .resource::() + .expanded_assets + .contains(path) + }); + let icon = if expanded { + icons::CARET_DOWN + } else { + icons::CARET_RIGHT + }; + let button_rect = egui::Rect::from_min_size( + response.rect.min + egui::vec2(6.0, 6.0), + egui::vec2(18.0, 18.0), + ); + let expand_response = ui.interact( + button_rect, + egui::Id::new(( + "asset_expand", + asset.path.as_deref().unwrap_or(&asset.label), + )), + egui::Sense::click(), + ); + ui.painter().rect( + button_rect, + 3.0, + if expand_response.hovered() { + ELEVATED_BG + } else { + WIDGET_BG.linear_multiply(1.15) + }, + egui::Stroke::new(1.0_f32, BORDER), + egui::StrokeKind::Inside, + ); + ui.painter().text( + button_rect.center(), + egui::Align2::CENTER_CENTER, + icon.as_str(), + egui::FontId::new(11.0, egui::FontFamily::Name(PHOSPHOR.into())), + TEXT, + ); + if expand_response.clicked() { + if let Some(path) = asset.path.as_ref() { + toggle_asset_expanded(world, path); + } + } + } + + if response.double_clicked() { + if failure.is_some() { + let key = crate::assets::asset_cache_key(asset); + crate::assets::retry_thumbnail(world, &key); + } else { + activate_content_asset(world, asset); + } + } else if response.clicked() { + apply_content_click_selection(world, ui, selection.clone(), visible_order); + } + if response.drag_started() { + world + .resource_mut::() + .start_drag(selection.clone()); + } + if response.secondary_clicked() { + prepare_context_menu_selection(world, selection.clone()); + } + response.context_menu(|ui| { + asset_context_menu(world, ui, asset, selected_entities); + }); +} + +pub(super) fn embedded_asset_shelf( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + selected: &Option, + parent_asset: &EditorAsset, + cache_snapshot: &ThumbnailCacheSnapshot, + thumbnail_size: f32, +) { + let embedded = embedded_assets_for_asset(world, parent_asset); + if embedded.is_empty() { + return; + } + prefetch_embedded_thumbnails(world, parent_asset, &embedded); + let parent_texture = cache_snapshot.texture_for(parent_asset); + + ui.add_space(4.0); + egui::Frame::new() + .fill(WIDGET_BG.linear_multiply(0.72)) + .stroke(egui::Stroke::new(1.0_f32, BORDER.linear_multiply(0.85))) + .corner_radius(egui::CornerRadius::same(4)) + .inner_margin(egui::Margin::symmetric(8, 5)) + .show(ui, |ui| { + ui.set_min_width(ui.available_width()); + ui.horizontal(|ui| { + ui.label(icon_text(icons::TREE_STRUCTURE, 13.0).color(TEXT_DIM)); + ui.small( + egui::RichText::new(format!("{} contents", parent_asset.label)).color(TEXT_DIM), + ); + }); + egui::ScrollArea::horizontal() + .id_salt(format!( + "embedded_shelf_{}", + parent_asset.path.as_deref().unwrap_or(&parent_asset.label) + )) + .max_height(thumbnail_size.clamp(48.0, 88.0) + 56.0) + .auto_shrink([false, true]) + .show(ui, |ui| { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing = egui::vec2(7.0, 5.0); + for embedded_asset in &embedded { + draw_embedded_asset_cell( + world, + ui, + selected_entities, + selected, + embedded_asset, + cache_snapshot, + parent_texture, + thumbnail_size, + ); + } + }); + }); + }); + ui.add_space(4.0); +} + +pub(super) fn prefetch_embedded_thumbnails( + world: &mut World, + parent_asset: &EditorAsset, + embedded: &[EmbeddedAsset], +) { + let Some(parent_path) = parent_asset.path.clone() else { + return; + }; + let asset_server = world.resource::().clone(); + let requests: Vec = embedded.to_vec(); + world.resource_scope(|world, mut cache: Mut| { + world.resource_scope(|_world, mut studio: Mut| { + for embedded_asset in &requests { + match embedded_asset.kind { + AssetSubAssetKind::Mesh => { + let Some(mesh_label) = embedded_asset.mesh_label.clone() else { + continue; + }; + cache.request_mesh_subasset( + embedded_asset.thumbnail_key.clone(), + parent_path.clone(), + mesh_label, + embedded_asset.material_label.clone(), + embedded_asset.requires_skinned_hierarchy, + &mut studio, + ); + } + AssetSubAssetKind::Material => { + let Some(material_label) = embedded_asset.material_label.clone() else { + continue; + }; + cache.request_source_material( + embedded_asset.thumbnail_key.clone(), + parent_path.clone(), + material_label, + &mut studio, + ); + } + AssetSubAssetKind::Texture => { + let Some(texture_path) = embedded_asset.texture_path.clone() else { + continue; + }; + cache.request_texture( + embedded_asset.thumbnail_key.clone(), + texture_path, + &asset_server, + ); + } + AssetSubAssetKind::Skeleton | AssetSubAssetKind::AnimationClip => {} + } + } + }); + }); +} + +#[expect( + clippy::too_many_arguments, + reason = "embedded asset rendering keeps immediate-mode UI inputs explicit" +)] +pub(super) fn draw_embedded_asset_cell( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + selected: &Option, + embedded: &EmbeddedAsset, + cache_snapshot: &ThumbnailCacheSnapshot, + _parent_texture: Option, + thumbnail_size: f32, +) { + let selected = selected.as_ref() == Some(&embedded.selection); + let texture_id = cache_snapshot + .texture_for_key(&embedded.thumbnail_key) + .or_else(|| { + embedded + .texture_path + .as_deref() + .and_then(|path| thumbnail_for_path(world, cache_snapshot, path)) + }); + let pending = cache_snapshot.is_pending_key(&embedded.thumbnail_key); + let failure = cache_snapshot.failure_reason_for_key(&embedded.thumbnail_key); + let failed = failure.is_some(); + let thumb_size = thumbnail_size.clamp(44.0, 64.0); + let cell_size = egui::vec2(104.0, thumb_size + 50.0); + let (rect, response) = ui.allocate_exact_size(cell_size, egui::Sense::click_and_drag()); + let response = if embedded.requires_skinned_hierarchy { + response.on_hover_text( + "Skinned primitives place through the dedicated renderer so their joint hierarchy remains intact.", + ) + } else { + response + }; + let response = if let Some(reason) = failure { + response.on_hover_text(reason) + } else { + response + }; + let fill = if selected { + crate::ui::theme::SELECTION_BG_MUTED + } else if response.hovered() { + WIDGET_BG.linear_multiply(1.2) + } else { + WIDGET_BG + }; + ui.painter().rect( + rect, + 4.0, + fill, + egui::Stroke::new(1.0_f32, if selected { ACCENT } else { BORDER }), + egui::StrokeKind::Inside, + ); + let thumb_rect = egui::Rect::from_min_size( + egui::pos2(rect.center().x - thumb_size * 0.5, rect.min.y + 8.0), + egui::vec2(thumb_size, thumb_size), + ); + if let Some(texture_id) = texture_id { + ui.painter().image( + texture_id, + thumb_rect, + egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)), + egui::Color32::WHITE, + ); + } else { + ui.painter().rect( + thumb_rect, + 4.0, + ELEVATED_BG.linear_multiply(0.6), + egui::Stroke::new(1.0_f32, BORDER), + egui::StrokeKind::Inside, + ); + let icon = if pending { + icons::CIRCLE_NOTCH + } else if failed { + icons::WARNING_CIRCLE + } else { + subasset_icon(embedded.kind) + }; + ui.painter().text( + thumb_rect.center(), + egui::Align2::CENTER_CENTER, + icon.as_str(), + egui::FontId::new(24.0, egui::FontFamily::Name(PHOSPHOR.into())), + TEXT, + ); + } + + let label = compact_subasset_label(embedded); + let detail = compact_text(&embedded.detail, 18); + let label_pos = egui::pos2(rect.center().x, thumb_rect.max.y + 7.0); + ui.painter().text( + label_pos, + egui::Align2::CENTER_TOP, + label.as_str(), + egui::FontId::new(12.0, egui::FontFamily::Proportional), + if selected { + crate::ui::theme::TEXT_SELECTED + } else { + TEXT + }, + ); + ui.painter().text( + label_pos + egui::vec2(0.0, 17.0), + egui::Align2::CENTER_TOP, + format!("{} | {}", subasset_kind_label(embedded.kind), detail), + egui::FontId::new(10.0, egui::FontFamily::Proportional), + TEXT_DIM, + ); + + if response.clicked() { + world + .resource_mut::() + .select(embedded.selection.clone()); + } + if response.secondary_clicked() { + prepare_context_menu_selection(world, embedded.selection.clone()); + } + if response.drag_started() && embedded.kind != AssetSubAssetKind::Skeleton { + world + .resource_mut::() + .start_drag(embedded.selection.clone()); + } + response.context_menu(|ui| { + subasset_context_menu(world, ui, embedded, selected_entities); + }); +} + +pub(super) fn compact_subasset_label(embedded: &EmbeddedAsset) -> String { + let base = match embedded.kind { + AssetSubAssetKind::Mesh => embedded + .label + .split_once(" / ") + .map(|(head, _)| head) + .unwrap_or(&embedded.label), + AssetSubAssetKind::Material + | AssetSubAssetKind::Texture + | AssetSubAssetKind::Skeleton + | AssetSubAssetKind::AnimationClip => embedded.label.as_str(), + }; + compact_text(base, 16) +} + +pub(super) fn compact_text(text: &str, max_chars: usize) -> String { + let mut chars = text.chars(); + let mut compact = String::new(); + for _ in 0..max_chars { + let Some(ch) = chars.next() else { + return text.to_string(); + }; + compact.push(ch); + } + if chars.next().is_some() { + compact.push_str("..."); + } + compact +} + +pub(super) fn thumbnail_for_path( + world: &World, + cache_snapshot: &ThumbnailCacheSnapshot, + path: &str, +) -> Option { + let assets = world.resource::(); + assets + .assets + .iter() + .find(|asset| asset.path.as_deref() == Some(path)) + .and_then(|asset| cache_snapshot.texture_for(asset)) +} + +pub(super) fn toggle_asset_expanded(world: &mut World, path: &str) { + let mut state = world.resource_mut::(); + if !state.expanded_assets.insert(path.to_string()) { + state.expanded_assets.remove(path); + } +} + +pub(super) fn subasset_icon(kind: AssetSubAssetKind) -> Icon { + match kind { + AssetSubAssetKind::Mesh => icons::CUBE, + AssetSubAssetKind::Material => icons::PALETTE, + AssetSubAssetKind::Texture => icons::IMAGE, + AssetSubAssetKind::Skeleton => icons::BONE, + AssetSubAssetKind::AnimationClip => icons::FILM_STRIP, + } +} + +pub(super) fn subasset_kind_label(kind: AssetSubAssetKind) -> &'static str { + match kind { + AssetSubAssetKind::Mesh => "Mesh", + AssetSubAssetKind::Material => "Material", + AssetSubAssetKind::Texture => "Texture", + AssetSubAssetKind::Skeleton => "Skeleton", + AssetSubAssetKind::AnimationClip => "Animation Clip", + } +} diff --git a/crates/editor/src/ui/asset_browser/panel/import_settings.rs b/crates/editor/src/ui/asset_browser/panel/import_settings.rs new file mode 100644 index 0000000..8542e7d --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/import_settings.rs @@ -0,0 +1,566 @@ +use super::*; + +pub(super) fn import_settings_editor( + world: &mut World, + ui: &mut egui::Ui, + _asset: &EditorAsset, + path: &str, + current: &ImportSettings, +) { + let material_slots = current + .static_mesh_manifest_path + .as_deref() + .and_then(|manifest_path| load_static_mesh_manifest(manifest_path).ok()) + .map(|manifest| { + manifest + .parts + .into_iter() + .map(|part| { + let part_id = if part.id.trim().is_empty() { + part_id_from_label(&part.mesh_label) + } else { + part.id + }; + ( + shared::ComponentInstanceId::new(format!("slot:{part_id}")), + part.material_slot_name, + part.material_id.is_some() || part.material_label.is_some(), + ) + }) + .collect::>() + }) + .unwrap_or_default(); + let project_materials = world + .resource::() + .records + .iter() + .filter(|record| { + matches!( + record.kind, + AssetKind::Material | AssetKind::MaterialInstance + ) + }) + .map(|record| { + ( + record.label.clone(), + MaterialRef::new( + EditorAssetRef::new(record.id.as_string(), "", record.label.clone()) + .with_source_path(record.path.clone()), + ), + ) + }) + .collect::>(); + if Path::new(path) + .extension() + .and_then(|extension| extension.to_str()) + .is_some_and(|extension| { + matches!( + extension.to_ascii_lowercase().as_str(), + "gltf" | "glb" | "fbx" + ) + }) + && ui.button("Extract Editable Materials Here").clicked() + { + begin_gltf_material_extraction(world, path); + } + let animation_clip_options = current + .animation_manifest_path + .as_deref() + .and_then(|manifest_path| load_animation_manifest(manifest_path).ok()) + .map(|manifest| { + manifest + .clips + .into_iter() + .map(|clip| (clip.id, clip.label)) + .collect::>() + }) + .unwrap_or_default(); + let registry_record = world + .resource::() + .records + .iter() + .find(|record| record.path == path) + .cloned() + .expect("model details require a registry record"); + let document_key = + crate::asset_documents::ensure_model_import_document(world, ®istry_record); + let mut draft_settings = world + .resource::() + .model_import(&document_key) + .cloned() + .unwrap_or_else(|| current.clone()); + let original_settings = draft_settings.clone(); + if let Some(snapshot) = world + .resource::() + .snapshot(&document_key) + { + authored_document_status_ui(ui, &snapshot); + } + let mut locate_material_path = None; + ui.add(egui::Slider::new(&mut draft_settings.scale, 0.01..=10.0).text("Scale")); + ui.checkbox(&mut draft_settings.generate_collider, "Generate collider"); + ui.checkbox(&mut draft_settings.lod0_only, "LOD0 only"); + egui::ComboBox::from_id_salt("model_placement_mode") + .selected_text(match draft_settings.placement_mode { + ModelPlacementMode::StaticAsset => "Renderable Asset (Auto)", + ModelPlacementMode::SceneInstance => "Scene Instance", + }) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut draft_settings.placement_mode, + ModelPlacementMode::StaticAsset, + "Renderable Asset (Auto)", + ); + ui.selectable_value( + &mut draft_settings.placement_mode, + ModelPlacementMode::SceneInstance, + "Scene Instance", + ); + }); + egui::ComboBox::from_id_salt("model_hierarchy_mode") + .selected_text(match draft_settings.hierarchy_mode { + ModelHierarchyMode::SingleActor => "One Actor", + ModelHierarchyMode::SourceHierarchy => "Source Hierarchy", + }) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut draft_settings.hierarchy_mode, + ModelHierarchyMode::SingleActor, + "One Actor", + ); + ui.selectable_value( + &mut draft_settings.hierarchy_mode, + ModelHierarchyMode::SourceHierarchy, + "Source Hierarchy", + ); + }); + if !material_slots.is_empty() { + ui.separator(); + ui.label(egui::RichText::new("Model Material Slots").strong()); + ui.horizontal(|ui| { + if ui.small_button("All Source").clicked() { + draft_settings.material_slots = material_slots + .iter() + .map(|(slot_id, _, _)| ModelMaterialSlotSelection { + slot_id: slot_id.clone(), + selection: ModelMaterialSelection::Source, + }) + .collect(); + } + if ui.small_button("All Default").clicked() { + draft_settings.material_slots = material_slots + .iter() + .map(|(slot_id, _, _)| ModelMaterialSlotSelection { + slot_id: slot_id.clone(), + selection: ModelMaterialSelection::Default, + }) + .collect(); + } + }); + for (slot_id, name, source_valid) in &material_slots { + let selection = draft_settings + .material_slots + .iter() + .find(|entry| entry.slot_id == *slot_id) + .map(|entry| entry.selection.clone()) + .unwrap_or_default(); + let selected_text = match &selection { + ModelMaterialSelection::Source if *source_valid => "Source".to_string(), + ModelMaterialSelection::Source => "Source (missing → DefaultGrid)".to_string(), + ModelMaterialSelection::Project(reference) => reference.0.label.clone(), + ModelMaterialSelection::Default => { + "Default (project fallback → DefaultGrid)".to_string() + } + }; + ui.horizontal(|ui| { + ui.vertical(|ui| { + ui.label(name); + ui.small(format!("{} · source {}", slot_id.0, if *source_valid { "valid" } else { "missing" })); + }); + egui::ComboBox::from_id_salt(("model_material_slot", &slot_id.0)) + .selected_text(selected_text) + .show_ui(ui, |ui| { + let mut chosen = None; + if ui.selectable_label(matches!(selection, ModelMaterialSelection::Source), "Source").clicked() { + chosen = Some(ModelMaterialSelection::Source); + } + for (label, reference) in &project_materials { + let selected = matches!(&selection, ModelMaterialSelection::Project(current) if current == reference); + if ui.selectable_label(selected, label).clicked() { + chosen = Some(ModelMaterialSelection::Project(reference.clone())); + } + } + if ui.selectable_label(matches!(selection, ModelMaterialSelection::Default), "Default (project fallback → DefaultGrid)").clicked() { + chosen = Some(ModelMaterialSelection::Default); + } + if let Some(selection) = chosen { + if let Some(entry) = draft_settings.material_slots.iter_mut().find(|entry| entry.slot_id == *slot_id) { + entry.selection = selection; + } else { + draft_settings.material_slots.push(ModelMaterialSlotSelection { slot_id: slot_id.clone(), selection }); + } + } + }); + if let ModelMaterialSelection::Project(reference) = &selection { + let source_path = reference.0.source_path.clone(); + if ui + .add_enabled(source_path.is_some(), egui::Button::new("Locate")) + .on_disabled_hover_text("The referenced project Material has no content path") + .clicked() + { + locate_material_path = source_path; + } + } + if !matches!(selection, ModelMaterialSelection::Source) + && ui.small_button("Clear").clicked() + { + set_model_material_slot_selection( + &mut draft_settings, + slot_id, + ModelMaterialSelection::Source, + ); + } + }); + } + let mut orphan_to_clear = None; + for orphan in &draft_settings.orphaned_material_slots { + ui.horizontal(|ui| { + ui.colored_label( + WARNING, + format!( + "Orphaned {} → {}", + orphan.slot_id.0, orphan.material.0.label + ), + ); + let source_path = orphan.material.0.source_path.clone(); + if ui + .add_enabled(source_path.is_some(), egui::Button::new("Locate")) + .on_disabled_hover_text("The referenced project Material has no content path") + .clicked() + { + locate_material_path = source_path; + } + if ui.small_button("Clear Orphan").clicked() { + orphan_to_clear = Some(orphan.slot_id.clone()); + } + }); + } + if let Some(slot_id) = orphan_to_clear { + clear_orphaned_model_material_selection(&mut draft_settings, &slot_id); + } + ui.small("Precedence: scene slot → model slot → imported source → project default → DefaultGrid."); + } + if !animation_clip_options.is_empty() { + let selected_default = draft_settings + .default_animation_clip_id + .as_deref() + .and_then(|id| { + animation_clip_options + .iter() + .find(|(clip_id, _)| clip_id == id) + .map(|(_, label)| label.as_str()) + }) + .unwrap_or_else(|| { + if draft_settings.default_animation_clip_id.is_some() { + "Missing clip" + } else { + "Imported rest pose" + } + }); + egui::ComboBox::from_id_salt("model_default_animation_clip") + .selected_text(selected_default) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut draft_settings.default_animation_clip_id, + None, + "Imported rest pose", + ); + for (clip_id, label) in &animation_clip_options { + ui.selectable_value( + &mut draft_settings.default_animation_clip_id, + Some(clip_id.clone()), + label, + ); + } + }); + ui.small("Default animation is sampled and paused in edit mode; no clip is guessed."); + } + if draft_settings != original_settings { + world + .resource_mut::() + .update_model_import(&document_key, draft_settings); + } + if let Some(path) = locate_material_path { + locate_content_asset(world, &path); + } +} + +pub(super) fn set_model_material_slot_selection( + settings: &mut ImportSettings, + slot_id: &shared::ComponentInstanceId, + selection: ModelMaterialSelection, +) { + if let Some(entry) = settings + .material_slots + .iter_mut() + .find(|entry| entry.slot_id == *slot_id) + { + entry.selection = selection; + } else { + settings.material_slots.push(ModelMaterialSlotSelection { + slot_id: slot_id.clone(), + selection, + }); + } +} + +pub(super) fn clear_orphaned_model_material_selection( + settings: &mut ImportSettings, + slot_id: &shared::ComponentInstanceId, +) -> bool { + let previous_len = settings.orphaned_material_slots.len(); + settings + .orphaned_material_slots + .retain(|orphan| orphan.slot_id != *slot_id); + settings.orphaned_material_slots.len() != previous_len +} + +pub(super) fn texture_import_settings_editor( + world: &mut World, + ui: &mut egui::Ui, + path: &str, + record: &crate::asset_db::AssetRecord, + current: &TextureImportSettings, +) { + let document_key = crate::asset_documents::ensure_texture_import_document(world, record); + let mut draft_settings = world + .resource::() + .texture_import(&document_key) + .cloned() + .unwrap_or_else(|| current.clone()); + let original_settings = draft_settings.clone(); + if let Some(snapshot) = world + .resource::() + .snapshot(&document_key) + { + authored_document_status_ui(ui, &snapshot); + } + egui::Grid::new(("texture_import_settings", path)) + .num_columns(2) + .spacing([12.0, 6.0]) + .show(ui, |ui| { + ui.label("Semantic"); + egui::ComboBox::from_id_salt(("texture_semantic", path)) + .selected_text(texture_semantic_label(draft_settings.semantic)) + .show_ui(ui, |ui| { + for (value, label) in [ + (TextureAssetSemantic::Auto, "Auto"), + (TextureAssetSemantic::Color, "Color"), + (TextureAssetSemantic::Normal, "Normal"), + (TextureAssetSemantic::MaskData, "Mask / Data"), + (TextureAssetSemantic::Ui, "UI"), + (TextureAssetSemantic::Hdr, "HDR"), + ] { + ui.selectable_value(&mut draft_settings.semantic, value, label); + } + }); + ui.end_row(); + + ui.label("Color space"); + egui::ComboBox::from_id_salt(("texture_color_space", path)) + .selected_text(match draft_settings.color_space { + TextureColorSpace::Auto => "Auto", + TextureColorSpace::Srgb => "sRGB", + TextureColorSpace::Linear => "Linear", + }) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut draft_settings.color_space, + TextureColorSpace::Auto, + "Auto", + ); + ui.selectable_value( + &mut draft_settings.color_space, + TextureColorSpace::Srgb, + "sRGB", + ); + ui.selectable_value( + &mut draft_settings.color_space, + TextureColorSpace::Linear, + "Linear", + ); + }); + ui.end_row(); + + ui.label("Mipmaps"); + egui::ComboBox::from_id_salt(("texture_mipmaps", path)) + .selected_text(match draft_settings.mipmaps { + TextureMipmapMode::Generate => "Generate", + TextureMipmapMode::PreserveSource => "Preserve Source", + TextureMipmapMode::None => "None", + }) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut draft_settings.mipmaps, + TextureMipmapMode::Generate, + "Generate", + ); + ui.selectable_value( + &mut draft_settings.mipmaps, + TextureMipmapMode::PreserveSource, + "Preserve Source", + ); + ui.selectable_value( + &mut draft_settings.mipmaps, + TextureMipmapMode::None, + "None", + ); + }); + ui.end_row(); + + ui.label("Compression"); + egui::ComboBox::from_id_salt(("texture_compression", path)) + .selected_text(match draft_settings.compression { + TextureCompression::Auto => "Auto", + TextureCompression::Uastc => "Basis UASTC", + TextureCompression::Uncompressed => "Uncompressed KTX2", + }) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut draft_settings.compression, + TextureCompression::Auto, + "Auto", + ); + ui.selectable_value( + &mut draft_settings.compression, + TextureCompression::Uastc, + "Basis UASTC", + ); + ui.selectable_value( + &mut draft_settings.compression, + TextureCompression::Uncompressed, + "Uncompressed KTX2", + ); + }); + ui.end_row(); + + ui.label("Maximum size"); + ui.horizontal(|ui| { + let mut enabled = draft_settings.max_dimension.is_some(); + if ui.checkbox(&mut enabled, "").changed() { + draft_settings.max_dimension = enabled.then_some(2048); + } + if let Some(dimension) = draft_settings.max_dimension.as_mut() { + ui.add(egui::DragValue::new(dimension).range(1..=16_384)); + } else { + ui.weak("No limit"); + } + }); + ui.end_row(); + }); + + ui.collapsing("Sampling", |ui| { + egui::Grid::new(("texture_sampling", path)) + .num_columns(2) + .spacing([12.0, 6.0]) + .show(ui, |ui| { + ui.label("Filtering"); + egui::ComboBox::from_id_salt(("texture_filter", path)) + .selected_text(match draft_settings.filter { + TextureFilter::Nearest => "Nearest", + TextureFilter::Linear => "Linear", + }) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut draft_settings.filter, + TextureFilter::Nearest, + "Nearest", + ); + ui.selectable_value( + &mut draft_settings.filter, + TextureFilter::Linear, + "Linear", + ); + }); + ui.end_row(); + + ui.label("Wrapping"); + egui::ComboBox::from_id_salt(("texture_wrap", path)) + .selected_text(match draft_settings.wrap { + TextureWrap::Repeat => "Repeat", + TextureWrap::Clamp => "Clamp", + TextureWrap::Mirror => "Mirror", + }) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut draft_settings.wrap, + TextureWrap::Repeat, + "Repeat", + ); + ui.selectable_value(&mut draft_settings.wrap, TextureWrap::Clamp, "Clamp"); + ui.selectable_value( + &mut draft_settings.wrap, + TextureWrap::Mirror, + "Mirror", + ); + }); + ui.end_row(); + + ui.label("Anisotropy"); + ui.add(egui::Slider::new(&mut draft_settings.anisotropy, 1..=16)); + ui.end_row(); + }); + }); + + if matches!( + draft_settings.semantic, + TextureAssetSemantic::Auto | TextureAssetSemantic::Normal + ) { + ui.horizontal(|ui| { + ui.label("Normal convention"); + ui.selectable_value( + &mut draft_settings.normal_map_convention, + NormalMapConvention::OpenGl, + "OpenGL (+Y)", + ); + ui.selectable_value( + &mut draft_settings.normal_map_convention, + NormalMapConvention::DirectX, + "DirectX (-Y → +Y)", + ); + }); + } + + let mut normalized = draft_settings.clone(); + content_pipeline::normalize_texture_settings(path, &mut normalized); + ui.small(format!( + "Processed as {} · {} · {}", + texture_semantic_label(normalized.semantic), + if shared::resolves_srgb(&normalized) { + "sRGB" + } else { + "Linear" + }, + match normalized.compression { + TextureCompression::Uastc => "Basis UASTC", + TextureCompression::Uncompressed => "KTX2", + TextureCompression::Auto => "Auto", + } + )); + if draft_settings != original_settings { + world + .resource_mut::() + .update_texture_import(&document_key, draft_settings); + } +} + +pub(super) fn texture_semantic_label(semantic: TextureAssetSemantic) -> &'static str { + match semantic { + TextureAssetSemantic::Auto => "Auto", + TextureAssetSemantic::Color => "Color", + TextureAssetSemantic::Normal => "Normal", + TextureAssetSemantic::MaskData => "Mask / Data", + TextureAssetSemantic::Ui => "UI", + TextureAssetSemantic::Hdr => "HDR", + } +} diff --git a/crates/editor/src/ui/asset_browser/panel/list.rs b/crates/editor/src/ui/asset_browser/panel/list.rs new file mode 100644 index 0000000..36040f8 --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/list.rs @@ -0,0 +1,406 @@ +use super::*; + +#[expect( + clippy::too_many_arguments, + reason = "asset list rendering shares explicit grid/list selection and thumbnail inputs" +)] +pub(super) fn asset_list( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + selected: &Option, + folders: &[FolderSnapshot], + assets: &[AssetRow], + cache_snapshot: &ThumbnailCacheSnapshot, + visible_order: &[AssetSelection], +) { + if ui.available_width() < COMPACT_LIST_WIDTH { + compact_asset_list( + world, + ui, + selected_entities, + selected, + folders, + assets, + cache_snapshot, + visible_order, + ); + return; + } + + ui.horizontal(|ui| { + ui.add_sized([236.0, 18.0], egui::Label::new("Name")); + ui.add_sized([80.0, 18.0], egui::Label::new("Type")); + ui.add_sized([72.0, 18.0], egui::Label::new("Size")); + ui.add_sized([88.0, 18.0], egui::Label::new("Modified")); + ui.label("Path"); + }); + + for folder in folders { + let selection = AssetSelection::Folder(folder.path.clone()); + let is_selected = world.resource::().is_selected(&selection); + let row_frame = egui::Frame::new() + .fill(if is_selected { + crate::ui::theme::SELECTION_BG_MUTED + } else { + WIDGET_BG.linear_multiply(0.9) + }) + .inner_margin(egui::Margin::symmetric(6, 3)) + .show(ui, |ui| { + ui.horizontal(|ui| { + ui.add_sized([20.0, 20.0], egui::Label::new("")); + ui.label(icon_text(icons::FOLDER, 14.0).color(TEXT_DIM)); + ui.add_sized( + [196.0, 20.0], + egui::Button::selectable(is_selected, folder.name.as_str()), + ) + }) + .inner + }); + let response = row_frame.response.interact(egui::Sense::click_and_drag()); + if response.double_clicked() { + navigate_content_folder(world, folder.path.clone()); + } else if response.clicked() { + apply_content_click_selection(world, ui, selection.clone(), visible_order); + } + if response.drag_started() { + world + .resource_mut::() + .start_drag(selection.clone()); + } + if response.secondary_clicked() { + prepare_context_menu_selection(world, selection); + } + response.context_menu(|ui| folder_context_menu(world, ui, folder)); + } + + for row in assets { + draw_asset_list_item(world, ui, selected_entities, selected, row, visible_order); + if row.asset.path.as_deref().is_some_and(|path| { + world + .resource::() + .expanded_assets + .contains(path) + }) { + embedded_asset_shelf( + world, + ui, + selected_entities, + selected, + &row.asset, + cache_snapshot, + 56.0, + ); + } + } +} + +pub(super) fn draw_asset_list_item( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + _selected: &Option, + row: &AssetRow, + visible_order: &[AssetSelection], +) { + let has_children = has_embedded_assets(world, &row.asset); + let expanded = row.asset.path.as_deref().is_some_and(|path| { + world + .resource::() + .expanded_assets + .contains(path) + }); + let is_selected = world.resource::().is_selected(&row.selection); + let document_status = asset_document_status(world, row.asset.path.as_deref()); + let status = AssetCardStatus::for_document( + document_status.as_ref(), + document_status + .as_ref() + .is_some_and(|snapshot| snapshot.dirty), + false, + ); + let row_frame = egui::Frame::new() + .fill(if is_selected { + crate::ui::theme::SELECTION_BG_MUTED + } else { + WIDGET_BG.linear_multiply(0.9) + }) + .stroke(egui::Stroke::new( + 1.0_f32, + if is_selected { ACCENT } else { BORDER }, + )) + .inner_margin(egui::Margin::symmetric(6, 3)) + .show(ui, |ui| { + ui.horizontal(|ui| { + if has_children { + let icon = if expanded { + icons::CARET_DOWN + } else { + icons::CARET_RIGHT + }; + if ui + .add_sized( + [20.0, 20.0], + egui::Button::new(icon_text(icon, 12.0)).frame(false), + ) + .clicked() + { + if let Some(path) = row.asset.path.as_ref() { + toggle_asset_expanded(world, path); + } + } + } else { + ui.add_sized([20.0, 20.0], egui::Label::new("")); + } + ui.label(icon_text(kind_icon(&row.asset.kind), 14.0).color(TEXT_DIM)); + let response = ui.add_sized( + [176.0, 20.0], + egui::Button::selectable(is_selected, row.asset.label.as_str()), + ); + draw_asset_status_marker(ui, status); + ui.add_sized([80.0, 20.0], egui::Label::new(kind_label(&row.asset.kind))); + ui.add_sized( + [72.0, 20.0], + egui::Label::new( + row.file_size + .map(format_bytes) + .unwrap_or_else(|| "-".to_string()), + ), + ); + ui.add_sized( + [88.0, 20.0], + egui::Label::new( + row.modified + .map(format_modified) + .unwrap_or_else(|| "-".to_string()), + ), + ); + ui.add( + egui::Label::new(row.asset.path.as_deref().unwrap_or("Built-in")).truncate(), + ); + ui.menu_button(icon_text(icons::DOTS_THREE_VERTICAL, 13.0), |ui| { + asset_context_menu(world, ui, &row.asset, selected_entities); + }); + response + }) + .inner + }); + let response = row_frame.response.interact(egui::Sense::click_and_drag()); + + if response.double_clicked() { + activate_content_asset(world, &row.asset); + } else if response.clicked() { + apply_content_click_selection(world, ui, row.selection.clone(), visible_order); + } + if response.drag_started() { + world + .resource_mut::() + .start_drag(row.selection.clone()); + } + if response.secondary_clicked() { + prepare_context_menu_selection(world, row.selection.clone()); + } + response.context_menu(|ui| { + asset_context_menu(world, ui, &row.asset, selected_entities); + }); +} + +pub(super) fn asset_document_status( + world: &World, + path: Option<&str>, +) -> Option { + path.and_then(|path| { + world + .get_resource::() + .and_then(|store| store.snapshot_for_path(path)) + }) +} + +#[expect( + clippy::too_many_arguments, + reason = "compact list rendering shares explicit grid/list selection and thumbnail inputs" +)] +pub(super) fn compact_asset_list( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, + selected: &Option, + folders: &[FolderSnapshot], + assets: &[AssetRow], + cache_snapshot: &ThumbnailCacheSnapshot, + visible_order: &[AssetSelection], +) { + for folder in folders { + let selection = AssetSelection::Folder(folder.path.clone()); + let is_selected = world.resource::().is_selected(&selection); + let response = ui + .horizontal(|ui| { + ui.label(icon_text(icons::FOLDER, 14.0).color(TEXT_DIM)); + ui.add_sized( + [fit_width(ui, 120.0, f32::INFINITY), 22.0], + egui::Button::selectable(is_selected, folder.name.as_str()), + ) + }) + .inner; + if response.double_clicked() { + navigate_content_folder(world, folder.path.clone()); + } else if response.clicked() { + apply_content_click_selection(world, ui, selection.clone(), visible_order); + } + if response.drag_started() { + world + .resource_mut::() + .start_drag(selection.clone()); + } + if response.secondary_clicked() { + prepare_context_menu_selection(world, selection); + } + response.context_menu(|ui| folder_context_menu(world, ui, folder)); + ui.small(egui::RichText::new("Folder").color(TEXT_DIM)); + ui.add_space(4.0); + } + + for row in assets { + let is_selected = world.resource::().is_selected(&row.selection); + let document_status = asset_document_status(world, row.asset.path.as_deref()); + let status = AssetCardStatus::for_document( + document_status.as_ref(), + document_status + .as_ref() + .is_some_and(|snapshot| snapshot.dirty), + false, + ); + let has_children = has_embedded_assets(world, &row.asset); + let expanded = row.asset.path.as_deref().is_some_and(|path| { + world + .resource::() + .expanded_assets + .contains(path) + }); + let mut response = None; + ui.horizontal(|ui| { + if has_children { + let icon = if expanded { + icons::CARET_DOWN + } else { + icons::CARET_RIGHT + }; + if ui + .add_sized( + [20.0, 20.0], + egui::Button::new(icon_text(icon, 12.0)).frame(false), + ) + .clicked() + { + if let Some(path) = row.asset.path.as_ref() { + toggle_asset_expanded(world, path); + } + } + } + ui.label(icon_text(kind_icon(&row.asset.kind), 14.0).color(TEXT_DIM)); + draw_asset_status_marker(ui, status); + response = Some(ui.add_sized( + [fit_width(ui, 120.0, f32::INFINITY), 22.0], + egui::Button::selectable(is_selected, row.asset.label.as_str()), + )); + ui.menu_button(icon_text(icons::DOTS_THREE_VERTICAL, 13.0), |ui| { + asset_context_menu(world, ui, &row.asset, selected_entities); + }); + }); + let response = response.expect("compact asset list response"); + let size = row + .file_size + .map(format_bytes) + .unwrap_or_else(|| "-".to_string()); + let modified = row + .modified + .map(format_modified) + .unwrap_or_else(|| "-".to_string()); + let path = row.asset.path.as_deref().unwrap_or("Built-in"); + ui.add( + egui::Label::new( + egui::RichText::new(format!( + "{} | {} | {} | {}", + kind_label(&row.asset.kind), + size, + modified, + path + )) + .color(TEXT_DIM), + ) + .truncate(), + ); + ui.add_space(4.0); + + if response.double_clicked() { + activate_content_asset(world, &row.asset); + } else if response.clicked() { + apply_content_click_selection(world, ui, row.selection.clone(), visible_order); + } + if response.drag_started() { + world + .resource_mut::() + .start_drag(row.selection.clone()); + } + if response.secondary_clicked() { + prepare_context_menu_selection(world, row.selection.clone()); + } + response.context_menu(|ui| { + asset_context_menu(world, ui, &row.asset, selected_entities); + }); + if expanded { + embedded_asset_shelf( + world, + ui, + selected_entities, + selected, + &row.asset, + cache_snapshot, + 56.0, + ); + } + } +} + +pub(super) fn draw_folder_cell( + ui: &mut egui::Ui, + folder: &FolderSnapshot, + thumbnail_size: f32, + is_selected: bool, +) -> egui::Response { + let thumb_size = thumbnail_size.clamp(48.0, 112.0); + let cell_size = egui::vec2(thumb_size + 20.0, thumb_size + 30.0); + let (rect, response) = ui.allocate_exact_size(cell_size, egui::Sense::click_and_drag()); + let fill = if is_selected { + crate::ui::theme::SELECTION_BG_MUTED + } else if response.hovered() { + ELEVATED_BG + } else { + WIDGET_BG + }; + ui.painter().rect( + rect, + 4.0, + fill, + egui::Stroke::new(1.0_f32, if is_selected { ACCENT } else { BORDER }), + egui::StrokeKind::Inside, + ); + ui.painter().text( + rect.center_top() + egui::vec2(0.0, 10.0 + thumb_size * 0.45), + egui::Align2::CENTER_CENTER, + icons::FOLDER_SIMPLE.as_str(), + egui::FontId::new( + (thumb_size * 0.48).max(24.0), + egui::FontFamily::Name("phosphor-regular".into()), + ), + TEXT, + ); + ui.painter().text( + egui::pos2(rect.center().x, rect.max.y - 6.0), + egui::Align2::CENTER_BOTTOM, + folder.name.as_str(), + egui::FontId::new(11.0, egui::FontFamily::Proportional), + TEXT, + ); + response +} diff --git a/crates/editor/src/ui/asset_browser/panel/material_extraction.rs b/crates/editor/src/ui/asset_browser/panel/material_extraction.rs new file mode 100644 index 0000000..f61bdb8 --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/material_extraction.rs @@ -0,0 +1,640 @@ +use super::*; + +pub(crate) fn begin_gltf_material_extraction(world: &mut World, source: &str) { + begin_model_material_extraction(world, source, None); +} + +pub(crate) fn begin_actor_material_extraction( + world: &mut World, + source: &str, + entity: Entity, + slot_id: shared::ComponentInstanceId, + source_sub_asset_id: String, +) { + begin_model_material_extraction( + world, + source, + Some(GltfMaterialExtractionTarget { + entity, + slot_id, + source_sub_asset_id, + }), + ); +} + +pub(super) fn begin_model_material_extraction( + world: &mut World, + source: &str, + actor_target: Option, +) { + let destination = world.resource::().current_folder.clone(); + match crate::assets::plan_model_material_extraction(Path::new(source), Path::new(&destination)) + { + Ok(materials) if materials.is_empty() => { + world.resource_mut::().status = + format!("No convertible source materials were found in {source}"); + } + Ok(materials) => { + let materials = materials + .into_iter() + .map(|material| { + let included = actor_target.as_ref().is_none_or(|target| { + material + .asset + .provenance + .as_ref() + .is_some_and(|provenance| { + provenance.source_sub_asset_id == target.source_sub_asset_id + }) + }); + let path = material + .asset + .provenance + .as_ref() + .and_then(|provenance| { + crate::assets::find_matching_extracted_material( + Path::new(&destination), + Path::new(source), + &provenance.source_sub_asset_id, + ) + }) + .unwrap_or(material.path); + GltfMaterialExtractionEntry { + included, + source_index: material.source_index, + source_name: material.source_name, + write_mode: if path.exists() { + MaterialExtractionWriteMode::Undecided + } else { + MaterialExtractionWriteMode::CreateNew + }, + path: path.to_string_lossy().replace('\\', "/"), + asset: material.asset, + } + }) + .collect::>(); + if actor_target.is_some() && !materials.iter().any(|material| material.included) { + world.resource_mut::().status = + "The selected imported material could not be matched for extraction".into(); + return; + } + world + .resource_mut::() + .pending_gltf_extraction = Some(GltfMaterialExtractionDraft { + source: source.to_string(), + destination, + materials, + actor_target, + }); + } + Err(error) => { + world.resource_mut::().status = + format!("Material extraction review failed: {error}"); + } + } +} + +pub(super) fn draw_gltf_material_extraction_modal(world: &mut World, ctx: &egui::Context) { + let Some(mut draft) = world + .resource::() + .pending_gltf_extraction + .clone() + else { + return; + }; + let mut cancel = false; + let mut extract = false; + let validation_error = gltf_extraction_validation_error(&draft); + let included = draft + .materials + .iter() + .filter(|material| material.included) + .count(); + + egui::Window::new("Extract Editable Model Materials") + .collapsible(false) + .resizable(true) + .default_width(880.0) + .min_width(680.0) + .show(ctx, |ui| { + ui.label(format!("Source: {}", draft.source)); + ui.label(format!("Destination: {}", draft.destination)); + ui.small( + egui::RichText::new( + "Review converted PBR values, texture references, final project paths, and any provenance-matched diff. Existing files require an explicit guarded Apply or Create New decision.", + ) + .color(TEXT_DIM), + ); + ui.separator(); + egui::ScrollArea::vertical() + .max_height(420.0) + .show(ui, |ui| { + for material in &mut draft.materials { + ui.push_id(material.source_index, |ui| { + egui::Frame::group(ui.style()).show(ui, |ui| { + ui.horizontal(|ui| { + ui.checkbox(&mut material.included, ""); + ui.strong(format!( + "{} · source material {}", + material.source_name, material.source_index + )); + }); + ui.horizontal(|ui| { + ui.label("Project path"); + let changed = ui + .add( + egui::TextEdit::singleline(&mut material.path) + .desired_width(f32::INFINITY), + ) + .changed(); + if changed { + material.write_mode = if Path::new(material.path.trim()).exists() { + MaterialExtractionWriteMode::Undecided + } else { + MaterialExtractionWriteMode::CreateNew + }; + } + }); + let resolved = material_asset_desc(&material.asset); + ui.small(format!( + "Metallic {:.3} · Roughness {:.3} · {}", + resolved.metallic, + resolved.roughness, + gltf_material_texture_summary(&material.asset) + )); + ui.small(format!( + "Alpha {:?} · Double sided {} · provenance {}", + material.asset.render_state.alpha_mode, + material.asset.render_state.double_sided, + material + .asset + .provenance + .as_ref() + .map(|provenance| provenance.source_sub_asset_id.as_str()) + .unwrap_or("missing") + )); + match review_existing_extraction_target(material) { + Ok(Some(review)) if review.provenance_matches => { + ui.separator(); + ui.strong("Existing extracted Material found"); + if review.changes.is_empty() { + ui.small("Diff: converted values are unchanged; applying refreshes source provenance."); + } else { + ui.small(format!("Diff: {}", review.changes.join(" · "))); + } + ui.horizontal(|ui| { + let selected = matches!( + &material.write_mode, + MaterialExtractionWriteMode::ApplyExisting { + expected_fingerprint, + .. + } if expected_fingerprint == &review.fingerprint + ); + if ui + .selectable_label(selected, "Apply Reviewed Update") + .on_hover_text( + "Replace this Material transactionally only if its reviewed bytes have not changed.", + ) + .clicked() + { + material.write_mode = + MaterialExtractionWriteMode::ApplyExisting { + expected_fingerprint: review.fingerprint, + previous_bytes: review.bytes, + }; + } + if ui.button("Create New Copy").clicked() { + material.path = unique_extraction_copy_path( + Path::new(material.path.trim()), + ) + .to_string_lossy() + .replace('\\', "/"); + material.write_mode = + MaterialExtractionWriteMode::CreateNew; + } + }); + } + Ok(Some(_)) => { + ui.small( + egui::RichText::new( + "Existing Material provenance does not match this source slot; Apply is blocked.", + ) + .color(WARNING), + ); + if ui.button("Create New Copy").clicked() { + material.path = unique_extraction_copy_path( + Path::new(material.path.trim()), + ) + .to_string_lossy() + .replace('\\', "/"); + material.write_mode = + MaterialExtractionWriteMode::CreateNew; + } + } + Ok(None) => { + material.write_mode = MaterialExtractionWriteMode::CreateNew; + ui.small("Create new editable project Material"); + } + Err(error) => { + ui.small(egui::RichText::new(error).color(WARNING)); + } + } + }); + ui.add_space(4.0); + }); + } + }); + ui.separator(); + ui.horizontal(|ui| { + if ui.button("Cancel").clicked() { + cancel = true; + } + if ui + .add_enabled( + validation_error.is_none(), + egui::Button::new(format!("Extract {included} Material(s)")), + ) + .clicked() + { + extract = true; + } + }); + if let Some(error) = validation_error.as_deref() { + ui.small(egui::RichText::new(error).color(WARNING)); + } + }); + + if cancel { + world + .resource_mut::() + .pending_gltf_extraction = None; + } else if extract { + match commit_gltf_material_extraction(world, &draft) { + Ok((count, mapped_slots, warning)) => { + world + .resource_mut::() + .pending_gltf_extraction = None; + let scope = if draft.actor_target.is_some() { + "actor slot" + } else { + "model slot" + }; + let mut status = format!( + "Extracted {count} editable model material(s) into {} and assigned {mapped_slots} {scope}(s)", + draft.destination + ); + if let Some(warning) = warning { + status.push_str(&format!("; {warning}")); + } + world.resource_mut::().status = status; + } + Err(error) => { + world.resource_mut::().status = error; + world + .resource_mut::() + .pending_gltf_extraction = Some(draft); + } + } + } else { + world + .resource_mut::() + .pending_gltf_extraction = Some(draft); + } +} + +pub(super) fn gltf_extraction_validation_error( + draft: &GltfMaterialExtractionDraft, +) -> Option { + let selected = draft + .materials + .iter() + .filter(|material| material.included) + .collect::>(); + if selected.is_empty() { + return Some("Select at least one source material to extract.".into()); + } + let mut paths = HashSet::new(); + for material in selected { + let path = Path::new(material.path.trim()); + if let Err(error) = content_pipeline::validate_asset_path(path) { + return Some(format!("Invalid project path {}: {error}", path.display())); + } + if path.extension().and_then(|extension| extension.to_str()) != Some("ron") { + return Some(format!( + "Material path must end in .ron: {}", + path.display() + )); + } + let normalized = material.path.trim().replace('\\', "/"); + if !paths.insert(normalized) { + return Some("Two selected materials have the same project path.".into()); + } + match &material.write_mode { + MaterialExtractionWriteMode::Undecided => { + return Some(format!( + "Review the existing Material diff and choose Apply or Create New: {}", + path.display() + )); + } + MaterialExtractionWriteMode::CreateNew if path.exists() => { + return Some(format!("Project path already exists: {}", path.display())); + } + MaterialExtractionWriteMode::ApplyExisting { + expected_fingerprint, + previous_bytes, + } => match review_existing_extraction_target(material) { + Ok(Some(review)) + if review.provenance_matches + && review.fingerprint == *expected_fingerprint + && review.bytes == *previous_bytes => {} + Ok(Some(_)) => { + return Some(format!( + "Existing Material changed or has different provenance: {}", + path.display() + )); + } + Ok(None) => { + return Some(format!("Apply target no longer exists: {}", path.display())); + } + Err(error) => return Some(error), + }, + MaterialExtractionWriteMode::CreateNew => {} + } + } + None +} + +pub(super) struct ExistingExtractionReview { + pub(super) fingerprint: String, + pub(super) bytes: Vec, + pub(super) provenance_matches: bool, + pub(super) changes: Vec<&'static str>, +} + +pub(super) fn review_existing_extraction_target( + material: &GltfMaterialExtractionEntry, +) -> Result, String> { + let path = Path::new(material.path.trim()); + if !path.exists() { + return Ok(None); + } + let bytes = fs::read(path).map_err(|error| { + format!( + "Could not read existing Material {}: {error}", + path.display() + ) + })?; + let existing: MaterialAsset = ron::de::from_bytes(&bytes) + .map_err(|error| format!("Existing target is not a valid Material: {error}"))?; + let fingerprint = content_pipeline::tree_fingerprint(path)?; + let provenance_matches = existing + .provenance + .as_ref() + .zip(material.asset.provenance.as_ref()) + .is_some_and(|(existing, incoming)| { + existing.source_path == incoming.source_path + && existing.source_sub_asset_id == incoming.source_sub_asset_id + }); + let mut changes = Vec::new(); + if existing.label != material.asset.label { + changes.push("label"); + } + if existing.shader != material.asset.shader || existing.shader_ref != material.asset.shader_ref + { + changes.push("shader selection"); + } + if existing.render_state != material.asset.render_state { + changes.push("render state"); + } + if existing.inputs != material.asset.inputs { + changes.push("PBR values or textures"); + } + if existing + .provenance + .as_ref() + .map(|value| &value.source_fingerprint) + != material + .asset + .provenance + .as_ref() + .map(|value| &value.source_fingerprint) + { + changes.push("source revision"); + } + Ok(Some(ExistingExtractionReview { + fingerprint, + bytes, + provenance_matches, + changes, + })) +} + +pub(super) fn unique_extraction_copy_path(path: &Path) -> PathBuf { + let parent = path.parent().unwrap_or_else(|| Path::new("assets")); + let file_name = path + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or("material.material.ron"); + let stem = file_name + .strip_suffix(".material.ron") + .or_else(|| file_name.strip_suffix(".ron")) + .unwrap_or(file_name); + (2..) + .map(|suffix| parent.join(format!("{stem}_{suffix}.material.ron"))) + .find(|candidate| !candidate.exists()) + .expect("numeric material suffix space is effectively unbounded") +} + +pub(super) fn gltf_material_texture_summary(asset: &MaterialAsset) -> String { + let mut textures = Vec::new(); + if asset + .inputs + .texture("base_color") + .is_some_and(|value| value.texture.is_some()) + { + textures.push("base color"); + } + if asset + .inputs + .texture("normal") + .is_some_and(|value| value.texture.is_some()) + { + textures.push("normal"); + } + if asset + .inputs + .texture("roughness") + .is_some_and(|value| value.texture.is_some()) + || asset + .inputs + .texture("metallic") + .is_some_and(|value| value.texture.is_some()) + { + textures.push("metal/rough"); + } + if asset + .inputs + .texture("emissive") + .is_some_and(|value| value.texture.is_some()) + { + textures.push("emissive"); + } + if textures.is_empty() { + "no converted textures".into() + } else { + format!("textures: {}", textures.join(", ")) + } +} + +pub(super) fn material_asset_desc(asset: &MaterialAsset) -> MaterialDesc { + let mut material = MaterialDesc { + shader: asset.shader.clone(), + ..Default::default() + }; + asset.inputs.apply_to_material_desc(&mut material); + material +} + +pub(super) fn commit_gltf_material_extraction( + world: &mut World, + draft: &GltfMaterialExtractionDraft, +) -> Result<(usize, usize, Option), String> { + if let Some(error) = gltf_extraction_validation_error(draft) { + return Err(error); + } + let included = draft + .materials + .iter() + .filter(|material| material.included) + .cloned() + .collect::>(); + let operations = included + .iter() + .map(|material| { + ron::ser::to_string_pretty(&material.asset, ron::ser::PrettyConfig::default()) + .map(|ron| { + let path = PathBuf::from(material.path.trim()); + let bytes = format!("{ron}\n").into_bytes(); + match &material.write_mode { + MaterialExtractionWriteMode::CreateNew => { + content_pipeline::ContentOperation::WriteFile { path, bytes } + } + MaterialExtractionWriteMode::ApplyExisting { + expected_fingerprint, + previous_bytes, + } => content_pipeline::ContentOperation::ReplaceFile { + path, + bytes, + expected_fingerprint: expected_fingerprint.clone(), + previous_bytes: previous_bytes.clone(), + }, + MaterialExtractionWriteMode::Undecided => { + unreachable!("extraction validation rejects undecided existing targets") + } + } + }) + .map_err(|error| format!("Material extraction serialization failed: {error}")) + }) + .collect::, _>>()?; + let count = operations.len(); + let manifest = world + .resource::() + .records + .iter() + .find(|record| record.path == draft.source) + .ok_or_else(|| format!("Model is not registered: {}", draft.source))? + .model_import() + .static_mesh_manifest_path + .as_deref() + .ok_or_else(|| format!("Model has no generated mesh manifest: {}", draft.source)) + .and_then(load_static_mesh_manifest)?; + let bindings = included + .iter() + .map(|material| ExtractedMaterialBinding { + source_index: material.source_index, + path: material.path.trim().replace('\\', "/"), + }) + .collect::>(); + if let Some(target) = draft.actor_target.as_ref() { + validate_actor_material_extraction_target(world, target)?; + } + let mapped_slots = std::cell::Cell::new(0); + let committed = commit_content_operations_internal_with_registry_update( + world, + operations, + true, + |document| { + if draft.actor_target.is_none() { + mapped_slots.set(bind_extracted_material_slots( + document, + &draft.source, + &manifest, + &bindings, + )?); + } + Ok(()) + }, + ); + if !committed { + return Err(world.resource::().status.clone()); + } + + if let Some(target) = draft.actor_target.as_ref() { + let binding = included + .iter() + .find(|material| { + material + .asset + .provenance + .as_ref() + .is_some_and(|provenance| { + provenance.source_sub_asset_id == target.source_sub_asset_id + }) + }) + .ok_or_else(|| "Selected source material was not included in extraction".to_string())?; + let path = binding.path.trim().replace('\\', "/"); + let record = world + .resource::() + .records + .iter() + .find(|record| record.path == path) + .ok_or_else(|| format!("Extracted Material was not registered: {path}"))?; + let reference = MaterialRef::new( + EditorAssetRef::new( + record.id.as_string(), + "material:source", + record.label.clone(), + ) + .with_source_path(path), + ); + assign_extracted_material_to_actor_slot(world, target, reference)?; + mapped_slots.set(1); + } + + let warning = if draft.actor_target.is_none() { + refresh_extracted_model_artifacts(world, &draft.source).err() + } else { + None + }; + Ok((count, mapped_slots.get(), warning)) +} + +pub(super) fn validate_actor_material_extraction_target( + world: &World, + target: &GltfMaterialExtractionTarget, +) -> Result<(), String> { + let exists = world + .get::(target.entity) + .is_some_and(|primitive| primitive.surface.id == target.slot_id) + || world + .get::(target.entity) + .is_some_and(|renderer| renderer.materials.slot(&target.slot_id).is_some()) + || world + .get::(target.entity) + .is_some_and(|renderer| renderer.materials.slot(&target.slot_id).is_some()); + if exists { + Ok(()) + } else { + Err("The actor or exact material slot changed while extraction was open".into()) + } +} diff --git a/crates/editor/src/ui/asset_browser/panel/navigation.rs b/crates/editor/src/ui/asset_browser/panel/navigation.rs new file mode 100644 index 0000000..a95dacc --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/navigation.rs @@ -0,0 +1,506 @@ +use super::*; + +pub(super) fn content_header( + world: &mut World, + ui: &mut egui::Ui, + current_folder: &str, + folders: &[FolderSnapshot], + assets: &[AssetRow], +) { + ui.horizontal_wrapped(|ui| { + ui.label(panel_heading("Assets")); + ui.separator(); + breadcrumb(world, ui, current_folder); + }); + let direct_assets = assets + .iter() + .filter(|row| row.asset.folder_path == current_folder) + .count(); + let direct_folders = folders + .iter() + .filter(|folder| folder.parent.as_deref() == Some(current_folder)) + .count(); + ui.small( + egui::RichText::new(format!("{direct_folders} folders, {direct_assets} assets")) + .color(TEXT_DIM), + ); +} + +pub(super) fn prefetch_asset_row_thumbnails(world: &mut World, rows: &[AssetRow]) { + let requests: Vec<(String, String, EditorAssetKind)> = rows + .iter() + .filter(|row| { + matches!( + row.asset.kind, + EditorAssetKind::Texture | EditorAssetKind::Model | EditorAssetKind::Material + ) + }) + .filter_map(|row| { + Some(( + asset_cache_key(&row.asset), + row.asset.path.clone()?, + row.asset.kind.clone(), + )) + }) + .collect(); + if requests.is_empty() { + return; + } + let asset_server = world.resource::().clone(); + world.resource_scope(|world, mut cache: Mut| { + world.resource_scope(|_world, mut studio: Mut| { + for (key, path, kind) in &requests { + match kind { + EditorAssetKind::Texture => { + cache.request_texture(key.clone(), path.clone(), &asset_server); + } + EditorAssetKind::Model => { + cache.request_model(key.clone(), path.clone(), &mut studio); + } + EditorAssetKind::Material => { + cache.request_material_asset(key.clone(), path.clone(), &mut studio); + } + _ => {} + } + } + }); + }); +} + +pub(super) fn breadcrumb(world: &mut World, ui: &mut egui::Ui, current_folder: &str) { + let mut parts = Vec::new(); + let mut cursor = Some(current_folder.to_string()); + while let Some(path) = cursor { + let label = if path == BUILTINS_FOLDER { + "Built-ins".to_string() + } else { + Path::new(&path) + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or(&path) + .to_string() + }; + cursor = path.rfind('/').map(|index| path[..index].to_string()); + parts.push((path, label)); + } + parts.reverse(); + for (index, (path, label)) in parts.iter().enumerate() { + if index > 0 { + ui.label(egui::RichText::new("/").color(TEXT_DIM)); + } + if ui.link(label).clicked() { + navigate_content_folder(world, path.clone()); + } + } +} + +pub(super) fn selection_footer( + world: &mut World, + ui: &mut egui::Ui, + selected_entities: &SelectedEntities, +) { + let selection = world.resource::().selected.clone(); + let selection_count = world.resource::().selections.len(); + if selection_count > 1 { + let has_authored_content = !selected_content_paths(world).is_empty(); + ui.label(format!("{selection_count} items selected")); + ui.horizontal_wrapped(|ui| { + if ui + .add_enabled(has_authored_content, egui::Button::new("Cut")) + .clicked() + { + set_content_clipboard(world, true); + } + if ui + .add_enabled(has_authored_content, egui::Button::new("Copy")) + .clicked() + { + set_content_clipboard(world, false); + } + if ui + .add_enabled(has_authored_content, egui::Button::new("Duplicate")) + .clicked() + { + duplicate_selection(world); + } + if ui + .add_enabled(has_authored_content, egui::Button::new("Move To Trash")) + .clicked() + { + request_delete_for_selection(world); + } + }); + return; + } + let selected_embedded = selection + .as_ref() + .and_then(|selection| embedded_asset_for_selection(world, selection)); + if let Some(AssetSelection::Folder(path)) = selection.clone() { + ui.add(egui::Label::new(format!("Selected folder: {path}")).truncate()); + ui.horizontal_wrapped(|ui| { + if ui.button("Open").clicked() { + navigate_content_folder(world, path.clone()); + } + if ui.button("Import Here").clicked() { + request_import_to_destination(world, path.clone()); + } + if ui.button("Import To...").clicked() { + begin_import_to(world); + } + }); + } else if let Some(AssetSelection::SubAsset { label, kind, .. }) = selection.clone() { + ui.add( + egui::Label::new(format!( + "Selected: {}: {}", + subasset_kind_label(kind), + label + )) + .truncate(), + ); + ui.horizontal_wrapped(|ui| match kind { + AssetSubAssetKind::Mesh => { + if selected_embedded + .as_ref() + .is_some_and(|embedded| embedded.requires_skinned_hierarchy) + { + if ui.button("Place Skinned Model").clicked() { + if let Some(selection) = selection.as_ref() { + place_subasset_operator(world, selection.clone(), Vec3::ZERO); + } + } + } else if ui.button("Place At Origin").clicked() { + if let Some(selection) = selection.as_ref() { + place_subasset_operator(world, selection.clone(), Vec3::ZERO); + } + } + } + AssetSubAssetKind::Texture => { + if ui.button("Apply Texture To Selection").clicked() { + if let Some(asset) = texture_asset_from_subasset_selection(world, &selection) { + apply_texture_operator(world, asset, selected_entities); + } + } + } + AssetSubAssetKind::Material => { + ui.small(egui::RichText::new("Embedded source material").color(TEXT_DIM)); + } + AssetSubAssetKind::Skeleton => { + ui.small(egui::RichText::new("Inspect-only rig metadata").color(TEXT_DIM)); + } + AssetSubAssetKind::AnimationClip => { + let animated_actor = selected_entities + .as_slice() + .iter() + .copied() + .find(|entity| world.get::(*entity).is_some()); + let action = if animated_actor.is_some() { + "Assign To Selected Actor" + } else { + "Create Animated Actor" + }; + if ui.button(action).clicked() { + if let Some(selection) = selection.as_ref() { + if let Some(entity) = animated_actor { + assign_animation_clip_operator(world, selection.clone(), entity); + } else { + place_subasset_operator(world, selection.clone(), Vec3::ZERO); + } + } + } + } + }); + } else if let Some(asset) = world.resource::().selected_asset().cloned() { + ui.add(egui::Label::new(format!("Selected: {}", asset_label(&asset))).truncate()); + ui.horizontal_wrapped(|ui| { + if matches!(asset.kind, EditorAssetKind::Texture) + && ui.button("Apply Texture To Selection").clicked() + { + apply_texture_operator(world, asset.clone(), selected_entities); + } + if matches!( + asset.kind, + EditorAssetKind::Primitive(_) + | EditorAssetKind::Light(_) + | EditorAssetKind::Model + | EditorAssetKind::AudioClip + | EditorAssetKind::Prefab + ) && ui.button("Place At Origin").clicked() + { + place_asset_operator(world, asset.clone(), Vec3::ZERO); + } + if matches!(asset.kind, EditorAssetKind::Level) && ui.button("Open Scene").clicked() { + open_level_asset(world, &asset); + } + }); + } else { + ui.label(egui::RichText::new("No asset selected").color(TEXT_DIM)); + } +} + +pub(super) fn folder_tree_branch( + world: &mut World, + ui: &mut egui::Ui, + folders: &[FolderSnapshot], + node_path: &str, + depth: usize, + current_folder: &str, +) { + let Some(folder) = folders.iter().find(|folder| folder.path == node_path) else { + return; + }; + let path = &folder.path; + let name = &folder.name; + let children: Vec<&FolderSnapshot> = folders + .iter() + .filter(|child| child.parent.as_deref() == Some(path.as_str())) + .collect(); + let expanded = children.is_empty() + || world + .resource::() + .expanded_folders + .contains(path); + + let selected = current_folder == *path; + ui.horizontal(|ui| { + ui.add_space(depth as f32 * 12.0); + if children.is_empty() { + ui.add_sized( + [18.0, 20.0], + egui::Label::new(icon_text(icons::DOT_OUTLINE, 12.0).color(TEXT_DIM)), + ); + } else { + let icon = if expanded { + icons::CARET_DOWN + } else { + icons::CARET_RIGHT + }; + if ui + .add_sized( + [18.0, 18.0], + egui::Button::new(icon_text(icon, 12.0)).frame(false), + ) + .clicked() + { + let mut state = world.resource_mut::(); + if expanded { + state.expanded_folders.remove(path); + } else { + state.expanded_folders.insert(path.clone()); + } + } + } + ui.label(icon_text(icons::FOLDER, 14.0).color(TEXT_DIM)); + let folder_response = ui.add_sized( + [fit_width(ui, 72.0, f32::INFINITY), 20.0], + egui::Button::selectable(selected, name.as_str()), + ); + if folder_response.clicked() { + navigate_content_folder(world, path.clone()); + } + if folder_response.secondary_clicked() { + prepare_context_menu_selection(world, AssetSelection::Folder(path.clone())); + } + folder_response.context_menu(|ui| folder_context_menu(world, ui, folder)); + handle_asset_drop_to_folder(world, ui, &folder_response, path); + }); + + if expanded { + for child in children { + folder_tree_branch(world, ui, folders, &child.path, depth + 1, current_folder); + } + } +} + +pub(super) fn child_folders_for_content( + folders: &[FolderSnapshot], + current_folder: &str, + search: &str, +) -> Vec { + if !search.trim().is_empty() { + return Vec::new(); + } + let mut children: Vec = folders + .iter() + .filter(|folder| folder.parent.as_deref() == Some(current_folder)) + .cloned() + .collect(); + children.sort_by(|a, b| natural_cmp(&a.name, &b.name)); + children +} + +pub(super) fn visible_assets( + assets: &[AssetRow], + current_folder: &str, + state: &AssetBrowserStateSnapshot, +) -> Vec { + let search = state.search.trim().to_ascii_lowercase(); + let mut rows: Vec = assets + .iter() + .filter(|row| { + if state.recursive { + row.asset.folder_path == current_folder + || row + .asset + .folder_path + .strip_prefix(current_folder) + .is_some_and(|rest| rest.starts_with('/')) + } else { + row.asset.folder_path == current_folder + } + }) + .filter(|row| asset_matches_kind_filter(&row.asset, state.kind_filter)) + .filter(|row| { + search.is_empty() + || row.asset.label.to_ascii_lowercase().contains(&search) + || row + .asset + .path + .as_deref() + .unwrap_or_default() + .to_ascii_lowercase() + .contains(&search) + }) + .cloned() + .collect(); + + rows.sort_by(|a, b| match state.sort { + AssetSort::Name => natural_cmp(&a.asset.label, &b.asset.label), + AssetSort::Kind => kind_label(&a.asset.kind).cmp(kind_label(&b.asset.kind)), + AssetSort::Modified => b.modified.cmp(&a.modified), + AssetSort::Size => b.file_size.cmp(&a.file_size), + }); + rows +} + +pub(super) fn visible_selection_order( + folders: &[FolderSnapshot], + assets: &[AssetRow], +) -> Vec { + folders + .iter() + .map(|folder| AssetSelection::Folder(folder.path.clone())) + .chain(assets.iter().map(|row| row.selection.clone())) + .collect() +} + +pub(super) fn apply_content_click_selection( + world: &mut World, + ui: &egui::Ui, + selection: AssetSelection, + visible_order: &[AssetSelection], +) { + let modifiers = ui.input(|input| input.modifiers); + let mut assets = world.resource_mut::(); + if modifiers.shift { + assets.select_range(selection, visible_order, modifiers.command); + } else if modifiers.command { + assets.toggle_selection(selection); + } else { + assets.select(selection); + } +} + +pub(super) fn handle_content_shortcuts( + world: &mut World, + ctx: &egui::Context, + visible_order: &[AssetSelection], + content_contains_pointer: bool, +) { + if !content_contains_pointer + || ctx.egui_wants_keyboard_input() + || ctx.any_popup_open() + || content_browser_modal_active(world) + { + return; + } + let (select_all, copy, cut, paste, duplicate, new_folder, undo, rename, delete) = + ctx.input(|input| { + let modifiers = input.modifiers; + let command_only = modifiers.command && !modifiers.shift && !modifiers.alt; + let command_shift = modifiers.command && modifiers.shift && !modifiers.alt; + let no_modifiers = + !modifiers.command && !modifiers.ctrl && !modifiers.shift && !modifiers.alt; + ( + command_only && input.key_pressed(egui::Key::A), + command_only && input.key_pressed(egui::Key::C), + command_only && input.key_pressed(egui::Key::X), + command_only && input.key_pressed(egui::Key::V), + command_only && input.key_pressed(egui::Key::D), + command_shift && input.key_pressed(egui::Key::N), + command_only && input.key_pressed(egui::Key::Z), + no_modifiers && input.key_pressed(egui::Key::F2), + no_modifiers && input.key_pressed(egui::Key::Delete), + ) + }); + let consumed = if select_all { + Some((egui::Modifiers::COMMAND, egui::Key::A)) + } else if copy { + Some((egui::Modifiers::COMMAND, egui::Key::C)) + } else if cut { + Some((egui::Modifiers::COMMAND, egui::Key::X)) + } else if paste { + Some((egui::Modifiers::COMMAND, egui::Key::V)) + } else if duplicate { + Some((egui::Modifiers::COMMAND, egui::Key::D)) + } else if new_folder { + Some(( + egui::Modifiers::COMMAND | egui::Modifiers::SHIFT, + egui::Key::N, + )) + } else if undo { + Some((egui::Modifiers::COMMAND, egui::Key::Z)) + } else if rename { + Some((egui::Modifiers::NONE, egui::Key::F2)) + } else if delete { + Some((egui::Modifiers::NONE, egui::Key::Delete)) + } else { + None + }; + if let Some((modifiers, key)) = consumed { + ctx.input_mut(|input| { + input.consume_key(modifiers, key); + }); + } + if select_all { + world + .resource_mut::() + .select_all(visible_order); + } else if copy { + set_content_clipboard(world, false); + } else if cut { + set_content_clipboard(world, true); + } else if paste { + paste_content_clipboard(world); + } else if duplicate { + duplicate_selection(world); + } else if new_folder { + let current_folder = world.resource::().current_folder.clone(); + if current_folder != BUILTINS_FOLDER { + begin_new_folder(world, current_folder); + } + } else if undo { + undo_last_content_operation(world); + } else if rename { + begin_rename(world); + } else if delete { + request_delete_for_selection(world); + } +} + +pub(super) fn content_browser_modal_active(world: &World) -> bool { + let state = world.resource::(); + state.pending_delete.is_some() + || state.pending_path_edit.is_some() + || state.pending_content_transaction.is_some() + || state.pending_import_destination.is_some() + || state.pending_gltf_extraction.is_some() + || state.pending_pbr_grouping.is_some() + || state.show_trash + || world + .get_resource::() + .is_some_and(|pending| pending.0.is_some()) + || world + .get_resource::() + .and_then(|pending| pending.review.as_ref()) + .is_some_and(|review| review.open) +} diff --git a/crates/editor/src/ui/asset_browser/panel/pbr_transactions.rs b/crates/editor/src/ui/asset_browser/panel/pbr_transactions.rs new file mode 100644 index 0000000..be5d4c5 --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/pbr_transactions.rs @@ -0,0 +1,595 @@ +use super::*; + +pub(super) fn assign_extracted_material_to_actor_slot( + world: &mut World, + target: &GltfMaterialExtractionTarget, + reference: MaterialRef, +) -> Result<(), String> { + use crate::history::reflected_component_transaction; + + if let Some(mut primitive) = world.get::(target.entity).cloned() { + if primitive.surface.id == target.slot_id { + primitive.surface.material = Some(reference); + return reflected_component_transaction( + world, + target.entity, + "Extract and Assign Material", + shared::AUTHORING_COMPONENT_PRIMITIVE, + shared::COMPONENT_PRIMITIVE, + move |world, entity| { + world.entity_mut(entity).insert(primitive); + Ok(()) + }, + ); + } + } + if let Some(mut renderer) = world + .get::(target.entity) + .cloned() + { + if let Some(slot) = renderer.materials.slot_mut(&target.slot_id) { + slot.material = Some(reference); + return reflected_component_transaction( + world, + target.entity, + "Extract and Assign Material", + shared::AUTHORING_COMPONENT_STATIC_MESH_RENDERER, + shared::COMPONENT_STATIC_MESH_RENDERER, + move |world, entity| { + world.entity_mut(entity).insert(renderer); + Ok(()) + }, + ); + } + } + if let Some(mut renderer) = world + .get::(target.entity) + .cloned() + { + if let Some(slot) = renderer.materials.slot_mut(&target.slot_id) { + slot.material = Some(reference); + return reflected_component_transaction( + world, + target.entity, + "Extract and Assign Material", + shared::AUTHORING_COMPONENT_SKINNED_MESH_RENDERER, + shared::COMPONENT_SKINNED_MESH_RENDERER, + move |world, entity| { + world.entity_mut(entity).insert(renderer); + Ok(()) + }, + ); + } + } + Err("The actor or exact material slot changed before assignment".into()) +} + +pub(super) fn bind_extracted_material_slots( + document: &mut AssetRegistryDocument, + source: &str, + manifest: &crate::assets::static_mesh::StaticMeshManifest, + bindings: &[ExtractedMaterialBinding], +) -> Result { + let material_bindings = bindings + .iter() + .map(|binding| { + let record = document + .records + .iter() + .find(|record| record.path == binding.path) + .ok_or_else(|| { + format!("Extracted Material was not registered: {}", binding.path) + })?; + let expected_source_id = + material_id_from_label(&format!("Material{}", binding.source_index)); + let reference = MaterialRef::new( + EditorAssetRef::new(record.id.as_string(), "", record.label.clone()) + .with_source_path(record.path.clone()), + ); + Ok((expected_source_id, reference)) + }) + .collect::, String>>()?; + let model = document + .records + .iter_mut() + .find(|record| record.path == source) + .ok_or_else(|| format!("Model is not registered: {source}"))?; + let settings = model + .import_settings + .model_mut() + .ok_or_else(|| format!("Asset is not a model: {source}"))?; + let mut mapped_slots = 0; + for part in &manifest.parts { + let Some((_, reference)) = material_bindings.iter().find(|(source_id, _)| { + part_effective_material_id(part).as_deref() == Some(source_id.as_str()) + }) else { + continue; + }; + let slot_id = shared::ComponentInstanceId::new(format!("slot:{}", part_effective_id(part))); + let selection = ModelMaterialSelection::Project(reference.clone()); + if let Some(existing) = settings + .material_slots + .iter_mut() + .find(|entry| entry.slot_id == slot_id) + { + existing.selection = selection; + } else { + settings + .material_slots + .push(ModelMaterialSlotSelection { slot_id, selection }); + } + mapped_slots += 1; + } + settings + .material_slots + .sort_by(|left, right| left.slot_id.0.cmp(&right.slot_id.0)); + Ok(mapped_slots) +} + +pub(super) fn refresh_extracted_model_artifacts( + world: &mut World, + source: &str, +) -> Result<(), String> { + let mut registry = world.resource_mut::(); + let record = find_asset_mut_by_path(&mut registry, source) + .ok_or_else(|| format!("Model is no longer registered: {source}"))?; + refresh_model_artifacts(record)?; + save_registry(®istry)?; + registry.index_dirty = false; + Ok(()) +} + +pub(super) fn begin_pbr_grouping(world: &mut World, folder: String) { + let paths = match fs::read_dir(&folder) { + Ok(entries) => entries + .filter_map(Result::ok) + .filter_map(|entry| { + entry + .file_type() + .ok() + .filter(|kind| kind.is_file()) + .map(|_| entry.path()) + }) + .collect::>(), + Err(error) => { + world.resource_mut::().status = + format!("Could not inspect {folder} for PBR textures: {error}"); + return; + } + }; + let groups = content_pipeline::detect_pbr_texture_groups(paths); + let textures = groups + .into_iter() + .flat_map(|group| { + group + .textures + .into_iter() + .map(move |texture| PbrTextureDraft { + path: texture.path.to_string_lossy().replace('\\', "/"), + target: group.key.clone(), + role: texture.role, + confidence: texture.confidence, + included: texture.role != content_pipeline::PbrTextureRole::Unknown, + }) + }) + .collect::>(); + if textures.is_empty() { + world.resource_mut::().status = + format!("No supported texture files found directly in {folder}"); + return; + } + world + .resource_mut::() + .pending_pbr_grouping = Some(PbrGroupingDraft { folder, textures }); +} + +pub(super) fn draw_pbr_grouping_modal(world: &mut World, ctx: &egui::Context) { + let Some(mut draft) = world + .resource::() + .pending_pbr_grouping + .clone() + else { + return; + }; + let mut cancel = false; + let mut create = false; + egui::Window::new("Create PBR Materials From Folder") + .collapsible(false) + .resizable(true) + .default_width(820.0) + .min_width(620.0) + .show(ctx, |ui| { + ui.label(format!("Source folder: {}", draft.folder)); + ui.small( + egui::RichText::new( + "Review detected maps. Edit Target to merge or split material groups; unresolved files remain visible but are excluded by default.", + ) + .color(TEXT_DIM), + ); + ui.separator(); + egui::Grid::new("pbr_grouping_review") + .num_columns(5) + .striped(true) + .spacing([10.0, 6.0]) + .show(ui, |ui| { + ui.strong("Use"); + ui.strong("Texture"); + ui.strong("Target"); + ui.strong("Role"); + ui.strong("Confidence"); + ui.end_row(); + for (index, texture) in draft.textures.iter_mut().enumerate() { + ui.checkbox(&mut texture.included, ""); + let name = Path::new(&texture.path) + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or(&texture.path); + ui.add(egui::Label::new(name).truncate()).on_hover_text(&texture.path); + ui.add_sized([170.0, 20.0], egui::TextEdit::singleline(&mut texture.target)); + egui::ComboBox::from_id_salt(("pbr_role", index)) + .selected_text(texture.role.label()) + .show_ui(ui, |ui| { + for role in content_pipeline::PbrTextureRole::ALL { + ui.selectable_value(&mut texture.role, role, role.label()); + } + }); + ui.label(pbr_confidence_label(texture.confidence)); + ui.end_row(); + } + }); + ui.separator(); + let group_count = pbr_draft_group_count(&draft); + let valid = group_count > 0 + && draft.textures.iter().filter(|texture| texture.included).all(|texture| { + valid_content_name(&texture.target) + && texture.role != content_pipeline::PbrTextureRole::Unknown + }); + ui.horizontal(|ui| { + if ui.button("Cancel").clicked() { + cancel = true; + } + if ui + .add_enabled( + valid, + egui::Button::new(format!("Create {group_count} Material(s)")), + ) + .clicked() + { + create = true; + } + }); + if !valid { + ui.small( + egui::RichText::new( + "Included rows need a valid Target and a resolved texture role.", + ) + .color(WARNING), + ); + } + }); + + if cancel { + world + .resource_mut::() + .pending_pbr_grouping = None; + } else if create { + match create_pbr_materials(world, &draft) { + Ok(()) => { + world + .resource_mut::() + .pending_pbr_grouping = None; + } + Err(error) => { + world.resource_mut::().status = error; + world + .resource_mut::() + .pending_pbr_grouping = Some(draft); + } + } + } else { + world + .resource_mut::() + .pending_pbr_grouping = Some(draft); + } +} + +pub(super) fn pbr_confidence_label( + confidence: content_pipeline::PbrMatchConfidence, +) -> &'static str { + match confidence { + content_pipeline::PbrMatchConfidence::High => "High", + content_pipeline::PbrMatchConfidence::Medium => "Medium", + content_pipeline::PbrMatchConfidence::Low => "Low", + content_pipeline::PbrMatchConfidence::Unresolved => "Unresolved", + } +} + +pub(super) fn pbr_draft_group_count(draft: &PbrGroupingDraft) -> usize { + draft + .textures + .iter() + .filter(|texture| texture.included) + .map(|texture| texture.target.trim()) + .collect::>() + .len() +} + +pub(super) fn create_pbr_materials( + world: &mut World, + draft: &PbrGroupingDraft, +) -> Result<(), String> { + let mut groups: BTreeMap> = BTreeMap::new(); + for texture in draft.textures.iter().filter(|texture| texture.included) { + if !valid_content_name(&texture.target) + || texture.role == content_pipeline::PbrTextureRole::Unknown + { + return Err("Every included texture needs a valid target and resolved role".into()); + } + groups + .entry(texture.target.trim().to_string()) + .or_default() + .push(texture); + } + if groups.is_empty() { + return Err("Select at least one texture before creating materials".into()); + } + + let records = world + .resource::() + .records + .clone(); + let mut reserved = HashSet::new(); + let mut operations = Vec::new(); + for (target, textures) in groups { + let destination = unique_material_destination(&draft.folder, &target, &mut reserved); + let asset = material_asset_from_pbr_group(&target, &textures, &records); + let ron = ron::ser::to_string_pretty(&asset, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("Could not serialize material {target}: {error}"))?; + operations.push(content_pipeline::ContentOperation::WriteFile { + path: PathBuf::from(destination), + bytes: ron.into_bytes(), + }); + } + if !commit_content_operations(world, operations) { + return Err(world.resource::().status.clone()); + } + Ok(()) +} + +pub(super) fn unique_material_destination( + folder: &str, + target: &str, + reserved: &mut HashSet, +) -> String { + let stem = target + .trim() + .chars() + .map(|character| { + if character.is_ascii_alphanumeric() || matches!(character, '-' | '_') { + character + } else { + '_' + } + }) + .collect::(); + let stem = stem.trim_matches('_'); + let stem = if stem.is_empty() { "Material" } else { stem }; + for suffix in 1.. { + let file = if suffix == 1 { + format!("{stem}.material.ron") + } else { + format!("{stem}_{suffix}.material.ron") + }; + let path = Path::new(folder) + .join(file) + .to_string_lossy() + .replace('\\', "/"); + if !Path::new(&path).exists() && reserved.insert(path.clone()) { + return path; + } + } + unreachable!() +} + +pub(super) fn material_asset_from_pbr_group( + target: &str, + textures: &[&PbrTextureDraft], + records: &[crate::asset_db::AssetRecord], +) -> MaterialAsset { + let mut material = MaterialDesc::default(); + for texture in textures { + match texture.role { + content_pipeline::PbrTextureRole::BaseColor => { + material.base_color_texture = Some(texture.path.clone()); + } + content_pipeline::PbrTextureRole::Normal => { + material.normal_map_texture = Some(texture.path.clone()); + } + content_pipeline::PbrTextureRole::PackedOrm => { + material.metallic_roughness_texture = Some(texture.path.clone()); + material.textures.push(MaterialTextureBinding { + name: "occlusion_texture".into(), + texture: Some(pbr_texture_reference(&texture.path, records)), + channel: TextureChannel::R, + }); + } + content_pipeline::PbrTextureRole::Roughness => { + material.textures.push(MaterialTextureBinding { + name: "roughness_texture".into(), + texture: Some(pbr_texture_reference(&texture.path, records)), + channel: TextureChannel::G, + }); + } + content_pipeline::PbrTextureRole::Metallic => { + material.textures.push(MaterialTextureBinding { + name: "metallic_texture".into(), + texture: Some(pbr_texture_reference(&texture.path, records)), + channel: TextureChannel::B, + }); + } + content_pipeline::PbrTextureRole::Occlusion => { + material.textures.push(MaterialTextureBinding { + name: "occlusion_texture".into(), + texture: Some(pbr_texture_reference(&texture.path, records)), + channel: TextureChannel::R, + }); + } + content_pipeline::PbrTextureRole::Height => { + material.textures.push(MaterialTextureBinding { + name: "height_texture".into(), + texture: Some(pbr_texture_reference(&texture.path, records)), + channel: TextureChannel::R, + }); + } + content_pipeline::PbrTextureRole::Unknown => {} + } + } + MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: target.replace(['_', '-'], " "), + shader: material.shader.clone(), + shader_ref: None, + render_state: shared::MaterialRenderState::default(), + provenance: None, + inputs: MaterialInputSet::from_material_desc(&material), + } +} + +pub(super) fn pbr_texture_reference( + path: &str, + records: &[crate::asset_db::AssetRecord], +) -> EditorAssetRef { + let label = Path::new(path) + .file_stem() + .and_then(|stem| stem.to_str()) + .unwrap_or("Texture"); + let id = records + .iter() + .find(|record| record.path == path) + .map(|record| record.id.as_string()) + .unwrap_or_default(); + EditorAssetRef::new(id, "texture:source", label).with_source_path(path) +} + +pub(super) fn commit_content_operations( + world: &mut World, + operations: Vec, +) -> bool { + commit_content_operations_internal(world, operations, true) +} + +pub(super) fn commit_content_operations_internal( + world: &mut World, + operations: Vec, + record_undo: bool, +) -> bool { + commit_content_operations_internal_with_registry_update(world, operations, record_undo, |_| { + Ok(()) + }) +} + +pub(super) fn commit_content_operations_internal_with_registry_update( + world: &mut World, + operations: Vec, + record_undo: bool, + registry_update: impl FnOnce(&mut AssetRegistryDocument) -> Result<(), String>, +) -> bool { + let previous_folder = world.resource::().current_folder.clone(); + let mut resulting_folder = previous_folder.clone(); + for operation in &operations { + if let content_pipeline::ContentOperation::Move { + source, + destination, + } = operation + { + let source = source.to_string_lossy().replace('\\', "/"); + let destination = destination.to_string_lossy().replace('\\', "/"); + if resulting_folder == source + || resulting_folder + .strip_prefix(&source) + .is_some_and(|suffix| suffix.starts_with('/')) + { + resulting_folder = format!("{destination}{}", &resulting_folder[source.len()..]); + } + } + } + let mut document = world + .resource::() + .document(); + let preview = match content_pipeline::preview_transaction(Path::new("."), operations, &document) + { + Ok(preview) => preview, + Err(error) => { + world.resource_mut::().status = format!("Content operation blocked: {error}"); + return false; + } + }; + if !preview.is_committable() { + world.resource_mut::().status = format!( + "Content operation has {} collision(s)", + preview.collisions.len() + ); + return false; + } + crate::assets::begin_content_watch_transaction(world); + let commit_result = content_pipeline::commit_transaction_with_registry_update( + Path::new("."), + &preview, + &mut document, + registry_update, + ); + crate::assets::end_content_watch_transaction(world); + if let Err(error) = commit_result { + world.resource_mut::().status = error; + return false; + } + let undo_entry = record_undo + .then(|| build_content_undo_entry(Path::new("."), &preview)) + .flatten(); + { + let mut registry = world.resource_mut::(); + registry.schema_version = document.schema_version; + registry.defaults = document.defaults; + registry.records = document.records; + registry.index_dirty = false; + registry.migration_required = false; + } + let resulting_selections: Vec = preview + .operations + .iter() + .map(|operation| match operation { + content_pipeline::ContentOperation::CreateFolder { path } => { + AssetSelection::Folder(path.to_string_lossy().replace('\\', "/")) + } + content_pipeline::ContentOperation::Move { destination, .. } + | content_pipeline::ContentOperation::Copy { destination, .. } => { + let normalized = destination.to_string_lossy().replace('\\', "/"); + if Path::new(&normalized).is_dir() { + AssetSelection::Folder(normalized) + } else { + AssetSelection::File(normalized) + } + } + content_pipeline::ContentOperation::WriteFile { path, .. } + | content_pipeline::ContentOperation::ReplaceFile { path, .. } => { + AssetSelection::File(path.to_string_lossy().replace('\\', "/")) + } + }) + .collect(); + { + let mut assets = world.resource_mut::(); + assets.current_folder = resulting_folder; + assets.refresh(); + assets.select_all(&resulting_selections); + } + invalidate_on_catalog_refresh(world); + if let Some(entry) = undo_entry { + push_content_undo(world, entry); + } + world.resource_mut::().status = format!( + "Content transaction committed ({} item(s), {} reference rewrite(s))", + preview.operations.len(), + preview.reference_rewrites.len() + ); + true +} diff --git a/crates/editor/src/ui/asset_browser/panel/tests/a.rs b/crates/editor/src/ui/asset_browser/panel/tests/a.rs new file mode 100644 index 0000000..6098b93 --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/tests/a.rs @@ -0,0 +1,455 @@ + fn content_navigation_fixture() -> EditorAssets { + let props = AssetSelection::Folder("assets/Props".into()); + EditorAssets { + folders: vec![ + crate::assets::AssetFolder { + path: "assets".into(), + name: "assets".into(), + parent: None, + }, + crate::assets::AssetFolder { + path: "assets/Props".into(), + name: "Props".into(), + parent: Some("assets".into()), + }, + ], + assets: Vec::new(), + current_folder: "assets".into(), + selected: Some(props.clone()), + selections: vec![props.clone()], + selection_anchor: Some(props.clone()), + dragging: Some(props), + status: String::new(), + catalog_revision: 1, + } + } + + #[test] + fn folder_navigation_clears_hidden_selection_and_drag_state() { + let mut world = World::new(); + world.insert_resource(content_navigation_fixture()); + + navigate_content_folder(&mut world, "assets/Props".into()); + + let assets = world.resource::(); + assert_eq!(assets.current_folder, "assets/Props"); + assert!(assets.selected.is_none()); + assert!(assets.selections.is_empty()); + assert!(assets.selection_anchor.is_none()); + assert!(assets.dragging.is_none()); + } + + #[test] + fn visibility_filter_changes_clear_hidden_selection_but_noops_preserve_it() { + let mut world = World::new(); + world.insert_resource(content_navigation_fixture()); + + clear_selection_when_visible_results_change(&mut world, false); + assert_eq!(world.resource::().selections.len(), 1); + + clear_selection_when_visible_results_change(&mut world, true); + let assets = world.resource::(); + assert!(assets.selected.is_none()); + assert!(assets.selections.is_empty()); + assert_eq!( + assets.status, + "Selection cleared because visible results changed" + ); + } + + #[test] + fn context_targeting_preserves_selected_batches_and_selects_unselected_subassets() { + let mut world = World::new(); + let mut assets = content_navigation_fixture(); + assets.assets.push(EditorAsset { + label: "Desk".into(), + path: Some("assets/desk.glb".into()), + folder_path: "assets".into(), + kind: EditorAssetKind::Model, + }); + let folder = AssetSelection::Folder("assets/Props".into()); + let model = AssetSelection::File("assets/desk.glb".into()); + assets.select_all(&[folder.clone(), model.clone()]); + world.insert_resource(assets); + + prepare_context_menu_selection(&mut world, model); + assert_eq!(world.resource::().selections.len(), 2); + + let subasset = AssetSelection::SubAsset { + parent_path: "assets/desk.glb".into(), + sub_asset_id: "mesh:0".into(), + label: "Desk Top".into(), + kind: AssetSubAssetKind::Mesh, + source_path: None, + }; + prepare_context_menu_selection(&mut world, subasset.clone()); + let assets = world.resource::(); + assert_eq!(assets.selected, Some(subasset.clone())); + assert_eq!(assets.selections, vec![subasset]); + } + + #[test] + fn batch_selection_counts_distinguish_nested_and_non_filesystem_items() { + let mut world = World::new(); + let mut assets = content_navigation_fixture(); + assets.assets.extend([ + EditorAsset { + label: "Desk".into(), + path: Some("assets/Props/desk.glb".into()), + folder_path: "assets/Props".into(), + kind: EditorAssetKind::Model, + }, + EditorAsset { + label: "Cube".into(), + path: None, + folder_path: BUILTINS_FOLDER.into(), + kind: EditorAssetKind::Primitive(shared::PrimitiveShape::Box), + }, + ]); + assets.selections = vec![ + AssetSelection::Folder("assets/Props".into()), + AssetSelection::File("assets/Props/desk.glb".into()), + AssetSelection::SubAsset { + parent_path: "assets/Props/desk.glb".into(), + sub_asset_id: "mesh:0".into(), + label: "Desk Top".into(), + kind: AssetSubAssetKind::Mesh, + source_path: None, + }, + AssetSelection::Builtin("Cube".into()), + ]; + assets.selected = assets.selections.last().cloned(); + world.insert_resource(assets); + + assert_eq!(selected_content_paths(&world), vec!["assets/Props"]); + assert_eq!(collapsed_and_unaffected_selection_counts(&world), (1, 2)); + } + + #[test] + fn cancelling_reviewed_content_transaction_restores_browser_and_scene_state() { + let mut world = World::new(); + let mut assets = content_navigation_fixture(); + assets.status = "Before review".into(); + world.insert_resource(assets); + let mut scene_io = SceneIo::default(); + scene_io.status = "Scene status before review".into(); + world.insert_resource(scene_io); + let snapshot = capture_content_browser_snapshot(&world); + let pending = PendingContentTransaction { + preview: content_pipeline::ContentTransactionPreview { + operations: Vec::new(), + affected_asset_ids: Vec::new(), + reference_rewrites: Vec::new(), + collisions: Vec::new(), + }, + guarded_paths: Vec::new(), + clear_cut_clipboard: false, + clear_drag: false, + browser_snapshot: snapshot.clone(), + }; + + { + let mut assets = world.resource_mut::(); + assets.current_folder = "assets/Changed".into(); + assets.clear_selection(); + assets.dragging = None; + assets.status = "Review open".into(); + } + world.resource_mut::().status = "Transaction review".into(); + restore_cancelled_content_transaction(&mut world, &pending); + + let assets = world.resource::(); + assert_eq!(assets.current_folder, snapshot.current_folder); + assert_eq!(assets.selected, snapshot.selected); + assert_eq!(assets.selections, snapshot.selections); + assert_eq!(assets.selection_anchor, snapshot.selection_anchor); + assert_eq!(assets.dragging, snapshot.dragging); + assert_eq!(assets.status, snapshot.asset_status); + assert_eq!(world.resource::().status, snapshot.scene_status); + } + + #[test] + fn cancelling_drag_review_restores_selection_but_clears_stale_drag() { + let mut world = World::new(); + world.insert_resource(content_navigation_fixture()); + world.insert_resource(SceneIo::default()); + let pending = PendingContentTransaction { + preview: content_pipeline::ContentTransactionPreview { + operations: Vec::new(), + affected_asset_ids: Vec::new(), + reference_rewrites: Vec::new(), + collisions: Vec::new(), + }, + guarded_paths: Vec::new(), + clear_cut_clipboard: false, + clear_drag: true, + browser_snapshot: capture_content_browser_snapshot(&world), + }; + + restore_cancelled_content_transaction(&mut world, &pending); + + let assets = world.resource::(); + assert!(assets.selected.is_some()); + assert_eq!(assets.selections.len(), 1); + assert!(assets.dragging.is_none()); + } + + #[test] + fn reviewed_model_import_rolls_back_files_when_artifact_processing_fails() { + let root = std::env::temp_dir().join(format!( + "blacksite-reviewed-model-import-{}", + uuid::Uuid::new_v4() + )); + let project = root.join("project"); + let destination = PathBuf::from("assets/Target"); + fs::create_dir_all(project.join(&destination)).unwrap(); + let source = root.join("broken.gltf"); + fs::write( + &source, + r#"{"asset":{"version":"2.0"},"buffers":[{"uri":"mesh.bin","byteLength":12}]}"#, + ) + .unwrap(); + fs::write(root.join("mesh.bin"), [0_u8]).unwrap(); + let plan = crate::assets::plan_external_assets_import_at( + &project, + std::slice::from_ref(&source), + &destination, + ) + .unwrap(); + let mut world = World::new(); + world.insert_resource(AssetRegistry::default()); + + let error = commit_reviewed_asset_import(&mut world, &plan).unwrap_err(); + + assert!(error.contains("processing rolled back")); + assert!(!project.join("assets/Target/broken.gltf").exists()); + assert!(!project.join("assets/Target/mesh.bin").exists()); + assert!(!project.join(content_pipeline::REGISTRY_PATH).exists()); + assert!(!project + .join(content_pipeline::RUNTIME_CATALOG_PATH) + .exists()); + assert!(world.resource::().records.is_empty()); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn import_to_keeps_browser_location_and_pins_explicit_destination() { + let mut world = World::new(); + let mut assets = content_navigation_fixture(); + assets.current_folder = "assets/Props".into(); + world.insert_resource(assets); + world.insert_resource(AssetBrowserUiState::default()); + world.init_resource::(); + + begin_import_to(&mut world); + + assert_eq!( + world + .resource::() + .pending_import_destination + .as_deref(), + Some("assets/Props") + ); + request_import_to_destination(&mut world, "assets/Props".into()); + assert_eq!( + world.resource::().request, + Some(SceneIoRequest::ImportAssets { + destination: "assets/Props".into() + }) + ); + assert_eq!( + world.resource::().current_folder, + "assets/Props" + ); + } + + #[test] + fn locating_content_asset_navigates_to_parent_and_selects_the_file() { + let mut world = World::new(); + let mut assets = content_navigation_fixture(); + assets.assets.push(EditorAsset { + label: "Desk".into(), + path: Some("assets/Props/desk.material.ron".into()), + folder_path: "assets/Props".into(), + kind: EditorAssetKind::Material, + }); + world.insert_resource(assets); + + locate_content_asset(&mut world, "assets/Props/desk.material.ron"); + + let assets = world.resource::(); + assert_eq!(assets.current_folder, "assets/Props"); + assert_eq!( + assets.selected, + Some(AssetSelection::File( + "assets/Props/desk.material.ron".into() + )) + ); + assert_eq!(assets.selections, vec![assets.selected.clone().unwrap()]); + assert_eq!(assets.status, "Located assets/Props/desk.material.ron"); + } + + #[test] + fn locating_missing_content_asset_reports_the_broken_reference() { + let mut world = World::new(); + world.insert_resource(content_navigation_fixture()); + + locate_content_asset(&mut world, "assets/Props/missing.material.ron"); + + let assets = world.resource::(); + assert_eq!(assets.current_folder, "assets"); + assert!(assets.selected.is_some()); + assert_eq!( + assets.status, + "Referenced project asset is missing: assets/Props/missing.material.ron" + ); + } + + #[test] + fn model_material_clear_restores_source_and_removes_only_target_orphan() { + let active_slot = shared::ComponentInstanceId::new("slot:active"); + let removed_orphan = shared::ComponentInstanceId::new("slot:removed"); + let retained_orphan = shared::ComponentInstanceId::new("slot:retained"); + let material = MaterialRef::new( + EditorAssetRef::new("material-id", "", "Desk") + .with_source_path("assets/Props/desk.material.ron"), + ); + let mut settings = ImportSettings { + material_slots: vec![ModelMaterialSlotSelection { + slot_id: active_slot.clone(), + selection: ModelMaterialSelection::Project(material.clone()), + }], + orphaned_material_slots: vec![ + shared::OrphanedModelMaterialSelection { + slot_id: removed_orphan.clone(), + last_known_name: "Removed".into(), + material: material.clone(), + }, + shared::OrphanedModelMaterialSelection { + slot_id: retained_orphan.clone(), + last_known_name: "Retained".into(), + material, + }, + ], + ..Default::default() + }; + + set_model_material_slot_selection( + &mut settings, + &active_slot, + ModelMaterialSelection::Source, + ); + assert!(clear_orphaned_model_material_selection( + &mut settings, + &removed_orphan + )); + + assert!(matches!( + settings.material_slots[0].selection, + ModelMaterialSelection::Source + )); + assert_eq!(settings.orphaned_material_slots.len(), 1); + assert_eq!(settings.orphaned_material_slots[0].slot_id, retained_orphan); + assert!(!clear_orphaned_model_material_selection( + &mut settings, + &removed_orphan + )); + } + + #[test] + fn rename_target_never_falls_back_to_an_unselected_current_folder() { + let mut assets = content_navigation_fixture(); + assets.current_folder = "assets/Props".into(); + assets.clear_selection(); + let mut world = World::new(); + world.insert_resource(assets); + + assert_eq!(selected_content_path(&world), None); + } + + #[test] + fn embedded_subassets_never_become_filesystem_operation_targets() { + let selection = AssetSelection::SubAsset { + parent_path: "assets/Props/desk.glb".into(), + sub_asset_id: "mesh:top".into(), + label: "Desk Top".into(), + kind: AssetSubAssetKind::Mesh, + source_path: None, + }; + let mut assets = content_navigation_fixture(); + assets.assets.push(EditorAsset { + label: "Desk".into(), + path: Some("assets/Props/desk.glb".into()), + folder_path: "assets/Props".into(), + kind: EditorAssetKind::Model, + }); + assets.selected = Some(selection.clone()); + assets.selections = vec![selection]; + let mut world = World::new(); + world.insert_resource(assets); + + assert_eq!(selected_content_path(&world), None); + assert!(selected_content_paths(&world).is_empty()); + assert!(build_delete_request(&world).is_none()); + } + + #[test] + fn details_width_respects_content_and_pane_minimums() { + assert_eq!(details_width_for_layout(1_000.0, 220.0, 100.0), 200.0); + assert_eq!(details_width_for_layout(1_000.0, 220.0, 900.0), 600.0); + assert_eq!(details_width_for_layout(1_000.0, 220.0, 420.0), 420.0); + } + + #[test] + fn details_width_uses_reclaimed_tree_space() { + assert_eq!(details_width_for_layout(1_000.0, 0.0, 900.0), 830.0); + } + + #[test] + fn content_shortcuts_are_suppressed_while_a_browser_modal_is_active() { + let mut world = World::new(); + world.insert_resource(AssetBrowserUiState::default()); + assert!(!content_browser_modal_active(&world)); + + world + .resource_mut::() + .pending_path_edit = Some(ContentPathEdit { + kind: ContentPathEditKind::NewFolder { + parent: "assets".into(), + }, + name: "New Folder".into(), + }); + + assert!(content_browser_modal_active(&world)); + } + + #[test] + fn external_move_review_requires_complete_non_reused_identity_choices() { + let fingerprint = shared::AssetSourceFingerprint::from_bytes(b"matching source"); + let conflict = |new_path: &str| content_pipeline::ExternalMoveConflict { + new_path: new_path.into(), + candidate_paths: vec!["assets/Old/A.png".into(), "assets/Old/B.png".into()], + kind: shared::AssetKind::Texture, + fingerprint: fingerprint.clone(), + }; + let mut review = crate::assets::ExternalMoveRepairReview { + root: PathBuf::from("/unused"), + previous: shared::AssetRegistryDocument::default(), + conflicts: vec![conflict("assets/New/A.png"), conflict("assets/New/B.png")], + choices: vec![None, None], + open: true, + }; + + assert!(!external_move_choices_valid(&review)); + review.choices = vec![ + Some(ExternalMoveRepairChoice::Preserve( + "assets/Old/A.png".into(), + )), + Some(ExternalMoveRepairChoice::Preserve( + "assets/Old/A.png".into(), + )), + ]; + assert!(!external_move_choices_valid(&review)); + review.choices[1] = Some(ExternalMoveRepairChoice::RegisterNew); + assert!(external_move_choices_valid(&review)); + } diff --git a/crates/editor/src/ui/asset_browser/panel/tests/b.rs b/crates/editor/src/ui/asset_browser/panel/tests/b.rs new file mode 100644 index 0000000..bd0875f --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/tests/b.rs @@ -0,0 +1,481 @@ +#[test] + fn cut_paste_keeps_exact_target_name_so_collisions_reach_review() { + let mut reserved = HashSet::new(); + let source = Path::new("assets/Props/desk.material.ron"); + let destination = + paste_destination(Path::new("assets/Archive"), source, true, &mut reserved); + + assert_eq!( + destination, + PathBuf::from("assets/Archive/desk.material.ron") + ); + assert!(reserved.is_empty()); + } + + #[test] + fn created_content_undo_is_trash_first_and_fingerprint_guarded() { + let root = std::env::temp_dir().join(format!( + "blacksite-content-create-undo-{}", + uuid::Uuid::new_v4() + )); + let created = PathBuf::from("assets/Props/New Folder"); + fs::create_dir_all(root.join(&created)).unwrap(); + let preview = content_pipeline::ContentTransactionPreview { + operations: vec![content_pipeline::ContentOperation::CreateFolder { + path: created.clone(), + }], + affected_asset_ids: Vec::new(), + reference_rewrites: Vec::new(), + collisions: Vec::new(), + }; + + let undo = build_content_undo_entry(&root, &preview).unwrap(); + + assert!(matches!( + &undo.action, + ContentUndoAction::TrashCreated(paths) if paths == std::slice::from_ref(&created) + )); + assert_eq!(first_changed_content_undo_source(&root, &undo), None); + fs::write(root.join(&created).join("external.txt"), b"external").unwrap(); + assert_eq!( + first_changed_content_undo_source(&root, &undo), + Some(created) + ); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn copied_content_undo_targets_only_the_created_destination() { + let root = std::env::temp_dir().join(format!( + "blacksite-content-copy-undo-{}", + uuid::Uuid::new_v4() + )); + let source = PathBuf::from("assets/Props/source.txt"); + let destination = PathBuf::from("assets/Props/source_copy.txt"); + fs::create_dir_all(root.join("assets/Props")).unwrap(); + fs::write(root.join(&source), b"source").unwrap(); + fs::write(root.join(&destination), b"source").unwrap(); + let preview = content_pipeline::ContentTransactionPreview { + operations: vec![content_pipeline::ContentOperation::Copy { + source: source.clone(), + destination: destination.clone(), + }], + affected_asset_ids: Vec::new(), + reference_rewrites: Vec::new(), + collisions: Vec::new(), + }; + + let undo = build_content_undo_entry(&root, &preview).unwrap(); + + assert!(matches!( + &undo.action, + ContentUndoAction::TrashCreated(paths) if paths == &[destination] + )); + assert_eq!(fs::read(root.join(source)).unwrap(), b"source"); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn trash_restore_undo_is_guarded_by_the_complete_batch() { + let root = std::env::temp_dir().join(format!( + "blacksite-content-trash-undo-{}", + uuid::Uuid::new_v4() + )); + let batch = PathBuf::from("assets/.trash/test-batch"); + fs::create_dir_all(root.join(&batch).join("assets/Props")).unwrap(); + fs::write(root.join(&batch).join("assets/Props/item.txt"), b"item").unwrap(); + let fingerprint = content_pipeline::tree_fingerprint(&root.join(&batch)).unwrap(); + let undo = ContentUndoEntry { + label: "Move Item to Trash".into(), + action: ContentUndoAction::RestoreTrash(batch.clone()), + guarded_sources: vec![(batch.clone(), fingerprint)], + }; + + assert_eq!(first_changed_content_undo_source(&root, &undo), None); + fs::write(root.join(&batch).join("assets/Props/item.txt"), b"external").unwrap(); + assert_eq!(first_changed_content_undo_source(&root, &undo), Some(batch)); + fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn manual_trash_restore_forgets_only_its_matching_undo_entry() { + let matching = PathBuf::from("assets/.trash/matching"); + let other = PathBuf::from("assets/.trash/other"); + let mut state = AssetBrowserUiState { + content_undo: vec![ + ContentUndoEntry { + label: "Move A to Trash".into(), + action: ContentUndoAction::RestoreTrash(matching.clone()), + guarded_sources: Vec::new(), + }, + ContentUndoEntry { + label: "Move B to Trash".into(), + action: ContentUndoAction::RestoreTrash(other.clone()), + guarded_sources: Vec::new(), + }, + ], + ..Default::default() + }; + + forget_restored_trash_undo(&mut state, &matching); + + assert_eq!(state.content_undo.len(), 1); + assert!(matches!( + &state.content_undo[0].action, + ContentUndoAction::RestoreTrash(path) if path == &other + )); + } + + #[test] + fn audio_filter_matches_only_audio_clips() { + let audio = EditorAsset { + label: "Impact".into(), + path: Some("assets/audio/impact.ogg".into()), + folder_path: "assets/audio".into(), + kind: EditorAssetKind::AudioClip, + }; + let texture = EditorAsset { + kind: EditorAssetKind::Texture, + ..audio.clone() + }; + + assert!(asset_matches_kind_filter(&audio, AssetKindFilter::Audio)); + assert!(!asset_matches_kind_filter(&texture, AssetKindFilter::Audio)); + assert_eq!(kind_filter_label(AssetKindFilter::Audio), "Audio"); + } + + #[test] + fn audio_details_label_supported_formats() { + assert_eq!(audio_format_label("assets/audio/music.oga"), "Ogg audio"); + assert_eq!(audio_format_label("assets/audio/voice.spx"), "Speex"); + assert_eq!(audio_format_label("assets/audio/source.WAV"), "WAV"); + assert_eq!(audio_format_label("assets/audio/source.mp3"), "MP3"); + assert_eq!(audio_format_label("assets/audio/source.flac"), "FLAC"); + } + + #[test] + fn pbr_grouping_builds_standard_and_surface_texture_bindings() { + let base = PbrTextureDraft { + path: "assets/Props/desk_diff_2k.jpg".into(), + target: "desk".into(), + role: content_pipeline::PbrTextureRole::BaseColor, + confidence: content_pipeline::PbrMatchConfidence::High, + included: true, + }; + let normal = PbrTextureDraft { + path: "assets/Props/desk_nor_gl_2k.jpg".into(), + role: content_pipeline::PbrTextureRole::Normal, + ..base.clone() + }; + let arm = PbrTextureDraft { + path: "assets/Props/desk_arm_2k.jpg".into(), + role: content_pipeline::PbrTextureRole::PackedOrm, + ..base.clone() + }; + let asset = material_asset_from_pbr_group("desk", &[&base, &normal, &arm], &[]); + let mut material = MaterialDesc::default(); + asset.inputs.apply_to_material_desc(&mut material); + + assert_eq!( + material.base_color_texture.as_deref(), + Some("assets/Props/desk_diff_2k.jpg") + ); + assert_eq!( + material.normal_map_texture.as_deref(), + Some("assets/Props/desk_nor_gl_2k.jpg") + ); + assert_eq!( + material.metallic_roughness_texture.as_deref(), + Some("assets/Props/desk_arm_2k.jpg") + ); + assert!(material + .textures + .iter() + .any(|binding| binding.name == "occlusion_texture")); + } + + #[test] + fn pbr_group_count_reflects_manual_merge_and_exclusions() { + let draft = PbrGroupingDraft { + folder: "assets/Props".into(), + textures: vec![ + PbrTextureDraft { + path: "assets/Props/a.png".into(), + target: "shared".into(), + role: content_pipeline::PbrTextureRole::BaseColor, + confidence: content_pipeline::PbrMatchConfidence::High, + included: true, + }, + PbrTextureDraft { + path: "assets/Props/b.png".into(), + target: "shared".into(), + role: content_pipeline::PbrTextureRole::Normal, + confidence: content_pipeline::PbrMatchConfidence::High, + included: true, + }, + PbrTextureDraft { + path: "assets/Props/c.png".into(), + target: "ignored".into(), + role: content_pipeline::PbrTextureRole::Unknown, + confidence: content_pipeline::PbrMatchConfidence::Unresolved, + included: false, + }, + ], + }; + + assert_eq!(pbr_draft_group_count(&draft), 1); + } + + #[test] + fn gltf_extraction_review_rejects_duplicate_and_external_paths() { + let asset = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Desk".into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: Default::default(), + provenance: Some(shared::MaterialProvenance { + source_path: "assets/desk.gltf".into(), + source_fingerprint: "abc".into(), + source_sub_asset_id: "material:0".into(), + source_label: "Desk".into(), + }), + inputs: Default::default(), + }; + let entry = GltfMaterialExtractionEntry { + included: true, + source_index: 0, + source_name: "Desk".into(), + path: format!( + "assets/extraction-review-{}/desk.material.ron", + uuid::Uuid::new_v4() + ), + asset: asset.clone(), + write_mode: MaterialExtractionWriteMode::CreateNew, + }; + let mut draft = GltfMaterialExtractionDraft { + source: "assets/desk.gltf".into(), + destination: "assets".into(), + materials: vec![entry.clone()], + actor_target: None, + }; + assert_eq!(gltf_extraction_validation_error(&draft), None); + + draft.materials.push(GltfMaterialExtractionEntry { + source_index: 1, + ..entry + }); + assert!(gltf_extraction_validation_error(&draft) + .is_some_and(|error| error.contains("same project path"))); + + draft.materials.truncate(1); + draft.materials[0].path = "../outside.material.ron".into(); + assert!(gltf_extraction_validation_error(&draft) + .is_some_and(|error| error.contains("Invalid project path"))); + } + + #[test] + fn gltf_extraction_existing_material_requires_reviewed_guarded_apply() { + let folder = PathBuf::from(format!( + "assets/.extraction-review-{}", + uuid::Uuid::new_v4() + )); + fs::create_dir_all(&folder).unwrap(); + let path = folder.join("desk.material.ron"); + let provenance = shared::MaterialProvenance { + source_path: "assets/desk.gltf".into(), + source_fingerprint: "old".into(), + source_sub_asset_id: "material:0".into(), + source_label: "Desk".into(), + }; + let existing = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Locally Edited Desk".into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: Default::default(), + provenance: Some(provenance.clone()), + inputs: Default::default(), + }; + fs::write(&path, ron::ser::to_string(&existing).unwrap()).unwrap(); + let mut incoming = existing.clone(); + incoming.label = "Desk".into(); + incoming.provenance.as_mut().unwrap().source_fingerprint = "new".into(); + let entry = GltfMaterialExtractionEntry { + included: true, + source_index: 0, + source_name: "Desk".into(), + path: path.to_string_lossy().replace('\\', "/"), + asset: incoming, + write_mode: MaterialExtractionWriteMode::Undecided, + }; + let mut draft = GltfMaterialExtractionDraft { + source: provenance.source_path, + destination: folder.to_string_lossy().replace('\\', "/"), + materials: vec![entry], + actor_target: None, + }; + + assert!(gltf_extraction_validation_error(&draft) + .is_some_and(|error| error.contains("choose Apply or Create New"))); + let review = review_existing_extraction_target(&draft.materials[0]) + .unwrap() + .unwrap(); + assert!(review.provenance_matches); + assert!(review.changes.contains(&"label")); + assert!(review.changes.contains(&"source revision")); + draft.materials[0].write_mode = MaterialExtractionWriteMode::ApplyExisting { + expected_fingerprint: review.fingerprint, + previous_bytes: review.bytes, + }; + assert_eq!(gltf_extraction_validation_error(&draft), None); + + fs::write(&path, "external edit").unwrap(); + assert!(gltf_extraction_validation_error(&draft).is_some()); + fs::remove_dir_all(folder).unwrap(); + } + + #[test] + fn actor_extraction_assignment_changes_only_the_exact_primitive_slot() { + let mut app = App::new(); + app.add_plugins(shared::SharedTypesPlugin); + app.init_resource::(); + let entity = app + .world_mut() + .spawn(( + shared::LevelObject, + shared::ActorKind::StaticMesh, + shared::Primitive::default(), + )) + .id(); + let target = GltfMaterialExtractionTarget { + entity, + slot_id: shared::ComponentInstanceId::new(shared::PRIMITIVE_SURFACE_SLOT_ID), + source_sub_asset_id: "material:0".into(), + }; + let reference = MaterialRef::new( + EditorAssetRef::new("material-id", "material:source", "Desk") + .with_source_path("assets/Props/desk.material.ron"), + ); + + validate_actor_material_extraction_target(app.world(), &target).unwrap(); + assign_extracted_material_to_actor_slot(app.world_mut(), &target, reference.clone()) + .unwrap(); + + assert_eq!( + app.world() + .get::(entity) + .unwrap() + .surface + .material + .as_ref(), + Some(&reference) + ); + assert!(app + .world() + .resource::() + .can_undo()); + } + + #[test] + fn extracted_material_binding_maps_every_draw_slot_using_the_source_material() { + use crate::assets::static_mesh::{ + StaticMeshImportSnapshot, StaticMeshManifest, StaticMeshMetadata, StaticMeshPart, + StaticMeshSource, + }; + + let model_path = "assets/Props/desk.gltf"; + let material_path = "assets/Props/desk.material.ron"; + let material_id = shared::AssetId::new(); + let mut document = AssetRegistryDocument { + records: vec![ + shared::AssetRecord { + id: shared::AssetId::new(), + path: model_path.into(), + label: "Desk".into(), + kind: AssetKind::Model, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::Model(ImportSettings::default()), + dependencies: Vec::new(), + }, + shared::AssetRecord { + id: material_id.clone(), + path: material_path.into(), + label: "Desk Steel".into(), + kind: AssetKind::Material, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::None, + dependencies: Vec::new(), + }, + ], + ..Default::default() + }; + let part = |id: &str, material_index: usize| StaticMeshPart { + id: id.into(), + name: id.into(), + mesh_label: format!("Mesh{material_index}/Primitive0"), + material_id: Some(material_id_from_label(&format!("Material{material_index}"))), + material_slot_name: "Desk Steel".into(), + material_label: Some(format!("Material{material_index}")), + local_transform: Transform::default(), + source_node: None, + source_mesh: None, + source_material: Some("Desk Steel".into()), + skinned: false, + }; + let manifest = StaticMeshManifest { + schema_version: crate::assets::static_mesh::STATIC_MESH_MANIFEST_SCHEMA, + asset_id: document.records[0].id.as_string(), + label: "Desk".into(), + source: StaticMeshSource { + path: model_path.into(), + format: "gltf".into(), + fingerprint: shared::AssetSourceFingerprint::from_bytes(b"desk"), + dependencies: Vec::new(), + }, + import: StaticMeshImportSnapshot { + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: ModelPlacementMode::StaticAsset, + hierarchy_mode: ModelHierarchyMode::SingleActor, + material_policy: Default::default(), + material_slots: Vec::new(), + orphaned_material_slots: Vec::new(), + }, + metadata: StaticMeshMetadata { + mesh_count: 3, + material_count: 2, + node_count: 3, + animation_count: 0, + skin_count: 0, + light_count: 0, + camera_count: 0, + }, + parts: vec![part("draw:a", 0), part("draw:b", 0), part("draw:c", 1)], + warnings: Vec::new(), + }; + + let mapped = bind_extracted_material_slots( + &mut document, + model_path, + &manifest, + &[ExtractedMaterialBinding { + source_index: 0, + path: material_path.into(), + }], + ) + .unwrap(); + + assert_eq!(mapped, 2); + let slots = &document.records[0].model_import().material_slots; + assert_eq!(slots.len(), 2); + assert!(slots.iter().all(|slot| { + matches!( + &slot.selection, + ModelMaterialSelection::Project(reference) + if reference.0.asset_id == material_id.as_string() + && reference.0.source_path.as_deref() == Some(material_path) + ) + })); + } diff --git a/crates/editor/src/ui/asset_browser/panel/toolbar_import.rs b/crates/editor/src/ui/asset_browser/panel/toolbar_import.rs new file mode 100644 index 0000000..bb49b72 --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/toolbar_import.rs @@ -0,0 +1,557 @@ +use super::*; + +pub(super) fn asset_toolbar(world: &mut World, ui: &mut egui::Ui) { + let current_folder = world.resource::().current_folder.clone(); + let selection_count = world.resource::().selections.len(); + let has_editable_selection = !selected_content_paths(world).is_empty(); + let can_rename = selection_count == 1 && has_editable_selection; + ui.horizontal(|ui| { + if icon_button_small(ui, icons::ARROWS_CLOCKWISE, "Refresh").clicked() { + crate::assets::refresh_content_browser(world); + } + let pending_repairs = world + .get_resource::() + .and_then(|pending| pending.review.as_ref()) + .map_or(0, |review| review.conflicts.len()); + if ui + .add_enabled( + pending_repairs > 0, + egui::Button::new(format!("Resolve Moves ({pending_repairs})")), + ) + .on_hover_text("Choose which stable asset identities match ambiguous external moves") + .clicked() + { + if let Some(review) = world + .resource_mut::() + .review + .as_mut() + { + review.open = true; + } + } + if icon_button_small(ui, icons::UPLOAD, "Import Here").clicked() { + request_import_to_destination(world, current_folder.clone()); + } + if ui + .add_enabled( + current_folder != BUILTINS_FOLDER, + egui::Button::new("Import To..."), + ) + .clicked() + { + begin_import_to(world); + } + if icon_button_small(ui, icons::ARROW_UP, "Parent folder").clicked() { + navigate_to_parent(world); + } + if ui + .add_enabled( + current_folder != BUILTINS_FOLDER, + egui::Button::new("New Folder"), + ) + .clicked() + { + begin_new_folder(world, current_folder.clone()); + } + if ui + .add_enabled(can_rename, egui::Button::new("Rename")) + .clicked() + { + begin_rename(world); + } + if ui + .add_enabled(has_editable_selection, egui::Button::new("Duplicate")) + .clicked() + { + duplicate_selection(world); + } + let can_undo_content = !world + .resource::() + .content_undo + .is_empty(); + if ui + .add_enabled(can_undo_content, egui::Button::new("Undo Content")) + .clicked() + { + undo_last_content_operation(world); + } + if ui + .add_enabled(has_editable_selection, egui::Button::new("Cut")) + .clicked() + { + set_content_clipboard(world, true); + } + if ui + .add_enabled(has_editable_selection, egui::Button::new("Copy")) + .clicked() + { + set_content_clipboard(world, false); + } + let can_paste = world.resource::().clipboard.is_some() + && world.resource::().current_folder != BUILTINS_FOLDER; + if ui + .add_enabled(can_paste, egui::Button::new("Paste")) + .clicked() + { + paste_content_clipboard(world); + } + if ui.small_button("Open Trash").clicked() { + world.resource_mut::().show_trash = true; + } + + ui.separator(); + + let visible_results_changed = { + let mut state = world.resource_mut::(); + let mut visible_results_changed = ui + .add( + egui::TextEdit::singleline(&mut state.search) + .hint_text("Search assets...") + .desired_width(fit_width(ui, 120.0, 190.0)), + ) + .changed(); + visible_results_changed |= ui.checkbox(&mut state.recursive, "Subfolders").changed(); + + let previous_kind_filter = state.kind_filter; + egui::ComboBox::from_id_salt("asset_kind_filter") + .selected_text(kind_filter_label(state.kind_filter)) + .show_ui(ui, |ui| { + ui.selectable_value(&mut state.kind_filter, AssetKindFilter::All, "All"); + ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Model, "Models"); + ui.selectable_value( + &mut state.kind_filter, + AssetKindFilter::Texture, + "Textures", + ); + ui.selectable_value( + &mut state.kind_filter, + AssetKindFilter::Material, + "Materials", + ); + ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Audio, "Audio"); + ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Level, "Levels"); + ui.selectable_value(&mut state.kind_filter, AssetKindFilter::Prefab, "Prefabs"); + ui.selectable_value( + &mut state.kind_filter, + AssetKindFilter::Builtin, + "Built-ins", + ); + }); + visible_results_changed |= state.kind_filter != previous_kind_filter; + + egui::ComboBox::from_id_salt("asset_sort") + .selected_text(sort_label(state.sort)) + .show_ui(ui, |ui| { + ui.selectable_value(&mut state.sort, AssetSort::Name, "Name"); + ui.selectable_value(&mut state.sort, AssetSort::Kind, "Type"); + ui.selectable_value(&mut state.sort, AssetSort::Modified, "Modified"); + ui.selectable_value(&mut state.sort, AssetSort::Size, "Size"); + }); + + ui.separator(); + if tool_button( + ui, + icons::GRID_FOUR, + state.view == AssetBrowserView::Grid, + "Grid view", + ) + .clicked() + { + state.view = AssetBrowserView::Grid; + } + if tool_button( + ui, + icons::LIST, + state.view == AssetBrowserView::List, + "List view", + ) + .clicked() + { + state.view = AssetBrowserView::List; + } + if ui.available_width() > 180.0 { + ui.label(icon_text(icons::IMAGE_SQUARE, 13.0).color(TEXT_DIM)); + ui.add_sized( + [96.0, 20.0], + egui::Slider::new(&mut state.thumbnail_size, 48.0..=112.0).show_value(false), + ); + } + ui.checkbox(&mut state.show_details, "Details"); + visible_results_changed + }; + clear_selection_when_visible_results_change(world, visible_results_changed); + }); +} + +pub(super) fn clear_selection_when_visible_results_change(world: &mut World, changed: bool) { + if changed && !world.resource::().selections.is_empty() { + let mut assets = world.resource_mut::(); + assets.clear_selection(); + assets.status = "Selection cleared because visible results changed".into(); + } +} + +pub(super) fn request_import_to_destination(world: &mut World, destination: String) { + let destination = if destination == BUILTINS_FOLDER { + ASSETS_ROOT.to_string() + } else { + destination + }; + world.resource_mut::().request = Some(SceneIoRequest::ImportAssets { destination }); +} + +pub(super) fn begin_import_to(world: &mut World) { + let current = world.resource::().current_folder.clone(); + let destination = if current == BUILTINS_FOLDER { + ASSETS_ROOT.to_string() + } else { + current + }; + world + .resource_mut::() + .pending_import_destination = Some(destination); +} + +pub(super) fn draw_import_to_modal(world: &mut World, context: &egui::Context) { + let Some(selected) = world + .resource::() + .pending_import_destination + .clone() + else { + return; + }; + let mut folders = world + .resource::() + .folders + .iter() + .filter(|folder| { + folder.path == ASSETS_ROOT || folder.path.starts_with(&format!("{ASSETS_ROOT}/")) + }) + .map(|folder| (folder.path.clone(), folder.name.clone())) + .collect::>(); + folders.sort_by(|left, right| left.0.cmp(&right.0)); + let mut action = context + .input(|input| input.key_pressed(egui::Key::Escape)) + .then_some(false); + let mut next_selection = None; + egui::Window::new("Import To Project Folder") + .id(egui::Id::new("asset_browser_import_to")) + .collapsible(false) + .resizable(true) + .default_width(460.0) + .anchor(egui::Align2::CENTER_CENTER, egui::Vec2::ZERO) + .show(context, |ui| { + ui.label("Choose the destination beneath the managed project content root."); + ui.add_space(8.0); + egui::ScrollArea::vertical() + .id_salt("asset_browser_import_to_folders") + .max_height(320.0) + .auto_shrink([false, false]) + .show(ui, |ui| { + for (path, name) in &folders { + let depth = path.matches('/').count(); + ui.horizontal(|ui| { + ui.add_space(depth.saturating_sub(1) as f32 * 14.0); + if ui + .selectable_label(path == &selected, format!("{name} — {path}")) + .clicked() + { + next_selection = Some(path.clone()); + } + }); + } + }); + ui.add_space(8.0); + ui.label(format!("Destination: {selected}")); + ui.small( + egui::RichText::new( + "Imported files keep their source names here; safe dependency-relative bundle paths are preserved.", + ) + .color(TEXT_DIM), + ); + ui.add_space(12.0); + ui.horizontal(|ui| { + if ui.button("Cancel").clicked() { + action = Some(false); + } + if ui.button("Choose Files...").clicked() { + action = Some(true); + } + }); + }); + if let Some(next_selection) = next_selection { + world + .resource_mut::() + .pending_import_destination = Some(next_selection); + } + match action { + Some(true) => { + world + .resource_mut::() + .pending_import_destination = None; + request_import_to_destination(world, selected); + } + Some(false) => { + world + .resource_mut::() + .pending_import_destination = None; + } + None => {} + } +} + +pub(crate) fn draw_asset_import_review_modal(world: &mut World, context: &egui::Context) { + let Some(pending) = world + .resource::() + .0 + .clone() + else { + return; + }; + let plan = &pending.plan; + let mut action = context + .input(|input| input.key_pressed(egui::Key::Escape)) + .then_some(false); + egui::Window::new("Review Asset Import") + .id(egui::Id::new("asset_import_transaction_review")) + .collapsible(false) + .resizable(true) + .default_width(640.0) + .anchor(egui::Align2::CENTER_CENTER, egui::Vec2::ZERO) + .show(context, |ui| { + ui.label(format!("Destination: {}", plan.destination.display())); + ui.small( + egui::RichText::new( + "Every source dependency and final project path is fingerprinted before the batch publishes.", + ) + .color(TEXT_DIM), + ); + ui.add_space(8.0); + egui::ScrollArea::vertical() + .id_salt("asset_import_transaction_entries") + .max_height(360.0) + .auto_shrink([false, false]) + .show(ui, |ui| { + for entry in &plan.entries { + egui::Frame::new() + .fill(WIDGET_BG.linear_multiply(0.8)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) + .corner_radius(egui::CornerRadius::same(4)) + .inner_margin(egui::Margin::symmetric(8, 6)) + .show(ui, |ui| { + ui.label(egui::RichText::new(entry.source.display().to_string()).strong()); + if entry.adopt_in_place { + ui.small("Adopt existing project file in place"); + } else { + for target in &entry.targets { + ui.small(format!("→ {}", target.display())); + } + } + if entry.source_files.len() > 1 { + ui.small( + egui::RichText::new(format!( + "{} source bundle files", + entry.source_files.len() + )) + .color(TEXT_DIM), + ); + } + }); + ui.add_space(4.0); + } + }); + if !plan.conflicts.is_empty() { + ui.add_space(8.0); + ui.colored_label(egui::Color32::LIGHT_RED, "Resolve these collisions before import:"); + for conflict in &plan.conflicts { + ui.colored_label(egui::Color32::LIGHT_RED, format!("• {conflict}")); + } + } + ui.add_space(12.0); + ui.horizontal(|ui| { + if ui.button("Cancel").clicked() { + action = Some(false); + } + if ui + .add_enabled( + plan.can_commit(), + egui::Button::new(format!("Import {} Asset(s)", plan.imported_count())), + ) + .clicked() + { + action = Some(true); + } + }); + }); + match action { + Some(false) => { + world + .resource_mut::() + .0 = None; + world.resource_mut::().status = pending.previous_status; + } + Some(true) => match commit_reviewed_asset_import(world, plan) { + Ok(count) => { + world + .resource_mut::() + .0 = None; + world.resource_mut::().refresh(); + invalidate_on_catalog_refresh(world); + world.resource_mut::().status = format!("Imported {count} asset(s)"); + } + Err(error) => { + world.resource_mut::().status = format!("Import failed: {error}"); + } + }, + None => {} + } +} + +pub(super) fn commit_reviewed_asset_import( + world: &mut World, + plan: &crate::assets::ExternalAssetImportPlan, +) -> Result { + let previous = world.resource::().document(); + let imported_paths = plan + .entries + .iter() + .flat_map(|entry| entry.targets.iter()) + .map(|path| path.to_string_lossy().replace('\\', "/")) + .collect::>(); + let mut files_committed = false; + let mut publication_backups: Vec<(PathBuf, Option>)> = Vec::new(); + + crate::assets::begin_content_watch_transaction(world); + let result: Result<(usize, AssetRegistryDocument), String> = (|| { + let count = crate::assets::commit_external_assets_import(plan)?; + files_committed = true; + + let mut processed = content_pipeline::scan_project(&plan.project_root, &previous)?; + let mut model_plans = Vec::new(); + for record in processed.registry.records.iter_mut().filter(|record| { + record.kind == AssetKind::Model && imported_paths.contains(&record.path) + }) { + let model_plan = crate::assets::plan_model_artifacts_at(&plan.project_root, record) + .map_err(|error| { + format!("could not process imported model {}: {error}", record.path) + })?; + *record = model_plan.record.clone(); + model_plans.push(model_plan); + } + processed.runtime_catalog = shared::RuntimeContentCatalog::from(&processed.registry); + let mut texture_plans = Vec::new(); + for record in processed + .registry + .records + .iter() + .filter(|record| record.kind == AssetKind::Texture) + { + let texture_plan = content_pipeline::plan_texture_artifact(&plan.project_root, record) + .map_err(|error| format!("could not process Texture {}: {error}", record.path))?; + content_pipeline::apply_texture_plan_to_catalog( + &mut processed.runtime_catalog, + &record.id, + &texture_plan, + )?; + texture_plans.push(texture_plan); + } + let mut material_plans = Vec::new(); + for record in processed.registry.records.iter().filter(|record| { + matches!( + record.kind, + AssetKind::Material | AssetKind::MaterialInstance + ) + }) { + if let Some(material_plan) = content_pipeline::plan_material_artifact( + &plan.project_root, + record, + &processed.registry, + )? { + content_pipeline::apply_material_plan_to_catalog( + &mut processed.runtime_catalog, + &record.id, + &material_plan, + )?; + material_plans.push(material_plan); + } + } + + let mut publication_paths = model_plans + .iter() + .flat_map(|model_plan| { + [ + model_plan.static_path.clone(), + model_plan.animation_path.clone(), + ] + }) + .collect::>(); + publication_paths.extend( + texture_plans + .iter() + .map(|texture_plan| texture_plan.output_path.clone()), + ); + publication_paths.extend( + material_plans + .iter() + .map(|material_plan| material_plan.output_path.clone()), + ); + publication_paths.push(plan.project_root.join(content_pipeline::REGISTRY_PATH)); + publication_paths.push( + plan.project_root + .join(content_pipeline::RUNTIME_CATALOG_PATH), + ); + publication_paths.sort(); + publication_paths.dedup(); + publication_backups = publication_paths + .iter() + .map(|path| (path.clone(), fs::read(path).ok())) + .collect(); + + for model_plan in &model_plans { + crate::assets::publish_model_artifacts(model_plan)?; + } + for texture_plan in &texture_plans { + content_pipeline::publish_texture_artifact(texture_plan)?; + } + for material_plan in &material_plans { + content_pipeline::publish_material_artifact(material_plan)?; + } + content_pipeline::publish_content_documents_with_catalog( + &plan.project_root, + &processed.registry, + &processed.runtime_catalog, + )?; + Ok((count, processed.registry)) + })(); + + let result = match result { + Ok((count, document)) => { + apply_registry_document(world, document); + Ok(count) + } + Err(error) => { + for (path, bytes) in publication_backups.iter().rev() { + restore_import_publication_file(path, bytes.as_deref()); + } + let rollback_error = files_committed + .then(|| crate::assets::rollback_external_assets_import(plan)) + .and_then(Result::err); + Err(match rollback_error { + Some(rollback_error) => format!( + "import processing failed: {error}; file rollback was incomplete: {rollback_error}" + ), + None => format!("import processing rolled back: {error}"), + }) + } + }; + crate::assets::end_content_watch_transaction(world); + result +} + +pub(super) fn restore_import_publication_file(path: &Path, bytes: Option<&[u8]>) { + if let Some(bytes) = bytes { + let _ = fs::write(path, bytes); + } else { + let _ = fs::remove_file(path); + } +} diff --git a/crates/editor/src/ui/asset_browser/panel/undo_trash.rs b/crates/editor/src/ui/asset_browser/panel/undo_trash.rs new file mode 100644 index 0000000..60b418a --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/undo_trash.rs @@ -0,0 +1,725 @@ +use super::*; + +pub(super) fn build_content_undo_entry( + project_root: &Path, + preview: &content_pipeline::ContentTransactionPreview, +) -> Option { + let all_replacements = preview.operations.iter().all(|operation| { + matches!( + operation, + content_pipeline::ContentOperation::ReplaceFile { .. } + ) + }); + let all_moves = preview + .operations + .iter() + .all(|operation| matches!(operation, content_pipeline::ContentOperation::Move { .. })); + let (label, action, guarded_paths) = if all_replacements { + let inverse_operations = preview + .operations + .iter() + .rev() + .filter_map(|operation| match operation { + content_pipeline::ContentOperation::ReplaceFile { + path, + bytes, + previous_bytes, + .. + } => Some(content_pipeline::ContentOperation::ReplaceFile { + path: path.clone(), + bytes: previous_bytes.clone(), + expected_fingerprint: content_pipeline::tree_fingerprint( + &project_root.join(path), + ) + .ok()?, + previous_bytes: bytes.clone(), + }), + _ => None, + }) + .collect::>(); + if inverse_operations.len() != preview.operations.len() { + return None; + } + let guarded_paths = inverse_operations + .iter() + .filter_map(|operation| match operation { + content_pipeline::ContentOperation::ReplaceFile { path, .. } => Some(path.clone()), + _ => None, + }) + .collect::>(); + ( + format!("Apply {} Material update(s)", inverse_operations.len()), + ContentUndoAction::Apply(inverse_operations), + guarded_paths, + ) + } else if all_moves { + let inverse_operations: Vec<_> = preview + .operations + .iter() + .rev() + .filter_map(|operation| match operation { + content_pipeline::ContentOperation::Move { + source, + destination, + } => Some(content_pipeline::ContentOperation::Move { + source: destination.clone(), + destination: source.clone(), + }), + _ => None, + }) + .collect(); + if inverse_operations.is_empty() { + return None; + } + let guarded_paths = inverse_operations + .iter() + .filter_map(|operation| match operation { + content_pipeline::ContentOperation::Move { source, .. } => Some(source.clone()), + _ => None, + }) + .collect::>(); + ( + format!("Move {} content item(s)", inverse_operations.len()), + ContentUndoAction::Apply(inverse_operations), + guarded_paths, + ) + } else { + let mut created_paths = Vec::with_capacity(preview.operations.len()); + let mut copy_count = 0; + let mut folder_count = 0; + for operation in &preview.operations { + match operation { + content_pipeline::ContentOperation::CreateFolder { path } => { + folder_count += 1; + created_paths.push(path.clone()); + } + content_pipeline::ContentOperation::Copy { destination, .. } => { + copy_count += 1; + created_paths.push(destination.clone()); + } + content_pipeline::ContentOperation::WriteFile { path, .. } => { + created_paths.push(path.clone()); + } + content_pipeline::ContentOperation::ReplaceFile { .. } => return None, + content_pipeline::ContentOperation::Move { .. } => return None, + } + } + if created_paths.is_empty() { + return None; + } + let label = if copy_count == preview.operations.len() { + format!("Copy {copy_count} content item(s)") + } else if folder_count == preview.operations.len() { + format!("Create {folder_count} folder(s)") + } else { + format!("Create {} content item(s)", created_paths.len()) + }; + ( + label, + ContentUndoAction::TrashCreated(created_paths.clone()), + created_paths, + ) + }; + let guarded_sources = guarded_paths + .into_iter() + .filter_map(|path| { + content_pipeline::tree_fingerprint(&project_root.join(&path)) + .ok() + .map(|fingerprint| (path, fingerprint)) + }) + .collect::>(); + let expected_guard_count = match &action { + ContentUndoAction::Apply(operations) => operations.len(), + ContentUndoAction::TrashCreated(paths) => paths.len(), + ContentUndoAction::RestoreTrash(_) => 1, + }; + (guarded_sources.len() == expected_guard_count).then_some(ContentUndoEntry { + label, + action, + guarded_sources, + }) +} + +pub(super) fn undo_last_content_operation(world: &mut World) { + let Some(entry) = world + .resource::() + .content_undo + .last() + .cloned() + else { + return; + }; + if let Some(path) = first_changed_content_undo_source(Path::new("."), &entry) { + world.resource_mut::().status = format!( + "Cannot undo {}: {} changed outside the transaction", + entry.label, + path.display() + ); + return; + } + let undone = match &entry.action { + ContentUndoAction::Apply(operations) => { + commit_content_operations_internal(world, operations.clone(), false) + } + ContentUndoAction::TrashCreated(paths) => trash_created_content_for_undo(world, paths), + ContentUndoAction::RestoreTrash(batch_path) => { + restore_trashed_content_for_undo(world, batch_path) + } + }; + if undone { + world + .resource_mut::() + .content_undo + .pop(); + world.resource_mut::().status = format!("Undid {}", entry.label); + } +} + +pub(super) fn first_changed_content_undo_source( + project_root: &Path, + entry: &ContentUndoEntry, +) -> Option { + entry.guarded_sources.iter().find_map(|(path, expected)| { + let actual = content_pipeline::tree_fingerprint(&project_root.join(path)); + (actual.as_deref() != Ok(expected.as_str())).then(|| path.clone()) + }) +} + +pub(super) fn trash_created_content_for_undo(world: &mut World, paths: &[PathBuf]) -> bool { + let mut document = world + .resource::() + .document(); + crate::assets::begin_content_watch_transaction(world); + let trash_result = content_pipeline::trash_content(Path::new("."), paths, &mut document); + crate::assets::end_content_watch_transaction(world); + if let Err(error) = trash_result { + world.resource_mut::().status = error; + return false; + } + apply_registry_document(world, document); + let current_folder = world.resource::().current_folder.clone(); + { + let mut assets = world.resource_mut::(); + assets.clear_selection(); + assets.refresh(); + if !Path::new(¤t_folder).is_dir() { + assets.current_folder = nearest_existing_content_folder(¤t_folder); + } + } + invalidate_on_catalog_refresh(world); + true +} + +pub(super) fn restore_trashed_content_for_undo(world: &mut World, batch_path: &Path) -> bool { + let mut document = world + .resource::() + .document(); + crate::assets::begin_content_watch_transaction(world); + let restore_result = + content_pipeline::restore_trash_batch(Path::new("."), batch_path, &mut document); + crate::assets::end_content_watch_transaction(world); + let restored = match restore_result { + Ok(restored) => restored, + Err(error) => { + world.resource_mut::().status = error; + return false; + } + }; + apply_registry_document(world, document); + let selections = restored + .original_paths + .iter() + .map(|path| { + if Path::new(path).is_dir() { + AssetSelection::Folder(path.clone()) + } else { + AssetSelection::File(path.clone()) + } + }) + .collect::>(); + { + let mut assets = world.resource_mut::(); + assets.refresh(); + assets.select_all(&selections); + } + invalidate_on_catalog_refresh(world); + true +} + +pub(super) fn nearest_existing_content_folder(folder: &str) -> String { + let mut candidate = Path::new(folder); + loop { + if candidate.is_dir() && candidate.starts_with(ASSETS_ROOT) { + return candidate.to_string_lossy().replace('\\', "/"); + } + let Some(parent) = candidate.parent() else { + return ASSETS_ROOT.into(); + }; + candidate = parent; + } +} + +pub(super) fn request_delete_for_asset(world: &mut World, asset: &EditorAsset) { + let selection = AssetSelection::from_asset(asset); + if !world.resource::().is_selected(&selection) { + world.resource_mut::().select(selection); + } + request_delete_for_selection(world); +} + +pub(super) fn request_delete_for_selection(world: &mut World) { + if let Some(request) = build_delete_request(world) { + world.resource_mut::().pending_delete = Some(request); + } +} + +pub(super) fn external_move_choices_valid( + review: &crate::assets::ExternalMoveRepairReview, +) -> bool { + if review.choices.len() != review.conflicts.len() || review.choices.iter().any(Option::is_none) + { + return false; + } + let mut preserved = HashSet::new(); + review + .conflicts + .iter() + .zip(&review.choices) + .all(|(conflict, choice)| match choice { + Some(ExternalMoveRepairChoice::Preserve(path)) => { + conflict.candidate_paths.contains(path) && preserved.insert(path) + } + Some(ExternalMoveRepairChoice::RegisterNew) => true, + None => false, + }) +} + +pub(super) fn draw_external_move_repair_modal(world: &mut World, ctx: &egui::Context) { + let Some(mut review) = world + .get_resource::() + .and_then(|pending| pending.review.clone()) + .filter(|review| review.open) + else { + return; + }; + let mut action = None; + egui::Window::new("Resolve Ambiguous External Moves") + .collapsible(false) + .resizable(true) + .default_width(620.0) + .show(ctx, |ui| { + ui.label( + "The same imported bytes match multiple missing registry records. Choose which stable identity moved to each new path.", + ); + ui.small( + egui::RichText::new( + "Register as New intentionally assigns a fresh ID. No registry or manifest changes are published until every row is resolved.", + ) + .color(TEXT_DIM), + ); + ui.separator(); + egui::ScrollArea::vertical() + .id_salt("external_move_repair_rows") + .max_height(420.0) + .auto_shrink([false, true]) + .show(ui, |ui| { + for (index, conflict) in review.conflicts.iter().enumerate() { + ui.group(|ui| { + ui.label(egui::RichText::new(&conflict.new_path).strong()); + ui.small(format!( + "{:?} · {} candidate identities", + conflict.kind, + conflict.candidate_paths.len() + )); + let selected_text = match review.choices.get(index).and_then(Option::as_ref) { + Some(ExternalMoveRepairChoice::Preserve(path)) => { + format!("Preserve ID from {path}") + } + Some(ExternalMoveRepairChoice::RegisterNew) => { + "Register as New Asset".into() + } + None => "Choose stable identity…".into(), + }; + egui::ComboBox::from_id_salt(("external_move_choice", index)) + .selected_text(selected_text) + .width(ui.available_width().max(240.0)) + .show_ui(ui, |ui| { + for candidate in &conflict.candidate_paths { + let used_elsewhere = review + .choices + .iter() + .enumerate() + .any(|(other_index, choice)| { + other_index != index + && choice.as_ref() + == Some(&ExternalMoveRepairChoice::Preserve( + candidate.clone(), + )) + }); + ui.add_enabled_ui(!used_elsewhere, |ui| { + ui.selectable_value( + &mut review.choices[index], + Some(ExternalMoveRepairChoice::Preserve( + candidate.clone(), + )), + format!("Preserve ID from {candidate}"), + ); + }); + } + ui.separator(); + ui.selectable_value( + &mut review.choices[index], + Some(ExternalMoveRepairChoice::RegisterNew), + "Register as New Asset", + ); + }); + }); + ui.add_space(6.0); + } + }); + ui.separator(); + ui.horizontal(|ui| { + if ui.button("Review Later").clicked() { + action = Some(false); + } + if ui + .add_enabled( + external_move_choices_valid(&review), + egui::Button::new("Apply Identity Repairs"), + ) + .clicked() + { + action = Some(true); + } + }); + }); + + match action { + Some(false) => review.open = false, + Some(true) => {} + None => {} + } + world.resource_mut::().review = Some(review); + if action == Some(true) { + if let Err(error) = crate::assets::commit_external_move_repairs(world) { + world.resource_mut::().status = + format!("External move repair failed: {error}"); + } + } +} + +pub(super) fn build_delete_request(world: &World) -> Option { + let assets = world.resource::(); + let selections: Vec = assets + .selections + .iter() + .filter(|selection| { + authored_content_path(selection) + .is_some_and(|path| !matches!(path, ASSETS_ROOT | BUILTINS_FOLDER)) + }) + .cloned() + .collect(); + if selections.is_empty() { + return None; + } + let selected_paths: Vec = selected_content_paths(world); + let mut files = selected_paths.clone(); + let mut warnings = Vec::new(); + for selection in &selections { + let Some(asset) = assets.asset_for_selection(selection) else { + continue; + }; + let Some(path) = asset.path.as_deref() else { + continue; + }; + if !matches!(asset.kind, EditorAssetKind::Model) { + continue; + } + if let Some(record) = world + .get_resource::() + .and_then(|registry| find_asset_by_path(registry, path)) + { + let settings = record.model_import(); + if let Some(manifest) = settings.static_mesh_manifest_path.clone() { + files.push(manifest); + } + if let Some(manifest) = settings.animation_manifest_path.clone() { + files.push(manifest); + } + if !record.dependencies.is_empty() { + warnings.push(format!( + "{} imported dependencies will be kept because they may be shared.", + record.dependencies.len() + )); + } + } + } + if let Some(registry) = world.get_resource::() { + let sources = selected_paths.iter().map(PathBuf::from).collect::>(); + match content_pipeline::find_reference_usages( + Path::new("."), + &sources, + ®istry.document(), + ) { + Ok(usages) if !usages.is_empty() => { + warnings.push(format!( + "{} external reference(s) will become unresolved:", + usages.len() + )); + warnings.extend( + usages + .into_iter() + .map(|usage| format!("{} — {}", usage.document.display(), usage.reference)), + ); + } + Ok(_) => {} + Err(error) => warnings.push(format!( + "Reference usage scan failed; review could be incomplete: {error}" + )), + } + } + dedup_strings(&mut files); + let label = if selections.len() == 1 { + selections[0].display_label().to_string() + } else { + format!("{} selected items", selections.len()) + }; + Some(AssetDeleteRequest { + label, + files, + warnings, + }) +} + +pub(super) fn draw_delete_modal(world: &mut World, ctx: &egui::Context) { + let pending = world + .resource::() + .pending_delete + .clone(); + let Some(request) = pending else { + return; + }; + let mut action = None; + egui::Window::new("Move Content To Trash") + .collapsible(false) + .resizable(false) + .default_width(360.0) + .show(ctx, |ui| { + ui.label(format!("Move {} to assets/.trash?", request.label)); + ui.separator(); + ui.label(panel_heading("Files")); + for file in &request.files { + ui.add(egui::Label::new(file).wrap()); + } + if !request.warnings.is_empty() { + ui.separator(); + ui.label(panel_heading("Warnings")); + for warning in &request.warnings { + ui.small(egui::RichText::new(warning).color(TEXT_DIM)); + } + } + ui.separator(); + ui.horizontal(|ui| { + if ui.button("Cancel").clicked() { + action = Some(false); + } + if ui.button("Move To Trash").clicked() { + action = Some(true); + } + }); + }); + + match action { + Some(false) => { + world.resource_mut::().pending_delete = None; + } + Some(true) => { + execute_delete_request(world, &request); + world.resource_mut::().pending_delete = None; + } + None => {} + } +} + +pub(super) fn draw_trash_modal(world: &mut World, ctx: &egui::Context) { + if !world.resource::().show_trash { + return; + } + let batches = content_pipeline::list_trash_batches(Path::new(".")); + let mut close = false; + let mut restore = None; + egui::Window::new("Content Trash") + .collapsible(false) + .resizable(true) + .default_width(520.0) + .min_width(380.0) + .show(ctx, |ui| { + ui.label("Restore a complete transaction to its original project paths."); + ui.small( + egui::RichText::new( + "Restore is blocked when a destination or stable registry ID is already in use.", + ) + .color(TEXT_DIM), + ); + ui.separator(); + match &batches { + Err(error) => { + ui.label(egui::RichText::new(error).color(ERROR)); + } + Ok(batches) if batches.is_empty() => { + ui.label(egui::RichText::new("Trash is empty.").color(TEXT_DIM)); + } + Ok(batches) => { + egui::ScrollArea::vertical() + .max_height(420.0) + .show(ui, |ui| { + for batch in batches { + egui::Frame::group(ui.style()).show(ui, |ui| { + ui.horizontal(|ui| { + ui.strong(&batch.batch_id); + ui.with_layout( + egui::Layout::right_to_left(egui::Align::Center), + |ui| { + if ui.button("Restore").clicked() { + restore = Some(batch.clone()); + } + }, + ); + }); + for path in &batch.original_paths { + ui.small(path); + } + }); + ui.add_space(4.0); + } + }); + } + } + ui.separator(); + if ui.button("Close").clicked() { + close = true; + } + }); + + if let Some(batch) = restore { + let mut document = world + .resource::() + .document(); + crate::assets::begin_content_watch_transaction(world); + let restore_result = + content_pipeline::restore_trash_batch(Path::new("."), &batch.path, &mut document); + crate::assets::end_content_watch_transaction(world); + match restore_result { + Ok(restored) => { + apply_registry_document(world, document); + forget_restored_trash_undo( + &mut world.resource_mut::(), + &batch.path, + ); + let selections = restored + .original_paths + .iter() + .map(|path| { + if Path::new(path).is_dir() { + AssetSelection::Folder(path.clone()) + } else { + AssetSelection::File(path.clone()) + } + }) + .collect::>(); + { + let mut assets = world.resource_mut::(); + assets.refresh(); + assets.select_all(&selections); + } + invalidate_on_catalog_refresh(world); + world.resource_mut::().status = format!( + "Restored {} content item(s) from Trash", + restored.original_paths.len() + ); + } + Err(error) => world.resource_mut::().status = error, + } + } + if close { + world.resource_mut::().show_trash = false; + } +} + +pub(super) fn forget_restored_trash_undo(state: &mut AssetBrowserUiState, batch_path: &Path) { + state.content_undo.retain(|entry| { + !matches!( + &entry.action, + ContentUndoAction::RestoreTrash(path) if path == batch_path + ) + }); +} + +pub(super) fn execute_delete_request(world: &mut World, request: &AssetDeleteRequest) { + let paths = request + .files + .iter() + .map(PathBuf::from) + .filter(|path| path.exists()) + .collect::>(); + let mut document = world + .resource::() + .document(); + crate::assets::begin_content_watch_transaction(world); + let trash_result = content_pipeline::trash_content(Path::new("."), &paths, &mut document); + crate::assets::end_content_watch_transaction(world); + let batch = match trash_result { + Ok(batch) => batch, + Err(error) => { + world.resource_mut::().status = error; + return; + } + }; + apply_registry_document(world, document); + + if let Ok(fingerprint) = content_pipeline::tree_fingerprint(&batch.path) { + push_content_undo( + world, + ContentUndoEntry { + label: format!("Move {} to Trash", request.label), + action: ContentUndoAction::RestoreTrash(batch.path.clone()), + guarded_sources: vec![(batch.path.clone(), fingerprint)], + }, + ); + } + + { + let mut assets = world.resource_mut::(); + assets.clear_selection(); + assets.refresh(); + } + invalidate_on_catalog_refresh(world); + world.resource_mut::().status = format!( + "Moved {} file(s) for {} to {} (restorable from Trash)", + paths.len(), + request.label, + batch.path.to_string_lossy() + ); +} + +pub(super) fn push_content_undo(world: &mut World, entry: ContentUndoEntry) { + let mut state = world.resource_mut::(); + state.content_undo.push(entry); + if state.content_undo.len() > 32 { + state.content_undo.remove(0); + } +} + +pub(super) fn apply_registry_document(world: &mut World, document: shared::AssetRegistryDocument) { + let mut registry = world.resource_mut::(); + registry.schema_version = document.schema_version; + registry.defaults = document.defaults; + registry.records = document.records; + registry.index_dirty = false; + registry.migration_required = false; +} + +pub(super) fn dedup_strings(values: &mut Vec) { + let mut seen = HashSet::new(); + values.retain(|value| seen.insert(value.clone())); +} diff --git a/crates/editor/src/ui/asset_browser/panel/utilities.rs b/crates/editor/src/ui/asset_browser/panel/utilities.rs new file mode 100644 index 0000000..ff719f5 --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/utilities.rs @@ -0,0 +1,761 @@ +use super::*; + +pub(super) fn empty_content(ui: &mut egui::Ui, search: &str) { + ui.add_space(24.0); + ui.vertical_centered(|ui| { + ui.label( + egui::RichText::new(icons::FOLDER_OPEN.as_str()).font(egui::FontId::new( + 28.0, + egui::FontFamily::Name("phosphor-regular".into()), + )), + ); + if search.trim().is_empty() { + ui.label(egui::RichText::new("Folder is empty").color(TEXT_DIM)); + } else { + ui.label(egui::RichText::new("No matching assets").color(TEXT_DIM)); + } + }); +} + +pub(super) fn navigate_to_parent(world: &mut World) { + let current = world.resource::().current_folder.clone(); + if let Some(parent) = current.rfind('/').map(|index| current[..index].to_string()) { + navigate_content_folder(world, parent); + } +} + +pub(super) fn navigate_content_folder(world: &mut World, folder: String) { + let mut assets = world.resource_mut::(); + assets.current_folder = folder.clone(); + assets.clear_selection(); + assets.clear_drag(); + assets.status = format!("Opened {folder}"); +} + +pub(super) fn locate_content_asset(world: &mut World, path: &str) { + let normalized = path.replace('\\', "/"); + let selection = AssetSelection::File(normalized.clone()); + if !world + .resource::() + .selection_exists(&selection) + { + let status = format!("Referenced project asset is missing: {normalized}"); + world.resource_mut::().status = status.clone(); + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = status; + } + return; + } + let parent = Path::new(&normalized) + .parent() + .map(|path| path.to_string_lossy().replace('\\', "/")) + .unwrap_or_else(|| ASSETS_ROOT.to_string()); + navigate_content_folder(world, parent); + let mut assets = world.resource_mut::(); + assets.select(selection); + assets.status = format!("Located {normalized}"); +} + +pub(super) fn asset_matches_kind_filter(asset: &EditorAsset, filter: AssetKindFilter) -> bool { + match filter { + AssetKindFilter::All => true, + AssetKindFilter::Model => matches!(asset.kind, EditorAssetKind::Model), + AssetKindFilter::Texture => matches!(asset.kind, EditorAssetKind::Texture), + AssetKindFilter::Material => matches!(asset.kind, EditorAssetKind::Material), + AssetKindFilter::Audio => matches!(asset.kind, EditorAssetKind::AudioClip), + AssetKindFilter::Level => matches!(asset.kind, EditorAssetKind::Level), + AssetKindFilter::Prefab => matches!(asset.kind, EditorAssetKind::Prefab), + AssetKindFilter::Builtin => asset.path.is_none(), + } +} + +pub(super) fn kind_filter_label(filter: AssetKindFilter) -> &'static str { + match filter { + AssetKindFilter::All => "All", + AssetKindFilter::Model => "Models", + AssetKindFilter::Texture => "Textures", + AssetKindFilter::Material => "Materials", + AssetKindFilter::Audio => "Audio", + AssetKindFilter::Level => "Levels", + AssetKindFilter::Prefab => "Prefabs", + AssetKindFilter::Builtin => "Built-ins", + } +} + +pub(super) fn sort_label(sort: AssetSort) -> &'static str { + match sort { + AssetSort::Name => "Name", + AssetSort::Kind => "Type", + AssetSort::Modified => "Modified", + AssetSort::Size => "Size", + } +} + +pub(super) fn kind_label(kind: &EditorAssetKind) -> &'static str { + match kind { + EditorAssetKind::Primitive(_) => "Primitive", + EditorAssetKind::Light(_) => "Light", + EditorAssetKind::Model => "Model", + EditorAssetKind::Texture => "Texture", + EditorAssetKind::Material => "Material", + EditorAssetKind::AudioClip => "Audio Clip", + EditorAssetKind::Level => "Level", + EditorAssetKind::Prefab => "Prefab", + EditorAssetKind::PostProcessVolume => "Post Process Volume", + EditorAssetKind::PostProcessEffect => "Post FX", + EditorAssetKind::RenderingProfile => "Rendering Profile", + EditorAssetKind::ShaderSchema => "Shader Schema", + } +} + +pub(super) fn file_size(path: &str) -> Option { + fs::metadata(path).ok().map(|metadata| metadata.len()) +} + +pub(super) fn audio_format_label(path: &str) -> &'static str { + match Path::new(path) + .extension() + .and_then(|extension| extension.to_str()) + .map(str::to_ascii_lowercase) + .as_deref() + { + Some("ogg" | "oga") => "Ogg audio", + Some("spx") => "Speex", + Some("wav") => "WAV", + Some("mp3") => "MP3", + Some("flac") => "FLAC", + _ => "Unknown", + } +} + +pub(super) fn modified_time(path: &str) -> Option { + fs::metadata(path) + .ok() + .and_then(|metadata| metadata.modified().ok()) +} + +pub(super) fn format_bytes(bytes: u64) -> String { + const KIB: f64 = 1024.0; + const MIB: f64 = KIB * 1024.0; + const GIB: f64 = MIB * 1024.0; + let bytes = bytes as f64; + if bytes >= GIB { + format!("{:.1} GB", bytes / GIB) + } else if bytes >= MIB { + format!("{:.1} MB", bytes / MIB) + } else if bytes >= KIB { + format!("{:.1} KB", bytes / KIB) + } else { + format!("{bytes:.0} B") + } +} + +pub(super) fn format_modified(time: SystemTime) -> String { + let Ok(duration) = SystemTime::now().duration_since(time) else { + return "Just now".to_string(); + }; + let days = duration.as_secs() / 86_400; + if days == 0 { + "Today".to_string() + } else if days == 1 { + "Yesterday".to_string() + } else if days < 30 { + format!("{days} days ago") + } else if days < 365 { + format!("{} months ago", days / 30) + } else { + format!("{} years ago", days / 365) + } +} + +pub(super) fn natural_cmp(a: &str, b: &str) -> std::cmp::Ordering { + a.to_ascii_lowercase().cmp(&b.to_ascii_lowercase()) +} + +pub(super) fn asset_context_menu( + world: &mut World, + ui: &mut egui::Ui, + asset: &EditorAsset, + selected_entities: &SelectedEntities, +) { + let menu_selection = AssetSelection::from_asset(asset); + prepare_context_menu_selection(world, menu_selection); + let selected_count = world.resource::().selections.len(); + if selected_count > 1 { + ui.label(egui::RichText::new(format!("{selected_count} items selected")).color(TEXT_DIM)); + batch_content_menu(world, ui); + return; + } + if ui.button("Select").clicked() { + world + .resource_mut::() + .select(AssetSelection::from_asset(asset)); + ui.close(); + } + if matches!( + asset.kind, + EditorAssetKind::Primitive(_) + | EditorAssetKind::Light(_) + | EditorAssetKind::Model + | EditorAssetKind::AudioClip + | EditorAssetKind::Prefab + ) && ui.button("Place at Origin").clicked() + { + place_asset_operator(world, asset.clone(), Vec3::ZERO); + ui.close(); + } + if matches!(asset.kind, EditorAssetKind::Level) && ui.button("Open Scene").clicked() { + open_level_asset(world, asset); + ui.close(); + } + if matches!(asset.kind, EditorAssetKind::Model) && has_embedded_assets(world, asset) { + let expanded = asset.path.as_deref().is_some_and(|path| { + world + .resource::() + .expanded_assets + .contains(path) + }); + if ui + .button(if expanded { + "Collapse Contents" + } else { + "Expand Contents" + }) + .clicked() + { + if let Some(path) = asset.path.as_ref() { + toggle_asset_expanded(world, path); + } + ui.close(); + } + } + if matches!(asset.kind, EditorAssetKind::Texture) + && ui.button("Apply as Base Color Texture").clicked() + { + apply_texture_operator(world, asset.clone(), selected_entities); + ui.close(); + } + if asset.path.is_some() + && matches!(asset.kind, EditorAssetKind::Material) + && ui.button("Apply Material To Selection").clicked() + { + apply_material_operator(world, asset.clone(), selected_entities); + ui.close(); + } + if matches!(asset.kind, EditorAssetKind::Material) { + if let Some(path) = asset.path.as_deref() { + if ui.button("Create Material Instance").clicked() { + create_material_instance_from_base(world, path, &asset.label); + ui.close(); + } + } + } + if matches!(asset.kind, EditorAssetKind::Model) && ui.button("Reimport").clicked() { + reimport_asset(world, asset); + ui.close(); + } + if matches!( + asset.kind, + EditorAssetKind::Texture | EditorAssetKind::Model | EditorAssetKind::Material + ) && ui.button("Regenerate Thumbnail").clicked() + { + regenerate_asset_thumbnail(world, asset); + ui.close(); + } + if asset.path.is_some() { + ui.separator(); + if ui.button("Rename").clicked() { + begin_rename(world); + ui.close(); + } + if ui.button("Cut").clicked() { + set_content_clipboard(world, true); + ui.close(); + } + if ui.button("Copy").clicked() { + set_content_clipboard(world, false); + ui.close(); + } + if ui.button("Duplicate").clicked() { + duplicate_selection(world); + ui.close(); + } + ui.separator(); + if ui.button("Move To Trash").clicked() { + request_delete_for_asset(world, asset); + ui.close(); + } + } +} + +pub(super) fn prepare_context_menu_selection(world: &mut World, selection: AssetSelection) { + if !world.resource::().is_selected(&selection) { + world.resource_mut::().select(selection); + } +} + +pub(super) fn batch_content_menu(world: &mut World, ui: &mut egui::Ui) { + let authored_count = selected_content_paths(world).len(); + let (nested_count, unaffected_count) = collapsed_and_unaffected_selection_counts(world); + let has_authored_content = authored_count > 0; + if nested_count > 0 { + ui.small( + egui::RichText::new(format!( + "{nested_count} nested item(s) already included by a selected parent" + )) + .color(TEXT_DIM), + ); + } + if unaffected_count > 0 { + ui.small( + egui::RichText::new(format!( + "{unaffected_count} embedded, built-in, or protected item(s) unaffected" + )) + .color(TEXT_DIM), + ); + } + let can_undo = !world + .resource::() + .content_undo + .is_empty(); + if ui + .add_enabled(can_undo, egui::Button::new("Undo Last Content Operation")) + .clicked() + { + undo_last_content_operation(world); + ui.close(); + } + ui.separator(); + if ui + .add_enabled( + has_authored_content, + egui::Button::new(format!("Cut {authored_count} Item(s)")), + ) + .clicked() + { + set_content_clipboard(world, true); + ui.close(); + } + if ui + .add_enabled( + has_authored_content, + egui::Button::new(format!("Copy {authored_count} Item(s)")), + ) + .clicked() + { + set_content_clipboard(world, false); + ui.close(); + } + if ui + .add_enabled( + has_authored_content, + egui::Button::new(format!("Duplicate {authored_count} Item(s)")), + ) + .clicked() + { + duplicate_selection(world); + ui.close(); + } + ui.separator(); + if ui + .add_enabled( + has_authored_content, + egui::Button::new(format!("Move {authored_count} Item(s) To Trash")), + ) + .clicked() + { + request_delete_for_selection(world); + ui.close(); + } +} + +pub(super) fn folder_context_menu(world: &mut World, ui: &mut egui::Ui, folder: &FolderSnapshot) { + let selected_count = world.resource::().selections.len(); + if selected_count > 1 { + ui.label(egui::RichText::new(format!("{selected_count} items selected")).color(TEXT_DIM)); + batch_content_menu(world, ui); + return; + } + if ui.button("Open").clicked() { + navigate_content_folder(world, folder.path.clone()); + ui.close(); + } + if folder.path != BUILTINS_FOLDER { + if ui.button("Import Here...").clicked() { + request_import_to_destination(world, folder.path.clone()); + ui.close(); + } + if ui.button("Import To...").clicked() { + begin_import_to(world); + ui.close(); + } + if ui.button("Create Materials From Folder...").clicked() { + begin_pbr_grouping(world, folder.path.clone()); + ui.close(); + } + if ui.button("Create Material Here").clicked() { + create_material_here(world, &folder.path); + ui.close(); + } + if ui.button("New Folder").clicked() { + begin_new_folder(world, folder.path.clone()); + ui.close(); + } + if ui.button("Open Trash...").clicked() { + world.resource_mut::().show_trash = true; + ui.close(); + } + let can_paste = world.resource::().clipboard.is_some(); + if ui + .add_enabled(can_paste, egui::Button::new("Paste Into")) + .clicked() + { + paste_content_clipboard_into(world, &folder.path); + ui.close(); + } + } + if !matches!(folder.path.as_str(), ASSETS_ROOT | BUILTINS_FOLDER) { + ui.separator(); + if ui.button("Rename").clicked() { + world + .resource_mut::() + .select(AssetSelection::Folder(folder.path.clone())); + begin_rename(world); + ui.close(); + } + if ui.button("Cut").clicked() { + set_content_clipboard(world, true); + ui.close(); + } + if ui.button("Copy").clicked() { + set_content_clipboard(world, false); + ui.close(); + } + if ui.button("Duplicate").clicked() { + duplicate_selection(world); + ui.close(); + } + if ui.button("Move To Trash").clicked() { + request_delete_for_selection(world); + ui.close(); + } + } +} + +pub(super) fn empty_space_context_menu( + world: &mut World, + ui: &mut egui::Ui, + current_folder: &str, + visible_order: &[AssetSelection], +) { + if !world.resource::().selections.is_empty() { + world.resource_mut::().clear_selection(); + } + if current_folder != BUILTINS_FOLDER { + if ui.button("Import Here...").clicked() { + request_import_to_destination(world, current_folder.to_string()); + ui.close(); + } + if ui.button("Import To...").clicked() { + begin_import_to(world); + ui.close(); + } + if ui.button("Create Materials From Folder...").clicked() { + begin_pbr_grouping(world, current_folder.to_string()); + ui.close(); + } + if ui.button("Create Material Here").clicked() { + create_material_here(world, current_folder); + ui.close(); + } + if ui.button("New Folder").clicked() { + begin_new_folder(world, current_folder.to_string()); + ui.close(); + } + if ui.button("Open Trash...").clicked() { + world.resource_mut::().show_trash = true; + ui.close(); + } + let can_paste = world.resource::().clipboard.is_some(); + if ui + .add_enabled(can_paste, egui::Button::new("Paste")) + .clicked() + { + paste_content_clipboard(world); + ui.close(); + } + ui.separator(); + } + let can_undo = !world + .resource::() + .content_undo + .is_empty(); + if ui + .add_enabled(can_undo, egui::Button::new("Undo Last Content Operation")) + .clicked() + { + undo_last_content_operation(world); + ui.close(); + } + if ui + .add_enabled(!visible_order.is_empty(), egui::Button::new("Select All")) + .clicked() + { + world + .resource_mut::() + .select_all(visible_order); + ui.close(); + } + if ui.button("Refresh").clicked() { + crate::assets::refresh_content_browser(world); + ui.close(); + } + ui.separator(); + let view = world.resource::().view; + if ui + .selectable_label(view == AssetBrowserView::Grid, "Grid View") + .clicked() + { + world.resource_mut::().view = AssetBrowserView::Grid; + ui.close(); + } + if ui + .selectable_label(view == AssetBrowserView::List, "List View") + .clicked() + { + world.resource_mut::().view = AssetBrowserView::List; + ui.close(); + } +} + +pub(super) fn subasset_context_menu( + world: &mut World, + ui: &mut egui::Ui, + embedded: &EmbeddedAsset, + selected_entities: &SelectedEntities, +) { + if ui.button("Select").clicked() { + world + .resource_mut::() + .select(embedded.selection.clone()); + ui.close(); + } + match embedded.kind { + AssetSubAssetKind::Mesh => { + if embedded.requires_skinned_hierarchy { + if ui.button("Place Skinned Model at Origin").clicked() { + place_subasset_operator(world, embedded.selection.clone(), Vec3::ZERO); + ui.close(); + } + } else if ui.button("Place at Origin").clicked() { + place_subasset_operator(world, embedded.selection.clone(), Vec3::ZERO); + ui.close(); + } + } + AssetSubAssetKind::Texture => { + if ui.button("Apply as Base Color Texture").clicked() { + if let Some(asset) = + texture_asset_from_subasset_selection(world, &Some(embedded.selection.clone())) + { + apply_texture_operator(world, asset, selected_entities); + } + ui.close(); + } + } + AssetSubAssetKind::Material => { + ui.label(egui::RichText::new("Embedded source material").color(TEXT_DIM)); + } + AssetSubAssetKind::Skeleton => { + ui.label(egui::RichText::new("Inspect-only rig metadata").color(TEXT_DIM)); + } + AssetSubAssetKind::AnimationClip => { + let animated_actor = selected_entities + .as_slice() + .iter() + .copied() + .find(|entity| world.get::(*entity).is_some()); + let action = if animated_actor.is_some() { + "Assign To Selected Actor" + } else { + "Create Animated Actor" + }; + if ui.button(action).clicked() { + if let Some(entity) = animated_actor { + assign_animation_clip_operator(world, embedded.selection.clone(), entity); + } else { + place_subasset_operator(world, embedded.selection.clone(), Vec3::ZERO); + } + ui.close(); + } + } + } + if matches!( + embedded.kind, + AssetSubAssetKind::Mesh | AssetSubAssetKind::Material | AssetSubAssetKind::Texture + ) && ui.button("Regenerate Thumbnail").clicked() + { + regenerate_subasset_thumbnail(world, embedded); + ui.close(); + } + if let AssetSelection::SubAsset { parent_path, .. } = &embedded.selection { + if ui.button("Select Parent Asset").clicked() { + world + .resource_mut::() + .select(AssetSelection::File(parent_path.clone())); + ui.close(); + } + } +} + +pub(super) fn regenerate_asset_thumbnail(world: &mut World, asset: &EditorAsset) { + let Some(path) = asset.path.clone() else { + return; + }; + let key = asset_cache_key(asset); + let kind = asset.kind.clone(); + let asset_server = world.resource::().clone(); + crate::assets::retry_thumbnail(world, &key); + world.resource_scope(|world, mut cache: Mut| match kind { + EditorAssetKind::Texture => { + cache.request_texture(key.clone(), path.clone(), &asset_server); + } + EditorAssetKind::Model => { + world.resource_scope(|_world, mut studio: Mut| { + cache.request_model(key.clone(), path.clone(), &mut studio); + }); + } + EditorAssetKind::Material => { + world.resource_scope(|_world, mut studio: Mut| { + cache.request_material_asset(key.clone(), path.clone(), &mut studio); + }); + } + _ => {} + }); + world.resource_mut::().status = format!("Regenerating thumbnail for {}", asset.label); +} + +pub(super) fn regenerate_subasset_thumbnail(world: &mut World, embedded: &EmbeddedAsset) { + let AssetSelection::SubAsset { parent_path, .. } = &embedded.selection else { + return; + }; + let key = embedded.thumbnail_key.clone(); + let asset_server = world.resource::().clone(); + crate::assets::retry_thumbnail(world, &key); + world.resource_scope( + |world, mut cache: Mut| match embedded.kind { + AssetSubAssetKind::Mesh => { + let Some(mesh_label) = embedded.mesh_label.clone() else { + return; + }; + world.resource_scope(|_world, mut studio: Mut| { + cache.request_mesh_subasset( + key.clone(), + parent_path.clone(), + mesh_label, + embedded.material_label.clone(), + embedded.requires_skinned_hierarchy, + &mut studio, + ); + }); + } + AssetSubAssetKind::Material => { + let Some(material_label) = embedded.material_label.clone() else { + return; + }; + world.resource_scope(|_world, mut studio: Mut| { + cache.request_source_material( + key.clone(), + parent_path.clone(), + material_label, + &mut studio, + ); + }); + } + AssetSubAssetKind::Texture => { + if let Some(texture_path) = embedded.texture_path.clone() { + cache.request_texture(key.clone(), texture_path, &asset_server); + } + } + AssetSubAssetKind::Skeleton | AssetSubAssetKind::AnimationClip => {} + }, + ); + world.resource_mut::().status = + format!("Regenerating thumbnail for {}", embedded.label); +} + +pub(super) fn reimport_asset(world: &mut World, asset: &EditorAsset) { + let Some(path) = asset.path.as_deref() else { + return; + }; + let mut status = format!("Reimported {}", asset.label); + if let Some(mut registry) = world.get_resource_mut::() { + if let Some(record) = find_asset_mut_by_path(&mut registry, path) { + if let Err(error) = refresh_model_artifacts(record) { + status = format!("Reimport failed for {}: {error}", asset.label); + warn!("{status}"); + } + } + if let Err(error) = save_registry(®istry) { + status = format!("Asset registry save failed: {error}"); + warn!("{status}"); + } else { + registry.index_dirty = false; + } + } + invalidate_on_catalog_refresh(world); + world.resource_mut::().status = status; +} + +pub(super) fn selected_content_path(world: &World) -> Option { + let assets = world.resource::(); + assets + .selected + .as_ref() + .and_then(authored_content_path) + .map(str::to_string) +} + +pub(super) fn authored_content_path(selection: &AssetSelection) -> Option<&str> { + match selection { + AssetSelection::Folder(path) | AssetSelection::File(path) => Some(path), + AssetSelection::Builtin(_) | AssetSelection::SubAsset { .. } => None, + } +} + +pub(super) fn selected_content_paths(world: &World) -> Vec { + let assets = world.resource::(); + let mut paths: Vec = assets + .selections + .iter() + .filter_map(authored_content_path) + .filter(|path| !matches!(*path, ASSETS_ROOT | BUILTINS_FOLDER)) + .map(str::to_string) + .collect(); + paths.sort(); + paths.dedup(); + let all_paths = paths.clone(); + paths.retain(|candidate| { + !all_paths.iter().any(|parent| { + parent != candidate + && candidate + .strip_prefix(parent) + .is_some_and(|suffix| suffix.starts_with('/')) + }) + }); + paths +} + +pub(super) fn collapsed_and_unaffected_selection_counts(world: &World) -> (usize, usize) { + let assets = world.resource::(); + let raw_authored_count = assets + .selections + .iter() + .filter_map(authored_content_path) + .filter(|path| !matches!(*path, ASSETS_ROOT | BUILTINS_FOLDER)) + .count(); + let effective_count = selected_content_paths(world).len(); + ( + raw_authored_count.saturating_sub(effective_count), + assets.selections.len().saturating_sub(raw_authored_count), + ) +} diff --git a/crates/editor/src/ui/asset_browser/panel/validation.rs b/crates/editor/src/ui/asset_browser/panel/validation.rs new file mode 100644 index 0000000..14e501b --- /dev/null +++ b/crates/editor/src/ui/asset_browser/panel/validation.rs @@ -0,0 +1,32 @@ +use super::*; + +pub(crate) fn validate_material_conflict_destination( + world: &World, + destination: &Path, +) -> Result { + let root = PathBuf::from(&world.resource::().root); + let root = root.canonicalize().unwrap_or(root); + let absolute = if destination.is_absolute() { + destination.to_path_buf() + } else { + root.join(destination) + }; + let absolute = absolute + .parent() + .and_then(|parent| parent.canonicalize().ok()) + .and_then(|parent| destination.file_name().map(|name| parent.join(name))) + .unwrap_or(absolute); + let relative = absolute.strip_prefix(&root).map_err(|_| { + format!( + "Material assets must stay inside {}", + root.join("assets").display() + ) + })?; + if !relative.starts_with("assets") { + return Err(format!( + "Material assets must stay inside {}", + root.join("assets").display() + )); + } + Ok(relative.to_string_lossy().replace('\\', "/")) +} diff --git a/crates/editor/src/ui/asset_browser/state.rs b/crates/editor/src/ui/asset_browser/state.rs index a3c98d4..93a201e 100644 --- a/crates/editor/src/ui/asset_browser/state.rs +++ b/crates/editor/src/ui/asset_browser/state.rs @@ -1,13 +1,13 @@ //! Asset browser UI state and view enums. use std::collections::HashSet; +use std::path::PathBuf; -use bevy::prelude::*; -use shared::{MaterialAsset, MaterialInstanceAsset}; - -use crate::asset_db::ImportSettings; use crate::assets::{AssetSelection, ASSETS_ROOT, BUILTINS_FOLDER}; -use crate::project::collaboration::FileSnapshot; +use bevy::prelude::*; +use shared::MaterialAsset; + +pub(crate) const ASSET_DETAILS_DEFAULT_WIDTH: f32 = 260.0; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) enum AssetBrowserView { @@ -44,42 +44,133 @@ pub struct AssetBrowserUiState { pub(crate) thumbnail_size: f32, pub(crate) recursive: bool, pub(crate) show_details: bool, + /// Width of the details pane for the current editor session. + pub(crate) details_width: f32, pub(crate) expanded_folders: HashSet, pub(crate) expanded_assets: HashSet, pub(crate) pending_delete: Option, - pub(crate) import_draft: Option, - pub(crate) material_draft: Option, - pub(crate) material_instance_draft: Option, + pub(crate) clipboard: Option, + pub(crate) pending_path_edit: Option, + pub(crate) pending_content_transaction: Option, + /// Selected project folder while the explicit Import To review is open. + pub(crate) pending_import_destination: Option, + pub(crate) content_undo: Vec, + pub(crate) pending_gltf_extraction: Option, + pub(crate) pending_pbr_grouping: Option, + pub(crate) show_trash: bool, +} + +#[derive(Debug, Clone)] +pub(crate) struct ContentClipboard { + pub(crate) sources: Vec, + pub(crate) cut: bool, +} + +#[derive(Debug, Clone)] +pub(crate) struct ContentUndoEntry { + pub(crate) label: String, + pub(crate) action: ContentUndoAction, + pub(crate) guarded_sources: Vec<(PathBuf, String)>, +} + +#[derive(Debug, Clone)] +pub(crate) enum ContentUndoAction { + Apply(Vec), + TrashCreated(Vec), + RestoreTrash(PathBuf), +} + +#[derive(Debug, Clone)] +pub(crate) struct PendingContentTransaction { + pub(crate) preview: content_pipeline::ContentTransactionPreview, + pub(crate) guarded_paths: Vec<(PathBuf, String)>, + pub(crate) clear_cut_clipboard: bool, + pub(crate) clear_drag: bool, + pub(crate) browser_snapshot: ContentBrowserSnapshot, +} + +/// Browser-local state captured before a reviewed content operation begins. +/// Cancel restores this verbatim; commit deliberately replaces it with the result selection. +#[derive(Debug, Clone)] +pub(crate) struct ContentBrowserSnapshot { + pub(crate) current_folder: String, + pub(crate) selected: Option, + pub(crate) selections: Vec, + pub(crate) selection_anchor: Option, + pub(crate) dragging: Option, + pub(crate) asset_status: String, + pub(crate) scene_status: String, +} + +#[derive(Debug, Clone)] +pub(crate) enum ContentPathEditKind { + Rename { source: String }, + NewFolder { parent: String }, +} + +#[derive(Debug, Clone)] +pub(crate) struct ContentPathEdit { + pub(crate) kind: ContentPathEditKind, + pub(crate) name: String, } #[derive(Debug, Clone)] pub(crate) struct AssetDeleteRequest { - pub(crate) selection: AssetSelection, pub(crate) label: String, pub(crate) files: Vec, pub(crate) warnings: Vec, } #[derive(Debug, Clone)] -pub(crate) struct ImportSettingsDraft { - pub(crate) path: String, - pub(crate) settings: ImportSettings, +pub(crate) struct GltfMaterialExtractionDraft { + pub(crate) source: String, + pub(crate) destination: String, + pub(crate) materials: Vec, + /// When present, extraction publishes only this imported source and assigns only this actor slot. + pub(crate) actor_target: Option, } #[derive(Debug, Clone)] -pub(crate) struct MaterialAssetDraft { +pub(crate) struct GltfMaterialExtractionTarget { + pub(crate) entity: Entity, + pub(crate) slot_id: shared::ComponentInstanceId, + pub(crate) source_sub_asset_id: String, +} + +#[derive(Debug, Clone)] +pub(crate) struct GltfMaterialExtractionEntry { + pub(crate) included: bool, + pub(crate) source_index: usize, + pub(crate) source_name: String, pub(crate) path: String, pub(crate) asset: MaterialAsset, - pub(crate) disk_snapshot: FileSnapshot, - pub(crate) error: Option, + pub(crate) write_mode: MaterialExtractionWriteMode, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub(crate) enum MaterialExtractionWriteMode { + /// An existing provenance match must be explicitly reviewed before publishing. + Undecided, + CreateNew, + ApplyExisting { + expected_fingerprint: String, + previous_bytes: Vec, + }, } #[derive(Debug, Clone)] -pub(crate) struct MaterialInstanceAssetDraft { +pub(crate) struct PbrGroupingDraft { + pub(crate) folder: String, + pub(crate) textures: Vec, +} + +#[derive(Debug, Clone)] +pub(crate) struct PbrTextureDraft { pub(crate) path: String, - pub(crate) asset: MaterialInstanceAsset, - pub(crate) disk_snapshot: FileSnapshot, - pub(crate) error: Option, + pub(crate) target: String, + pub(crate) role: content_pipeline::PbrTextureRole, + pub(crate) confidence: content_pipeline::PbrMatchConfidence, + pub(crate) included: bool, } impl Default for AssetBrowserUiState { @@ -95,12 +186,18 @@ impl Default for AssetBrowserUiState { thumbnail_size: 72.0, recursive: false, show_details: true, + details_width: ASSET_DETAILS_DEFAULT_WIDTH, expanded_folders, expanded_assets: HashSet::new(), pending_delete: None, - import_draft: None, - material_draft: None, - material_instance_draft: None, + clipboard: None, + pending_path_edit: None, + pending_content_transaction: None, + pending_import_destination: None, + content_undo: Vec::new(), + pending_gltf_extraction: None, + pending_pbr_grouping: None, + show_trash: false, } } } diff --git a/crates/editor/src/ui/asset_card.rs b/crates/editor/src/ui/asset_card.rs new file mode 100644 index 0000000..24d7ef5 --- /dev/null +++ b/crates/editor/src/ui/asset_card.rs @@ -0,0 +1,225 @@ +//! Reusable Content Browser and Material Library asset cards. + +use bevy_egui::egui; +use egui_phosphor_icons::icons; + +use crate::assets::{kind_icon, EditorAsset}; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub struct AssetCardStatus { + pub dirty: bool, + pub processing: bool, + pub error: bool, +} + +impl AssetCardStatus { + pub fn for_document( + snapshot: Option<&crate::asset_documents::AuthoredDocumentSnapshot>, + dirty: bool, + failed: bool, + ) -> Self { + use crate::asset_documents::{AuthoredDocumentState, DerivedProcessingState}; + + Self { + dirty, + processing: snapshot.is_some_and(|status| { + matches!( + status.processing, + DerivedProcessingState::Queued | DerivedProcessingState::Processing + ) + }), + error: failed + || snapshot.is_some_and(|status| { + matches!( + status.state, + AuthoredDocumentState::ExternalConflict | AuthoredDocumentState::SaveFailed + ) || status.processing == DerivedProcessingState::Failed + }), + } + } +} + +#[allow(clippy::too_many_arguments)] +pub fn draw_asset_card( + ui: &mut egui::Ui, + asset: &EditorAsset, + texture_id: Option, + pending: bool, + failure: Option<&str>, + selected: bool, + thumbnail_size: f32, + status: AssetCardStatus, +) -> egui::Response { + let response = draw_asset_cell( + ui, + asset, + texture_id, + pending, + failure, + selected, + thumbnail_size, + ); + draw_asset_status_rail(ui, response.rect, status); + response +} + +pub fn draw_asset_status_rail(ui: &egui::Ui, rect: egui::Rect, status: AssetCardStatus) { + let mut y = rect.top() + 11.0; + let x = rect.right() - 11.0; + if status.error { + ui.painter().text( + egui::pos2(x, y), + egui::Align2::CENTER_CENTER, + icons::WARNING_CIRCLE.as_str(), + egui::FontId::new(12.0, egui::FontFamily::Name("phosphor-regular".into())), + super::theme::ERROR, + ); + y += 12.0; + } + if status.processing { + ui.painter().text( + egui::pos2(x, y), + egui::Align2::CENTER_CENTER, + icons::CIRCLE_NOTCH.as_str(), + egui::FontId::new(12.0, egui::FontFamily::Name("phosphor-regular".into())), + super::theme::ACCENT, + ); + y += 12.0; + } + if status.dirty { + ui.painter() + .circle_filled(egui::pos2(x, y), 4.0, super::theme::WARNING); + } +} + +/// Draws the same authored-document status model in a fixed-width list cell. +pub fn draw_asset_status_marker(ui: &mut egui::Ui, status: AssetCardStatus) { + let (rect, response) = ui.allocate_exact_size(egui::vec2(20.0, 20.0), egui::Sense::hover()); + let (glyph, color) = if status.error { + (Some(icons::WARNING_CIRCLE), super::theme::ERROR) + } else if status.processing { + (Some(icons::CIRCLE_NOTCH), super::theme::ACCENT) + } else if status.dirty { + (None, super::theme::WARNING) + } else { + return; + }; + if let Some(glyph) = glyph { + ui.painter().text( + rect.center(), + egui::Align2::CENTER_CENTER, + glyph.as_str(), + egui::FontId::new(12.0, egui::FontFamily::Name("phosphor-regular".into())), + color, + ); + } else { + ui.painter().circle_filled(rect.center(), 4.0, color); + } + response.on_hover_text(if status.error { + "Asset has a save, conflict, or processing error" + } else if status.processing { + "Derived asset processing is running" + } else { + "Asset has unsaved changes" + }); +} + +#[allow(clippy::too_many_arguments)] +fn draw_asset_cell( + ui: &mut egui::Ui, + asset: &EditorAsset, + texture_id: Option, + pending: bool, + failed: Option<&str>, + selected: bool, + thumbnail_size: f32, +) -> egui::Response { + let thumb_size = thumbnail_size.clamp(48.0, 112.0); + let cell_size = egui::vec2(thumb_size + 20.0, thumb_size + 42.0); + let (rect, response) = ui.allocate_exact_size(cell_size, egui::Sense::click_and_drag()); + let fill = if selected { + super::theme::SELECTION_BG_MUTED + } else if response.hovered() { + super::theme::ELEVATED_BG + } else { + super::theme::WIDGET_BG + }; + ui.painter().rect( + rect, + 4.0, + fill, + egui::Stroke::new( + 1.0_f32, + if selected { + super::theme::ACCENT_HOVER + } else { + super::theme::BORDER + }, + ), + egui::StrokeKind::Inside, + ); + + let thumbnail_rect = egui::Rect::from_min_size( + rect.min + egui::vec2(10.0, 8.0), + egui::vec2(thumb_size, thumb_size), + ); + let painter = ui.painter().with_clip_rect(thumbnail_rect); + if let Some(texture_id) = texture_id { + painter.image( + texture_id, + thumbnail_rect, + egui::Rect::from_min_max(egui::Pos2::ZERO, egui::pos2(1.0, 1.0)), + egui::Color32::WHITE, + ); + } else { + let (icon, color) = if pending { + (icons::CIRCLE_NOTCH, super::theme::TEXT_DIM) + } else if failed.is_some() { + (icons::WARNING_CIRCLE, super::theme::TEXT_DIM) + } else { + (kind_icon(&asset.kind), super::theme::TEXT) + }; + painter.text( + thumbnail_rect.center(), + egui::Align2::CENTER_CENTER, + icon.as_str(), + egui::FontId::new(26.0, egui::FontFamily::Name("phosphor-regular".into())), + color, + ); + } + + let label_rect = egui::Rect::from_min_max( + egui::pos2(rect.min.x + 6.0, thumbnail_rect.max.y + 4.0), + egui::pos2(rect.max.x - 6.0, rect.max.y - 4.0), + ); + let label_color = if selected { + super::theme::TEXT_SELECTED + } else { + super::theme::TEXT + }; + let font = egui::FontId::proportional(11.0); + let mut job = + egui::text::LayoutJob::simple(asset.label.clone(), font, label_color, label_rect.width()); + job.halign = egui::Align::Center; + job.wrap.max_rows = 2; + job.wrap.break_anywhere = true; + job.wrap.overflow_character = Some('…'); + let galley = ui.painter().layout_job(job); + let label_painter = ui.painter().with_clip_rect(label_rect); + label_painter.galley( + egui::pos2( + label_rect.center().x - galley.rect.width() * 0.5, + label_rect.center().y - galley.rect.height() * 0.5, + ), + galley.clone(), + label_color, + ); + + if let Some(reason) = failed { + response.on_hover_text(reason) + } else if galley.elided { + response.on_hover_text(&asset.label) + } else { + response + } +} diff --git a/crates/editor/src/ui/audio_inspector.rs b/crates/editor/src/ui/audio_inspector.rs index 30ac0cb..48afd17 100644 --- a/crates/editor/src/ui/audio_inspector.rs +++ b/crates/editor/src/ui/audio_inspector.rs @@ -99,7 +99,7 @@ pub fn audio_source_inspector_ui(world: &mut World, ui: &mut egui::Ui, entity: E ui.painter().rect_stroke( clip_response.rect.expand(3.0), 3.0, - egui::Stroke::new(1.5, SELECTION), + egui::Stroke::new(1.5_f32, SELECTION), egui::StrokeKind::Outside, ); if ui.input(|input| input.pointer.any_released()) { diff --git a/crates/editor/src/ui/build.rs b/crates/editor/src/ui/build.rs index 8b94dcd..72a9e9b 100644 --- a/crates/editor/src/ui/build.rs +++ b/crates/editor/src/ui/build.rs @@ -97,6 +97,24 @@ pub fn request_build(world: &mut World, run_after: bool) { .set_status("Save all modified scene tabs before building a package"); return; } + if world + .get_resource::() + .is_some_and(|store| store.has_dirty_documents()) + { + world + .resource_mut::() + .set_status("Save all modified asset documents before building a package"); + return; + } + if world + .get_resource::() + .is_some_and(|store| store.has_pending_or_failed_processing()) + { + world.resource_mut::().set_status( + "Asset processing is pending or failed; wait for completion or resolve diagnostics before packaging", + ); + return; + } let engine_root = engine_workspace_root(); let root = PathBuf::from(&world.resource::().root); let profile = world.resource::().selected_profile.clone(); diff --git a/crates/editor/src/ui/component_registry.rs b/crates/editor/src/ui/component_registry.rs index dbc3e31..3b79377 100644 --- a/crates/editor/src/ui/component_registry.rs +++ b/crates/editor/src/ui/component_registry.rs @@ -9,6 +9,10 @@ use bevy::reflect::GetTypeRegistration; use bevy_egui::egui; use egui_phosphor_icons::icons; +mod dispatch; +#[cfg(test)] +mod tests; + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum EditorComponentCategory { Authoring, @@ -44,10 +48,9 @@ pub struct EditorComponentDescriptor { #[derive(Resource, Debug, Clone)] pub struct EditorComponentRegistry { pub descriptors: Vec, - inspectors: HashMap<&'static str, ComponentInspectorFn>, + pub(super) inspectors: HashMap<&'static str, ComponentInspectorFn>, } -/// Synchronous inspector callbacks run while [`crate::ui::UiState`] is scoped out of `World`. /// They must not request that resource. Keep extension-owned transient state in independently /// registered resources, use [`crate::ui::request_ui_selection`] and /// [`crate::ui::request_editor_tab`] for host UI changes, or defer other cross-panel work through @@ -333,8 +336,7 @@ impl Default for EditorComponentRegistry { "shared::components::BrushDesc", "shared::animation::SkinnedMeshRenderer", ], - hydration_effect: - "Hydrates into generated mesh children and material bindings.", + hydration_effect: "Hydrates into generated mesh children and material bindings.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_SKINNED_MESH_RENDERER, @@ -346,17 +348,17 @@ impl Default for EditorComponentRegistry { reorderable: true, hidden: false, icon: icons::PERSON_SIMPLE_RUN.as_str(), - description: - "Renders rigged geometry while preserving its imported joints and skin bindings.", - search_terms: &["mesh", "renderer", "skinned", "skeletal", "rigged", "joints"], + description: "Renders rigged geometry while preserving its imported joints and skin bindings.", + search_terms: &[ + "mesh", "renderer", "skinned", "skeletal", "rigged", "joints", + ], recommended: &["shared::animation::AnimationControllerDesc"], conflicts_with: &[ "shared::components::Primitive", "shared::components::BrushDesc", "shared::components::StaticMeshRenderer", ], - hydration_effect: - "Hydrates through a dedicated scene root containing Bevy skinned meshes and joints.", + hydration_effect: "Hydrates through a dedicated scene root containing Bevy skinned meshes and joints.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_BRUSH, @@ -370,7 +372,7 @@ impl Default for EditorComponentRegistry { icon: icons::CUBE.as_str(), description: "Creates authored convex brush geometry for blockout.", search_terms: &["brush", "blockout", "convex", "csg", "geometry"], - recommended: &["shared::components::MaterialDesc"], + recommended: &[], conflicts_with: &[ "shared::components::Primitive", "shared::components::StaticMeshRenderer", @@ -402,18 +404,18 @@ impl Default for EditorComponentRegistry { EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_MATERIAL, type_name: "shared::components::MaterialDesc", - display_name: "Authoring Material", + display_name: "Brush Fallback Material", category: EditorComponentCategory::Rendering, - addable: true, + addable: false, removable: true, reorderable: true, hidden: false, icon: icons::PALETTE.as_str(), - description: "Defines an authored material directly on this actor.", + description: "Legacy fallback used only by authored brush geometry.", search_terms: &["material", "shader", "texture"], recommended: &[], conflicts_with: &[], - hydration_effect: "Hydrates into Bevy material assets for renderable actors.", + hydration_effect: "Hydrates a legacy brush fallback; primitives and mesh renderers use material slots.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_RIGID_BODY, @@ -474,11 +476,17 @@ impl Default for EditorComponentRegistry { hidden: false, icon: icons::FILM_SLATE.as_str(), description: "Authors named animation states for an imported model rig.", - search_terms: &["animation", "controller", "state", "clip", "skeleton", "rig"], + search_terms: &[ + "animation", + "controller", + "state", + "clip", + "skeleton", + "rig", + ], recommended: &["shared::animation::SkinnedMeshRenderer"], conflicts_with: &[], - hydration_effect: - "Hydrates into a Bevy animation graph and player bound to the imported model.", + hydration_effect: "Hydrates into a Bevy animation graph and player bound to the imported model.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_AUDIO_SOURCE, @@ -494,8 +502,7 @@ impl Default for EditorComponentRegistry { search_terms: &["audio", "sound", "clip", "speaker", "spatial"], recommended: &[], conflicts_with: &["shared::components::AudioListenerDesc"], - hydration_effect: - "Hydrates into runtime Bevy audio voices with bus and attenuation control.", + hydration_effect: "Hydrates into runtime Bevy audio voices with bus and attenuation control.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_AUDIO_LISTENER, @@ -511,8 +518,7 @@ impl Default for EditorComponentRegistry { search_terms: &["audio", "sound", "listener", "ears", "spatial"], recommended: &[], conflicts_with: &["shared::components::AudioSourceDesc"], - hydration_effect: - "The highest-priority enabled listener becomes the runtime listener.", + hydration_effect: "The highest-priority enabled listener becomes the runtime listener.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_PRIMITIVE, @@ -532,8 +538,7 @@ impl Default for EditorComponentRegistry { "shared::components::BrushDesc", "shared::animation::SkinnedMeshRenderer", ], - hydration_effect: - "Hydrates into generated primitive render and collision data.", + hydration_effect: "Hydrates into generated primitive render and collision data.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_PLAYER_SPAWN, @@ -549,8 +554,7 @@ impl Default for EditorComponentRegistry { search_terms: &["player", "spawn", "start"], recommended: &[], conflicts_with: &[], - hydration_effect: - "Used by PIE/session startup; no saved runtime player is created.", + hydration_effect: "Used by PIE/session startup; no saved runtime player is created.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_WEAPON_SPAWN, @@ -630,8 +634,7 @@ impl Default for EditorComponentRegistry { search_terms: &["post", "process", "volume", "rendering", "fx"], recommended: &[], conflicts_with: &[], - hydration_effect: - "Affects active camera rendering when the camera is inside the volume.", + hydration_effect: "Affects active camera rendering when the camera is inside the volume.", }, EditorComponentDescriptor { id: shared::AUTHORING_COMPONENT_NAVIGATION_BOUNDS, @@ -881,32 +884,3 @@ where .resource_mut::() .register_with_inspector(descriptor, inspector) } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn built_in_registry_is_unique_and_reflectable() { - let mut app = App::new(); - app.add_plugins(shared::SharedTypesPlugin) - .init_resource::(); - - app.world() - .resource::() - .validate(app.world()) - .unwrap(); - } - - #[test] - fn static_extensions_cannot_shadow_stable_ids_or_types() { - let mut registry = EditorComponentRegistry::default(); - let mut duplicate = registry.descriptors[0].clone(); - duplicate.type_name = "game::editor_ext::StaticFixture"; - assert!(registry.register(duplicate).is_err()); - - let mut duplicate = registry.descriptors[0].clone(); - duplicate.id = "game.static_fixture"; - assert!(registry.register(duplicate).is_err()); - } -} diff --git a/crates/editor/src/ui/component_registry/dispatch.rs b/crates/editor/src/ui/component_registry/dispatch.rs new file mode 100644 index 0000000..851e9e9 --- /dev/null +++ b/crates/editor/src/ui/component_registry/dispatch.rs @@ -0,0 +1,28 @@ +//! Inspector callback registration and completeness checks. + +use super::{ComponentInspectorFn, EditorComponentRegistry}; + +impl EditorComponentRegistry { + pub fn register_inspector_for_existing( + &mut self, + type_name: &'static str, + inspector: ComponentInspectorFn, + ) -> Result<(), String> { + if self.by_type_name(type_name).is_none() { + return Err(format!( + "cannot register inspector for unknown component `{type_name}`" + )); + } + if self.inspectors.insert(type_name, inspector).is_some() { + return Err(format!("component `{type_name}` already has an inspector")); + } + Ok(()) + } + + pub fn visible_descriptors_have_inspectors(&self) -> bool { + self.descriptors + .iter() + .filter(|descriptor| !descriptor.hidden) + .all(|descriptor| self.inspectors.contains_key(descriptor.type_name)) + } +} diff --git a/crates/editor/src/ui/component_registry/tests.rs b/crates/editor/src/ui/component_registry/tests.rs new file mode 100644 index 0000000..c95f2b6 --- /dev/null +++ b/crates/editor/src/ui/component_registry/tests.rs @@ -0,0 +1,37 @@ +use super::*; + +#[test] +fn built_in_registry_is_unique_and_reflectable() { + let mut app = App::new(); + app.add_plugins(shared::SharedTypesPlugin) + .init_resource::(); + + app.world() + .resource::() + .validate(app.world()) + .unwrap(); +} + +#[test] +fn static_extensions_cannot_shadow_stable_ids_or_types() { + let mut registry = EditorComponentRegistry::default(); + let mut duplicate = registry.descriptors[0].clone(); + duplicate.type_name = "game::editor_ext::StaticFixture"; + assert!(registry.register(duplicate).is_err()); + + let mut duplicate = registry.descriptors[0].clone(); + duplicate.id = "game.static_fixture"; + assert!(registry.register(duplicate).is_err()); +} + +#[test] +fn every_visible_builtin_registers_one_inspector_callback() { + let mut world = World::new(); + world.init_resource::(); + + crate::ui::inspector::register_builtin_component_inspectors(&mut world); + + assert!(world + .resource::() + .visible_descriptors_have_inspectors()); +} diff --git a/crates/editor/src/ui/design_system/color_picker.rs b/crates/editor/src/ui/design_system/color_picker.rs new file mode 100644 index 0000000..2000533 --- /dev/null +++ b/crates/editor/src/ui/design_system/color_picker.rs @@ -0,0 +1,308 @@ +//! Penpot 420×350 material color popup with live preview and reversible dismissal. + +mod popup; + +use bevy_egui::egui; + +use super::typography::TypeRole; + +pub(super) const POPUP_SIZE: egui::Vec2 = egui::vec2(420.0, 350.0); + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(super) enum PickerMode { + Wheel, + Sliders, + Presets, +} + +#[derive(Debug, Clone)] +pub(super) struct PickerSession { + original: [f32; 4], + current: [f32; 4], + mode: PickerMode, + hex: String, + opened_at: f64, + owner_rect: egui::Rect, + original_intensity: Option, + current_intensity: Option, +} + +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] +pub(crate) struct ColorPickerResponse { + pub changed: bool, + pub applied: bool, + pub cancelled: bool, +} + +pub(crate) fn color_control( + ui: &mut egui::Ui, + salt: impl std::hash::Hash, + label: &str, + rgba: &mut [f32; 4], +) -> ColorPickerResponse { + color_control_impl(ui, salt, label, rgba, None) +} + +pub(crate) fn color_control_with_intensity( + ui: &mut egui::Ui, + salt: impl std::hash::Hash, + label: &str, + rgba: &mut [f32; 4], + intensity: &mut f32, +) -> ColorPickerResponse { + color_control_impl(ui, salt, label, rgba, Some(intensity)) +} + +fn color_control_impl( + ui: &mut egui::Ui, + salt: impl std::hash::Hash, + label: &str, + rgba: &mut [f32; 4], + intensity: Option<&mut f32>, +) -> ColorPickerResponse { + let palette = super::palette(ui); + let id = ui.make_persistent_id(("penpot_color_picker", salt)); + let (rect, response) = ui.allocate_exact_size(egui::vec2(130.0, 22.0), egui::Sense::click()); + let swatch_rect = egui::Rect::from_min_size(rect.min, egui::vec2(24.0, 22.0)); + let hex_rect = + egui::Rect::from_min_size(rect.min + egui::vec2(30.0, 0.0), egui::vec2(100.0, 22.0)); + popup::checker(ui.painter(), swatch_rect, palette.control, palette.elevated); + ui.painter() + .rect_filled(swatch_rect.shrink(1.0), 4.0, color32(*rgba)); + ui.painter().rect_stroke( + swatch_rect, + 4.0, + egui::Stroke::new(1.0_f32, palette.border_strong), + egui::StrokeKind::Inside, + ); + ui.painter().rect( + hex_rect, + 4.0, + palette.control, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + ui.painter().text( + hex_rect.left_center() + egui::vec2(9.0, 0.0), + egui::Align2::LEFT_CENTER, + hex(*rgba), + TypeRole::Body.font(), + palette.text_primary, + ); + + if response.clicked() { + let opened_at = ui.input(|input| input.time); + ui.ctx().data_mut(|data| { + data.insert_temp( + id, + PickerSession { + original: *rgba, + current: *rgba, + mode: PickerMode::Wheel, + hex: hex(*rgba), + opened_at, + owner_rect: ui.clip_rect(), + original_intensity: intensity.as_deref().copied(), + current_intensity: intensity.as_deref().copied(), + }, + ); + }); + } + + let before = *rgba; + let mut result = ColorPickerResponse::default(); + let Some(mut session) = ui.ctx().data_mut(|data| data.get_temp::(id)) else { + return result; + }; + let screen_rect = ui.ctx().content_rect(); + let popup_rect = centered_popup_rect(session.owner_rect, screen_rect); + + let scrim = egui::Area::new(id.with("modal_scrim")) + .order(egui::Order::Foreground) + .fixed_pos(session.owner_rect.min) + .show(ui.ctx(), |ui| { + let (rect, response) = + ui.allocate_exact_size(session.owner_rect.size(), egui::Sense::click()); + ui.painter() + .rect_filled(rect, 0.0, egui::Color32::from_black_alpha(132)); + response + }) + .inner; + + let popup_response = egui::Area::new(id.with("popup")) + .order(egui::Order::Foreground) + .fixed_pos(popup_rect.min) + .show(ui.ctx(), |ui| { + ui.set_min_size(POPUP_SIZE); + ui.set_max_size(POPUP_SIZE); + popup::show(ui, label, &mut session, &mut result) + }) + .response; + + let escape = ui.input(|input| input.key_pressed(egui::Key::Escape)); + let outside_click = scrim.clicked() + || ui.input(|input| { + input.pointer.any_pressed() + && input.time > session.opened_at + && input + .pointer + .interact_pos() + .is_some_and(|position| !popup_response.rect.contains(position)) + }); + if escape || outside_click { + result.cancelled = true; + } + + if result.cancelled { + *rgba = session.original; + if let (Some(target), Some(original)) = (intensity, session.original_intensity) { + *target = original; + } + ui.ctx().data_mut(|data| data.remove::(id)); + } else { + *rgba = session.current; + if let (Some(target), Some(current)) = (intensity, session.current_intensity) { + *target = current; + } + if result.applied { + ui.ctx().data_mut(|data| data.remove::(id)); + } else { + ui.ctx().data_mut(|data| data.insert_temp(id, session)); + } + } + result.changed = *rgba != before; + result +} + +fn centered_popup_rect(owner: egui::Rect, screen: egui::Rect) -> egui::Rect { + const SCREEN_MARGIN: f32 = 12.0; + let desired = owner.center() - POPUP_SIZE * 0.5; + let minimum = screen.min + egui::vec2(SCREEN_MARGIN, SCREEN_MARGIN); + let maximum = screen.max - POPUP_SIZE - egui::vec2(SCREEN_MARGIN, SCREEN_MARGIN); + let x = if maximum.x >= minimum.x { + desired.x.clamp(minimum.x, maximum.x) + } else { + screen.center().x - POPUP_SIZE.x * 0.5 + }; + let y = if maximum.y >= minimum.y { + desired.y.clamp(minimum.y, maximum.y) + } else { + screen.center().y - POPUP_SIZE.y * 0.5 + }; + egui::Rect::from_min_size(egui::pos2(x, y), POPUP_SIZE) +} + +pub(super) fn set_current(session: &mut PickerSession, value: [f32; 4]) { + session.current = value.map(|component| component.clamp(0.0, 1.0)); + session.hex = hex(session.current); +} + +pub(super) fn color32(value: [f32; 4]) -> egui::Color32 { + egui::Color32::from_rgba_unmultiplied( + byte(value[0]), + byte(value[1]), + byte(value[2]), + byte(value[3]), + ) +} + +pub(super) fn rgba(value: egui::Color32) -> [f32; 4] { + [ + value.r() as f32 / 255.0, + value.g() as f32 / 255.0, + value.b() as f32 / 255.0, + value.a() as f32 / 255.0, + ] +} + +pub(super) fn byte(value: f32) -> u8 { + (value.clamp(0.0, 1.0) * 255.0).round() as u8 +} + +pub(super) fn hex(value: [f32; 4]) -> String { + if byte(value[3]) == 255 { + format!( + "#{:02X}{:02X}{:02X}", + byte(value[0]), + byte(value[1]), + byte(value[2]) + ) + } else { + format!( + "#{:02X}{:02X}{:02X}{:02X}", + byte(value[0]), + byte(value[1]), + byte(value[2]), + byte(value[3]) + ) + } +} + +pub(super) fn parse_hex(value: &str) -> Option<[f32; 4]> { + let value = value.trim().trim_start_matches('#'); + if !matches!(value.len(), 6 | 8) { + return None; + } + let rgb = u32::from_str_radix(&value[..6], 16).ok()?; + let alpha = if value.len() == 8 { + u8::from_str_radix(&value[6..], 16).ok()? + } else { + 255 + }; + Some([ + ((rgb >> 16) & 0xFF) as f32 / 255.0, + ((rgb >> 8) & 0xFF) as f32 / 255.0, + (rgb & 0xFF) as f32 / 255.0, + alpha as f32 / 255.0, + ]) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn popup_centers_on_inspector_owner_and_stays_on_screen() { + let screen = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(1440.0, 900.0)); + let inspector = + egui::Rect::from_min_size(egui::pos2(800.0, 40.0), egui::vec2(640.0, 820.0)); + let popup = centered_popup_rect(inspector, screen); + assert_eq!(popup.size(), POPUP_SIZE); + assert_eq!(popup.center(), inspector.center()); + + let edge = centered_popup_rect( + egui::Rect::from_min_size(egui::pos2(0.0, 0.0), egui::vec2(200.0, 200.0)), + screen, + ); + assert!(edge.left() >= 12.0); + assert!(edge.top() >= 12.0); + } + + #[test] + fn penpot_hex_round_trip_preserves_rgba() { + let value = [0.2, 0.4, 0.6, 0.8]; + let parsed = parse_hex(&hex(value)).expect("valid generated hex"); + for (left, right) in value.into_iter().zip(parsed) { + assert!((left - right).abs() <= 1.0 / 255.0); + } + } + + #[test] + fn cancel_restores_opening_value_and_apply_keeps_live_preview() { + let original = [0.1, 0.2, 0.3, 1.0]; + let mut session = PickerSession { + original, + current: [0.8, 0.7, 0.6, 0.5], + mode: PickerMode::Wheel, + hex: String::new(), + opened_at: 0.0, + owner_rect: egui::Rect::ZERO, + original_intensity: None, + current_intensity: None, + }; + let applied = session.current; + set_current(&mut session, applied); + assert_eq!(session.original, original); + assert_eq!(session.current, applied); + } +} diff --git a/crates/editor/src/ui/design_system/color_picker/popup.rs b/crates/editor/src/ui/design_system/color_picker/popup.rs new file mode 100644 index 0000000..04da0f1 --- /dev/null +++ b/crates/editor/src/ui/design_system/color_picker/popup.rs @@ -0,0 +1,765 @@ +//! Fixed-coordinate renderer for the exported Penpot color overlay. + +mod sliders; + +use bevy_egui::egui::{self, ecolor::Hsva}; +use egui_phosphor_icons::{icons, Icon}; + +use super::{ + byte, color32, parse_hex, rgba, set_current, ColorPickerResponse, PickerMode, PickerSession, + POPUP_SIZE, +}; +use crate::ui::design_system::typography::TypeRole; + +const RECENTS: [egui::Color32; 8] = colors([ + 0xE7D4B4, 0x53D3E6, 0xCA6CE0, 0xF06B75, 0x55C58A, 0xF3C85B, 0x6F88EF, 0xF3F5F7, +]); +const PRESETS: [egui::Color32; 24] = colors([ + 0xE7D4B4, 0xF2EEE8, 0xD5B59C, 0xA8795B, 0x734C3C, 0x3B2D29, 0xE45D68, 0xF09A55, 0xE9D05B, + 0x79C267, 0x45B7A6, 0x4FA9D8, 0x5A78DE, 0x8E68D8, 0xC26BC7, 0xE68DB5, 0xF5F7FA, 0xC4CCD5, + 0x8995A3, 0x56616E, 0x303842, 0x1D242C, 0x101419, 0x07090C, +]); +const PLANNED_EYEDROPPER: &str = "Planned — screen sampling pending"; + +const fn colors(values: [u32; N]) -> [egui::Color32; N] { + let mut result = [egui::Color32::BLACK; N]; + let mut index = 0; + while index < N { + let value = values[index]; + result[index] = egui::Color32::from_rgb( + ((value >> 16) & 0xFF) as u8, + ((value >> 8) & 0xFF) as u8, + (value & 0xFF) as u8, + ); + index += 1; + } + result +} + +struct Geometry; + +impl Geometry { + const HEADER_HEIGHT: f32 = 38.0; + const CONTENT: egui::Rect = + egui::Rect::from_min_max(egui::pos2(12.0, 74.0), egui::pos2(408.0, 276.0)); + const WHEEL_EDITOR: egui::Rect = + egui::Rect::from_min_max(egui::pos2(12.0, 74.0), egui::pos2(190.0, 276.0)); + const VALUES: egui::Rect = + egui::Rect::from_min_max(egui::pos2(198.0, 82.0), egui::pos2(396.0, 268.0)); + const RECENTS: egui::Rect = + egui::Rect::from_min_max(egui::pos2(12.0, 282.0), egui::pos2(408.0, 310.0)); + const FOOTER: egui::Rect = + egui::Rect::from_min_max(egui::pos2(12.0, 316.0), egui::pos2(408.0, 342.0)); + + fn rect(root: egui::Rect, local: egui::Rect) -> egui::Rect { + local.translate(root.min.to_vec2()) + } + + fn at(root: egui::Rect, x: f32, y: f32, width: f32, height: f32) -> egui::Rect { + egui::Rect::from_min_size(root.min + egui::vec2(x, y), egui::vec2(width, height)) + } +} + +pub(super) fn show( + ui: &mut egui::Ui, + label: &str, + session: &mut PickerSession, + result: &mut ColorPickerResponse, +) -> egui::Response { + let palette = crate::ui::design_system::palette(ui); + let (root, response) = ui.allocate_exact_size(POPUP_SIZE, egui::Sense::hover()); + ui.painter().rect( + root, + 7.0, + palette.panel, + egui::Stroke::new(1.0_f32, palette.border_strong), + egui::StrokeKind::Inside, + ); + ui.painter().line_segment( + [ + root.min + egui::vec2(0.0, Geometry::HEADER_HEIGHT), + root.min + egui::vec2(root.width(), Geometry::HEADER_HEIGHT), + ], + egui::Stroke::new(1.0_f32, palette.border), + ); + + header(ui, root, label, session, result); + mode_tabs(ui, root, session); + intensity_control(ui, root, session); + match session.mode { + PickerMode::Wheel => wheel_mode(ui, root, session), + PickerMode::Sliders => sliders::show(ui, root, session), + PickerMode::Presets => presets_mode(ui, root, session), + } + recent_row(ui, root, session); + footer(ui, root, result); + response +} + +fn intensity_control(ui: &mut egui::Ui, root: egui::Rect, session: &mut PickerSession) { + let Some(intensity) = session.current_intensity.as_mut() else { + return; + }; + let palette = crate::ui::design_system::palette(ui); + text( + ui, + root.min + egui::vec2(272.0, 55.0), + egui::Align2::LEFT_CENTER, + "Intensity", + TypeRole::Small.font(), + palette.text_muted, + ); + ui.put( + Geometry::at(root, 326.0, 43.0, 82.0, 24.0), + egui::DragValue::new(intensity) + .range(0.0..=50_000.0) + .speed(10.0), + ) + .on_hover_text("Emissive luminance multiplier in nits"); +} + +fn header( + ui: &mut egui::Ui, + root: egui::Rect, + label: &str, + session: &PickerSession, + result: &mut ColorPickerResponse, +) { + let palette = crate::ui::design_system::palette(ui); + text( + ui, + root.min + egui::vec2(12.0, 19.0), + egui::Align2::LEFT_CENTER, + label, + TypeRole::Section.font(), + palette.text_primary, + ); + text( + ui, + root.min + egui::vec2(84.0, 19.0), + egui::Align2::LEFT_CENTER, + "sRGB · RGBA", + TypeRole::Small.font(), + palette.text_muted, + ); + paint_swatch( + ui, + Geometry::at(root, 348.0, 7.0, 26.0, 24.0), + color32(session.current), + egui::Sense::hover(), + "Current color", + ); + if icon_button( + ui, + Geometry::at(root, 384.0, 7.0, 24.0, 24.0), + icons::X, + "Cancel color changes", + true, + ) + .clicked() + { + result.cancelled = true; + } +} + +fn mode_tabs(ui: &mut egui::Ui, root: egui::Rect, session: &mut PickerSession) { + let palette = crate::ui::design_system::palette(ui); + for (index, (mode, icon, label, width)) in [ + (PickerMode::Wheel, icons::CIRCLE, "Wheel", 76.0), + (PickerMode::Sliders, icons::SLIDERS, "Sliders", 76.0), + (PickerMode::Presets, icons::SQUARES_FOUR, "Presets", 78.0), + ] + .into_iter() + .enumerate() + { + let x = [12.0, 92.0, 172.0][index]; + let rect = Geometry::at(root, x, 42.0, width, 26.0); + let selected = session.mode == mode; + let response = ui.put( + rect, + egui::Button::new(crate::ui::design_system::controls::icon_label( + icon, + label, + TypeRole::Body, + 12.0, + if selected { + palette.text_primary + } else { + palette.text_secondary + }, + )) + .fill(if selected { + palette.accent_dark + } else { + palette.control + }) + .stroke(egui::Stroke::new( + 1.0_f32, + if selected { + palette.accent + } else { + palette.border + }, + )) + .corner_radius(4.0), + ); + if selected { + ui.painter().rect_filled( + egui::Rect::from_center_size( + egui::pos2(rect.center().x, rect.bottom() - 1.0), + egui::vec2(60.0, 2.0), + ), + 1.0, + palette.accent, + ); + } + if response.clicked() { + session.mode = mode; + } + } +} + +fn wheel_mode(ui: &mut egui::Ui, root: egui::Rect, session: &mut PickerSession) { + let palette = crate::ui::design_system::palette(ui); + let ring = Geometry::at(root, 29.0, 88.0, 144.0, 144.0); + let sv = Geometry::at(root, 65.0, 124.0, 72.0, 72.0); + let editor = Geometry::rect(root, Geometry::WHEEL_EDITOR); + let response = ui.interact( + editor, + ui.make_persistent_id("penpot_color_wheel"), + egui::Sense::click_and_drag(), + ); + let mut hsva = Hsva::from_rgba_unmultiplied( + session.current[0], + session.current[1], + session.current[2], + session.current[3], + ); + paint_hue_wheel(ui.painter(), ring, hsva.h, palette.text_primary); + paint_sv( + ui.painter(), + sv, + hsva.h, + hsva.s, + hsva.v, + palette.text_primary, + ); + if response.clicked() || response.dragged() { + if let Some(position) = response.interact_pointer_pos() { + let delta = position - ring.center(); + if sv.contains(position) { + hsva.s = ((position.x - sv.left()) / sv.width()).clamp(0.0, 1.0); + hsva.v = (1.0 - (position.y - sv.top()) / sv.height()).clamp(0.0, 1.0); + } else if (52.0..=76.0).contains(&delta.length()) { + hsva.h = (delta.angle() / std::f32::consts::TAU + 0.25).rem_euclid(1.0); + } + let [r, g, b] = hsva.to_rgb(); + set_current(session, [r, g, b, hsva.a]); + } + } + text( + ui, + root.min + egui::vec2(101.0, 252.0), + egui::Align2::CENTER_CENTER, + "Drag ring or field", + TypeRole::Small.font(), + palette.text_muted, + ); + values(ui, root, session); +} + +fn values(ui: &mut egui::Ui, root: egui::Rect, session: &mut PickerSession) { + let palette = crate::ui::design_system::palette(ui); + let _values_bounds = Geometry::rect(root, Geometry::VALUES); + caption(ui, root, 198.0, 82.0, "CURRENT"); + caption(ui, root, 302.0, 82.0, "PREVIOUS"); + paint_swatch( + ui, + Geometry::at(root, 198.0, 96.0, 94.0, 30.0), + color32(session.current), + egui::Sense::hover(), + "Current live value", + ); + paint_swatch( + ui, + Geometry::at(root, 302.0, 96.0, 94.0, 30.0), + color32(session.original), + egui::Sense::hover(), + "Value when the picker opened", + ); + + caption(ui, root, 198.0, 132.0, "HEX"); + let hex_field = Geometry::at(root, 198.0, 144.0, 166.0, 24.0); + field_background(ui, hex_field); + let edit_rect = egui::Rect::from_min_max( + hex_field.min, + egui::pos2(hex_field.right() - 24.0, hex_field.bottom()), + ); + let edit = ui.put( + edit_rect.shrink2(egui::vec2(5.0, 2.0)), + egui::TextEdit::singleline(&mut session.hex) + .font(TypeRole::Body.font()) + .frame(egui::Frame::NONE), + ); + if edit.lost_focus() && ui.input(|input| input.key_pressed(egui::Key::Enter)) { + if let Some(value) = parse_hex(&session.hex) { + set_current(session, value); + } + } + if bare_icon( + ui, + egui::Rect::from_min_size( + egui::pos2(hex_field.right() - 24.0, hex_field.top()), + egui::vec2(24.0, 24.0), + ), + icons::COPY, + "Copy HEX", + palette.text_secondary, + ) + .clicked() + { + ui.ctx().copy_text(session.hex.clone()); + } + let eyedropper = Geometry::at(root, 370.0, 144.0, 26.0, 24.0); + field_background(ui, eyedropper); + bare_icon( + ui, + eyedropper, + icons::EYEDROPPER, + PLANNED_EYEDROPPER, + palette.text_muted, + ); + + caption(ui, root, 198.0, 174.0, "RGBA"); + let mut bytes = session.current.map(byte); + let before_bytes = bytes; + for (index, prefix) in ["R ", "G ", "B ", "A "].into_iter().enumerate() { + let rect = Geometry::at(root, 198.0 + index as f32 * 49.0, 186.0, 45.0, 24.0); + ui.put( + rect, + egui::DragValue::new(&mut bytes[index]) + .range(0..=255) + .prefix(prefix), + ); + } + if bytes != before_bytes { + set_current(session, bytes.map(|component| component as f32 / 255.0)); + } + + caption(ui, root, 198.0, 216.0, "HSV"); + let mut hsva = Hsva::from_rgba_unmultiplied( + session.current[0], + session.current[1], + session.current[2], + session.current[3], + ); + let mut hsv = [hsva.h * 360.0, hsva.s * 100.0, hsva.v * 100.0]; + let before_hsv = hsv; + for (index, suffix) in ["°", "%", "%"].into_iter().enumerate() { + let rect = Geometry::at(root, 198.0 + index as f32 * 66.0, 228.0, 61.0, 24.0); + ui.put( + rect, + egui::DragValue::new(&mut hsv[index]) + .range(if index == 0 { 0.0..=360.0 } else { 0.0..=100.0 }) + .suffix(suffix) + .max_decimals(0), + ); + } + if hsv != before_hsv { + hsva.h = hsv[0] / 360.0; + hsva.s = hsv[1] / 100.0; + hsva.v = hsv[2] / 100.0; + let [r, g, b] = hsva.to_rgb(); + set_current(session, [r, g, b, hsva.a]); + } + + caption(ui, root, 198.0, 258.0, "ALPHA"); + alpha_control(ui, Geometry::at(root, 240.0, 256.0, 156.0, 14.0), session); +} + +fn presets_mode(ui: &mut egui::Ui, root: egui::Rect, session: &mut PickerSession) { + let palette = crate::ui::design_system::palette(ui); + let content = Geometry::rect(root, Geometry::CONTENT); + ui.painter().rect_filled(content, 4.0, palette.recessed); + caption(ui, root, 24.0, 86.0, "MATERIAL PALETTE"); + for (index, color) in PRESETS.into_iter().enumerate() { + let column = index % 8; + let row = index / 8; + let rect = Geometry::at( + root, + 24.0 + column as f32 * 47.0, + 104.0 + row as f32 * 52.0, + 34.0, + 34.0, + ); + if paint_swatch(ui, rect, color, egui::Sense::click(), "Use preset color").clicked() { + set_current(session, rgba(color)); + } + } +} + +fn recent_row(ui: &mut egui::Ui, root: egui::Rect, session: &mut PickerSession) { + let palette = crate::ui::design_system::palette(ui); + let row = Geometry::rect(root, Geometry::RECENTS); + ui.painter().rect_filled(row, 4.0, palette.section); + text( + ui, + root.min + egui::vec2(20.0, 296.0), + egui::Align2::LEFT_CENTER, + "RECENT", + TypeRole::Caption.font(), + palette.text_muted, + ); + for (index, color) in RECENTS.into_iter().enumerate() { + let rect = Geometry::at(root, 74.0 + index as f32 * 36.0, 286.0, 28.0, 20.0); + if paint_swatch(ui, rect, color, egui::Sense::click(), "Use recent color").clicked() { + set_current(session, rgba(color)); + } + } +} + +fn footer(ui: &mut egui::Ui, root: egui::Rect, result: &mut ColorPickerResponse) { + let palette = crate::ui::design_system::palette(ui); + let footer = Geometry::rect(root, Geometry::FOOTER); + text( + ui, + footer.left_center(), + egui::Align2::LEFT_CENTER, + "Enter apply · Esc cancel", + TypeRole::Small.font(), + palette.text_muted, + ); + if labeled_button( + ui, + Geometry::at(root, 254.0, 316.0, 72.0, 26.0), + icons::X, + "Cancel", + false, + ) + .clicked() + { + result.cancelled = true; + } + if labeled_button( + ui, + Geometry::at(root, 334.0, 316.0, 74.0, 26.0), + icons::CHECK, + "Apply", + true, + ) + .clicked() + { + result.applied = true; + } +} + +fn alpha_control(ui: &mut egui::Ui, rect: egui::Rect, session: &mut PickerSession) { + let palette = crate::ui::design_system::palette(ui); + checker(ui.painter(), rect, palette.control, palette.elevated); + let response = ui.interact( + rect.expand2(egui::vec2(0.0, 4.0)), + ui.make_persistent_id("penpot_color_alpha"), + egui::Sense::click_and_drag(), + ); + if response.clicked() || response.dragged() { + if let Some(position) = response.interact_pointer_pos() { + let mut value = session.current; + value[3] = ((position.x - rect.left()) / rect.width()).clamp(0.0, 1.0); + set_current(session, value); + } + } + let x = egui::lerp(rect.left()..=rect.right(), session.current[3]); + ui.painter().rect_filled( + egui::Rect::from_min_max(rect.min, egui::pos2(x, rect.bottom())), + 2.0, + palette.accent.gamma_multiply(0.65), + ); + ui.painter().rect_filled( + egui::Rect::from_center_size(egui::pos2(x, rect.center().y), egui::vec2(10.0, 18.0)), + 3.0, + palette.text_primary, + ); +} + +fn paint_hue_wheel( + painter: &egui::Painter, + rect: egui::Rect, + selected_hue: f32, + marker_color: egui::Color32, +) { + let center = rect.center(); + let outer = 72.0; + let inner = 54.0; + let mut mesh = egui::Mesh::default(); + const SEGMENTS: usize = 72; + for segment in 0..SEGMENTS { + let h0 = segment as f32 / SEGMENTS as f32; + let h1 = (segment + 1) as f32 / SEGMENTS as f32; + let a0 = (h0 - 0.25) * std::f32::consts::TAU; + let a1 = (h1 - 0.25) * std::f32::consts::TAU; + let start = mesh.vertices.len() as u32; + let c0 = egui::Color32::from(Hsva::new(h0, 1.0, 1.0, 1.0)); + let c1 = egui::Color32::from(Hsva::new(h1, 1.0, 1.0, 1.0)); + for (radius, angle, color) in [ + (inner, a0, c0), + (outer, a0, c0), + (outer, a1, c1), + (inner, a1, c1), + ] { + mesh.colored_vertex( + center + egui::vec2(angle.cos(), angle.sin()) * radius, + color, + ); + } + mesh.add_triangle(start, start + 1, start + 2); + mesh.add_triangle(start, start + 2, start + 3); + } + painter.add(mesh); + let angle = (selected_hue - 0.25) * std::f32::consts::TAU; + let marker = center + egui::vec2(angle.cos(), angle.sin()) * 63.0; + painter.circle_stroke(marker, 5.0, egui::Stroke::new(2.0_f32, marker_color)); +} + +fn paint_sv( + painter: &egui::Painter, + rect: egui::Rect, + hue: f32, + saturation: f32, + value: f32, + marker_color: egui::Color32, +) { + let mut mesh = egui::Mesh::default(); + for (position, color) in [ + (rect.left_top(), egui::Color32::WHITE), + ( + rect.right_top(), + egui::Color32::from(Hsva::new(hue, 1.0, 1.0, 1.0)), + ), + (rect.right_bottom(), egui::Color32::BLACK), + (rect.left_bottom(), egui::Color32::BLACK), + ] { + mesh.colored_vertex(position, color); + } + mesh.add_triangle(0, 1, 2); + mesh.add_triangle(0, 2, 3); + painter.add(mesh); + let marker = egui::pos2( + egui::lerp(rect.x_range(), saturation), + egui::lerp(rect.y_range(), 1.0 - value), + ); + painter.circle_stroke(marker, 5.0, egui::Stroke::new(2.0_f32, marker_color)); +} + +pub(super) fn checker( + painter: &egui::Painter, + rect: egui::Rect, + dark: egui::Color32, + light: egui::Color32, +) { + let size = 6.0; + let columns = (rect.width() / size).ceil() as usize; + let rows = (rect.height() / size).ceil() as usize; + for row in 0..rows { + for column in 0..columns { + let cell = egui::Rect::from_min_size( + rect.min + egui::vec2(column as f32 * size, row as f32 * size), + egui::vec2(size, size), + ) + .intersect(rect); + painter.rect_filled( + cell, + 0.0, + if (row + column) % 2 == 0 { dark } else { light }, + ); + } + } +} + +fn paint_swatch( + ui: &mut egui::Ui, + rect: egui::Rect, + color: egui::Color32, + sense: egui::Sense, + tooltip: &str, +) -> egui::Response { + let palette = crate::ui::design_system::palette(ui); + checker(ui.painter(), rect, palette.control, palette.elevated); + ui.painter().rect_filled(rect.shrink(1.0), 3.0, color); + ui.painter().rect_stroke( + rect, + 3.0, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + ui.interact( + rect, + ui.make_persistent_id(("color_swatch", rect.min.x.to_bits(), rect.min.y.to_bits())), + sense, + ) + .on_hover_text(tooltip) +} + +fn icon_button( + ui: &mut egui::Ui, + rect: egui::Rect, + icon: Icon, + tooltip: &str, + enabled: bool, +) -> egui::Response { + let palette = crate::ui::design_system::palette(ui); + ui.put( + rect, + egui::Button::new(egui::RichText::new(icon.as_str()).font(egui::FontId::new( + 13.0, + egui::FontFamily::Name("phosphor-regular".into()), + ))) + .fill(palette.control) + .stroke(egui::Stroke::new(1.0_f32, palette.border)) + .corner_radius(4.0) + .sense(if enabled { + egui::Sense::click() + } else { + egui::Sense::hover() + }), + ) + .on_hover_text(tooltip) +} + +fn bare_icon( + ui: &mut egui::Ui, + rect: egui::Rect, + icon: Icon, + tooltip: &str, + color: egui::Color32, +) -> egui::Response { + let response = ui.interact( + rect, + ui.make_persistent_id(("color_icon", tooltip)), + if tooltip == PLANNED_EYEDROPPER { + egui::Sense::hover() + } else { + egui::Sense::click() + }, + ); + ui.painter().text( + rect.center(), + egui::Align2::CENTER_CENTER, + icon.as_str(), + egui::FontId::new(12.0, egui::FontFamily::Name("phosphor-regular".into())), + color, + ); + response.on_hover_text(tooltip) +} + +fn labeled_button( + ui: &mut egui::Ui, + rect: egui::Rect, + icon: Icon, + label: &str, + accent: bool, +) -> egui::Response { + let palette = crate::ui::design_system::palette(ui); + ui.push_id(("color_picker_footer_action", label), |ui| { + ui.put( + rect, + egui::Button::new(crate::ui::design_system::controls::icon_label( + icon, + label, + TypeRole::Control, + 12.0, + palette.text_primary, + )) + .fill(if accent { + palette.accent + } else { + palette.control + }) + .stroke(egui::Stroke::new( + 1.0_f32, + if accent { + palette.accent + } else { + palette.border + }, + )) + .corner_radius(4.0), + ) + }) + .inner +} + +fn field_background(ui: &egui::Ui, rect: egui::Rect) { + let palette = crate::ui::design_system::palette(ui); + ui.painter().rect( + rect, + 4.0, + palette.control, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); +} + +fn caption(ui: &egui::Ui, root: egui::Rect, x: f32, y: f32, value: &str) { + let palette = crate::ui::design_system::palette(ui); + text( + ui, + root.min + egui::vec2(x, y), + egui::Align2::LEFT_TOP, + value, + TypeRole::Caption.font(), + palette.text_muted, + ); +} + +fn text( + ui: &egui::Ui, + position: egui::Pos2, + align: egui::Align2, + value: &str, + font: egui::FontId, + color: egui::Color32, +) { + ui.painter().text(position, align, value, font, color); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn exported_popup_regions_match_penpot_geometry() { + assert_eq!(POPUP_SIZE, egui::vec2(420.0, 350.0)); + assert_eq!(Geometry::HEADER_HEIGHT, 38.0); + assert_eq!(Geometry::CONTENT.size(), egui::vec2(396.0, 202.0)); + assert_eq!(Geometry::WHEEL_EDITOR.size(), egui::vec2(178.0, 202.0)); + assert_eq!(Geometry::VALUES.size(), egui::vec2(198.0, 186.0)); + assert_eq!(Geometry::RECENTS.size(), egui::vec2(396.0, 28.0)); + assert_eq!(Geometry::FOOTER.size(), egui::vec2(396.0, 26.0)); + } + + #[test] + fn exported_value_and_action_fields_retain_exact_sizes() { + let root = egui::Rect::from_min_size(egui::Pos2::ZERO, POPUP_SIZE); + assert_eq!( + Geometry::at(root, 198.0, 144.0, 166.0, 24.0).size(), + egui::vec2(166.0, 24.0) + ); + assert_eq!( + Geometry::at(root, 370.0, 144.0, 26.0, 24.0).size(), + egui::vec2(26.0, 24.0) + ); + assert_eq!( + Geometry::at(root, 240.0, 256.0, 156.0, 14.0).size(), + egui::vec2(156.0, 14.0) + ); + assert_eq!( + Geometry::at(root, 334.0, 316.0, 74.0, 26.0).size(), + egui::vec2(74.0, 26.0) + ); + } + + #[test] + fn disabled_eyedropper_has_no_state_or_action_contract() { + assert_eq!(PLANNED_EYEDROPPER, "Planned — screen sampling pending"); + } +} diff --git a/crates/editor/src/ui/design_system/color_picker/popup/sliders.rs b/crates/editor/src/ui/design_system/color_picker/popup/sliders.rs new file mode 100644 index 0000000..c3f781b --- /dev/null +++ b/crates/editor/src/ui/design_system/color_picker/popup/sliders.rs @@ -0,0 +1,167 @@ +//! Fixed Penpot geometry for the color picker's RGBA and HSV channel modes. + +use bevy_egui::egui::{self, ecolor::Hsva}; + +use super::super::{byte, set_current, PickerSession}; +use super::{caption, text, Geometry}; +use crate::ui::design_system::typography::TypeRole; + +/// Each 186 px channel group owns a 178 px row: a single-letter channel label, +/// a 104 px track, and a 44 px value field. +struct SliderGeometry; + +impl SliderGeometry { + const RGBA_X: f32 = 12.0; + const HSV_X: f32 = 206.0; + const TITLE_Y: f32 = 74.0; + const FIRST_ROW_Y: f32 = 90.0; + const ROW_STRIDE: f32 = 30.0; + const LABEL_WIDTH: f32 = 18.0; + const TRACK_X: f32 = 24.0; + const TRACK_WIDTH: f32 = 104.0; + const VALUE_X: f32 = 134.0; + const VALUE_WIDTH: f32 = 44.0; + const ROW_HEIGHT: f32 = 24.0; +} + +pub(super) fn show(ui: &mut egui::Ui, root: egui::Rect, session: &mut PickerSession) { + let palette = crate::ui::design_system::palette(ui); + let content = Geometry::rect(root, Geometry::CONTENT); + ui.painter().rect_filled(content, 4.0, palette.recessed); + caption( + ui, + root, + SliderGeometry::RGBA_X, + SliderGeometry::TITLE_Y, + "RGBA CHANNELS", + ); + caption( + ui, + root, + SliderGeometry::HSV_X, + SliderGeometry::TITLE_Y, + "HSV CHANNELS", + ); + + let mut bytes = session.current.map(|component| f32::from(byte(component))); + let before_bytes = bytes; + for (index, label) in ["R", "G", "B", "A"].into_iter().enumerate() { + slider_channel( + ui, + root, + SliderGeometry::RGBA_X, + index, + label, + &mut bytes[index], + 0.0..=255.0, + "", + ); + } + if bytes != before_bytes { + set_current(session, bytes.map(|component| component / 255.0)); + } + + let mut hsva = Hsva::from_rgba_unmultiplied( + session.current[0], + session.current[1], + session.current[2], + session.current[3], + ); + let mut values = [ + hsva.h * 360.0, + hsva.s * 100.0, + hsva.v * 100.0, + hsva.a * 100.0, + ]; + let before = values; + for (index, label) in ["H", "S", "V", "A"].into_iter().enumerate() { + let range = if index == 0 { 0.0..=360.0 } else { 0.0..=100.0 }; + slider_channel( + ui, + root, + SliderGeometry::HSV_X, + index, + label, + &mut values[index], + range, + if index == 0 { "°" } else { "%" }, + ); + } + if values != before { + hsva.h = values[0] / 360.0; + hsva.s = values[1] / 100.0; + hsva.v = values[2] / 100.0; + hsva.a = values[3] / 100.0; + let [r, g, b] = hsva.to_rgb(); + set_current(session, [r, g, b, hsva.a]); + } +} + +#[allow(clippy::too_many_arguments)] +fn slider_channel( + ui: &mut egui::Ui, + root: egui::Rect, + group_x: f32, + index: usize, + label: &str, + value: &mut f32, + range: std::ops::RangeInclusive, + suffix: &str, +) { + let palette = crate::ui::design_system::palette(ui); + let y = SliderGeometry::FIRST_ROW_Y + index as f32 * SliderGeometry::ROW_STRIDE; + let label_rect = Geometry::at( + root, + group_x, + y, + SliderGeometry::LABEL_WIDTH, + SliderGeometry::ROW_HEIGHT, + ); + text( + ui, + label_rect.left_center(), + egui::Align2::LEFT_CENTER, + label, + TypeRole::Body.font(), + palette.text_secondary, + ); + + ui.put( + Geometry::at( + root, + group_x + SliderGeometry::TRACK_X, + y, + SliderGeometry::TRACK_WIDTH, + SliderGeometry::ROW_HEIGHT, + ), + egui::Slider::new(value, range.clone()).show_value(false), + ); + ui.put( + Geometry::at( + root, + group_x + SliderGeometry::VALUE_X, + y, + SliderGeometry::VALUE_WIDTH, + SliderGeometry::ROW_HEIGHT, + ), + egui::DragValue::new(value) + .range(range) + .suffix(suffix) + .max_decimals(0), + ); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn sliders_mode_matches_the_two_exported_channel_groups() { + assert_eq!(SliderGeometry::HSV_X - SliderGeometry::RGBA_X, 194.0); + assert_eq!(SliderGeometry::TRACK_WIDTH, 104.0); + assert_eq!(SliderGeometry::VALUE_WIDTH, 44.0); + assert_eq!(SliderGeometry::VALUE_X + SliderGeometry::VALUE_WIDTH, 178.0); + assert_eq!(SliderGeometry::ROW_STRIDE, 30.0); + assert_eq!(SliderGeometry::ROW_HEIGHT, 24.0); + } +} diff --git a/crates/editor/src/ui/design_system/controls.rs b/crates/editor/src/ui/design_system/controls.rs new file mode 100644 index 0000000..88a2235 --- /dev/null +++ b/crates/editor/src/ui/design_system/controls.rs @@ -0,0 +1,356 @@ +//! Reusable Penpot-styled editor controls with no world or asset-store access. + +use bevy_egui::egui; +use egui_phosphor_icons::{icons, Icon}; +use std::ops::RangeInclusive; + +use super::palette; +use super::typography::TypeRole; + +const SCALAR_CONTROL_WIDTH: f32 = 132.0; +const SCALAR_TRACK_X: f32 = 0.0; +const SCALAR_TRACK_WIDTH: f32 = 78.0; +const SCALAR_TRACK_INTERACTION_HEIGHT: f32 = 10.0; +const SCALAR_NUMBER_X: f32 = 84.0; +const SCALAR_NUMBER_WIDTH: f32 = 48.0; +const SCALAR_THUMB_RADIUS: f32 = 4.0; + +pub(crate) fn section_frame(ui: &egui::Ui) -> egui::Frame { + let palette = palette(ui); + egui::Frame::new() + .fill(palette.section) + .stroke(egui::Stroke::new(1.0_f32, palette.border)) + .corner_radius(egui::CornerRadius::same(5)) +} + +pub(crate) fn section_header(ui: &mut egui::Ui, title: &str, open: &mut bool) -> egui::Response { + section_header_with_summary(ui, title, None, open) +} + +pub(crate) fn section_header_with_summary( + ui: &mut egui::Ui, + title: &str, + summary: Option<&str>, + open: &mut bool, +) -> egui::Response { + let palette = palette(ui); + let (rect, response) = ui.allocate_exact_size( + egui::vec2( + ui.available_width().max(1.0), + super::INPUT_SECTION_HEADER_HEIGHT, + ), + egui::Sense::click(), + ); + ui.painter().rect_filled(rect, 4.0, palette.elevated); + ui.painter().text( + rect.left_center() + egui::vec2(12.0, 0.0), + egui::Align2::CENTER_CENTER, + if *open { + icons::CARET_DOWN.as_str() + } else { + icons::CARET_RIGHT.as_str() + }, + egui::FontId::new(10.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.text_secondary, + ); + ui.painter().text( + rect.left_center() + egui::vec2(28.0, 0.0), + egui::Align2::LEFT_CENTER, + title, + TypeRole::Section.font(), + palette.text_primary, + ); + if let Some(summary) = summary { + ui.painter().text( + rect.right_center() - egui::vec2(12.0, 0.0), + egui::Align2::RIGHT_CENTER, + summary, + TypeRole::Small.font(), + palette.text_muted, + ); + } + if response.clicked() { + *open = !*open; + } + response +} + +/// Compose a Phosphor glyph and Source Sans label without asking either font to render the +/// other's codepoints. This is the canonical path for icon-plus-text controls in a design-system +/// scope. +pub(crate) fn icon_label( + icon: Icon, + label: &str, + role: TypeRole, + icon_size: f32, + color: egui::Color32, +) -> egui::WidgetText { + let mut job = egui::text::LayoutJob::default(); + job.append( + icon.as_str(), + 0.0, + egui::TextFormat { + font_id: egui::FontId::new( + icon_size, + egui::FontFamily::Name("phosphor-regular".into()), + ), + color, + ..Default::default() + }, + ); + if !label.is_empty() { + job.append( + label, + 6.0, + egui::TextFormat { + font_id: role.font(), + color, + ..Default::default() + }, + ); + } + job.into() +} + +pub(crate) fn icon_button( + ui: &mut egui::Ui, + icon: Icon, + tooltip: &str, + enabled: bool, +) -> egui::Response { + let palette = palette(ui); + let response = ui.add_enabled( + enabled, + egui::Button::new(egui::RichText::new(icon.as_str()).font(egui::FontId::new( + 14.0, + egui::FontFamily::Name("phosphor-regular".into()), + ))) + .min_size(egui::vec2(24.0, 24.0)) + .fill(palette.control) + .stroke(egui::Stroke::new(1.0_f32, palette.border)) + .corner_radius(egui::CornerRadius::same(4)), + ); + response.on_hover_text(tooltip) +} + +pub(crate) fn status(ui: &mut egui::Ui, color: egui::Color32, label: &str, tooltip: &str) { + let palette = palette(ui); + let (dot, response) = ui.allocate_exact_size(egui::vec2(8.0, 14.0), egui::Sense::hover()); + ui.painter().circle_filled(dot.center(), 4.0, color); + response.on_hover_text(tooltip); + ui.label(TypeRole::Body.text(label).color(palette.text_secondary)); +} + +pub(crate) fn switch(ui: &mut egui::Ui, value: &mut bool) -> egui::Response { + let palette = palette(ui); + let (rect, mut response) = ui.allocate_exact_size(egui::vec2(31.0, 16.0), egui::Sense::click()); + if response.clicked() { + *value = !*value; + response.mark_changed(); + } + let fill = if *value { + palette.accent_dark + } else { + palette.control + }; + let stroke = if *value { + palette.accent + } else { + palette.border_strong + }; + ui.painter().rect( + rect, + 8.0, + fill, + egui::Stroke::new(1.0_f32, stroke), + egui::StrokeKind::Inside, + ); + let x = if *value { + rect.right() - 8.0 + } else { + rect.left() + 8.0 + }; + ui.painter() + .circle_filled(egui::pos2(x, rect.center().y), 5.0, palette.text_primary); + response +} + +/// Fixed 128×24 two-option control used by the Penpot material Surface section. +/// +/// Returning the selected side keeps the control independent from material state and prevents +/// stock `selectable_label` padding from changing its geometry. +pub(crate) fn two_option_segmented( + ui: &mut egui::Ui, + left_label: &str, + right_label: &str, + right_selected: bool, +) -> Option { + const WIDTH: f32 = 128.0; + const HEIGHT: f32 = 24.0; + const OPTION_WIDTH: f32 = WIDTH * 0.5; + + let palette = palette(ui); + let (rect, _) = ui.allocate_exact_size(egui::vec2(WIDTH, HEIGHT), egui::Sense::hover()); + ui.painter().rect( + rect, + 4.0, + palette.control, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + let left = egui::Rect::from_min_size(rect.min, egui::vec2(OPTION_WIDTH, HEIGHT)); + let right = egui::Rect::from_min_size( + rect.min + egui::vec2(OPTION_WIDTH, 0.0), + egui::vec2(OPTION_WIDTH, HEIGHT), + ); + let mut selection = None; + for (option_rect, label, selected, value) in [ + (left, left_label, !right_selected, false), + (right, right_label, right_selected, true), + ] { + let response = ui.interact( + option_rect, + ui.make_persistent_id(("two_option_segment", label)), + egui::Sense::click(), + ); + let fill = if selected { + palette.accent_dark + } else if response.hovered() { + palette.elevated + } else { + palette.control + }; + ui.painter().rect_filled(option_rect.shrink(1.0), 3.0, fill); + if selected { + ui.painter().rect_stroke( + option_rect, + 3.0, + egui::Stroke::new(1.0_f32, palette.accent), + egui::StrokeKind::Inside, + ); + } + ui.painter().text( + option_rect.center(), + egui::Align2::CENTER_CENTER, + label, + TypeRole::Control.font(), + if selected { + palette.text_primary + } else { + palette.text_secondary + }, + ); + if response.clicked() && right_selected != value { + selection = Some(value); + } + } + selection +} + +/// Exact Penpot scalar editor used by material inputs. +/// +/// The track and numeric field are painted as independent controls so egui's stock slider +/// padding cannot move the thumb into the value field at the reference width. +pub(crate) fn scalar_control( + ui: &mut egui::Ui, + salt: impl std::hash::Hash, + value: &mut f32, + range: RangeInclusive, + max_decimals: usize, +) -> egui::Response { + let palette = palette(ui); + let before = *value; + let width = SCALAR_CONTROL_WIDTH.min(ui.available_width().max(1.0)); + let (rect, base_response) = + ui.allocate_exact_size(egui::vec2(width, 22.0), egui::Sense::hover()); + let number_width = SCALAR_NUMBER_WIDTH.min(width); + let number_x = SCALAR_NUMBER_X.min((width - number_width).max(0.0)); + let track_width = SCALAR_TRACK_WIDTH.min((number_x - 6.0).max(1.0)); + let slider_rect = egui::Rect::from_min_size( + rect.min + egui::vec2(SCALAR_TRACK_X, 6.0), + egui::vec2(track_width, SCALAR_TRACK_INTERACTION_HEIGHT), + ); + let track_rect = + egui::Rect::from_center_size(slider_rect.center(), egui::vec2(track_width, 3.0)); + let slider_response = ui.interact( + slider_rect, + ui.make_persistent_id(("penpot_scalar", salt)), + egui::Sense::click_and_drag(), + ); + if slider_response.clicked() || slider_response.dragged() { + if let Some(pointer) = slider_response.interact_pointer_pos() { + let start = *range.start(); + let end = *range.end(); + let normalized = ((pointer.x - track_rect.left()) / track_rect.width()).clamp(0.0, 1.0); + *value = egui::lerp(start..=end, normalized); + } + } + + let start = *range.start(); + let end = *range.end(); + let normalized = if end > start { + ((*value - start) / (end - start)).clamp(0.0, 1.0) + } else { + 0.0 + }; + ui.painter().rect_filled(track_rect, 2.0, palette.border); + let fill = egui::Rect::from_min_max( + track_rect.left_top(), + egui::pos2( + egui::lerp(track_rect.x_range(), normalized), + track_rect.bottom(), + ), + ); + ui.painter().rect_filled(fill, 2.0, palette.accent); + let thumb_center = egui::pos2( + egui::lerp(track_rect.x_range(), normalized), + track_rect.center().y, + ); + ui.painter().circle( + thumb_center, + SCALAR_THUMB_RADIUS, + palette.text_primary, + egui::Stroke::new(1.0_f32, palette.accent), + ); + + let number_rect = egui::Rect::from_min_size( + rect.min + egui::vec2(number_x, 0.0), + egui::vec2(number_width, 22.0), + ); + let number_response = ui.put( + number_rect, + egui::DragValue::new(value) + .speed(0.01) + .range(range) + .max_decimals(max_decimals), + ); + let mut response = base_response.union(slider_response).union(number_response); + if *value != before { + response.mark_changed(); + } + response +} + +#[cfg(test)] +mod scalar_tests { + use super::*; + + #[test] + fn penpot_scalar_geometry_matches_the_current_export() { + assert!((SCALAR_NUMBER_X - (SCALAR_TRACK_X + SCALAR_TRACK_WIDTH) - 6.0).abs() < 0.001); + assert_eq!(SCALAR_CONTROL_WIDTH, SCALAR_NUMBER_X + SCALAR_NUMBER_WIDTH); + assert_eq!(SCALAR_TRACK_INTERACTION_HEIGHT, 10.0); + assert_eq!(SCALAR_THUMB_RADIUS, 4.0); + } +} + +#[cfg(test)] +mod segmented_tests { + #[test] + fn penpot_segmented_control_has_two_fixed_halves() { + const WIDTH: f32 = 128.0; + const OPTION_WIDTH: f32 = WIDTH * 0.5; + assert_eq!(OPTION_WIDTH, 64.0); + assert_eq!(OPTION_WIDTH * 2.0, WIDTH); + } +} diff --git a/crates/editor/src/ui/design_system/mod.rs b/crates/editor/src/ui/design_system/mod.rs new file mode 100644 index 0000000..36f3267 --- /dev/null +++ b/crates/editor/src/ui/design_system/mod.rs @@ -0,0 +1,154 @@ +//! Penpot-led editor design-system primitives. +//! +//! The first consumer is the Material Slot panel. These semantic tokens and controls are kept +//! independent from material/world state so later editor panels can migrate without copying style. + +pub(crate) mod color_picker; +pub(crate) mod controls; +pub(crate) mod property_grid; +pub(crate) mod typography; + +use bevy_egui::egui::{self, Color32, CornerRadius, Stroke}; + +use crate::ui::theme::EditorVisualPalette; + +#[cfg(test)] +pub(crate) const REFERENCE_WIDTH: f32 = 620.0; +pub(crate) const INSPECTOR_MIN_WIDTH: f32 = 420.0; +pub(crate) const OUTER_PADDING: f32 = 12.0; +pub(crate) const SECTION_GAP: f32 = 8.0; +pub(crate) const MATERIALS_HEADING_HEIGHT: f32 = 32.0; +pub(crate) const HEADER_HEIGHT: f32 = 82.0; +pub(crate) const COLLAPSED_HEADER_HEIGHT: f32 = 52.0; +pub(crate) const MATERIAL_PREVIEW_SIZE: f32 = 64.0; +pub(crate) const MATERIAL_IDENTITY_WIDTH: f32 = 229.5; +pub(crate) const SURFACE_SECTION_HEIGHT: f32 = 46.0; +pub(crate) const COMPACT_SURFACE_SECTION_HEIGHT: f32 = 46.0; +pub(crate) const INPUT_SECTION_HEADER_HEIGHT: f32 = 24.0; +pub(crate) const PARAMETER_ROW_HEIGHT: f32 = 32.0; +pub(crate) const COMPACT_PARAMETER_ROW_HEIGHT: f32 = 58.0; +pub(crate) const UV_SECTION_HEIGHT: f32 = 54.0; +pub(crate) const COMPACT_UV_SECTION_HEIGHT: f32 = 94.0; +pub(crate) const ADVANCED_COLLAPSED_HEIGHT: f32 = 30.0; +pub(crate) const ADVANCED_EXPANDED_HEIGHT: f32 = 178.0; +pub(crate) const CONTROL_HEIGHT: f32 = 24.0; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) struct DesignPalette { + pub accent: Color32, + pub accent_dark: Color32, + pub panel: Color32, + pub section: Color32, + pub recessed: Color32, + pub control: Color32, + pub elevated: Color32, + pub row_even: Color32, + pub row_odd: Color32, + pub checker: Color32, + pub border: Color32, + pub border_strong: Color32, + pub text_primary: Color32, + pub text_secondary: Color32, + pub text_muted: Color32, + pub healthy: Color32, + pub warning: Color32, + pub error: Color32, +} + +impl From for DesignPalette { + fn from(value: EditorVisualPalette) -> Self { + Self { + accent: value.selection, + accent_dark: value.selection_bg, + panel: value.panel, + section: value.widget, + recessed: value.panel_dark, + control: value.widget, + elevated: value.elevated, + row_even: value.panel, + row_odd: value.widget, + checker: value.elevated, + border: value.border, + border_strong: value.border_strong, + text_primary: value.text, + text_secondary: value.text_dim, + text_muted: value.text_muted, + healthy: value.success, + warning: value.warning, + error: value.error, + } + } +} + +pub(crate) fn palette(ui: &egui::Ui) -> DesignPalette { + crate::ui::theme::editor_palette(ui.ctx()).into() +} + +/// Applies the Penpot material-panel visual language locally without restyling the whole editor. +pub(crate) fn scope(ui: &mut egui::Ui, add_contents: impl FnOnce(&mut egui::Ui) -> R) -> R { + let palette = palette(ui); + ui.scope(|ui| { + let style = ui.style_mut(); + style.spacing.item_spacing = egui::vec2(8.0, 4.0); + style.spacing.button_padding = egui::vec2(8.0, 3.0); + style.spacing.interact_size = egui::vec2(31.0, CONTROL_HEIGHT); + style.visuals.widgets.noninteractive.bg_fill = palette.section; + style.visuals.widgets.noninteractive.bg_stroke = Stroke::new(1.0_f32, palette.border); + style.visuals.widgets.noninteractive.fg_stroke = + Stroke::new(1.0_f32, palette.text_secondary); + style.visuals.widgets.inactive.bg_fill = palette.control; + style.visuals.widgets.inactive.weak_bg_fill = palette.control; + style.visuals.widgets.inactive.bg_stroke = Stroke::new(1.0_f32, palette.border); + style.visuals.widgets.inactive.fg_stroke = Stroke::new(1.0_f32, palette.text_primary); + style.visuals.widgets.hovered.bg_fill = palette.elevated; + style.visuals.widgets.hovered.weak_bg_fill = palette.elevated; + style.visuals.widgets.hovered.bg_stroke = Stroke::new(1.0_f32, palette.border_strong); + style.visuals.widgets.hovered.fg_stroke = Stroke::new(1.0_f32, palette.text_primary); + style.visuals.widgets.active.bg_fill = palette.accent_dark; + style.visuals.widgets.active.weak_bg_fill = palette.accent_dark; + style.visuals.widgets.active.bg_stroke = Stroke::new(1.0_f32, palette.accent); + style.visuals.widgets.active.fg_stroke = Stroke::new(1.0_f32, palette.text_primary); + style.visuals.selection.bg_fill = palette.accent_dark; + style.visuals.selection.stroke = Stroke::new(1.0_f32, palette.accent); + style.visuals.window_fill = palette.panel; + style.visuals.window_stroke = Stroke::new(1.0_f32, palette.border_strong); + style.visuals.window_corner_radius = CornerRadius::same(7); + style.visuals.menu_corner_radius = CornerRadius::same(5); + style.visuals.override_text_color = Some(palette.text_primary); + typography::install_local_text_styles(style); + add_contents(ui) + }) + .inner +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn penpot_geometry_tokens_are_exact() { + assert_eq!(REFERENCE_WIDTH, 620.0); + assert_eq!(MATERIALS_HEADING_HEIGHT, 32.0); + assert_eq!(HEADER_HEIGHT, 82.0); + assert_eq!(COLLAPSED_HEADER_HEIGHT, 52.0); + assert_eq!(MATERIAL_PREVIEW_SIZE, 64.0); + assert_eq!(MATERIAL_IDENTITY_WIDTH, 229.5); + assert_eq!(SURFACE_SECTION_HEIGHT, 46.0); + assert_eq!(COMPACT_SURFACE_SECTION_HEIGHT, 46.0); + assert_eq!(INPUT_SECTION_HEADER_HEIGHT, 24.0); + assert_eq!(PARAMETER_ROW_HEIGHT, 32.0); + assert_eq!(COMPACT_PARAMETER_ROW_HEIGHT, 58.0); + assert_eq!(UV_SECTION_HEIGHT, 54.0); + assert_eq!(COMPACT_UV_SECTION_HEIGHT, 94.0); + assert_eq!(ADVANCED_COLLAPSED_HEIGHT, 30.0); + assert_eq!(ADVANCED_EXPANDED_HEIGHT, 178.0); + } + + #[test] + fn material_design_palette_uses_blacksite_semantics() { + let palette = DesignPalette::from(crate::ui::theme::BLACKSITE_PALETTE); + assert_eq!(palette.accent, crate::ui::theme::SELECTION); + assert_eq!(palette.panel, crate::ui::theme::PANEL_BG); + assert_eq!(palette.text_primary, crate::ui::theme::TEXT); + } +} diff --git a/crates/editor/src/ui/design_system/property_grid.rs b/crates/editor/src/ui/design_system/property_grid.rs new file mode 100644 index 0000000..5d8dbc4 --- /dev/null +++ b/crates/editor/src/ui/design_system/property_grid.rs @@ -0,0 +1,260 @@ +//! Testable geometry for dense Penpot material property rows. + +use super::{COMPACT_PARAMETER_ROW_HEIGHT, PARAMETER_ROW_HEIGHT}; +use bevy_egui::egui; + +pub(crate) const WIDE_SECTION_WIDTH: f32 = 569.0; +pub(crate) const RESPONSIVE_BREAKPOINT: f32 = WIDE_SECTION_WIDTH; +/// The actor component chrome can consume up to twelve pixels of the exported 372 px compact +/// canvas. At 360 px the complete texture row still fits: 12 px inset + 336 px group + 12 px inset. +const COMPACT_INLINE_ACTION_FIT_WIDTH: f32 = 357.0; + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(crate) struct PropertyGridGeometry { + pub stacked: bool, + pub row_height: f32, +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(crate) struct PropertyRowRects { + pub row: egui::Rect, + pub label: egui::Rect, + pub value: egui::Rect, + pub channel: egui::Rect, + pub texture_group: egui::Rect, + pub texture_field: egui::Rect, + pub locate: egui::Rect, + pub clear: egui::Rect, + pub inline_texture_actions: bool, +} + +impl PropertyGridGeometry { + pub(crate) fn for_width(section_width: f32) -> Self { + if section_width + f32::EPSILON >= RESPONSIVE_BREAKPOINT { + Self { + stacked: false, + row_height: PARAMETER_ROW_HEIGHT, + } + } else { + Self { + stacked: true, + row_height: COMPACT_PARAMETER_ROW_HEIGHT, + } + } + } + + pub(crate) fn row_rects(self, row: egui::Rect) -> PropertyRowRects { + let inset = 12.0_f32.min(row.width() * 0.5); + let inner_width = (row.width() - inset * 2.0).max(1.0); + if !self.stacked { + let texture_group_width = (inner_width - 286.5).max(60.0); + let texture_field_width = (texture_group_width - 60.0).max(1.0); + let texture_group = egui::Rect::from_min_size( + row.min + egui::vec2(298.5, 5.0), + egui::vec2(texture_group_width, 22.0), + ); + return PropertyRowRects { + row, + label: egui::Rect::from_min_size( + row.min + egui::vec2(12.0, 5.0), + egui::vec2(82.0, 22.0), + ), + value: egui::Rect::from_min_size( + row.min + egui::vec2(96.0, 5.0), + egui::vec2(132.0, 22.0), + ), + channel: egui::Rect::from_min_size( + row.min + egui::vec2(234.0, 5.0), + egui::vec2(48.0, 22.0), + ), + texture_group, + texture_field: egui::Rect::from_min_size( + texture_group.min, + egui::vec2(texture_field_width, 22.0), + ), + locate: egui::Rect::from_min_size( + texture_group.min + egui::vec2(texture_field_width + 6.0, 0.0), + egui::vec2(24.0, 22.0), + ), + clear: egui::Rect::from_min_size( + texture_group.min + egui::vec2(texture_field_width + 36.0, 0.0), + egui::vec2(24.0, 22.0), + ), + inline_texture_actions: true, + }; + } + + let channel_width = 48.0_f32.min(inner_width); + let channel_x = inset + inner_width - channel_width; + let value_x = (inset + 84.0).min(channel_x); + let value_width = (channel_x - value_x - 6.35).max(1.0); + let texture_group = egui::Rect::from_min_size( + row.min + egui::vec2(inset, 31.0), + egui::vec2(inner_width, 22.0), + ); + let inline_texture_actions = row.width() + f32::EPSILON >= COMPACT_INLINE_ACTION_FIT_WIDTH; + let texture_field_width = if inline_texture_actions { + (inner_width - 60.0).max(1.0) + } else { + (inner_width - 30.0).max(1.0) + }; + let overflow_or_locate_x = texture_field_width + 6.0; + PropertyRowRects { + row, + label: egui::Rect::from_min_size( + row.min + egui::vec2(inset, 5.0), + egui::vec2(78.0_f32.min(inner_width), 22.0), + ), + value: egui::Rect::from_min_size( + row.min + egui::vec2(value_x, 5.0), + egui::vec2(value_width, 22.0), + ), + channel: egui::Rect::from_min_size( + row.min + egui::vec2(channel_x, 5.0), + egui::vec2(channel_width, 22.0), + ), + texture_group, + texture_field: egui::Rect::from_min_size( + texture_group.min, + egui::vec2(texture_field_width, 22.0), + ), + locate: egui::Rect::from_min_size( + texture_group.min + egui::vec2(overflow_or_locate_x, 0.0), + egui::vec2(24.0, 22.0), + ), + clear: egui::Rect::from_min_size( + texture_group.min + + egui::vec2( + if inline_texture_actions { + texture_field_width + 36.0 + } else { + inner_width + }, + 0.0, + ), + egui::vec2(if inline_texture_actions { 24.0 } else { 0.0 }, 22.0), + ), + inline_texture_actions, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn penpot_exact_reference_geometry_matches_columns() { + let geometry = PropertyGridGeometry::for_width(569.0); + assert!(!geometry.stacked); + assert_eq!(geometry.row_height, 32.0); + } + + #[test] + fn penpot_below_reference_width_reflows_without_compression() { + let geometry = PropertyGridGeometry::for_width(568.0); + assert!(geometry.stacked); + assert_eq!(geometry.row_height, 58.0); + } + + #[test] + fn row_rects_match_exported_wide_geometry() { + let row = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(569.0, 32.0)); + let rects = PropertyGridGeometry::for_width(569.0).row_rects(row); + assert_eq!(rects.label.min, egui::pos2(12.0, 5.0)); + assert_eq!(rects.value.min, egui::pos2(96.0, 5.0)); + assert!((rects.value.width() - 132.0).abs() < 0.001); + assert_eq!(rects.value.height(), 22.0); + assert_eq!( + rects.channel, + egui::Rect::from_min_size(egui::pos2(234.0, 5.0), egui::vec2(48.0, 22.0)) + ); + assert_eq!( + rects.texture_group, + egui::Rect::from_min_size(egui::pos2(298.5, 5.0), egui::vec2(258.5, 22.0)) + ); + assert_eq!(rects.texture_field.size(), egui::vec2(198.5, 22.0)); + assert_eq!(rects.locate.min, egui::pos2(503.0, 5.0)); + assert_eq!(rects.clear.min, egui::pos2(533.0, 5.0)); + assert!(rects.inline_texture_actions); + } + + #[test] + fn row_rects_match_exported_compact_geometry() { + let row = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(369.0, 58.0)); + let rects = PropertyGridGeometry::for_width(369.0).row_rects(row); + assert_eq!(rects.label.min, egui::pos2(12.0, 5.0)); + assert_eq!(rects.value.min, egui::pos2(96.0, 5.0)); + assert_eq!( + rects.channel, + egui::Rect::from_min_size(egui::pos2(309.0, 5.0), egui::vec2(48.0, 22.0)) + ); + assert_eq!( + rects.texture_group, + egui::Rect::from_min_size(egui::pos2(12.0, 31.0), egui::vec2(345.0, 22.0)) + ); + assert_eq!(rects.texture_field.size(), egui::vec2(285.0, 22.0)); + assert_eq!(rects.locate.min, egui::pos2(303.0, 31.0)); + assert_eq!(rects.clear.min, egui::pos2(333.0, 31.0)); + assert!(rects.inline_texture_actions); + } + + #[test] + fn transient_row_rects_are_finite_and_contained() { + for width in [356.0, 300.0, 240.0] { + let row = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(width, 58.0)); + let rects = PropertyGridGeometry::for_width(width).row_rects(row); + for rect in [ + rects.label, + rects.value, + rects.channel, + rects.texture_group, + rects.texture_field, + rects.locate, + rects.clear, + ] { + assert!(rect.is_finite()); + assert!(row.contains_rect(rect)); + } + assert!(!rects.inline_texture_actions); + } + } + + #[test] + fn inspector_chrome_reduced_floor_keeps_compact_texture_actions() { + let row = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(363.0, 58.0)); + let rects = PropertyGridGeometry::for_width(363.0).row_rects(row); + assert!(rects.inline_texture_actions); + assert_eq!(rects.texture_group.min, egui::pos2(12.0, 31.0)); + assert_eq!(rects.texture_group.max, egui::pos2(351.0, 53.0)); + assert!(row.contains_rect(rects.locate)); + assert!(row.contains_rect(rects.clear)); + } + + #[test] + fn penpot_wide_growth_only_expands_texture_field() { + let reference_row = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(569.0, 32.0)); + let wide_row = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(669.0, 32.0)); + let reference = PropertyGridGeometry::for_width(569.0).row_rects(reference_row); + let wide = PropertyGridGeometry::for_width(669.0).row_rects(wide_row); + assert_eq!(wide.label, reference.label); + assert_eq!(wide.value, reference.value); + assert_eq!(wide.channel, reference.channel); + assert_eq!( + wide.texture_field.width(), + reference.texture_field.width() + 100.0 + ); + } + + #[test] + fn penpot_very_narrow_first_line_never_exceeds_inner_width() { + let geometry = PropertyGridGeometry::for_width(300.0); + assert!(geometry.stacked); + let row = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(300.0, 58.0)); + let rects = geometry.row_rects(row); + assert!(row.contains_rect(rects.label)); + assert!(row.contains_rect(rects.value)); + assert!(row.contains_rect(rects.channel)); + assert_eq!(rects.texture_group.width(), 276.0); + } +} diff --git a/crates/editor/src/ui/design_system/typography.rs b/crates/editor/src/ui/design_system/typography.rs new file mode 100644 index 0000000..8696f1c --- /dev/null +++ b/crates/editor/src/ui/design_system/typography.rs @@ -0,0 +1,80 @@ +//! Source Sans typography roles used by the Penpot-led editor visual system. + +use bevy_egui::egui::{self, FontFamily, FontId, RichText, Style, TextStyle}; + +use crate::ui::fonts::{SOURCE_SANS_BOLD, SOURCE_SANS_REGULAR}; + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(crate) enum TypeRole { + Caption, + Small, + Body, + Control, + Section, + Title, +} + +impl TypeRole { + pub(crate) const fn size(self) -> f32 { + match self { + Self::Caption => 9.0, + Self::Small => 10.0, + Self::Body => 11.0, + Self::Control => 12.0, + Self::Section => 12.0, + Self::Title => 16.0, + } + } + + pub(crate) const fn bold(self) -> bool { + matches!(self, Self::Section | Self::Title) + } + + pub(crate) fn font(self) -> FontId { + let family = if self.bold() { + SOURCE_SANS_BOLD + } else { + SOURCE_SANS_REGULAR + }; + FontId::new(self.size(), FontFamily::Name(family.into())) + } + + pub(crate) fn text(self, value: impl Into) -> RichText { + RichText::new(value).font(self.font()) + } +} + +pub(crate) fn install_local_text_styles(style: &mut Style) { + style + .text_styles + .insert(TextStyle::Body, TypeRole::Body.font()); + style + .text_styles + .insert(TextStyle::Button, TypeRole::Control.font()); + style + .text_styles + .insert(TextStyle::Small, TypeRole::Small.font()); + style + .text_styles + .insert(TextStyle::Heading, TypeRole::Title.font()); + style.text_styles.insert( + TextStyle::Monospace, + FontId::new(11.0, egui::FontFamily::Monospace), + ); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn penpot_type_scale_and_weights_are_stable() { + assert_eq!(TypeRole::Caption.size(), 9.0); + assert_eq!(TypeRole::Small.size(), 10.0); + assert_eq!(TypeRole::Body.size(), 11.0); + assert_eq!(TypeRole::Section.size(), 12.0); + assert_eq!(TypeRole::Title.size(), 16.0); + assert!(!TypeRole::Body.bold()); + assert!(TypeRole::Section.bold()); + } +} diff --git a/crates/editor/src/ui/document_status.rs b/crates/editor/src/ui/document_status.rs new file mode 100644 index 0000000..5be259e --- /dev/null +++ b/crates/editor/src/ui/document_status.rs @@ -0,0 +1,38 @@ +//! Shared authored-document state presentation for editor authoring surfaces. + +use bevy_egui::egui; + +use crate::asset_documents::{ + AuthoredDocumentSnapshot, AuthoredDocumentState, DerivedProcessingState, +}; + +use super::theme::{ACCENT, ERROR, WARNING}; + +pub(crate) fn authored_document_status_ui(ui: &mut egui::Ui, snapshot: &AuthoredDocumentSnapshot) { + ui.horizontal_wrapped(|ui| { + if snapshot.dirty { + ui.small(egui::RichText::new("UNSAVED").color(WARNING).strong()); + } + match snapshot.state { + AuthoredDocumentState::ExternalConflict => { + ui.small(egui::RichText::new("CONFLICT").color(ERROR).strong()); + } + AuthoredDocumentState::SaveFailed => { + ui.small(egui::RichText::new("SAVE FAILED").color(ERROR).strong()); + } + AuthoredDocumentState::Saving => { + ui.small(egui::RichText::new("SAVING").color(ACCENT)); + } + AuthoredDocumentState::Clean | AuthoredDocumentState::Dirty => {} + } + match snapshot.processing { + DerivedProcessingState::Queued | DerivedProcessingState::Processing => { + ui.small(egui::RichText::new("PROCESSING").color(ACCENT)); + } + DerivedProcessingState::Failed => { + ui.small(egui::RichText::new("PROCESS FAILED").color(ERROR)); + } + DerivedProcessingState::Idle => {} + } + }); +} diff --git a/crates/editor/src/ui/fonts.rs b/crates/editor/src/ui/fonts.rs index 647f326..5e1925f 100644 --- a/crates/editor/src/ui/fonts.rs +++ b/crates/editor/src/ui/fonts.rs @@ -1,7 +1,11 @@ -//! Phosphor icon font registration for the primary egui context. +//! Editor text and icon font registration for the primary egui context. use bevy::prelude::*; use bevy_egui::{EguiContext, PrimaryEguiContext}; +use std::sync::Arc; + +pub(crate) const SOURCE_SANS_REGULAR: &str = "blacksite-source-sans-regular"; +pub(crate) const SOURCE_SANS_BOLD: &str = "blacksite-source-sans-bold"; pub struct EditorFontsPlugin; @@ -15,9 +19,40 @@ fn configure_editor_fonts(mut contexts: Query<&mut EguiContext, Added bevy_egui::egui::FontDefinitions { let mut fonts = bevy_egui::egui::FontDefinitions::default(); egui_phosphor_icons::add_fonts(&mut fonts); + fonts.font_data.insert( + SOURCE_SANS_REGULAR.to_owned(), + Arc::new(bevy_egui::egui::FontData::from_static(include_bytes!( + "../../assets/fonts/source-sans/SourceSansPro-Regular.ttf" + ))), + ); + fonts.font_data.insert( + SOURCE_SANS_BOLD.to_owned(), + Arc::new(bevy_egui::egui::FontData::from_static(include_bytes!( + "../../assets/fonts/source-sans/SourceSansPro-Bold.ttf" + ))), + ); + + let proportional = fonts + .families + .entry(bevy_egui::egui::FontFamily::Proportional) + .or_default(); + proportional.insert(0, SOURCE_SANS_REGULAR.to_owned()); + fonts.families.insert( + bevy_egui::egui::FontFamily::Name(SOURCE_SANS_REGULAR.into()), + vec![SOURCE_SANS_REGULAR.to_owned()], + ); + fonts.families.insert( + bevy_egui::egui::FontFamily::Name(SOURCE_SANS_BOLD.into()), + vec![SOURCE_SANS_BOLD.to_owned(), SOURCE_SANS_REGULAR.to_owned()], + ); + // Phosphor families contain icon glyphs only. Text fallbacks give egui a // replacement glyph for malformed/missing icons without changing icon lookup. let text_fallbacks = fonts @@ -38,5 +73,5 @@ fn configure_editor_fonts(mut contexts: Query<&mut EguiContext, Added 150.0 { @@ -696,7 +696,7 @@ fn draw_runtime_node( ui.painter().line_segment( [response.rect.left_top(), response.rect.left_bottom()], egui::Stroke::new( - if primary { 3.0 } else { 2.0 }, + if primary { 3.0_f32 } else { 2.0_f32 }, if primary { SELECTION } else { diff --git a/crates/editor/src/ui/inspector.rs b/crates/editor/src/ui/inspector.rs index 5d6342d..7c2a8ce 100644 --- a/crates/editor/src/ui/inspector.rs +++ b/crates/editor/src/ui/inspector.rs @@ -1,7 +1,8 @@ //! Inspector extensions for authoring components. use std::collections::{HashMap, HashSet}; -use std::path::Path; +use std::fs; +use std::path::{Path, PathBuf}; use bevy::prelude::*; use bevy_egui::egui; @@ -9,24 +10,25 @@ use egui_phosphor_icons::{icons, Icon}; use shared::{ authoring_component_active, brush_math::{validate_brush, BrushDiagnosticSeverity}, - infer_actor_kind, ActorId, ActorKind, AnimationControllerDesc, AudioListenerDesc, - AudioSourceDesc, AuthoringComponentStates, AuthoringLightKind, AuthoringRigidBody, BrushDesc, - BrushKind, ColliderDesc, ColliderShapeDesc, ColorDesc, ComponentInstanceId, EditorAssetRef, - InspectorOrder, LevelObject, LightDesc, MaterialDesc, MaterialParameter, - MaterialParameterValue, MaterialRef, MaterialShaderKind, NavigationArea, NavigationBounds, - NavigationLink, NavigationObstacle, ObjectiveMarker, PhysicsBody, PlayerSpawn, - PostProcessVolumeDesc, PrefabInstance, Primitive, PrimitiveShape, ProjectSun, RigidBodyDesc, - SkinnedMeshRenderer, StaticMeshRenderer, StaticMeshRendererEntry, TeamSpawn, TerrainDesc, - TriggerVolume, WeaponSpawn, AUTHORING_DIRECTIONAL_LUX_MAX, AUTHORING_POINT_SPOT_LUMENS_MAX, - COMPONENT_ANIMATION_CONTROLLER_DESC, COMPONENT_AUDIO_LISTENER_DESC, - COMPONENT_AUDIO_SOURCE_DESC, COMPONENT_BRUSH_DESC, COMPONENT_COLLIDER_DESC, - COMPONENT_LIGHT_DESC, COMPONENT_MATERIAL_DESC, COMPONENT_NAVIGATION_AREA, - COMPONENT_NAVIGATION_BOUNDS, COMPONENT_NAVIGATION_LINK, COMPONENT_NAVIGATION_OBSTACLE, - COMPONENT_OBJECTIVE_MARKER, COMPONENT_PHYSICS_BODY, COMPONENT_PLAYER_SPAWN, - COMPONENT_POST_PROCESS_VOLUME, COMPONENT_PREFAB_INSTANCE, COMPONENT_PRIMITIVE, - COMPONENT_PROJECT_SUN, COMPONENT_RIGID_BODY_DESC, COMPONENT_SKINNED_MESH_RENDERER, - COMPONENT_STATIC_MESH_RENDERER, COMPONENT_TEAM_SPAWN, COMPONENT_TERRAIN_DESC, - COMPONENT_TRIGGER_VOLUME, COMPONENT_WEAPON_SPAWN, + infer_actor_kind, standard_lit_input_schema, ActorId, ActorKind, AnimationControllerDesc, + AudioListenerDesc, AudioSourceDesc, AuthoringComponentStates, AuthoringLightKind, + AuthoringRigidBody, BrushDesc, BrushKind, ColliderDesc, ColliderShapeDesc, ColorDesc, + ComponentInstanceId, EditorAssetRef, InspectorOrder, LevelObject, LightDesc, MaterialAsset, + MaterialDesc, MaterialInstanceAsset, MaterialParameter, MaterialParameterValue, + MaterialPropertyBlock, MaterialPropertyBlocks, MaterialRef, MaterialShaderKind, NavigationArea, + NavigationBounds, NavigationLink, NavigationObstacle, ObjectiveMarker, PhysicsBody, + PlayerSpawn, PostProcessVolumeDesc, PrefabInstance, Primitive, PrimitiveShape, ProjectSun, + RigidBodyDesc, SkinnedMeshRenderer, StaticMeshRenderer, StaticMeshRendererEntry, TeamSpawn, + TerrainDesc, TriggerVolume, WeaponSpawn, AUTHORING_DIRECTIONAL_LUX_MAX, + AUTHORING_POINT_SPOT_LUMENS_MAX, COMPONENT_ANIMATION_CONTROLLER_DESC, + COMPONENT_AUDIO_LISTENER_DESC, COMPONENT_AUDIO_SOURCE_DESC, COMPONENT_BRUSH_DESC, + COMPONENT_COLLIDER_DESC, COMPONENT_LIGHT_DESC, COMPONENT_MATERIAL_DESC, + COMPONENT_NAVIGATION_AREA, COMPONENT_NAVIGATION_BOUNDS, COMPONENT_NAVIGATION_LINK, + COMPONENT_NAVIGATION_OBSTACLE, COMPONENT_OBJECTIVE_MARKER, COMPONENT_PHYSICS_BODY, + COMPONENT_PLAYER_SPAWN, COMPONENT_POST_PROCESS_VOLUME, COMPONENT_PREFAB_INSTANCE, + COMPONENT_PRIMITIVE, COMPONENT_PROJECT_SUN, COMPONENT_RIGID_BODY_DESC, + COMPONENT_SKINNED_MESH_RENDERER, COMPONENT_STATIC_MESH_RENDERER, COMPONENT_TEAM_SPAWN, + COMPONENT_TERRAIN_DESC, COMPONENT_TRIGGER_VOLUME, COMPONENT_WEAPON_SPAWN, }; use crate::history::{ @@ -37,9 +39,9 @@ use crate::history::{ set_primitive_with_history, set_rigid_body_with_history, set_static_mesh_renderer_with_history, EditorEntitySnapshot, }; +use crate::ui::materials::material_input_schema_editor; use crate::ui::theme::{ - panel_heading, BORDER, ELEVATED_BG, PANEL_BG_DARK, SELECTION_BG_MUTED, TEXT_DIM, TEXT_MUTED, - WIDGET_BG, + panel_heading, BORDER, PANEL_BG_DARK, SELECTION_BG_MUTED, TEXT_DIM, TEXT_MUTED, WIDGET_BG, }; use crate::ui::widgets::{icon_button_small, phosphor_icon, phosphor_icon_text}; use crate::viewport::brush_edit::{BrushElementKey, BrushElementSelection}; @@ -52,15 +54,20 @@ use super::component_registry::{ }; use super::helpers::create_scene_sun_override_from_project_settings; use super::EditorTab; -use crate::assets::asset_db::{find_asset_by_path, AssetRegistry}; +use crate::assets::asset_db::{ + ensure_asset_record_at, find_asset_by_path, AssetRegistry, ModelMaterialSelection, +}; use crate::assets::static_mesh::{ load_static_mesh_manifest, material_id_from_label, part_id_from_label, }; use crate::assets::thumbnails::ThumbnailStudio; use crate::assets::{ - asset_cache_key, AssetSelection, AssetSubAssetKind, AssetThumbnailCache, EditorAsset, - EditorAssetKind, EditorAssets, + asset_cache_key, invalidate_on_catalog_refresh, prefetch_asset_thumbnails, AssetSelection, + AssetSubAssetKind, AssetThumbnailCache, EditorAssetKind, EditorAssets, ASSETS_ROOT, + BUILTINS_FOLDER, }; +use crate::project::collaboration::{publish_authored_file, FileSnapshot, FileWriteIntent}; +use crate::project_io::ProjectWorkspace; const COMPACT_INSPECTOR_WIDTH: f32 = 360.0; const ASSET_SELECTOR_LABEL_WIDTH: f32 = 72.0; @@ -111,6 +118,11 @@ struct AssetSelectorResponse { accepted_drop: bool, } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum AssetSelectorActions { + Full, +} + #[derive(Debug, Clone)] struct TextureAssetCandidate { label: String, @@ -136,6 +148,35 @@ pub(crate) struct InspectorPanelState { collapsed_components: HashSet, } +#[derive(Resource, Default, Debug, Clone)] +pub(crate) struct PropertyBlockPromotionReview { + pending: Option, + error: Option, +} + +#[derive(Debug, Clone)] +struct PromotionSourceSnapshot { + path: PathBuf, + snapshot: FileSnapshot, +} + +#[derive(Debug, Clone)] +struct PendingPropertyBlockPromotion { + entity: Entity, + slot_id: ComponentInstanceId, + slot_name: String, + base: MaterialRef, + block: MaterialPropertyBlock, + project_root: PathBuf, + destination_path: PathBuf, + destination_absolute: PathBuf, + target_snapshot: FileSnapshot, + source_snapshots: Vec, + instance: MaterialInstanceAsset, + bytes: Vec, + clear_property_block: bool, +} + #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum AddComponentShelfDirection { Up, @@ -207,6 +248,8 @@ pub(crate) struct ComponentCardOptions { pub reorderable: bool, pub resettable: bool, pub copyable: bool, + pub summary: &'static str, + pub body_margin: i8, } impl ComponentCardOptions { @@ -220,6 +263,8 @@ impl ComponentCardOptions { reorderable: true, resettable: true, copyable: true, + summary: "Authoring component", + body_margin: 12, } } @@ -233,6 +278,8 @@ impl ComponentCardOptions { reorderable: false, resettable: true, copyable: false, + summary: "Authoring component", + body_margin: 12, } } } @@ -301,4699 +348,53 @@ pub(crate) fn component_card_context( } } -pub(crate) fn apply_component_card_response( - world: &mut World, - entity: Entity, - response: ComponentCardResponse, -) { - let type_name = response_type_name(&response).unwrap_or_default(); - if type_name.is_empty() { - return; - } - apply_component_card_response_for_type(world, entity, type_name, response); -} - -fn apply_component_card_response_for_type( - world: &mut World, - entity: Entity, - type_name: &'static str, - response: ComponentCardResponse, -) { - if let Some(collapsed) = response.collapsed { - let key = component_card_key(world, entity, type_name); - let mut panel_state = world.resource_mut::(); - if collapsed { - panel_state.collapsed_components.insert(key); - } else { - panel_state.collapsed_components.remove(&key); - } - } - - if let Some(active) = response.active { - let mut states = world - .get::(entity) - .cloned() - .unwrap_or_else(|| AuthoringComponentStates { - states: world - .get::(entity) - .map(|order| order.component_states.clone()) - .unwrap_or_default(), - }); - let component_id = world - .resource::() - .stable_id_for_type(type_name); - states.set_component_active(component_id, active); - let _ = crate::history::reflected_component_transaction( - world, - entity, - "Set Component Active", - "editor.component_states", - "shared::components::AuthoringComponentStates", - move |world, entity| { - world.entity_mut(entity).insert(states); - Ok(()) - }, - ); - } - - if response.move_up || response.move_down { - let mut order = world - .get::(entity) - .cloned() - .unwrap_or_default(); - let present = present_component_type_names(world, entity); - let offset = if response.move_up { -1 } else { 1 }; - let moved = world - .resource::() - .move_component(&mut order, type_name, offset, &present); - if moved { - set_inspector_order_with_history(world, entity, order); - } - } - - if response.copy { - copy_component(world, entity, type_name); - } - if response.paste { - paste_component(world, entity, type_name); - } - if response.reset { - reset_component(world, entity, type_name); - } - if response.remove { - remove_registered_component(world, entity, type_name); - } -} - -fn response_type_name(_response: &ComponentCardResponse) -> Option<&'static str> { - Some(_response.type_name) -} - -fn component_card_key(world: &World, entity: Entity, type_name: &str) -> String { - let actor_key = world - .get::(entity) - .map(|id| id.0.as_str()) - .filter(|id| !id.trim().is_empty()) - .map(str::to_string) - .unwrap_or_else(|| format!("{entity:?}")); - format!("{actor_key}::{type_name}") -} - -fn present_component_type_names(world: &World, entity: Entity) -> Vec<&'static str> { - if let Some(registry) = world.get_resource::() { - return registry - .descriptors - .iter() - .filter(|descriptor| { - !descriptor.hidden - && registry.component_present(world, entity, descriptor.type_name) - }) - .map(|descriptor| descriptor.type_name) - .collect(); - } - let mut present = Vec::new(); - if world.get::(entity).is_some() { - present.push(COMPONENT_ANIMATION_CONTROLLER_DESC); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_STATIC_MESH_RENDERER); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_SKINNED_MESH_RENDERER); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_PRIMITIVE); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_BRUSH_DESC); - } - if world.get::(entity).is_some() || world.get::(entity).is_some() { - present.push(COMPONENT_MATERIAL_DESC); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_LIGHT_DESC); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_AUDIO_SOURCE_DESC); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_AUDIO_LISTENER_DESC); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_RIGID_BODY_DESC); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_COLLIDER_DESC); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_PHYSICS_BODY); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_PLAYER_SPAWN); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_WEAPON_SPAWN); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_TRIGGER_VOLUME); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_TEAM_SPAWN); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_OBJECTIVE_MARKER); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_PREFAB_INSTANCE); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_POST_PROCESS_VOLUME); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_PROJECT_SUN); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_NAVIGATION_BOUNDS); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_NAVIGATION_OBSTACLE); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_NAVIGATION_AREA); - } - if world.get::(entity).is_some() { - present.push(COMPONENT_NAVIGATION_LINK); - } - present -} - -fn copy_component(world: &mut World, entity: Entity, type_name: &str) { - let descriptor = world - .resource::() - .by_type_name(type_name) - .cloned(); - if let Some(descriptor) = descriptor { - if let Ok(Some(value)) = crate::history::capture_reflected_component( - world, - entity, - descriptor.id, - descriptor.type_name, - ) { - world.resource_mut::().component = - Some(CopiedComponent::Reflected(value)); - return; - } - } - let component = match type_name { - COMPONENT_ANIMATION_CONTROLLER_DESC => world - .get::(entity) - .cloned() - .map(CopiedComponent::AnimationControllerDesc), - COMPONENT_PRIMITIVE => world - .get::(entity) - .cloned() - .map(CopiedComponent::Primitive), - COMPONENT_BRUSH_DESC => world - .get::(entity) - .cloned() - .map(CopiedComponent::BrushDesc), - COMPONENT_STATIC_MESH_RENDERER => world - .get::(entity) - .cloned() - .map(CopiedComponent::StaticMeshRenderer), - COMPONENT_MATERIAL_DESC => world - .get::(entity) - .cloned() - .map(CopiedComponent::MaterialDesc), - COMPONENT_LIGHT_DESC => world - .get::(entity) - .cloned() - .map(CopiedComponent::LightDesc), - COMPONENT_AUDIO_SOURCE_DESC => world - .get::(entity) - .cloned() - .map(CopiedComponent::AudioSourceDesc), - COMPONENT_AUDIO_LISTENER_DESC => world - .get::(entity) - .copied() - .map(CopiedComponent::AudioListenerDesc), - COMPONENT_RIGID_BODY_DESC => world - .get::(entity) - .copied() - .map(CopiedComponent::RigidBodyDesc), - COMPONENT_COLLIDER_DESC => world - .get::(entity) - .cloned() - .map(CopiedComponent::ColliderDesc), - COMPONENT_PHYSICS_BODY => world - .get::(entity) - .cloned() - .map(CopiedComponent::PhysicsBody), - COMPONENT_WEAPON_SPAWN => world - .get::(entity) - .cloned() - .map(CopiedComponent::WeaponSpawn), - COMPONENT_TRIGGER_VOLUME => world - .get::(entity) - .cloned() - .map(CopiedComponent::TriggerVolume), - COMPONENT_TEAM_SPAWN => world - .get::(entity) - .cloned() - .map(CopiedComponent::TeamSpawn), - COMPONENT_OBJECTIVE_MARKER => world - .get::(entity) - .cloned() - .map(CopiedComponent::ObjectiveMarker), - COMPONENT_POST_PROCESS_VOLUME => world - .get::(entity) - .cloned() - .map(CopiedComponent::PostProcessVolume), - COMPONENT_PREFAB_INSTANCE => world - .get::(entity) - .cloned() - .map(CopiedComponent::PrefabInstance), - COMPONENT_NAVIGATION_BOUNDS => world - .get::(entity) - .cloned() - .map(CopiedComponent::NavigationBounds), - COMPONENT_NAVIGATION_OBSTACLE => world - .get::(entity) - .cloned() - .map(CopiedComponent::NavigationObstacle), - COMPONENT_NAVIGATION_AREA => world - .get::(entity) - .cloned() - .map(CopiedComponent::NavigationArea), - COMPONENT_NAVIGATION_LINK => world - .get::(entity) - .cloned() - .map(CopiedComponent::NavigationLink), - _ => None, - }; - if let Some(component) = component { - world.resource_mut::().component = Some(component); - } -} - -fn paste_component(world: &mut World, entity: Entity, type_name: &str) { - let component = world - .get_resource::() - .and_then(|clipboard| clipboard.component.clone()); - if let Some(CopiedComponent::Reflected(value)) = component.as_ref() { - if value.type_path == type_name { - let value = value.clone(); - let component_id = value.component_id.clone(); - let _ = crate::history::reflected_component_transaction( - world, - entity, - "Paste Component", - &component_id, - type_name, - move |world, entity| { - crate::history::apply_reflected_component( - world, - entity, - type_name, - Some(&value), - ) - }, - ); - } - return; - } - match component { - Some(CopiedComponent::Reflected(_)) => {} - Some(CopiedComponent::AnimationControllerDesc(value)) - if type_name == COMPONENT_ANIMATION_CONTROLLER_DESC => - { - set_animation_controller_with_history(world, entity, value); - } - Some(CopiedComponent::Primitive(value)) if type_name == COMPONENT_PRIMITIVE => { - set_primitive_with_history(world, entity, value); - } - Some(CopiedComponent::BrushDesc(value)) if type_name == COMPONENT_BRUSH_DESC => { - set_brush_with_history(world, entity, value); - } - Some(CopiedComponent::StaticMeshRenderer(value)) - if type_name == COMPONENT_STATIC_MESH_RENDERER => - { - set_static_mesh_renderer_with_history(world, entity, value); - } - Some(CopiedComponent::MaterialDesc(value)) if type_name == COMPONENT_MATERIAL_DESC => { - set_material_with_history(world, entity, value); - } - Some(CopiedComponent::LightDesc(value)) if type_name == COMPONENT_LIGHT_DESC => { - set_light_with_history(world, entity, value); - } - Some(CopiedComponent::AudioSourceDesc(value)) - if type_name == COMPONENT_AUDIO_SOURCE_DESC => - { - set_audio_source_with_history(world, entity, value); - } - Some(CopiedComponent::AudioListenerDesc(value)) - if type_name == COMPONENT_AUDIO_LISTENER_DESC => - { - set_audio_listener_with_history(world, entity, value); - } - Some(CopiedComponent::RigidBodyDesc(value)) if type_name == COMPONENT_RIGID_BODY_DESC => { - set_rigid_body_with_history(world, entity, value); - } - Some(CopiedComponent::ColliderDesc(value)) if type_name == COMPONENT_COLLIDER_DESC => { - set_collider_with_history(world, entity, value); - } - Some(CopiedComponent::PhysicsBody(value)) if type_name == COMPONENT_PHYSICS_BODY => { - set_physics_with_history(world, entity, value); - } - Some(CopiedComponent::PostProcessVolume(value)) - if type_name == COMPONENT_POST_PROCESS_VOLUME => - { - set_post_process_volume_with_history(world, entity, value); - } - Some(CopiedComponent::WeaponSpawn(value)) if type_name == COMPONENT_WEAPON_SPAWN => { - insert_direct_component(world, entity, value); - } - Some(CopiedComponent::TriggerVolume(value)) if type_name == COMPONENT_TRIGGER_VOLUME => { - insert_direct_component(world, entity, value); - } - Some(CopiedComponent::TeamSpawn(value)) if type_name == COMPONENT_TEAM_SPAWN => { - insert_direct_component(world, entity, value); - } - Some(CopiedComponent::ObjectiveMarker(value)) - if type_name == COMPONENT_OBJECTIVE_MARKER => - { - insert_direct_component(world, entity, value); - } - Some(CopiedComponent::PrefabInstance(value)) if type_name == COMPONENT_PREFAB_INSTANCE => { - insert_direct_component(world, entity, value); - } - Some(CopiedComponent::NavigationBounds(mut value)) - if type_name == COMPONENT_NAVIGATION_BOUNDS => - { - value.artifact_path = world - .get::(entity) - .map(|bounds| bounds.artifact_path.clone()) - .unwrap_or_else(|| navigation_bounds_for_entity(world, entity).artifact_path); - crate::history::set_navigation_with_history( - world, - entity, - crate::history::NavigationComponentState { - bounds: Some(value), - ..Default::default() - }, - ); - } - Some(CopiedComponent::NavigationObstacle(value)) - if type_name == COMPONENT_NAVIGATION_OBSTACLE => - { - crate::history::set_navigation_with_history( - world, - entity, - crate::history::NavigationComponentState { - obstacle: Some(value), - ..Default::default() - }, - ); - } - Some(CopiedComponent::NavigationArea(value)) if type_name == COMPONENT_NAVIGATION_AREA => { - crate::history::set_navigation_with_history( - world, - entity, - crate::history::NavigationComponentState { - area: Some(value), - ..Default::default() - }, - ); - } - Some(CopiedComponent::NavigationLink(value)) if type_name == COMPONENT_NAVIGATION_LINK => { - crate::history::set_navigation_with_history( - world, - entity, - crate::history::NavigationComponentState { - link: Some(value), - ..Default::default() - }, - ); - } - _ => {} - } -} - -fn reset_component(world: &mut World, entity: Entity, type_name: &str) { - let descriptor = world - .resource::() - .by_type_name(type_name) - .cloned(); - if let Some(descriptor) = descriptor { - let component_id = descriptor.id; - let type_path = descriptor.type_name; - if type_path == COMPONENT_ANIMATION_CONTROLLER_DESC { - let controller = - crate::ui::animation_inspector::default_controller_for_actor(world, entity); - let _ = crate::history::reflected_component_transaction( - world, - entity, - "Reset Component", - component_id, - type_path, - move |world, entity| { - world.entity_mut(entity).insert(controller); - Ok(()) - }, - ); - } else if type_path == COMPONENT_NAVIGATION_BOUNDS { - let bounds = reset_navigation_bounds_for_entity(world, entity); - let _ = crate::history::reflected_component_transaction( - world, - entity, - "Reset Component", - component_id, - type_path, - move |world, entity| { - world.entity_mut(entity).insert(bounds); - Ok(()) - }, - ); - } else { - let _ = crate::history::reflected_component_transaction( - world, - entity, - "Reset Component", - component_id, - type_path, - move |world, entity| { - crate::history::apply_reflected_default(world, entity, type_path) - }, - ); - } - return; - } - match type_name { - COMPONENT_ANIMATION_CONTROLLER_DESC => { - let controller = - crate::ui::animation_inspector::default_controller_for_actor(world, entity); - set_animation_controller_with_history(world, entity, controller); - } - COMPONENT_PRIMITIVE => set_primitive_with_history(world, entity, Primitive::default()), - COMPONENT_BRUSH_DESC => set_brush_with_history(world, entity, BrushDesc::default()), - COMPONENT_STATIC_MESH_RENDERER => { - set_static_mesh_renderer_with_history(world, entity, StaticMeshRenderer::default()); - } - COMPONENT_MATERIAL_DESC => { - set_material_with_history(world, entity, MaterialDesc::default()) - } - COMPONENT_LIGHT_DESC => set_light_with_history(world, entity, LightDesc::default()), - COMPONENT_AUDIO_SOURCE_DESC => { - set_audio_source_with_history(world, entity, AudioSourceDesc::default()) - } - COMPONENT_AUDIO_LISTENER_DESC => { - set_audio_listener_with_history(world, entity, AudioListenerDesc::default()) - } - COMPONENT_RIGID_BODY_DESC => { - set_rigid_body_with_history(world, entity, RigidBodyDesc::default()); - } - COMPONENT_COLLIDER_DESC => { - set_collider_with_history(world, entity, ColliderDesc::default()) - } - COMPONENT_PHYSICS_BODY => set_physics_with_history(world, entity, PhysicsBody::default()), - COMPONENT_POST_PROCESS_VOLUME => { - set_post_process_volume_with_history(world, entity, PostProcessVolumeDesc::default()); - } - COMPONENT_NAVIGATION_BOUNDS => crate::history::set_navigation_with_history( - world, - entity, - crate::history::NavigationComponentState { - bounds: Some(reset_navigation_bounds_for_entity(world, entity)), - ..Default::default() - }, - ), - COMPONENT_NAVIGATION_OBSTACLE => crate::history::set_navigation_with_history( - world, - entity, - crate::history::NavigationComponentState { - obstacle: Some(NavigationObstacle::default()), - ..Default::default() - }, - ), - COMPONENT_NAVIGATION_AREA => crate::history::set_navigation_with_history( - world, - entity, - crate::history::NavigationComponentState { - area: Some(NavigationArea::default()), - ..Default::default() - }, - ), - COMPONENT_NAVIGATION_LINK => crate::history::set_navigation_with_history( - world, - entity, - crate::history::NavigationComponentState { - link: Some(NavigationLink::default()), - ..Default::default() - }, - ), - COMPONENT_WEAPON_SPAWN => insert_direct_component( - world, - entity, - WeaponSpawn { - weapon_id: "rifle".into(), - }, - ), - COMPONENT_TRIGGER_VOLUME => { - insert_direct_component(world, entity, TriggerVolume::default()) - } - COMPONENT_TEAM_SPAWN => insert_direct_component(world, entity, TeamSpawn { team_id: 0 }), - COMPONENT_OBJECTIVE_MARKER => insert_direct_component( - world, - entity, - ObjectiveMarker { - objective_id: "objective".into(), - }, - ), - _ => {} - } -} - -fn insert_direct_component(world: &mut World, entity: Entity, component: T) { - if let Ok(mut entity_mut) = world.get_entity_mut(entity) { - entity_mut.insert(component); - } - if let Some(mut scene_io) = world.get_resource_mut::() { - scene_io.mark_dirty(); - } -} - -fn remove_registered_component(world: &mut World, entity: Entity, type_name: &str) { - let descriptor = world - .resource::() - .by_type_name(type_name) - .cloned(); - if let Some(descriptor) = descriptor { - if !descriptor.removable { - return; - } - let dependents = world - .resource::() - .present_dependents(world, entity, descriptor.id) - .iter() - .map(|dependent| dependent.display_name) - .collect::>(); - if !dependents.is_empty() { - world - .resource_mut::() - .set_status(format!( - "Remove blocked: required by {}. Remove dependent components first.", - dependents.join(", ") - )); - return; - } - let result = crate::history::reflected_component_transaction( - world, - entity, - "Remove Component", - descriptor.id, - descriptor.type_name, - |world, entity| { - crate::history::apply_reflected_component(world, entity, descriptor.type_name, None) - }, - ); - if result.is_ok() && type_name == COMPONENT_ANIMATION_CONTROLLER_DESC { - crate::ui::animation_inspector::stop_preview_if_actor(world, entity); - } - return; - } - let Some(before) = crate::history::snapshot_entity(world, entity) else { - return; - }; - let removed_dedicated_audio_kind = matches!( - (type_name, before.actor_kind), - (COMPONENT_AUDIO_SOURCE_DESC, ActorKind::AudioSource) - | (COMPONENT_AUDIO_LISTENER_DESC, ActorKind::AudioListener) - ); - let removed_dedicated_navigation_kind = before.actor_kind == ActorKind::Navigation - && matches!( - type_name, - COMPONENT_NAVIGATION_BOUNDS - | COMPONENT_NAVIGATION_OBSTACLE - | COMPONENT_NAVIGATION_AREA - | COMPONENT_NAVIGATION_LINK - ); - let removed_dedicated_skinned_kind = - type_name == COMPONENT_SKINNED_MESH_RENDERER && before.actor_kind == ActorKind::SkinnedMesh; - let removed = if let Ok(mut entity_mut) = world.get_entity_mut(entity) { - match type_name { - COMPONENT_ANIMATION_CONTROLLER_DESC if before.animation_controller.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_PRIMITIVE if before.primitive.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_BRUSH_DESC if before.brush.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_STATIC_MESH_RENDERER if before.static_mesh_renderer.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_SKINNED_MESH_RENDERER if before.skinned_mesh_renderer.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_MATERIAL_DESC if before.material.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_LIGHT_DESC if before.light.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_AUDIO_SOURCE_DESC if before.audio_source.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_AUDIO_LISTENER_DESC if before.audio_listener.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_RIGID_BODY_DESC if before.rigid_body.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_COLLIDER_DESC if before.collider.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_PHYSICS_BODY if before.physics.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_PLAYER_SPAWN if before.player_spawn => { - entity_mut.remove::(); - true - } - COMPONENT_WEAPON_SPAWN if before.weapon_spawn.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_TRIGGER_VOLUME if before.trigger_volume.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_TEAM_SPAWN if before.team_spawn.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_OBJECTIVE_MARKER if before.objective.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_PREFAB_INSTANCE if before.prefab_instance.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_POST_PROCESS_VOLUME if before.post_process_volume.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_NAVIGATION_BOUNDS if before.navigation_bounds.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_NAVIGATION_OBSTACLE if before.navigation_obstacle.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_NAVIGATION_AREA if before.navigation_area.is_some() => { - entity_mut.remove::(); - true - } - COMPONENT_NAVIGATION_LINK if before.navigation_link.is_some() => { - entity_mut.remove::(); - true - } - _ => false, - } - } else { - false - }; - if !removed { - return; - } - if type_name == COMPONENT_ANIMATION_CONTROLLER_DESC { - crate::ui::animation_inspector::stop_preview_if_actor(world, entity); - } - if removed_dedicated_audio_kind - || removed_dedicated_navigation_kind - || removed_dedicated_skinned_kind - { - let fallback = world - .get_entity(entity) - .ok() - .and_then(infer_actor_kind) - .unwrap_or(ActorKind::Empty); - if let Ok(mut entity_mut) = world.get_entity_mut(entity) { - entity_mut.insert(fallback); - } - } - if let Some(after) = crate::history::snapshot_entity(world, entity) { - let snapshot = diff_added(&after, &before); - crate::history::push_command( - world, - crate::history::EditorCommand::RemoveComponent { entity, snapshot }, - ); - } -} - -pub fn authoring_inspector_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - if !world - .get_entity(entity) - .is_ok_and(|entity_ref| entity_ref.contains::()) - { - return; - } - - let present = present_component_type_names(world, entity); - let ordered = if let Some(order) = world.get::(entity) { - world - .resource::() - .ordered_components(order, &present) - } else { - present - }; - for type_name in ordered { - draw_authoring_component_by_type(world, ui, entity, type_name); - } -} - -fn draw_authoring_component_by_type( - world: &mut World, - ui: &mut egui::Ui, - entity: Entity, - type_name: &'static str, -) { - if let Some(inspector) = world - .resource::() - .inspector(type_name) - { - inspector(world, ui, entity); - return; - } - match type_name { - COMPONENT_ANIMATION_CONTROLLER_DESC => { - crate::ui::animation_inspector::animation_controller_inspector_ui(world, ui, entity); - } - COMPONENT_STATIC_MESH_RENDERER => static_mesh_renderer_ui(world, ui, entity), - COMPONENT_SKINNED_MESH_RENDERER => skinned_mesh_renderer_ui(world, ui, entity), - COMPONENT_BRUSH_DESC => brush_editor_ui(world, ui, entity), - COMPONENT_TERRAIN_DESC => terrain_editor_ui(world, ui, entity), - COMPONENT_PRIMITIVE => primitive_editor_ui(world, ui, entity), - COMPONENT_MATERIAL_DESC => material_editor_ui(world, ui, entity), - COMPONENT_LIGHT_DESC => light_editor_ui(world, ui, entity), - COMPONENT_AUDIO_SOURCE_DESC => { - crate::ui::audio_inspector::audio_source_inspector_ui(world, ui, entity); - } - COMPONENT_AUDIO_LISTENER_DESC => { - crate::ui::audio_inspector::audio_listener_inspector_ui(world, ui, entity); - } - COMPONENT_RIGID_BODY_DESC => rigid_body_editor_ui(world, ui, entity), - COMPONENT_COLLIDER_DESC => collider_editor_ui(world, ui, entity), - COMPONENT_PHYSICS_BODY => physics_editor_ui(world, ui, entity), - COMPONENT_PLAYER_SPAWN => player_spawn_ui(world, ui, entity), - COMPONENT_WEAPON_SPAWN => weapon_spawn_ui(world, ui, entity), - COMPONENT_TRIGGER_VOLUME => trigger_volume_ui(world, ui, entity), - COMPONENT_TEAM_SPAWN => team_spawn_ui(world, ui, entity), - COMPONENT_OBJECTIVE_MARKER => objective_ui(world, ui, entity), - COMPONENT_PREFAB_INSTANCE => prefab_instance_ui(world, ui, entity), - COMPONENT_POST_PROCESS_VOLUME => { - crate::ui::post_process_volume_ui::post_process_volume_inspector_ui(world, ui, entity); - } - COMPONENT_PROJECT_SUN => project_sun_ui(world, ui, entity), - COMPONENT_NAVIGATION_BOUNDS => { - super::navigation_inspector::navigation_bounds_inspector_ui(world, ui, entity) - } - COMPONENT_NAVIGATION_OBSTACLE => { - super::navigation_inspector::navigation_obstacle_inspector_ui(world, ui, entity) - } - COMPONENT_NAVIGATION_AREA => { - super::navigation_inspector::navigation_area_inspector_ui(world, ui, entity) - } - COMPONENT_NAVIGATION_LINK => { - super::navigation_inspector::navigation_link_inspector_ui(world, ui, entity) - } - _ => {} - } -} - -pub(crate) fn add_component_footer(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - ui.add_space(4.0); - let button_response = egui::Frame::new() - .fill(WIDGET_BG) - .stroke(egui::Stroke::new(1.0, BORDER)) - .corner_radius(egui::CornerRadius::same(4)) - .inner_margin(egui::Margin::symmetric(8, 6)) - .show(ui, |ui| { - let open_for_entity = add_component_picker_open_for(world, entity); - let label = if open_for_entity { - "Close Add Component" - } else { - "+ Add Component" - }; - if ui.button(label).clicked() { - if let Some(mut state) = world.get_resource_mut::() { - if open_for_entity { - state.add_component_open = false; - state.add_component_target = None; - } else { - state.add_component_open = true; - state.add_component_focus_search = true; - state.add_component_scroll_selected = true; - state.add_component_selected_index = 0; - state.add_component_target = Some(entity); - state.add_component_search.clear(); - } - } - } - }); - - if add_component_picker_open_for(world, entity) { - add_component_picker_shelf(world, ui, entity, button_response.response.rect); - } -} - -fn add_component_picker_open_for(world: &World, entity: Entity) -> bool { - world - .get_resource::() - .is_some_and(|state| state.add_component_open && state.add_component_target == Some(entity)) -} - -fn shelf_list_max_height(visible_space: f32) -> f32 { - (visible_space - 108.0).clamp(56.0, 320.0) -} - -fn add_component_picker_shelf( - world: &mut World, - ui: &mut egui::Ui, - target: Entity, - anchor: egui::Rect, -) { - if world.get_entity(target).is_err() { - if let Some(mut state) = world.get_resource_mut::() { - state.add_component_open = false; - state.add_component_target = None; - } - return; - } - - let descriptors = world - .resource::() - .descriptors - .clone(); - - let visible = ui.clip_rect().intersect(ui.ctx().content_rect()); - let space_above = (anchor.min.y - visible.top()).max(0.0); - let space_below = (visible.bottom() - anchor.max.y).max(0.0); - let direction = if space_below >= space_above { - AddComponentShelfDirection::Down - } else { - AddComponentShelfDirection::Up - }; - let visible_space = match direction { - AddComponentShelfDirection::Up => space_above, - AddComponentShelfDirection::Down => space_below, - }; - let list_max_height = shelf_list_max_height(visible_space); - let shelf_height = (list_max_height + 108.0).min((visible_space - 4.0).max(96.0)); - let x = anchor - .min - .x - .clamp(visible.left(), visible.right() - anchor.width()); - let y = match direction { - AddComponentShelfDirection::Up => anchor.min.y - shelf_height - 4.0, - AddComponentShelfDirection::Down => anchor.max.y + 4.0, - } - .clamp( - visible.top(), - (visible.bottom() - shelf_height).max(visible.top()), - ); - let shelf_width = anchor.width().max(260.0).min(visible.width()); - - egui::Area::new(egui::Id::new(("add_component_shelf", target))) - .order(egui::Order::Foreground) - .fixed_pos(egui::pos2(x, y)) - .show(ui.ctx(), |ui| { - ui.set_width(shelf_width); - add_component_picker_shelf_contents(world, ui, target, &descriptors, list_max_height); - }); -} - -fn add_component_picker_shelf_contents( - world: &mut World, - ui: &mut egui::Ui, - target: Entity, - descriptors: &[EditorComponentDescriptor], - list_max_height: f32, -) { - egui::Frame::new() - .fill(PANEL_BG_DARK) - .stroke(egui::Stroke::new(1.0, BORDER)) - .corner_radius(egui::CornerRadius::same(4)) - .inner_margin(egui::Margin::symmetric(8, 8)) - .show(ui, |ui| { - ui.horizontal(|ui| { - ui.label(panel_heading("Add Component")); - ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { - if icon_button_small(ui, icons::X, "Close Add Component").clicked() { - let mut state = world.resource_mut::(); - state.add_component_open = false; - state.add_component_target = None; - } - }); - }); - ui.add_space(4.0); - - let mut search_input = world - .resource::() - .add_component_search - .clone(); - let search_response = ui.add( - egui::TextEdit::singleline(&mut search_input) - .hint_text("Search components...") - .desired_width(f32::INFINITY), - ); - if search_response.changed() { - let mut state = world.resource_mut::(); - state.add_component_search = search_input.clone(); - state.add_component_scroll_selected = true; - state.add_component_selected_index = 0; - } - if world - .resource::() - .add_component_focus_search - { - search_response.request_focus(); - world - .resource_mut::() - .add_component_focus_search = false; - } - - let search = search_input.to_lowercase(); - let filtered = filtered_component_descriptors(descriptors, &search); - { - let mut state = world.resource_mut::(); - if !filtered.is_empty() { - state.add_component_selected_index = - state.add_component_selected_index.min(filtered.len() - 1); - } else { - state.add_component_selected_index = 0; - } - } - - if ui.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::ArrowDown)) - && !filtered.is_empty() - { - let mut state = world.resource_mut::(); - state.add_component_selected_index = - (state.add_component_selected_index + 1) % filtered.len(); - state.add_component_scroll_selected = true; - } - if ui.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::ArrowUp)) - && !filtered.is_empty() - { - let mut state = world.resource_mut::(); - state.add_component_selected_index = if state.add_component_selected_index == 0 { - filtered.len() - 1 - } else { - state.add_component_selected_index - 1 - }; - state.add_component_scroll_selected = true; - } - if ui.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::Escape)) { - let mut state = world.resource_mut::(); - state.add_component_open = false; - state.add_component_target = None; - } - if ui.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::Enter)) { - let selected_index = world - .resource::() - .add_component_selected_index; - if let Some(descriptor) = filtered.get(selected_index) { - let add_state = component_add_state(world, target, descriptor, descriptors); - if add_state.addable { - insert_registered_component(world, target, descriptor.type_name); - let mut state = world.resource_mut::(); - state.add_component_open = false; - state.add_component_target = None; - } - } - } - - ui.separator(); - if filtered.is_empty() { - ui.label(egui::RichText::new("No matching components").color(TEXT_DIM)); - return; - } - - egui::ScrollArea::vertical() - .max_height(list_max_height) - .show(ui, |ui| { - let (selected_index, scroll_selected) = { - let state = world.resource::(); - ( - state.add_component_selected_index, - state.add_component_scroll_selected, - ) - }; - let mut last_category = None; - for (index, descriptor) in filtered.iter().enumerate() { - if last_category != Some(descriptor.category) { - if last_category.is_some() { - ui.separator(); - } - ui.label(panel_heading(component_category_label(descriptor.category))); - last_category = Some(descriptor.category); - } - - let add_state = component_add_state(world, target, descriptor, descriptors); - let selected = index == selected_index; - let row = ui - .horizontal(|ui| { - ui.label(phosphor_icon_text(descriptor.icon, 14.0).color(TEXT_DIM)); - ui.add_enabled( - add_state.addable, - egui::Button::selectable(selected, descriptor.display_name), - ) - }) - .inner - .on_hover_text(component_hover_text(descriptor, &add_state)); - if selected && scroll_selected { - row.scroll_to_me(Some(egui::Align::Center)); - } - if row.clicked() { - world - .resource_mut::() - .add_component_selected_index = index; - if add_state.addable { - insert_registered_component(world, target, descriptor.type_name); - let mut state = world.resource_mut::(); - state.add_component_open = false; - state.add_component_target = None; - } - } - } - }); - world - .resource_mut::() - .add_component_scroll_selected = false; - }); -} - -fn filtered_component_descriptors<'a>( - descriptors: &'a [EditorComponentDescriptor], - search: &str, -) -> Vec<&'a EditorComponentDescriptor> { - [ - EditorComponentCategory::Authoring, - EditorComponentCategory::Rendering, - EditorComponentCategory::Animation, - EditorComponentCategory::Audio, - EditorComponentCategory::Navigation, - EditorComponentCategory::Physics, - EditorComponentCategory::Gameplay, - EditorComponentCategory::Volumes, - ] - .into_iter() - .flat_map(|category| { - descriptors.iter().filter(move |descriptor| { - descriptor.addable - && !descriptor.hidden - && descriptor.category == category - && descriptor_matches_search(descriptor, search) - }) - }) - .collect() -} - -fn component_category_label(category: EditorComponentCategory) -> &'static str { - match category { - EditorComponentCategory::Authoring => "Authoring", - EditorComponentCategory::Rendering => "Rendering", - EditorComponentCategory::Animation => "Animation", - EditorComponentCategory::Audio => "Audio", - EditorComponentCategory::Navigation => "Navigation", - EditorComponentCategory::Physics => "Physics", - EditorComponentCategory::Gameplay => "Gameplay", - EditorComponentCategory::Volumes => "Volumes", - EditorComponentCategory::Editor => "Editor", - } -} - -struct ComponentAddState { - addable: bool, - reason: Option, - required: Vec<&'static str>, - recommended: Vec<&'static str>, - conflicts: Vec<&'static str>, -} - -fn descriptor_matches_search(descriptor: &EditorComponentDescriptor, search: &str) -> bool { - search.trim().is_empty() - || descriptor.display_name.to_lowercase().contains(search) - || descriptor.type_name.to_lowercase().contains(search) - || descriptor.description.to_lowercase().contains(search) - || descriptor - .search_terms - .iter() - .any(|term| term.to_lowercase().contains(search)) -} - -fn component_add_state( - world: &World, - entity: Entity, - descriptor: &EditorComponentDescriptor, - descriptors: &[EditorComponentDescriptor], -) -> ComponentAddState { - let duplicate = component_present(world, entity, descriptor.type_name); - let conflicts = descriptor - .conflicts_with - .iter() - .copied() - .filter(|type_name| component_present(world, entity, type_name)) - .collect::>(); - let recommended = descriptor - .recommended - .iter() - .copied() - .filter(|type_name| !component_present(world, entity, type_name)) - .collect::>(); - let registry = world.resource::(); - let required = registry - .required_component_ids(descriptor) - .iter() - .filter_map(|id| registry.by_id(id)) - .filter(|required| !registry.component_present(world, entity, required.type_name)) - .map(|required| required.display_name) - .collect::>(); - let reason = if duplicate { - Some("Already present on this actor.".to_string()) - } else if !required.is_empty() { - Some(format!("Requires {}.", required.join(", "))) - } else if !conflicts.is_empty() { - Some(format!( - "Conflicts with {}.", - conflicts - .iter() - .map(|type_name| component_display_name(descriptors, type_name)) - .collect::>() - .join(", ") - )) - } else { - None - }; - ComponentAddState { - addable: reason.is_none(), - reason, - required, - recommended, - conflicts, - } -} - -fn component_hover_text( - descriptor: &EditorComponentDescriptor, - state: &ComponentAddState, -) -> String { - let mut lines = vec![ - descriptor.description.to_string(), - format!("Type: {}", descriptor.type_name), - format!("Hydration: {}", descriptor.hydration_effect), - format!( - "Inspector: removable={} reorderable={}", - descriptor.removable, descriptor.reorderable - ), - ]; - if let Some(reason) = &state.reason { - lines.push(format!("Unavailable: {reason}")); - } - if !state.required.is_empty() { - lines.push(format!("Requires: {}", state.required.join(", "))); - } - if !state.recommended.is_empty() { - lines.push(format!( - "Recommended with: {}", - state.recommended.join(", ") - )); - } - if !state.conflicts.is_empty() { - lines.push(format!("Conflicts: {}", state.conflicts.join(", "))); - } - lines.push(format!("Search: {}", descriptor.search_terms.join(", "))); - lines.join("\n") -} - -fn component_display_name( - descriptors: &[EditorComponentDescriptor], - type_name: &str, -) -> &'static str { - descriptors - .iter() - .find(|descriptor| descriptor.type_name == type_name) - .map(|descriptor| descriptor.display_name) - .unwrap_or("component") -} - -fn component_present(world: &World, entity: Entity, type_name: &str) -> bool { - if let Some(registry) = world.get_resource::() { - if registry.by_type_name(type_name).is_some() { - return registry.component_present(world, entity, type_name); - } - } - match type_name { - COMPONENT_ANIMATION_CONTROLLER_DESC => { - world.get::(entity).is_some() - } - "shared::components::Primitive" => world.get::(entity).is_some(), - "shared::components::BrushDesc" => world.get::(entity).is_some(), - "shared::components::StaticMeshRenderer" => { - world.get::(entity).is_some() - } - COMPONENT_SKINNED_MESH_RENDERER => world.get::(entity).is_some(), - "shared::components::MaterialDesc" => world.get::(entity).is_some(), - "shared::components::LightDesc" => world.get::(entity).is_some(), - "shared::components::AudioSourceDesc" => world.get::(entity).is_some(), - "shared::components::AudioListenerDesc" => world.get::(entity).is_some(), - "shared::components::RigidBodyDesc" => world.get::(entity).is_some(), - "shared::components::ColliderDesc" => world.get::(entity).is_some(), - "shared::components::PlayerSpawn" => world.get::(entity).is_some(), - "shared::components::WeaponSpawn" => world.get::(entity).is_some(), - "shared::components::TriggerVolume" => world.get::(entity).is_some(), - "shared::components::TeamSpawn" => world.get::(entity).is_some(), - "shared::components::ObjectiveMarker" => world.get::(entity).is_some(), - "shared::components::PostProcessVolumeDesc" => { - world.get::(entity).is_some() - } - COMPONENT_NAVIGATION_BOUNDS => world.get::(entity).is_some(), - COMPONENT_NAVIGATION_OBSTACLE => world.get::(entity).is_some(), - COMPONENT_NAVIGATION_AREA => world.get::(entity).is_some(), - COMPONENT_NAVIGATION_LINK => world.get::(entity).is_some(), - _ => false, - } -} - -fn insert_registered_component(world: &mut World, entity: Entity, type_name: &str) { - let descriptor = world - .resource::() - .by_type_name(type_name) - .cloned(); - if let Some(descriptor) = descriptor { - if !descriptor.addable || component_present(world, entity, descriptor.type_name) { - return; - } - if descriptor.type_name == COMPONENT_ANIMATION_CONTROLLER_DESC { - let controller = - crate::ui::animation_inspector::default_controller_for_actor(world, entity); - let _ = crate::history::reflected_component_transaction( - world, - entity, - "Add Component", - descriptor.id, - descriptor.type_name, - move |world, entity| { - world.entity_mut(entity).insert(controller); - Ok(()) - }, - ); - } else if descriptor.type_name == COMPONENT_NAVIGATION_BOUNDS { - let bounds = navigation_bounds_for_entity(world, entity); - let _ = crate::history::reflected_component_transaction( - world, - entity, - "Add Component", - descriptor.id, - descriptor.type_name, - move |world, entity| { - world.entity_mut(entity).insert(bounds); - Ok(()) - }, - ); - } else { - let _ = crate::history::reflected_component_transaction( - world, - entity, - "Add Component", - descriptor.id, - descriptor.type_name, - move |world, entity| { - crate::history::apply_reflected_default(world, entity, descriptor.type_name) - }, - ); - } - return; - } - match type_name { - COMPONENT_ANIMATION_CONTROLLER_DESC => { - let controller = - crate::ui::animation_inspector::default_controller_for_actor(world, entity); - insert_component(world, entity, move |world, e| { - world.entity_mut(e).insert(controller); - }); - } - "shared::components::Primitive" => insert_component(world, entity, |world, e| { - world - .entity_mut(e) - .insert((shared::ActorKind::StaticMesh, Primitive::cuboid(Vec3::ONE))); - }), - "shared::components::BrushDesc" => insert_component(world, entity, |world, e| { - world - .entity_mut(e) - .insert((shared::ActorKind::Brush, BrushDesc::default())); - }), - "shared::components::StaticMeshRenderer" => insert_component(world, entity, |world, e| { - world - .entity_mut(e) - .insert((shared::ActorKind::StaticMesh, StaticMeshRenderer::default())); - }), - "shared::components::MaterialDesc" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(MaterialDesc::default()); - }), - "shared::components::LightDesc" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(LightDesc::default()); - }), - "shared::components::AudioSourceDesc" => insert_component(world, entity, |world, e| { - world - .entity_mut(e) - .insert((shared::ActorKind::AudioSource, AudioSourceDesc::default())); - }), - "shared::components::AudioListenerDesc" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(( - shared::ActorKind::AudioListener, - AudioListenerDesc::default(), - )); - }), - "shared::components::RigidBodyDesc" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(RigidBodyDesc::default()); - }), - "shared::components::ColliderDesc" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(ColliderDesc::default()); - }), - "shared::components::PlayerSpawn" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(PlayerSpawn); - }), - "shared::components::WeaponSpawn" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(WeaponSpawn { - weapon_id: "rifle".into(), - }); - }), - "shared::components::TriggerVolume" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(TriggerVolume::default()); - }), - "shared::components::TeamSpawn" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(TeamSpawn { team_id: 0 }); - }), - "shared::components::ObjectiveMarker" => insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(ObjectiveMarker { - objective_id: "objective".into(), - }); - }), - COMPONENT_NAVIGATION_BOUNDS => insert_component(world, entity, |world, e| { - let bounds = navigation_bounds_for_entity(world, e); - world.entity_mut(e).insert((ActorKind::Navigation, bounds)); - }), - COMPONENT_NAVIGATION_OBSTACLE => insert_component(world, entity, |world, e| { - world - .entity_mut(e) - .insert((ActorKind::Navigation, NavigationObstacle::default())); - }), - COMPONENT_NAVIGATION_AREA => insert_component(world, entity, |world, e| { - world - .entity_mut(e) - .insert((ActorKind::Navigation, NavigationArea::default())); - }), - COMPONENT_NAVIGATION_LINK => insert_component(world, entity, |world, e| { - world - .entity_mut(e) - .insert((ActorKind::Navigation, NavigationLink::default())); - }), - "shared::components::PostProcessVolumeDesc" => { - insert_component(world, entity, |world, e| { - world.entity_mut(e).insert(PostProcessVolumeDesc::default()); - }) - } - _ => {} - } -} - -fn navigation_bounds_for_entity(world: &World, entity: Entity) -> NavigationBounds { - world - .get::(entity) - .map(|actor_id| NavigationBounds::for_actor(&actor_id.0)) - .unwrap_or_else(|| NavigationBounds::for_actor(&uuid::Uuid::new_v4().to_string())) -} - -fn reset_navigation_bounds_for_entity(world: &World, entity: Entity) -> NavigationBounds { - let mut bounds = navigation_bounds_for_entity(world, entity); - if let Some(current) = world.get::(entity) { - bounds.artifact_path.clone_from(¤t.artifact_path); - } - bounds -} - -fn insert_component(world: &mut World, entity: Entity, insert: impl FnOnce(&mut World, Entity)) { - let before = crate::history::snapshot_entity(world, entity); - let old_kind = before.as_ref().map(|s| s.actor_kind); - insert(world, entity); - let after = crate::history::snapshot_entity(world, entity); - if let (Some(before), Some(after)) = (before, after) { - if let Some(old) = old_kind { - if old != after.actor_kind { - crate::history::set_actor_kind_with_history(world, entity, old, after.actor_kind); - } - } - crate::history::push_command( - world, - crate::history::EditorCommand::AddComponent { - entity, - snapshot: diff_added(&before, &after), - }, - ); - } -} - -fn diff_added(before: &EditorEntitySnapshot, after: &EditorEntitySnapshot) -> EditorEntitySnapshot { - EditorEntitySnapshot { - actor_id: None, - actor_kind: after.actor_kind, - actor_name: None, - name: None, - transform: after.transform, - primitive: after - .primitive - .clone() - .filter(|_| before.primitive.is_none()), - brush: after.brush.clone().filter(|_| before.brush.is_none()), - static_mesh_renderer: after - .static_mesh_renderer - .clone() - .filter(|_| before.static_mesh_renderer.is_none()), - skinned_mesh_renderer: after - .skinned_mesh_renderer - .clone() - .filter(|_| before.skinned_mesh_renderer.is_none()), - material: after.material.clone().filter(|_| before.material.is_none()), - material_override: after - .material_override - .clone() - .filter(|_| before.material_override.is_none()), - rigid_body: after.rigid_body.filter(|_| before.rigid_body.is_none()), - collider: after.collider.clone().filter(|_| before.collider.is_none()), - physics: after.physics.clone().filter(|_| before.physics.is_none()), - light: after.light.clone().filter(|_| before.light.is_none()), - animation_controller: after - .animation_controller - .clone() - .filter(|_| before.animation_controller.is_none()), - audio_source: after - .audio_source - .clone() - .filter(|_| before.audio_source.is_none()), - audio_listener: after - .audio_listener - .filter(|_| before.audio_listener.is_none()), - player_spawn: after.player_spawn && !before.player_spawn, - model: after.model.clone().filter(|_| before.model.is_none()), - prefab: after.prefab.clone().filter(|_| before.prefab.is_none()), - prefab_instance: after - .prefab_instance - .clone() - .filter(|_| before.prefab_instance.is_none()), - weapon_spawn: after - .weapon_spawn - .clone() - .filter(|_| before.weapon_spawn.is_none()), - trigger_volume: after - .trigger_volume - .clone() - .filter(|_| before.trigger_volume.is_none()), - post_process_volume: after - .post_process_volume - .clone() - .filter(|_| before.post_process_volume.is_none()), - team_spawn: after - .team_spawn - .clone() - .filter(|_| before.team_spawn.is_none()), - objective: after - .objective - .clone() - .filter(|_| before.objective.is_none()), - navigation_bounds: after - .navigation_bounds - .clone() - .filter(|_| before.navigation_bounds.is_none()), - navigation_obstacle: after - .navigation_obstacle - .clone() - .filter(|_| before.navigation_obstacle.is_none()), - navigation_area: after - .navigation_area - .clone() - .filter(|_| before.navigation_area.is_none()), - navigation_link: after - .navigation_link - .clone() - .filter(|_| before.navigation_link.is_none()), - hierarchy_sibling_index: after.hierarchy_sibling_index, - editor_visibility: after.editor_visibility, - inspector_order: None, - component_states: None, - children: Vec::new(), - } -} - -fn static_mesh_asset_ref_candidates( - world: &mut World, - kind: AssetRefCandidateKind, -) -> Vec { - let thumbnail_by_path = model_thumbnail_texture_by_path(world); - let Some(registry) = world.get_resource::() else { - return Vec::new(); - }; - let catalog = world.get_resource::(); - let mut seen = HashSet::new(); - let mut candidates = Vec::new(); - - for record in ®istry.records { - let Some(manifest_path) = record.import_settings.static_mesh_manifest_path.as_deref() - else { - continue; - }; - let Ok(manifest) = load_static_mesh_manifest(manifest_path) else { - continue; - }; - let selection = AssetSelection::File(manifest.source.path.clone()); - let texture_id = thumbnail_by_path.get(&manifest.source.path).copied(); - let folder_path = catalog - .and_then(|assets| { - assets - .assets - .iter() - .find(|asset| asset.path.as_deref() == Some(manifest.source.path.as_str())) - .map(|asset| asset.folder_path.clone()) - }) - .unwrap_or_else(|| fallback_asset_folder(&manifest.source.path)); - - for part in &manifest.parts { - let source_material_ref = source_material_ref_for_part(&manifest.asset_id, part); - let candidate = match kind { - AssetRefCandidateKind::Mesh => { - let sub_asset_id = if part.id.trim().is_empty() { - part_id_from_label(&part.mesh_label) - } else { - part.id.clone() - }; - AssetRefCandidate { - reference: EditorAssetRef::new( - manifest.asset_id.clone(), - sub_asset_id, - part.name.clone(), - ), - label: part.name.clone(), - detail: format!("{} | {}", manifest.label, manifest.source.path), - selection: selection.clone(), - folder_path: folder_path.clone(), - texture_id, - } - } - AssetRefCandidateKind::Material => { - let Some(material_ref) = source_material_ref else { - continue; - }; - AssetRefCandidate { - reference: material_ref, - label: part.material_slot_name.clone(), - detail: format!("{} | {}", manifest.label, manifest.source.path), - selection: selection.clone(), - folder_path: folder_path.clone(), - texture_id: None, - } - } - AssetRefCandidateKind::Texture => continue, - }; - - let key = ( - candidate.reference.asset_id.clone(), - candidate.reference.sub_asset_id.clone(), - ); - if seen.insert(key) { - candidates.push(candidate); - } - } - } - - candidates.sort_by(|a, b| a.detail.cmp(&b.detail).then(a.label.cmp(&b.label))); - candidates -} - -fn texture_asset_candidates(world: &World) -> Vec { - let Some(catalog) = world.get_resource::() else { - return Vec::new(); - }; - let snapshot = world - .get_resource::() - .map(AssetThumbnailCache::snapshot); - let mut candidates: Vec<_> = catalog - .assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) - .filter_map(|asset| { - let path = asset.path.clone()?; - let texture_id = snapshot - .as_ref() - .and_then(|snapshot| snapshot.texture_for(asset)); - Some(TextureAssetCandidate { - label: asset.label.clone(), - path: path.clone(), - folder_path: asset.folder_path.clone(), - selection: AssetSelection::File(path), - texture_id, - }) - }) - .collect(); - candidates.sort_by(|a, b| a.label.cmp(&b.label).then(a.path.cmp(&b.path))); - candidates -} - -fn texture_asset_ref_candidates(world: &World) -> Vec { - let Some(catalog) = world.get_resource::() else { - return Vec::new(); - }; - let Some(registry) = world.get_resource::() else { - return Vec::new(); - }; - let snapshot = world - .get_resource::() - .map(AssetThumbnailCache::snapshot); - let mut candidates: Vec<_> = catalog - .assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) - .filter_map(|asset| { - let path = asset.path.as_deref()?; - let record = find_asset_by_path(registry, path)?; - Some(AssetRefCandidate { - reference: EditorAssetRef::new( - record.id.as_string(), - "texture:source", - asset.label.clone(), - ) - .with_source_path(path), - label: asset.label.clone(), - detail: path.to_string(), - selection: AssetSelection::File(path.to_string()), - folder_path: asset.folder_path.clone(), - texture_id: snapshot - .as_ref() - .and_then(|snapshot| snapshot.texture_for(asset)), - }) - }) - .collect(); - candidates.sort_by(|a, b| a.label.cmp(&b.label).then(a.detail.cmp(&b.detail))); - candidates -} - -fn brush_face_material_ref_candidates(world: &mut World) -> Vec { - let mut candidates = static_mesh_asset_ref_candidates(world, AssetRefCandidateKind::Material); - let Some(catalog) = world.get_resource::() else { - return candidates; - }; - let Some(registry) = world.get_resource::() else { - return candidates; - }; - let mut seen: HashSet<_> = candidates - .iter() - .map(|candidate| { - ( - candidate.reference.asset_id.clone(), - candidate.reference.sub_asset_id.clone(), - ) - }) - .collect(); - for asset in catalog - .assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::Material)) - { - let Some(path) = asset.path.as_deref() else { - continue; - }; - let Some(record) = find_asset_by_path(registry, path) else { - continue; - }; - let sub_asset_id = if shared::MaterialInstanceAsset::load_from_path(path).is_ok() { - "material:instance" - } else { - "material:source" - }; - let reference = EditorAssetRef::new(record.id.as_string(), sub_asset_id, &asset.label) - .with_source_path(path); - let key = (reference.asset_id.clone(), reference.sub_asset_id.clone()); - if !seen.insert(key) { - continue; - } - candidates.push(AssetRefCandidate { - reference, - label: asset.label.clone(), - detail: path.to_string(), - selection: AssetSelection::File(path.to_string()), - folder_path: asset.folder_path.clone(), - texture_id: None, - }); - } - candidates.sort_by(|a, b| a.label.cmp(&b.label).then(a.detail.cmp(&b.detail))); - candidates -} - -fn asset_ref_candidate_from_selection( - world: &World, - selection: &AssetSelection, - kind: AssetRefCandidateKind, -) -> Option { - let registry = world.get_resource::()?; - match (kind, selection) { - (AssetRefCandidateKind::Material, AssetSelection::File(path)) => { - let asset = world - .get_resource::()? - .assets - .iter() - .find(|asset| { - matches!(asset.kind, EditorAssetKind::Material) - && asset.path.as_deref() == Some(path.as_str()) - })?; - let record = find_asset_by_path(registry, path)?; - let sub_asset_id = if shared::MaterialInstanceAsset::load_from_path(path).is_ok() { - "material:instance" - } else { - "material:source" - }; - Some(AssetRefCandidate { - reference: EditorAssetRef::new( - record.id.as_string(), - sub_asset_id, - asset.label.clone(), - ) - .with_source_path(path), - label: asset.label.clone(), - detail: path.clone(), - selection: selection.clone(), - folder_path: asset.folder_path.clone(), - texture_id: None, - }) - } - (AssetRefCandidateKind::Texture, AssetSelection::File(path)) => { - let asset = world - .get_resource::()? - .assets - .iter() - .find(|asset| { - matches!(asset.kind, EditorAssetKind::Texture) - && asset.path.as_deref() == Some(path.as_str()) - })?; - let record = find_asset_by_path(registry, path)?; - Some(AssetRefCandidate { - reference: EditorAssetRef::new( - record.id.as_string(), - "texture:source", - asset.label.clone(), - ) - .with_source_path(path), - label: asset.label.clone(), - detail: path.clone(), - selection: selection.clone(), - folder_path: asset.folder_path.clone(), - texture_id: None, - }) - } - ( - AssetRefCandidateKind::Material, - AssetSelection::SubAsset { - parent_path, - sub_asset_id, - label, - kind: AssetSubAssetKind::Material, - .. - }, - ) => { - let record = find_asset_by_path(registry, parent_path)?; - Some(AssetRefCandidate { - reference: EditorAssetRef::new( - record.id.as_string(), - sub_asset_id.clone(), - label.clone(), - ), - label: label.clone(), - detail: parent_path.clone(), - selection: selection.clone(), - folder_path: fallback_asset_folder(parent_path), - texture_id: None, - }) - } - ( - AssetRefCandidateKind::Texture, - AssetSelection::SubAsset { - parent_path, - sub_asset_id, - label, - kind: AssetSubAssetKind::Texture, - source_path, - }, - ) => { - let record = find_asset_by_path(registry, parent_path)?; - Some(AssetRefCandidate { - reference: EditorAssetRef::new( - record.id.as_string(), - sub_asset_id.clone(), - label.clone(), - ) - .with_source_path(source_path.clone().unwrap_or_else(|| parent_path.clone())), - label: label.clone(), - detail: source_path.clone().unwrap_or_else(|| parent_path.clone()), - selection: selection.clone(), - folder_path: fallback_asset_folder(parent_path), - texture_id: None, - }) - } - _ => None, - } -} - -fn request_texture_asset_thumbnails(world: &mut World) { - let requests: Vec<_> = world - .get_resource::() - .map(|assets| { - assets - .assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) - .filter_map(|asset| Some((asset_cache_key(asset), asset.path.clone()?))) - .collect() - }) - .unwrap_or_default(); - if requests.is_empty() || world.get_resource::().is_none() { - return; - } - let asset_server = world.resource::().clone(); - world.resource_scope(|_world, mut cache: Mut| { - for (key, path) in requests { - cache.request_texture(key, path, &asset_server); - } - }); -} - -fn texture_path_from_selection( - world: &World, - selection: &AssetSelection, -) -> Option { - match selection { - AssetSelection::File(path) => { - let asset = world - .get_resource::()? - .assets - .iter() - .find(|asset| { - matches!(asset.kind, EditorAssetKind::Texture) - && asset.path.as_deref() == Some(path.as_str()) - })?; - Some(TextureAssetCandidate { - label: asset.label.clone(), - path: path.clone(), - folder_path: asset.folder_path.clone(), - selection: selection.clone(), - texture_id: None, - }) - } - AssetSelection::SubAsset { - label, - kind: AssetSubAssetKind::Texture, - source_path: Some(path), - .. - } => { - if let Some(asset) = world.get_resource::().and_then(|assets| { - assets - .assets - .iter() - .find(|asset| asset.path.as_deref() == Some(path.as_str())) - }) { - return Some(TextureAssetCandidate { - label: asset.label.clone(), - path: path.clone(), - folder_path: asset.folder_path.clone(), - selection: selection.clone(), - texture_id: None, - }); - } - Some(TextureAssetCandidate { - label: label.clone(), - path: path.clone(), - folder_path: fallback_asset_folder(path), - selection: selection.clone(), - texture_id: None, - }) - } - _ => None, - } -} - -fn source_material_ref_for_part( - asset_id: &str, - part: &crate::assets::static_mesh::StaticMeshPart, -) -> Option { - let material_label = part.material_label.as_deref()?; - let sub_asset_id = part - .material_id - .clone() - .filter(|id| !id.trim().is_empty()) - .unwrap_or_else(|| material_id_from_label(material_label)); - Some(EditorAssetRef::new( - asset_id.to_string(), - sub_asset_id, - part.material_slot_name.clone(), - )) -} - -fn model_thumbnail_texture_by_path(world: &mut World) -> HashMap { - let model_assets: Vec = world - .get_resource::() - .map(|assets| { - assets - .assets - .iter() - .filter(|asset| matches!(asset.kind, EditorAssetKind::Model)) - .cloned() - .collect() - }) - .unwrap_or_default(); - if model_assets.is_empty() { - return HashMap::new(); - } - if world.get_resource::().is_none() { - return HashMap::new(); - } - - let asset_server = world.resource::().clone(); - world.resource_scope(|world, mut cache: Mut| { - if let Some(mut studio) = world.get_resource_mut::() { - for asset in &model_assets { - let Some(path) = asset.path.as_ref() else { - continue; - }; - cache.request_model( - asset_cache_key(asset), - path.clone(), - &asset_server, - &mut studio, - ); - } - } - }); - - let snapshot = world.resource::().snapshot(); - model_assets - .iter() - .filter_map(|asset| { - Some(( - asset.path.clone()?, - snapshot.texture_ids.get(&asset_cache_key(asset)).copied()?, - )) - }) - .collect() -} - -fn fallback_asset_folder(path: &str) -> String { - Path::new(path) - .parent() - .and_then(|parent| parent.to_str()) - .filter(|folder| !folder.trim().is_empty()) - .unwrap_or(crate::assets::ASSETS_ROOT) - .replace('\\', "/") -} - -fn locate_asset_ref( - world: &mut World, - asset: Option<&EditorAssetRef>, - candidates: &[AssetRefCandidate], -) { - let Some(asset) = asset.filter(|asset| asset.is_resolved()) else { - return; - }; - let Some(candidate) = candidates.iter().find(|candidate| { - candidate.reference.asset_id == asset.asset_id - && candidate.reference.sub_asset_id == asset.sub_asset_id - }) else { - if let Some(mut scene_io) = world.get_resource_mut::() { - scene_io.status = format!("Could not locate imported asset {}", asset.label); - } - return; - }; - - reveal_asset_in_browser(world, &candidate.folder_path, &candidate.selection); -} - -fn reveal_asset_in_browser(world: &mut World, folder_path: &str, selection: &AssetSelection) { - if let Some(mut assets) = world.get_resource_mut::() { - assets.current_folder = folder_path.to_string(); - assets.select(selection.clone()); - } - super::request_editor_tab(world, EditorTab::AssetBrowser); -} - -fn skinned_mesh_renderer_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let material_candidates = brush_face_material_ref_candidates(world); - let Some(mut renderer) = world.get::(entity).cloned() else { - return; - }; - let original = renderer.clone(); - let mut changed = false; - let mut options = ComponentCardOptions::removable( - COMPONENT_SKINNED_MESH_RENDERER, - "Skinned Mesh Renderer", - icons::PERSON_SIMPLE_RUN, - ); - options.active_toggle = false; - options.removable = world.get::(entity).is_none(); - options.resettable = false; - options.copyable = false; - let context = component_card_context(world, entity, options); - let response = component_card(ui, &context, |ui| { - property_row(ui, "Source", |ui| { - ui.add( - egui::Label::new(if renderer.path.trim().is_empty() { - "Unassigned" - } else { - renderer.path.as_str() - }) - .truncate(), - ); - }); - property_row(ui, "Scene", |ui| { - ui.label(renderer.scene_index.to_string()); - }); - property_row(ui, "Asset ID", |ui| { - ui.add( - egui::Label::new(if renderer.asset_id.trim().is_empty() { - "Legacy/path-only" - } else { - renderer.asset_id.as_str() - }) - .truncate(), - ); - }); - ui.label( - egui::RichText::new( - "Preserves the imported skeleton hierarchy and Bevy skinned-mesh bindings.", - ) - .small() - .color(TEXT_DIM), - ); - ui.add_space(8.0); - ui.label(egui::RichText::new("Material slots").strong()); - if renderer.materials.slots.is_empty() { - ui.label( - egui::RichText::new("No imported slots; reimport the source model") - .small() - .color(TEXT_DIM), - ); - } - for slot in &mut renderer.materials.slots { - slot_card(ui, |ui| { - ui.label(egui::RichText::new(&slot.name).strong()); - let response = asset_selector_row( - ui, - "Material", - icons::PALETTE, - slot.material.as_ref().map(|reference| &reference.0), - slot.source_material.as_ref().map(|reference| &reference.0), - true, - &material_candidates, - None, - ); - if let Some(selected) = response.selected { - slot.material = Some(MaterialRef::new(selected)); - changed = true; - } - if response.clear { - slot.material = None; - changed = true; - } - if response.locate { - let reference = slot - .material - .as_ref() - .or(slot.source_material.as_ref()) - .map(|reference| &reference.0); - locate_asset_ref(world, reference, &material_candidates); - } - ui.label( - egui::RichText::new(format!("ID: {}", slot.id.0)) - .small() - .color(TEXT_DIM), - ); - }); - } - for orphan in &renderer.materials.orphaned_assignments { - ui.label( - egui::RichText::new(format!( - "Orphaned: {} ({})", - orphan.last_known_name, orphan.slot_id.0 - )) - .small() - .color(egui::Color32::YELLOW), - ); - } - if world.get::(entity).is_some() { - ui.label( - egui::RichText::new( - "Remove the Animation Controller before removing its renderer.", - ) - .small() - .color(TEXT_MUTED), - ); - } - }); - apply_component_card_response(world, entity, response); - if changed && renderer != original { - let result = reflected_component_transaction( - world, - entity, - "Assign Skinned Material Slot", - shared::AUTHORING_COMPONENT_SKINNED_MESH_RENDERER, - COMPONENT_SKINNED_MESH_RENDERER, - move |world, entity| { - world.entity_mut(entity).insert(renderer); - Ok(()) - }, - ); - if let Err(error) = result { - world.resource_mut::().status = error; - } - } -} - -fn static_mesh_renderer_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let mesh_candidates = static_mesh_asset_ref_candidates(world, AssetRefCandidateKind::Mesh); - let material_candidates = brush_face_material_ref_candidates(world); - let Some(mut renderer) = world.get::(entity).cloned() else { - return; - }; - let original = renderer.clone(); - let mut changed = false; - let mut remove_entry = None; - for index in 0..renderer.slots.len() { - ensure_slot_id(&mut renderer.slots[index], index); - let part = &renderer.slots[index]; - if renderer.materials.slot(&part.material_slot_id).is_none() { - renderer.materials.slots.push(shared::RendererMaterialSlot { - id: part.material_slot_id.clone(), - name: part.name.clone(), - source_material: part.material.clone().map(MaterialRef::new), - material: None, - }); - } - } - - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable( - COMPONENT_STATIC_MESH_RENDERER, - "Static Mesh Renderer", - icons::CUBE, - ), - ); - let card_response = component_card(ui, &card, |ui| { - if renderer.slots.is_empty() { - ui.label(egui::RichText::new("No renderer slots").color(TEXT_DIM)); - } - - for (index, entry) in renderer.slots.iter_mut().enumerate() { - ensure_slot_id(entry, index); - let material_slot_name = renderer - .materials - .slot(&entry.material_slot_id) - .map(|slot| slot.name.clone()) - .unwrap_or_else(|| "Missing slot".into()); - let thumbnail = thumbnail_for_mesh(&entry.mesh, &mesh_candidates); - - slot_card(ui, |ui| { - slot_header(ui, index, &entry.name, |ui| { - status_dot(ui, egui::Color32::from_rgb(74, 181, 104), "Slot active"); - if icon_button_small(ui, icons::TRASH, "Remove slot").clicked() { - remove_entry = Some(index); - } - ui.label(phosphor_icon(icons::DOTS_THREE_VERTICAL, 16.0).color(TEXT_DIM)); - }); - ui.add_space(6.0); - - let mut draw_fields = |ui: &mut egui::Ui, entry: &mut StaticMeshRendererEntry| { - property_row(ui, "Name", |ui| { - changed |= ui - .add_sized( - [text_field_width(ui), 20.0], - egui::TextEdit::singleline(&mut entry.name), - ) - .changed(); - }); - let mesh_response = asset_selector_row( - ui, - "Mesh", - icons::CUBE, - Some(&entry.mesh), - None, - false, - &mesh_candidates, - None, - ); - if let Some(selected) = mesh_response.selected { - entry.mesh = selected; - changed = true; - } - if mesh_response.locate { - locate_asset_ref(world, Some(&entry.mesh), &mesh_candidates); - } - - property_row(ui, "Material slot", |ui| { - ui.label(&material_slot_name); - }); - ui.horizontal_wrapped(|ui| { - changed |= ui.checkbox(&mut entry.visible, "Visible").changed(); - changed |= ui - .checkbox(&mut entry.cast_shadows, "Cast shadows") - .changed(); - changed |= ui - .checkbox(&mut entry.receive_shadows, "Receive shadows") - .changed(); - }); - }; - - if ui.available_width() < 430.0 { - slot_thumbnail(ui, thumbnail); - ui.add_space(6.0); - draw_fields(ui, entry); - } else { - ui.horizontal(|ui| { - slot_thumbnail(ui, thumbnail); - ui.add_space(10.0); - ui.vertical(|ui| { - ui.set_max_width(ui.available_width()); - draw_fields(ui, entry); - }); - }); - } - }); - } - - ui.add_space(8.0); - ui.label(egui::RichText::new("Material slots").strong()); - for slot in &mut renderer.materials.slots { - slot_card(ui, |ui| { - ui.label(egui::RichText::new(&slot.name).strong()); - let response = asset_selector_row( - ui, - "Material", - icons::PALETTE, - slot.material.as_ref().map(|reference| &reference.0), - slot.source_material.as_ref().map(|reference| &reference.0), - true, - &material_candidates, - None, - ); - if let Some(selected) = response.selected { - slot.material = Some(MaterialRef::new(selected)); - changed = true; - } - if response.clear { - slot.material = None; - changed = true; - } - if response.locate { - let reference = slot - .material - .as_ref() - .or(slot.source_material.as_ref()) - .map(|reference| &reference.0); - locate_asset_ref(world, reference, &material_candidates); - } - ui.label( - egui::RichText::new(format!("ID: {}", slot.id.0)) - .small() - .color(TEXT_DIM), - ); - }); - } - - let add_slot = ui - .add_sized( - [ui.available_width().max(1.0), 28.0], - egui::Button::new("+ Add Slot").fill(ELEVATED_BG.linear_multiply(0.45)), - ) - .clicked(); - if add_slot { - let index = renderer.slots.len(); - let entry = StaticMeshRendererEntry { - id: ComponentInstanceId::new(format!("slot:{index}")), - material_slot_id: ComponentInstanceId::new(format!("slot:manual:{index}")), - ..Default::default() - }; - renderer.materials.slots.push(shared::RendererMaterialSlot { - id: entry.material_slot_id.clone(), - name: format!("Material {index}"), - source_material: None, - material: None, - }); - renderer.slots.push(entry); - changed = true; - } - }); - apply_component_card_response(world, entity, card_response); - - if let Some(index) = remove_entry { - let removed = renderer.slots.remove(index); - if let Some(slot_index) = renderer - .materials - .slots - .iter() - .position(|slot| slot.id == removed.material_slot_id) - { - let slot = renderer.materials.slots.remove(slot_index); - if let Some(material) = slot.material { - renderer - .materials - .orphaned_assignments - .push(shared::OrphanedMaterialAssignment { - slot_id: slot.id, - last_known_name: slot.name, - material, - }); - } - } - changed = true; - } - if changed && renderer != original { - set_static_mesh_renderer_with_history(world, entity, renderer); - } -} - -fn ensure_slot_id(entry: &mut StaticMeshRendererEntry, index: usize) { - if entry.id.is_empty() { - entry.id = ComponentInstanceId::new(format!("slot:{index}")); - } - if entry.material_slot_id.is_empty() { - entry.material_slot_id = ComponentInstanceId::new(format!("slot:{}", entry.id.0)); - } -} - -fn slot_card(ui: &mut egui::Ui, add_contents: impl FnOnce(&mut egui::Ui)) { - egui::Frame::new() - .fill(WIDGET_BG.linear_multiply(0.82)) - .stroke(egui::Stroke::new(1.0, BORDER)) - .corner_radius(egui::CornerRadius::same(4)) - .inner_margin(egui::Margin::symmetric(8, 8)) - .show(ui, |ui| { - ui.set_max_width(ui.available_width()); - add_contents(ui); - }); - ui.add_space(4.0); -} - -fn slot_header( - ui: &mut egui::Ui, - index: usize, - slot_name: &str, - add_actions: impl FnOnce(&mut egui::Ui), -) { - ui.horizontal(|ui| { - ui.label(phosphor_icon(icons::CARET_DOWN, 13.0).color(TEXT_DIM)); - ui.label(format!("Slot {index}")); - let badge = if slot_name.trim().is_empty() { - "Mesh" - } else { - slot_name.trim() - }; - ui.add( - egui::Button::new( - egui::RichText::new(badge).color(egui::Color32::from_rgb(153, 202, 255)), - ) - .fill(SELECTION_BG_MUTED) - .stroke(egui::Stroke::new(1.0, SELECTION_BG_MUTED)) - .corner_radius(4.0), - ); - ui.with_layout( - egui::Layout::right_to_left(egui::Align::Center), - add_actions, - ); - }); -} - -fn status_dot(ui: &mut egui::Ui, color: egui::Color32, tooltip: &str) { - let (rect, response) = ui.allocate_exact_size(egui::vec2(18.0, 20.0), egui::Sense::hover()); - ui.painter().circle_filled(rect.center(), 4.0, color); - response.on_hover_text(tooltip); -} - -fn status_dot_button(ui: &mut egui::Ui, color: egui::Color32, tooltip: &str) -> egui::Response { - let (rect, response) = ui.allocate_exact_size(egui::vec2(18.0, 20.0), egui::Sense::click()); - let color = if response.hovered() { - color.linear_multiply(1.2) - } else { - color - }; - ui.painter().circle_filled(rect.center(), 4.0, color); - response.on_hover_text(tooltip) -} - -fn slot_thumbnail(ui: &mut egui::Ui, texture_id: Option) { - let size = 86.0_f32.min(ui.available_width().max(1.0)); - let (rect, _response) = ui.allocate_exact_size(egui::vec2(size, size), egui::Sense::hover()); - ui.painter().rect( - rect, - 4.0, - PANEL_BG_DARK, - egui::Stroke::new(1.0, BORDER), - egui::StrokeKind::Inside, - ); - if let Some(texture_id) = texture_id { - let uv = egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)); - ui.painter() - .image(texture_id, rect.shrink(6.0), uv, egui::Color32::WHITE); - } else { - ui.painter().text( - rect.center(), - egui::Align2::CENTER_CENTER, - icons::CUBE.as_str(), - egui::FontId::new(28.0, egui::FontFamily::Name("phosphor-regular".into())), - TEXT_MUTED, - ); - } -} - -fn thumbnail_for_mesh( - mesh: &EditorAssetRef, - candidates: &[AssetRefCandidate], -) -> Option { - candidates - .iter() - .find(|candidate| { - candidate.reference.asset_id == mesh.asset_id - && candidate.reference.sub_asset_id == mesh.sub_asset_id - }) - .and_then(|candidate| candidate.texture_id) -} - -#[expect( - clippy::too_many_arguments, - reason = "asset selector rows keep immediate-mode UI inputs explicit" -)] -fn asset_selector_row( - ui: &mut egui::Ui, - label: &str, - icon: Icon, - asset: Option<&EditorAssetRef>, - inherited_asset: Option<&EditorAssetRef>, - clearable: bool, - candidates: &[AssetRefCandidate], - drop_candidate: Option<&AssetRefCandidate>, -) -> AssetSelectorResponse { - let mut response = AssetSelectorResponse::default(); - if ui.available_width() < COMPACT_INSPECTOR_WIDTH { - ui.vertical(|ui| { - ui.label(label); - let control_width = ui.available_width().max(1.0); - asset_selector_control( - ui, - icon, - asset, - inherited_asset, - clearable, - control_width, - candidates, - drop_candidate, - &mut response, - ); - }); - } else { - ui.horizontal(|ui| { - let row_width = ui.available_width().max(1.0); - let label_width = ASSET_SELECTOR_LABEL_WIDTH.min(row_width); - let control_width = (row_width - label_width - ui.spacing().item_spacing.x).max(1.0); - ui.add_sized([label_width, 20.0], egui::Label::new(label)); - asset_selector_control( - ui, - icon, - asset, - inherited_asset, - clearable, - control_width, - candidates, - drop_candidate, - &mut response, - ); - }); - } - response -} - -#[expect( - clippy::too_many_arguments, - reason = "asset selector controls keep immediate-mode UI inputs explicit" -)] -fn asset_selector_control( - ui: &mut egui::Ui, - icon: Icon, - asset: Option<&EditorAssetRef>, - inherited_asset: Option<&EditorAssetRef>, - clearable: bool, - control_width: f32, - candidates: &[AssetRefCandidate], - drop_candidate: Option<&AssetRefCandidate>, - response: &mut AssetSelectorResponse, -) { - let display_asset = asset.or(inherited_asset); - let inherited = asset.is_none() && inherited_asset.is_some(); - let selector_width = control_width.min(ui.available_width()).max(1.0); - exact_region( - ui, - egui::vec2(selector_width, ASSET_SELECTOR_HEIGHT), - egui::Layout::top_down(egui::Align::Min), - |ui| { - ui.set_clip_rect(ui.max_rect()); - let rect = ui.max_rect(); - let valid_drag = drop_candidate.is_some(); - let drop_hovered = valid_drag && ui.rect_contains_pointer(rect); - let stroke = if drop_hovered { - egui::Stroke::new(2.0, egui::Color32::from_rgb(125, 198, 255)) - } else if valid_drag { - egui::Stroke::new(1.0, egui::Color32::from_rgb(58, 88, 122)) - } else { - egui::Stroke::new(1.0, BORDER) - }; - let fill = if drop_hovered { - egui::Color32::from_rgb(29, 57, 86) - } else { - WIDGET_BG.linear_multiply(0.75) - }; - let inner_width = (selector_width - 18.0).max(1.0); - egui::Frame::new() - .fill(fill) - .stroke(stroke) - .corner_radius(egui::CornerRadius::same(4)) - .inner_margin(egui::Margin::symmetric(8, 6)) - .show(ui, |ui| { - ui.set_width(inner_width); - ui.horizontal(|ui| { - ui.add_sized( - [18.0, 20.0], - egui::Label::new(phosphor_icon(icon, 14.0).color(TEXT_DIM)), - ); - let action_width = if clearable { 78.0 } else { 52.0 }; - let text_width = (ui.available_width() - action_width) - .max(1.0) - .min(ui.available_width().max(1.0)); - ui.vertical(|ui| { - ui.set_max_width(text_width); - let name = display_asset - .map(|asset| asset.label.as_str()) - .filter(|label| !label.trim().is_empty()) - .unwrap_or("(none)"); - ui.add(egui::Label::new(name).truncate()); - let id = display_asset - .map(|asset| { - if inherited { - format!("Source default | {}", asset.sub_asset_id) - } else { - asset.sub_asset_id.clone() - } - }) - .filter(|id| !id.trim().is_empty()) - .unwrap_or_else(|| "No imported asset selected".to_string()); - ui.add( - egui::Label::new(egui::RichText::new(id).color(TEXT_DIM)) - .truncate(), - ); - }); - ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { - if clearable { - let clear = ui.add_enabled( - asset.is_some(), - egui::Button::new(phosphor_icon(icons::X, 16.0)) - .frame(false) - .min_size(egui::vec2(22.0, 22.0)), - ); - if clear.on_hover_text("Clear actor override").clicked() { - response.clear = true; - } - } - let locate = ui.add_enabled( - display_asset.is_some_and(EditorAssetRef::is_resolved), - egui::Button::new(phosphor_icon(icons::CROSSHAIR, 16.0)) - .frame(false) - .min_size(egui::vec2(22.0, 22.0)), - ); - if locate.on_hover_text("Locate in content browser").clicked() { - response.locate = true; - } - if candidates.is_empty() { - ui.add_enabled( - false, - egui::Button::new(phosphor_icon(icons::FOLDER_OPEN, 16.0)) - .frame(false) - .min_size(egui::vec2(22.0, 22.0)), - ) - .on_hover_text("No imported assets available"); - } else { - let menu = - ui.menu_button(phosphor_icon(icons::FOLDER_OPEN, 16.0), |ui| { - ui.set_min_width(220.0); - for candidate in candidates { - let selected = display_asset - .is_some_and(|asset| asset == &candidate.reference); - let clicked = ui - .selectable_label( - selected, - candidate.label.as_str(), - ) - .on_hover_text(candidate.detail.as_str()) - .clicked(); - if clicked { - response.selected = - Some(candidate.reference.clone()); - ui.close(); - } - } - }); - menu.response.on_hover_text("Browse assets"); - } - }); - }); - }); - if drop_hovered && ui.input(|input| input.pointer.any_released()) { - if let Some(candidate) = drop_candidate { - response.selected = Some(candidate.reference.clone()); - response.accepted_drop = true; - } - } - }, - ); -} - -fn material_shader_ui(ui: &mut egui::Ui, material: &mut MaterialDesc) -> bool { - let mut changed = false; - property_row(ui, "Shader", |ui| { - egui::ComboBox::from_id_salt("material_shader_kind") - .selected_text(match material.shader.kind { - MaterialShaderKind::StandardLit => "Standard Lit", - MaterialShaderKind::Unlit => "Unlit", - MaterialShaderKind::Custom => "Custom", - }) - .show_ui(ui, |ui| { - changed |= ui - .selectable_value( - &mut material.shader.kind, - MaterialShaderKind::StandardLit, - "Standard Lit", - ) - .changed(); - changed |= ui - .selectable_value( - &mut material.shader.kind, - MaterialShaderKind::Unlit, - "Unlit", - ) - .changed(); - changed |= ui - .selectable_value( - &mut material.shader.kind, - MaterialShaderKind::Custom, - "Custom", - ) - .changed(); - }); - }); - if matches!(material.shader.kind, MaterialShaderKind::Custom) { - changed |= option_string_ui(ui, "Shader schema", &mut material.shader.schema_path); - changed |= option_string_ui(ui, "WGSL shader", &mut material.shader.shader_path); - } - if !material.parameters.is_empty() { - ui.label(panel_heading("Shader Parameters")); - for parameter in &mut material.parameters { - changed |= material_parameter_ui(ui, parameter); - } - } - changed -} - -fn material_parameter_ui(ui: &mut egui::Ui, parameter: &mut MaterialParameter) -> bool { - ui.horizontal_wrapped(|ui| { - ui.label(¶meter.name); - match &mut parameter.value { - MaterialParameterValue::Bool(value) => ui.checkbox(value, "").changed(), - MaterialParameterValue::Float(value) => ui - .add_sized( - [fit_width(ui, 64.0, 120.0), 20.0], - egui::DragValue::new(value) - .speed(0.01) - .min_decimals(2) - .max_decimals(4), - ) - .changed(), - MaterialParameterValue::Vec2(value) => { - let mut changed = false; - changed |= ui - .add_sized( - [fit_width(ui, 52.0, 88.0), 20.0], - egui::DragValue::new(&mut value.x).speed(0.01), - ) - .changed(); - changed |= ui - .add_sized( - [fit_width(ui, 52.0, 88.0), 20.0], - egui::DragValue::new(&mut value.y).speed(0.01), - ) - .changed(); - changed - } - MaterialParameterValue::Vec3(value) => { - let mut changed = false; - changed |= ui - .add_sized( - [fit_width(ui, 52.0, 88.0), 20.0], - egui::DragValue::new(&mut value.x).speed(0.01), - ) - .changed(); - changed |= ui - .add_sized( - [fit_width(ui, 52.0, 88.0), 20.0], - egui::DragValue::new(&mut value.y).speed(0.01), - ) - .changed(); - changed |= ui - .add_sized( - [fit_width(ui, 52.0, 88.0), 20.0], - egui::DragValue::new(&mut value.z).speed(0.01), - ) - .changed(); - changed - } - MaterialParameterValue::Color(value) => { - let mut rgba = [value.r, value.g, value.b, value.a]; - let changed = ui.color_edit_button_rgba_unmultiplied(&mut rgba).changed(); - if changed { - *value = ColorDesc { - r: rgba[0], - g: rgba[1], - b: rgba[2], - a: rgba[3], - }; - } - changed - } - MaterialParameterValue::Enum(value) => ui - .add_sized( - [ - fit_width(ui, MIN_INLINE_CONTROL_WIDTH, TEXT_FIELD_MAX_WIDTH), - 20.0, - ], - egui::TextEdit::singleline(value), - ) - .changed(), - } - }) - .inner -} - -pub(crate) fn component_card( - ui: &mut egui::Ui, - context: &ComponentCardContext, - add_contents: impl FnOnce(&mut egui::Ui), -) -> ComponentCardResponse { - let mut response = ComponentCardResponse { - type_name: context.options.type_name, - ..Default::default() - }; - egui::Frame::new() - .fill(WIDGET_BG) - .stroke(egui::Stroke::new(1.0, BORDER)) - .corner_radius(egui::CornerRadius::same(4)) - .inner_margin(egui::Margin::symmetric(8, 8)) - .show(ui, |ui| { - ui.horizontal(|ui| { - let caret = if context.collapsed { - icons::CARET_RIGHT - } else { - icons::CARET_DOWN - }; - if ui - .add( - egui::Button::new(phosphor_icon(caret, 13.0).color(TEXT_DIM)) - .frame(false) - .min_size(egui::vec2(20.0, 20.0)), - ) - .on_hover_text(if context.collapsed { - "Expand component" - } else { - "Collapse component" - }) - .clicked() - { - response.collapsed = Some(!context.collapsed); - } - ui.label(phosphor_icon(context.options.icon, 16.0).color(TEXT_DIM)); - ui.label(panel_heading(context.options.title)); - ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { - let menu = ui.menu_button( - phosphor_icon(icons::DOTS_THREE_VERTICAL, 16.0).color(TEXT_DIM), - |ui| { - ui.set_min_width(160.0); - if ui - .add_enabled(context.options.resettable, egui::Button::new("Reset")) - .clicked() - { - response.reset = true; - ui.close(); - } - if ui - .add_enabled( - context.options.copyable, - egui::Button::new("Copy Values"), - ) - .clicked() - { - response.copy = true; - ui.close(); - } - if ui - .add_enabled(context.pasteable, egui::Button::new("Paste Values")) - .clicked() - { - response.paste = true; - ui.close(); - } - ui.separator(); - if ui - .add_enabled(context.can_move_up, egui::Button::new("Move Up")) - .clicked() - { - response.move_up = true; - ui.close(); - } - if ui - .add_enabled(context.can_move_down, egui::Button::new("Move Down")) - .clicked() - { - response.move_down = true; - ui.close(); - } - ui.separator(); - ui.add_enabled(false, egui::Button::new("Open Documentation")); - if ui - .add_enabled( - context.options.removable, - egui::Button::new( - egui::RichText::new("Remove") - .color(egui::Color32::from_rgb(255, 137, 129)), - ), - ) - .clicked() - { - response.remove = true; - ui.close(); - } - }, - ); - menu.response.on_hover_text("Component actions"); - if context.options.active_toggle { - if status_dot_button( - ui, - if context.active { - egui::Color32::from_rgb(74, 181, 104) - } else { - TEXT_MUTED - }, - if context.active { - "Component active. Click to disable." - } else { - "Component disabled. Click to enable." - }, - ) - .clicked() - { - response.active = Some(!context.active); - } - } else { - status_dot( - ui, - egui::Color32::from_rgb(74, 181, 104), - "Component active", - ); - } - }); - }); - if !context.collapsed { - ui.add_space(4.0); - egui::Frame::new() - .fill(ELEVATED_BG.linear_multiply(0.35)) - .corner_radius(egui::CornerRadius::same(4)) - .inner_margin(egui::Margin::symmetric(8, 8)) - .show(ui, |ui| { - ui.set_clip_rect(ui.max_rect()); - ui.set_max_width(ui.available_width()); - add_contents(ui); - }); - } - }); - ui.add_space(6.0); - response -} - -pub(crate) fn property_row( - ui: &mut egui::Ui, - label: &str, - add_contents: impl FnOnce(&mut egui::Ui) -> R, -) -> R { - if ui.available_width() < COMPACT_INSPECTOR_WIDTH { - ui.vertical(|ui| { - ui.label(label); - add_contents(ui) - }) - .inner - } else { - ui.horizontal(|ui| { - let label_width = PROPERTY_LABEL_WIDTH.min(ui.available_width().max(1.0)); - ui.add_sized([label_width, 20.0], egui::Label::new(label)); - add_contents(ui) - }) - .inner - } -} - -pub(crate) fn text_field_width(ui: &egui::Ui) -> f32 { - fit_width(ui, MIN_INLINE_CONTROL_WIDTH, TEXT_FIELD_MAX_WIDTH).min(ui.available_width().max(1.0)) -} - -pub fn material_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let mut material = world - .get::(entity) - .cloned() - .unwrap_or_default(); - request_texture_asset_thumbnails(world); - let texture_candidates = texture_asset_candidates(world); - let original = material.clone(); - let mut changed = false; - let mut options = ComponentCardOptions::removable( - COMPONENT_MATERIAL_DESC, - "Authoring Material", - icons::PALETTE, - ); - options.removable = world.get::(entity).is_some(); - options.copyable = options.removable; - let card = component_card_context(world, entity, options); - let card_response = component_card(ui, &card, |ui| { - changed |= material_shader_ui(ui, &mut material); - let mut color = [ - material.base_color.r, - material.base_color.g, - material.base_color.b, - material.base_color.a, - ]; - property_row(ui, "Base color", |ui| { - if ui.color_edit_button_rgba_unmultiplied(&mut color).changed() { - material.base_color = ColorDesc { - r: color[0], - g: color[1], - b: color[2], - a: color[3], - }; - changed = true; - } - }); - property_row(ui, "Metallic", |ui| { - changed |= ui - .add(egui::Slider::new(&mut material.metallic, 0.0..=1.0)) - .changed(); - }); - property_row(ui, "Roughness", |ui| { - changed |= ui - .add(egui::Slider::new(&mut material.roughness, 0.0..=1.0)) - .changed(); - }); - - let mut emissive_color = [ - material.emissive_color.r, - material.emissive_color.g, - material.emissive_color.b, - material.emissive_color.a, - ]; - property_row(ui, "Emissive", |ui| { - if ui - .color_edit_button_rgba_unmultiplied(&mut emissive_color) - .changed() - { - material.emissive_color = ColorDesc { - r: emissive_color[0], - g: emissive_color[1], - b: emissive_color[2], - a: emissive_color[3], - }; - changed = true; - } - }); - property_row(ui, "Emissive nits", |ui| { - changed |= ui - .add(egui::Slider::new( - &mut material.emissive_intensity, - 0.0..=20_000.0, - )) - .changed(); - }); - - changed |= texture_asset_picker_ui( - world, - ui, - "Base color texture", - &mut material.base_color_texture, - &texture_candidates, - ); - changed |= texture_asset_picker_ui( - world, - ui, - "Emissive texture", - &mut material.emissive_texture, - &texture_candidates, - ); - changed |= texture_asset_picker_ui( - world, - ui, - "Normal map", - &mut material.normal_map_texture, - &texture_candidates, - ); - changed |= texture_asset_picker_ui( - world, - ui, - "Metallic/roughness texture", - &mut material.metallic_roughness_texture, - &texture_candidates, - ); - - if crate::assets::materials::material_asset_picker_ui( - world, - ui, - entity, - &mut material, - &original, - ) { - changed = true; - } - }); - apply_component_card_response(world, entity, card_response); - - if changed && !material_eq(&original, &material) { - set_material_with_history(world, entity, material); - } -} - -fn brush_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let material_candidates = brush_face_material_ref_candidates(world); - request_texture_asset_thumbnails(world); - let texture_candidates = texture_asset_ref_candidates(world); - let Some(mut brush) = world.get::(entity).cloned() else { - return; - }; - let original = brush.clone(); - let mut changed = false; - let mut reset_cube = false; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_BRUSH_DESC, "Brush", icons::CUBE), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Kind", |ui| { - egui::ComboBox::from_id_salt("brush_kind") - .selected_text(match brush.kind { - BrushKind::Additive => "Additive", - BrushKind::SubtractiveMarker => "Subtractive Marker", - }) - .show_ui(ui, |ui| { - changed |= ui - .selectable_value(&mut brush.kind, BrushKind::Additive, "Additive") - .changed(); - changed |= ui - .selectable_value( - &mut brush.kind, - BrushKind::SubtractiveMarker, - "Subtractive Marker", - ) - .changed(); - }); - }); - property_row(ui, "Faces", |ui| { - ui.label(format!("{}", brush.faces.len())); - }); - property_row(ui, "Shadows", |ui| { - ui.horizontal_wrapped(|ui| { - changed |= ui.checkbox(&mut brush.cast_shadows, "Cast").changed(); - changed |= ui.checkbox(&mut brush.receive_shadows, "Receive").changed(); - }); - }); - brush_validation_ui(ui, &brush); - changed |= selected_brush_face_controls( - world, - ui, - entity, - &mut brush, - &material_candidates, - &texture_candidates, - ); - if ui.button("Reset Cube Brush").clicked() { - reset_cube = true; - } - }); - apply_component_card_response(world, entity, card_response); - - if reset_cube { - brush = BrushDesc::default(); - changed = true; - } - if changed && brush != original { - set_brush_with_history(world, entity, brush); - } -} - -fn terrain_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let material_candidates = brush_face_material_ref_candidates(world); - let dragging_selection = world - .get_resource::() - .and_then(|assets| assets.dragging_selection().cloned()); - let material_drop_candidate = dragging_selection.as_ref().and_then(|selection| { - asset_ref_candidate_from_selection(world, selection, AssetRefCandidateKind::Material) - }); - let Some(mut terrain) = world.get::(entity).cloned() else { - return; - }; - let original = terrain.clone(); - let mut changed = false; - let mut requested_resolution = terrain.resolution; - let mut remove_layer = None; - let mut swap_layers = None; - let mut locate_layer = None; - let mut accepted_drop = false; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_TERRAIN_DESC, "Terrain", icons::MOUNTAINS), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Grid", |ui| { - ui.horizontal(|ui| { - ui.add( - egui::DragValue::new(&mut requested_resolution) - .range(2..=1025) - .suffix(" samples"), - ); - if ui - .add_enabled( - requested_resolution != terrain.resolution, - egui::Button::new("Resize Flat"), - ) - .on_hover_text("Replaces the current height grid with a flat grid") - .clicked() - { - let replacement = TerrainDesc::flat(requested_resolution); - terrain.resolution = replacement.resolution; - terrain.heights = replacement.heights; - terrain.material_weights.clear(); - terrain.chunk_quads = terrain.chunk_quads.min(terrain.resolution - 1).max(1); - changed = true; - } - }); - }); - property_row(ui, "Sample Spacing", |ui| { - changed |= ui - .add( - egui::DragValue::new(&mut terrain.sample_spacing) - .range(0.01..=1000.0) - .speed(0.1) - .suffix(" m"), - ) - .changed(); - }); - property_row(ui, "Height Scale", |ui| { - changed |= ui - .add( - egui::DragValue::new(&mut terrain.height_scale) - .range(0.01..=10000.0) - .speed(0.1) - .suffix(" m"), - ) - .changed(); - }); - property_row(ui, "Chunk Size", |ui| { - changed |= ui - .add( - egui::DragValue::new(&mut terrain.chunk_quads) - .range(1..=terrain.resolution.saturating_sub(1)) - .suffix(" quads"), - ) - .changed(); - }); - property_row(ui, "Collision", |ui| { - changed |= ui - .checkbox(&mut terrain.generate_colliders, "Generate") - .changed(); - }); - property_row(ui, "Shadows", |ui| { - ui.horizontal_wrapped(|ui| { - changed |= ui.checkbox(&mut terrain.cast_shadows, "Cast").changed(); - changed |= ui - .checkbox(&mut terrain.receive_shadows, "Receive") - .changed(); - }); - }); - ui.add_space(6.0); - ui.separator(); - ui.horizontal(|ui| { - ui.label(egui::RichText::new("Material Layers").strong()); - ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { - if ui - .add_enabled( - terrain.material_layers.len() < shared::TERRAIN_MATERIAL_LAYER_LIMIT, - egui::Button::new(phosphor_icon(icons::PLUS, 16.0)), - ) - .on_hover_text("Add a terrain blend channel") - .clicked() - { - let material = if terrain.material_layers.is_empty() { - terrain.base_material.take() - } else { - None - }; - terrain.material_layers.push(shared::TerrainMaterialLayer { - material, - ..Default::default() - }); - changed = true; - } - }); - }); - if terrain.material_layers.is_empty() { - ui.label( - egui::RichText::new( - terrain - .base_material - .as_ref() - .map(|material| format!("Legacy base: {}", material.label)) - .unwrap_or_else(|| "No layers assigned; visible terrain fallback".into()), - ) - .color(TEXT_DIM) - .small(), - ); - } - for index in 0..terrain.material_layers.len() { - ui.add_space(4.0); - ui.horizontal(|ui| { - ui.label( - egui::RichText::new(format!("Layer {}", index + 1)) - .strong() - .color(if index == 0 { - SELECTION_BG_MUTED - } else { - TEXT_DIM - }), - ); - ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { - if icon_button_small(ui, icons::TRASH, "Remove layer").clicked() { - remove_layer = Some(index); - } - if ui - .add_enabled( - index + 1 < terrain.material_layers.len(), - egui::Button::new(phosphor_icon(icons::ARROW_DOWN, 15.0)).frame(false), - ) - .on_hover_text("Move layer down") - .clicked() - { - swap_layers = Some((index, index + 1)); - } - if ui - .add_enabled( - index > 0, - egui::Button::new(phosphor_icon(icons::ARROW_UP, 15.0)).frame(false), - ) - .on_hover_text("Move layer up") - .clicked() - { - swap_layers = Some((index, index - 1)); - } - }); - }); - let response = asset_selector_row( - ui, - "Material", - icons::PALETTE, - terrain.material_layers[index].material.as_ref(), - None, - true, - &material_candidates, - material_drop_candidate.as_ref(), - ); - if let Some(selected) = response.selected { - terrain.material_layers[index].material = Some(selected); - changed = true; - } - if response.clear { - terrain.material_layers[index].material = None; - changed = true; - } - if response.locate { - locate_layer = Some(index); - } - accepted_drop |= response.accepted_drop; - property_row(ui, "UV Tiling", |ui| { - changed |= ui - .add( - egui::DragValue::new(&mut terrain.material_layers[index].uv_scale) - .range(0.01..=1024.0) - .speed(0.1) - .suffix("×"), - ) - .changed(); - }); - if !terrain.material_weights.is_empty() { - let covered = terrain - .material_weights - .iter() - .filter(|weights| weights[index] > 0) - .count(); - ui.label( - egui::RichText::new(format!( - "{} / {} samples carry this layer", - covered, - terrain.material_weights.len() - )) - .color(TEXT_DIM) - .small(), - ); - } - } - match terrain.validate() { - Ok(()) => { - ui.label( - egui::RichText::new(format!( - "{} heights • {}×{} chunks", - terrain.heights.len(), - (terrain.resolution - 1).div_ceil(terrain.chunk_quads), - (terrain.resolution - 1).div_ceil(terrain.chunk_quads) - )) - .color(super::theme::SUCCESS), - ); - } - Err(error) => { - ui.label(egui::RichText::new(error).color(super::theme::ERROR)); - } - } - }); - apply_component_card_response(world, entity, card_response); - - if let Some(index) = remove_layer { - remove_terrain_material_layer(&mut terrain, index); - changed = true; - } - if let Some((a, b)) = swap_layers { - terrain.material_layers.swap(a, b); - for weights in &mut terrain.material_weights { - weights.swap(a, b); - } - changed = true; - } - if let Some(index) = locate_layer { - locate_asset_ref( - world, - terrain - .material_layers - .get(index) - .and_then(|layer| layer.material.as_ref()), - &material_candidates, - ); - } - if accepted_drop { - clear_asset_drag(world); - } - - if changed && terrain != original { - let _ = reflected_component_transaction( - world, - entity, - "Edit Terrain", - shared::AUTHORING_COMPONENT_TERRAIN, - COMPONENT_TERRAIN_DESC, - move |world, entity| { - world.entity_mut(entity).insert(terrain); - Ok(()) - }, - ); - } -} - -fn remove_terrain_material_layer(terrain: &mut TerrainDesc, index: usize) { - if index >= terrain.material_layers.len() { - return; - } - terrain.material_layers.remove(index); - if terrain.material_layers.is_empty() { - terrain.material_weights.clear(); - return; - } - for weights in &mut terrain.material_weights { - for channel in index..3 { - weights[channel] = weights[channel + 1]; - } - weights[3] = 0; - normalize_terrain_weights(weights, terrain.material_layers.len()); - } -} - -fn normalize_terrain_weights(weights: &mut [u8; 4], layer_count: usize) { - for weight in weights.iter_mut().skip(layer_count) { - *weight = 0; - } - let sum: u16 = weights - .iter() - .take(layer_count) - .copied() - .map(u16::from) - .sum(); - if sum == 0 { - *weights = [255, 0, 0, 0]; - return; - } - let source = *weights; - let mut assigned = 0_u16; - for index in 0..layer_count { - weights[index] = ((u16::from(source[index]) * 255) / sum) as u8; - assigned += u16::from(weights[index]); - } - let largest = (0..layer_count) - .max_by_key(|index| source[*index]) - .unwrap_or(0); - weights[largest] = weights[largest].saturating_add((255 - assigned) as u8); -} - -fn brush_validation_ui(ui: &mut egui::Ui, brush: &BrushDesc) { - let report = validate_brush(brush); - if report.diagnostics.is_empty() { - return; - } - - ui.add_space(6.0); - egui::Frame::new() - .fill(egui::Color32::from_rgb(31, 32, 36)) - .stroke(egui::Stroke::new(1.0, BORDER)) - .inner_margin(egui::Margin::symmetric(8, 6)) - .show(ui, |ui| { - let has_errors = !report.is_valid(); - let title_color = if has_errors { - egui::Color32::from_rgb(255, 137, 129) - } else { - egui::Color32::from_rgb(255, 190, 110) - }; - ui.horizontal(|ui| { - let icon = if has_errors { - icons::WARNING - } else { - icons::INFO - }; - ui.label(phosphor_icon(icon, 14.0).color(title_color)); - ui.label( - egui::RichText::new(if has_errors { - "Brush geometry needs repair" - } else { - "Brush diagnostics" - }) - .color(title_color), - ); - }); - for diagnostic in report.diagnostics.iter().take(4) { - let color = match diagnostic.severity { - BrushDiagnosticSeverity::Error => egui::Color32::from_rgb(255, 137, 129), - BrushDiagnosticSeverity::Warning => egui::Color32::from_rgb(255, 190, 110), - }; - let face = diagnostic - .face - .as_ref() - .filter(|face| !face.is_empty()) - .map(|face| format!("{}: ", face.0)) - .unwrap_or_default(); - ui.label(egui::RichText::new(format!("{face}{}", diagnostic.message)).color(color)); - } - let hidden_count = report.diagnostics.len().saturating_sub(4); - if hidden_count > 0 { - ui.label(egui::RichText::new(format!("+{hidden_count} more")).color(TEXT_MUTED)); - } - }); -} - -fn selected_brush_face_controls( - world: &mut World, - ui: &mut egui::Ui, - entity: Entity, - brush: &mut BrushDesc, - material_candidates: &[AssetRefCandidate], - texture_candidates: &[AssetRefCandidate], -) -> bool { - let Some(selection) = world.get_resource::() else { - return false; - }; - if selection.brush != Some(entity) { - return false; - } - let selected_faces: Vec<_> = selection - .elements - .iter() - .filter_map(|element| match element { - BrushElementKey::Face { face } => Some(face.clone()), - _ => None, - }) - .collect(); - if selected_faces.is_empty() { - return false; - } - - let dragging_selection = world - .get_resource::() - .and_then(|assets| assets.dragging_selection().cloned()); - let material_drop_candidate = dragging_selection.as_ref().and_then(|selection| { - asset_ref_candidate_from_selection(world, selection, AssetRefCandidateKind::Material) - }); - let texture_drop_candidate = dragging_selection.as_ref().and_then(|selection| { - asset_ref_candidate_from_selection(world, selection, AssetRefCandidateKind::Texture) - }); - let mut changed = false; - ui.add_space(6.0); - ui.separator(); - ui.label( - egui::RichText::new(format!("{} selected face(s)", selected_faces.len())).color(TEXT_DIM), - ); - - for face_id in selected_faces { - let Some(face) = brush.faces.iter_mut().find(|face| face.id == face_id) else { - continue; - }; - let label = if face.id.0.trim().is_empty() { - "Face".to_string() - } else { - face.id.0.clone() - }; - egui::CollapsingHeader::new(label) - .default_open(true) - .show(ui, |ui| { - property_row(ui, "UV offset", |ui| { - changed |= ui - .add(egui::DragValue::new(&mut face.uv_offset.x).speed(0.05)) - .changed(); - changed |= ui - .add(egui::DragValue::new(&mut face.uv_offset.y).speed(0.05)) - .changed(); - }); - property_row(ui, "UV scale", |ui| { - changed |= ui - .add(egui::DragValue::new(&mut face.uv_scale.x).speed(0.05)) - .changed(); - changed |= ui - .add(egui::DragValue::new(&mut face.uv_scale.y).speed(0.05)) - .changed(); - }); - property_row(ui, "UV rotation", |ui| { - changed |= ui - .add(egui::DragValue::new(&mut face.uv_rotation).speed(1.0)) - .changed(); - }); - let material_response = asset_selector_row( - ui, - "Material", - icons::PALETTE, - face.material.as_ref(), - None, - true, - material_candidates, - material_drop_candidate.as_ref(), - ); - if let Some(selected) = material_response.selected { - face.material = Some(selected); - changed = true; - } - if material_response.clear { - face.material = None; - changed = true; - } - if material_response.locate { - locate_asset_ref(world, face.material.as_ref(), material_candidates); - } - if material_response.accepted_drop { - clear_asset_drag(world); - } - - let texture_response = asset_selector_row( - ui, - "Texture", - icons::IMAGE, - face.texture.as_ref(), - None, - true, - texture_candidates, - texture_drop_candidate.as_ref(), - ); - if let Some(selected) = texture_response.selected { - face.texture = Some(selected); - changed = true; - } - if texture_response.clear { - face.texture = None; - changed = true; - } - if texture_response.locate { - locate_asset_ref(world, face.texture.as_ref(), texture_candidates); - } - if texture_response.accepted_drop { - clear_asset_drag(world); - } - }); - } - - changed -} - -fn clear_asset_drag(world: &mut World) { - if let Some(mut assets) = world.get_resource_mut::() { - assets.clear_drag(); - } -} - -fn primitive_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let Some(mut primitive) = world.get::(entity).cloned() else { - return; - }; - let _original = primitive.clone(); - let mut changed = false; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_PRIMITIVE, "Primitive", icons::CUBE), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Shape", |ui| { - ui.horizontal_wrapped(|ui| { - for (label, shape) in [ - ("Box", PrimitiveShape::Box), - ("Sphere", PrimitiveShape::Sphere), - ("Ramp", PrimitiveShape::Ramp), - ] { - changed |= ui - .selectable_value(&mut primitive.shape, shape, label) - .changed(); - } - }); - }); - property_row(ui, "Size X", |ui| { - changed |= ui - .add(egui::Slider::new(&mut primitive.size.x, 0.1..=20.0)) - .changed(); - }); - property_row(ui, "Size Y", |ui| { - changed |= ui - .add(egui::Slider::new(&mut primitive.size.y, 0.1..=20.0)) - .changed(); - }); - property_row(ui, "Size Z", |ui| { - changed |= ui - .add(egui::Slider::new(&mut primitive.size.z, 0.1..=20.0)) - .changed(); - }); - }); - apply_component_card_response(world, entity, card_response); - if changed { - set_primitive_with_history(world, entity, primitive); - } -} - -fn light_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let Some(mut light) = world.get::(entity).cloned() else { - return; - }; - let _original = light.clone(); - let mut changed = false; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_LIGHT_DESC, "Light", icons::LIGHTBULB), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Kind", |ui| { - ui.horizontal_wrapped(|ui| { - for (label, kind) in [ - ("Point", AuthoringLightKind::Point), - ("Spot", AuthoringLightKind::Spot), - ("Directional", AuthoringLightKind::Directional), - ] { - if ui.selectable_label(light.kind == kind, label).clicked() { - let color = light.color; - light = LightDesc { - color, - ..LightDesc::for_kind(kind) - }; - changed = true; - } - } - }); - }); - let solari_disabled = solari_disables_local_light(world, &light); - if solari_disabled { - ui.colored_label( - egui::Color32::from_rgb(255, 180, 100), - "Point and spot lights are disabled while Solari is active. Use a directional light or emissive material, or switch GI to Forward.", - ); - } - ui.add_enabled_ui(!solari_disabled, |ui| { - let mut color = [light.color.r, light.color.g, light.color.b, light.color.a]; - property_row(ui, "Color", |ui| { - if ui.color_edit_button_rgba_unmultiplied(&mut color).changed() { - light.color = ColorDesc { - r: color[0], - g: color[1], - b: color[2], - a: color[3], - }; - changed = true; - } - }); - let intensity_label = match light.kind { - AuthoringLightKind::Directional => "Intensity (lux)", - _ => "Intensity (lumens)", - }; - let intensity_max = match light.kind { - AuthoringLightKind::Directional => AUTHORING_DIRECTIONAL_LUX_MAX, - _ => AUTHORING_POINT_SPOT_LUMENS_MAX, - }; - property_row(ui, intensity_label, |ui| { - ui.horizontal_wrapped(|ui| { - if ui - .add( - egui::Slider::new(&mut light.intensity, 0.0..=intensity_max) - .show_value(false), - ) - .changed() - { - changed = true; - } - if ui - .add_sized( - [fit_width(ui, 72.0, 120.0), 20.0], - egui::DragValue::new(&mut light.intensity) - .range(0.0..=intensity_max) - .speed(intensity_max * 0.001), - ) - .changed() - { - changed = true; - } - }); - }); - if matches!( - light.kind, - AuthoringLightKind::Point | AuthoringLightKind::Spot - ) { - property_row(ui, "Range (m)", |ui| { - changed |= ui - .add(egui::Slider::new(&mut light.range, 0.0..=100.0)) - .changed(); - }); - } - if matches!(light.kind, AuthoringLightKind::Spot) { - property_row(ui, "Inner angle", |ui| { - changed |= ui - .add(egui::Slider::new(&mut light.inner_angle_deg, 1.0..=80.0)) - .changed(); - }); - property_row(ui, "Outer angle", |ui| { - changed |= ui - .add(egui::Slider::new(&mut light.outer_angle_deg, 1.0..=90.0)) - .changed(); - }); - } - property_row(ui, "Shadows", |ui| { - changed |= ui.checkbox(&mut light.shadows, "Cast shadows").changed(); - }); - if matches!(light.kind, AuthoringLightKind::Directional) { - ui.small("Controls project sun while this directional exists."); - } - }); - }); - apply_component_card_response(world, entity, card_response); - if changed { - set_light_with_history(world, entity, light); - } -} - -fn solari_disables_local_light(world: &World, light: &LightDesc) -> bool { - matches!( - light.kind, - AuthoringLightKind::Point | AuthoringLightKind::Spot - ) && world - .get_resource::() - .is_some_and(|profile| profile.gi_path == settings::GiPath::SolariDeferred) - && world - .get_resource::() - .is_some_and(|caps| caps.rt_supported) -} - -fn rigid_body_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let Some(mut body) = world.get::(entity).copied() else { - return; - }; - let original = body; - let mut changed = false; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_RIGID_BODY_DESC, "Rigid Body", icons::SPHERE), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Body", |ui| { - ui.horizontal_wrapped(|ui| { - for (label, kind) in [ - ("Static", AuthoringRigidBody::Static), - ("Kinematic", AuthoringRigidBody::Kinematic), - ("Dynamic", AuthoringRigidBody::Dynamic), - ] { - changed |= ui.selectable_value(&mut body.body, kind, label).changed(); - } - }); - }); - }); - apply_component_card_response(world, entity, card_response); - if changed && body != original { - set_rigid_body_with_history(world, entity, body); - } -} - -fn collider_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let mesh_candidates = static_mesh_asset_ref_candidates(world, AssetRefCandidateKind::Mesh); - let diagnostic_entry = diagnose_collider(world, entity); - let Some(mut collider) = world.get::(entity).cloned() else { - return; - }; - let original = collider.clone(); - let mut changed = false; - let renderer_meshes: Vec = world - .get::(entity) - .map(|renderer| { - renderer - .slots - .iter() - .map(|slot| slot.mesh.clone()) - .collect() - }) - .unwrap_or_default(); - - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_COLLIDER_DESC, "Collider", icons::SELECTION), - ); - let card_response = component_card(ui, &card, |ui| { - if let Some(entry) = diagnostic_entry.as_ref() { - let (label, color) = match entry.overlay_status { - ColliderOverlayStatus::Valid => ("Ready", egui::Color32::from_rgb(112, 210, 144)), - ColliderOverlayStatus::Trigger => { - ("Trigger", egui::Color32::from_rgb(86, 195, 235)) - } - ColliderOverlayStatus::Disabled => { - ("Disabled", egui::Color32::from_rgb(143, 151, 163)) - } - ColliderOverlayStatus::Warning => { - ("Warning", egui::Color32::from_rgb(242, 173, 72)) - } - ColliderOverlayStatus::Error => ("Invalid", egui::Color32::from_rgb(244, 91, 99)), - }; - ui.horizontal_wrapped(|ui| { - ui.colored_label(color, egui::RichText::new(label).strong()); - ui.label(egui::RichText::new(entry.shape_label).color(TEXT_DIM)); - if entry.runtime_ready { - ui.label(egui::RichText::new("Hydrated").color(TEXT_MUTED).small()); - } - }); - for diagnostic in &entry.diagnostics { - let color = match diagnostic.severity { - ColliderDiagnosticSeverity::Info => TEXT_MUTED, - ColliderDiagnosticSeverity::Warning => egui::Color32::from_rgb(242, 173, 72), - ColliderDiagnosticSeverity::Error => egui::Color32::from_rgb(244, 91, 99), - }; - ui.label( - egui::RichText::new(&diagnostic.message) - .color(color) - .small(), - ); - ui.label( - egui::RichText::new(&diagnostic.repair) - .color(TEXT_MUTED) - .small(), - ); - } - if entry.highest_severity() == Some(ColliderDiagnosticSeverity::Error) - && ui.small_button("Reset shape").clicked() - { - collider.shape = ColliderShapeDesc::default(); - collider.enabled = true; - changed = true; - } - ui.add_space(2.0); - } - property_row(ui, "Mode", |ui| { - changed |= ui.checkbox(&mut collider.enabled, "Enabled").changed(); - changed |= ui.checkbox(&mut collider.is_trigger, "Trigger").changed(); - }); - property_row(ui, "Shape", |ui| { - let mut shape_kind = collider_shape_kind(&collider.shape); - egui::ComboBox::from_id_salt(("collider_shape_kind", entity)) - .selected_text(shape_kind) - .show_ui(ui, |ui| { - for label in ["Box", "Sphere", "Capsule", "Static Mesh"] { - if ui.selectable_label(shape_kind == label, label).clicked() { - shape_kind = label; - } - } - }); - if shape_kind != collider_shape_kind(&collider.shape) { - collider.shape = - convert_collider_shape(&collider.shape, shape_kind, renderer_meshes.clone()); - changed = true; - } - }); - - match &mut collider.shape { - ColliderShapeDesc::Cuboid { - x_length, - y_length, - z_length, - } => { - changed |= dimension_drag(ui, "X", x_length); - changed |= dimension_drag(ui, "Y", y_length); - changed |= dimension_drag(ui, "Z", z_length); - } - ColliderShapeDesc::Sphere { radius } => { - changed |= dimension_drag(ui, "Radius", radius); - } - ColliderShapeDesc::Capsule { radius, height } => { - changed |= dimension_drag(ui, "Radius", radius); - changed |= dimension_drag(ui, "Height", height); - } - ColliderShapeDesc::StaticMesh { meshes, .. } => { - if meshes.is_empty() { - ui.label(egui::RichText::new("No mesh collider sources").color(TEXT_DIM)); - } - for mesh in meshes.iter_mut() { - let mesh_response = asset_selector_row( - ui, - "Mesh", - icons::CUBE, - Some(mesh), - None, - false, - &mesh_candidates, - None, - ); - if let Some(selected) = mesh_response.selected { - *mesh = selected; - changed = true; - } - if mesh_response.locate { - locate_asset_ref(world, Some(mesh), &mesh_candidates); - } - } - if !renderer_meshes.is_empty() && ui.button("Use renderer meshes").clicked() { - *meshes = renderer_meshes.clone(); - changed = true; - } - } - } - }); - apply_component_card_response(world, entity, card_response); - - if changed && collider != original { - set_collider_with_history(world, entity, collider); - } -} - -fn collider_shape_kind(shape: &ColliderShapeDesc) -> &'static str { - match shape { - ColliderShapeDesc::Cuboid { .. } => "Box", - ColliderShapeDesc::Sphere { .. } => "Sphere", - ColliderShapeDesc::Capsule { .. } => "Capsule", - ColliderShapeDesc::StaticMesh { .. } => "Static Mesh", - } -} - -fn convert_collider_shape( - previous: &ColliderShapeDesc, - shape_kind: &str, - renderer_meshes: Vec, -) -> ColliderShapeDesc { - let dimensions = match previous { - ColliderShapeDesc::Cuboid { - x_length, - y_length, - z_length, - } => Vec3::new(*x_length, *y_length, *z_length), - ColliderShapeDesc::Sphere { radius } => Vec3::splat(*radius * 2.0), - ColliderShapeDesc::Capsule { radius, height } => { - Vec3::new(*radius * 2.0, *height, *radius * 2.0) - } - ColliderShapeDesc::StaticMesh { .. } => Vec3::ONE, - } - .max(Vec3::splat(0.001)); - - match shape_kind { - "Sphere" => ColliderShapeDesc::Sphere { - radius: dimensions.max_element() * 0.5, - }, - "Capsule" => ColliderShapeDesc::Capsule { - radius: dimensions.x.max(dimensions.z) * 0.5, - height: dimensions.y, - }, - "Static Mesh" => ColliderShapeDesc::static_mesh(renderer_meshes), - _ => ColliderShapeDesc::Cuboid { - x_length: dimensions.x, - y_length: dimensions.y, - z_length: dimensions.z, - }, - } -} - -fn dimension_drag(ui: &mut egui::Ui, label: &str, value: &mut f32) -> bool { - property_row(ui, label, |ui| { - ui.add_sized( - [fit_width(ui, 72.0, 120.0), 20.0], - egui::DragValue::new(value) - .range(0.001..=10_000.0) - .speed(0.05) - .min_decimals(2) - .max_decimals(3), - ) - .changed() - }) -} - -fn physics_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let Some(mut body) = world.get::(entity).cloned() else { - return; - }; - let _original = body.clone(); - let mut changed = false; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_PHYSICS_BODY, "Physics", icons::SPHERE), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Body", |ui| { - ui.horizontal_wrapped(|ui| { - for (label, kind) in [ - ("Static", AuthoringRigidBody::Static), - ("Kinematic", AuthoringRigidBody::Kinematic), - ("Dynamic", AuthoringRigidBody::Dynamic), - ] { - if ui.selectable_label(body.body == kind, label).clicked() { - body.body = kind; - changed = true; - } - } - }); - }); - }); - apply_component_card_response(world, entity, card_response); - if changed { - set_physics_with_history(world, entity, body); - } -} - -fn player_spawn_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - if world.get::(entity).is_none() { - return; - } - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable( - COMPONENT_PLAYER_SPAWN, - "Player Spawn", - icons::PERSON_SIMPLE_RUN, - ), - ); - let card_response = component_card(ui, &card, |ui| { - ui.label( - egui::RichText::new("Uses this actor transform as a player start.").color(TEXT_DIM), - ); - }); - apply_component_card_response(world, entity, card_response); -} - -fn weapon_spawn_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let Some(mut spawn) = world.get::(entity).cloned() else { - return; - }; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_WEAPON_SPAWN, "Weapon Spawn", icons::CROSSHAIR), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Weapon ID", |ui| { - ui.add_sized( - [text_field_width(ui), 20.0], - egui::TextEdit::singleline(&mut spawn.weapon_id), - ); - }); - }); - apply_component_card_response(world, entity, card_response); - if let Ok(mut e) = world.get_entity_mut(entity) { - e.insert(spawn); - } -} - -fn trigger_volume_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let Some(mut trigger) = world.get::(entity).cloned() else { - return; - }; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable( - COMPONENT_TRIGGER_VOLUME, - "Trigger Volume", - icons::SELECTION, - ), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Event", |ui| { - ui.add_sized( - [text_field_width(ui), 20.0], - egui::TextEdit::singleline(&mut trigger.event_name), - ); - }); - property_row(ui, "Half X", |ui| { - ui.add(egui::Slider::new(&mut trigger.half_extents.x, 0.1..=50.0)); - }); - property_row(ui, "Half Y", |ui| { - ui.add(egui::Slider::new(&mut trigger.half_extents.y, 0.1..=50.0)); - }); - property_row(ui, "Half Z", |ui| { - ui.add(egui::Slider::new(&mut trigger.half_extents.z, 0.1..=50.0)); - }); - }); - apply_component_card_response(world, entity, card_response); - if let Ok(mut e) = world.get_entity_mut(entity) { - e.insert(trigger); - } -} - -fn team_spawn_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let Some(mut spawn) = world.get::(entity).cloned() else { - return; - }; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_TEAM_SPAWN, "Team Spawn", icons::FLAG), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Team", |ui| { - ui.add(egui::Slider::new(&mut spawn.team_id, 0..=8)); - }); - }); - apply_component_card_response(world, entity, card_response); - if let Ok(mut e) = world.get_entity_mut(entity) { - e.insert(spawn); - } -} - -fn objective_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - let Some(mut marker) = world.get::(entity).cloned() else { - return; - }; - let card = component_card_context( - world, - entity, - ComponentCardOptions::removable(COMPONENT_OBJECTIVE_MARKER, "Objective", icons::TARGET), - ); - let card_response = component_card(ui, &card, |ui| { - property_row(ui, "Objective ID", |ui| { - ui.add_sized( - [text_field_width(ui), 20.0], - egui::TextEdit::singleline(&mut marker.objective_id), - ); - }); - }); - apply_component_card_response(world, entity, card_response); - if let Ok(mut e) = world.get_entity_mut(entity) { - e.insert(marker); - } -} - -fn prefab_instance_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - crate::assets::prefab_overrides::prefab_instance_inspector_ui(world, ui, entity); -} - -pub fn project_sun_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { - if world.get::(entity).is_none() { - return; - } - - let rendering = world - .resource::() - .rendering - .clone(); - let scene_override_active = has_scene_sun_override(world); - let mut create_override = false; - let mut options = ComponentCardOptions::fixed(COMPONENT_PROJECT_SUN, "Project Sun", icons::SUN); - options.resettable = false; - let card = component_card_context(world, entity, options); - let card_response = component_card(ui, &card, |ui| { - ui.label("Runtime default world lighting from assets/project.ron."); - property_row(ui, "Illuminance", |ui| { - ui.small(format!("{:.0} lux", rendering.sun_illuminance)); - }); - property_row(ui, "Ambient", |ui| { - ui.small(format!( - "{:.2}, {:.2}, {:.2} @ {:.1}", - rendering.ambient_color[0], - rendering.ambient_color[1], - rendering.ambient_color[2], - rendering.ambient_brightness - )); - }); - property_row(ui, "Shadows", |ui| { - ui.small(format!( - "{} cascades, max {:.0}m", - rendering.shadow_cascades, rendering.shadow_max_distance - )); - }); - if scene_override_active { - ui.label(egui::RichText::new("Scene sun override is active.").weak()); - } else if ui.button("Create Scene Sun Override").clicked() { - create_override = true; - } - }); - apply_component_card_response(world, entity, card_response); - - if create_override { - let sun = create_scene_sun_override_from_project_settings(world); - crate::ui::request_ui_selection(world, &[sun]); - } -} - -fn has_scene_sun_override(world: &mut World) -> bool { - world - .query_filtered::<( - &shared::LightDesc, - Option<&AuthoringComponentStates>, - Option<&InspectorOrder>, - ), With>() - .iter(world) - .any(|(light, states, legacy_order)| { - authoring_component_active(states, legacy_order, COMPONENT_LIGHT_DESC) - && matches!(light.kind, shared::AuthoringLightKind::Directional) - }) -} - -fn texture_asset_picker_ui( - world: &mut World, - ui: &mut egui::Ui, - label: &str, - value: &mut Option, - candidates: &[TextureAssetCandidate], -) -> bool { - let current_path = value.clone(); - let dragging_selection = world - .get_resource::() - .and_then(|assets| assets.dragging_selection().cloned()); - let drop_candidate = dragging_selection - .as_ref() - .and_then(|selection| texture_path_from_selection(world, selection)); - let mut selected_path: Option = None; - let mut clear = false; - let mut locate = false; - let mut accepted_drop = false; - let current_candidate = current_path.as_ref().and_then(|path| { - candidates - .iter() - .find(|candidate| candidate.path == *path) - .cloned() - }); - - property_row(ui, label, |ui| { - let control_width = ui - .available_width() - .max(MIN_INLINE_CONTROL_WIDTH.min(ui.available_width().max(1.0))); - let row_height = 30.0; - let (rect, _response) = - ui.allocate_exact_size(egui::vec2(control_width, row_height), egui::Sense::hover()); - let valid_drag = drop_candidate.is_some(); - let row_hovered = ui.rect_contains_pointer(rect); - let drop_hovered = valid_drag && row_hovered; - let stroke = if drop_hovered { - egui::Stroke::new(2.0, egui::Color32::from_rgb(125, 198, 255)) - } else if valid_drag { - egui::Stroke::new(1.0, egui::Color32::from_rgb(58, 88, 122)) - } else if row_hovered { - egui::Stroke::new(1.0, egui::Color32::from_rgb(92, 102, 118)) - } else { - egui::Stroke::new(1.0, BORDER) - }; - let fill = if drop_hovered { - egui::Color32::from_rgb(29, 57, 86) - } else if valid_drag { - WIDGET_BG.linear_multiply(0.88) - } else if row_hovered { - WIDGET_BG.linear_multiply(1.05) - } else { - WIDGET_BG.linear_multiply(0.75) - }; - ui.painter() - .rect(rect, 4.0, fill, stroke, egui::StrokeKind::Inside); - if drop_hovered { - let badge_rect = egui::Rect::from_min_size( - rect.right_top() + egui::vec2(-82.0, 4.0), - egui::vec2(74.0, 16.0), - ); - ui.painter().rect( - badge_rect, - 3.0, - egui::Color32::from_rgb(35, 95, 155), - egui::Stroke::NONE, - egui::StrokeKind::Inside, - ); - ui.painter().text( - badge_rect.center(), - egui::Align2::CENTER_CENTER, - "Drop texture", - egui::FontId::new(10.0, egui::FontFamily::Proportional), - egui::Color32::from_rgb(225, 241, 255), - ); - } - - let mut child = ui.new_child( - egui::UiBuilder::new() - .max_rect(rect.shrink2(egui::vec2(6.0, 4.0))) - .layout(egui::Layout::left_to_right(egui::Align::Center)), - ); - child.set_clip_rect(rect); - let preview_size = 22.0; - let (preview_rect, _preview_response) = - child.allocate_exact_size(egui::vec2(preview_size, preview_size), egui::Sense::hover()); - child.painter().rect( - preview_rect, - 3.0, - PANEL_BG_DARK, - egui::Stroke::new(1.0, BORDER), - egui::StrokeKind::Inside, - ); - if let Some(texture_id) = current_candidate - .as_ref() - .and_then(|candidate| candidate.texture_id) - { - let uv = egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)); - child.painter().image( - texture_id, - preview_rect.shrink(1.0), - uv, - egui::Color32::WHITE, - ); - } else { - child.painter().text( - preview_rect.center(), - egui::Align2::CENTER_CENTER, - icons::IMAGE.as_str(), - egui::FontId::new(12.0, egui::FontFamily::Name("phosphor-regular".into())), - TEXT_DIM, - ); - } - - let action_width = 92.0; - let text_width = (child.available_width() - action_width).max(1.0); - child.allocate_ui_with_layout( - egui::vec2(text_width, 22.0), - egui::Layout::left_to_right(egui::Align::Center), - |ui| { - let display_label = current_candidate - .as_ref() - .map(|candidate| candidate.label.as_str()) - .or(current_path.as_deref()) - .unwrap_or("(none)"); - ui.add_sized( - [text_width, 20.0], - egui::Label::new(egui::RichText::new(display_label).color( - if current_path.is_some() { - TEXT_DIM.linear_multiply(1.45) - } else { - TEXT_DIM - }, - )) - .truncate(), - ); - }, - ); - - child.allocate_ui_with_layout( - egui::vec2(action_width, 28.0), - egui::Layout::right_to_left(egui::Align::Center), - |ui| { - let clear_response = ui.add_enabled( - current_path.is_some(), - egui::Button::new(phosphor_icon(icons::X, 16.0)) - .frame(false) - .min_size(egui::vec2(22.0, 22.0)), - ); - if clear_response.on_hover_text("Clear texture").clicked() { - clear = true; - } - let locate_response = ui.add_enabled( - current_path.is_some(), - egui::Button::new(phosphor_icon(icons::CROSSHAIR, 16.0)) - .frame(false) - .min_size(egui::vec2(22.0, 22.0)), - ); - if locate_response - .on_hover_text("Locate in content browser") - .clicked() - { - locate = true; - } - if candidates.is_empty() { - ui.add_enabled( - false, - egui::Button::new(phosphor_icon(icons::FOLDER_OPEN, 16.0)) - .frame(false) - .min_size(egui::vec2(22.0, 22.0)), - ) - .on_hover_text("No texture assets available"); - } else { - let menu = ui.menu_button(phosphor_icon(icons::FOLDER_OPEN, 16.0), |ui| { - ui.set_min_width(240.0); - for candidate in candidates { - let selected = current_path.as_deref() == Some(candidate.path.as_str()); - if ui - .selectable_label(selected, candidate.label.as_str()) - .on_hover_text(candidate.path.as_str()) - .clicked() - { - selected_path = Some(candidate.path.clone()); - ui.close(); - } - } - }); - menu.response.on_hover_text("Browse textures"); - } - }, - ); - - if drop_hovered && ui.input(|input| input.pointer.any_released()) { - if let Some(candidate) = drop_candidate.as_ref() { - selected_path = Some(candidate.path.clone()); - accepted_drop = true; - } - } - }); - - if locate { - locate_texture_asset(world, current_path.as_deref(), candidates); - } - if accepted_drop { - if let Some(mut assets) = world.get_resource_mut::() { - assets.clear_drag(); - } - } - if clear { - *value = None; - return current_path.is_some(); - } - if let Some(path) = selected_path { - let changed = current_path.as_deref() != Some(path.as_str()); - *value = Some(path); - return changed; - } - - false -} - -fn locate_texture_asset( - world: &mut World, - path: Option<&str>, - candidates: &[TextureAssetCandidate], -) { - let Some(path) = path else { - return; - }; - let Some(candidate) = candidates.iter().find(|candidate| candidate.path == path) else { - if let Some(mut scene_io) = world.get_resource_mut::() { - scene_io.status = format!("Could not locate texture {path}"); - } - return; - }; - - reveal_asset_in_browser(world, &candidate.folder_path, &candidate.selection); -} - -fn option_string_ui(ui: &mut egui::Ui, label: &str, value: &mut Option) -> bool { - let mut text = value.clone().unwrap_or_default(); - let before = text.clone(); - property_row(ui, label, |ui| { - ui.horizontal_wrapped(|ui| { - let clear_width = 52.0; - let field_width = (ui.available_width() - clear_width - ui.spacing().item_spacing.x) - .max(MIN_INLINE_CONTROL_WIDTH.min(ui.available_width().max(1.0))) - .min(TEXT_FIELD_MAX_WIDTH) - .min(ui.available_width().max(1.0)); - ui.add_sized([field_width, 20.0], egui::TextEdit::singleline(&mut text)); - if ui.button("Clear").clicked() { - text.clear(); - } - }); - }); - let changed = before != text; - *value = if text.trim().is_empty() { - None - } else { - Some(text) - }; - changed -} +#[path = "inspector/asset_selectors.rs"] +mod asset_selectors; +#[path = "inspector/brush_terrain.rs"] +mod brush_terrain; +#[path = "inspector/component_add.rs"] +mod component_add; +#[path = "inspector/component_chrome.rs"] +mod component_chrome; +#[path = "inspector/component_lifecycle.rs"] +mod component_lifecycle; +#[path = "inspector/dispatch.rs"] +mod dispatch; +#[path = "inspector/imported_material_preview.rs"] +mod imported_material_preview; +#[path = "inspector/material_slots.rs"] +mod material_slots; +#[path = "inspector/mesh_renderers.rs"] +mod mesh_renderers; +#[path = "inspector/primitive_domains.rs"] +mod primitive_domains; +#[path = "inspector/property_blocks.rs"] +mod property_blocks; +#[path = "inspector/renderer_panel.rs"] +mod renderer_panel; +#[path = "inspector/sun_textures.rs"] +mod sun_textures; + +use asset_selectors::*; +use brush_terrain::*; +use component_add::*; +use component_chrome::*; +pub(crate) use component_chrome::{component_card, property_row, text_field_width}; +pub(crate) use component_lifecycle::apply_component_card_response; +use component_lifecycle::*; +pub use dispatch::authoring_inspector_ui; +pub(crate) use dispatch::{add_component_footer, register_builtin_component_inspectors}; +use material_slots::*; +use mesh_renderers::*; +use primitive_domains::*; +pub(crate) use property_blocks::property_block_promotion_review_ui; +use property_blocks::*; +use renderer_panel::*; +use sun_textures::*; #[cfg(test)] -mod collider_inspector_tests { +mod tests { use super::*; - use crate::history::{apply_command_undo, EditorHistory}; - use crate::ui::{DockTabRequest, UiState}; - - #[test] - fn component_collapse_persists_while_ui_state_is_scoped_out() { - let mut world = World::new(); - world.init_resource::(); - world.init_resource::(); - let entity = world - .spawn((ActorId::new("collapsed-component"), Transform::IDENTITY)) - .id(); - world.insert_resource(UiState::default_layout()); - - world.resource_scope::(|world, _ui_state| { - assert!(!world.contains_resource::()); - apply_component_card_response( - world, - entity, - ComponentCardResponse { - type_name: COMPONENT_TRANSFORM, - collapsed: Some(true), - ..Default::default() - }, - ); - let context = component_card_context( - world, - entity, - ComponentCardOptions::fixed(COMPONENT_TRANSFORM, "Transform", icons::CUBE), - ); - assert!(context.collapsed); - }); - } - - #[test] - fn locate_texture_requests_asset_browser_while_ui_state_is_scoped_out() { - let path = "assets/textures/scoped-locate.png"; - let folder = "assets/textures"; - let selection = AssetSelection::File(path.to_string()); - let mut world = World::new(); - world.insert_resource(EditorAssets { - folders: Vec::new(), - assets: vec![EditorAsset { - label: "Scoped Locate".into(), - path: Some(path.into()), - folder_path: folder.into(), - kind: EditorAssetKind::Texture, - }], - current_folder: crate::assets::ASSETS_ROOT.into(), - selected: None, - dragging: None, - status: String::new(), - }); - world.init_resource::(); - world.insert_resource(UiState::default_layout()); - let candidate = TextureAssetCandidate { - label: "Scoped Locate".into(), - path: path.into(), - folder_path: folder.into(), - selection: selection.clone(), - texture_id: None, - }; - - world.resource_scope::(|world, _ui_state| { - assert!(!world.contains_resource::()); - locate_texture_asset(world, Some(path), &[candidate]); - }); - - let assets = world.resource::(); - assert_eq!(assets.current_folder, folder); - assert_eq!(assets.selected.as_ref(), Some(&selection)); - assert_eq!( - world.resource::().0, - Some(EditorTab::AssetBrowser) - ); - } - - #[test] - fn shape_switch_preserves_dimensions_and_is_one_undoable_edit() { - let mut world = World::new(); - world.init_resource::(); - let original = ColliderDesc::static_cuboid(Vec3::new(2.0, 4.0, 6.0)); - let entity = world.spawn((LevelObject, original.clone())).id(); - - let sphere = ColliderDesc { - shape: convert_collider_shape(&original.shape, "Sphere", Vec::new()), - ..original.clone() - }; - assert_eq!(sphere.shape, ColliderShapeDesc::Sphere { radius: 3.0 }); - - set_collider_with_history(&mut world, entity, sphere.clone()); - assert_eq!(world.resource::().undo_depth(), 1); - assert_eq!(world.get::(entity), Some(&sphere)); - - apply_command_undo(&mut world); - assert_eq!(world.get::(entity), Some(&original)); - } + include!("inspector/tests/a.rs"); + include!("inspector/tests/b.rs"); } diff --git a/crates/editor/src/ui/inspector/asset_selectors.rs b/crates/editor/src/ui/inspector/asset_selectors.rs new file mode 100644 index 0000000..5c2f61b --- /dev/null +++ b/crates/editor/src/ui/inspector/asset_selectors.rs @@ -0,0 +1,544 @@ +use super::*; + +pub(super) fn static_mesh_asset_ref_candidates( + world: &mut World, + kind: AssetRefCandidateKind, +) -> Vec { + let mesh_thumbnails = mesh_thumbnail_texture_by_asset_ref(world); + let Some(registry) = world.get_resource::() else { + return Vec::new(); + }; + let catalog = world.get_resource::(); + let mut seen = HashSet::new(); + let mut candidates = Vec::new(); + + for record in ®istry.records { + let Some(settings) = record.import_settings.model() else { + continue; + }; + let Some(manifest_path) = settings.static_mesh_manifest_path.as_deref() else { + continue; + }; + let Ok(manifest) = load_static_mesh_manifest(manifest_path) else { + continue; + }; + let selection = AssetSelection::File(manifest.source.path.clone()); + let folder_path = catalog + .and_then(|assets| { + assets + .assets + .iter() + .find(|asset| asset.path.as_deref() == Some(manifest.source.path.as_str())) + .map(|asset| asset.folder_path.clone()) + }) + .unwrap_or_else(|| fallback_asset_folder(&manifest.source.path)); + + for part in &manifest.parts { + let source_material_ref = source_material_ref_for_part(&manifest.asset_id, part); + let candidate = match kind { + AssetRefCandidateKind::Mesh => { + let sub_asset_id = if part.id.trim().is_empty() { + part_id_from_label(&part.mesh_label) + } else { + part.id.clone() + }; + AssetRefCandidate { + reference: EditorAssetRef::new( + manifest.asset_id.clone(), + sub_asset_id.clone(), + part.name.clone(), + ), + label: part.name.clone(), + detail: format!("{} | {}", manifest.label, manifest.source.path), + selection: selection.clone(), + folder_path: folder_path.clone(), + texture_id: mesh_thumbnails + .get(&(manifest.asset_id.clone(), sub_asset_id.clone())) + .copied(), + } + } + AssetRefCandidateKind::Material => { + let Some(material_ref) = source_material_ref else { + continue; + }; + AssetRefCandidate { + reference: material_ref, + label: part.material_slot_name.clone(), + detail: format!("{} | {}", manifest.label, manifest.source.path), + selection: selection.clone(), + folder_path: folder_path.clone(), + texture_id: None, + } + } + AssetRefCandidateKind::Texture => continue, + }; + + let key = ( + candidate.reference.asset_id.clone(), + candidate.reference.sub_asset_id.clone(), + ); + if seen.insert(key) { + candidates.push(candidate); + } + } + } + + candidates.sort_by(|a, b| a.detail.cmp(&b.detail).then(a.label.cmp(&b.label))); + candidates +} + +pub(super) fn texture_asset_candidates(world: &World) -> Vec { + let Some(catalog) = world.get_resource::() else { + return Vec::new(); + }; + let snapshot = world + .get_resource::() + .map(AssetThumbnailCache::snapshot); + let mut candidates: Vec<_> = catalog + .assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) + .filter_map(|asset| { + let path = asset.path.clone()?; + let texture_id = snapshot + .as_ref() + .and_then(|snapshot| snapshot.texture_for(asset)); + Some(TextureAssetCandidate { + label: asset.label.clone(), + path: path.clone(), + folder_path: asset.folder_path.clone(), + selection: AssetSelection::File(path), + texture_id, + }) + }) + .collect(); + candidates.sort_by(|a, b| a.label.cmp(&b.label).then(a.path.cmp(&b.path))); + candidates +} + +pub(super) fn texture_asset_ref_candidates(world: &World) -> Vec { + let Some(catalog) = world.get_resource::() else { + return Vec::new(); + }; + let Some(registry) = world.get_resource::() else { + return Vec::new(); + }; + let snapshot = world + .get_resource::() + .map(AssetThumbnailCache::snapshot); + let mut candidates: Vec<_> = catalog + .assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) + .filter_map(|asset| { + let path = asset.path.as_deref()?; + let record = find_asset_by_path(registry, path)?; + Some(AssetRefCandidate { + reference: EditorAssetRef::new( + record.id.as_string(), + "texture:source", + asset.label.clone(), + ) + .with_source_path(path), + label: asset.label.clone(), + detail: path.to_string(), + selection: AssetSelection::File(path.to_string()), + folder_path: asset.folder_path.clone(), + texture_id: snapshot + .as_ref() + .and_then(|snapshot| snapshot.texture_for(asset)), + }) + }) + .collect(); + candidates.sort_by(|a, b| a.label.cmp(&b.label).then(a.detail.cmp(&b.detail))); + candidates +} + +pub(super) fn brush_face_material_ref_candidates(world: &mut World) -> Vec { + let mut candidates = static_mesh_asset_ref_candidates(world, AssetRefCandidateKind::Material); + let material_assets = world + .get_resource::() + .map(|catalog| { + catalog + .assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::Material)) + .cloned() + .collect::>() + }) + .unwrap_or_default(); + prefetch_asset_thumbnails(world, &material_assets); + let thumbnail_snapshot = world + .get_resource::() + .map(AssetThumbnailCache::snapshot); + let Some(registry) = world.get_resource::() else { + return candidates; + }; + let mut seen: HashSet<_> = candidates + .iter() + .map(|candidate| { + ( + candidate.reference.asset_id.clone(), + candidate.reference.sub_asset_id.clone(), + ) + }) + .collect(); + for asset in &material_assets { + let Some(path) = asset.path.as_deref() else { + continue; + }; + let Some(record) = find_asset_by_path(registry, path) else { + continue; + }; + let sub_asset_id = if shared::MaterialInstanceAsset::load_from_path(path).is_ok() { + "material:instance" + } else { + "material:source" + }; + let reference = EditorAssetRef::new(record.id.as_string(), sub_asset_id, &asset.label) + .with_source_path(path); + let key = (reference.asset_id.clone(), reference.sub_asset_id.clone()); + if !seen.insert(key) { + continue; + } + candidates.push(AssetRefCandidate { + reference, + label: asset.label.clone(), + detail: path.to_string(), + selection: AssetSelection::File(path.to_string()), + folder_path: asset.folder_path.clone(), + texture_id: thumbnail_snapshot + .as_ref() + .and_then(|snapshot| snapshot.texture_for(asset)), + }); + } + candidates.sort_by(|a, b| a.label.cmp(&b.label).then(a.detail.cmp(&b.detail))); + candidates +} + +pub(super) fn asset_ref_candidate_from_selection( + world: &World, + selection: &AssetSelection, + kind: AssetRefCandidateKind, +) -> Option { + let registry = world.get_resource::()?; + match (kind, selection) { + (AssetRefCandidateKind::Material, AssetSelection::File(path)) => { + let asset = world + .get_resource::()? + .assets + .iter() + .find(|asset| { + matches!(asset.kind, EditorAssetKind::Material) + && asset.path.as_deref() == Some(path.as_str()) + })?; + let record = find_asset_by_path(registry, path)?; + let sub_asset_id = if shared::MaterialInstanceAsset::load_from_path(path).is_ok() { + "material:instance" + } else { + "material:source" + }; + Some(AssetRefCandidate { + reference: EditorAssetRef::new( + record.id.as_string(), + sub_asset_id, + asset.label.clone(), + ) + .with_source_path(path), + label: asset.label.clone(), + detail: path.clone(), + selection: selection.clone(), + folder_path: asset.folder_path.clone(), + texture_id: None, + }) + } + (AssetRefCandidateKind::Texture, AssetSelection::File(path)) => { + let asset = world + .get_resource::()? + .assets + .iter() + .find(|asset| { + matches!(asset.kind, EditorAssetKind::Texture) + && asset.path.as_deref() == Some(path.as_str()) + })?; + let record = find_asset_by_path(registry, path)?; + Some(AssetRefCandidate { + reference: EditorAssetRef::new( + record.id.as_string(), + "texture:source", + asset.label.clone(), + ) + .with_source_path(path), + label: asset.label.clone(), + detail: path.clone(), + selection: selection.clone(), + folder_path: asset.folder_path.clone(), + texture_id: None, + }) + } + ( + AssetRefCandidateKind::Material, + AssetSelection::SubAsset { + parent_path, + sub_asset_id, + label, + kind: AssetSubAssetKind::Material, + .. + }, + ) => { + let record = find_asset_by_path(registry, parent_path)?; + Some(AssetRefCandidate { + reference: EditorAssetRef::new( + record.id.as_string(), + sub_asset_id.clone(), + label.clone(), + ), + label: label.clone(), + detail: parent_path.clone(), + selection: selection.clone(), + folder_path: fallback_asset_folder(parent_path), + texture_id: None, + }) + } + ( + AssetRefCandidateKind::Texture, + AssetSelection::SubAsset { + parent_path, + sub_asset_id, + label, + kind: AssetSubAssetKind::Texture, + source_path, + }, + ) => { + let record = find_asset_by_path(registry, parent_path)?; + Some(AssetRefCandidate { + reference: EditorAssetRef::new( + record.id.as_string(), + sub_asset_id.clone(), + label.clone(), + ) + .with_source_path(source_path.clone().unwrap_or_else(|| parent_path.clone())), + label: label.clone(), + detail: source_path.clone().unwrap_or_else(|| parent_path.clone()), + selection: selection.clone(), + folder_path: fallback_asset_folder(parent_path), + texture_id: None, + }) + } + _ => None, + } +} + +pub(super) fn request_texture_asset_thumbnails(world: &mut World) { + let requests: Vec<_> = world + .get_resource::() + .map(|assets| { + assets + .assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) + .filter_map(|asset| Some((asset_cache_key(asset), asset.path.clone()?))) + .collect() + }) + .unwrap_or_default(); + if requests.is_empty() || world.get_resource::().is_none() { + return; + } + let asset_server = world.resource::().clone(); + world.resource_scope(|_world, mut cache: Mut| { + for (key, path) in requests { + cache.request_texture(key, path, &asset_server); + } + }); +} + +pub(super) fn texture_path_from_selection( + world: &World, + selection: &AssetSelection, +) -> Option { + match selection { + AssetSelection::File(path) => { + let asset = world + .get_resource::()? + .assets + .iter() + .find(|asset| { + matches!(asset.kind, EditorAssetKind::Texture) + && asset.path.as_deref() == Some(path.as_str()) + })?; + Some(TextureAssetCandidate { + label: asset.label.clone(), + path: path.clone(), + folder_path: asset.folder_path.clone(), + selection: selection.clone(), + texture_id: None, + }) + } + AssetSelection::SubAsset { + label, + kind: AssetSubAssetKind::Texture, + source_path: Some(path), + .. + } => { + if let Some(asset) = world.get_resource::().and_then(|assets| { + assets + .assets + .iter() + .find(|asset| asset.path.as_deref() == Some(path.as_str())) + }) { + return Some(TextureAssetCandidate { + label: asset.label.clone(), + path: path.clone(), + folder_path: asset.folder_path.clone(), + selection: selection.clone(), + texture_id: None, + }); + } + Some(TextureAssetCandidate { + label: label.clone(), + path: path.clone(), + folder_path: fallback_asset_folder(path), + selection: selection.clone(), + texture_id: None, + }) + } + _ => None, + } +} + +pub(super) fn source_material_ref_for_part( + asset_id: &str, + part: &crate::assets::static_mesh::StaticMeshPart, +) -> Option { + let material_label = part.material_label.as_deref()?; + let sub_asset_id = part + .material_id + .clone() + .filter(|id| !id.trim().is_empty()) + .unwrap_or_else(|| material_id_from_label(material_label)); + Some(EditorAssetRef::new( + asset_id.to_string(), + sub_asset_id, + part.material_slot_name.clone(), + )) +} + +pub(super) fn mesh_thumbnail_texture_by_asset_ref( + world: &mut World, +) -> HashMap<(String, String), egui::TextureId> { + let requests = world + .get_resource::() + .map(|registry| { + registry + .records + .iter() + .filter_map(|record| { + let manifest_path = record + .import_settings + .model()? + .static_mesh_manifest_path + .as_deref()?; + load_static_mesh_manifest(manifest_path).ok() + }) + .flat_map(|manifest| { + let legacy_skinned = if manifest.schema_version < 2 { + crate::assets::gltf_skinned_primitive_labels(&manifest.source.path) + } else { + HashSet::new() + }; + manifest.parts.into_iter().map(move |part| { + let sub_asset_id = if part.id.trim().is_empty() { + part_id_from_label(&part.mesh_label) + } else { + part.id.clone() + }; + let key = + format!("subasset:{}#mesh:{}", manifest.source.path, sub_asset_id); + let requires_scene_instance = manifest.metadata.animation_count > 0 + || part.skinned + || legacy_skinned.contains(&part.mesh_label); + ( + manifest.asset_id.clone(), + sub_asset_id, + key, + manifest.source.path.clone(), + part.mesh_label, + part.material_label, + requires_scene_instance, + ) + }) + }) + .collect::>() + }) + .unwrap_or_default(); + if requests.is_empty() || world.get_resource::().is_none() { + return HashMap::new(); + } + world.resource_scope(|world, mut cache: Mut| { + if let Some(mut studio) = world.get_resource_mut::() { + for (_, _, key, path, mesh_label, material_label, requires_scene) in &requests { + cache.request_mesh_subasset( + key.clone(), + path.clone(), + mesh_label.clone(), + material_label.clone(), + *requires_scene, + &mut studio, + ); + } + } + }); + let snapshot = world.resource::().snapshot(); + requests + .into_iter() + .filter_map(|(asset_id, sub_asset_id, key, ..)| { + snapshot + .texture_ids + .get(&key) + .copied() + .map(|texture| ((asset_id, sub_asset_id), texture)) + }) + .collect() +} + +pub(super) fn fallback_asset_folder(path: &str) -> String { + Path::new(path) + .parent() + .and_then(|parent| parent.to_str()) + .filter(|folder| !folder.trim().is_empty()) + .unwrap_or(crate::assets::ASSETS_ROOT) + .replace('\\', "/") +} + +pub(super) fn locate_asset_ref( + world: &mut World, + asset: Option<&EditorAssetRef>, + candidates: &[AssetRefCandidate], +) { + let Some(asset) = asset.filter(|asset| asset.is_resolved()) else { + return; + }; + let Some(candidate) = candidates.iter().find(|candidate| { + candidate.reference.asset_id == asset.asset_id + && candidate.reference.sub_asset_id == asset.sub_asset_id + }) else { + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = format!("Could not locate imported asset {}", asset.label); + } + return; + }; + + reveal_asset_in_browser(world, &candidate.folder_path, &candidate.selection); +} + +pub(super) fn reveal_asset_in_browser( + world: &mut World, + folder_path: &str, + selection: &AssetSelection, +) { + if let Some(mut assets) = world.get_resource_mut::() { + assets.current_folder = folder_path.to_string(); + assets.select(selection.clone()); + } + crate::ui::request_editor_tab(world, EditorTab::AssetBrowser); +} diff --git a/crates/editor/src/ui/inspector/brush_terrain.rs b/crates/editor/src/ui/inspector/brush_terrain.rs new file mode 100644 index 0000000..54df14a --- /dev/null +++ b/crates/editor/src/ui/inspector/brush_terrain.rs @@ -0,0 +1,578 @@ +use super::*; + +pub(super) fn brush_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let material_candidates = brush_face_material_ref_candidates(world); + request_texture_asset_thumbnails(world); + let texture_candidates = texture_asset_ref_candidates(world); + let Some(mut brush) = world.get::(entity).cloned() else { + return; + }; + let original = brush.clone(); + let mut changed = false; + let mut reset_cube = false; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_BRUSH_DESC, "Brush", icons::CUBE), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Kind", |ui| { + egui::ComboBox::from_id_salt("brush_kind") + .selected_text(match brush.kind { + BrushKind::Additive => "Additive", + BrushKind::SubtractiveMarker => "Subtractive Marker", + }) + .show_ui(ui, |ui| { + changed |= ui + .selectable_value(&mut brush.kind, BrushKind::Additive, "Additive") + .changed(); + changed |= ui + .selectable_value( + &mut brush.kind, + BrushKind::SubtractiveMarker, + "Subtractive Marker", + ) + .changed(); + }); + }); + property_row(ui, "Faces", |ui| { + ui.label(format!("{}", brush.faces.len())); + }); + property_row(ui, "Shadows", |ui| { + ui.horizontal_wrapped(|ui| { + changed |= ui.checkbox(&mut brush.cast_shadows, "Cast").changed(); + changed |= ui.checkbox(&mut brush.receive_shadows, "Receive").changed(); + }); + }); + brush_validation_ui(ui, &brush); + changed |= selected_brush_face_controls( + world, + ui, + entity, + &mut brush, + &material_candidates, + &texture_candidates, + ); + if ui.button("Reset Cube Brush").clicked() { + reset_cube = true; + } + }); + apply_component_card_response(world, entity, card_response); + + if reset_cube { + brush = BrushDesc::default(); + changed = true; + } + if changed && brush != original { + set_brush_with_history(world, entity, brush); + } +} + +pub(super) fn terrain_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let material_candidates = brush_face_material_ref_candidates(world); + let dragging_selection = world + .get_resource::() + .and_then(|assets| assets.dragging_selection().cloned()); + let material_drop_candidate = dragging_selection.as_ref().and_then(|selection| { + asset_ref_candidate_from_selection(world, selection, AssetRefCandidateKind::Material) + }); + let Some(mut terrain) = world.get::(entity).cloned() else { + return; + }; + let original = terrain.clone(); + let mut changed = false; + let mut requested_resolution = terrain.resolution; + let mut remove_layer = None; + let mut swap_layers = None; + let mut locate_layer = None; + let mut accepted_drop = false; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_TERRAIN_DESC, "Terrain", icons::MOUNTAINS), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Grid", |ui| { + ui.horizontal(|ui| { + ui.add( + egui::DragValue::new(&mut requested_resolution) + .range(2..=1025) + .suffix(" samples"), + ); + if ui + .add_enabled( + requested_resolution != terrain.resolution, + egui::Button::new("Resize Flat"), + ) + .on_hover_text("Replaces the current height grid with a flat grid") + .clicked() + { + let replacement = TerrainDesc::flat(requested_resolution); + terrain.resolution = replacement.resolution; + terrain.heights = replacement.heights; + terrain.material_weights.clear(); + terrain.chunk_quads = terrain.chunk_quads.min(terrain.resolution - 1).max(1); + changed = true; + } + }); + }); + property_row(ui, "Sample Spacing", |ui| { + changed |= ui + .add( + egui::DragValue::new(&mut terrain.sample_spacing) + .range(0.01..=1000.0) + .speed(0.1) + .suffix(" m"), + ) + .changed(); + }); + property_row(ui, "Height Scale", |ui| { + changed |= ui + .add( + egui::DragValue::new(&mut terrain.height_scale) + .range(0.01..=10000.0) + .speed(0.1) + .suffix(" m"), + ) + .changed(); + }); + property_row(ui, "Chunk Size", |ui| { + changed |= ui + .add( + egui::DragValue::new(&mut terrain.chunk_quads) + .range(1..=terrain.resolution.saturating_sub(1)) + .suffix(" quads"), + ) + .changed(); + }); + property_row(ui, "Collision", |ui| { + changed |= ui + .checkbox(&mut terrain.generate_colliders, "Generate") + .changed(); + }); + property_row(ui, "Shadows", |ui| { + ui.horizontal_wrapped(|ui| { + changed |= ui.checkbox(&mut terrain.cast_shadows, "Cast").changed(); + changed |= ui + .checkbox(&mut terrain.receive_shadows, "Receive") + .changed(); + }); + }); + ui.add_space(6.0); + ui.separator(); + ui.horizontal(|ui| { + ui.label(egui::RichText::new("Material Layers").strong()); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if ui + .add_enabled( + terrain.material_layers.len() < shared::TERRAIN_MATERIAL_LAYER_LIMIT, + egui::Button::new(phosphor_icon(icons::PLUS, 16.0)), + ) + .on_hover_text("Add a terrain blend channel") + .clicked() + { + let material = if terrain.material_layers.is_empty() { + terrain.base_material.take() + } else { + None + }; + terrain.material_layers.push(shared::TerrainMaterialLayer { + material, + ..Default::default() + }); + changed = true; + } + }); + }); + if terrain.material_layers.is_empty() { + ui.label( + egui::RichText::new( + terrain + .base_material + .as_ref() + .map(|material| format!("Legacy base: {}", material.label)) + .unwrap_or_else(|| "No layers assigned; visible terrain fallback".into()), + ) + .color(TEXT_DIM) + .small(), + ); + } + for index in 0..terrain.material_layers.len() { + ui.add_space(4.0); + ui.horizontal(|ui| { + ui.label( + egui::RichText::new(format!("Layer {}", index + 1)) + .strong() + .color(if index == 0 { + SELECTION_BG_MUTED + } else { + TEXT_DIM + }), + ); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if icon_button_small(ui, icons::TRASH, "Remove layer").clicked() { + remove_layer = Some(index); + } + if ui + .add_enabled( + index + 1 < terrain.material_layers.len(), + egui::Button::new(phosphor_icon(icons::ARROW_DOWN, 15.0)).frame(false), + ) + .on_hover_text("Move layer down") + .clicked() + { + swap_layers = Some((index, index + 1)); + } + if ui + .add_enabled( + index > 0, + egui::Button::new(phosphor_icon(icons::ARROW_UP, 15.0)).frame(false), + ) + .on_hover_text("Move layer up") + .clicked() + { + swap_layers = Some((index, index - 1)); + } + }); + }); + let response = asset_selector_row( + ui, + "Material", + icons::PALETTE, + terrain.material_layers[index].material.as_ref(), + None, + true, + &material_candidates, + material_drop_candidate.as_ref(), + None, + AssetSelectorActions::Full, + ); + if let Some(selected) = response.selected { + terrain.material_layers[index].material = Some(selected); + changed = true; + } + if response.clear { + terrain.material_layers[index].material = None; + changed = true; + } + if response.locate { + locate_layer = Some(index); + } + accepted_drop |= response.accepted_drop; + property_row(ui, "UV Tiling", |ui| { + changed |= ui + .add( + egui::DragValue::new(&mut terrain.material_layers[index].uv_scale) + .range(0.01..=1024.0) + .speed(0.1) + .suffix("×"), + ) + .changed(); + }); + if !terrain.material_weights.is_empty() { + let covered = terrain + .material_weights + .iter() + .filter(|weights| weights[index] > 0) + .count(); + ui.label( + egui::RichText::new(format!( + "{} / {} samples carry this layer", + covered, + terrain.material_weights.len() + )) + .color(TEXT_DIM) + .small(), + ); + } + } + match terrain.validate() { + Ok(()) => { + ui.label( + egui::RichText::new(format!( + "{} heights • {}×{} chunks", + terrain.heights.len(), + (terrain.resolution - 1).div_ceil(terrain.chunk_quads), + (terrain.resolution - 1).div_ceil(terrain.chunk_quads) + )) + .color(crate::ui::theme::SUCCESS), + ); + } + Err(error) => { + ui.label(egui::RichText::new(error).color(crate::ui::theme::ERROR)); + } + } + }); + apply_component_card_response(world, entity, card_response); + + if let Some(index) = remove_layer { + remove_terrain_material_layer(&mut terrain, index); + changed = true; + } + if let Some((a, b)) = swap_layers { + terrain.material_layers.swap(a, b); + for weights in &mut terrain.material_weights { + weights.swap(a, b); + } + changed = true; + } + if let Some(index) = locate_layer { + locate_asset_ref( + world, + terrain + .material_layers + .get(index) + .and_then(|layer| layer.material.as_ref()), + &material_candidates, + ); + } + if accepted_drop { + clear_asset_drag(world); + } + + if changed && terrain != original { + let _ = reflected_component_transaction( + world, + entity, + "Edit Terrain", + shared::AUTHORING_COMPONENT_TERRAIN, + COMPONENT_TERRAIN_DESC, + move |world, entity| { + world.entity_mut(entity).insert(terrain); + Ok(()) + }, + ); + } +} + +pub(super) fn remove_terrain_material_layer(terrain: &mut TerrainDesc, index: usize) { + if index >= terrain.material_layers.len() { + return; + } + terrain.material_layers.remove(index); + if terrain.material_layers.is_empty() { + terrain.material_weights.clear(); + return; + } + for weights in &mut terrain.material_weights { + for channel in index..3 { + weights[channel] = weights[channel + 1]; + } + weights[3] = 0; + normalize_terrain_weights(weights, terrain.material_layers.len()); + } +} + +pub(super) fn normalize_terrain_weights(weights: &mut [u8; 4], layer_count: usize) { + for weight in weights.iter_mut().skip(layer_count) { + *weight = 0; + } + let sum: u16 = weights + .iter() + .take(layer_count) + .copied() + .map(u16::from) + .sum(); + if sum == 0 { + *weights = [255, 0, 0, 0]; + return; + } + let source = *weights; + let mut assigned = 0_u16; + for index in 0..layer_count { + weights[index] = ((u16::from(source[index]) * 255) / sum) as u8; + assigned += u16::from(weights[index]); + } + let largest = (0..layer_count) + .max_by_key(|index| source[*index]) + .unwrap_or(0); + weights[largest] = weights[largest].saturating_add((255 - assigned) as u8); +} + +pub(super) fn brush_validation_ui(ui: &mut egui::Ui, brush: &BrushDesc) { + let report = validate_brush(brush); + if report.diagnostics.is_empty() { + return; + } + + ui.add_space(6.0); + egui::Frame::new() + .fill(egui::Color32::from_rgb(31, 32, 36)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) + .inner_margin(egui::Margin::symmetric(8, 6)) + .show(ui, |ui| { + let has_errors = !report.is_valid(); + let title_color = if has_errors { + egui::Color32::from_rgb(255, 137, 129) + } else { + egui::Color32::from_rgb(255, 190, 110) + }; + ui.horizontal(|ui| { + let icon = if has_errors { + icons::WARNING + } else { + icons::INFO + }; + ui.label(phosphor_icon(icon, 14.0).color(title_color)); + ui.label( + egui::RichText::new(if has_errors { + "Brush geometry needs repair" + } else { + "Brush diagnostics" + }) + .color(title_color), + ); + }); + for diagnostic in report.diagnostics.iter().take(4) { + let color = match diagnostic.severity { + BrushDiagnosticSeverity::Error => egui::Color32::from_rgb(255, 137, 129), + BrushDiagnosticSeverity::Warning => egui::Color32::from_rgb(255, 190, 110), + }; + let face = diagnostic + .face + .as_ref() + .filter(|face| !face.is_empty()) + .map(|face| format!("{}: ", face.0)) + .unwrap_or_default(); + ui.label(egui::RichText::new(format!("{face}{}", diagnostic.message)).color(color)); + } + let hidden_count = report.diagnostics.len().saturating_sub(4); + if hidden_count > 0 { + ui.label(egui::RichText::new(format!("+{hidden_count} more")).color(TEXT_MUTED)); + } + }); +} + +pub(super) fn selected_brush_face_controls( + world: &mut World, + ui: &mut egui::Ui, + entity: Entity, + brush: &mut BrushDesc, + material_candidates: &[AssetRefCandidate], + texture_candidates: &[AssetRefCandidate], +) -> bool { + let Some(selection) = world.get_resource::() else { + return false; + }; + if selection.brush != Some(entity) { + return false; + } + let selected_faces: Vec<_> = selection + .elements + .iter() + .filter_map(|element| match element { + BrushElementKey::Face { face } => Some(face.clone()), + _ => None, + }) + .collect(); + if selected_faces.is_empty() { + return false; + } + + let dragging_selection = world + .get_resource::() + .and_then(|assets| assets.dragging_selection().cloned()); + let material_drop_candidate = dragging_selection.as_ref().and_then(|selection| { + asset_ref_candidate_from_selection(world, selection, AssetRefCandidateKind::Material) + }); + let texture_drop_candidate = dragging_selection.as_ref().and_then(|selection| { + asset_ref_candidate_from_selection(world, selection, AssetRefCandidateKind::Texture) + }); + let mut changed = false; + ui.add_space(6.0); + ui.separator(); + ui.label( + egui::RichText::new(format!("{} selected face(s)", selected_faces.len())).color(TEXT_DIM), + ); + + for face_id in selected_faces { + let Some(face) = brush.faces.iter_mut().find(|face| face.id == face_id) else { + continue; + }; + let label = if face.id.0.trim().is_empty() { + "Face".to_string() + } else { + face.id.0.clone() + }; + egui::CollapsingHeader::new(label) + .default_open(true) + .show(ui, |ui| { + property_row(ui, "UV offset", |ui| { + changed |= ui + .add(egui::DragValue::new(&mut face.uv_offset.x).speed(0.05)) + .changed(); + changed |= ui + .add(egui::DragValue::new(&mut face.uv_offset.y).speed(0.05)) + .changed(); + }); + property_row(ui, "UV scale", |ui| { + changed |= ui + .add(egui::DragValue::new(&mut face.uv_scale.x).speed(0.05)) + .changed(); + changed |= ui + .add(egui::DragValue::new(&mut face.uv_scale.y).speed(0.05)) + .changed(); + }); + property_row(ui, "UV rotation", |ui| { + changed |= ui + .add(egui::DragValue::new(&mut face.uv_rotation).speed(1.0)) + .changed(); + }); + let material_response = asset_selector_row( + ui, + "Material", + icons::PALETTE, + face.material.as_ref(), + None, + true, + material_candidates, + material_drop_candidate.as_ref(), + None, + AssetSelectorActions::Full, + ); + if let Some(selected) = material_response.selected { + face.material = Some(selected); + changed = true; + } + if material_response.clear { + face.material = None; + changed = true; + } + if material_response.locate { + locate_asset_ref(world, face.material.as_ref(), material_candidates); + } + if material_response.accepted_drop { + clear_asset_drag(world); + } + + let texture_response = asset_selector_row( + ui, + "Texture", + icons::IMAGE, + face.texture.as_ref(), + None, + true, + texture_candidates, + texture_drop_candidate.as_ref(), + None, + AssetSelectorActions::Full, + ); + if let Some(selected) = texture_response.selected { + face.texture = Some(selected); + changed = true; + } + if texture_response.clear { + face.texture = None; + changed = true; + } + if texture_response.locate { + locate_asset_ref(world, face.texture.as_ref(), texture_candidates); + } + if texture_response.accepted_drop { + clear_asset_drag(world); + } + }); + } + + changed +} diff --git a/crates/editor/src/ui/inspector/component_add.rs b/crates/editor/src/ui/inspector/component_add.rs new file mode 100644 index 0000000..4594f35 --- /dev/null +++ b/crates/editor/src/ui/inspector/component_add.rs @@ -0,0 +1,452 @@ +use super::*; + +pub(super) fn component_category_label(category: EditorComponentCategory) -> &'static str { + match category { + EditorComponentCategory::Authoring => "Authoring", + EditorComponentCategory::Rendering => "Rendering", + EditorComponentCategory::Animation => "Animation", + EditorComponentCategory::Audio => "Audio", + EditorComponentCategory::Navigation => "Navigation", + EditorComponentCategory::Physics => "Physics", + EditorComponentCategory::Gameplay => "Gameplay", + EditorComponentCategory::Volumes => "Volumes", + EditorComponentCategory::Editor => "Editor", + } +} + +pub(super) struct ComponentAddState { + pub(super) addable: bool, + reason: Option, + required: Vec<&'static str>, + recommended: Vec<&'static str>, + conflicts: Vec<&'static str>, +} + +pub(super) fn descriptor_matches_search( + descriptor: &EditorComponentDescriptor, + search: &str, +) -> bool { + search.trim().is_empty() + || descriptor.display_name.to_lowercase().contains(search) + || descriptor.type_name.to_lowercase().contains(search) + || descriptor.description.to_lowercase().contains(search) + || descriptor + .search_terms + .iter() + .any(|term| term.to_lowercase().contains(search)) +} + +pub(super) fn component_add_state( + world: &World, + entity: Entity, + descriptor: &EditorComponentDescriptor, + descriptors: &[EditorComponentDescriptor], +) -> ComponentAddState { + let duplicate = component_present(world, entity, descriptor.type_name); + let conflicts = descriptor + .conflicts_with + .iter() + .copied() + .filter(|type_name| component_present(world, entity, type_name)) + .collect::>(); + let recommended = descriptor + .recommended + .iter() + .copied() + .filter(|type_name| !component_present(world, entity, type_name)) + .collect::>(); + let registry = world.resource::(); + let required = registry + .required_component_ids(descriptor) + .iter() + .filter_map(|id| registry.by_id(id)) + .filter(|required| !registry.component_present(world, entity, required.type_name)) + .map(|required| required.display_name) + .collect::>(); + let reason = if duplicate { + Some("Already present on this actor.".to_string()) + } else if !required.is_empty() { + Some(format!("Requires {}.", required.join(", "))) + } else if !conflicts.is_empty() { + Some(format!( + "Conflicts with {}.", + conflicts + .iter() + .map(|type_name| component_display_name(descriptors, type_name)) + .collect::>() + .join(", ") + )) + } else { + None + }; + ComponentAddState { + addable: reason.is_none(), + reason, + required, + recommended, + conflicts, + } +} + +pub(super) fn component_hover_text( + descriptor: &EditorComponentDescriptor, + state: &ComponentAddState, +) -> String { + let mut lines = vec![ + descriptor.description.to_string(), + format!("Type: {}", descriptor.type_name), + format!("Hydration: {}", descriptor.hydration_effect), + format!( + "Inspector: removable={} reorderable={}", + descriptor.removable, descriptor.reorderable + ), + ]; + if let Some(reason) = &state.reason { + lines.push(format!("Unavailable: {reason}")); + } + if !state.required.is_empty() { + lines.push(format!("Requires: {}", state.required.join(", "))); + } + if !state.recommended.is_empty() { + lines.push(format!( + "Recommended with: {}", + state.recommended.join(", ") + )); + } + if !state.conflicts.is_empty() { + lines.push(format!("Conflicts: {}", state.conflicts.join(", "))); + } + lines.push(format!("Search: {}", descriptor.search_terms.join(", "))); + lines.join("\n") +} + +pub(super) fn component_display_name( + descriptors: &[EditorComponentDescriptor], + type_name: &str, +) -> &'static str { + descriptors + .iter() + .find(|descriptor| descriptor.type_name == type_name) + .map(|descriptor| descriptor.display_name) + .unwrap_or("component") +} + +pub(super) fn component_present(world: &World, entity: Entity, type_name: &str) -> bool { + if let Some(registry) = world.get_resource::() { + if registry.by_type_name(type_name).is_some() { + return registry.component_present(world, entity, type_name); + } + } + match type_name { + COMPONENT_ANIMATION_CONTROLLER_DESC => { + world.get::(entity).is_some() + } + "shared::components::Primitive" => world.get::(entity).is_some(), + "shared::components::BrushDesc" => world.get::(entity).is_some(), + "shared::components::StaticMeshRenderer" => { + world.get::(entity).is_some() + } + COMPONENT_SKINNED_MESH_RENDERER => world.get::(entity).is_some(), + "shared::components::MaterialDesc" => { + world.get::(entity).is_some() && world.get::(entity).is_some() + } + "shared::components::LightDesc" => world.get::(entity).is_some(), + "shared::components::AudioSourceDesc" => world.get::(entity).is_some(), + "shared::components::AudioListenerDesc" => world.get::(entity).is_some(), + "shared::components::RigidBodyDesc" => world.get::(entity).is_some(), + "shared::components::ColliderDesc" => world.get::(entity).is_some(), + "shared::components::PlayerSpawn" => world.get::(entity).is_some(), + "shared::components::WeaponSpawn" => world.get::(entity).is_some(), + "shared::components::TriggerVolume" => world.get::(entity).is_some(), + "shared::components::TeamSpawn" => world.get::(entity).is_some(), + "shared::components::ObjectiveMarker" => world.get::(entity).is_some(), + "shared::components::PostProcessVolumeDesc" => { + world.get::(entity).is_some() + } + COMPONENT_NAVIGATION_BOUNDS => world.get::(entity).is_some(), + COMPONENT_NAVIGATION_OBSTACLE => world.get::(entity).is_some(), + COMPONENT_NAVIGATION_AREA => world.get::(entity).is_some(), + COMPONENT_NAVIGATION_LINK => world.get::(entity).is_some(), + _ => false, + } +} + +pub(super) fn insert_registered_component(world: &mut World, entity: Entity, type_name: &str) { + let descriptor = world + .resource::() + .by_type_name(type_name) + .cloned(); + if let Some(descriptor) = descriptor { + if !descriptor.addable || component_present(world, entity, descriptor.type_name) { + return; + } + if descriptor.type_name == COMPONENT_ANIMATION_CONTROLLER_DESC { + let controller = + crate::ui::animation_inspector::default_controller_for_actor(world, entity); + let _ = crate::history::reflected_component_transaction( + world, + entity, + "Add Component", + descriptor.id, + descriptor.type_name, + move |world, entity| { + world.entity_mut(entity).insert(controller); + Ok(()) + }, + ); + } else if descriptor.type_name == COMPONENT_NAVIGATION_BOUNDS { + let bounds = navigation_bounds_for_entity(world, entity); + let _ = crate::history::reflected_component_transaction( + world, + entity, + "Add Component", + descriptor.id, + descriptor.type_name, + move |world, entity| { + world.entity_mut(entity).insert(bounds); + Ok(()) + }, + ); + } else { + let _ = crate::history::reflected_component_transaction( + world, + entity, + "Add Component", + descriptor.id, + descriptor.type_name, + move |world, entity| { + crate::history::apply_reflected_default(world, entity, descriptor.type_name) + }, + ); + } + return; + } + match type_name { + COMPONENT_ANIMATION_CONTROLLER_DESC => { + let controller = + crate::ui::animation_inspector::default_controller_for_actor(world, entity); + insert_component(world, entity, move |world, e| { + world.entity_mut(e).insert(controller); + }); + } + "shared::components::Primitive" => insert_component(world, entity, |world, e| { + world + .entity_mut(e) + .insert((shared::ActorKind::StaticMesh, Primitive::cuboid(Vec3::ONE))); + }), + "shared::components::BrushDesc" => insert_component(world, entity, |world, e| { + world + .entity_mut(e) + .insert((shared::ActorKind::Brush, BrushDesc::default())); + }), + "shared::components::StaticMeshRenderer" => insert_component(world, entity, |world, e| { + world + .entity_mut(e) + .insert((shared::ActorKind::StaticMesh, StaticMeshRenderer::default())); + }), + "shared::components::MaterialDesc" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(MaterialDesc::default()); + }), + "shared::components::LightDesc" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(LightDesc::default()); + }), + "shared::components::AudioSourceDesc" => insert_component(world, entity, |world, e| { + world + .entity_mut(e) + .insert((shared::ActorKind::AudioSource, AudioSourceDesc::default())); + }), + "shared::components::AudioListenerDesc" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(( + shared::ActorKind::AudioListener, + AudioListenerDesc::default(), + )); + }), + "shared::components::RigidBodyDesc" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(RigidBodyDesc::default()); + }), + "shared::components::ColliderDesc" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(ColliderDesc::default()); + }), + "shared::components::PlayerSpawn" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(PlayerSpawn); + }), + "shared::components::WeaponSpawn" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(WeaponSpawn { + weapon_id: "rifle".into(), + }); + }), + "shared::components::TriggerVolume" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(TriggerVolume::default()); + }), + "shared::components::TeamSpawn" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(TeamSpawn { team_id: 0 }); + }), + "shared::components::ObjectiveMarker" => insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(ObjectiveMarker { + objective_id: "objective".into(), + }); + }), + COMPONENT_NAVIGATION_BOUNDS => insert_component(world, entity, |world, e| { + let bounds = navigation_bounds_for_entity(world, e); + world.entity_mut(e).insert((ActorKind::Navigation, bounds)); + }), + COMPONENT_NAVIGATION_OBSTACLE => insert_component(world, entity, |world, e| { + world + .entity_mut(e) + .insert((ActorKind::Navigation, NavigationObstacle::default())); + }), + COMPONENT_NAVIGATION_AREA => insert_component(world, entity, |world, e| { + world + .entity_mut(e) + .insert((ActorKind::Navigation, NavigationArea::default())); + }), + COMPONENT_NAVIGATION_LINK => insert_component(world, entity, |world, e| { + world + .entity_mut(e) + .insert((ActorKind::Navigation, NavigationLink::default())); + }), + "shared::components::PostProcessVolumeDesc" => { + insert_component(world, entity, |world, e| { + world.entity_mut(e).insert(PostProcessVolumeDesc::default()); + }) + } + _ => {} + } +} + +pub(super) fn navigation_bounds_for_entity(world: &World, entity: Entity) -> NavigationBounds { + world + .get::(entity) + .map(|actor_id| NavigationBounds::for_actor(&actor_id.0)) + .unwrap_or_else(|| NavigationBounds::for_actor(&uuid::Uuid::new_v4().to_string())) +} + +pub(super) fn reset_navigation_bounds_for_entity( + world: &World, + entity: Entity, +) -> NavigationBounds { + let mut bounds = navigation_bounds_for_entity(world, entity); + if let Some(current) = world.get::(entity) { + bounds.artifact_path.clone_from(¤t.artifact_path); + } + bounds +} + +pub(super) fn insert_component( + world: &mut World, + entity: Entity, + insert: impl FnOnce(&mut World, Entity), +) { + let before = crate::history::snapshot_entity(world, entity); + let old_kind = before.as_ref().map(|s| s.actor_kind); + insert(world, entity); + let after = crate::history::snapshot_entity(world, entity); + if let (Some(before), Some(after)) = (before, after) { + if let Some(old) = old_kind { + if old != after.actor_kind { + crate::history::set_actor_kind_with_history(world, entity, old, after.actor_kind); + } + } + crate::history::push_command( + world, + crate::history::EditorCommand::AddComponent { + entity, + snapshot: diff_added(&before, &after), + }, + ); + } +} + +pub(super) fn diff_added( + before: &EditorEntitySnapshot, + after: &EditorEntitySnapshot, +) -> EditorEntitySnapshot { + EditorEntitySnapshot { + actor_id: None, + actor_kind: after.actor_kind, + actor_name: None, + name: None, + transform: after.transform, + primitive: after + .primitive + .clone() + .filter(|_| before.primitive.is_none()), + brush: after.brush.clone().filter(|_| before.brush.is_none()), + static_mesh_renderer: after + .static_mesh_renderer + .clone() + .filter(|_| before.static_mesh_renderer.is_none()), + skinned_mesh_renderer: after + .skinned_mesh_renderer + .clone() + .filter(|_| before.skinned_mesh_renderer.is_none()), + material: after.material.clone().filter(|_| before.material.is_none()), + material_override: after + .material_override + .clone() + .filter(|_| before.material_override.is_none()), + rigid_body: after.rigid_body.filter(|_| before.rigid_body.is_none()), + collider: after.collider.clone().filter(|_| before.collider.is_none()), + physics: after.physics.clone().filter(|_| before.physics.is_none()), + light: after.light.clone().filter(|_| before.light.is_none()), + animation_controller: after + .animation_controller + .clone() + .filter(|_| before.animation_controller.is_none()), + audio_source: after + .audio_source + .clone() + .filter(|_| before.audio_source.is_none()), + audio_listener: after + .audio_listener + .filter(|_| before.audio_listener.is_none()), + player_spawn: after.player_spawn && !before.player_spawn, + model: after.model.clone().filter(|_| before.model.is_none()), + prefab: after.prefab.clone().filter(|_| before.prefab.is_none()), + prefab_instance: after + .prefab_instance + .clone() + .filter(|_| before.prefab_instance.is_none()), + weapon_spawn: after + .weapon_spawn + .clone() + .filter(|_| before.weapon_spawn.is_none()), + trigger_volume: after + .trigger_volume + .clone() + .filter(|_| before.trigger_volume.is_none()), + post_process_volume: after + .post_process_volume + .clone() + .filter(|_| before.post_process_volume.is_none()), + team_spawn: after + .team_spawn + .clone() + .filter(|_| before.team_spawn.is_none()), + objective: after + .objective + .clone() + .filter(|_| before.objective.is_none()), + navigation_bounds: after + .navigation_bounds + .clone() + .filter(|_| before.navigation_bounds.is_none()), + navigation_obstacle: after + .navigation_obstacle + .clone() + .filter(|_| before.navigation_obstacle.is_none()), + navigation_area: after + .navigation_area + .clone() + .filter(|_| before.navigation_area.is_none()), + navigation_link: after + .navigation_link + .clone() + .filter(|_| before.navigation_link.is_none()), + hierarchy_sibling_index: after.hierarchy_sibling_index, + editor_visibility: after.editor_visibility, + inspector_order: None, + component_states: None, + children: Vec::new(), + } +} diff --git a/crates/editor/src/ui/inspector/component_chrome.rs b/crates/editor/src/ui/inspector/component_chrome.rs new file mode 100644 index 0000000..7fac561 --- /dev/null +++ b/crates/editor/src/ui/inspector/component_chrome.rs @@ -0,0 +1,518 @@ +use super::*; + +const COMPONENT_HEADER_HEIGHT: f32 = 50.0; +const COMPONENT_RAIL_X: f32 = 7.0; +const COMPONENT_CARET_CENTER_X: f32 = 26.0; +const COMPONENT_ICON_CENTER_X: f32 = 51.0; +const COMPONENT_IDENTITY_X: f32 = 69.0; +const COMPONENT_ACTIONS_WIDTH: f32 = 104.0; + +pub(super) fn material_shader_ui(ui: &mut egui::Ui, material: &mut MaterialDesc) -> bool { + let mut changed = false; + property_row(ui, "Shader", |ui| { + egui::ComboBox::from_id_salt("material_shader_kind") + .selected_text(match material.shader.kind { + MaterialShaderKind::StandardLit => "Standard Lit", + MaterialShaderKind::Unlit => "Unlit", + MaterialShaderKind::Custom => "Custom", + }) + .show_ui(ui, |ui| { + changed |= ui + .selectable_value( + &mut material.shader.kind, + MaterialShaderKind::StandardLit, + "Standard Lit", + ) + .changed(); + changed |= ui + .selectable_value( + &mut material.shader.kind, + MaterialShaderKind::Unlit, + "Unlit", + ) + .changed(); + changed |= ui + .selectable_value( + &mut material.shader.kind, + MaterialShaderKind::Custom, + "Custom", + ) + .changed(); + }); + }); + if matches!(material.shader.kind, MaterialShaderKind::Custom) { + changed |= option_string_ui(ui, "Shader schema", &mut material.shader.schema_path); + changed |= option_string_ui(ui, "WGSL shader", &mut material.shader.shader_path); + } + if !material.parameters.is_empty() { + ui.label(panel_heading("Shader Parameters")); + for parameter in &mut material.parameters { + changed |= material_parameter_ui(ui, parameter); + } + } + changed +} + +pub(super) fn material_parameter_ui(ui: &mut egui::Ui, parameter: &mut MaterialParameter) -> bool { + ui.horizontal_wrapped(|ui| { + ui.label(¶meter.name); + match &mut parameter.value { + MaterialParameterValue::Bool(value) => ui.checkbox(value, "").changed(), + MaterialParameterValue::Float(value) => ui + .add_sized( + [fit_width(ui, 64.0, 120.0), 20.0], + egui::DragValue::new(value) + .speed(0.01) + .min_decimals(2) + .max_decimals(4), + ) + .changed(), + MaterialParameterValue::Vec2(value) => { + let mut changed = false; + changed |= ui + .add_sized( + [fit_width(ui, 52.0, 88.0), 20.0], + egui::DragValue::new(&mut value.x).speed(0.01), + ) + .changed(); + changed |= ui + .add_sized( + [fit_width(ui, 52.0, 88.0), 20.0], + egui::DragValue::new(&mut value.y).speed(0.01), + ) + .changed(); + changed + } + MaterialParameterValue::Vec3(value) => { + let mut changed = false; + changed |= ui + .add_sized( + [fit_width(ui, 52.0, 88.0), 20.0], + egui::DragValue::new(&mut value.x).speed(0.01), + ) + .changed(); + changed |= ui + .add_sized( + [fit_width(ui, 52.0, 88.0), 20.0], + egui::DragValue::new(&mut value.y).speed(0.01), + ) + .changed(); + changed |= ui + .add_sized( + [fit_width(ui, 52.0, 88.0), 20.0], + egui::DragValue::new(&mut value.z).speed(0.01), + ) + .changed(); + changed + } + MaterialParameterValue::Color(value) => { + let mut rgba = [value.r, value.g, value.b, value.a]; + let changed = ui.color_edit_button_rgba_unmultiplied(&mut rgba).changed(); + if changed { + *value = ColorDesc { + r: rgba[0], + g: rgba[1], + b: rgba[2], + a: rgba[3], + }; + } + changed + } + MaterialParameterValue::Enum(value) => ui + .add_sized( + [ + fit_width(ui, MIN_INLINE_CONTROL_WIDTH, TEXT_FIELD_MAX_WIDTH), + 20.0, + ], + egui::TextEdit::singleline(value), + ) + .changed(), + } + }) + .inner +} + +pub(crate) fn component_card( + ui: &mut egui::Ui, + context: &ComponentCardContext, + add_contents: impl FnOnce(&mut egui::Ui), +) -> ComponentCardResponse { + let mut response = ComponentCardResponse { + type_name: context.options.type_name, + ..Default::default() + }; + crate::ui::design_system::scope(ui, |ui| { + egui::Frame::new() + .fill(WIDGET_BG) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) + .corner_radius(egui::CornerRadius::same(5)) + .show(ui, |ui| { + let width = ui.available_width().max(1.0); + let (header, header_response) = ui.allocate_exact_size( + egui::vec2(width, COMPONENT_HEADER_HEIGHT), + egui::Sense::click(), + ); + ui.painter().rect_filled( + egui::Rect::from_min_size( + header.min + egui::vec2(COMPONENT_RAIL_X, 7.0), + egui::vec2(3.0, 36.0), + ), + 2.0, + crate::ui::theme::SELECTION, + ); + let caret_rect = egui::Rect::from_center_size( + egui::pos2(header.left() + COMPONENT_CARET_CENTER_X, header.center().y), + egui::vec2(20.0, 28.0), + ); + if ui + .put( + caret_rect, + egui::Button::new(phosphor_icon( + if context.collapsed { + icons::CARET_RIGHT + } else { + icons::CARET_DOWN + }, + 12.0, + )) + .frame(false), + ) + .on_hover_text(if context.collapsed { + "Expand component" + } else { + "Collapse component" + }) + .clicked() + { + response.collapsed = Some(!context.collapsed); + } + ui.painter().text( + egui::pos2(header.left() + COMPONENT_ICON_CENTER_X, header.center().y), + egui::Align2::CENTER_CENTER, + context.options.icon.as_str(), + egui::FontId::new(18.0, egui::FontFamily::Name("phosphor-regular".into())), + TEXT_DIM, + ); + ui.painter().text( + egui::pos2(header.left() + COMPONENT_IDENTITY_X, header.top() + 18.0), + egui::Align2::LEFT_CENTER, + context.options.title, + crate::ui::design_system::typography::TypeRole::Title.font(), + crate::ui::theme::TEXT, + ); + ui.painter().text( + egui::pos2(header.left() + COMPONENT_IDENTITY_X, header.top() + 34.0), + egui::Align2::LEFT_CENTER, + context.options.summary, + crate::ui::design_system::typography::TypeRole::Small.font(), + TEXT_MUTED, + ); + let actions_rect = egui::Rect::from_min_size( + egui::pos2( + header.right() - COMPONENT_ACTIONS_WIDTH - 8.0, + header.top() + 11.0, + ), + egui::vec2(COMPONENT_ACTIONS_WIDTH, 28.0), + ); + ui.scope_builder(egui::UiBuilder::new().max_rect(actions_rect), |ui| { + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + component_actions_menu(ui, context, &mut response); + let label = if context.active { "Active" } else { "Off" }; + let color = if context.active { + crate::ui::theme::SUCCESS + } else { + TEXT_MUTED + }; + let active = ui + .horizontal(|ui| { + let dot = if context.options.active_toggle { + status_dot_button(ui, color, "Toggle component") + } else { + status_dot(ui, color, "Component active"); + ui.allocate_response(egui::Vec2::ZERO, egui::Sense::hover()) + }; + ui.label( + crate::ui::design_system::typography::TypeRole::Small + .text(label) + .color(TEXT_DIM), + ); + dot + }) + .inner; + if context.options.active_toggle && active.clicked() { + response.active = Some(!context.active); + } + }); + }); + if header_response.clicked() + && ui + .input(|input| input.pointer.interact_pos()) + .is_some_and(|pointer| { + !caret_rect.contains(pointer) && !actions_rect.contains(pointer) + }) + { + response.collapsed = Some(!context.collapsed); + } + if !context.collapsed { + egui::Frame::new() + .inner_margin(egui::Margin { + left: context.options.body_margin, + right: context.options.body_margin, + top: 10, + bottom: context.options.body_margin, + }) + .show(ui, |ui| { + ui.set_max_width(ui.available_width()); + add_contents(ui); + }); + } + }); + }); + ui.add_space(6.0); + response +} + +fn component_actions_menu( + ui: &mut egui::Ui, + context: &ComponentCardContext, + response: &mut ComponentCardResponse, +) { + let menu = ui.menu_button( + phosphor_icon(icons::DOTS_THREE_VERTICAL, 16.0).color(TEXT_DIM), + |ui| { + ui.set_min_width(160.0); + if ui + .add_enabled(context.options.resettable, egui::Button::new("Reset")) + .clicked() + { + response.reset = true; + ui.close(); + } + if ui + .add_enabled(context.options.copyable, egui::Button::new("Copy Values")) + .clicked() + { + response.copy = true; + ui.close(); + } + if ui + .add_enabled(context.pasteable, egui::Button::new("Paste Values")) + .clicked() + { + response.paste = true; + ui.close(); + } + ui.separator(); + if ui + .add_enabled(context.can_move_up, egui::Button::new("Move Up")) + .clicked() + { + response.move_up = true; + ui.close(); + } + if ui + .add_enabled(context.can_move_down, egui::Button::new("Move Down")) + .clicked() + { + response.move_down = true; + ui.close(); + } + ui.separator(); + ui.add_enabled(false, egui::Button::new("Open Documentation")); + if ui + .add_enabled( + context.options.removable, + egui::Button::new(egui::RichText::new("Remove").color(crate::ui::theme::ERROR)), + ) + .clicked() + { + response.remove = true; + ui.close(); + } + }, + ); + menu.response.on_hover_text("Component actions"); +} + +pub(crate) fn property_row( + ui: &mut egui::Ui, + label: &str, + add_contents: impl FnOnce(&mut egui::Ui) -> R, +) -> R { + if ui.available_width() < COMPACT_INSPECTOR_WIDTH { + ui.vertical(|ui| { + ui.label( + crate::ui::design_system::typography::TypeRole::Body + .text(label) + .color(crate::ui::theme::TEXT_DIM), + ); + add_contents(ui) + }) + .inner + } else { + let (rect, _) = ui.allocate_exact_size( + egui::vec2(ui.available_width().max(1.0), 30.0), + egui::Sense::hover(), + ); + ui.scope_builder( + egui::UiBuilder::new() + .max_rect(rect) + .layout(egui::Layout::left_to_right(egui::Align::Center)), + |ui| { + ui.set_clip_rect(rect.intersect(ui.clip_rect())); + let label_width = PROPERTY_LABEL_WIDTH.min(ui.available_width().max(1.0)); + ui.add_sized( + [label_width, 22.0], + egui::Label::new( + crate::ui::design_system::typography::TypeRole::Body + .text(label) + .color(crate::ui::theme::TEXT_DIM), + ), + ); + add_contents(ui) + }, + ) + .inner + } +} + +pub(crate) fn text_field_width(ui: &egui::Ui) -> f32 { + fit_width(ui, MIN_INLINE_CONTROL_WIDTH, TEXT_FIELD_MAX_WIDTH).min(ui.available_width().max(1.0)) +} + +pub fn material_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let mut material = world + .get::(entity) + .cloned() + .unwrap_or_default(); + request_texture_asset_thumbnails(world); + let texture_candidates = texture_asset_candidates(world); + let original = material.clone(); + let mut changed = false; + let mut options = ComponentCardOptions::removable( + COMPONENT_MATERIAL_DESC, + "Brush Fallback Material", + icons::PALETTE, + ); + options.removable = world.get::(entity).is_some(); + options.copyable = options.removable; + let card = component_card_context(world, entity, options); + let card_response = component_card(ui, &card, |ui| { + changed |= material_shader_ui(ui, &mut material); + let mut color = [ + material.base_color.r, + material.base_color.g, + material.base_color.b, + material.base_color.a, + ]; + property_row(ui, "Base color", |ui| { + if ui.color_edit_button_rgba_unmultiplied(&mut color).changed() { + material.base_color = ColorDesc { + r: color[0], + g: color[1], + b: color[2], + a: color[3], + }; + changed = true; + } + }); + property_row(ui, "Metallic", |ui| { + changed |= ui + .add(egui::Slider::new(&mut material.metallic, 0.0..=1.0)) + .changed(); + }); + property_row(ui, "Roughness", |ui| { + changed |= ui + .add(egui::Slider::new(&mut material.roughness, 0.0..=1.0)) + .changed(); + }); + + let mut emissive_color = [ + material.emissive_color.r, + material.emissive_color.g, + material.emissive_color.b, + material.emissive_color.a, + ]; + property_row(ui, "Emissive", |ui| { + if ui + .color_edit_button_rgba_unmultiplied(&mut emissive_color) + .changed() + { + material.emissive_color = ColorDesc { + r: emissive_color[0], + g: emissive_color[1], + b: emissive_color[2], + a: emissive_color[3], + }; + changed = true; + } + }); + property_row(ui, "Emissive nits", |ui| { + changed |= ui + .add(egui::Slider::new( + &mut material.emissive_intensity, + 0.0..=20_000.0, + )) + .changed(); + }); + + changed |= texture_asset_picker_ui( + world, + ui, + "Base color texture", + &mut material.base_color_texture, + &texture_candidates, + ); + changed |= texture_asset_picker_ui( + world, + ui, + "Emissive texture", + &mut material.emissive_texture, + &texture_candidates, + ); + changed |= texture_asset_picker_ui( + world, + ui, + "Normal map", + &mut material.normal_map_texture, + &texture_candidates, + ); + changed |= texture_asset_picker_ui( + world, + ui, + "Metallic/roughness texture", + &mut material.metallic_roughness_texture, + &texture_candidates, + ); + + if crate::assets::materials::material_asset_picker_ui( + world, + ui, + entity, + &mut material, + &original, + ) { + changed = true; + } + }); + apply_component_card_response(world, entity, card_response); + + if changed && !material_eq(&original, &material) { + set_material_with_history(world, entity, material); + } +} + +#[cfg(test)] +mod component_header_geometry_tests { + use super::*; + + #[test] + fn current_penpot_inspector_header_geometry_is_exact() { + assert_eq!(COMPONENT_HEADER_HEIGHT, 50.0); + assert_eq!(COMPONENT_RAIL_X, 7.0); + assert_eq!(COMPONENT_CARET_CENTER_X, 26.0); + assert_eq!(COMPONENT_ICON_CENTER_X, 51.0); + assert_eq!(COMPONENT_IDENTITY_X, 69.0); + assert_eq!(COMPONENT_ACTIONS_WIDTH, 104.0); + } +} diff --git a/crates/editor/src/ui/inspector/component_lifecycle.rs b/crates/editor/src/ui/inspector/component_lifecycle.rs new file mode 100644 index 0000000..610976d --- /dev/null +++ b/crates/editor/src/ui/inspector/component_lifecycle.rs @@ -0,0 +1,772 @@ +use super::*; + +pub(crate) fn apply_component_card_response( + world: &mut World, + entity: Entity, + response: ComponentCardResponse, +) { + let type_name = response_type_name(&response).unwrap_or_default(); + if type_name.is_empty() { + return; + } + apply_component_card_response_for_type(world, entity, type_name, response); +} + +pub(super) fn apply_component_card_response_for_type( + world: &mut World, + entity: Entity, + type_name: &'static str, + response: ComponentCardResponse, +) { + if let Some(collapsed) = response.collapsed { + let key = component_card_key(world, entity, type_name); + let mut panel_state = world.resource_mut::(); + if collapsed { + panel_state.collapsed_components.insert(key); + } else { + panel_state.collapsed_components.remove(&key); + } + } + + if let Some(active) = response.active { + let mut states = world + .get::(entity) + .cloned() + .unwrap_or_else(|| AuthoringComponentStates { + states: world + .get::(entity) + .map(|order| order.component_states.clone()) + .unwrap_or_default(), + }); + let component_id = world + .resource::() + .stable_id_for_type(type_name); + states.set_component_active(component_id, active); + let _ = crate::history::reflected_component_transaction( + world, + entity, + "Set Component Active", + "editor.component_states", + "shared::components::AuthoringComponentStates", + move |world, entity| { + world.entity_mut(entity).insert(states); + Ok(()) + }, + ); + } + + if response.move_up || response.move_down { + let mut order = world + .get::(entity) + .cloned() + .unwrap_or_default(); + let present = present_component_type_names(world, entity); + let offset = if response.move_up { -1 } else { 1 }; + let moved = world + .resource::() + .move_component(&mut order, type_name, offset, &present); + if moved { + set_inspector_order_with_history(world, entity, order); + } + } + + if response.copy { + copy_component(world, entity, type_name); + } + if response.paste { + paste_component(world, entity, type_name); + } + if response.reset { + reset_component(world, entity, type_name); + } + if response.remove { + remove_registered_component(world, entity, type_name); + } +} + +pub(super) fn response_type_name(_response: &ComponentCardResponse) -> Option<&'static str> { + Some(_response.type_name) +} + +pub(super) fn component_card_key(world: &World, entity: Entity, type_name: &str) -> String { + let actor_key = world + .get::(entity) + .map(|id| id.0.as_str()) + .filter(|id| !id.trim().is_empty()) + .map(str::to_string) + .unwrap_or_else(|| format!("{entity:?}")); + format!("{actor_key}::{type_name}") +} + +pub(super) fn present_component_type_names(world: &World, entity: Entity) -> Vec<&'static str> { + if let Some(registry) = world.get_resource::() { + return registry + .descriptors + .iter() + .filter(|descriptor| { + !descriptor.hidden + && (descriptor.type_name != COMPONENT_MATERIAL_DESC + || world.get::(entity).is_some()) + && registry.component_present(world, entity, descriptor.type_name) + }) + .map(|descriptor| descriptor.type_name) + .collect(); + } + let mut present = Vec::new(); + if world.get::(entity).is_some() { + present.push(COMPONENT_ANIMATION_CONTROLLER_DESC); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_STATIC_MESH_RENDERER); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_SKINNED_MESH_RENDERER); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_PRIMITIVE); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_BRUSH_DESC); + } + if world.get::(entity).is_some() && world.get::(entity).is_some() { + present.push(COMPONENT_MATERIAL_DESC); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_LIGHT_DESC); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_AUDIO_SOURCE_DESC); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_AUDIO_LISTENER_DESC); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_RIGID_BODY_DESC); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_COLLIDER_DESC); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_PHYSICS_BODY); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_PLAYER_SPAWN); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_WEAPON_SPAWN); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_TRIGGER_VOLUME); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_TEAM_SPAWN); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_OBJECTIVE_MARKER); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_PREFAB_INSTANCE); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_POST_PROCESS_VOLUME); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_PROJECT_SUN); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_NAVIGATION_BOUNDS); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_NAVIGATION_OBSTACLE); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_NAVIGATION_AREA); + } + if world.get::(entity).is_some() { + present.push(COMPONENT_NAVIGATION_LINK); + } + present +} + +pub(super) fn copy_component(world: &mut World, entity: Entity, type_name: &str) { + let descriptor = world + .resource::() + .by_type_name(type_name) + .cloned(); + if let Some(descriptor) = descriptor { + if let Ok(Some(value)) = crate::history::capture_reflected_component( + world, + entity, + descriptor.id, + descriptor.type_name, + ) { + world.resource_mut::().component = + Some(CopiedComponent::Reflected(value)); + return; + } + } + let component = match type_name { + COMPONENT_ANIMATION_CONTROLLER_DESC => world + .get::(entity) + .cloned() + .map(CopiedComponent::AnimationControllerDesc), + COMPONENT_PRIMITIVE => world + .get::(entity) + .cloned() + .map(CopiedComponent::Primitive), + COMPONENT_BRUSH_DESC => world + .get::(entity) + .cloned() + .map(CopiedComponent::BrushDesc), + COMPONENT_STATIC_MESH_RENDERER => world + .get::(entity) + .cloned() + .map(CopiedComponent::StaticMeshRenderer), + COMPONENT_MATERIAL_DESC => world + .get::(entity) + .cloned() + .map(CopiedComponent::MaterialDesc), + COMPONENT_LIGHT_DESC => world + .get::(entity) + .cloned() + .map(CopiedComponent::LightDesc), + COMPONENT_AUDIO_SOURCE_DESC => world + .get::(entity) + .cloned() + .map(CopiedComponent::AudioSourceDesc), + COMPONENT_AUDIO_LISTENER_DESC => world + .get::(entity) + .copied() + .map(CopiedComponent::AudioListenerDesc), + COMPONENT_RIGID_BODY_DESC => world + .get::(entity) + .copied() + .map(CopiedComponent::RigidBodyDesc), + COMPONENT_COLLIDER_DESC => world + .get::(entity) + .cloned() + .map(CopiedComponent::ColliderDesc), + COMPONENT_PHYSICS_BODY => world + .get::(entity) + .cloned() + .map(CopiedComponent::PhysicsBody), + COMPONENT_WEAPON_SPAWN => world + .get::(entity) + .cloned() + .map(CopiedComponent::WeaponSpawn), + COMPONENT_TRIGGER_VOLUME => world + .get::(entity) + .cloned() + .map(CopiedComponent::TriggerVolume), + COMPONENT_TEAM_SPAWN => world + .get::(entity) + .cloned() + .map(CopiedComponent::TeamSpawn), + COMPONENT_OBJECTIVE_MARKER => world + .get::(entity) + .cloned() + .map(CopiedComponent::ObjectiveMarker), + COMPONENT_POST_PROCESS_VOLUME => world + .get::(entity) + .cloned() + .map(CopiedComponent::PostProcessVolume), + COMPONENT_PREFAB_INSTANCE => world + .get::(entity) + .cloned() + .map(CopiedComponent::PrefabInstance), + COMPONENT_NAVIGATION_BOUNDS => world + .get::(entity) + .cloned() + .map(CopiedComponent::NavigationBounds), + COMPONENT_NAVIGATION_OBSTACLE => world + .get::(entity) + .cloned() + .map(CopiedComponent::NavigationObstacle), + COMPONENT_NAVIGATION_AREA => world + .get::(entity) + .cloned() + .map(CopiedComponent::NavigationArea), + COMPONENT_NAVIGATION_LINK => world + .get::(entity) + .cloned() + .map(CopiedComponent::NavigationLink), + _ => None, + }; + if let Some(component) = component { + world.resource_mut::().component = Some(component); + } +} + +pub(super) fn paste_component(world: &mut World, entity: Entity, type_name: &str) { + let component = world + .get_resource::() + .and_then(|clipboard| clipboard.component.clone()); + if let Some(CopiedComponent::Reflected(value)) = component.as_ref() { + if value.type_path == type_name { + let value = value.clone(); + let component_id = value.component_id.clone(); + let _ = crate::history::reflected_component_transaction( + world, + entity, + "Paste Component", + &component_id, + type_name, + move |world, entity| { + crate::history::apply_reflected_component( + world, + entity, + type_name, + Some(&value), + ) + }, + ); + } + return; + } + match component { + Some(CopiedComponent::Reflected(_)) => {} + Some(CopiedComponent::AnimationControllerDesc(value)) + if type_name == COMPONENT_ANIMATION_CONTROLLER_DESC => + { + set_animation_controller_with_history(world, entity, value); + } + Some(CopiedComponent::Primitive(value)) if type_name == COMPONENT_PRIMITIVE => { + set_primitive_with_history(world, entity, value); + } + Some(CopiedComponent::BrushDesc(value)) if type_name == COMPONENT_BRUSH_DESC => { + set_brush_with_history(world, entity, value); + } + Some(CopiedComponent::StaticMeshRenderer(value)) + if type_name == COMPONENT_STATIC_MESH_RENDERER => + { + set_static_mesh_renderer_with_history(world, entity, value); + } + Some(CopiedComponent::MaterialDesc(value)) if type_name == COMPONENT_MATERIAL_DESC => { + set_material_with_history(world, entity, value); + } + Some(CopiedComponent::LightDesc(value)) if type_name == COMPONENT_LIGHT_DESC => { + set_light_with_history(world, entity, value); + } + Some(CopiedComponent::AudioSourceDesc(value)) + if type_name == COMPONENT_AUDIO_SOURCE_DESC => + { + set_audio_source_with_history(world, entity, value); + } + Some(CopiedComponent::AudioListenerDesc(value)) + if type_name == COMPONENT_AUDIO_LISTENER_DESC => + { + set_audio_listener_with_history(world, entity, value); + } + Some(CopiedComponent::RigidBodyDesc(value)) if type_name == COMPONENT_RIGID_BODY_DESC => { + set_rigid_body_with_history(world, entity, value); + } + Some(CopiedComponent::ColliderDesc(value)) if type_name == COMPONENT_COLLIDER_DESC => { + set_collider_with_history(world, entity, value); + } + Some(CopiedComponent::PhysicsBody(value)) if type_name == COMPONENT_PHYSICS_BODY => { + set_physics_with_history(world, entity, value); + } + Some(CopiedComponent::PostProcessVolume(value)) + if type_name == COMPONENT_POST_PROCESS_VOLUME => + { + set_post_process_volume_with_history(world, entity, value); + } + Some(CopiedComponent::WeaponSpawn(value)) if type_name == COMPONENT_WEAPON_SPAWN => { + insert_direct_component(world, entity, value); + } + Some(CopiedComponent::TriggerVolume(value)) if type_name == COMPONENT_TRIGGER_VOLUME => { + insert_direct_component(world, entity, value); + } + Some(CopiedComponent::TeamSpawn(value)) if type_name == COMPONENT_TEAM_SPAWN => { + insert_direct_component(world, entity, value); + } + Some(CopiedComponent::ObjectiveMarker(value)) + if type_name == COMPONENT_OBJECTIVE_MARKER => + { + insert_direct_component(world, entity, value); + } + Some(CopiedComponent::PrefabInstance(value)) if type_name == COMPONENT_PREFAB_INSTANCE => { + insert_direct_component(world, entity, value); + } + Some(CopiedComponent::NavigationBounds(mut value)) + if type_name == COMPONENT_NAVIGATION_BOUNDS => + { + value.artifact_path = world + .get::(entity) + .map(|bounds| bounds.artifact_path.clone()) + .unwrap_or_else(|| navigation_bounds_for_entity(world, entity).artifact_path); + crate::history::set_navigation_with_history( + world, + entity, + crate::history::NavigationComponentState { + bounds: Some(value), + ..Default::default() + }, + ); + } + Some(CopiedComponent::NavigationObstacle(value)) + if type_name == COMPONENT_NAVIGATION_OBSTACLE => + { + crate::history::set_navigation_with_history( + world, + entity, + crate::history::NavigationComponentState { + obstacle: Some(value), + ..Default::default() + }, + ); + } + Some(CopiedComponent::NavigationArea(value)) if type_name == COMPONENT_NAVIGATION_AREA => { + crate::history::set_navigation_with_history( + world, + entity, + crate::history::NavigationComponentState { + area: Some(value), + ..Default::default() + }, + ); + } + Some(CopiedComponent::NavigationLink(value)) if type_name == COMPONENT_NAVIGATION_LINK => { + crate::history::set_navigation_with_history( + world, + entity, + crate::history::NavigationComponentState { + link: Some(value), + ..Default::default() + }, + ); + } + _ => {} + } +} + +pub(super) fn reset_component(world: &mut World, entity: Entity, type_name: &str) { + let descriptor = world + .resource::() + .by_type_name(type_name) + .cloned(); + if let Some(descriptor) = descriptor { + let component_id = descriptor.id; + let type_path = descriptor.type_name; + if type_path == COMPONENT_ANIMATION_CONTROLLER_DESC { + let controller = + crate::ui::animation_inspector::default_controller_for_actor(world, entity); + let _ = crate::history::reflected_component_transaction( + world, + entity, + "Reset Component", + component_id, + type_path, + move |world, entity| { + world.entity_mut(entity).insert(controller); + Ok(()) + }, + ); + } else if type_path == COMPONENT_NAVIGATION_BOUNDS { + let bounds = reset_navigation_bounds_for_entity(world, entity); + let _ = crate::history::reflected_component_transaction( + world, + entity, + "Reset Component", + component_id, + type_path, + move |world, entity| { + world.entity_mut(entity).insert(bounds); + Ok(()) + }, + ); + } else { + let _ = crate::history::reflected_component_transaction( + world, + entity, + "Reset Component", + component_id, + type_path, + move |world, entity| { + crate::history::apply_reflected_default(world, entity, type_path) + }, + ); + } + return; + } + match type_name { + COMPONENT_ANIMATION_CONTROLLER_DESC => { + let controller = + crate::ui::animation_inspector::default_controller_for_actor(world, entity); + set_animation_controller_with_history(world, entity, controller); + } + COMPONENT_PRIMITIVE => set_primitive_with_history(world, entity, Primitive::default()), + COMPONENT_BRUSH_DESC => set_brush_with_history(world, entity, BrushDesc::default()), + COMPONENT_STATIC_MESH_RENDERER => { + set_static_mesh_renderer_with_history(world, entity, StaticMeshRenderer::default()); + } + COMPONENT_MATERIAL_DESC => { + set_material_with_history(world, entity, MaterialDesc::default()) + } + COMPONENT_LIGHT_DESC => set_light_with_history(world, entity, LightDesc::default()), + COMPONENT_AUDIO_SOURCE_DESC => { + set_audio_source_with_history(world, entity, AudioSourceDesc::default()) + } + COMPONENT_AUDIO_LISTENER_DESC => { + set_audio_listener_with_history(world, entity, AudioListenerDesc::default()) + } + COMPONENT_RIGID_BODY_DESC => { + set_rigid_body_with_history(world, entity, RigidBodyDesc::default()); + } + COMPONENT_COLLIDER_DESC => { + set_collider_with_history(world, entity, ColliderDesc::default()) + } + COMPONENT_PHYSICS_BODY => set_physics_with_history(world, entity, PhysicsBody::default()), + COMPONENT_POST_PROCESS_VOLUME => { + set_post_process_volume_with_history(world, entity, PostProcessVolumeDesc::default()); + } + COMPONENT_NAVIGATION_BOUNDS => crate::history::set_navigation_with_history( + world, + entity, + crate::history::NavigationComponentState { + bounds: Some(reset_navigation_bounds_for_entity(world, entity)), + ..Default::default() + }, + ), + COMPONENT_NAVIGATION_OBSTACLE => crate::history::set_navigation_with_history( + world, + entity, + crate::history::NavigationComponentState { + obstacle: Some(NavigationObstacle::default()), + ..Default::default() + }, + ), + COMPONENT_NAVIGATION_AREA => crate::history::set_navigation_with_history( + world, + entity, + crate::history::NavigationComponentState { + area: Some(NavigationArea::default()), + ..Default::default() + }, + ), + COMPONENT_NAVIGATION_LINK => crate::history::set_navigation_with_history( + world, + entity, + crate::history::NavigationComponentState { + link: Some(NavigationLink::default()), + ..Default::default() + }, + ), + COMPONENT_WEAPON_SPAWN => insert_direct_component( + world, + entity, + WeaponSpawn { + weapon_id: "rifle".into(), + }, + ), + COMPONENT_TRIGGER_VOLUME => { + insert_direct_component(world, entity, TriggerVolume::default()) + } + COMPONENT_TEAM_SPAWN => insert_direct_component(world, entity, TeamSpawn { team_id: 0 }), + COMPONENT_OBJECTIVE_MARKER => insert_direct_component( + world, + entity, + ObjectiveMarker { + objective_id: "objective".into(), + }, + ), + _ => {} + } +} + +pub(super) fn insert_direct_component( + world: &mut World, + entity: Entity, + component: T, +) { + if let Ok(mut entity_mut) = world.get_entity_mut(entity) { + entity_mut.insert(component); + } + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.mark_dirty(); + } +} + +pub(super) fn remove_registered_component(world: &mut World, entity: Entity, type_name: &str) { + let descriptor = world + .resource::() + .by_type_name(type_name) + .cloned(); + if let Some(descriptor) = descriptor { + if !descriptor.removable { + return; + } + let dependents = world + .resource::() + .present_dependents(world, entity, descriptor.id) + .iter() + .map(|dependent| dependent.display_name) + .collect::>(); + if !dependents.is_empty() { + world + .resource_mut::() + .set_status(format!( + "Remove blocked: required by {}. Remove dependent components first.", + dependents.join(", ") + )); + return; + } + let result = crate::history::reflected_component_transaction( + world, + entity, + "Remove Component", + descriptor.id, + descriptor.type_name, + |world, entity| { + crate::history::apply_reflected_component(world, entity, descriptor.type_name, None) + }, + ); + if result.is_ok() && type_name == COMPONENT_ANIMATION_CONTROLLER_DESC { + crate::ui::animation_inspector::stop_preview_if_actor(world, entity); + } + return; + } + let Some(before) = crate::history::snapshot_entity(world, entity) else { + return; + }; + let removed_dedicated_audio_kind = matches!( + (type_name, before.actor_kind), + (COMPONENT_AUDIO_SOURCE_DESC, ActorKind::AudioSource) + | (COMPONENT_AUDIO_LISTENER_DESC, ActorKind::AudioListener) + ); + let removed_dedicated_navigation_kind = before.actor_kind == ActorKind::Navigation + && matches!( + type_name, + COMPONENT_NAVIGATION_BOUNDS + | COMPONENT_NAVIGATION_OBSTACLE + | COMPONENT_NAVIGATION_AREA + | COMPONENT_NAVIGATION_LINK + ); + let removed_dedicated_skinned_kind = + type_name == COMPONENT_SKINNED_MESH_RENDERER && before.actor_kind == ActorKind::SkinnedMesh; + let removed = if let Ok(mut entity_mut) = world.get_entity_mut(entity) { + match type_name { + COMPONENT_ANIMATION_CONTROLLER_DESC if before.animation_controller.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_PRIMITIVE if before.primitive.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_BRUSH_DESC if before.brush.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_STATIC_MESH_RENDERER if before.static_mesh_renderer.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_SKINNED_MESH_RENDERER if before.skinned_mesh_renderer.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_MATERIAL_DESC if before.material.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_LIGHT_DESC if before.light.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_AUDIO_SOURCE_DESC if before.audio_source.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_AUDIO_LISTENER_DESC if before.audio_listener.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_RIGID_BODY_DESC if before.rigid_body.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_COLLIDER_DESC if before.collider.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_PHYSICS_BODY if before.physics.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_PLAYER_SPAWN if before.player_spawn => { + entity_mut.remove::(); + true + } + COMPONENT_WEAPON_SPAWN if before.weapon_spawn.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_TRIGGER_VOLUME if before.trigger_volume.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_TEAM_SPAWN if before.team_spawn.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_OBJECTIVE_MARKER if before.objective.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_PREFAB_INSTANCE if before.prefab_instance.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_POST_PROCESS_VOLUME if before.post_process_volume.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_NAVIGATION_BOUNDS if before.navigation_bounds.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_NAVIGATION_OBSTACLE if before.navigation_obstacle.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_NAVIGATION_AREA if before.navigation_area.is_some() => { + entity_mut.remove::(); + true + } + COMPONENT_NAVIGATION_LINK if before.navigation_link.is_some() => { + entity_mut.remove::(); + true + } + _ => false, + } + } else { + false + }; + if !removed { + return; + } + if type_name == COMPONENT_ANIMATION_CONTROLLER_DESC { + crate::ui::animation_inspector::stop_preview_if_actor(world, entity); + } + if removed_dedicated_audio_kind + || removed_dedicated_navigation_kind + || removed_dedicated_skinned_kind + { + let fallback = world + .get_entity(entity) + .ok() + .and_then(infer_actor_kind) + .unwrap_or(ActorKind::Empty); + if let Ok(mut entity_mut) = world.get_entity_mut(entity) { + entity_mut.insert(fallback); + } + } + if let Some(after) = crate::history::snapshot_entity(world, entity) { + let snapshot = diff_added(&after, &before); + crate::history::push_command( + world, + crate::history::EditorCommand::RemoveComponent { entity, snapshot }, + ); + } +} diff --git a/crates/editor/src/ui/inspector/dispatch.rs b/crates/editor/src/ui/inspector/dispatch.rs new file mode 100644 index 0000000..078fe0a --- /dev/null +++ b/crates/editor/src/ui/inspector/dispatch.rs @@ -0,0 +1,383 @@ +use super::*; + +pub fn authoring_inspector_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + if !world + .get_entity(entity) + .is_ok_and(|entity_ref| entity_ref.contains::()) + { + return; + } + + let present = present_component_type_names(world, entity); + let ordered = if let Some(order) = world.get::(entity) { + world + .resource::() + .ordered_components(order, &present) + } else { + present + }; + for type_name in ordered { + let inspector = world + .resource::() + .inspector(type_name); + if let Some(inspector) = inspector { + ui.push_id(("component_inspector", type_name), |ui| { + inspector(world, ui, entity); + }); + } else { + ui.colored_label( + crate::ui::theme::ERROR, + format!("No Inspector renderer registered for {type_name}"), + ); + } + } +} + +pub(crate) fn register_builtin_component_inspectors(world: &mut World) { + let registrations: &[(&str, crate::ui::component_registry::ComponentInspectorFn)] = &[ + ( + COMPONENT_ANIMATION_CONTROLLER_DESC, + crate::ui::animation_inspector::animation_controller_inspector_ui, + ), + (COMPONENT_STATIC_MESH_RENDERER, static_mesh_renderer_ui), + (COMPONENT_SKINNED_MESH_RENDERER, skinned_mesh_renderer_ui), + (COMPONENT_BRUSH_DESC, brush_editor_ui), + (COMPONENT_TERRAIN_DESC, terrain_editor_ui), + (COMPONENT_PRIMITIVE, primitive_editor_ui), + (COMPONENT_MATERIAL_DESC, material_editor_ui), + (COMPONENT_LIGHT_DESC, light_editor_ui), + ( + COMPONENT_AUDIO_SOURCE_DESC, + crate::ui::audio_inspector::audio_source_inspector_ui, + ), + ( + COMPONENT_AUDIO_LISTENER_DESC, + crate::ui::audio_inspector::audio_listener_inspector_ui, + ), + (COMPONENT_RIGID_BODY_DESC, rigid_body_editor_ui), + (COMPONENT_COLLIDER_DESC, collider_editor_ui), + (COMPONENT_PHYSICS_BODY, physics_editor_ui), + (COMPONENT_PLAYER_SPAWN, player_spawn_ui), + (COMPONENT_WEAPON_SPAWN, weapon_spawn_ui), + (COMPONENT_TRIGGER_VOLUME, trigger_volume_ui), + (COMPONENT_TEAM_SPAWN, team_spawn_ui), + (COMPONENT_OBJECTIVE_MARKER, objective_ui), + (COMPONENT_PREFAB_INSTANCE, prefab_instance_ui), + ( + COMPONENT_POST_PROCESS_VOLUME, + crate::ui::post_process_volume_ui::post_process_volume_inspector_ui, + ), + (COMPONENT_PROJECT_SUN, project_sun_ui), + ( + COMPONENT_NAVIGATION_BOUNDS, + crate::ui::navigation_inspector::navigation_bounds_inspector_ui, + ), + ( + COMPONENT_NAVIGATION_OBSTACLE, + crate::ui::navigation_inspector::navigation_obstacle_inspector_ui, + ), + ( + COMPONENT_NAVIGATION_AREA, + crate::ui::navigation_inspector::navigation_area_inspector_ui, + ), + ( + COMPONENT_NAVIGATION_LINK, + crate::ui::navigation_inspector::navigation_link_inspector_ui, + ), + ]; + let mut registry = world.resource_mut::(); + for &(type_name, inspector) in registrations { + registry + .register_inspector_for_existing(type_name, inspector) + .unwrap_or_else(|error| panic!("built-in Inspector registration failed: {error}")); + } +} + +pub(crate) fn add_component_footer(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + ui.add_space(4.0); + let button_response = egui::Frame::new() + .fill(WIDGET_BG) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) + .corner_radius(egui::CornerRadius::same(4)) + .inner_margin(egui::Margin::symmetric(8, 6)) + .show(ui, |ui| { + let open_for_entity = add_component_picker_open_for(world, entity); + let label = if open_for_entity { + "Close Add Component" + } else { + "+ Add Component" + }; + if ui.button(label).clicked() { + if let Some(mut state) = world.get_resource_mut::() { + if open_for_entity { + state.add_component_open = false; + state.add_component_target = None; + } else { + state.add_component_open = true; + state.add_component_focus_search = true; + state.add_component_scroll_selected = true; + state.add_component_selected_index = 0; + state.add_component_target = Some(entity); + state.add_component_search.clear(); + } + } + } + }); + + if add_component_picker_open_for(world, entity) { + add_component_picker_shelf(world, ui, entity, button_response.response.rect); + } +} + +pub(super) fn add_component_picker_open_for(world: &World, entity: Entity) -> bool { + world + .get_resource::() + .is_some_and(|state| state.add_component_open && state.add_component_target == Some(entity)) +} + +pub(super) fn shelf_list_max_height(visible_space: f32) -> f32 { + (visible_space - 108.0).clamp(56.0, 320.0) +} + +pub(super) fn add_component_picker_shelf( + world: &mut World, + ui: &mut egui::Ui, + target: Entity, + anchor: egui::Rect, +) { + if world.get_entity(target).is_err() { + if let Some(mut state) = world.get_resource_mut::() { + state.add_component_open = false; + state.add_component_target = None; + } + return; + } + + let descriptors = world + .resource::() + .descriptors + .clone(); + + let visible = ui.clip_rect().intersect(ui.ctx().content_rect()); + let space_above = (anchor.min.y - visible.top()).max(0.0); + let space_below = (visible.bottom() - anchor.max.y).max(0.0); + let direction = if space_below >= space_above { + AddComponentShelfDirection::Down + } else { + AddComponentShelfDirection::Up + }; + let visible_space = match direction { + AddComponentShelfDirection::Up => space_above, + AddComponentShelfDirection::Down => space_below, + }; + let list_max_height = shelf_list_max_height(visible_space); + let shelf_height = (list_max_height + 108.0).min((visible_space - 4.0).max(96.0)); + let x = anchor + .min + .x + .clamp(visible.left(), visible.right() - anchor.width()); + let y = match direction { + AddComponentShelfDirection::Up => anchor.min.y - shelf_height - 4.0, + AddComponentShelfDirection::Down => anchor.max.y + 4.0, + } + .clamp( + visible.top(), + (visible.bottom() - shelf_height).max(visible.top()), + ); + let shelf_width = anchor.width().max(260.0).min(visible.width()); + + egui::Area::new(egui::Id::new(("add_component_shelf", target))) + .order(egui::Order::Foreground) + .fixed_pos(egui::pos2(x, y)) + .show(ui.ctx(), |ui| { + ui.set_width(shelf_width); + add_component_picker_shelf_contents(world, ui, target, &descriptors, list_max_height); + }); +} + +pub(super) fn add_component_picker_shelf_contents( + world: &mut World, + ui: &mut egui::Ui, + target: Entity, + descriptors: &[EditorComponentDescriptor], + list_max_height: f32, +) { + egui::Frame::new() + .fill(PANEL_BG_DARK) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) + .corner_radius(egui::CornerRadius::same(4)) + .inner_margin(egui::Margin::symmetric(8, 8)) + .show(ui, |ui| { + ui.horizontal(|ui| { + ui.label(panel_heading("Add Component")); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if icon_button_small(ui, icons::X, "Close Add Component").clicked() { + let mut state = world.resource_mut::(); + state.add_component_open = false; + state.add_component_target = None; + } + }); + }); + ui.add_space(4.0); + + let mut search_input = world + .resource::() + .add_component_search + .clone(); + let search_response = ui.add( + egui::TextEdit::singleline(&mut search_input) + .hint_text("Search components...") + .desired_width(f32::INFINITY), + ); + if search_response.changed() { + let mut state = world.resource_mut::(); + state.add_component_search = search_input.clone(); + state.add_component_scroll_selected = true; + state.add_component_selected_index = 0; + } + if world + .resource::() + .add_component_focus_search + { + search_response.request_focus(); + world + .resource_mut::() + .add_component_focus_search = false; + } + + let search = search_input.to_lowercase(); + let filtered = filtered_component_descriptors(descriptors, &search); + { + let mut state = world.resource_mut::(); + if !filtered.is_empty() { + state.add_component_selected_index = + state.add_component_selected_index.min(filtered.len() - 1); + } else { + state.add_component_selected_index = 0; + } + } + + if ui.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::ArrowDown)) + && !filtered.is_empty() + { + let mut state = world.resource_mut::(); + state.add_component_selected_index = + (state.add_component_selected_index + 1) % filtered.len(); + state.add_component_scroll_selected = true; + } + if ui.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::ArrowUp)) + && !filtered.is_empty() + { + let mut state = world.resource_mut::(); + state.add_component_selected_index = if state.add_component_selected_index == 0 { + filtered.len() - 1 + } else { + state.add_component_selected_index - 1 + }; + state.add_component_scroll_selected = true; + } + if ui.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::Escape)) { + let mut state = world.resource_mut::(); + state.add_component_open = false; + state.add_component_target = None; + } + if ui.input_mut(|input| input.consume_key(egui::Modifiers::NONE, egui::Key::Enter)) { + let selected_index = world + .resource::() + .add_component_selected_index; + if let Some(descriptor) = filtered.get(selected_index) { + let add_state = component_add_state(world, target, descriptor, descriptors); + if add_state.addable { + insert_registered_component(world, target, descriptor.type_name); + let mut state = world.resource_mut::(); + state.add_component_open = false; + state.add_component_target = None; + } + } + } + + ui.separator(); + if filtered.is_empty() { + ui.label(egui::RichText::new("No matching components").color(TEXT_DIM)); + return; + } + + egui::ScrollArea::vertical() + .max_height(list_max_height) + .show(ui, |ui| { + let (selected_index, scroll_selected) = { + let state = world.resource::(); + ( + state.add_component_selected_index, + state.add_component_scroll_selected, + ) + }; + let mut last_category = None; + for (index, descriptor) in filtered.iter().enumerate() { + if last_category != Some(descriptor.category) { + if last_category.is_some() { + ui.separator(); + } + ui.label(panel_heading(component_category_label(descriptor.category))); + last_category = Some(descriptor.category); + } + + let add_state = component_add_state(world, target, descriptor, descriptors); + let selected = index == selected_index; + let row = ui + .horizontal(|ui| { + ui.label(phosphor_icon_text(descriptor.icon, 14.0).color(TEXT_DIM)); + ui.add_enabled( + add_state.addable, + egui::Button::selectable(selected, descriptor.display_name), + ) + }) + .inner + .on_hover_text(component_hover_text(descriptor, &add_state)); + if selected && scroll_selected { + row.scroll_to_me(Some(egui::Align::Center)); + } + if row.clicked() { + world + .resource_mut::() + .add_component_selected_index = index; + if add_state.addable { + insert_registered_component(world, target, descriptor.type_name); + let mut state = world.resource_mut::(); + state.add_component_open = false; + state.add_component_target = None; + } + } + } + }); + world + .resource_mut::() + .add_component_scroll_selected = false; + }); +} + +pub(super) fn filtered_component_descriptors<'a>( + descriptors: &'a [EditorComponentDescriptor], + search: &str, +) -> Vec<&'a EditorComponentDescriptor> { + [ + EditorComponentCategory::Authoring, + EditorComponentCategory::Rendering, + EditorComponentCategory::Animation, + EditorComponentCategory::Audio, + EditorComponentCategory::Navigation, + EditorComponentCategory::Physics, + EditorComponentCategory::Gameplay, + EditorComponentCategory::Volumes, + ] + .into_iter() + .flat_map(|category| { + descriptors.iter().filter(move |descriptor| { + descriptor.addable + && !descriptor.hidden + && descriptor.category == category + && descriptor_matches_search(descriptor, search) + }) + }) + .collect() +} diff --git a/crates/editor/src/ui/inspector/imported_material_preview.rs b/crates/editor/src/ui/inspector/imported_material_preview.rs new file mode 100644 index 0000000..89caadf --- /dev/null +++ b/crates/editor/src/ui/inspector/imported_material_preview.rs @@ -0,0 +1,108 @@ +use std::collections::HashMap; + +use super::*; + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +struct ImportedMaterialPreviewKey { + asset_id: String, + sub_asset_id: String, + source: String, + fingerprint: String, +} + +#[derive(Resource, Default)] +struct ImportedMaterialPreviewCache { + entries: HashMap>, +} + +pub(super) fn imported_material_parameters_ui( + world: &mut World, + ui: &mut egui::Ui, + reference: &MaterialRef, +) { + let record = world.get_resource::().and_then(|registry| { + registry + .records + .iter() + .find(|record| record.id.as_string() == reference.0.asset_id) + }); + let source = reference + .0 + .source_path + .clone() + .or_else(|| record.map(|record| record.path.clone())); + let Some(source) = source else { + ui.colored_label(crate::ui::theme::ERROR, "Material reference is unresolved"); + return; + }; + let key = ImportedMaterialPreviewKey { + asset_id: reference.0.asset_id.clone(), + sub_asset_id: reference.0.sub_asset_id.clone(), + source: source.clone(), + fingerprint: record + .and_then(|record| record.source_fingerprint.as_ref()) + .map(|fingerprint| fingerprint.content_hash.clone()) + .unwrap_or_default(), + }; + if !world.contains_resource::() { + world.init_resource::(); + } + let cached = world + .resource::() + .entries + .get(&key) + .cloned(); + let preview = cached.unwrap_or_else(|| { + let result = crate::assets::plan_model_material_extraction( + Path::new(&source), + Path::new("assets/materials"), + ) + .map_err(|error| format!("Imported material parameters are unavailable: {error}")) + .and_then(|planned| { + planned + .into_iter() + .find(|material| { + material + .asset + .provenance + .as_ref() + .is_some_and(|provenance| { + provenance.source_sub_asset_id == reference.0.sub_asset_id + }) + }) + .map(|material| material.asset) + .ok_or_else(|| "Imported material slot is missing".to_string()) + }); + world + .resource_mut::() + .entries + .insert(key, result.clone()); + result + }); + let asset = match preview { + Ok(asset) => asset, + Err(error) => { + ui.colored_label(crate::ui::theme::ERROR, error); + return; + } + }; + let mut inputs = asset.inputs.clone(); + ui.add_enabled_ui(false, |ui| { + property_row(ui, "Shader", |ui| { + ui.label(match asset.shader.kind { + MaterialShaderKind::StandardLit => "Standard Lit", + MaterialShaderKind::Unlit => "Unlit", + MaterialShaderKind::Custom => "Custom", + }); + }); + egui::CollapsingHeader::new("Surface Options") + .default_open(true) + .show(ui, |ui| { + ui.label(format!("Alpha mode: {:?}", asset.render_state.alpha_mode)); + let mut double_sided = asset.render_state.double_sided; + ui.checkbox(&mut double_sided, "Double sided"); + }); + material_input_schema_editor(ui, &standard_lit_input_schema(), &mut inputs, &[], None); + }); + ui.small(egui::RichText::new("Imported source · read-only").color(TEXT_DIM)); +} diff --git a/crates/editor/src/ui/inspector/material_slots.rs b/crates/editor/src/ui/inspector/material_slots.rs new file mode 100644 index 0000000..85d668c --- /dev/null +++ b/crates/editor/src/ui/inspector/material_slots.rs @@ -0,0 +1,728 @@ +use super::imported_material_preview::imported_material_parameters_ui; +use super::*; + +pub(super) fn ensure_slot_id(entry: &mut StaticMeshRendererEntry, index: usize) { + if entry.id.is_empty() { + entry.id = ComponentInstanceId::new(format!("slot:{index}")); + } + if entry.material_slot_id.is_empty() { + entry.material_slot_id = ComponentInstanceId::new(format!("slot:{}", entry.id.0)); + } +} + +pub(super) fn status_dot(ui: &mut egui::Ui, color: egui::Color32, tooltip: &str) { + let (rect, response) = ui.allocate_exact_size(egui::vec2(18.0, 20.0), egui::Sense::hover()); + ui.painter().circle_filled(rect.center(), 4.0, color); + response.on_hover_text(tooltip); +} + +pub(super) fn status_dot_button( + ui: &mut egui::Ui, + color: egui::Color32, + tooltip: &str, +) -> egui::Response { + let (rect, response) = ui.allocate_exact_size(egui::vec2(18.0, 20.0), egui::Sense::click()); + let color = if response.hovered() { + color.linear_multiply(1.2) + } else { + color + }; + ui.painter().circle_filled(rect.center(), 4.0, color); + response.on_hover_text(tooltip) +} + +pub(super) fn material_drop_invalid_reason( + world: &World, + valid_material_candidate: bool, +) -> Option<&'static str> { + if valid_material_candidate { + return None; + } + let assets = world.get_resource::()?; + let selection = assets.dragging_selection()?; + let texture = matches!( + selection, + AssetSelection::SubAsset { + kind: AssetSubAssetKind::Texture, + .. + } + ) || assets + .asset_for_selection(selection) + .is_some_and(|asset| matches!(asset.kind, EditorAssetKind::Texture)); + Some(if texture { + "Textures cannot be assigned directly; create or edit a Material" + } else { + "Only a project Material or Material Instance can be assigned" + }) +} + +#[derive(Default)] +pub(super) struct MaterialSlotWidgetResponse { + pub(super) changed: bool, + pub(super) accepted_drop: bool, +} + +pub(super) fn material_slot_widget_ui( + world: &mut World, + ui: &mut egui::Ui, + entity: Entity, + slot: &mut shared::MaterialSlot, + candidates: &[AssetRefCandidate], + drop_candidate: Option<&AssetRefCandidate>, + invalid_drop_reason: Option<&'static str>, +) -> MaterialSlotWidgetResponse { + let mut response = MaterialSlotWidgetResponse::default(); + let actor_widget_id = stable_actor_widget_id(world, entity); + let project_default = world + .get_resource::() + .and_then(|defaults| defaults.default_material.clone()); + let model_material = model_material_for_actor_slot(world, entity, &slot.id); + let (effective, inherited_badge) = if let Some(reference) = slot.material.clone() { + (Some(reference), None) + } else if let Some((reference, badge)) = model_material { + (Some(reference), Some(badge)) + } else if let Some(reference) = project_default { + ( + Some(reference), + Some(crate::ui::materials::MaterialLayerBadge::ProjectDefault), + ) + } else { + ( + None, + Some(crate::ui::materials::MaterialLayerBadge::DefaultGrid), + ) + }; + let texture_id = effective.as_ref().and_then(|reference| { + candidates + .iter() + .find(|candidate| { + candidate.reference.asset_id == reference.0.asset_id + && candidate.reference.sub_asset_id == reference.0.sub_asset_id + }) + .and_then(|candidate| candidate.texture_id) + }); + let source_layer = + inherited_badge == Some(crate::ui::materials::MaterialLayerBadge::ModelSource); + let built_in_layer = + inherited_badge == Some(crate::ui::materials::MaterialLayerBadge::DefaultGrid); + let effective_path = effective + .as_ref() + .and_then(|reference| reference.0.source_path.as_deref()); + let is_project_material = !source_layer + && effective_path.is_some_and(|path| MaterialAsset::load_from_path(path).is_ok()); + let is_project_instance = !source_layer + && effective_path.is_some_and(|path| MaterialInstanceAsset::load_from_path(path).is_ok()); + let broken_project_reference = effective.is_some() + && !source_layer + && !built_in_layer + && !is_project_material + && !is_project_instance; + let mut health = effective + .as_ref() + .and_then(|reference| reference.0.source_path.as_deref()) + .and_then(|path| { + world + .get_resource::() + .and_then(|store| store.snapshot_for_path(path)) + }) + .map_or_else( + || { + if broken_project_reference { + crate::ui::materials::MaterialHealth::Broken + } else { + crate::ui::materials::MaterialHealth::Healthy + } + }, + |snapshot| { + use crate::asset_documents::{AuthoredDocumentState, DerivedProcessingState}; + if matches!( + snapshot.state, + AuthoredDocumentState::ExternalConflict | AuthoredDocumentState::SaveFailed + ) || snapshot.processing == DerivedProcessingState::Failed + || (broken_project_reference && !snapshot.dirty) + { + crate::ui::materials::MaterialHealth::Broken + } else if snapshot.dirty { + crate::ui::materials::MaterialHealth::Dirty + } else if matches!( + snapshot.processing, + DerivedProcessingState::Queued | DerivedProcessingState::Processing + ) { + crate::ui::materials::MaterialHealth::Processing + } else { + crate::ui::materials::MaterialHealth::Healthy + } + }, + ); + let is_imported_source = effective.is_some() && source_layer; + if health == crate::ui::materials::MaterialHealth::Healthy + && (is_imported_source || built_in_layer) + { + health = crate::ui::materials::MaterialHealth::ReadOnly; + } + let shader_kind = crate::ui::materials::material_shader_kind(world, effective_path); + let thumbnail = if broken_project_reference { + crate::ui::materials::MaterialThumbnailPresentation::Failed + } else if let Some(texture) = texture_id { + crate::ui::materials::MaterialThumbnailPresentation::Ready(texture) + } else { + crate::ui::materials::MaterialThumbnailPresentation::Pending + }; + let picker_candidates = candidates + .iter() + .filter(|candidate| { + candidate + .reference + .source_path + .as_deref() + .is_some_and(|path| { + MaterialAsset::load_from_path(path).is_ok() + || MaterialInstanceAsset::load_from_path(path).is_ok() + }) + }) + .map(|candidate| crate::ui::materials::MaterialPickerCandidate { + reference: candidate.reference.clone(), + label: candidate.label.clone(), + detail: candidate.detail.clone(), + thumbnail: candidate.texture_id.map_or( + crate::ui::materials::MaterialThumbnailPresentation::Pending, + crate::ui::materials::MaterialThumbnailPresentation::Ready, + ), + }) + .collect::>(); + let picker_drop_candidate = + drop_candidate.map(|candidate| crate::ui::materials::MaterialPickerCandidate { + reference: candidate.reference.clone(), + label: candidate.label.clone(), + detail: candidate.detail.clone(), + thumbnail: candidate.texture_id.map_or( + crate::ui::materials::MaterialThumbnailPresentation::Pending, + crate::ui::materials::MaterialThumbnailPresentation::Ready, + ), + }); + let view = crate::ui::materials::MaterialSlotPanelViewModel { + slot_id: slot.id.0.clone(), + label: effective + .as_ref() + .map(|reference| reference.0.label.clone()) + .unwrap_or_else(|| "Default Grid".into()), + path: effective_path.map(ToOwned::to_owned), + shader: crate::ui::materials::material_shader_label(world, effective_path), + shader_kind, + can_edit_shader: is_project_material, + thumbnail, + inherited: inherited_badge, + health, + assigned: slot.material.as_ref().map(|reference| reference.0.clone()), + effective: effective.as_ref().map(|reference| reference.0.clone()), + candidates: picker_candidates, + drop_candidate: picker_drop_candidate, + invalid_drop_reason: invalid_drop_reason.map(ToOwned::to_owned), + can_locate: effective.as_ref().is_some_and(|reference| { + candidates.iter().any(|candidate| { + candidate.reference.asset_id == reference.0.asset_id + && candidate.reference.sub_asset_id == reference.0.sub_asset_id + }) + }), + can_clear: slot.material.is_some(), + can_extract: is_imported_source, + can_create_instance: is_project_material, + }; + + let widget_slot_id = slot.id.0.clone(); + ui.push_id( + ( + "material_slot_widget", + actor_widget_id.as_str(), + widget_slot_id, + ), + |ui| { + let panel = crate::ui::materials::material_slot_panel( + ui, + (actor_widget_id.as_str(), slot.id.0.as_str()), + &view, + |ui| { + let Some(reference) = effective.as_ref() else { + ui.label( + egui::RichText::new( + "Default Grid is immutable. Assign a project Material to edit parameters.", + ) + .small() + .color(TEXT_DIM), + ); + return; + }; + if broken_project_reference { + ui.colored_label( + crate::ui::theme::ERROR, + "Material reference is broken; rendering Default Grid", + ); + } else if let Some(path) = reference.0.source_path.as_deref() { + if is_project_material || is_project_instance { + crate::ui::materials::inline_material_document_editor( + world, ui, path, + ); + } else { + imported_material_parameters_ui(world, ui, reference); + } + } else { + imported_material_parameters_ui(world, ui, reference); + } + }, + |ui| { + ui.small(format!("Stable slot: {}", slot.id.0)); + if let Some(reference) = effective.as_ref() { + ui.small(format!("Asset: {}", reference.0.asset_id)); + ui.small(format!("Subasset: {}", reference.0.sub_asset_id)); + if let Some(path) = reference.0.source_path.as_deref() { + ui.small(path); + } + } else { + ui.small("Immutable engine-owned fallback"); + } + }, + ); + for action in panel.actions { + debug_assert_eq!(action.slot_id, slot.id.0); + match action.action { + crate::ui::materials::MaterialSlotAction::Assign { + reference, + from_drop, + } => { + slot.material = Some(MaterialRef::new(reference)); + response.changed = true; + response.accepted_drop |= from_drop; + } + crate::ui::materials::MaterialSlotAction::BrowseLibrary => { + crate::ui::request_editor_tab( + world, + crate::ui::EditorTab::AssetBrowser, + ); + } + crate::ui::materials::MaterialSlotAction::Locate => { + locate_asset_ref( + world, + effective.as_ref().map(|reference| &reference.0), + candidates, + ); + } + crate::ui::materials::MaterialSlotAction::Clear => { + slot.material = None; + response.changed = true; + } + crate::ui::materials::MaterialSlotAction::CreateInstance => { + if let Some(reference) = effective.as_ref() { + create_instance_and_assign_slot(world, entity, slot, reference); + } + } + crate::ui::materials::MaterialSlotAction::ExtractEditable => { + if let Some(reference) = effective.as_ref() { + extract_slot_material(world, entity, slot, reference); + } + } + crate::ui::materials::MaterialSlotAction::SetShader(kind) => { + if let Some(path) = effective_path { + crate::ui::materials::set_material_shader_kind(world, path, kind); + } + } + } + } + }, + ); + let property_block = world + .get::(entity) + .and_then(|blocks| blocks.slots.iter().find(|block| block.slot_id == slot.id)) + .cloned(); + if property_block_promotion_ui(ui, property_block.as_ref(), slot.material.is_some()) { + if let (Some(base), Some(block)) = (slot.material.clone(), property_block) { + open_property_block_promotion_review( + world, + entity, + slot.id.clone(), + slot.name.clone(), + base, + block, + ); + } + } + response +} + +fn stable_actor_widget_id(world: &World, entity: Entity) -> String { + world + .get::(entity) + .map(|actor_id| format!("actor:{}", actor_id.0)) + .unwrap_or_else(|| format!("runtime:{entity:?}")) +} + +fn model_material_for_actor_slot( + world: &World, + entity: Entity, + slot_id: &ComponentInstanceId, +) -> Option<(MaterialRef, crate::ui::materials::MaterialLayerBadge)> { + let asset_id = world + .get::(entity) + .and_then(|renderer| { + renderer + .slots + .iter() + .find(|part| part.material_slot_id == *slot_id) + .map(|part| part.mesh.asset_id.clone()) + }) + .or_else(|| { + world + .get::(entity) + .map(|renderer| renderer.asset_id.clone()) + })?; + let record = world + .get_resource::()? + .records + .iter() + .find(|record| record.id.as_string() == asset_id)?; + let settings = record.model_import(); + match crate::assets::static_mesh::material_selection(settings, &slot_id.0) { + ModelMaterialSelection::Project(reference) => Some(( + reference.clone(), + crate::ui::materials::MaterialLayerBadge::ModelDefault, + )), + ModelMaterialSelection::Default => None, + ModelMaterialSelection::Source => { + let manifest = settings + .static_mesh_manifest_path + .as_deref() + .and_then(|path| load_static_mesh_manifest(path).ok())?; + let part = manifest.parts.iter().find(|part| { + let part_id = if part.id.trim().is_empty() { + part_id_from_label(&part.mesh_label) + } else { + part.id.clone() + }; + slot_id.0 == format!("slot:{part_id}") + })?; + let material_id = part + .material_id + .clone() + .filter(|id| !id.trim().is_empty()) + .or_else(|| part.material_label.as_deref().map(material_id_from_label))?; + Some(( + MaterialRef::new(EditorAssetRef::new( + manifest.asset_id, + material_id, + part.material_slot_name.clone(), + )), + crate::ui::materials::MaterialLayerBadge::ModelSource, + )) + } + } +} + +fn create_instance_and_assign_slot( + world: &mut World, + entity: Entity, + slot: &shared::MaterialSlot, + reference: &MaterialRef, +) { + let empty_block = MaterialPropertyBlock { + slot_id: slot.id.clone(), + parameters: Vec::new(), + textures: Vec::new(), + }; + let result = plan_material_instance_assignment( + world, + entity, + reference, + &empty_block, + &slot.name, + false, + ) + .and_then(|transaction| commit_property_block_promotion(world, &transaction)); + world.resource_mut::().status = match result { + Ok(path) => format!("Created and assigned Material Instance {}", path.display()), + Err(error) => error, + }; +} + +fn extract_slot_material( + world: &mut World, + entity: Entity, + slot: &shared::MaterialSlot, + reference: &MaterialRef, +) { + let source = reference.0.source_path.clone().or_else(|| { + world + .get_resource::() + .and_then(|registry| { + registry + .records + .iter() + .find(|record| record.id.as_string() == reference.0.asset_id) + }) + .map(|record| record.path.clone()) + }); + if let Some(source) = source { + crate::ui::asset_browser::begin_actor_material_extraction( + world, + &source, + entity, + slot.id.clone(), + reference.0.sub_asset_id.clone(), + ); + } else { + world.resource_mut::().status = + "Material source is unresolved and cannot be extracted".into(); + } +} + +pub(super) fn thumbnail_for_mesh( + mesh: &EditorAssetRef, + candidates: &[AssetRefCandidate], +) -> Option { + candidates + .iter() + .find(|candidate| { + candidate.reference.asset_id == mesh.asset_id + && candidate.reference.sub_asset_id == mesh.sub_asset_id + }) + .and_then(|candidate| candidate.texture_id) +} + +#[expect( + clippy::too_many_arguments, + reason = "asset selector rows keep immediate-mode UI inputs explicit" +)] +pub(super) fn asset_selector_row( + ui: &mut egui::Ui, + label: &str, + icon: Icon, + asset: Option<&EditorAssetRef>, + inherited_asset: Option<&EditorAssetRef>, + clearable: bool, + candidates: &[AssetRefCandidate], + drop_candidate: Option<&AssetRefCandidate>, + invalid_drop_reason: Option<&'static str>, + actions: AssetSelectorActions, +) -> AssetSelectorResponse { + let mut response = AssetSelectorResponse::default(); + if ui.available_width() < COMPACT_INSPECTOR_WIDTH { + ui.vertical(|ui| { + ui.label(label); + let control_width = ui.available_width().max(1.0); + asset_selector_control( + ui, + icon, + asset, + inherited_asset, + clearable, + control_width, + candidates, + drop_candidate, + invalid_drop_reason, + actions, + &mut response, + ); + }); + } else { + ui.horizontal(|ui| { + let row_width = ui.available_width().max(1.0); + let label_width = ASSET_SELECTOR_LABEL_WIDTH.min(row_width); + let control_width = (row_width - label_width - ui.spacing().item_spacing.x).max(1.0); + ui.add_sized([label_width, 20.0], egui::Label::new(label)); + asset_selector_control( + ui, + icon, + asset, + inherited_asset, + clearable, + control_width, + candidates, + drop_candidate, + invalid_drop_reason, + actions, + &mut response, + ); + }); + } + response +} + +#[expect( + clippy::too_many_arguments, + reason = "asset selector controls keep immediate-mode UI inputs explicit" +)] +pub(super) fn asset_selector_control( + ui: &mut egui::Ui, + icon: Icon, + asset: Option<&EditorAssetRef>, + inherited_asset: Option<&EditorAssetRef>, + clearable: bool, + control_width: f32, + candidates: &[AssetRefCandidate], + drop_candidate: Option<&AssetRefCandidate>, + invalid_drop_reason: Option<&'static str>, + actions: AssetSelectorActions, + response: &mut AssetSelectorResponse, +) { + let display_asset = asset.or(inherited_asset); + let inherited = asset.is_none() && inherited_asset.is_some(); + let selector_width = control_width.min(ui.available_width()).max(1.0); + exact_region( + ui, + egui::vec2(selector_width, ASSET_SELECTOR_HEIGHT), + egui::Layout::top_down(egui::Align::Min), + |ui| { + let contained_clip = ui.clip_rect().intersect(ui.max_rect()); + ui.set_clip_rect(contained_clip); + let rect = ui.max_rect(); + let valid_drag = drop_candidate.is_some(); + let drop_hovered = valid_drag && ui.rect_contains_pointer(rect); + let invalid_hovered = invalid_drop_reason.is_some() && ui.rect_contains_pointer(rect); + let stroke = if drop_hovered { + egui::Stroke::new(2.0_f32, egui::Color32::from_rgb(125, 198, 255)) + } else if invalid_hovered { + egui::Stroke::new(2.0_f32, crate::ui::theme::ERROR) + } else if valid_drag { + egui::Stroke::new(1.0_f32, egui::Color32::from_rgb(58, 88, 122)) + } else { + egui::Stroke::new(1.0_f32, BORDER) + }; + let fill = if drop_hovered { + egui::Color32::from_rgb(29, 57, 86) + } else if invalid_hovered { + egui::Color32::from_rgb(69, 31, 35) + } else { + WIDGET_BG.linear_multiply(0.75) + }; + let inner_width = (selector_width - 18.0).max(1.0); + egui::Frame::new() + .fill(fill) + .stroke(stroke) + .corner_radius(egui::CornerRadius::same(4)) + .inner_margin(egui::Margin::symmetric(8, 6)) + .show(ui, |ui| { + ui.set_width(inner_width); + ui.horizontal(|ui| { + ui.add_sized( + [18.0, 20.0], + egui::Label::new(phosphor_icon(icon, 14.0).color(TEXT_DIM)), + ); + let action_width = match actions { + AssetSelectorActions::Full if clearable => 78.0, + AssetSelectorActions::Full => 52.0, + }; + let text_width = (ui.available_width() - action_width) + .max(1.0) + .min(ui.available_width().max(1.0)); + ui.vertical(|ui| { + ui.set_max_width(text_width); + let name = display_asset + .map(|asset| asset.label.as_str()) + .filter(|label| !label.trim().is_empty()) + .unwrap_or("(none)"); + ui.add(egui::Label::new(name).truncate()); + let id = invalid_hovered + .then(|| invalid_drop_reason.unwrap_or_default().to_string()) + .or_else(|| { + display_asset.map(|asset| { + if inherited { + format!("Inherited | {}", asset.sub_asset_id) + } else { + asset.sub_asset_id.clone() + } + }) + }) + .filter(|id| !id.trim().is_empty()) + .unwrap_or_else(|| "No imported asset selected".to_string()); + ui.add( + egui::Label::new(egui::RichText::new(id).color( + if invalid_hovered { + crate::ui::theme::ERROR + } else { + TEXT_DIM + }, + )) + .truncate(), + ); + }); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if actions == AssetSelectorActions::Full && clearable { + let clear = ui.add_enabled( + asset.is_some(), + egui::Button::new(phosphor_icon(icons::X, 16.0)) + .frame(false) + .min_size(egui::vec2(22.0, 22.0)), + ); + if clear.on_hover_text("Clear actor override").clicked() { + response.clear = true; + } + } + if actions == AssetSelectorActions::Full { + let locate = ui.add_enabled( + display_asset.is_some_and(EditorAssetRef::is_resolved), + egui::Button::new(phosphor_icon(icons::CROSSHAIR, 16.0)) + .frame(false) + .min_size(egui::vec2(22.0, 22.0)), + ); + if locate.on_hover_text("Locate in content browser").clicked() { + response.locate = true; + } + } + if candidates.is_empty() { + ui.add_enabled( + false, + egui::Button::new(phosphor_icon(icons::FOLDER_OPEN, 16.0)) + .frame(false) + .min_size(egui::vec2(22.0, 22.0)), + ) + .on_hover_text("No imported assets available"); + } else { + let menu = + ui.menu_button(phosphor_icon(icons::FOLDER_OPEN, 16.0), |ui| { + ui.set_min_width(220.0); + for candidate in candidates { + let selected = display_asset + .is_some_and(|asset| asset == &candidate.reference); + let clicked = ui + .selectable_label( + selected, + candidate.label.as_str(), + ) + .on_hover_text(candidate.detail.as_str()) + .clicked(); + if clicked { + response.selected = + Some(candidate.reference.clone()); + ui.close(); + } + } + }); + menu.response.on_hover_text("Browse assets"); + } + }); + }); + }); + if drop_hovered && ui.input(|input| input.pointer.any_released()) { + if let Some(candidate) = drop_candidate { + response.selected = Some(candidate.reference.clone()); + response.accepted_drop = true; + } + } + }, + ); +} + +#[cfg(test)] +mod widget_identity_tests { + use super::*; + + #[test] + fn endurance_guard_actor_widget_identity_survives_runtime_entity_replacement() { + let mut world = World::new(); + let first = world.spawn(ActorId::new("persistent-actor")).id(); + let first_key = stable_actor_widget_id(&world, first); + world.despawn(first); + let replacement = world.spawn(ActorId::new("persistent-actor")).id(); + + assert_eq!(first_key, stable_actor_widget_id(&world, replacement)); + assert_eq!(first_key, "actor:persistent-actor"); + } +} diff --git a/crates/editor/src/ui/inspector/mesh_renderers.rs b/crates/editor/src/ui/inspector/mesh_renderers.rs new file mode 100644 index 0000000..01e77fc --- /dev/null +++ b/crates/editor/src/ui/inspector/mesh_renderers.rs @@ -0,0 +1,425 @@ +use super::*; + +pub(super) fn skinned_mesh_renderer_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let material_candidates = brush_face_material_ref_candidates(world); + let material_drop_candidate = world + .get_resource::() + .and_then(|assets| assets.dragging_selection().cloned()) + .and_then(|selection| { + asset_ref_candidate_from_selection(world, &selection, AssetRefCandidateKind::Material) + }); + let invalid_material_drop = + material_drop_invalid_reason(world, material_drop_candidate.is_some()); + let Some(mut renderer) = world.get::(entity).cloned() else { + return; + }; + let original = renderer.clone(); + let mut changed = false; + let mut accepted_drop = false; + let mut options = ComponentCardOptions::removable( + COMPONENT_SKINNED_MESH_RENDERER, + "Skinned Mesh Renderer", + icons::PERSON_SIMPLE_RUN, + ); + options.active_toggle = false; + options.removable = world.get::(entity).is_none(); + options.resettable = false; + options.copyable = false; + options.summary = "Skeleton-bound renderer"; + let context = component_card_context(world, entity, options); + let response = component_card(ui, &context, |ui| { + property_row(ui, "Source", |ui| { + ui.add( + egui::Label::new(if renderer.path.trim().is_empty() { + "Unassigned" + } else { + renderer.path.as_str() + }) + .truncate(), + ); + }); + property_row(ui, "Scene", |ui| { + ui.label(renderer.scene_index.to_string()); + }); + property_row(ui, "Asset ID", |ui| { + ui.add( + egui::Label::new(if renderer.asset_id.trim().is_empty() { + "Legacy/path-only" + } else { + renderer.asset_id.as_str() + }) + .truncate(), + ); + }); + ui.label( + egui::RichText::new( + "Preserves the imported skeleton hierarchy and Bevy skinned-mesh bindings.", + ) + .small() + .color(TEXT_DIM), + ); + ui.add_space(8.0); + if renderer.materials.slots.is_empty() { + ui.label( + egui::RichText::new("No imported slots; reimport the source model") + .small() + .color(TEXT_DIM), + ); + } + let materials = crate::ui::materials::MaterialsSectionViewModel { + slot_ids: renderer + .materials + .slots + .iter() + .map(|slot| slot.id.0.clone()) + .collect(), + }; + crate::ui::materials::materials_section(ui, &materials, |ui| { + for slot in &mut renderer.materials.slots { + let widget = material_slot_widget_ui( + world, + ui, + entity, + slot, + &material_candidates, + material_drop_candidate.as_ref(), + invalid_material_drop, + ); + changed |= widget.changed; + accepted_drop |= widget.accepted_drop; + ui.add_space(8.0); + } + }); + for orphan in &renderer.materials.orphaned_assignments { + ui.label( + egui::RichText::new(format!( + "Orphaned: {} ({})", + orphan.last_known_name, orphan.slot_id.0 + )) + .small() + .color(egui::Color32::YELLOW), + ); + } + if world.get::(entity).is_some() { + ui.label( + egui::RichText::new( + "Remove the Animation Controller before removing its renderer.", + ) + .small() + .color(TEXT_MUTED), + ); + } + }); + apply_component_card_response(world, entity, response); + if accepted_drop { + clear_asset_drag(world); + } + if changed && renderer != original { + let result = reflected_component_transaction( + world, + entity, + "Assign Skinned Material Slot", + shared::AUTHORING_COMPONENT_SKINNED_MESH_RENDERER, + COMPONENT_SKINNED_MESH_RENDERER, + move |world, entity| { + world.entity_mut(entity).insert(renderer); + Ok(()) + }, + ); + if let Err(error) = result { + world.resource_mut::().status = error; + } + } +} + +pub(super) fn static_mesh_renderer_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let mesh_candidates = static_mesh_asset_ref_candidates(world, AssetRefCandidateKind::Mesh); + let material_candidates = brush_face_material_ref_candidates(world); + let material_drop_candidate = world + .get_resource::() + .and_then(|assets| assets.dragging_selection().cloned()) + .and_then(|selection| { + asset_ref_candidate_from_selection(world, &selection, AssetRefCandidateKind::Material) + }); + let invalid_material_drop = + material_drop_invalid_reason(world, material_drop_candidate.is_some()); + let Some(mut renderer) = world.get::(entity).cloned() else { + return; + }; + let original = renderer.clone(); + let mut changed = false; + let mut accepted_drop = false; + let mut remove_entry = None; + for index in 0..renderer.slots.len() { + ensure_slot_id(&mut renderer.slots[index], index); + let part = &renderer.slots[index]; + if renderer.materials.slot(&part.material_slot_id).is_none() { + renderer.materials.slots.push(shared::MaterialSlot { + id: part.material_slot_id.clone(), + name: part.name.clone(), + material: None, + }); + } + } + + let mut options = ComponentCardOptions::removable( + COMPONENT_STATIC_MESH_RENDERER, + "Static Mesh Renderer", + icons::CUBE, + ); + options.summary = "Renderer array"; + options.body_margin = 0; + let card = component_card_context(world, entity, options); + let card_response = component_card(ui, &card, |ui| { + let add_slot = renderer_array_header(ui, renderer.slots.len()); + ui.add_space(10.0); + if renderer.slots.is_empty() { + ui.label(egui::RichText::new("No renderer slots").color(TEXT_DIM)); + } + + let (entries, material_set) = (&mut renderer.slots, &mut renderer.materials); + for (index, entry) in entries.iter_mut().enumerate() { + ensure_slot_id(entry, index); + let thumbnail = thumbnail_for_mesh(&entry.mesh, &mesh_candidates); + let renderer_open_id = ui.make_persistent_id(("static_renderer_open", &entry.id.0)); + let mut renderer_open = ui + .ctx() + .data_mut(|data| data.get_persisted::(renderer_open_id)) + .unwrap_or(index == 0); + + renderer_panel(ui, |ui| { + renderer_panel_header( + ui, + index, + &entry.name, + thumbnail, + &mut renderer_open, + |ui| { + status_dot(ui, egui::Color32::from_rgb(74, 181, 104), "Slot active"); + if icon_button_small(ui, icons::TRASH, "Remove slot").clicked() { + remove_entry = Some(index); + } + ui.label(phosphor_icon(icons::DOTS_THREE_VERTICAL, 16.0).color(TEXT_DIM)); + }, + ); + if !renderer_open { + return; + } + let mut draw_fields = |ui: &mut egui::Ui, entry: &mut StaticMeshRendererEntry| { + renderer_properties_header(ui); + property_row(ui, "Name", |ui| { + changed |= ui + .add_sized( + [text_field_width(ui), 20.0], + egui::TextEdit::singleline(&mut entry.name), + ) + .changed(); + }); + let mesh_response = asset_selector_row( + ui, + "Mesh", + icons::CUBE, + Some(&entry.mesh), + None, + false, + &mesh_candidates, + None, + None, + AssetSelectorActions::Full, + ); + if let Some(selected) = mesh_response.selected { + entry.mesh = selected; + changed = true; + } + if mesh_response.locate { + locate_asset_ref(world, Some(&entry.mesh), &mesh_candidates); + } + + ui.horizontal_wrapped(|ui| { + changed |= ui.checkbox(&mut entry.visible, "Visible").changed(); + changed |= ui + .checkbox(&mut entry.cast_shadows, "Cast shadows") + .changed(); + changed |= ui + .checkbox(&mut entry.receive_shadows, "Receive shadows") + .changed(); + }); + }; + + egui::Frame::new() + .inner_margin(egui::Margin::symmetric(12, 10)) + .show(ui, |ui| draw_fields(ui, entry)); + renderer_material_slots_header(ui, 1); + if let Some(slot) = material_set.slot_mut(&entry.material_slot_id) { + let widget = renderer_material_slot_row(ui, index, |ui| { + material_slot_widget_ui( + world, + ui, + entity, + slot, + &material_candidates, + material_drop_candidate.as_ref(), + invalid_material_drop, + ) + }); + changed |= widget.changed; + accepted_drop |= widget.accepted_drop; + } + }); + ui.ctx() + .data_mut(|data| data.insert_persisted(renderer_open_id, renderer_open)); + } + + if add_slot { + let index = renderer.slots.len(); + let entry = StaticMeshRendererEntry { + id: ComponentInstanceId::new(format!("slot:{index}")), + material_slot_id: ComponentInstanceId::new(format!("slot:manual:{index}")), + ..Default::default() + }; + renderer.materials.slots.push(shared::MaterialSlot { + id: entry.material_slot_id.clone(), + name: format!("Material {index}"), + material: None, + }); + renderer.slots.push(entry); + changed = true; + } + }); + apply_component_card_response(world, entity, card_response); + if accepted_drop { + clear_asset_drag(world); + } + + if let Some(index) = remove_entry { + let removed = renderer.slots.remove(index); + if let Some(slot_index) = renderer + .materials + .slots + .iter() + .position(|slot| slot.id == removed.material_slot_id) + { + let slot = renderer.materials.slots.remove(slot_index); + if let Some(material) = slot.material { + renderer + .materials + .orphaned_assignments + .push(shared::OrphanedMaterialAssignment { + slot_id: slot.id, + last_known_name: slot.name, + material, + }); + } + } + changed = true; + } + if changed && renderer != original { + set_static_mesh_renderer_with_history(world, entity, renderer); + } +} + +fn renderer_array_header(ui: &mut egui::Ui, count: usize) -> bool { + let palette = crate::ui::design_system::palette(ui); + let (rect, _) = ui.allocate_exact_size( + egui::vec2(ui.available_width().max(1.0), 40.0), + egui::Sense::hover(), + ); + ui.painter().rect_filled(rect, 4.0, palette.elevated); + ui.painter().text( + rect.left_center() + egui::vec2(12.0, 0.0), + egui::Align2::LEFT_CENTER, + icons::SQUARES_FOUR.as_str(), + egui::FontId::new(16.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.text_secondary, + ); + ui.painter().text( + rect.left_center() + egui::vec2(36.0, 0.0), + egui::Align2::LEFT_CENTER, + "Mesh renderers", + crate::ui::design_system::typography::TypeRole::Section.font(), + palette.text_primary, + ); + ui.painter().text( + rect.left_center() + egui::vec2(132.0, 0.0), + egui::Align2::LEFT_CENTER, + format!("{count}"), + crate::ui::design_system::typography::TypeRole::Small.font(), + palette.text_muted, + ); + let add_rect = egui::Rect::from_min_size( + egui::pos2(rect.right() - 116.0, rect.top() + 7.0), + egui::vec2(104.0, 26.0), + ); + ui.put( + add_rect, + egui::Button::new(crate::ui::design_system::controls::icon_label( + icons::PLUS, + "Add renderer", + crate::ui::design_system::typography::TypeRole::Body, + 12.0, + palette.text_primary, + )), + ) + .clicked() +} + +fn renderer_material_slots_header(ui: &mut egui::Ui, count: usize) { + let palette = crate::ui::design_system::palette(ui); + let (rect, _) = ui.allocate_exact_size( + egui::vec2(ui.available_width().max(1.0), 38.0), + egui::Sense::hover(), + ); + ui.painter().text( + rect.left_center() + egui::vec2(10.0, 0.0), + egui::Align2::LEFT_CENTER, + "Material slots", + crate::ui::design_system::typography::TypeRole::Section.font(), + palette.text_primary, + ); + ui.painter().text( + rect.right_center() - egui::vec2(10.0, 0.0), + egui::Align2::RIGHT_CENTER, + format!("{count}"), + crate::ui::design_system::typography::TypeRole::Small.font(), + palette.text_muted, + ); +} + +fn renderer_properties_header(ui: &mut egui::Ui) { + let palette = crate::ui::design_system::palette(ui); + let (rect, _) = ui.allocate_exact_size( + egui::vec2(ui.available_width().max(1.0), 18.0), + egui::Sense::hover(), + ); + ui.painter().text( + rect.left_center(), + egui::Align2::LEFT_CENTER, + "Renderer properties", + crate::ui::design_system::typography::TypeRole::Caption.font(), + palette.text_muted, + ); +} + +fn renderer_material_slot_row( + ui: &mut egui::Ui, + index: usize, + add_contents: impl FnOnce(&mut egui::Ui) -> R, +) -> R { + let palette = crate::ui::design_system::palette(ui); + ui.horizontal_top(|ui| { + let (index_rect, _) = ui.allocate_exact_size(egui::vec2(31.0, 60.0), egui::Sense::hover()); + ui.painter().text( + index_rect.center_top() + egui::vec2(0.0, 18.0), + egui::Align2::CENTER_CENTER, + index.to_string(), + crate::ui::design_system::typography::TypeRole::Body.font(), + palette.text_muted, + ); + ui.vertical(|ui| { + ui.set_width(ui.available_width().max(1.0)); + add_contents(ui) + }) + .inner + }) + .inner +} diff --git a/crates/editor/src/ui/inspector/primitive_domains.rs b/crates/editor/src/ui/inspector/primitive_domains.rs new file mode 100644 index 0000000..fdc5bce --- /dev/null +++ b/crates/editor/src/ui/inspector/primitive_domains.rs @@ -0,0 +1,612 @@ +use super::*; + +pub(super) fn clear_asset_drag(world: &mut World) { + if let Some(mut assets) = world.get_resource_mut::() { + assets.clear_drag(); + } +} + +pub(super) fn primitive_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let material_candidates = brush_face_material_ref_candidates(world); + let material_drop_candidate = world + .get_resource::() + .and_then(|assets| assets.dragging_selection().cloned()) + .and_then(|selection| { + asset_ref_candidate_from_selection(world, &selection, AssetRefCandidateKind::Material) + }); + let invalid_material_drop = + material_drop_invalid_reason(world, material_drop_candidate.is_some()); + let Some(mut primitive) = world.get::(entity).cloned() else { + return; + }; + let original = primitive.clone(); + let mut changed = false; + let mut accepted_drop = false; + let mut options = + ComponentCardOptions::removable(COMPONENT_PRIMITIVE, "Primitive", icons::CUBE); + options.summary = "Shape · Size · Materials"; + let card = component_card_context(world, entity, options); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Shape", |ui| { + ui.horizontal_wrapped(|ui| { + for (label, shape) in [ + ("Box", PrimitiveShape::Box), + ("Sphere", PrimitiveShape::Sphere), + ("Ramp", PrimitiveShape::Ramp), + ] { + changed |= ui + .selectable_value(&mut primitive.shape, shape, label) + .changed(); + } + }); + }); + property_row(ui, "Size X", |ui| { + changed |= ui + .add(egui::Slider::new(&mut primitive.size.x, 0.1..=1000.0)) + .changed(); + }); + property_row(ui, "Size Y", |ui| { + changed |= ui + .add(egui::Slider::new(&mut primitive.size.y, 0.1..=1000.0)) + .changed(); + }); + property_row(ui, "Size Z", |ui| { + changed |= ui + .add(egui::Slider::new(&mut primitive.size.z, 0.1..=1000.0)) + .changed(); + }); + ui.add_space(8.0); + let materials = crate::ui::materials::MaterialsSectionViewModel { + slot_ids: vec![primitive.surface.id.0.clone()], + }; + let widget = crate::ui::materials::materials_section(ui, &materials, |ui| { + material_slot_widget_ui( + world, + ui, + entity, + &mut primitive.surface, + &material_candidates, + material_drop_candidate.as_ref(), + invalid_material_drop, + ) + }); + changed |= widget.changed; + accepted_drop |= widget.accepted_drop; + }); + apply_component_card_response(world, entity, card_response); + if accepted_drop { + clear_asset_drag(world); + } + if changed && primitive != original { + set_primitive_with_history(world, entity, primitive); + } +} + +pub(super) fn light_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let Some(mut light) = world.get::(entity).cloned() else { + return; + }; + let _original = light.clone(); + let mut changed = false; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_LIGHT_DESC, "Light", icons::LIGHTBULB), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Kind", |ui| { + ui.horizontal_wrapped(|ui| { + for (label, kind) in [ + ("Point", AuthoringLightKind::Point), + ("Spot", AuthoringLightKind::Spot), + ("Directional", AuthoringLightKind::Directional), + ] { + if ui.selectable_label(light.kind == kind, label).clicked() { + let color = light.color; + light = LightDesc { + color, + ..LightDesc::for_kind(kind) + }; + changed = true; + } + } + }); + }); + let solari_disabled = solari_disables_local_light(world, &light); + if solari_disabled { + ui.colored_label( + egui::Color32::from_rgb(255, 180, 100), + "Point and spot lights are disabled while Solari is active. Use a directional light or emissive material, or switch GI to Forward.", + ); + } + ui.add_enabled_ui(!solari_disabled, |ui| { + let mut color = [light.color.r, light.color.g, light.color.b, light.color.a]; + property_row(ui, "Color", |ui| { + if ui.color_edit_button_rgba_unmultiplied(&mut color).changed() { + light.color = ColorDesc { + r: color[0], + g: color[1], + b: color[2], + a: color[3], + }; + changed = true; + } + }); + let intensity_label = match light.kind { + AuthoringLightKind::Directional => "Intensity (lux)", + _ => "Intensity (lumens)", + }; + let intensity_max = match light.kind { + AuthoringLightKind::Directional => AUTHORING_DIRECTIONAL_LUX_MAX, + _ => AUTHORING_POINT_SPOT_LUMENS_MAX, + }; + property_row(ui, intensity_label, |ui| { + ui.horizontal_wrapped(|ui| { + if ui + .add( + egui::Slider::new(&mut light.intensity, 0.0..=intensity_max) + .show_value(false), + ) + .changed() + { + changed = true; + } + if ui + .add_sized( + [fit_width(ui, 72.0, 120.0), 20.0], + egui::DragValue::new(&mut light.intensity) + .range(0.0..=intensity_max) + .speed(intensity_max * 0.001), + ) + .changed() + { + changed = true; + } + }); + }); + if matches!( + light.kind, + AuthoringLightKind::Point | AuthoringLightKind::Spot + ) { + property_row(ui, "Range (m)", |ui| { + changed |= ui + .add(egui::Slider::new(&mut light.range, 0.0..=100.0)) + .changed(); + }); + } + if matches!(light.kind, AuthoringLightKind::Spot) { + property_row(ui, "Inner angle", |ui| { + changed |= ui + .add(egui::Slider::new(&mut light.inner_angle_deg, 1.0..=80.0)) + .changed(); + }); + property_row(ui, "Outer angle", |ui| { + changed |= ui + .add(egui::Slider::new(&mut light.outer_angle_deg, 1.0..=90.0)) + .changed(); + }); + } + property_row(ui, "Shadows", |ui| { + changed |= ui.checkbox(&mut light.shadows, "Cast shadows").changed(); + }); + if matches!(light.kind, AuthoringLightKind::Directional) { + ui.small("Controls project sun while this directional exists."); + } + }); + }); + apply_component_card_response(world, entity, card_response); + if changed { + set_light_with_history(world, entity, light); + } +} + +pub(super) fn solari_disables_local_light(world: &World, light: &LightDesc) -> bool { + matches!( + light.kind, + AuthoringLightKind::Point | AuthoringLightKind::Spot + ) && world + .get_resource::() + .is_some_and(|profile| profile.gi_path == settings::GiPath::SolariDeferred) + && world + .get_resource::() + .is_some_and(|caps| caps.rt_supported) +} + +pub(super) fn rigid_body_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let Some(mut body) = world.get::(entity).copied() else { + return; + }; + let original = body; + let mut changed = false; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_RIGID_BODY_DESC, "Rigid Body", icons::SPHERE), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Body", |ui| { + ui.horizontal_wrapped(|ui| { + for (label, kind) in [ + ("Static", AuthoringRigidBody::Static), + ("Kinematic", AuthoringRigidBody::Kinematic), + ("Dynamic", AuthoringRigidBody::Dynamic), + ] { + changed |= ui.selectable_value(&mut body.body, kind, label).changed(); + } + }); + }); + }); + apply_component_card_response(world, entity, card_response); + if changed && body != original { + set_rigid_body_with_history(world, entity, body); + } +} + +pub(super) fn collider_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let mesh_candidates = static_mesh_asset_ref_candidates(world, AssetRefCandidateKind::Mesh); + let diagnostic_entry = diagnose_collider(world, entity); + let Some(mut collider) = world.get::(entity).cloned() else { + return; + }; + let original = collider.clone(); + let mut changed = false; + let renderer_meshes: Vec = world + .get::(entity) + .map(|renderer| { + renderer + .slots + .iter() + .map(|slot| slot.mesh.clone()) + .collect() + }) + .unwrap_or_default(); + + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_COLLIDER_DESC, "Collider", icons::SELECTION), + ); + let card_response = component_card(ui, &card, |ui| { + if let Some(entry) = diagnostic_entry.as_ref() { + let (label, color) = match entry.overlay_status { + ColliderOverlayStatus::Valid => ("Ready", egui::Color32::from_rgb(112, 210, 144)), + ColliderOverlayStatus::Trigger => { + ("Trigger", egui::Color32::from_rgb(86, 195, 235)) + } + ColliderOverlayStatus::Disabled => { + ("Disabled", egui::Color32::from_rgb(143, 151, 163)) + } + ColliderOverlayStatus::Warning => { + ("Warning", egui::Color32::from_rgb(242, 173, 72)) + } + ColliderOverlayStatus::Error => ("Invalid", egui::Color32::from_rgb(244, 91, 99)), + }; + ui.horizontal_wrapped(|ui| { + ui.colored_label(color, egui::RichText::new(label).strong()); + ui.label(egui::RichText::new(entry.shape_label).color(TEXT_DIM)); + if entry.runtime_ready { + ui.label(egui::RichText::new("Hydrated").color(TEXT_MUTED).small()); + } + }); + for diagnostic in &entry.diagnostics { + let color = match diagnostic.severity { + ColliderDiagnosticSeverity::Info => TEXT_MUTED, + ColliderDiagnosticSeverity::Warning => egui::Color32::from_rgb(242, 173, 72), + ColliderDiagnosticSeverity::Error => egui::Color32::from_rgb(244, 91, 99), + }; + ui.label( + egui::RichText::new(&diagnostic.message) + .color(color) + .small(), + ); + ui.label( + egui::RichText::new(&diagnostic.repair) + .color(TEXT_MUTED) + .small(), + ); + } + if entry.highest_severity() == Some(ColliderDiagnosticSeverity::Error) + && ui.small_button("Reset shape").clicked() + { + collider.shape = ColliderShapeDesc::default(); + collider.enabled = true; + changed = true; + } + ui.add_space(2.0); + } + property_row(ui, "Mode", |ui| { + changed |= ui.checkbox(&mut collider.enabled, "Enabled").changed(); + changed |= ui.checkbox(&mut collider.is_trigger, "Trigger").changed(); + }); + property_row(ui, "Shape", |ui| { + let mut shape_kind = collider_shape_kind(&collider.shape); + egui::ComboBox::from_id_salt(("collider_shape_kind", entity)) + .selected_text(shape_kind) + .show_ui(ui, |ui| { + for label in ["Box", "Sphere", "Capsule", "Static Mesh"] { + if ui.selectable_label(shape_kind == label, label).clicked() { + shape_kind = label; + } + } + }); + if shape_kind != collider_shape_kind(&collider.shape) { + collider.shape = + convert_collider_shape(&collider.shape, shape_kind, renderer_meshes.clone()); + changed = true; + } + }); + + match &mut collider.shape { + ColliderShapeDesc::Cuboid { + x_length, + y_length, + z_length, + } => { + changed |= dimension_drag(ui, "X", x_length); + changed |= dimension_drag(ui, "Y", y_length); + changed |= dimension_drag(ui, "Z", z_length); + } + ColliderShapeDesc::Sphere { radius } => { + changed |= dimension_drag(ui, "Radius", radius); + } + ColliderShapeDesc::Capsule { radius, height } => { + changed |= dimension_drag(ui, "Radius", radius); + changed |= dimension_drag(ui, "Height", height); + } + ColliderShapeDesc::StaticMesh { meshes, .. } => { + if meshes.is_empty() { + ui.label(egui::RichText::new("No mesh collider sources").color(TEXT_DIM)); + } + for mesh in meshes.iter_mut() { + let mesh_response = asset_selector_row( + ui, + "Mesh", + icons::CUBE, + Some(mesh), + None, + false, + &mesh_candidates, + None, + None, + AssetSelectorActions::Full, + ); + if let Some(selected) = mesh_response.selected { + *mesh = selected; + changed = true; + } + if mesh_response.locate { + locate_asset_ref(world, Some(mesh), &mesh_candidates); + } + } + if !renderer_meshes.is_empty() && ui.button("Use renderer meshes").clicked() { + *meshes = renderer_meshes.clone(); + changed = true; + } + } + } + }); + apply_component_card_response(world, entity, card_response); + + if changed && collider != original { + set_collider_with_history(world, entity, collider); + } +} + +pub(super) fn collider_shape_kind(shape: &ColliderShapeDesc) -> &'static str { + match shape { + ColliderShapeDesc::Cuboid { .. } => "Box", + ColliderShapeDesc::Sphere { .. } => "Sphere", + ColliderShapeDesc::Capsule { .. } => "Capsule", + ColliderShapeDesc::StaticMesh { .. } => "Static Mesh", + } +} + +pub(super) fn convert_collider_shape( + previous: &ColliderShapeDesc, + shape_kind: &str, + renderer_meshes: Vec, +) -> ColliderShapeDesc { + let dimensions = match previous { + ColliderShapeDesc::Cuboid { + x_length, + y_length, + z_length, + } => Vec3::new(*x_length, *y_length, *z_length), + ColliderShapeDesc::Sphere { radius } => Vec3::splat(*radius * 2.0), + ColliderShapeDesc::Capsule { radius, height } => { + Vec3::new(*radius * 2.0, *height, *radius * 2.0) + } + ColliderShapeDesc::StaticMesh { .. } => Vec3::ONE, + } + .max(Vec3::splat(0.001)); + + match shape_kind { + "Sphere" => ColliderShapeDesc::Sphere { + radius: dimensions.max_element() * 0.5, + }, + "Capsule" => ColliderShapeDesc::Capsule { + radius: dimensions.x.max(dimensions.z) * 0.5, + height: dimensions.y, + }, + "Static Mesh" => ColliderShapeDesc::static_mesh(renderer_meshes), + _ => ColliderShapeDesc::Cuboid { + x_length: dimensions.x, + y_length: dimensions.y, + z_length: dimensions.z, + }, + } +} + +pub(super) fn dimension_drag(ui: &mut egui::Ui, label: &str, value: &mut f32) -> bool { + property_row(ui, label, |ui| { + ui.add_sized( + [fit_width(ui, 72.0, 120.0), 20.0], + egui::DragValue::new(value) + .range(0.001..=10_000.0) + .speed(0.05) + .min_decimals(2) + .max_decimals(3), + ) + .changed() + }) +} + +pub(super) fn physics_editor_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let Some(mut body) = world.get::(entity).cloned() else { + return; + }; + let _original = body.clone(); + let mut changed = false; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_PHYSICS_BODY, "Physics", icons::SPHERE), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Body", |ui| { + ui.horizontal_wrapped(|ui| { + for (label, kind) in [ + ("Static", AuthoringRigidBody::Static), + ("Kinematic", AuthoringRigidBody::Kinematic), + ("Dynamic", AuthoringRigidBody::Dynamic), + ] { + if ui.selectable_label(body.body == kind, label).clicked() { + body.body = kind; + changed = true; + } + } + }); + }); + }); + apply_component_card_response(world, entity, card_response); + if changed { + set_physics_with_history(world, entity, body); + } +} + +pub(super) fn player_spawn_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + if world.get::(entity).is_none() { + return; + } + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable( + COMPONENT_PLAYER_SPAWN, + "Player Spawn", + icons::PERSON_SIMPLE_RUN, + ), + ); + let card_response = component_card(ui, &card, |ui| { + ui.label( + egui::RichText::new("Uses this actor transform as a player start.").color(TEXT_DIM), + ); + }); + apply_component_card_response(world, entity, card_response); +} + +pub(super) fn weapon_spawn_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let Some(mut spawn) = world.get::(entity).cloned() else { + return; + }; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_WEAPON_SPAWN, "Weapon Spawn", icons::CROSSHAIR), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Weapon ID", |ui| { + ui.add_sized( + [text_field_width(ui), 20.0], + egui::TextEdit::singleline(&mut spawn.weapon_id), + ); + }); + }); + apply_component_card_response(world, entity, card_response); + if let Ok(mut e) = world.get_entity_mut(entity) { + e.insert(spawn); + } +} + +pub(super) fn trigger_volume_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let Some(mut trigger) = world.get::(entity).cloned() else { + return; + }; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable( + COMPONENT_TRIGGER_VOLUME, + "Trigger Volume", + icons::SELECTION, + ), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Event", |ui| { + ui.add_sized( + [text_field_width(ui), 20.0], + egui::TextEdit::singleline(&mut trigger.event_name), + ); + }); + property_row(ui, "Half X", |ui| { + ui.add(egui::Slider::new(&mut trigger.half_extents.x, 0.1..=50.0)); + }); + property_row(ui, "Half Y", |ui| { + ui.add(egui::Slider::new(&mut trigger.half_extents.y, 0.1..=50.0)); + }); + property_row(ui, "Half Z", |ui| { + ui.add(egui::Slider::new(&mut trigger.half_extents.z, 0.1..=50.0)); + }); + }); + apply_component_card_response(world, entity, card_response); + if let Ok(mut e) = world.get_entity_mut(entity) { + e.insert(trigger); + } +} + +pub(super) fn team_spawn_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let Some(mut spawn) = world.get::(entity).cloned() else { + return; + }; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_TEAM_SPAWN, "Team Spawn", icons::FLAG), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Team", |ui| { + ui.add(egui::Slider::new(&mut spawn.team_id, 0..=8)); + }); + }); + apply_component_card_response(world, entity, card_response); + if let Ok(mut e) = world.get_entity_mut(entity) { + e.insert(spawn); + } +} + +pub(super) fn objective_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + let Some(mut marker) = world.get::(entity).cloned() else { + return; + }; + let card = component_card_context( + world, + entity, + ComponentCardOptions::removable(COMPONENT_OBJECTIVE_MARKER, "Objective", icons::TARGET), + ); + let card_response = component_card(ui, &card, |ui| { + property_row(ui, "Objective ID", |ui| { + ui.add_sized( + [text_field_width(ui), 20.0], + egui::TextEdit::singleline(&mut marker.objective_id), + ); + }); + }); + apply_component_card_response(world, entity, card_response); + if let Ok(mut e) = world.get_entity_mut(entity) { + e.insert(marker); + } +} + +pub(super) fn prefab_instance_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + crate::assets::prefab_overrides::prefab_instance_inspector_ui(world, ui, entity); +} diff --git a/crates/editor/src/ui/inspector/property_blocks.rs b/crates/editor/src/ui/inspector/property_blocks.rs new file mode 100644 index 0000000..2a8e223 --- /dev/null +++ b/crates/editor/src/ui/inspector/property_blocks.rs @@ -0,0 +1,655 @@ +use super::*; + +pub(super) fn plan_property_block_promotion( + world: &World, + entity: Entity, + base: &MaterialRef, + block: &MaterialPropertyBlock, + slot_name: &str, +) -> Result { + plan_material_instance_assignment(world, entity, base, block, slot_name, true) +} + +pub(super) fn plan_material_instance_assignment( + world: &World, + entity: Entity, + base: &MaterialRef, + block: &MaterialPropertyBlock, + slot_name: &str, + include_property_block: bool, +) -> Result { + let selected_path = base.0.source_path.as_deref().ok_or_else(|| { + "select a project Material before promoting this property block".to_string() + })?; + let project_root = world + .get_resource::() + .map(|workspace| PathBuf::from(&workspace.root)) + .unwrap_or_else(|| PathBuf::from(".")); + let selected_relative = project_relative_path(&project_root, Path::new(selected_path))?; + let selected_absolute = project_root.join(&selected_relative); + let (selected_text, selected_snapshot) = read_snapshotted_text(&selected_absolute)?; + let mut source_snapshots = vec![PromotionSourceSnapshot { + path: selected_absolute, + snapshot: selected_snapshot, + }]; + let (direct_base, mut parameters, mut textures, base_label, direct_base_asset) = if let Ok( + material, + ) = + ron::from_str::(&selected_text) + { + ( + base.clone(), + Vec::new(), + Vec::new(), + material.label.clone(), + material, + ) + } else if let Ok(instance) = ron::from_str::(&selected_text) { + let base_path = instance.base.0.source_path.as_deref().ok_or_else(|| { + "the selected Material Instance has no direct project base".to_string() + })?; + let base_relative = project_relative_path(&project_root, Path::new(base_path))?; + let base_absolute = project_root.join(base_relative); + let (base_text, base_snapshot) = read_snapshotted_text(&base_absolute)?; + let direct_base_asset = ron::from_str::(&base_text) + .map_err(|_| "the selected Material Instance base is missing or invalid".to_string())?; + source_snapshots.push(PromotionSourceSnapshot { + path: base_absolute, + snapshot: base_snapshot, + }); + ( + instance.base, + instance.overrides.values, + instance.overrides.textures, + instance.label, + direct_base_asset, + ) + } else { + return Err( + "Default Grid and imported source materials cannot be promotion bases; select a project Material first" + .to_string(), + ); + }; + let schema_path = direct_base_asset + .shader_ref + .as_ref() + .and_then(|reference| reference.source_path.as_deref()) + .or(direct_base_asset.shader.schema_path.as_deref()); + let schema = if let Some(schema_path) = schema_path { + let schema_relative = project_relative_path(&project_root, Path::new(schema_path))?; + let schema_absolute = project_root.join(schema_relative); + let (schema_text, schema_snapshot) = read_snapshotted_text(&schema_absolute)?; + source_snapshots.push(PromotionSourceSnapshot { + path: schema_absolute, + snapshot: schema_snapshot, + }); + Some( + ron::from_str::(&schema_text).map_err(|error| { + format!("the selected Material shader schema is invalid: {error}") + })?, + ) + } else { + None + }; + let custom_surface = schema + .as_ref() + .and_then(|schema| schema.wgsl_path.as_deref()) + .is_some(); + if include_property_block { + blacksite_surface::validate_property_block_for_promotion( + &project_root, + block, + schema.as_ref(), + custom_surface, + )?; + } + let variation_kind = if include_property_block { + "Override" + } else { + "Instance" + }; + let mut promoted = MaterialInstanceAsset { + schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, + label: format!("{base_label} {slot_name} {variation_kind}"), + base: direct_base, + overrides: shared::MaterialInputSet { + values: std::mem::take(&mut parameters), + textures: std::mem::take(&mut textures), + }, + }; + if include_property_block { + promoted.merge_overrides(block.parameters.clone(), block.textures.clone()); + } + + let current_folder = world + .get_resource::() + .map(|assets| assets.current_folder.clone()) + .unwrap_or_else(|| ASSETS_ROOT.to_string()); + let destination_folder = + if current_folder.starts_with(ASSETS_ROOT) && current_folder != BUILTINS_FOLDER { + PathBuf::from(current_folder) + } else { + selected_relative + .parent() + .map(Path::to_path_buf) + .unwrap_or_else(|| PathBuf::from(ASSETS_ROOT)) + }; + let stem: String = promoted + .label + .chars() + .map(|character| { + if character.is_ascii_alphanumeric() { + character.to_ascii_lowercase() + } else { + '_' + } + }) + .collect(); + let stem = stem.trim_matches('_').to_string(); + let mut index = 0usize; + let destination_path = loop { + let suffix = if index == 0 { + String::new() + } else { + format!("_{index}") + }; + let candidate = destination_folder.join(format!("{stem}{suffix}.material-instance.ron")); + if !project_root.join(&candidate).exists() { + break candidate; + } + index += 1; + }; + let bytes = ron::ser::to_string_pretty(&promoted, ron::ser::PrettyConfig::default()) + .map(String::into_bytes) + .map_err(|error| format!("could not serialize promoted Material Instance: {error}"))?; + let destination_absolute = project_root.join(&destination_path); + let target_snapshot = FileSnapshot::capture(&destination_absolute)?; + if target_snapshot != FileSnapshot::missing() { + return Err(format!( + "{} already exists; refresh the promotion review", + destination_path.display() + )); + } + Ok(PendingPropertyBlockPromotion { + entity, + slot_id: block.slot_id.clone(), + slot_name: slot_name.to_string(), + base: base.clone(), + block: block.clone(), + project_root, + destination_path, + destination_absolute, + target_snapshot, + source_snapshots, + instance: promoted, + bytes, + clear_property_block: include_property_block, + }) +} + +pub(super) fn read_snapshotted_text(path: &Path) -> Result<(String, FileSnapshot), String> { + let bytes = + fs::read(path).map_err(|error| format!("could not read {}: {error}", path.display()))?; + let snapshot = FileSnapshot::from_loaded_bytes(path, &bytes); + let text = String::from_utf8(bytes) + .map_err(|error| format!("{} is not UTF-8: {error}", path.display()))?; + Ok((text, snapshot)) +} + +pub(super) fn project_relative_path(project_root: &Path, path: &Path) -> Result { + let relative = if path.is_absolute() { + path.strip_prefix(project_root).map_err(|_| { + format!( + "{} is outside project root {}", + path.display(), + project_root.display() + ) + })? + } else { + path + }; + if relative.components().any(|component| { + matches!( + component, + std::path::Component::ParentDir | std::path::Component::RootDir + ) + }) || !relative.starts_with(ASSETS_ROOT) + { + return Err(format!( + "{} is not a safe project asset path", + path.display() + )); + } + Ok(relative.to_path_buf()) +} + +pub(super) fn validate_property_block_promotion( + world: &World, + promotion: &PendingPropertyBlockPromotion, +) -> Result<(), String> { + if promotion.clear_property_block { + let current_block = world + .get::(promotion.entity) + .and_then(|blocks| { + blocks + .slots + .iter() + .find(|block| block.slot_id == promotion.slot_id) + }) + .ok_or_else(|| "the runtime property block no longer exists".to_string())?; + if current_block != &promotion.block { + return Err( + "the runtime property block changed; refresh the promotion review".to_string(), + ); + } + } + let current_base = world + .get::(promotion.entity) + .and_then(|renderer| renderer.materials.slot(&promotion.slot_id)) + .and_then(|slot| slot.material.as_ref()) + .or_else(|| { + world + .get::(promotion.entity) + .and_then(|renderer| renderer.materials.slot(&promotion.slot_id)) + .and_then(|slot| slot.material.as_ref()) + }) + .or_else(|| { + world + .get::(promotion.entity) + .filter(|primitive| primitive.surface.id == promotion.slot_id) + .and_then(|primitive| primitive.surface.material.as_ref()) + }) + .ok_or_else(|| "the target renderer slot is missing or has no project base".to_string())?; + if current_base != &promotion.base { + return Err("the target renderer slot changed; refresh the promotion review".to_string()); + } + for source in &promotion.source_snapshots { + if FileSnapshot::capture(&source.path)? != source.snapshot { + return Err(format!( + "{} changed after the promotion review opened", + source.path.display() + )); + } + } + if FileSnapshot::capture(&promotion.destination_absolute)? != promotion.target_snapshot { + return Err(format!( + "{} changed after the promotion review opened", + promotion.destination_path.display() + )); + } + Ok(()) +} + +pub(super) fn commit_property_block_promotion( + world: &mut World, + promotion: &PendingPropertyBlockPromotion, +) -> Result { + validate_property_block_promotion(world, promotion)?; + let registry_path = promotion.project_root.join(content_pipeline::REGISTRY_PATH); + let runtime_catalog_path = promotion + .project_root + .join(content_pipeline::RUNTIME_CATALOG_PATH); + let registry_bytes_before = fs::read(®istry_path).ok(); + let runtime_catalog_bytes_before = fs::read(&runtime_catalog_path).ok(); + publish_authored_file( + world, + &promotion.destination_absolute, + &promotion.bytes, + &promotion.target_snapshot, + FileWriteIntent::MaterialInstance, + )?; + let normalized = promotion + .destination_path + .to_string_lossy() + .replace('\\', "/"); + let registry_before = world + .get_resource::() + .ok_or_else(|| "Asset registry is unavailable".to_string())? + .document(); + let registry_result = if let Some(mut registry) = world.get_resource_mut::() { + ensure_asset_record_at( + &mut registry, + &promotion.project_root, + normalized.clone(), + promotion.instance.label.clone(), + "MaterialInstance", + ) + .map(|record| record.id.as_string()) + } else { + Err("Asset registry is unavailable".to_string()) + }; + let id = match registry_result { + Ok(id) => id, + Err(error) => { + return match remove_published_file(&promotion.destination_absolute) { + Ok(()) => Err(error), + Err(rollback_error) => Err(format!("{error}; rollback failed: {rollback_error}")), + }; + } + }; + let reference = MaterialRef::new( + EditorAssetRef::new(id, "material:instance", promotion.instance.label.clone()) + .with_source_path(&normalized), + ); + let history_label = if promotion.clear_property_block { + "Promote Material Property Block" + } else { + "Create Material Instance and Assign" + }; + let transaction = if let Some(mut renderer) = + world.get::(promotion.entity).cloned() + { + let slot = renderer + .materials + .slot_mut(&promotion.slot_id) + .ok_or_else(|| "the target skinned renderer slot is missing".to_string())?; + slot.material = Some(reference); + reflected_component_transaction( + world, + promotion.entity, + history_label, + shared::AUTHORING_COMPONENT_SKINNED_MESH_RENDERER, + COMPONENT_SKINNED_MESH_RENDERER, + move |world, entity| { + world.entity_mut(entity).insert(renderer); + Ok(()) + }, + ) + } else if let Some(mut renderer) = world.get::(promotion.entity).cloned() { + let slot = renderer + .materials + .slot_mut(&promotion.slot_id) + .ok_or_else(|| "the target static renderer slot is missing".to_string())?; + slot.material = Some(reference); + reflected_component_transaction( + world, + promotion.entity, + history_label, + shared::AUTHORING_COMPONENT_STATIC_MESH_RENDERER, + COMPONENT_STATIC_MESH_RENDERER, + move |world, entity| { + world.entity_mut(entity).insert(renderer); + Ok(()) + }, + ) + } else if let Some(mut primitive) = world.get::(promotion.entity).cloned() { + if primitive.surface.id != promotion.slot_id { + return Err("the target primitive material slot is missing".into()); + } + primitive.surface.material = Some(reference); + reflected_component_transaction( + world, + promotion.entity, + history_label, + shared::AUTHORING_COMPONENT_PRIMITIVE, + COMPONENT_PRIMITIVE, + move |world, entity| { + world.entity_mut(entity).insert(primitive); + Ok(()) + }, + ) + } else { + Err("the target entity no longer has a supported renderer".to_string()) + }; + if let Err(error) = transaction { + let mut rollback_errors = Vec::new(); + if let Err(rollback_error) = remove_published_file(&promotion.destination_absolute) { + rollback_errors.push(rollback_error); + } + if let Some(mut registry) = world.get_resource_mut::() { + registry.schema_version = registry_before.schema_version; + registry.defaults = registry_before.defaults; + registry.records = registry_before.records; + registry.index_dirty = false; + } + if let Err(rollback_error) = + restore_optional_file(®istry_path, registry_bytes_before.as_deref()) + { + rollback_errors.push(rollback_error); + } + if let Err(rollback_error) = restore_optional_file( + &runtime_catalog_path, + runtime_catalog_bytes_before.as_deref(), + ) { + rollback_errors.push(rollback_error); + } + if !rollback_errors.is_empty() { + return Err(format!( + "{error}; promotion rollback failed: {}", + rollback_errors.join("; ") + )); + } + return Err(error); + } + if promotion.clear_property_block { + clear_promoted_property_block(world, promotion.entity, &promotion.slot_id); + } + Ok(promotion.destination_path.clone()) +} + +pub(super) fn remove_published_file(path: &Path) -> Result<(), String> { + match fs::remove_file(path) { + Ok(()) => Ok(()), + Err(error) if error.kind() == std::io::ErrorKind::NotFound => Ok(()), + Err(error) => Err(format!("could not remove {}: {error}", path.display())), + } +} + +pub(super) fn restore_optional_file(path: &Path, bytes: Option<&[u8]>) -> Result<(), String> { + if let Some(bytes) = bytes { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent) + .map_err(|error| format!("could not create {}: {error}", parent.display()))?; + } + fs::write(path, bytes) + .map_err(|error| format!("could not restore {}: {error}", path.display())) + } else { + remove_published_file(path) + } +} + +pub(super) fn clear_promoted_property_block( + world: &mut World, + entity: Entity, + slot_id: &ComponentInstanceId, +) { + let mut remove_component = false; + if let Some(mut blocks) = world.get_mut::(entity) { + blocks.slots.retain(|block| &block.slot_id != slot_id); + remove_component = blocks.slots.is_empty(); + } + if remove_component { + world.entity_mut(entity).remove::(); + } +} + +pub(super) fn property_block_promotion_ui( + ui: &mut egui::Ui, + block: Option<&MaterialPropertyBlock>, + has_project_base: bool, +) -> bool { + let Some(block) = block else { + return false; + }; + ui.separator(); + ui.small( + egui::RichText::new(format!( + "Runtime overrides: {} parameters, {} textures", + block.parameters.len(), + block.textures.len() + )) + .color(TEXT_DIM), + ); + let clicked = ui + .add_enabled( + has_project_base, + egui::Button::new("Promote to Material Instance"), + ) + .clicked(); + if !has_project_base { + ui.small( + egui::RichText::new("Assign a project Material or Instance first").color(TEXT_MUTED), + ); + } + clicked +} + +pub(super) fn open_property_block_promotion_review( + world: &mut World, + entity: Entity, + slot_id: ComponentInstanceId, + slot_name: String, + base: MaterialRef, + block: MaterialPropertyBlock, +) { + if slot_id != block.slot_id { + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = "the runtime property block targets a different slot".to_string(); + } + return; + } + match plan_property_block_promotion(world, entity, &base, &block, &slot_name) { + Ok(pending) => { + let mut review = world.resource_mut::(); + review.pending = Some(pending); + review.error = None; + } + Err(error) => { + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = error; + } + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(super) enum PromotionReviewAction { + Cancel, + Refresh, + Commit, +} + +pub(crate) fn property_block_promotion_review_ui(world: &mut World, context: &egui::Context) { + let (pending, error) = { + let review = world.resource::(); + (review.pending.clone(), review.error.clone()) + }; + let Some(pending) = pending else { + return; + }; + let mut action = context + .input(|input| input.key_pressed(egui::Key::Escape)) + .then_some(PromotionReviewAction::Cancel); + egui::Window::new("Promote Material Property Block") + .id(egui::Id::new("property_block_promotion_review")) + .collapsible(false) + .resizable(true) + .default_width(560.0) + .anchor(egui::Align2::CENTER_CENTER, egui::Vec2::ZERO) + .show(context, |ui| { + ui.label( + "Review the exact reusable Material Instance before publishing the slot assignment.", + ); + ui.add_space(8.0); + egui::Grid::new("property_block_promotion_summary") + .num_columns(2) + .spacing([12.0, 6.0]) + .show(ui, |ui| { + ui.label("Slot"); + ui.label(format!("{} ({})", pending.slot_name, pending.slot_id.0)); + ui.end_row(); + ui.label("Selected base"); + ui.label(&pending.base.0.label); + ui.end_row(); + ui.label("Direct base"); + ui.label(&pending.instance.base.0.label); + ui.end_row(); + ui.label("Target"); + ui.add( + egui::Label::new(pending.destination_path.display().to_string()).wrap(), + ); + ui.end_row(); + ui.label("Sparse overrides"); + ui.label(format!( + "{} parameters, {} textures", + pending.instance.overrides.values.len(), + pending.instance.overrides.textures.len() + )); + ui.end_row(); + }); + ui.add_space(8.0); + ui.small( + egui::RichText::new( + "The runtime block remains active until the file, registry record, and exact scene slot all commit successfully.", + ) + .color(TEXT_DIM), + ); + if let Some(error) = error.as_deref() { + ui.add_space(8.0); + ui.colored_label(egui::Color32::LIGHT_RED, error); + } + ui.add_space(12.0); + ui.horizontal(|ui| { + if ui.button("Cancel").clicked() { + action = Some(PromotionReviewAction::Cancel); + } + if ui.button("Refresh Review").clicked() { + action = Some(PromotionReviewAction::Refresh); + } + if ui + .button("Create Instance and Assign Slot") + .clicked() + { + action = Some(PromotionReviewAction::Commit); + } + }); + }); + match action { + Some(PromotionReviewAction::Cancel) => { + let mut review = world.resource_mut::(); + review.pending = None; + review.error = None; + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = "Property block promotion cancelled".to_string(); + } + } + Some(PromotionReviewAction::Refresh) => match plan_property_block_promotion( + world, + pending.entity, + &pending.base, + &pending.block, + &pending.slot_name, + ) { + Ok(refreshed) => { + let mut review = world.resource_mut::(); + review.pending = Some(refreshed); + review.error = None; + } + Err(error) => world.resource_mut::().error = Some(error), + }, + Some(PromotionReviewAction::Commit) => { + match commit_property_block_promotion(world, &pending) { + Ok(path) => { + let mut review = world.resource_mut::(); + review.pending = None; + review.error = None; + world.resource_mut::().refresh(); + invalidate_on_catalog_refresh(world); + if let Some(mut scene_io) = world.get_resource_mut::() + { + scene_io.status = format!("Promoted property block to {}", path.display()); + } + } + Err(error) => { + world.resource_mut::().error = + Some(error.clone()); + if let Some(mut scene_io) = world.get_resource_mut::() + { + scene_io.status = error; + } + } + } + } + None => {} + } +} diff --git a/crates/editor/src/ui/inspector/renderer_panel.rs b/crates/editor/src/ui/inspector/renderer_panel.rs new file mode 100644 index 0000000..7bf6195 --- /dev/null +++ b/crates/editor/src/ui/inspector/renderer_panel.rs @@ -0,0 +1,124 @@ +//! Penpot renderer-panel chrome shared by static renderer entries. + +use super::*; + +const EXPANDED_RENDERER_HEADER_HEIGHT: f32 = 84.0; +const COLLAPSED_RENDERER_HEADER_HEIGHT: f32 = 58.0; + +pub(super) fn renderer_panel(ui: &mut egui::Ui, add_contents: impl FnOnce(&mut egui::Ui)) { + egui::Frame::new() + .fill(WIDGET_BG.linear_multiply(0.82)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) + .corner_radius(egui::CornerRadius::same(5)) + .show(ui, |ui| { + ui.set_max_width(ui.available_width()); + add_contents(ui); + }); + ui.add_space(10.0); +} + +pub(super) fn renderer_panel_header( + ui: &mut egui::Ui, + index: usize, + slot_name: &str, + texture_id: Option, + open: &mut bool, + add_actions: impl FnOnce(&mut egui::Ui), +) { + let palette = crate::ui::design_system::palette(ui); + let height = if *open { + EXPANDED_RENDERER_HEADER_HEIGHT + } else { + COLLAPSED_RENDERER_HEADER_HEIGHT + }; + let (rect, header_response) = ui.allocate_exact_size( + egui::vec2(ui.available_width().max(1.0), height), + egui::Sense::click(), + ); + ui.painter().rect_filled( + egui::Rect::from_min_size( + rect.min + egui::vec2(6.0, 8.0), + egui::vec2(3.0, height - 16.0), + ), + 2.0, + palette.accent, + ); + ui.painter().text( + rect.left_center() + egui::vec2(20.0, 0.0), + egui::Align2::CENTER_CENTER, + if *open { + icons::CARET_DOWN.as_str() + } else { + icons::CARET_RIGHT.as_str() + }, + egui::FontId::new(12.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.text_secondary, + ); + let preview_size = if *open { 58.0 } else { 40.0 }; + let preview = egui::Rect::from_center_size( + egui::pos2(rect.left() + 63.0, rect.center().y), + egui::vec2(preview_size, preview_size), + ); + ui.painter().rect( + preview, + 4.0, + PANEL_BG_DARK, + egui::Stroke::new(1.0_f32, BORDER), + egui::StrokeKind::Inside, + ); + if let Some(texture_id) = texture_id { + ui.painter().image( + texture_id, + preview.shrink(3.0), + egui::Rect::from_min_max(egui::Pos2::ZERO, egui::pos2(1.0, 1.0)), + egui::Color32::WHITE, + ); + } + let label = if slot_name.trim().is_empty() { + "Mesh renderer" + } else { + slot_name.trim() + }; + ui.painter().text( + egui::pos2(rect.left() + 104.0, rect.center().y - 8.0), + egui::Align2::LEFT_CENTER, + label, + crate::ui::design_system::typography::TypeRole::Title.font(), + palette.text_primary, + ); + ui.painter().text( + egui::pos2(rect.left() + 104.0, rect.center().y + 10.0), + egui::Align2::LEFT_CENTER, + format!("Renderer {index}"), + crate::ui::design_system::typography::TypeRole::Small.font(), + palette.text_muted, + ); + let action_rect = egui::Rect::from_min_size( + egui::pos2(rect.right() - 150.0, rect.center().y - 14.0), + egui::vec2(140.0, 28.0), + ); + ui.scope_builder(egui::UiBuilder::new().max_rect(action_rect), |ui| { + ui.with_layout( + egui::Layout::right_to_left(egui::Align::Center), + add_actions, + ); + }); + if header_response.clicked() + && ui + .input(|input| input.pointer.interact_pos()) + .is_some_and(|pointer| !preview.contains(pointer) && !action_rect.contains(pointer)) + { + *open = !*open; + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn renderer_headers_match_current_penpot_heights() { + assert_eq!(EXPANDED_RENDERER_HEADER_HEIGHT, 84.0); + assert_eq!(COLLAPSED_RENDERER_HEADER_HEIGHT, 58.0); + } +} diff --git a/crates/editor/src/ui/inspector/sun_textures.rs b/crates/editor/src/ui/inspector/sun_textures.rs new file mode 100644 index 0000000..6e47920 --- /dev/null +++ b/crates/editor/src/ui/inspector/sun_textures.rs @@ -0,0 +1,326 @@ +use super::*; + +pub fn project_sun_ui(world: &mut World, ui: &mut egui::Ui, entity: Entity) { + if world.get::(entity).is_none() { + return; + } + + let rendering = world + .resource::() + .rendering + .clone(); + let scene_override_active = has_scene_sun_override(world); + let mut create_override = false; + let mut options = ComponentCardOptions::fixed(COMPONENT_PROJECT_SUN, "Project Sun", icons::SUN); + options.resettable = false; + let card = component_card_context(world, entity, options); + let card_response = component_card(ui, &card, |ui| { + ui.label("Runtime default world lighting from assets/project.ron."); + property_row(ui, "Illuminance", |ui| { + ui.small(format!("{:.0} lux", rendering.sun_illuminance)); + }); + property_row(ui, "Ambient", |ui| { + ui.small(format!( + "{:.2}, {:.2}, {:.2} @ {:.1}", + rendering.ambient_color[0], + rendering.ambient_color[1], + rendering.ambient_color[2], + rendering.ambient_brightness + )); + }); + property_row(ui, "Shadows", |ui| { + ui.small(format!( + "{} cascades, max {:.0}m", + rendering.shadow_cascades, rendering.shadow_max_distance + )); + }); + if scene_override_active { + ui.label(egui::RichText::new("Scene sun override is active.").weak()); + } else if ui.button("Create Scene Sun Override").clicked() { + create_override = true; + } + }); + apply_component_card_response(world, entity, card_response); + + if create_override { + let sun = create_scene_sun_override_from_project_settings(world); + crate::ui::request_ui_selection(world, &[sun]); + } +} + +pub(super) fn has_scene_sun_override(world: &mut World) -> bool { + world + .query_filtered::<( + &shared::LightDesc, + Option<&AuthoringComponentStates>, + Option<&InspectorOrder>, + ), With>() + .iter(world) + .any(|(light, states, legacy_order)| { + authoring_component_active(states, legacy_order, COMPONENT_LIGHT_DESC) + && matches!(light.kind, shared::AuthoringLightKind::Directional) + }) +} + +pub(super) fn texture_asset_picker_ui( + world: &mut World, + ui: &mut egui::Ui, + label: &str, + value: &mut Option, + candidates: &[TextureAssetCandidate], +) -> bool { + let current_path = value.clone(); + let dragging_selection = world + .get_resource::() + .and_then(|assets| assets.dragging_selection().cloned()); + let drop_candidate = dragging_selection + .as_ref() + .and_then(|selection| texture_path_from_selection(world, selection)); + let mut selected_path: Option = None; + let mut clear = false; + let mut locate = false; + let mut accepted_drop = false; + let current_candidate = current_path.as_ref().and_then(|path| { + candidates + .iter() + .find(|candidate| candidate.path == *path) + .cloned() + }); + + property_row(ui, label, |ui| { + let control_width = ui + .available_width() + .max(MIN_INLINE_CONTROL_WIDTH.min(ui.available_width().max(1.0))); + let row_height = 30.0; + let (rect, _response) = + ui.allocate_exact_size(egui::vec2(control_width, row_height), egui::Sense::hover()); + let valid_drag = drop_candidate.is_some(); + let row_hovered = ui.rect_contains_pointer(rect); + let drop_hovered = valid_drag && row_hovered; + let stroke = if drop_hovered { + egui::Stroke::new(2.0_f32, egui::Color32::from_rgb(125, 198, 255)) + } else if valid_drag { + egui::Stroke::new(1.0_f32, egui::Color32::from_rgb(58, 88, 122)) + } else if row_hovered { + egui::Stroke::new(1.0_f32, egui::Color32::from_rgb(92, 102, 118)) + } else { + egui::Stroke::new(1.0_f32, BORDER) + }; + let fill = if drop_hovered { + egui::Color32::from_rgb(29, 57, 86) + } else if valid_drag { + WIDGET_BG.linear_multiply(0.88) + } else if row_hovered { + WIDGET_BG.linear_multiply(1.05) + } else { + WIDGET_BG.linear_multiply(0.75) + }; + ui.painter() + .rect(rect, 4.0, fill, stroke, egui::StrokeKind::Inside); + if drop_hovered { + let badge_rect = egui::Rect::from_min_size( + rect.right_top() + egui::vec2(-82.0, 4.0), + egui::vec2(74.0, 16.0), + ); + ui.painter().rect( + badge_rect, + 3.0, + egui::Color32::from_rgb(35, 95, 155), + egui::Stroke::NONE, + egui::StrokeKind::Inside, + ); + ui.painter().text( + badge_rect.center(), + egui::Align2::CENTER_CENTER, + "Drop texture", + egui::FontId::new(10.0, egui::FontFamily::Proportional), + egui::Color32::from_rgb(225, 241, 255), + ); + } + + let mut child = ui.new_child( + egui::UiBuilder::new() + .max_rect(rect.shrink2(egui::vec2(6.0, 4.0))) + .layout(egui::Layout::left_to_right(egui::Align::Center)), + ); + child.set_clip_rect(rect.intersect(ui.clip_rect())); + let preview_size = 22.0; + let (preview_rect, _preview_response) = + child.allocate_exact_size(egui::vec2(preview_size, preview_size), egui::Sense::hover()); + child.painter().rect( + preview_rect, + 3.0, + PANEL_BG_DARK, + egui::Stroke::new(1.0_f32, BORDER), + egui::StrokeKind::Inside, + ); + if let Some(texture_id) = current_candidate + .as_ref() + .and_then(|candidate| candidate.texture_id) + { + let uv = egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)); + child.painter().image( + texture_id, + preview_rect.shrink(1.0), + uv, + egui::Color32::WHITE, + ); + } else { + child.painter().text( + preview_rect.center(), + egui::Align2::CENTER_CENTER, + icons::IMAGE.as_str(), + egui::FontId::new(12.0, egui::FontFamily::Name("phosphor-regular".into())), + TEXT_DIM, + ); + } + + let action_width = 92.0; + let text_width = (child.available_width() - action_width).max(1.0); + child.allocate_ui_with_layout( + egui::vec2(text_width, 22.0), + egui::Layout::left_to_right(egui::Align::Center), + |ui| { + let display_label = current_candidate + .as_ref() + .map(|candidate| candidate.label.as_str()) + .or(current_path.as_deref()) + .unwrap_or("(none)"); + ui.add_sized( + [text_width, 20.0], + egui::Label::new(egui::RichText::new(display_label).color( + if current_path.is_some() { + TEXT_DIM.linear_multiply(1.45) + } else { + TEXT_DIM + }, + )) + .truncate(), + ); + }, + ); + + child.allocate_ui_with_layout( + egui::vec2(action_width, 28.0), + egui::Layout::right_to_left(egui::Align::Center), + |ui| { + let clear_response = ui.add_enabled( + current_path.is_some(), + egui::Button::new(phosphor_icon(icons::X, 16.0)) + .frame(false) + .min_size(egui::vec2(22.0, 22.0)), + ); + if clear_response.on_hover_text("Clear texture").clicked() { + clear = true; + } + let locate_response = ui.add_enabled( + current_path.is_some(), + egui::Button::new(phosphor_icon(icons::CROSSHAIR, 16.0)) + .frame(false) + .min_size(egui::vec2(22.0, 22.0)), + ); + if locate_response + .on_hover_text("Locate in content browser") + .clicked() + { + locate = true; + } + if candidates.is_empty() { + ui.add_enabled( + false, + egui::Button::new(phosphor_icon(icons::FOLDER_OPEN, 16.0)) + .frame(false) + .min_size(egui::vec2(22.0, 22.0)), + ) + .on_hover_text("No texture assets available"); + } else { + let menu = ui.menu_button(phosphor_icon(icons::FOLDER_OPEN, 16.0), |ui| { + ui.set_min_width(240.0); + for candidate in candidates { + let selected = current_path.as_deref() == Some(candidate.path.as_str()); + if ui + .selectable_label(selected, candidate.label.as_str()) + .on_hover_text(candidate.path.as_str()) + .clicked() + { + selected_path = Some(candidate.path.clone()); + ui.close(); + } + } + }); + menu.response.on_hover_text("Browse textures"); + } + }, + ); + + if drop_hovered && ui.input(|input| input.pointer.any_released()) { + if let Some(candidate) = drop_candidate.as_ref() { + selected_path = Some(candidate.path.clone()); + accepted_drop = true; + } + } + }); + + if locate { + locate_texture_asset(world, current_path.as_deref(), candidates); + } + if accepted_drop { + if let Some(mut assets) = world.get_resource_mut::() { + assets.clear_drag(); + } + } + if clear { + *value = None; + return current_path.is_some(); + } + if let Some(path) = selected_path { + let changed = current_path.as_deref() != Some(path.as_str()); + *value = Some(path); + return changed; + } + + false +} + +pub(super) fn locate_texture_asset( + world: &mut World, + path: Option<&str>, + candidates: &[TextureAssetCandidate], +) { + let Some(path) = path else { + return; + }; + let Some(candidate) = candidates.iter().find(|candidate| candidate.path == path) else { + if let Some(mut scene_io) = world.get_resource_mut::() { + scene_io.status = format!("Could not locate texture {path}"); + } + return; + }; + + reveal_asset_in_browser(world, &candidate.folder_path, &candidate.selection); +} + +pub(super) fn option_string_ui(ui: &mut egui::Ui, label: &str, value: &mut Option) -> bool { + let mut text = value.clone().unwrap_or_default(); + let before = text.clone(); + property_row(ui, label, |ui| { + ui.horizontal_wrapped(|ui| { + let clear_width = 52.0; + let field_width = (ui.available_width() - clear_width - ui.spacing().item_spacing.x) + .max(MIN_INLINE_CONTROL_WIDTH.min(ui.available_width().max(1.0))) + .min(TEXT_FIELD_MAX_WIDTH) + .min(ui.available_width().max(1.0)); + ui.add_sized([field_width, 20.0], egui::TextEdit::singleline(&mut text)); + if ui.button("Clear").clicked() { + text.clear(); + } + }); + }); + let changed = before != text; + *value = if text.trim().is_empty() { + None + } else { + Some(text) + }; + changed +} diff --git a/crates/editor/src/ui/inspector/tests/a.rs b/crates/editor/src/ui/inspector/tests/a.rs new file mode 100644 index 0000000..e04b728 --- /dev/null +++ b/crates/editor/src/ui/inspector/tests/a.rs @@ -0,0 +1,228 @@ + use crate::assets::EditorAsset; + use crate::history::{apply_command_undo, EditorHistory}; + use crate::ui::{DockTabRequest, UiState}; + + #[test] + fn component_collapse_persists_while_ui_state_is_scoped_out() { + let mut world = World::new(); + world.init_resource::(); + world.init_resource::(); + let entity = world + .spawn((ActorId::new("collapsed-component"), Transform::IDENTITY)) + .id(); + world.insert_resource(UiState::default_layout()); + + world.resource_scope::(|world, _ui_state| { + assert!(!world.contains_resource::()); + apply_component_card_response( + world, + entity, + ComponentCardResponse { + type_name: COMPONENT_TRANSFORM, + collapsed: Some(true), + ..Default::default() + }, + ); + let context = component_card_context( + world, + entity, + ComponentCardOptions::fixed(COMPONENT_TRANSFORM, "Transform", icons::CUBE), + ); + assert!(context.collapsed); + }); + } + + #[test] + fn locate_texture_requests_asset_browser_while_ui_state_is_scoped_out() { + let path = "assets/textures/scoped-locate.png"; + let folder = "assets/textures"; + let selection = AssetSelection::File(path.to_string()); + let mut world = World::new(); + world.insert_resource(EditorAssets { + folders: Vec::new(), + assets: vec![EditorAsset { + label: "Scoped Locate".into(), + path: Some(path.into()), + folder_path: folder.into(), + kind: EditorAssetKind::Texture, + }], + current_folder: crate::assets::ASSETS_ROOT.into(), + selected: None, + selections: Vec::new(), + selection_anchor: None, + dragging: None, + status: String::new(), + catalog_revision: 1, + }); + world.init_resource::(); + world.insert_resource(UiState::default_layout()); + let candidate = TextureAssetCandidate { + label: "Scoped Locate".into(), + path: path.into(), + folder_path: folder.into(), + selection: selection.clone(), + texture_id: None, + }; + + world.resource_scope::(|world, _ui_state| { + assert!(!world.contains_resource::()); + locate_texture_asset(world, Some(path), &[candidate]); + }); + + let assets = world.resource::(); + assert_eq!(assets.current_folder, folder); + assert_eq!(assets.selected.as_ref(), Some(&selection)); + assert_eq!( + world.resource::().0, + Some(EditorTab::AssetBrowser) + ); + } + + #[test] + fn shape_switch_preserves_dimensions_and_is_one_undoable_edit() { + let mut world = World::new(); + world.init_resource::(); + let original = ColliderDesc::static_cuboid(Vec3::new(2.0, 4.0, 6.0)); + let entity = world.spawn((LevelObject, original.clone())).id(); + + let sphere = ColliderDesc { + shape: convert_collider_shape(&original.shape, "Sphere", Vec::new()), + ..original.clone() + }; + assert_eq!(sphere.shape, ColliderShapeDesc::Sphere { radius: 3.0 }); + + set_collider_with_history(&mut world, entity, sphere.clone()); + assert_eq!(world.resource::().undo_depth(), 1); + assert_eq!(world.get::(entity), Some(&sphere)); + + apply_command_undo(&mut world); + assert_eq!(world.get::(entity), Some(&original)); + } + + fn promotion_test_root(label: &str) -> PathBuf { + let nonce = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap() + .as_nanos(); + std::env::temp_dir().join(format!( + "blacksite-property-promotion-{label}-{}-{nonce}", + std::process::id() + )) + } + + fn promotion_test_world( + root: &Path, + ) -> ( + App, + Entity, + ComponentInstanceId, + MaterialRef, + MaterialPropertyBlock, + ) { + let material_folder = root.join("assets/materials"); + std::fs::create_dir_all(&material_folder).unwrap(); + let base_reference = MaterialRef::new( + EditorAssetRef::new("material-id", "material:source", "Promotion Base") + .with_source_path("assets/materials/promotion_base.ron"), + ); + let base_asset = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: "Promotion Base".into(), + shader: shared::ShaderRefDesc::default(), + shader_ref: None, + render_state: shared::MaterialRenderState::default(), + provenance: None, + inputs: shared::MaterialInputSet::default(), + }; + std::fs::write( + material_folder.join("promotion_base.ron"), + ron::ser::to_string_pretty(&base_asset, ron::ser::PrettyConfig::default()).unwrap(), + ) + .unwrap(); + let selected_reference = MaterialRef::new( + EditorAssetRef::new("instance-id", "material:instance", "Promotion Variant") + .with_source_path("assets/materials/promotion_variant.material-instance.ron"), + ); + let selected_instance = MaterialInstanceAsset { + schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, + label: "Promotion Variant".into(), + base: base_reference.clone(), + overrides: shared::MaterialInputSet { + values: vec![MaterialParameter { + name: "roughness".into(), + value: MaterialParameterValue::Float(0.4), + }], + textures: Vec::new(), + }, + }; + std::fs::write( + material_folder.join("promotion_variant.material-instance.ron"), + ron::ser::to_string_pretty(&selected_instance, ron::ser::PrettyConfig::default()) + .unwrap(), + ) + .unwrap(); + + let mut app = App::new(); + app.add_plugins(shared::SharedTypesPlugin); + let world = app.world_mut(); + world.init_resource::(); + world.init_resource::(); + world.insert_resource(ProjectWorkspace { + root: root.to_string_lossy().into_owned(), + project_id: "promotion-test".into(), + project_kind: settings::ProjectKind::Game, + last_opened_scene: None, + settings_path: "assets/project.ron".into(), + settings_dirty: false, + layout_dirty: false, + }); + world.insert_resource(EditorAssets { + folders: Vec::new(), + assets: Vec::new(), + current_folder: "assets/materials".into(), + selected: None, + selections: Vec::new(), + selection_anchor: None, + dragging: None, + status: String::new(), + catalog_revision: 1, + }); + world.insert_resource(AssetRegistry::default()); + let slot_id = ComponentInstanceId::new("slot:body"); + let renderer = StaticMeshRenderer { + slots: Vec::new(), + materials: shared::RendererMaterialSet { + slots: vec![shared::RendererMaterialSlot { + id: slot_id.clone(), + name: "Body".into(), + material: Some(selected_reference.clone()), + }], + orphaned_assignments: Vec::new(), + }, + }; + let block = MaterialPropertyBlock { + slot_id: slot_id.clone(), + parameters: vec![ + MaterialParameter { + name: "roughness".into(), + value: MaterialParameterValue::Float(0.8), + }, + MaterialParameter { + name: "metallic".into(), + value: MaterialParameterValue::Float(0.2), + }, + ], + textures: Vec::new(), + }; + let entity = world + .spawn(( + LevelObject, + ActorKind::StaticMesh, + renderer, + MaterialPropertyBlocks { + slots: vec![block.clone()], + }, + )) + .id(); + (app, entity, slot_id, selected_reference, block) + } diff --git a/crates/editor/src/ui/inspector/tests/b.rs b/crates/editor/src/ui/inspector/tests/b.rs new file mode 100644 index 0000000..a9b17da --- /dev/null +++ b/crates/editor/src/ui/inspector/tests/b.rs @@ -0,0 +1,228 @@ +#[test] + fn property_block_promotion_is_direct_base_exact_slot_and_one_history_edit() { + let root = promotion_test_root("success"); + let (mut app, entity, slot_id, selected_reference, block) = promotion_test_world(&root); + let world = app.world_mut(); + let promotion = + plan_property_block_promotion(world, entity, &selected_reference, &block, "Body") + .unwrap(); + assert!(!promotion.destination_absolute.exists()); + assert_eq!(promotion.instance.base.0.asset_id, "material-id"); + assert_eq!(promotion.instance.overrides.values.len(), 2); + + let published = commit_property_block_promotion(world, &promotion).unwrap(); + + assert_eq!(published, promotion.destination_path); + assert!(promotion.destination_absolute.exists()); + assert!(world.get::(entity).is_none()); + assert_eq!(world.resource::().undo_depth(), 1); + let renderer = world.get::(entity).unwrap(); + let assigned = renderer + .materials + .slot(&slot_id) + .unwrap() + .material + .as_ref() + .unwrap(); + assert_eq!(assigned.0.sub_asset_id, "material:instance"); + assert_eq!( + assigned.0.source_path.as_deref(), + Some(published.to_str().unwrap()) + ); + let authored = + MaterialInstanceAsset::load_from_path(promotion.destination_absolute.to_str().unwrap()) + .unwrap(); + assert_eq!(authored.base.0.asset_id, "material-id"); + assert_eq!(authored.overrides, promotion.instance.overrides); + assert!(world + .resource::() + .records + .iter() + .any(|record| record.path == published.to_string_lossy())); + + apply_command_undo(world); + let restored = world + .get::(entity) + .unwrap() + .materials + .slot(&slot_id) + .unwrap() + .material + .as_ref() + .unwrap(); + assert_eq!(restored, &selected_reference); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn create_instance_and_assign_keeps_runtime_block_and_uses_one_scene_history_edit() { + let root = promotion_test_root("create-instance"); + let (mut app, entity, slot_id, selected_reference, block) = promotion_test_world(&root); + let empty = MaterialPropertyBlock { + slot_id: slot_id.clone(), + parameters: Vec::new(), + textures: Vec::new(), + }; + let world = app.world_mut(); + let transaction = plan_material_instance_assignment( + world, + entity, + &selected_reference, + &empty, + "Body", + false, + ) + .unwrap(); + assert!(!transaction.clear_property_block); + assert!(transaction.instance.label.ends_with("Body Instance")); + assert_eq!(transaction.instance.overrides.values.len(), 1); + + let published = commit_property_block_promotion(world, &transaction).unwrap(); + + assert!(transaction.destination_absolute.exists()); + assert_eq!(world.resource::().undo_depth(), 1); + assert_eq!( + world + .get::(entity) + .and_then(|blocks| blocks.slots.first()), + Some(&block) + ); + let assigned = world + .get::(entity) + .unwrap() + .materials + .slot(&slot_id) + .unwrap() + .material + .as_ref() + .unwrap(); + assert_eq!(assigned.0.source_path.as_deref(), published.to_str()); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn property_block_promotion_cancel_and_external_conflict_are_non_mutating() { + let root = promotion_test_root("conflict"); + let (mut app, entity, slot_id, selected_reference, block) = promotion_test_world(&root); + let world = app.world_mut(); + let promotion = + plan_property_block_promotion(world, entity, &selected_reference, &block, "Body") + .unwrap(); + + assert_eq!(world.resource::().undo_depth(), 0); + assert_eq!(world.resource::().records.len(), 0); + assert_eq!( + world.get::(entity).unwrap().slots, + vec![block.clone()] + ); + assert_eq!( + world + .get::(entity) + .unwrap() + .materials + .slot(&slot_id) + .unwrap() + .material + .as_ref(), + Some(&selected_reference) + ); + + std::fs::write(&promotion.destination_absolute, b"external owner").unwrap(); + let error = commit_property_block_promotion(world, &promotion).unwrap_err(); + assert!(error.contains("changed after the promotion review")); + assert_eq!( + std::fs::read(&promotion.destination_absolute).unwrap(), + b"external owner" + ); + assert_eq!(world.resource::().undo_depth(), 0); + assert_eq!(world.resource::().records.len(), 0); + assert_eq!( + world.get::(entity).unwrap().slots, + vec![block] + ); + assert_eq!( + world + .get::(entity) + .unwrap() + .materials + .slot(&slot_id) + .unwrap() + .material + .as_ref(), + Some(&selected_reference) + ); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn property_block_promotion_rejects_invalid_and_stale_runtime_inputs() { + let root = promotion_test_root("invalid"); + let (mut app, entity, _slot_id, selected_reference, block) = promotion_test_world(&root); + let world = app.world_mut(); + let mut invalid = block.clone(); + invalid.parameters.push(MaterialParameter { + name: "undeclared_standard_property".into(), + value: MaterialParameterValue::Float(0.5), + }); + let error = + plan_property_block_promotion(world, entity, &selected_reference, &invalid, "Body") + .unwrap_err(); + assert!(error.contains("not supported by Standard materials")); + assert_eq!(world.resource::().undo_depth(), 0); + assert_eq!(world.resource::().records.len(), 0); + + let promotion = + plan_property_block_promotion(world, entity, &selected_reference, &block, "Body") + .unwrap(); + std::fs::write( + root.join("assets/materials/promotion_variant.material-instance.ron"), + b"externally changed", + ) + .unwrap(); + let error = commit_property_block_promotion(world, &promotion).unwrap_err(); + assert!(error.contains("changed after the promotion review")); + assert!(!promotion.destination_absolute.exists()); + assert_eq!(world.resource::().undo_depth(), 0); + assert_eq!(world.resource::().records.len(), 0); + assert_eq!( + world.get::(entity).unwrap().slots, + vec![block] + ); + std::fs::remove_dir_all(root).unwrap(); + } + + #[test] + fn property_block_promotion_rolls_back_file_and_catalog_when_scene_edit_fails() { + let root = promotion_test_root("rollback"); + let (mut app, entity, slot_id, selected_reference, block) = promotion_test_world(&root); + let world = app.world_mut(); + let promotion = + plan_property_block_promotion(world, entity, &selected_reference, &block, "Body") + .unwrap(); + world.entity_mut(entity).remove::(); + + let error = commit_property_block_promotion(world, &promotion).unwrap_err(); + + assert!(error.contains("actor is not editable")); + assert!(!promotion.destination_absolute.exists()); + assert!(!root.join(content_pipeline::REGISTRY_PATH).exists()); + assert!(!root.join(content_pipeline::RUNTIME_CATALOG_PATH).exists()); + assert_eq!(world.resource::().undo_depth(), 0); + assert_eq!(world.resource::().records.len(), 0); + assert_eq!( + world.get::(entity).unwrap().slots, + vec![block] + ); + assert_eq!( + world + .get::(entity) + .unwrap() + .materials + .slot(&slot_id) + .unwrap() + .material + .as_ref(), + Some(&selected_reference) + ); + std::fs::remove_dir_all(root).unwrap(); + } diff --git a/crates/editor/src/ui/layout.rs b/crates/editor/src/ui/layout.rs index 8f6ee85..2db42b6 100644 --- a/crates/editor/src/ui/layout.rs +++ b/crates/editor/src/ui/layout.rs @@ -1,7 +1,7 @@ //! Dock layout persistence in user preferences. use bevy::prelude::*; -use egui_dock::{DockState, NodeIndex}; +use egui_dock::{DockState, Node, NodeIndex}; use serde::{Deserialize, Serialize}; use crate::project_io::{write_user_preferences, UserPreferences}; @@ -24,6 +24,37 @@ pub struct LayoutSaveTimer { } const SAVE_DEBOUNCE_SECS: f32 = 1.0; +pub const INSPECTOR_MIN_WIDTH: f32 = crate::ui::design_system::INSPECTOR_MIN_WIDTH; + +/// Clamp the nearest horizontal split that owns the Inspector leaf. +pub fn clamp_inspector_width( + dock_state: &mut DockState, + panel_nodes: PanelNodes, + available_width: f32, +) { + let tree = dock_state.main_surface_mut(); + let mut child = panel_nodes.inspector(); + while let Some(parent) = child.parent() { + if matches!(tree[parent], Node::Horizontal(_)) { + let parent_width = tree[parent] + .rect() + .filter(|rect| rect.width().is_finite() && rect.width() > 0.0) + .map_or(available_width, |rect| rect.width()) + .max(1.0); + let requested = + (INSPECTOR_MIN_WIDTH.min(parent_width * 0.8) / parent_width).clamp(0.1, 0.9); + if let Node::Horizontal(split) = &mut tree[parent] { + if child.is_left() { + split.fraction = split.fraction.max(requested); + } else { + split.fraction = split.fraction.min(1.0 - requested); + } + } + break; + } + child = parent; + } +} pub fn default_dock_layout() -> DockLayoutSnapshot { let mut dock_state = DockState::new(vec![EditorTab::Viewport]); @@ -68,6 +99,8 @@ pub fn load_dock_layout(prefs: &UserPreferences) -> DockLayoutSnapshot { }; snapshot.panel_nodes = Some(PanelNodes::discover(&snapshot.dock_state, fallback)); } + let panel_nodes = snapshot.panel_nodes.expect("panel nodes normalized above"); + clamp_inspector_width(&mut snapshot.dock_state, panel_nodes, 1280.0); snapshot } @@ -146,3 +179,58 @@ pub fn reset_and_save_layout(world: &mut World) -> DockLayoutSnapshot { layout } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn inspector_split_is_clamped_to_the_420_pixel_floor() { + let mut layout = default_dock_layout(); + let panels = layout.panel_nodes.expect("default panel nodes"); + clamp_inspector_width(&mut layout.dock_state, panels, 1280.0); + let tree = layout.dock_state.main_surface(); + let mut child = panels.inspector(); + while let Some(parent) = child.parent() { + if let Node::Horizontal(split) = &tree[parent] { + let inspector_fraction = if child.is_left() { + split.fraction + } else { + 1.0 - split.fraction + }; + assert!(inspector_fraction * 1280.0 >= INSPECTOR_MIN_WIDTH); + return; + } + child = parent; + } + panic!("Inspector must have a horizontal split ancestor"); + } + + #[test] + fn impossible_small_hosts_keep_a_finite_bounded_split() { + let mut layout = default_dock_layout(); + let panels = layout.panel_nodes.expect("default panel nodes"); + clamp_inspector_width(&mut layout.dock_state, panels, 500.0); + for node in layout.dock_state.main_surface().iter() { + if let Node::Horizontal(split) = node { + assert!(split.fraction.is_finite()); + assert!((0.1..=0.9).contains(&split.fraction)); + } + } + } + + #[test] + fn resize_sweep_keeps_inspector_fraction_finite_and_bounded() { + let mut layout = default_dock_layout(); + let panels = layout.panel_nodes.expect("default panel nodes"); + for width in (960..=2560).step_by(17) { + clamp_inspector_width(&mut layout.dock_state, panels, width as f32); + for node in layout.dock_state.main_surface().iter() { + if let Node::Horizontal(split) = node { + assert!(split.fraction.is_finite()); + assert!((0.1..=0.9).contains(&split.fraction)); + } + } + } + } +} diff --git a/crates/editor/src/ui/material_library.rs b/crates/editor/src/ui/material_library.rs index 4c4788f..4a9446e 100644 --- a/crates/editor/src/ui/material_library.rs +++ b/crates/editor/src/ui/material_library.rs @@ -8,19 +8,21 @@ use bevy_egui::egui; use bevy_inspector_egui::bevy_inspector::hierarchy::SelectedEntities; use egui_phosphor_icons::icons; use shared::{ - BrushDesc, MaterialAsset, MaterialDesc, MaterialInstanceAsset, SkinnedMeshRenderer, + BrushDesc, MaterialAsset, MaterialDesc, MaterialInstanceAsset, Primitive, SkinnedMeshRenderer, StaticMeshRenderer, }; +use super::asset_card::{draw_asset_card, draw_asset_status_rail, AssetCardStatus}; use crate::asset_db::{ensure_asset_record, AssetRegistry}; use crate::assets::{ - draw_asset_cell_with, invalidate_on_catalog_refresh, prefetch_asset_thumbnails, AssetSelection, - AssetThumbnailCache, EditorAsset, EditorAssetKind, EditorAssets, ThumbnailCacheSnapshot, + invalidate_on_catalog_refresh, prefetch_asset_thumbnails, AssetSelection, AssetThumbnailCache, + EditorAsset, EditorAssetKind, EditorAssets, ThumbnailCacheSnapshot, }; use crate::project::collaboration::{publish_authored_file, FileSnapshot, FileWriteIntent}; use crate::scene_io::SceneIo; -use super::asset_browser::{create_material_instance_from_base, top_level_asset_details_panel}; +use super::asset_browser::top_level_asset_details_panel; +use super::materials::create_material_instance_from_base; use super::theme::{ panel_heading, ACCENT, BORDER, ELEVATED_BG, ERROR, SELECTION, SUCCESS, TEXT, TEXT_DIM, TEXT_MUTED, WIDGET_BG, @@ -99,6 +101,7 @@ struct MaterialLibraryRow { kind: MaterialDocumentKind, scene_users: Vec, dependent_instances: usize, + dirty: bool, error: Option, } @@ -422,7 +425,12 @@ fn material_grid( for chunk in rows.chunks(columns) { ui.horizontal(|ui| { for row in chunk { - let response = draw_asset_cell_with( + let document_status = row.asset.path.as_deref().and_then(|path| { + world + .get_resource::() + .and_then(|store| store.snapshot_for_path(path)) + }); + let response = draw_asset_card( ui, &row.asset, cache.texture_for(&row.asset), @@ -430,6 +438,11 @@ fn material_grid( cache.is_failed(&row.asset).then_some("failed"), selected.as_ref() == Some(&row.selection), thumbnail_size, + AssetCardStatus::for_document( + document_status.as_ref(), + row.dirty, + cache.is_failed(&row.asset), + ), ); draw_material_grid_badges(ui, &response, row); handle_material_response(world, response, row, selected_entities); @@ -452,7 +465,7 @@ fn draw_material_grid_badges(ui: &egui::Ui, response: &egui::Response, row: &Mat kind_rect, 3.0, ELEVATED_BG, - egui::Stroke::new(1.0, kind_color), + egui::Stroke::new(1.0_f32, kind_color), egui::StrokeKind::Inside, ); ui.painter().text( @@ -464,14 +477,14 @@ fn draw_material_grid_badges(ui: &egui::Ui, response: &egui::Response, row: &Mat ); if !row.scene_users.is_empty() { let usage_rect = egui::Rect::from_min_size( - response.rect.right_top() + egui::vec2(-35.0, 6.0), + response.rect.left_top() + egui::vec2(40.0, 6.0), egui::vec2(29.0, 17.0), ); ui.painter().rect( usage_rect, 3.0, ELEVATED_BG, - egui::Stroke::new(1.0, SUCCESS), + egui::Stroke::new(1.0_f32, SUCCESS), egui::StrokeKind::Inside, ); ui.painter().text( @@ -484,84 +497,6 @@ fn draw_material_grid_badges(ui: &egui::Ui, response: &egui::Response, row: &Mat } } -fn material_list( - world: &mut World, - ui: &mut egui::Ui, - rows: &[MaterialLibraryRow], - selected: &Option, - cache: &ThumbnailCacheSnapshot, - selected_entities: &mut SelectedEntities, -) { - for row in rows { - let is_selected = selected.as_ref() == Some(&row.selection); - let height = 42.0; - let (rect, response) = ui.allocate_exact_size( - egui::vec2(ui.available_width(), height), - egui::Sense::click_and_drag(), - ); - ui.painter().rect( - rect, - 3.0, - if is_selected { - crate::ui::theme::SELECTION_BG_MUTED - } else if response.hovered() { - ELEVATED_BG - } else { - WIDGET_BG - }, - egui::Stroke::new(1.0, if is_selected { SELECTION } else { BORDER }), - egui::StrokeKind::Inside, - ); - let thumb_rect = egui::Rect::from_min_size( - rect.left_top() + egui::vec2(5.0, 5.0), - egui::vec2(32.0, 32.0), - ); - if let Some(texture) = cache.texture_for(&row.asset) { - ui.painter().image( - texture, - thumb_rect, - egui::Rect::from_min_max(egui::Pos2::ZERO, egui::pos2(1.0, 1.0)), - egui::Color32::WHITE, - ); - } else { - ui.painter().text( - thumb_rect.center(), - egui::Align2::CENTER_CENTER, - icons::PALETTE.as_str(), - egui::FontId::new(20.0, egui::FontFamily::Name("phosphor-regular".into())), - if row.error.is_some() { ERROR } else { TEXT }, - ); - } - ui.painter().text( - egui::pos2(44.0 + rect.left(), rect.center().y - 7.0), - egui::Align2::LEFT_CENTER, - row.asset.label.as_str(), - egui::FontId::proportional(13.0), - TEXT, - ); - ui.painter().text( - egui::pos2(44.0 + rect.left(), rect.center().y + 9.0), - egui::Align2::LEFT_CENTER, - row.asset.path.as_deref().unwrap_or(""), - egui::FontId::monospace(10.0), - TEXT_MUTED, - ); - ui.painter().text( - rect.right_center() - egui::vec2(10.0, 0.0), - egui::Align2::RIGHT_CENTER, - format!( - "{} | {} scene | {} instances", - row.kind.label(), - row.scene_users.len(), - row.dependent_instances - ), - egui::FontId::proportional(11.0), - if row.error.is_some() { ERROR } else { TEXT_DIM }, - ); - handle_material_response(world, response, row, selected_entities); - } -} - fn handle_material_response( world: &mut World, response: egui::Response, @@ -621,6 +556,10 @@ fn handle_material_response( }); } +#[path = "material_library/list.rs"] +mod list; +use list::material_list; + fn material_rows(world: &mut World) -> Vec { let usages = collect_scene_material_usage(world); let documents = world.resource::().documents.clone(); @@ -637,6 +576,12 @@ fn material_rows(world: &mut World) -> Vec { .into_iter() .map(|document| { let normalized = normalize_path(document.asset.path.as_deref().unwrap_or_default()); + let dirty = document.asset.path.as_deref().is_some_and(|path| { + world + .get_resource::() + .and_then(|store| store.snapshot_for_path(path)) + .is_some_and(|snapshot| snapshot.dirty) + }); MaterialLibraryRow { selection: document.selection, scene_users: usages.get(&normalized).cloned().unwrap_or_default(), @@ -646,6 +591,7 @@ fn material_rows(world: &mut World) -> Vec { .unwrap_or_default(), asset: document.asset, kind: document.kind, + dirty, error: document.error, } }) @@ -719,6 +665,24 @@ fn collect_scene_material_usage(world: &mut World) -> HashMap)>(); + for (entity, primitive, name) in primitives.iter(world) { + if let Some(path) = primitive + .surface + .effective_material() + .and_then(|reference| reference.0.source_path.as_deref()) + { + add_usage( + &mut usages, + path, + MaterialSceneUser { + entity, + actor_label: actor_label(entity, name), + detail: "Primitive / Surface".into(), + }, + ); + } + } let mut materials = world.query::<(Entity, &MaterialDesc, Option<&Name>)>(); for (entity, material, name) in materials.iter(world) { if let Some(path) = material.material_asset_path.as_deref() { @@ -855,7 +819,11 @@ fn select_scene_user(world: &mut World, selected_entities: &mut SelectedEntities } fn create_material_asset(world: &mut World) -> Result<(), String> { - let path = next_material_path(Path::new(MATERIALS_FOLDER)); + create_material_asset_in(world, Path::new(MATERIALS_FOLDER)) +} + +pub(crate) fn create_material_asset_in(world: &mut World, folder: &Path) -> Result<(), String> { + let path = next_material_path(folder); let label = path .file_stem() .and_then(|stem| stem.to_str()) @@ -874,10 +842,11 @@ fn create_material_asset(world: &mut World) -> Result<(), String> { let asset = MaterialAsset { schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, label: label.clone(), - shader: None, + shader: Default::default(), shader_ref: None, render_state: shared::MaterialRenderState::default(), - material: MaterialDesc::default(), + provenance: None, + inputs: shared::MaterialInputSet::from_material_desc(&MaterialDesc::default()), }; let text = ron::ser::to_string_pretty(&asset, ron::ser::PrettyConfig::default()) .map_err(|error| format!("could not serialize new material: {error}"))?; @@ -900,7 +869,7 @@ fn create_material_asset(world: &mut World) -> Result<(), String> { { let mut assets = world.resource_mut::(); assets.refresh(); - assets.current_folder = MATERIALS_FOLDER.into(); + assets.current_folder = normalize_path(&folder.to_string_lossy()); assets.select(AssetSelection::File(catalog_path.clone())); } invalidate_on_catalog_refresh(world); @@ -930,6 +899,20 @@ mod tests { ComponentInstanceId, EditorAssetRef, MaterialRef, RendererMaterialSet, RendererMaterialSlot, }; + #[test] + fn new_material_path_uses_the_requested_content_folder() { + let root = std::env::temp_dir().join(format!( + "blacksite-material-create-folder-{}", + uuid::Uuid::new_v4() + )); + std::fs::create_dir_all(&root).unwrap(); + std::fs::write(root.join("new_material.ron"), b"occupied").unwrap(); + + assert_eq!(next_material_path(&root), root.join("new_material_2.ron")); + + std::fs::remove_dir_all(root).unwrap(); + } + #[test] fn usage_counts_exact_authored_material_paths() { let material_path = "assets/materials/steel.ron"; @@ -940,7 +923,6 @@ mod tests { slots: vec![RendererMaterialSlot { id: ComponentInstanceId::new("slot:body"), name: "Body".into(), - source_material: None, material: Some(MaterialRef::new( EditorAssetRef::new("steel", "material:source", "Steel") .with_source_path(material_path), @@ -989,6 +971,7 @@ mod tests { }, ], dependent_instances: 1, + dirty: false, error: None, }; let mut state = MaterialLibraryState { @@ -1015,10 +998,11 @@ mod tests { let base = MaterialAsset { schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, label: "Base".into(), - shader: None, + shader: shared::ShaderRefDesc::default(), shader_ref: None, render_state: Default::default(), - material: MaterialDesc::default(), + provenance: None, + inputs: shared::MaterialInputSet::default(), }; std::fs::write( &base_path, @@ -1032,8 +1016,7 @@ mod tests { EditorAssetRef::new("base", "material:source", "Base") .with_source_path(base_path.to_string_lossy().into_owned()), ), - parameters: Vec::new(), - textures: Vec::new(), + overrides: shared::MaterialInputSet::default(), }; std::fs::write( &instance_path, @@ -1055,8 +1038,11 @@ mod tests { ], current_folder: root.to_string_lossy().into_owned(), selected: None, + selections: Vec::new(), + selection_anchor: None, dragging: None, status: String::new(), + catalog_revision: 1, }) .init_resource::() .add_systems(Update, refresh_material_library_catalog); diff --git a/crates/editor/src/ui/material_library/list.rs b/crates/editor/src/ui/material_library/list.rs new file mode 100644 index 0000000..286b4f2 --- /dev/null +++ b/crates/editor/src/ui/material_library/list.rs @@ -0,0 +1,101 @@ +use super::*; + +pub(super) fn material_list( + world: &mut World, + ui: &mut egui::Ui, + rows: &[MaterialLibraryRow], + selected: &Option, + cache: &ThumbnailCacheSnapshot, + selected_entities: &mut SelectedEntities, +) { + for row in rows { + let document_status = row.asset.path.as_deref().and_then(|path| { + world + .get_resource::() + .and_then(|store| store.snapshot_for_path(path)) + }); + let status = AssetCardStatus::for_document( + document_status.as_ref(), + row.dirty, + row.error.is_some() || cache.is_failed(&row.asset), + ); + let is_selected = selected.as_ref() == Some(&row.selection); + let (rect, response) = ui.allocate_exact_size( + egui::vec2(ui.available_width(), 42.0), + egui::Sense::click_and_drag(), + ); + ui.painter().rect( + rect, + 3.0, + if is_selected { + crate::ui::theme::SELECTION_BG_MUTED + } else if response.hovered() { + ELEVATED_BG + } else { + WIDGET_BG + }, + egui::Stroke::new(1.0_f32, if is_selected { SELECTION } else { BORDER }), + egui::StrokeKind::Inside, + ); + let thumb_rect = egui::Rect::from_min_size( + rect.left_top() + egui::vec2(5.0, 5.0), + egui::vec2(32.0, 32.0), + ); + if let Some(texture) = cache.texture_for(&row.asset) { + ui.painter().image( + texture, + thumb_rect, + egui::Rect::from_min_max(egui::Pos2::ZERO, egui::pos2(1.0, 1.0)), + egui::Color32::WHITE, + ); + } else { + ui.painter().text( + thumb_rect.center(), + egui::Align2::CENTER_CENTER, + icons::PALETTE.as_str(), + egui::FontId::new(20.0, egui::FontFamily::Name("phosphor-regular".into())), + if row.error.is_some() { ERROR } else { TEXT }, + ); + } + let metadata_width = if rect.width() >= 500.0 { 190.0 } else { 0.0 }; + let text_rect = egui::Rect::from_min_max( + egui::pos2(rect.left() + 44.0, rect.top() + 4.0), + egui::pos2(rect.right() - metadata_width - 24.0, rect.bottom() - 4.0), + ); + let text_painter = ui.painter().with_clip_rect(text_rect); + text_painter.text( + egui::pos2(text_rect.left(), rect.center().y - 7.0), + egui::Align2::LEFT_CENTER, + row.asset.label.as_str(), + egui::FontId::proportional(13.0), + TEXT, + ); + text_painter.text( + egui::pos2(text_rect.left(), rect.center().y + 9.0), + egui::Align2::LEFT_CENTER, + row.asset.path.as_deref().unwrap_or(""), + egui::FontId::monospace(10.0), + TEXT_MUTED, + ); + if metadata_width > 0.0 { + let metadata_rect = egui::Rect::from_min_max( + egui::pos2(rect.right() - metadata_width - 18.0, rect.top()), + egui::pos2(rect.right() - 18.0, rect.bottom()), + ); + ui.painter().with_clip_rect(metadata_rect).text( + metadata_rect.right_center(), + egui::Align2::RIGHT_CENTER, + format!( + "{} · {} scene · {} instances", + row.kind.label(), + row.scene_users.len(), + row.dependent_instances + ), + egui::FontId::proportional(11.0), + if row.error.is_some() { ERROR } else { TEXT_DIM }, + ); + } + draw_asset_status_rail(ui, rect, status); + handle_material_response(world, response, row, selected_entities); + } +} diff --git a/crates/editor/src/ui/materials/advanced_preview.rs b/crates/editor/src/ui/materials/advanced_preview.rs new file mode 100644 index 0000000..8905fc6 --- /dev/null +++ b/crates/editor/src/ui/materials/advanced_preview.rs @@ -0,0 +1,281 @@ +//! Non-interactive Penpot v2.3.1 renderer-control preview. + +use bevy_egui::egui; +use egui_phosphor_icons::icons; + +use crate::ui::design_system::typography::TypeRole; +use crate::ui::design_system::{self, ADVANCED_COLLAPSED_HEIGHT, ADVANCED_EXPANDED_HEIGHT}; + +const PLANNED_TOOLTIP: &str = "Planned — renderer support pending"; + +pub(super) fn unsupported_advanced_preview(ui: &mut egui::Ui) { + let open_id = ui.make_persistent_id("material_unsupported_advanced_open"); + let reveal_id = open_id.with("reveal_complete_body"); + let mut open = ui + .ctx() + .data_mut(|data| data.get_persisted::(open_id)) + .unwrap_or(false); + let width = ui.available_width().max(1.0); + let mode = super::layout::ResponsiveMaterialLayout::for_width(width); + let height = if open { + if mode == super::layout::ResponsiveMaterialLayout::Transient { + 254.0 + } else { + ADVANCED_EXPANDED_HEIGHT + } + } else { + ADVANCED_COLLAPSED_HEIGHT + }; + let palette = design_system::palette(ui); + let (rect, _) = ui.allocate_exact_size(egui::vec2(width, height), egui::Sense::hover()); + ui.painter().rect( + rect, + 5.0, + palette.section, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + let header = egui::Rect::from_min_size(rect.min, egui::vec2(rect.width(), 30.0)); + ui.painter().rect_filled(header, 4.0, palette.elevated); + let header_response = ui.interact(header, open_id.with("header"), egui::Sense::click()); + if header_response.clicked() { + open = !open; + ui.ctx().data_mut(|data| data.insert_temp(reveal_id, open)); + } + header_response.on_hover_text(if open { + "Collapse Advanced preview" + } else { + "Expand Advanced preview" + }); + ui.painter().text( + header.left_center() + egui::vec2(12.0, 0.0), + egui::Align2::LEFT_CENTER, + if open { + icons::CARET_DOWN.as_str() + } else { + icons::CARET_RIGHT.as_str() + }, + egui::FontId::new(10.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.text_secondary, + ); + ui.painter().text( + header.left_center() + egui::vec2(30.0, 0.0), + egui::Align2::LEFT_CENTER, + "Advanced", + TypeRole::Section.font(), + palette.text_primary, + ); + if !open && rect.width() >= 300.0 { + ui.painter().text( + header.right_center() - egui::vec2(12.0, 0.0), + egui::Align2::RIGHT_CENTER, + PLANNED_TOOLTIP, + TypeRole::Small.font(), + palette.text_muted, + ); + } + if open { + match mode { + super::layout::ResponsiveMaterialLayout::Reference => reference_controls(ui, rect), + super::layout::ResponsiveMaterialLayout::Compact => { + compact_reference_controls(ui, rect) + } + super::layout::ResponsiveMaterialLayout::Transient => compact_controls(ui, rect), + } + } + let reveal_complete_body = ui + .ctx() + .data_mut(|data| data.get_temp::(reveal_id)) + .unwrap_or(false); + if open && reveal_complete_body && rect.height() > ADVANCED_COLLAPSED_HEIGHT { + ui.scroll_to_rect(rect, Some(egui::Align::BOTTOM)); + ui.ctx().data_mut(|data| data.remove::(reveal_id)); + } + ui.ctx() + .data_mut(|data| data.insert_persisted(open_id, open)); +} + +fn reference_controls(ui: &mut egui::Ui, rect: egui::Rect) { + disabled_field(ui, rect, 28.0, 42.0, "Culling", "Back"); + disabled_field(ui, rect, 28.0, 76.0, "Render Queue", "From Shader"); + disabled_toggle(ui, rect, 328.0, 42.0, "Depth Write", true); + disabled_toggle(ui, rect, 328.0, 76.0, "Receive Shadows", true); + planned_note(ui, rect, 28.0, 124.0); +} + +fn compact_reference_controls(ui: &mut egui::Ui, rect: egui::Rect) { + disabled_field_at(ui, rect, 20.0, 90.0, 90.0, 42.0, "Culling", "Back"); + disabled_field_at( + ui, + rect, + 20.0, + 90.0, + 90.0, + 76.0, + "Render Queue", + "From Shader", + ); + disabled_toggle_at( + ui, + rect, + 196.0, + rect.width() - 38.0, + 42.0, + "Depth Write", + true, + ); + disabled_toggle_at( + ui, + rect, + 196.0, + rect.width() - 38.0, + 76.0, + "Receive Shadows", + true, + ); + planned_note(ui, rect, 20.0, 124.0); +} + +fn compact_controls(ui: &mut egui::Ui, rect: egui::Rect) { + disabled_field(ui, rect, 20.0, 42.0, "Culling", "Back"); + disabled_field(ui, rect, 20.0, 78.0, "Render Queue", "From Shader"); + disabled_toggle(ui, rect, 20.0, 124.0, "Depth Write", true); + disabled_toggle(ui, rect, 20.0, 160.0, "Receive Shadows", true); + planned_note(ui, rect, 20.0, 210.0); +} + +fn disabled_field(ui: &mut egui::Ui, rect: egui::Rect, x: f32, y: f32, label: &str, value: &str) { + disabled_field_at(ui, rect, x, x + 106.0, 150.0, y, label, value); +} + +#[expect( + clippy::too_many_arguments, + reason = "explicit Penpot preview geometry" +)] +fn disabled_field_at( + ui: &mut egui::Ui, + rect: egui::Rect, + label_x: f32, + field_x: f32, + field_width: f32, + y: f32, + label: &str, + value: &str, +) { + let palette = design_system::palette(ui); + ui.painter().text( + rect.min + egui::vec2(label_x, y), + egui::Align2::LEFT_CENTER, + label, + TypeRole::Body.font(), + palette.text_muted, + ); + let field = egui::Rect::from_min_size( + egui::pos2(rect.left() + field_x, rect.top() + y - 7.0), + egui::vec2(field_width.min(rect.width() - field_x - 8.0).max(1.0), 24.0), + ); + paint_disabled_field(ui, field, value); +} + +fn disabled_toggle( + ui: &mut egui::Ui, + rect: egui::Rect, + x: f32, + y: f32, + label: &str, + enabled: bool, +) { + disabled_toggle_at(ui, rect, x, x + 106.0, y, label, enabled); +} + +fn disabled_toggle_at( + ui: &mut egui::Ui, + rect: egui::Rect, + label_x: f32, + toggle_x: f32, + y: f32, + label: &str, + enabled: bool, +) { + let palette = design_system::palette(ui); + ui.painter().text( + rect.min + egui::vec2(label_x, y), + egui::Align2::LEFT_CENTER, + label, + TypeRole::Body.font(), + palette.text_muted, + ); + let toggle = egui::Rect::from_min_size( + egui::pos2(rect.left() + toggle_x, rect.top() + y - 8.0), + egui::vec2(30.0, 16.0), + ); + ui.painter().rect( + toggle, + 8.0, + palette.control, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + let thumb_x = if enabled { + toggle.right() - 8.0 + } else { + toggle.left() + 8.0 + }; + ui.painter().circle_filled( + egui::pos2(thumb_x, toggle.center().y), + 5.0, + palette.text_muted, + ); + ui.interact( + toggle, + ui.make_persistent_id(("advanced_toggle", label)), + egui::Sense::hover(), + ) + .on_hover_text(PLANNED_TOOLTIP); +} + +fn paint_disabled_field(ui: &mut egui::Ui, rect: egui::Rect, value: &str) { + let palette = design_system::palette(ui); + ui.painter().rect( + rect, + 4.0, + palette.control, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + ui.painter().text( + rect.left_center() + egui::vec2(10.0, 0.0), + egui::Align2::LEFT_CENTER, + value, + TypeRole::Body.font(), + palette.text_muted, + ); + ui.interact( + rect, + ui.make_persistent_id(("advanced_field", value)), + egui::Sense::hover(), + ) + .on_hover_text(PLANNED_TOOLTIP); +} + +fn planned_note(ui: &egui::Ui, rect: egui::Rect, x: f32, y: f32) { + let palette = design_system::palette(ui); + ui.painter().text( + rect.min + egui::vec2(x, y), + egui::Align2::LEFT_CENTER, + PLANNED_TOOLTIP, + TypeRole::Small.font(), + palette.text_muted, + ); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn penpot_advanced_preview_matches_v231_heights() { + assert_eq!(ADVANCED_COLLAPSED_HEIGHT, 30.0); + assert_eq!(ADVANCED_EXPANDED_HEIGHT, 178.0); + } +} diff --git a/crates/editor/src/ui/materials/asset_editor.rs b/crates/editor/src/ui/materials/asset_editor.rs new file mode 100644 index 0000000..e75eaca --- /dev/null +++ b/crates/editor/src/ui/materials/asset_editor.rs @@ -0,0 +1,228 @@ +use super::*; + +pub(crate) fn material_asset_editor( + world: &mut World, + ui: &mut egui::Ui, + asset: &EditorAsset, + path: &str, + show_document_chrome: bool, +) { + let document_key = crate::asset_documents::ensure_material_document(world, path, &asset.label); + let shader_schemas = shader_schema_assets(world); + let mut create_instance = false; + let mut draft_asset = world + .resource::() + .material(&document_key) + .cloned() + .expect("ensured Material document"); + super::editor::prefetch_bound_material_textures(world, [&draft_asset.inputs]); + let texture_assets = material_texture_candidates(world); + let texture_drop_candidate = world + .resource::() + .dragging_selection() + .and_then(|selection| { + texture_assets + .iter() + .find(|candidate| candidate.selection == *selection) + }) + .cloned(); + let original = draft_asset.clone(); + let mut accepted_texture_drop = false; + if show_document_chrome { + if let Some(snapshot) = world + .resource::() + .snapshot(&document_key) + { + authored_document_status_ui(ui, &snapshot); + if let Some(error) = snapshot.error.as_ref() { + ui.colored_label(egui::Color32::YELLOW, error); + } + } + if let Some(provenance) = draft_asset.provenance.as_ref() { + egui::CollapsingHeader::new("Source & Diagnostics") + .id_salt(("material_source", path)) + .default_open(false) + .show(ui, |ui| material_source_diagnostics_ui(ui, provenance)); + } + compact_text_edit(ui, "Label", &mut draft_asset.label); + } + let input_schema = + material_shader_settings(ui, &mut draft_asset, &shader_schemas, show_document_chrome); + material_surface_options_ui( + ui, + &mut draft_asset.render_state, + Some(&mut draft_asset.inputs), + ); + ui.add_space(8.0); + let input_response = material_input_schema_editor( + ui, + &input_schema, + &mut draft_asset.inputs, + &texture_assets, + texture_drop_candidate.as_ref(), + ); + accepted_texture_drop |= input_response.accepted_drop; + if let Some(selection) = input_response.locate { + world.resource_mut::().select(selection); + crate::ui::request_editor_tab(world, crate::ui::EditorTab::AssetBrowser); + } + if input_response.browse_library { + crate::ui::request_editor_tab(world, crate::ui::EditorTab::AssetBrowser); + } + if show_document_chrome + && ui + .add_sized( + [ui.available_width().max(1.0), 24.0], + egui::Button::new("Create Instance"), + ) + .clicked() + { + create_instance = true; + } + let create_instance_label = draft_asset.label.clone(); + + if draft_asset != original { + crate::asset_documents::update_material_document(world, &document_key, draft_asset.clone()); + } + if create_instance { + create_material_instance_from_base(world, path, &create_instance_label); + } + if accepted_texture_drop { + world.resource_mut::().clear_drag(); + } +} + +fn material_source_diagnostics_ui(ui: &mut egui::Ui, provenance: &shared::MaterialProvenance) { + egui::Grid::new("material_provenance") + .num_columns(2) + .spacing([8.0, 3.0]) + .show(ui, |ui| { + ui.small("Asset"); + ui.small(&provenance.source_path); + ui.end_row(); + ui.small("Source slot"); + ui.small(format!( + "{} ({})", + provenance.source_label, provenance.source_sub_asset_id + )); + ui.end_row(); + ui.small("Fingerprint"); + ui.monospace(&provenance.source_fingerprint); + ui.end_row(); + }); + ui.small("Reimport comparison never overwrites an edited project material automatically."); +} + +pub(super) fn material_surface_options_ui( + ui: &mut egui::Ui, + state: &mut shared::MaterialRenderState, + packed_inputs: Option<&mut shared::MaterialInputSet>, +) { + let palette = crate::ui::design_system::palette(ui); + let width = ui.available_width().max(1.0); + let height = match super::layout::ResponsiveMaterialLayout::for_width(width) { + super::layout::ResponsiveMaterialLayout::Reference => { + crate::ui::design_system::SURFACE_SECTION_HEIGHT + } + super::layout::ResponsiveMaterialLayout::Compact => { + crate::ui::design_system::COMPACT_SURFACE_SECTION_HEIGHT + } + super::layout::ResponsiveMaterialLayout::Transient => 100.0, + }; + let (rect, _) = ui.allocate_exact_size(egui::vec2(width, height), egui::Sense::hover()); + ui.painter().rect( + rect, + 5.0, + palette.section, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + let geometry = super::layout::SurfaceSectionGeometry::for_rect(rect); + ui.painter().text( + geometry.title.left_center(), + egui::Align2::LEFT_CENTER, + "Surface", + crate::ui::design_system::typography::TypeRole::Section.font(), + palette.text_primary, + ); + clipped_rect_ui(ui, geometry.blend, |ui| { + surface_blend_controls(ui, state); + }); + if let Some(inputs) = packed_inputs { + clipped_rect_ui(ui, geometry.packed, |ui| { + packed_mode_controls(ui, inputs); + }); + } + ui.painter().text( + geometry.double_sided.left_center() + egui::vec2(7.0, 0.0), + egui::Align2::LEFT_CENTER, + "Double Sided", + crate::ui::design_system::typography::TypeRole::Body.font(), + palette.text_secondary, + ); + let switch_rect = egui::Rect::from_min_size( + geometry.double_sided.min + egui::vec2(76.0, 3.0), + egui::vec2(31.0, 16.0), + ); + clipped_rect_ui(ui, switch_rect, |ui| { + crate::ui::design_system::controls::switch(ui, &mut state.double_sided) + .on_hover_text("Render both sides of the surface"); + }); +} + +fn packed_mode_controls(ui: &mut egui::Ui, inputs: &mut shared::MaterialInputSet) { + let arm = super::inputs::packed_map_mode(inputs) == super::inputs::PackedMapMode::Arm; + match crate::ui::design_system::controls::two_option_segmented(ui, "Separate", "ORM", arm) { + Some(false) => super::inputs::apply_separate_texture_preset(inputs), + Some(true) => super::inputs::apply_arm_texture_preset(inputs), + None => {} + } +} + +fn surface_blend_controls(ui: &mut egui::Ui, state: &mut shared::MaterialRenderState) { + let width = ui.available_width().max(1.0); + let show_cutoff = state.alpha_mode == MaterialAlphaMode::Cutout; + let combo_width = if show_cutoff { + (width - 58.0).max(1.0) + } else { + width + }; + let combo_rect = egui::Rect::from_min_size(ui.min_rect().min, egui::vec2(combo_width, 24.0)); + clipped_rect_ui(ui, combo_rect, |ui| { + egui::ComboBox::from_id_salt("material_alpha_mode") + .selected_text(match state.alpha_mode { + MaterialAlphaMode::Opaque => "Opaque", + MaterialAlphaMode::Cutout => "Cutout", + }) + .width(combo_width) + .show_ui(ui, |ui| { + ui.selectable_value(&mut state.alpha_mode, MaterialAlphaMode::Opaque, "Opaque"); + ui.selectable_value(&mut state.alpha_mode, MaterialAlphaMode::Cutout, "Cutout"); + }); + }); + if show_cutoff { + let cutoff_rect = egui::Rect::from_min_size( + ui.min_rect().min + egui::vec2(combo_width + 4.0, 1.0), + egui::vec2(54.0_f32.min(width - combo_width - 4.0), 22.0), + ); + ui.put( + cutoff_rect, + egui::DragValue::new(&mut state.alpha_cutoff) + .range(0.0..=1.0) + .speed(0.01), + ) + .on_hover_text("Alpha cutoff"); + } +} + +fn clipped_rect_ui( + ui: &mut egui::Ui, + rect: egui::Rect, + add_contents: impl FnOnce(&mut egui::Ui) -> R, +) -> R { + ui.scope_builder(egui::UiBuilder::new().max_rect(rect), |ui| { + ui.set_clip_rect(rect.intersect(ui.clip_rect())); + add_contents(ui) + }) + .inner +} diff --git a/crates/editor/src/ui/materials/editor.rs b/crates/editor/src/ui/materials/editor.rs new file mode 100644 index 0000000..8d8f547 --- /dev/null +++ b/crates/editor/src/ui/materials/editor.rs @@ -0,0 +1,541 @@ +use super::*; + +/// Reuses the guarded Content Browser material editor inside an actor material-slot foldout. +pub(crate) fn inline_material_document_editor( + world: &mut World, + ui: &mut egui::Ui, + path: &str, +) -> bool { + let Some(asset) = world + .get_resource::() + .and_then(|assets| { + assets + .assets + .iter() + .find(|asset| asset.path.as_deref() == Some(path)) + }) + .cloned() + else { + ui.colored_label( + crate::ui::theme::ERROR, + "Material is missing from the content catalog", + ); + return false; + }; + let loaded_kind = world + .resource::() + .snapshot_for_path(path) + .map(|snapshot| snapshot.key.kind); + let kind = loaded_kind.or_else(|| { + if MaterialInstanceAsset::load_from_path(path).is_ok() { + Some(crate::asset_documents::AuthoredAssetDocumentKind::MaterialInstance) + } else if MaterialAsset::load_from_path(path).is_ok() { + Some(crate::asset_documents::AuthoredAssetDocumentKind::Material) + } else { + None + } + }); + ui.push_id(("inline_material_document", path), |ui| match kind { + Some(crate::asset_documents::AuthoredAssetDocumentKind::MaterialInstance) => { + material_instance_asset_editor(world, ui, &asset, path, false); + } + Some(crate::asset_documents::AuthoredAssetDocumentKind::Material) => { + material_asset_editor(world, ui, &asset, path, false); + } + _ => { + ui.colored_label(crate::ui::theme::ERROR, "Material document is invalid"); + } + }); + true +} + +pub(crate) fn material_shader_label(world: &World, path: Option<&str>) -> String { + let kind = material_shader_kind(world, path); + match kind { + Some(MaterialShaderKind::StandardLit) => "Standard Lit".into(), + Some(MaterialShaderKind::Unlit) => "Unlit".into(), + Some(MaterialShaderKind::Custom) => "Custom Surface".into(), + None if path.is_none() => "Default Grid".into(), + None => "Imported Source".into(), + } +} + +pub(crate) fn material_shader_kind( + world: &World, + path: Option<&str>, +) -> Option { + let path = path?; + let documents = world.get_resource::(); + let asset = documents + .and_then(|store| store.snapshot_for_path(path)) + .and_then(|snapshot| documents.and_then(|store| store.material(&snapshot.key))) + .cloned() + .or_else(|| MaterialAsset::load_from_path(path).ok()); + asset.map(|asset| asset.shader.kind).or_else(|| { + MaterialInstanceAsset::load_from_path(path) + .ok() + .and_then(|instance| instance.base.0.source_path) + .and_then(|base| MaterialAsset::load_from_path(&base).ok()) + .map(|asset| asset.shader.kind) + }) +} + +pub(crate) fn set_material_shader_kind(world: &mut World, path: &str, kind: MaterialShaderKind) { + let Some(asset) = world + .get_resource::() + .and_then(|assets| { + assets + .assets + .iter() + .find(|asset| asset.path.as_deref() == Some(path)) + }) + .cloned() + else { + return; + }; + let key = crate::asset_documents::ensure_material_document(world, path, &asset.label); + let Some(mut draft) = world + .resource::() + .material(&key) + .cloned() + else { + return; + }; + if draft.shader.kind == kind { + return; + } + draft.shader.kind = kind; + if draft.shader.kind != MaterialShaderKind::Custom { + draft.shader_ref = None; + draft.shader.schema_path = None; + draft.shader.shader_path = None; + } + crate::asset_documents::update_material_document(world, &key, draft); +} + +pub(crate) fn create_material_instance_from_base( + world: &mut World, + base_path: &str, + base_label: &str, +) { + let base_reference = world + .get_resource_mut::() + .ok_or_else(|| "Asset registry is unavailable".to_string()) + .and_then(|mut registry| { + ensure_asset_record( + &mut registry, + base_path.to_string(), + base_label.to_string(), + "Material", + ) + .map(|record| { + MaterialRef::new( + EditorAssetRef::new( + record.id.as_string(), + "material:source", + base_label.to_string(), + ) + .with_source_path(base_path), + ) + }) + }); + let base_reference = match base_reference { + Ok(reference) => reference, + Err(error) => { + world.resource_mut::().status = error; + return; + } + }; + let base = Path::new(base_path); + let parent = base + .parent() + .unwrap_or_else(|| Path::new("assets/materials")); + let stem = base + .file_stem() + .and_then(|value| value.to_str()) + .unwrap_or("material"); + let mut index = 1usize; + let path = loop { + let suffix = if index == 1 { + "instance".to_string() + } else { + format!("instance_{index}") + }; + let candidate = parent.join(format!("{stem}_{suffix}.ron")); + if !candidate.exists() { + break candidate; + } + index += 1; + }; + let instance = MaterialInstanceAsset { + schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, + label: format!("{base_label} Instance"), + base: base_reference, + overrides: MaterialInputSet::default(), + }; + let result = ron::ser::to_string_pretty(&instance, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("could not serialize material instance: {error}")) + .and_then(|text| { + publish_authored_file( + world, + &path, + text.as_bytes(), + &FileSnapshot::missing(), + FileWriteIntent::MaterialInstance, + ) + }); + if let Err(error) = result { + world.resource_mut::().status = error; + return; + } + let normalized = path.to_string_lossy().replace('\\', "/"); + let registry_error = + if let Some(mut registry) = world.get_resource_mut::() { + ensure_asset_record( + &mut registry, + normalized.clone(), + instance.label.clone(), + "Material", + ) + .map(|_| ()) + .and_then(|_| save_registry(®istry)) + .err() + } else { + Some("Asset registry is unavailable".to_string()) + }; + if let Some(error) = registry_error { + world.resource_mut::().status = + format!("Created {normalized}, but registry update failed: {error}"); + return; + } + world.resource_mut::().refresh(); + world + .resource_mut::() + .select(AssetSelection::File(normalized.clone())); + invalidate_on_catalog_refresh(world); + world.resource_mut::().status = format!("Created material instance {normalized}"); +} + +pub(super) fn shader_schema_assets(world: &World) -> Vec<(String, String, EditorAssetRef)> { + let registry = world.get_resource::(); + let mut schemas: Vec<(String, String, EditorAssetRef)> = world + .resource::() + .assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::ShaderSchema)) + .filter_map(|asset| { + let path = asset.path.clone()?; + let record = registry.and_then(|registry| find_asset_by_path(registry, &path))?; + Some(( + asset.label.clone(), + path.clone(), + EditorAssetRef::new(record.id.as_string(), "shader:schema", asset.label.clone()) + .with_source_path(path), + )) + }) + .collect(); + schemas.sort_by(|a, b| natural_cmp(&a.0, &b.0)); + schemas +} + +pub(super) fn material_texture_candidates(world: &mut World) -> Vec { + let Some(registry) = world.get_resource::() else { + return Vec::new(); + }; + let assets = &world.resource::().assets; + let thumbnails = world + .get_resource::() + .map(crate::assets::AssetThumbnailCache::snapshot); + let mut textures = Vec::new(); + let mut seen = HashSet::new(); + + for asset in assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) + { + let Some(path) = asset.path.as_deref() else { + continue; + }; + let Some(record) = find_asset_by_path(registry, path) else { + continue; + }; + let reference = + EditorAssetRef::new(record.id.as_string(), "texture:source", asset.label.clone()) + .with_source_path(path); + if !seen.insert((reference.asset_id.clone(), reference.sub_asset_id.clone())) { + continue; + } + textures.push(MaterialTextureCandidate { + label: asset.label.clone(), + detail: path.to_string(), + reference, + selection: AssetSelection::File(path.to_string()), + thumbnail: thumbnails.as_ref().map_or( + MaterialThumbnailPresentation::Pending, + |cache| { + if let Some(texture) = cache.texture_for(asset) { + MaterialThumbnailPresentation::Ready(texture) + } else if cache.is_failed(asset) { + MaterialThumbnailPresentation::Failed + } else { + MaterialThumbnailPresentation::Pending + } + }, + ), + }); + } + + for asset in assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::Model)) + { + let Some(parent_path) = asset.path.as_deref() else { + continue; + }; + let Some(record) = find_asset_by_path(registry, parent_path) else { + continue; + }; + let Some(manifest) = record + .model_import() + .static_mesh_manifest_path + .as_deref() + .and_then(|path| load_static_mesh_manifest(path).ok()) + else { + continue; + }; + for source_path in manifest + .source + .dependencies + .iter() + .filter(|path| is_material_texture_path(path)) + { + let label = Path::new(source_path) + .file_stem() + .and_then(|stem| stem.to_str()) + .unwrap_or(source_path) + .to_string(); + let sub_asset_id = format!("texture:{}", stable_material_subasset_slug(source_path)); + let reference = + EditorAssetRef::new(record.id.as_string(), sub_asset_id.clone(), label.clone()) + .with_source_path(source_path); + if !seen.insert((reference.asset_id.clone(), reference.sub_asset_id.clone())) { + continue; + } + textures.push(MaterialTextureCandidate { + label: label.clone(), + detail: format!("{} | {source_path}", asset.label), + reference, + selection: AssetSelection::SubAsset { + parent_path: parent_path.to_string(), + sub_asset_id, + label, + kind: AssetSubAssetKind::Texture, + source_path: Some(source_path.clone()), + }, + thumbnail: MaterialThumbnailPresentation::Pending, + }); + } + } + + textures.sort_by(|left, right| { + natural_cmp(&left.label, &right.label) + .then_with(|| natural_cmp(&left.detail, &right.detail)) + }); + textures +} + +/// Requests thumbnails only for textures currently visible through authored material inputs. +/// +/// Candidate enumeration must remain metadata-only. Eagerly prefetching the full project texture +/// catalog pins every source image in `EguiUserTextures`; a handful of Poly Haven 2K/4K maps can +/// otherwise exhaust VRAM before Solari allocates its view reservoirs. +pub(super) fn prefetch_bound_material_textures<'a>( + world: &mut World, + input_sets: impl IntoIterator, +) { + let references = input_sets + .into_iter() + .flat_map(|inputs| inputs.textures.iter()) + .filter_map(|binding| binding.texture.as_ref()) + .map(|reference| (reference.asset_id.clone(), reference.source_path.clone())) + .collect::>(); + if references.is_empty() { + return; + } + + let registry = world.get_resource::(); + let assets = world + .resource::() + .assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::Texture)) + .filter(|asset| { + let path = asset.path.as_deref(); + let asset_id = path + .and_then(|path| registry.and_then(|registry| find_asset_by_path(registry, path))) + .map(|record| record.id.as_string()); + references.iter().any(|(reference_id, reference_path)| { + asset_id.as_deref() == Some(reference_id.as_str()) + || path.is_some_and(|path| reference_path.as_deref() == Some(path)) + }) + }) + .cloned() + .collect::>(); + prefetch_asset_thumbnails(world, &assets); +} + +fn is_material_texture_path(path: &str) -> bool { + Path::new(path) + .extension() + .and_then(|extension| extension.to_str()) + .is_some_and(|extension| { + matches!( + extension.to_ascii_lowercase().as_str(), + "png" | "jpg" | "jpeg" | "webp" | "ktx2" + ) + }) +} + +fn stable_material_subasset_slug(label: &str) -> String { + let mut slug = String::new(); + for ch in label.chars() { + if ch.is_ascii_alphanumeric() { + slug.push(ch.to_ascii_lowercase()); + } else if !slug.ends_with('_') { + slug.push('_'); + } + } + slug.trim_matches('_').to_string() +} + +pub(super) fn material_shader_settings( + ui: &mut egui::Ui, + asset: &mut MaterialAsset, + shader_schemas: &[(String, String, EditorAssetRef)], + show_kind: bool, +) -> MaterialInputSchema { + if show_kind { + shader_kind_picker(ui, &mut asset.shader.kind); + } + if matches!(asset.shader.kind, MaterialShaderKind::Custom) { + let mut selected_schema = asset.shader.schema_path.clone(); + ui.horizontal(|ui| { + ui.add_sized([92.0, 20.0], egui::Label::new("Schema")); + egui::ComboBox::from_id_salt("asset_material_shader_schema") + .selected_text( + selected_schema + .as_deref() + .and_then(|path| { + shader_schemas + .iter() + .find(|(_, schema_path, _)| schema_path == path) + .map(|(label, _, _)| label.as_str()) + }) + .unwrap_or("(none)"), + ) + .show_ui(ui, |ui| { + if ui + .selectable_label(selected_schema.is_none(), "(none)") + .clicked() + { + selected_schema = None; + } + for (label, path, _) in shader_schemas { + if ui + .selectable_label(selected_schema.as_deref() == Some(path), label) + .clicked() + { + selected_schema = Some(path.clone()); + } + } + }); + }); + if selected_schema != asset.shader.schema_path { + asset.shader.schema_path = selected_schema.clone(); + if let Some(path) = selected_schema.as_deref() { + asset.shader_ref = shader_schemas + .iter() + .find(|(_, schema_path, _)| schema_path == path) + .map(|(_, _, reference)| reference.clone()); + if let Err(error) = apply_shader_schema(asset, path) { + ui.colored_label(egui::Color32::YELLOW, error); + } + } else { + asset.shader_ref = None; + } + } + optional_path_edit(ui, "WGSL shader", &mut asset.shader.shader_path); + if let Some(path) = asset.shader.schema_path.clone() { + ui.horizontal(|ui| { + if ui.button("Reload Schema").clicked() { + if let Err(error) = apply_shader_schema(asset, &path) { + ui.colored_label(egui::Color32::YELLOW, error); + } + } + ui.small(egui::RichText::new(path).color(TEXT_DIM)); + }); + } + } else { + asset.shader_ref = None; + asset.shader.schema_path = None; + asset.shader.shader_path = None; + } + + if matches!(asset.shader.kind, MaterialShaderKind::Custom) { + asset + .shader + .schema_path + .as_deref() + .and_then(|path| ShaderSchemaAsset::load_from_path(path).ok()) + .map(|asset| asset.schema) + .unwrap_or_default() + } else { + standard_lit_input_schema() + } +} + +pub(super) fn apply_shader_schema(asset: &mut MaterialAsset, path: &str) -> Result<(), String> { + let schema = ShaderSchemaAsset::load_from_path(path)?; + asset.shader.kind = schema.kind; + asset.shader.schema_path = Some(path.to_string()); + if asset.shader.shader_path.is_none() { + asset.shader.shader_path = schema.wgsl_path.clone(); + } + + for property in &schema.schema.inputs { + if property.texture.is_some() + || matches!(property.property_type, ShaderPropertyType::Texture) + { + let binding = + ensure_material_texture_binding(&mut asset.inputs.textures, &property.name); + if let Some(texture) = property.texture.as_ref() { + binding.channel = texture.default_channel; + } + } + if matches!(property.property_type, ShaderPropertyType::Texture) { + continue; + } + let default = property + .default_value + .clone() + .unwrap_or_else(|| default_value_for_shader_property(&property.property_type)); + match asset + .inputs + .values + .iter_mut() + .find(|parameter| parameter.name == property.name) + { + Some(parameter) => { + if !parameter_value_matches_property(¶meter.value, &property.property_type) { + parameter.value = default; + } + } + None => asset.inputs.values.push(MaterialParameter { + name: property.name.clone(), + value: default, + }), + } + } + + Ok(()) +} diff --git a/crates/editor/src/ui/materials/inputs.rs b/crates/editor/src/ui/materials/inputs.rs new file mode 100644 index 0000000..d8f7b4b --- /dev/null +++ b/crates/editor/src/ui/materials/inputs.rs @@ -0,0 +1,648 @@ +use super::uv_transform::{material_vec2_value, set_material_vec2_value, uv_transform_section}; +use super::*; + +use crate::ui::design_system; +use crate::ui::design_system::color_picker::{color_control, color_control_with_intensity}; +use crate::ui::design_system::controls::{ + scalar_control, section_frame, section_header, section_header_with_summary, switch, +}; +use crate::ui::design_system::property_grid::PropertyGridGeometry; +use crate::ui::design_system::typography::TypeRole; + +pub(crate) fn material_input_schema_editor( + ui: &mut egui::Ui, + schema: &MaterialInputSchema, + inputs: &mut MaterialInputSet, + texture_assets: &[MaterialTextureCandidate], + drop_candidate: Option<&MaterialTextureCandidate>, +) -> MaterialInputEditorResponse { + material_input_schema_editor_with_inheritance( + ui, + schema, + inputs, + None, + texture_assets, + drop_candidate, + ) +} + +pub(super) fn material_input_schema_editor_with_inheritance( + ui: &mut egui::Ui, + schema: &MaterialInputSchema, + inputs: &mut MaterialInputSet, + inherited: Option<&MaterialInputSet>, + texture_assets: &[MaterialTextureCandidate], + drop_candidate: Option<&MaterialTextureCandidate>, +) -> MaterialInputEditorResponse { + let mut response = MaterialInputEditorResponse::default(); + let has_standard_packed_inputs = ["occlusion", "roughness", "metallic"] + .iter() + .all(|name| schema.inputs.iter().any(|input| input.name == *name)); + let mut groups = schema.groups.clone(); + if groups.is_empty() { + groups.push(shared::MaterialInputGroupDesc { + id: String::new(), + display_name: "Properties".into(), + order: 0, + advanced: false, + }); + } + groups.sort_by_key(|group| group.order); + for group in groups { + let mut properties = schema + .inputs + .iter() + .filter(|property| { + property.group == group.id + && matches!( + property.presentation, + shared::MaterialInputPresentation::Row + ) + }) + .collect::>(); + let companions = schema + .inputs + .iter() + .filter(|property| property.group == group.id) + .filter_map(|property| match &property.presentation { + shared::MaterialInputPresentation::Companion { owner } => { + Some((owner.as_str(), property)) + } + shared::MaterialInputPresentation::Row => None, + }) + .collect::>(); + properties.sort_by_key(|property| property.order); + if properties.is_empty() { + continue; + } + if group.id == "uv_transform" { + material_uv_transform_ui(ui, inputs, inherited); + ui.add_space(8.0); + continue; + } + let open_id = ui.make_persistent_id(("material_input_group_open", &group.id)); + let mut open = ui + .ctx() + .data_mut(|data| data.get_persisted::(open_id)) + .unwrap_or(!group.advanced); + section_frame(ui).show(ui, |ui| { + if group.id == "surface_inputs" { + let summary = format!("{} bindings", properties.len()); + section_header_with_summary(ui, "Inputs", Some(&summary), &mut open); + } else { + section_header(ui, &group.display_name, &mut open); + } + if open { + let rows = material_input_rows( + ui, + &properties, + &companions, + inputs, + texture_assets, + drop_candidate, + ); + response.accepted_drop |= rows.accepted_drop; + response.locate = response.locate.take().or(rows.locate); + response.browse_library |= rows.browse_library; + } + }); + ui.ctx() + .data_mut(|data| data.insert_persisted(open_id, open)); + ui.add_space(8.0); + } + if has_standard_packed_inputs { + super::advanced_preview::unsupported_advanced_preview(ui); + } + response +} + +fn material_uv_transform_ui( + ui: &mut egui::Ui, + inputs: &mut MaterialInputSet, + inherited: Option<&MaterialInputSet>, +) { + let mut offset = material_vec2_value(inputs, "uv_offset", Vec2::ZERO); + let mut tiling = material_vec2_value(inputs, "uv_tiling", Vec2::ONE); + let reset_offset = inherited.map_or(Vec2::ZERO, |inputs| { + material_vec2_value(inputs, "uv_offset", Vec2::ZERO) + }); + let reset_tiling = inherited.map_or(Vec2::ONE, |inputs| { + material_vec2_value(inputs, "uv_tiling", Vec2::ONE) + }); + let original = (offset, tiling); + uv_transform_section(ui, &mut offset, &mut tiling, reset_offset, reset_tiling); + if (offset, tiling) != original { + set_material_vec2_value(inputs, "uv_offset", offset); + set_material_vec2_value(inputs, "uv_tiling", tiling); + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(super) enum PackedMapMode { + Arm, + Separate, +} + +pub(super) fn packed_map_mode(inputs: &MaterialInputSet) -> PackedMapMode { + let channels = [ + ("occlusion", TextureChannel::R), + ("roughness", TextureChannel::G), + ("metallic", TextureChannel::B), + ]; + if channels.iter().all(|(name, channel)| { + inputs + .texture(name) + .is_some_and(|binding| binding.channel == *channel) + }) { + PackedMapMode::Arm + } else { + PackedMapMode::Separate + } +} + +pub(super) fn apply_arm_texture_preset(inputs: &mut MaterialInputSet) { + let shared_texture = ["occlusion", "roughness", "metallic"] + .iter() + .find_map(|name| { + inputs + .texture(name) + .and_then(|binding| binding.texture.clone()) + }); + for (name, channel) in [ + ("occlusion", TextureChannel::R), + ("roughness", TextureChannel::G), + ("metallic", TextureChannel::B), + ] { + let binding = ensure_material_texture_binding(&mut inputs.textures, name); + binding.channel = channel; + if let Some(texture) = shared_texture.clone() { + binding.texture = Some(texture); + } + } +} + +pub(super) fn apply_separate_texture_preset(inputs: &mut MaterialInputSet) { + for name in ["occlusion", "roughness", "metallic"] { + ensure_material_texture_binding(&mut inputs.textures, name).channel = TextureChannel::R; + } +} + +pub(super) fn material_input_rows( + ui: &mut egui::Ui, + properties: &[&MaterialInputDesc], + companions: &[(&str, &MaterialInputDesc)], + inputs: &mut MaterialInputSet, + texture_assets: &[MaterialTextureCandidate], + drop_candidate: Option<&MaterialTextureCandidate>, +) -> MaterialInputEditorResponse { + let palette = design_system::palette(ui); + let mut response = MaterialInputEditorResponse::default(); + let geometry = PropertyGridGeometry::for_width(ui.available_width()); + // Property rows are a contiguous Penpot table. Default egui item spacing otherwise adds four + // pixels between every nominally 31 px row and breaks the reference geometry. + ui.spacing_mut().item_spacing.y = 0.0; + for (row, property) in properties.iter().enumerate() { + let companion = companions + .iter() + .find_map(|(owner, companion)| (*owner == property.name).then_some(*companion)); + ui.push_id(("material_input_row", &property.name), |ui| { + let width = ui.available_width().max(1.0); + let (row_rect, _) = ui + .allocate_exact_size(egui::vec2(width, geometry.row_height), egui::Sense::hover()); + ui.painter().rect_filled( + row_rect, + 0.0, + if row.is_multiple_of(2) { + palette.row_even + } else { + palette.row_odd + }, + ); + let rects = geometry.row_rects(row_rect); + rect_ui(ui, rects.label, |ui| material_input_label(ui, property)); + rect_ui(ui, rects.value, |ui| { + material_input_value_ui(ui, property, companion, inputs) + }); + rect_ui(ui, rects.channel, |ui| { + material_input_channel_ui(ui, property, inputs) + }); + if material_input_uses_texture(property) { + let texture = rect_ui(ui, rects.texture_group, |ui| { + material_input_texture_ui( + ui, + property, + inputs, + texture_assets, + drop_candidate, + rects.inline_texture_actions, + ) + }); + response.accepted_drop |= texture.accepted_drop; + response.locate = response.locate.take().or(texture.locate); + response.browse_library |= texture.browse_library; + } + }); + } + response +} + +fn rect_ui( + ui: &mut egui::Ui, + rect: egui::Rect, + add_contents: impl FnOnce(&mut egui::Ui) -> R, +) -> R { + ui.scope_builder(egui::UiBuilder::new().max_rect(rect), |ui| { + ui.set_clip_rect(rect.intersect(ui.clip_rect())); + add_contents(ui) + }) + .inner +} + +pub(super) fn material_input_label(ui: &mut egui::Ui, property: &MaterialInputDesc) { + let palette = design_system::palette(ui); + ui.add( + egui::Label::new( + TypeRole::Body + .text(&property.display_name) + .color(palette.text_secondary), + ) + .truncate(), + ) + .on_hover_text(&property.tooltip); +} + +pub(super) fn material_input_uses_texture(property: &MaterialInputDesc) -> bool { + property.texture.is_some() || matches!(property.property_type, ShaderPropertyType::Texture) +} + +pub(super) fn material_input_value_ui( + ui: &mut egui::Ui, + property: &MaterialInputDesc, + companion: Option<&MaterialInputDesc>, + inputs: &mut MaterialInputSet, +) { + let MaterialInputSet { values, .. } = inputs; + ui.horizontal(|ui| { + if matches!(property.property_type, ShaderPropertyType::Texture) { + ui.label(egui::RichText::new("Texture").small().color(TEXT_DIM)); + } else { + let default = property + .default_value + .clone() + .unwrap_or_else(|| default_value_for_shader_property(&property.property_type)); + let mut value = values + .iter() + .find(|value| value.name == property.name) + .map(|parameter| parameter.value.clone()) + .unwrap_or(default); + if !parameter_value_matches_property(&value, &property.property_type) { + value = default_value_for_shader_property(&property.property_type); + } + let original = value.clone(); + if matches!(property.property_type, ShaderPropertyType::Color) + && companion.is_some_and(|input| input.name == "emissive_intensity") + { + let companion = companion.expect("checked companion"); + let companion_default = companion + .default_value + .clone() + .unwrap_or(MaterialParameterValue::Float(0.0)); + let mut companion_value = values + .iter() + .find(|value| value.name == companion.name) + .map(|parameter| parameter.value.clone()) + .unwrap_or(companion_default); + if !parameter_value_matches_property(&companion_value, &companion.property_type) { + companion_value = default_value_for_shader_property(&companion.property_type); + } + let original_companion = companion_value.clone(); + if let ( + MaterialParameterValue::Color(color), + MaterialParameterValue::Float(intensity), + ) = (&mut value, &mut companion_value) + { + let mut rgba = [color.r, color.g, color.b, color.a]; + let picker = color_control_with_intensity( + ui, + "material_emissive_color", + &property.display_name, + &mut rgba, + intensity, + ); + if picker.changed { + *color = ColorDesc { + r: rgba[0], + g: rgba[1], + b: rgba[2], + a: rgba[3], + }; + } + } + if value != original { + upsert_material_parameter(values, &property.name, value); + } + if companion_value != original_companion { + upsert_material_parameter(values, &companion.name, companion_value); + } + } else { + material_parameter_control_ui( + ui, + &property.display_name, + &property.property_type, + &mut value, + ); + if value != original { + upsert_material_parameter(values, &property.name, value); + } + } + } + }); +} + +fn upsert_material_parameter( + values: &mut Vec, + name: &str, + value: MaterialParameterValue, +) { + if let Some(parameter) = values.iter_mut().find(|parameter| parameter.name == name) { + parameter.value = value; + } else { + values.push(MaterialParameter { + name: name.to_string(), + value, + }); + } +} + +fn material_input_channel_ui( + ui: &mut egui::Ui, + property: &MaterialInputDesc, + inputs: &mut MaterialInputSet, +) { + let palette = design_system::palette(ui); + if property + .texture + .as_ref() + .is_some_and(|texture| texture.allow_channel_override) + { + let original = material_property_texture_binding(&inputs.textures, property); + let mut binding = original.clone(); + material_texture_channel_ui(ui, property, &mut binding); + if binding != original { + upsert_material_texture_binding(&mut inputs.textures, binding); + } + } else { + let channel = property.texture.as_ref().map(|texture| { + if matches!(texture.semantic, shared::TextureSemantic::Color) { + "RGB" + } else { + texture_channel_label(texture.default_channel) + } + }); + if let Some(channel) = channel { + readonly_channel(ui, channel); + } else { + ui.label(TypeRole::Body.text("—").color(palette.text_muted)); + } + } +} + +pub(super) fn material_input_texture_ui( + ui: &mut egui::Ui, + property: &MaterialInputDesc, + inputs: &mut MaterialInputSet, + texture_assets: &[MaterialTextureCandidate], + drop_candidate: Option<&MaterialTextureCandidate>, + inline_actions: bool, +) -> TextureSlotResponse { + if !material_input_uses_texture(property) { + return TextureSlotResponse::default(); + } + let original = material_property_texture_binding(&inputs.textures, property); + let mut binding = original.clone(); + let response = texture_binding_ui( + ui, + &mut binding, + texture_assets, + drop_candidate, + inline_actions, + ); + if binding != original { + upsert_material_texture_binding(&mut inputs.textures, binding); + } + response +} + +pub(super) fn material_parameter_control_ui( + ui: &mut egui::Ui, + label: &str, + property_type: &ShaderPropertyType, + value: &mut MaterialParameterValue, +) { + if !parameter_value_matches_property(value, property_type) { + *value = default_value_for_shader_property(property_type); + } + match value { + MaterialParameterValue::Bool(value) => { + switch(ui, value); + } + MaterialParameterValue::Float(value) => { + let (min, max) = match property_type { + ShaderPropertyType::Float { min, max } => (*min, *max), + _ => (None, None), + }; + match (min, max) { + (Some(min), Some(max)) => { + scalar_control(ui, label, value, min..=max, usize::from(max <= 1_000.0) * 2); + } + _ => { + ui.add(egui::DragValue::new(value).speed(0.01)); + } + } + } + MaterialParameterValue::Vec2(value) => { + ui.add(egui::DragValue::new(&mut value.x).speed(0.01).prefix("X ")); + ui.add(egui::DragValue::new(&mut value.y).speed(0.01).prefix("Y ")); + } + MaterialParameterValue::Vec3(value) => { + ui.add(egui::DragValue::new(&mut value.x).speed(0.01).prefix("X ")); + ui.add(egui::DragValue::new(&mut value.y).speed(0.01).prefix("Y ")); + ui.add(egui::DragValue::new(&mut value.z).speed(0.01).prefix("Z ")); + } + MaterialParameterValue::Color(value) => { + let mut rgba = [value.r, value.g, value.b, value.a]; + let response = color_control(ui, "material_color", label, &mut rgba); + if response.changed { + *value = ColorDesc { + r: rgba[0], + g: rgba[1], + b: rgba[2], + a: rgba[3], + }; + } + } + MaterialParameterValue::Enum(value) => { + let options = match property_type { + ShaderPropertyType::Enum { options } => options.as_slice(), + _ => &[], + }; + egui::ComboBox::from_id_salt(("material_enum", value.as_str())) + .selected_text(value.as_str()) + .show_ui(ui, |ui| { + for option in options { + ui.selectable_value(value, option.clone(), option); + } + }); + } + } +} + +fn readonly_channel(ui: &mut egui::Ui, channel: &str) { + let palette = design_system::palette(ui); + let (rect, response) = ui.allocate_exact_size(egui::vec2(48.0, 22.0), egui::Sense::hover()); + ui.painter().rect( + rect, + 4.0, + palette.control, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + ui.painter().text( + rect.left_center() + egui::vec2(9.0, 0.0), + egui::Align2::LEFT_CENTER, + channel, + TypeRole::Body.font(), + palette.text_secondary, + ); + ui.painter().text( + rect.right_center() - egui::vec2(8.0, 0.0), + egui::Align2::CENTER_CENTER, + egui_phosphor_icons::icons::CARET_DOWN.as_str(), + egui::FontId::new(9.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.text_muted, + ); + response.on_hover_text("Channel is fixed by this material input"); +} + +pub(super) fn default_value_for_shader_property( + property_type: &ShaderPropertyType, +) -> MaterialParameterValue { + match property_type { + ShaderPropertyType::Bool => MaterialParameterValue::Bool(false), + ShaderPropertyType::Float { .. } => MaterialParameterValue::Float(0.0), + ShaderPropertyType::Vec2 => MaterialParameterValue::Vec2(Vec2::ZERO), + ShaderPropertyType::Vec3 => MaterialParameterValue::Vec3(Vec3::ZERO), + ShaderPropertyType::Color => MaterialParameterValue::Color(ColorDesc::default()), + ShaderPropertyType::Enum { options } => { + MaterialParameterValue::Enum(options.first().cloned().unwrap_or_default()) + } + ShaderPropertyType::Texture => MaterialParameterValue::Float(0.0), + } +} + +pub(super) fn parameter_value_matches_property( + value: &MaterialParameterValue, + property_type: &ShaderPropertyType, +) -> bool { + matches!( + (value, property_type), + (MaterialParameterValue::Bool(_), ShaderPropertyType::Bool) + | ( + MaterialParameterValue::Float(_), + ShaderPropertyType::Float { .. } + ) + | (MaterialParameterValue::Vec2(_), ShaderPropertyType::Vec2) + | (MaterialParameterValue::Vec3(_), ShaderPropertyType::Vec3) + | (MaterialParameterValue::Color(_), ShaderPropertyType::Color) + | ( + MaterialParameterValue::Enum(_), + ShaderPropertyType::Enum { .. } + ) + ) +} + +pub(super) fn compact_text_edit(ui: &mut egui::Ui, label: &str, value: &mut String) { + ui.horizontal(|ui| { + ui.add_sized([92.0, 20.0], egui::Label::new(label)); + ui.add_sized( + [fit_width(ui, 100.0, f32::INFINITY), 22.0], + egui::TextEdit::singleline(value), + ); + }); +} + +pub(super) fn shader_kind_picker(ui: &mut egui::Ui, kind: &mut MaterialShaderKind) { + ui.horizontal(|ui| { + ui.add_sized([92.0, 20.0], egui::Label::new("Shader")); + shader_kind_combo(ui, kind, "asset_material_shader_kind"); + }); +} + +pub(super) fn shader_kind_combo( + ui: &mut egui::Ui, + kind: &mut MaterialShaderKind, + salt: impl std::hash::Hash, +) { + egui::ComboBox::from_id_salt(salt) + .selected_text(match kind { + MaterialShaderKind::StandardLit => "Standard Lit", + MaterialShaderKind::Unlit => "Unlit", + MaterialShaderKind::Custom => "Custom Surface", + }) + .width(150.0_f32.min(ui.available_width().max(1.0))) + .show_ui(ui, |ui| { + ui.selectable_value(kind, MaterialShaderKind::StandardLit, "Standard Lit"); + ui.selectable_value(kind, MaterialShaderKind::Unlit, "Unlit"); + ui.selectable_value(kind, MaterialShaderKind::Custom, "Custom Surface"); + }); +} + +pub(super) fn optional_path_edit(ui: &mut egui::Ui, label: &str, value: &mut Option) { + ui.horizontal(|ui| { + ui.add_sized([92.0, 20.0], egui::Label::new(label)); + let mut text = value.clone().unwrap_or_default(); + if ui + .add_sized( + [fit_width(ui, 80.0, f32::INFINITY), 22.0], + egui::TextEdit::singleline(&mut text), + ) + .changed() + { + *value = if text.trim().is_empty() { + None + } else { + Some(text) + }; + } + if ui.button("Clear").clicked() { + *value = None; + } + }); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn rendering_missing_standard_defaults_does_not_author_or_dirty_inputs() { + let context = egui::Context::default(); + context.set_fonts(crate::ui::fonts::editor_font_definitions()); + let mut inputs = MaterialInputSet::default(); + let original = inputs.clone(); + let schema = shared::standard_lit_input_schema(); + let _ = context.run_ui( + egui::RawInput { + screen_rect: Some(egui::Rect::from_min_size( + egui::Pos2::ZERO, + egui::vec2(700.0, 900.0), + )), + ..Default::default() + }, + |ui| { + material_input_schema_editor(ui, &schema, &mut inputs, &[], None); + }, + ); + assert_eq!(inputs, original); + } +} diff --git a/crates/editor/src/ui/materials/instance_editor.rs b/crates/editor/src/ui/materials/instance_editor.rs new file mode 100644 index 0000000..061adab --- /dev/null +++ b/crates/editor/src/ui/materials/instance_editor.rs @@ -0,0 +1,199 @@ +use super::*; + +pub(crate) fn material_instance_asset_editor( + world: &mut World, + ui: &mut egui::Ui, + asset: &EditorAsset, + path: &str, + show_document_chrome: bool, +) { + let document_key = + crate::asset_documents::ensure_material_instance_document(world, path, &asset.label); + let mut draft = world + .resource::() + .material_instance(&document_key) + .cloned() + .expect("ensured Material Instance document"); + let base_asset = load_live_base_asset(world, &draft.base); + super::editor::prefetch_bound_material_textures( + world, + base_asset + .iter() + .map(|asset| &asset.inputs) + .chain(std::iter::once(&draft.overrides)), + ); + let texture_assets = material_texture_candidates(world); + let texture_drop_candidate = world + .resource::() + .dragging_selection() + .and_then(|selection| { + texture_assets + .iter() + .find(|candidate| candidate.selection == *selection) + }) + .cloned(); + let original = draft.clone(); + + if show_document_chrome { + instance_document_chrome(world, ui, &document_key, &mut draft); + } + + let Some(base_asset) = base_asset else { + ui.colored_label( + ERROR, + "Base Material is missing; this instance renders Default Grid", + ); + if draft != original { + crate::asset_documents::update_material_instance_document(world, &document_key, draft); + } + return; + }; + let schema = material_schema_for_asset(&base_asset).unwrap_or_else(standard_lit_input_schema); + if show_document_chrome { + ui.horizontal(|ui| { + ui.add_sized([92.0, 20.0], egui::Label::new("Shader")); + ui.label(shader_kind_label(base_asset.shader.kind)); + ui.small(egui::RichText::new("Inherited").color(TEXT_MUTED)); + }); + } + ui.add_enabled_ui(false, |ui| { + let mut render_state = base_asset.render_state; + super::asset_editor::material_surface_options_ui( + ui, + &mut render_state, + Some(&mut draft.overrides), + ); + }); + ui.add_space(8.0); + let input_response = super::instance_inputs::material_instance_input_schema_editor( + ui, + &schema, + &base_asset.inputs, + &mut draft.overrides, + &texture_assets, + texture_drop_candidate.as_ref(), + ); + if let Some(selection) = input_response.locate.clone() { + world.resource_mut::().select(selection); + crate::ui::request_editor_tab(world, crate::ui::EditorTab::AssetBrowser); + } + if input_response.browse_library { + crate::ui::request_editor_tab(world, crate::ui::EditorTab::AssetBrowser); + } + if draft != original { + crate::asset_documents::update_material_instance_document(world, &document_key, draft); + } + if input_response.accepted_drop { + world.resource_mut::().clear_drag(); + } +} + +fn instance_document_chrome( + world: &mut World, + ui: &mut egui::Ui, + document_key: &crate::asset_documents::AuthoredAssetDocumentKey, + draft: &mut MaterialInstanceAsset, +) { + if let Some(snapshot) = world + .resource::() + .snapshot(document_key) + { + authored_document_status_ui(ui, &snapshot); + if let Some(error) = snapshot.error.as_ref() { + ui.colored_label(WARNING, error); + } + } + compact_text_edit(ui, "Label", &mut draft.label); + let candidates = material_base_candidates(world); + ui.horizontal(|ui| { + ui.add_sized([92.0, 20.0], egui::Label::new("Base material")); + let selected = candidates + .iter() + .find(|(_, candidate)| candidate.0.asset_id == draft.base.0.asset_id) + .map(|(label, _)| label.as_str()) + .unwrap_or("Missing base"); + egui::ComboBox::from_id_salt("material_instance_base") + .selected_text(selected) + .show_ui(ui, |ui| { + for (label, reference) in &candidates { + if ui + .selectable_label(reference.0.asset_id == draft.base.0.asset_id, label) + .clicked() + { + draft.base = reference.clone(); + } + } + }); + }); + ui.separator(); +} + +fn load_live_base_asset(world: &mut World, reference: &MaterialRef) -> Option { + let path = reference.0.source_path.as_deref()?; + let key = crate::asset_documents::ensure_material_document(world, path, "Base Material"); + world + .resource::() + .material(&key) + .cloned() +} + +fn material_base_candidates(world: &World) -> Vec<(String, MaterialRef)> { + let registry = world.get_resource::(); + let documents = world.get_resource::(); + let mut candidates = world + .resource::() + .assets + .iter() + .filter(|asset| matches!(asset.kind, EditorAssetKind::Material)) + .filter_map(|asset| { + let path = asset.path.as_deref()?; + let is_material = documents + .and_then(|store| store.snapshot_for_path(path)) + .map_or_else( + || MaterialAsset::load_from_path(path).is_ok(), + |snapshot| { + snapshot.key.kind + == crate::asset_documents::AuthoredAssetDocumentKind::Material + }, + ); + if !is_material { + return None; + } + let record = registry.and_then(|registry| find_asset_by_path(registry, path))?; + Some(( + asset.label.clone(), + MaterialRef::new( + EditorAssetRef::new( + record.id.as_string(), + "material:source", + asset.label.clone(), + ) + .with_source_path(path), + ), + )) + }) + .collect::>(); + candidates.sort_by(|left, right| natural_cmp(&left.0, &right.0)); + candidates +} + +fn material_schema_for_asset(asset: &MaterialAsset) -> Option { + if asset.shader.kind != MaterialShaderKind::Custom { + return Some(standard_lit_input_schema()); + } + asset + .shader_ref + .as_ref() + .and_then(|reference| reference.source_path.as_deref()) + .or(asset.shader.schema_path.as_deref()) + .and_then(|path| ShaderSchemaAsset::load_from_path(path).ok()) + .map(|schema| schema.schema) +} + +const fn shader_kind_label(kind: MaterialShaderKind) -> &'static str { + match kind { + MaterialShaderKind::StandardLit => "Standard Lit", + MaterialShaderKind::Unlit => "Unlit", + MaterialShaderKind::Custom => "Custom Surface", + } +} diff --git a/crates/editor/src/ui/materials/instance_inputs.rs b/crates/editor/src/ui/materials/instance_inputs.rs new file mode 100644 index 0000000..a3a2826 --- /dev/null +++ b/crates/editor/src/ui/materials/instance_inputs.rs @@ -0,0 +1,158 @@ +//! Sparse Material Instance authoring through the same Penpot input renderer as Materials. + +use super::*; + +pub(super) fn material_instance_input_schema_editor( + ui: &mut egui::Ui, + schema: &MaterialInputSchema, + base: &MaterialInputSet, + overrides: &mut MaterialInputSet, + texture_assets: &[MaterialTextureCandidate], + drop_candidate: Option<&MaterialTextureCandidate>, +) -> MaterialInputEditorResponse { + let normalized_base = normalized_inputs(schema, base); + let mut effective = normalized_base.clone(); + overlay_inputs(&mut effective, overrides); + + let response = super::inputs::material_input_schema_editor_with_inheritance( + ui, + schema, + &mut effective, + Some(&normalized_base), + texture_assets, + drop_candidate, + ); + *overrides = sparse_difference(&normalized_base, &effective); + response +} + +fn normalized_inputs(schema: &MaterialInputSchema, source: &MaterialInputSet) -> MaterialInputSet { + let mut normalized = source.clone(); + for property in &schema.inputs { + if !matches!(property.property_type, ShaderPropertyType::Texture) + && !normalized + .values + .iter() + .any(|value| value.name == property.name) + { + normalized.values.push(MaterialParameter { + name: property.name.clone(), + value: property + .default_value + .clone() + .unwrap_or_else(|| default_value_for_shader_property(&property.property_type)), + }); + } + if let Some(texture) = property.texture.as_ref() { + if !normalized + .textures + .iter() + .any(|binding| binding.name == property.name) + { + normalized.textures.push(MaterialTextureBinding { + name: property.name.clone(), + texture: None, + channel: texture.default_channel, + }); + } + } + } + normalized +} + +fn overlay_inputs(target: &mut MaterialInputSet, overlay: &MaterialInputSet) { + for value in &overlay.values { + upsert_value(&mut target.values, value.clone()); + } + for texture in &overlay.textures { + upsert_texture(&mut target.textures, texture.clone()); + } +} + +fn sparse_difference(base: &MaterialInputSet, effective: &MaterialInputSet) -> MaterialInputSet { + MaterialInputSet { + values: effective + .values + .iter() + .filter(|value| base.values.iter().find(|base| base.name == value.name) != Some(*value)) + .cloned() + .collect(), + textures: effective + .textures + .iter() + .filter(|texture| { + base.textures.iter().find(|base| base.name == texture.name) != Some(*texture) + }) + .cloned() + .collect(), + } +} + +fn upsert_value(values: &mut Vec, value: MaterialParameter) { + if let Some(current) = values.iter_mut().find(|current| current.name == value.name) { + *current = value; + } else { + values.push(value); + } +} + +fn upsert_texture(textures: &mut Vec, texture: MaterialTextureBinding) { + if let Some(current) = textures + .iter_mut() + .find(|current| current.name == texture.name) + { + *current = texture; + } else { + textures.push(texture); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn instance_editor_retains_only_values_different_from_base() { + let schema = standard_lit_input_schema(); + let base = normalized_inputs(&schema, &MaterialInputSet::default()); + let mut effective = base.clone(); + let roughness = effective + .values + .iter_mut() + .find(|value| value.name == "roughness") + .expect("roughness default"); + roughness.value = MaterialParameterValue::Float(0.2); + + let overrides = sparse_difference(&base, &effective); + + assert_eq!(overrides.values.len(), 1); + assert_eq!(overrides.values[0].name, "roughness"); + assert!(overrides.textures.is_empty()); + } + + #[test] + fn instance_editor_clearing_back_to_base_removes_override() { + let schema = standard_lit_input_schema(); + let base = normalized_inputs(&schema, &MaterialInputSet::default()); + let overrides = sparse_difference(&base, &base); + assert!(overrides.values.is_empty()); + assert!(overrides.textures.is_empty()); + } + + #[test] + fn instance_overlay_preserves_unknown_custom_schema_values() { + let mut effective = MaterialInputSet::default(); + let overrides = MaterialInputSet { + values: vec![MaterialParameter { + name: "graph_custom".into(), + value: MaterialParameterValue::Float(3.0), + }], + textures: Vec::new(), + }; + overlay_inputs(&mut effective, &overrides); + assert_eq!( + sparse_difference(&MaterialInputSet::default(), &effective), + overrides + ); + } +} diff --git a/crates/editor/src/ui/materials/layout.rs b/crates/editor/src/ui/materials/layout.rs new file mode 100644 index 0000000..3dfd3ab --- /dev/null +++ b/crates/editor/src/ui/materials/layout.rs @@ -0,0 +1,343 @@ +//! Numeric Penpot v2.3.1 material-panel geometry shared by rendering and tests. + +use bevy_egui::egui; + +use crate::ui::design_system::{ + ADVANCED_COLLAPSED_HEIGHT, ADVANCED_EXPANDED_HEIGHT, COLLAPSED_HEADER_HEIGHT, HEADER_HEIGHT, + INPUT_SECTION_HEADER_HEIGHT, MATERIAL_IDENTITY_WIDTH, MATERIAL_PREVIEW_SIZE, OUTER_PADDING, + PARAMETER_ROW_HEIGHT, SECTION_GAP, SURFACE_SECTION_HEIGHT, UV_SECTION_HEIGHT, +}; + +/// Smallest canvas that can still contain the exported compact Surface controls. +/// +/// The Penpot board owns a 372 px parameter section. In the actor Inspector, component-card +/// chrome can temporarily reduce that canvas by a few pixels even while the Inspector itself is +/// at its supported 420 px floor. The fixed compact controls only require 362 px, so keep the +/// intended two-line layout until that real containment limit and reserve `Transient` for actual +/// sub-minimum docking frames. +pub(super) const COMPACT_SECTION_WIDTH: f32 = 357.0; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(super) enum ResponsiveMaterialLayout { + Reference, + Compact, + Transient, +} + +impl ResponsiveMaterialLayout { + pub(super) fn for_width(width: f32) -> Self { + if width + f32::EPSILON >= crate::ui::design_system::property_grid::WIDE_SECTION_WIDTH { + Self::Reference + } else if width + f32::EPSILON >= COMPACT_SECTION_WIDTH { + Self::Compact + } else { + Self::Transient + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(super) struct SurfaceSectionGeometry { + pub height: f32, + pub title: egui::Rect, + pub blend: egui::Rect, + pub packed: egui::Rect, + pub double_sided: egui::Rect, +} + +impl SurfaceSectionGeometry { + pub(super) fn for_rect(rect: egui::Rect) -> Self { + let local = |x: f32, y: f32, width: f32, height: f32| { + let x = x.clamp(0.0, rect.width()); + let y = y.clamp(0.0, rect.height()); + egui::Rect::from_min_size( + rect.min + egui::vec2(x, y), + egui::vec2( + width.max(0.0).min(rect.width() - x), + height.max(0.0).min(rect.height() - y), + ), + ) + }; + match ResponsiveMaterialLayout::for_width(rect.width()) { + ResponsiveMaterialLayout::Reference => Self { + height: SURFACE_SECTION_HEIGHT, + title: local(10.0, 10.0, 48.0, 26.0), + blend: local(66.0, 10.0, 250.0, 26.0), + packed: local(324.0, 11.0, 128.0, 24.0), + double_sided: local(460.0, 12.0, 99.0, 22.0), + }, + ResponsiveMaterialLayout::Compact => Self { + height: crate::ui::design_system::COMPACT_SURFACE_SECTION_HEIGHT, + title: local(10.0, 10.0, 48.0, 26.0), + blend: local(66.0, 10.0, 50.0, 26.0), + packed: local(124.0, 11.0, 128.0, 24.0), + double_sided: local(260.0, 12.0, 99.0, 22.0), + }, + ResponsiveMaterialLayout::Transient => Self { + height: 100.0, + title: local(10.0, 10.0, 48.0, 26.0), + blend: local(66.0, 10.0, (rect.width() - 76.0).clamp(1.0, 250.0), 26.0), + packed: local(10.0, 42.0, (rect.width() - 20.0).clamp(0.0, 128.0), 24.0), + double_sided: local(146.0, 43.0, (rect.width() - 156.0).clamp(0.0, 99.0), 22.0), + }, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(super) struct UvGroupGeometry { + pub label: egui::Rect, + pub x: egui::Rect, + pub y: egui::Rect, + pub reset: Option, +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(super) struct UvSectionGeometry { + pub height: f32, + pub title: egui::Rect, + pub offset: UvGroupGeometry, + pub tiling: UvGroupGeometry, +} + +impl UvSectionGeometry { + pub(super) fn for_rect(rect: egui::Rect) -> Self { + let mode = ResponsiveMaterialLayout::for_width(rect.width()); + let title = egui::Rect::from_min_size( + rect.min + egui::vec2(12.0, 7.0), + egui::vec2(20.0_f32.min(rect.width()), 40.0_f32.min(rect.height())), + ); + if mode == ResponsiveMaterialLayout::Transient { + let group_width = (rect.width() - 20.0).max(1.0); + return Self { + height: 100.0, + title, + offset: uv_group(rect.min + egui::vec2(42.0, 7.0), group_width), + tiling: uv_group(rect.min + egui::vec2(42.0, 47.0), group_width), + }; + } + if mode == ResponsiveMaterialLayout::Reference { + Self { + height: UV_SECTION_HEIGHT, + title, + offset: uv_group(rect.min + egui::vec2(104.667, 7.0), 165.0), + tiling: uv_group(rect.min + egui::vec2(332.333, 7.0), 164.0), + } + } else { + Self { + height: crate::ui::design_system::COMPACT_UV_SECTION_HEIGHT, + title, + offset: uv_group(rect.min + egui::vec2(118.0, 7.0), 165.0), + tiling: uv_group(rect.min + egui::vec2(118.5, 47.0), 164.0), + } + } + } +} + +fn uv_group(origin: egui::Pos2, group_width: f32) -> UvGroupGeometry { + let local = |x: f32, y: f32, control_width: f32, height: f32| { + let x = x.clamp(0.0, group_width.max(0.0)); + egui::Rect::from_min_size( + origin + egui::vec2(x, y), + egui::vec2(control_width.max(0.0).min(group_width - x), height), + ) + }; + let reset = (group_width >= 164.0).then(|| local(group_width - 24.0, 8.0, 24.0, 24.0)); + UvGroupGeometry { + label: local(0.0, 10.0, 25.0, 20.0), + x: local(30.0, 8.0, 50.0, 24.0), + y: local(86.0, 8.0, 50.0, 24.0), + reset, + } +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub(super) struct MaterialPanelGeometry { + pub header: f32, + pub collapsed_header: f32, + pub asset_zone: f32, + pub surface: f32, + pub input_header: f32, + pub input_row: f32, + pub uv: f32, + pub advanced_collapsed: f32, + pub advanced_expanded: f32, + pub preview: f32, + pub identity: f32, + pub outer_padding: f32, + pub section_gap: f32, +} + +impl MaterialPanelGeometry { + pub(super) const REFERENCE: Self = Self { + header: HEADER_HEIGHT, + collapsed_header: COLLAPSED_HEADER_HEIGHT, + asset_zone: HEADER_HEIGHT, + surface: SURFACE_SECTION_HEIGHT, + input_header: INPUT_SECTION_HEADER_HEIGHT, + input_row: PARAMETER_ROW_HEIGHT, + uv: UV_SECTION_HEIGHT, + advanced_collapsed: ADVANCED_COLLAPSED_HEIGHT, + advanced_expanded: ADVANCED_EXPANDED_HEIGHT, + preview: MATERIAL_PREVIEW_SIZE, + identity: MATERIAL_IDENTITY_WIDTH, + outer_padding: OUTER_PADDING, + section_gap: SECTION_GAP, + }; + + #[cfg(test)] + pub(super) const fn slot_width(inspector_width: f32) -> f32 { + inspector_width - OUTER_PADDING * 2.0 + } + + #[cfg(test)] + pub(super) const fn parameter_width(slot_width: f32) -> f32 { + slot_width - 27.0 + } + + #[cfg(test)] + pub(super) const fn inputs_height(compact: bool, primary_rows: usize) -> f32 { + INPUT_SECTION_HEADER_HEIGHT + + primary_rows as f32 + * if compact { + crate::ui::design_system::COMPACT_PARAMETER_ROW_HEIGHT + } else { + PARAMETER_ROW_HEIGHT + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn final_penpot_reference_geometry_is_exact() { + let geometry = MaterialPanelGeometry::REFERENCE; + assert_eq!(geometry.header, 82.0); + assert_eq!(geometry.collapsed_header, 52.0); + assert_eq!(geometry.asset_zone, 82.0); + assert_eq!(geometry.surface, 46.0); + assert_eq!(geometry.input_header, 24.0); + assert_eq!(geometry.input_row, 32.0); + assert_eq!(geometry.uv, 54.0); + assert_eq!(geometry.advanced_collapsed, 30.0); + assert_eq!(geometry.advanced_expanded, 178.0); + assert_eq!(geometry.preview, 64.0); + assert_eq!(geometry.identity, 229.5); + assert_eq!(620.0 - OUTER_PADDING * 2.0, 596.0); + assert_eq!(420.0 - OUTER_PADDING * 2.0, 396.0); + assert_eq!(MaterialPanelGeometry::slot_width(620.0), 596.0); + assert_eq!(MaterialPanelGeometry::slot_width(420.0), 396.0); + assert_eq!(MaterialPanelGeometry::parameter_width(596.0), 569.0); + assert_eq!(MaterialPanelGeometry::parameter_width(396.0), 369.0); + assert_eq!(MaterialPanelGeometry::inputs_height(false, 6), 216.0); + assert_eq!(MaterialPanelGeometry::inputs_height(true, 6), 372.0); + } + + #[test] + fn surface_geometry_matches_both_exported_references() { + let wide = SurfaceSectionGeometry::for_rect(egui::Rect::from_min_size( + egui::Pos2::ZERO, + egui::vec2(569.0, 46.0), + )); + assert_eq!( + wide.title, + egui::Rect::from_min_size(egui::pos2(10.0, 10.0), egui::vec2(48.0, 26.0)) + ); + assert_eq!( + wide.blend, + egui::Rect::from_min_size(egui::pos2(66.0, 10.0), egui::vec2(250.0, 26.0)) + ); + assert_eq!( + wide.packed, + egui::Rect::from_min_size(egui::pos2(324.0, 11.0), egui::vec2(128.0, 24.0)) + ); + assert_eq!( + wide.double_sided, + egui::Rect::from_min_size(egui::pos2(460.0, 12.0), egui::vec2(99.0, 22.0)) + ); + + let narrow = SurfaceSectionGeometry::for_rect(egui::Rect::from_min_size( + egui::Pos2::ZERO, + egui::vec2(369.0, 46.0), + )); + assert_eq!( + narrow.blend, + egui::Rect::from_min_size(egui::pos2(66.0, 10.0), egui::vec2(50.0, 26.0)) + ); + assert_eq!( + narrow.packed, + egui::Rect::from_min_size(egui::pos2(124.0, 11.0), egui::vec2(128.0, 24.0)) + ); + assert_eq!( + narrow.double_sided, + egui::Rect::from_min_size(egui::pos2(260.0, 12.0), egui::vec2(99.0, 22.0)) + ); + } + + #[test] + fn uv_geometry_centers_title_and_keeps_independent_resets() { + for (width, height) in [(569.0, 54.0), (369.0, 94.0)] { + let section = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(width, height)); + let geometry = UvSectionGeometry::for_rect(section); + assert_eq!(geometry.title.min, egui::pos2(12.0, 7.0)); + assert_eq!(geometry.offset.x.size(), egui::vec2(50.0, 24.0)); + assert_eq!(geometry.offset.y.size(), egui::vec2(50.0, 24.0)); + assert!(geometry.offset.reset.is_some()); + assert!(geometry.tiling.reset.is_some()); + for rect in [ + geometry.title, + geometry.offset.label, + geometry.offset.x, + geometry.offset.y, + geometry.offset.reset.expect("reference reset"), + geometry.tiling.label, + geometry.tiling.x, + geometry.tiling.y, + geometry.tiling.reset.expect("reference reset"), + ] { + assert!(section.contains_rect(rect)); + assert!(rect.is_finite()); + } + } + } + + #[test] + fn transient_geometry_stays_finite_and_bounded() { + let section = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(300.0, 100.0)); + let surface = SurfaceSectionGeometry::for_rect(section); + let uv = UvSectionGeometry::for_rect(section); + for rect in [ + surface.title, + surface.blend, + surface.packed, + surface.double_sided, + ] { + assert!(rect.is_finite()); + assert!(section.contains_rect(rect)); + } + for rect in [ + uv.title, + uv.offset.label, + uv.offset.x, + uv.offset.y, + uv.tiling.label, + uv.tiling.x, + uv.tiling.y, + ] { + assert!(rect.is_finite()); + assert!(section.contains_rect(rect)); + } + } + + #[test] + fn inspector_chrome_reduced_floor_keeps_the_penpot_compact_surface() { + let section = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(363.0, 46.0)); + let surface = SurfaceSectionGeometry::for_rect(section); + assert_eq!(surface.height, 46.0); + assert_eq!(surface.packed.min, egui::pos2(124.0, 11.0)); + assert_eq!(surface.packed.max, egui::pos2(252.0, 35.0)); + assert_eq!(surface.double_sided.min, egui::pos2(260.0, 12.0)); + } +} diff --git a/crates/editor/src/ui/materials/mod.rs b/crates/editor/src/ui/materials/mod.rs new file mode 100644 index 0000000..0229726 --- /dev/null +++ b/crates/editor/src/ui/materials/mod.rs @@ -0,0 +1,113 @@ +//! Shared Material authoring presentation contracts. +//! +//! World queries and scene mutations stay with callers. Widgets render a compact view model and +//! return explicit actions, which keeps Inspector, Content Browser, and Material Library behavior +//! consistent without giving UI code arbitrary world access. + +use std::collections::HashSet; +use std::path::Path; + +use bevy::prelude::{Vec2, Vec3, World}; +use bevy_egui::egui; +use egui_phosphor_icons::{icons, Icon}; +use shared::{ + standard_lit_input_schema, ColorDesc, EditorAssetRef, MaterialAlphaMode, MaterialAsset, + MaterialInputDesc, MaterialInputSchema, MaterialInputSet, MaterialInstanceAsset, + MaterialParameter, MaterialParameterValue, MaterialRef, MaterialShaderKind, + MaterialTextureBinding, ShaderPropertyType, ShaderSchemaAsset, TextureChannel, +}; + +use crate::asset_db::{ensure_asset_record, find_asset_by_path, save_registry}; +use crate::assets::static_mesh::load_static_mesh_manifest; +use crate::assets::{ + invalidate_on_catalog_refresh, prefetch_asset_thumbnails, AssetSelection, AssetSubAssetKind, + EditorAsset, EditorAssetKind, EditorAssets, +}; +use crate::project::collaboration::{publish_authored_file, FileSnapshot, FileWriteIntent}; +use crate::scene_io::SceneIo; +use crate::ui::document_status::authored_document_status_ui; + +use super::theme::{ERROR, TEXT_DIM, TEXT_MUTED, WARNING}; + +mod advanced_preview; +mod asset_editor; +mod editor; +mod inputs; +mod instance_editor; +mod instance_inputs; +mod layout; +mod panel; +mod pickers; +mod texture_inputs; +mod uv_transform; + +pub(crate) use asset_editor::material_asset_editor; +pub(crate) use editor::{ + create_material_instance_from_base, inline_material_document_editor, material_shader_kind, + material_shader_label, set_material_shader_kind, +}; +use editor::{material_shader_settings, material_texture_candidates, shader_schema_assets}; +pub(crate) use inputs::material_input_schema_editor; +use inputs::*; +pub(crate) use instance_editor::material_instance_asset_editor; +pub(crate) use panel::{ + material_slot_panel, materials_section, MaterialHealth, MaterialLayerBadge, + MaterialPickerCandidate, MaterialSlotAction, MaterialSlotPanelViewModel, + MaterialsSectionViewModel, +}; +use texture_inputs::*; + +const PHOSPHOR: &str = "phosphor-regular"; + +#[derive(Clone, Debug)] +pub(crate) struct MaterialTextureCandidate { + label: String, + detail: String, + reference: EditorAssetRef, + selection: AssetSelection, + thumbnail: MaterialThumbnailPresentation, +} + +#[derive(Clone, Copy, Debug, PartialEq)] +pub(crate) enum MaterialThumbnailPresentation { + Ready(egui::TextureId), + Pending, + Failed, +} + +#[derive(Clone, Copy)] +enum TextureSlotSelection<'a> { + Reference(Option<&'a EditorAssetRef>), +} + +#[derive(Default)] +struct TextureSlotResponse { + selected: Option, + locate: Option, + clear: bool, + accepted_drop: bool, + browse_library: bool, +} + +#[derive(Default)] +pub(crate) struct MaterialInputEditorResponse { + pub accepted_drop: bool, + pub locate: Option, + pub browse_library: bool, +} + +fn fit_width(ui: &egui::Ui, min: f32, max: f32) -> f32 { + let available = ui.available_width().max(1.0); + available.min(max).max(min.min(available)) +} + +fn icon_text(icon: Icon, size: f32) -> egui::RichText { + egui::RichText::new(icon.as_str()).font(egui::FontId::new( + size, + egui::FontFamily::Name(PHOSPHOR.into()), + )) +} + +fn natural_cmp(left: &str, right: &str) -> std::cmp::Ordering { + left.to_ascii_lowercase().cmp(&right.to_ascii_lowercase()) +} diff --git a/crates/editor/src/ui/materials/panel.rs b/crates/editor/src/ui/materials/panel.rs new file mode 100644 index 0000000..4e98c77 --- /dev/null +++ b/crates/editor/src/ui/materials/panel.rs @@ -0,0 +1,743 @@ +//! Action-returning Penpot material-slot shell shared by primitive and mesh inspectors. + +use bevy_egui::egui; +use egui_phosphor_icons::icons; +use shared::{EditorAssetRef, MaterialShaderKind}; + +use super::layout::MaterialPanelGeometry; +use super::MaterialThumbnailPresentation; +use crate::ui::design_system::controls::{icon_button, icon_label, status}; +use crate::ui::design_system::typography::TypeRole; +use crate::ui::design_system::{self, DesignPalette, HEADER_HEIGHT}; +use crate::ui::widgets::phosphor_icon; + +const SLOT_ACCENT_X: f32 = 8.0; +const SLOT_CARET_CENTER_X: f32 = 23.0; +const SLOT_PREVIEW_X: f32 = 35.0; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum MaterialLayerBadge { + ModelSource, + ModelDefault, + ProjectDefault, + DefaultGrid, +} + +impl MaterialLayerBadge { + pub(crate) const fn label(self) -> &'static str { + match self { + Self::ModelSource => "Model Source", + Self::ModelDefault => "Model Default", + Self::ProjectDefault => "Project Default", + Self::DefaultGrid => "Default Grid", + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum MaterialHealth { + Healthy, + Dirty, + Processing, + Broken, + ReadOnly, +} + +impl MaterialHealth { + fn presentation(self, palette: DesignPalette) -> (egui::Color32, &'static str, &'static str) { + match self { + Self::Healthy => ( + palette.healthy, + "Compiled", + "Material is resolved and up to date", + ), + Self::Dirty => ( + palette.warning, + "Unsaved", + "Material has unsaved in-memory changes", + ), + Self::Processing => ( + palette.accent, + "Processing", + "Derived material data is processing", + ), + Self::Broken => ( + palette.error, + "Failed", + "Material reference or processing failed", + ), + Self::ReadOnly => ( + palette.text_muted, + "Read only", + "This material cannot be edited in place", + ), + } + } +} + +#[derive(Debug, Clone)] +pub(crate) struct MaterialPickerCandidate { + pub reference: EditorAssetRef, + pub label: String, + pub detail: String, + pub thumbnail: MaterialThumbnailPresentation, +} + +#[derive(Debug, Clone)] +pub(crate) struct MaterialSlotPanelViewModel { + pub slot_id: String, + pub label: String, + pub path: Option, + pub shader: String, + pub shader_kind: Option, + pub can_edit_shader: bool, + pub thumbnail: MaterialThumbnailPresentation, + pub inherited: Option, + pub health: MaterialHealth, + pub assigned: Option, + pub effective: Option, + pub candidates: Vec, + pub drop_candidate: Option, + pub invalid_drop_reason: Option, + pub can_locate: bool, + pub can_clear: bool, + pub can_extract: bool, + pub can_create_instance: bool, +} + +#[derive(Debug, Clone, PartialEq)] +pub(crate) enum MaterialSlotAction { + Assign { + reference: EditorAssetRef, + from_drop: bool, + }, + BrowseLibrary, + Locate, + Clear, + ExtractEditable, + CreateInstance, + SetShader(MaterialShaderKind), +} + +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct MaterialSlotPanelAction { + pub slot_id: String, + pub action: MaterialSlotAction, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub(crate) struct MaterialsSectionViewModel { + pub slot_ids: Vec, +} + +pub(crate) struct MaterialSlotPanelResponse { + pub actions: Vec, +} + +pub(crate) fn materials_section( + ui: &mut egui::Ui, + _view: &MaterialsSectionViewModel, + add_slots: impl FnOnce(&mut egui::Ui) -> R, +) -> R { + let start = ui.next_widget_position(); + let expanded = actor_materials_rect(ui.max_rect(), start.y); + let mut child = ui.new_child( + egui::UiBuilder::new() + .max_rect(expanded) + .layout(egui::Layout::top_down(egui::Align::Min)), + ); + child.set_clip_rect(ui.clip_rect()); + let result = design_system::scope(&mut child, |ui| { + let palette = design_system::palette(ui); + ui.allocate_ui_with_layout( + egui::vec2( + ui.available_width().max(1.0), + design_system::MATERIALS_HEADING_HEIGHT, + ), + egui::Layout::left_to_right(egui::Align::Center), + |ui| { + ui.label( + TypeRole::Title + .text("Materials") + .color(palette.text_primary), + ); + }, + ); + ui.add_space(8.0); + add_slots(ui) + }); + // `min_rect` is not a safe content-height signal for a child hosted by a ScrollArea: nested + // frames may temporarily inherit the parent's virtual extent even though their layout cursor + // has only advanced through finite authored rows. Advancing from that rect creates a phantom + // tail after multi-slot renderers and lets the Inspector scrollbar enter an empty region. + // The cursor is the authoritative end of this top-down section. + let used_bottom = materials_used_bottom(child.next_widget_position().y, start.y); + ui.advance_cursor_after_rect(egui::Rect::from_min_max( + egui::pos2(ui.max_rect().left(), start.y), + egui::pos2(ui.max_rect().right(), used_bottom), + )); + result +} + +fn actor_materials_rect(body: egui::Rect, start_y: f32) -> egui::Rect { + // A ScrollArea content Ui has an effectively unbounded max-rect in its scrolling direction. + // Carrying that bottom edge into the child gives the Materials section a phantom multi-screen + // height even though its painted contents are finite. Seed only the exported width here; egui + // grows the zero-height child as headings and slots are actually allocated. + egui::Rect::from_min_size( + egui::pos2(body.left(), start_y), + egui::vec2(body.width(), 0.0), + ) +} + +fn materials_used_bottom(cursor_y: f32, start_y: f32) -> f32 { + if cursor_y.is_finite() { + cursor_y.max(start_y) + } else { + start_y + } +} + +pub(crate) fn material_slot_panel( + ui: &mut egui::Ui, + id: impl std::hash::Hash, + view: &MaterialSlotPanelViewModel, + content_ui: impl FnOnce(&mut egui::Ui), + diagnostics_ui: impl FnOnce(&mut egui::Ui), +) -> MaterialSlotPanelResponse { + design_system::scope(ui, |ui| { + let palette = design_system::palette(ui); + let id = ui.make_persistent_id(id); + let open_id = id.with("parameters_open"); + let mut parameters_open = ui + .ctx() + .data_mut(|data| data.get_persisted::(open_id)) + .unwrap_or(true); + let mut slot_actions = Vec::new(); + + egui::Frame::new() + .fill(palette.panel) + .stroke(egui::Stroke::new(1.0_f32, palette.border)) + .corner_radius(egui::CornerRadius::same(8)) + .show(ui, |ui| { + slot_header( + ui, + id, + view, + &mut parameters_open, + &mut slot_actions, + diagnostics_ui, + ); + if parameters_open { + parameter_body(ui, content_ui); + } + ui.ctx() + .data_mut(|data| data.insert_persisted(open_id, parameters_open)); + }); + MaterialSlotPanelResponse { + actions: slot_actions + .into_iter() + .map(|action| MaterialSlotPanelAction { + slot_id: view.slot_id.clone(), + action, + }) + .collect(), + } + }) +} + +fn slot_header( + ui: &mut egui::Ui, + id: egui::Id, + view: &MaterialSlotPanelViewModel, + open: &mut bool, + actions: &mut Vec, + diagnostics_ui: impl FnOnce(&mut egui::Ui), +) { + let palette = design_system::palette(ui); + let height = if *open { + HEADER_HEIGHT + } else { + MaterialPanelGeometry::REFERENCE.collapsed_header + }; + let width = ui.available_width().max(1.0); + let (rect, response) = ui.allocate_exact_size(egui::vec2(width, height), egui::Sense::click()); + ui.painter().rect_filled(rect, 7.0, palette.recessed); + ui.painter().rect_filled( + egui::Rect::from_min_size( + rect.min + egui::vec2(SLOT_ACCENT_X, 8.0), + egui::vec2(3.0, height - 16.0), + ), + 2.0, + palette.accent, + ); + let caret_rect = egui::Rect::from_center_size( + egui::pos2(rect.left() + SLOT_CARET_CENTER_X, rect.center().y), + egui::vec2(18.0, 28.0), + ); + let caret = ui.put( + caret_rect, + egui::Button::new(phosphor_icon( + if *open { + icons::CARET_DOWN + } else { + icons::CARET_RIGHT + }, + 12.0, + )) + .frame(false), + ); + if caret.clicked() { + *open = !*open; + } + let preview_size = if *open { 64.0 } else { 32.0 }; + let preview_rect = egui::Rect::from_min_size( + egui::pos2( + rect.left() + SLOT_PREVIEW_X, + rect.center().y - preview_size * 0.5, + ), + egui::vec2(preview_size, preview_size), + ); + let preview = material_thumbnail_at(ui, view, preview_rect); + let action_width = 140.0; + let identity_left = preview_rect.right() + 6.0; + let actions_left = rect.right() - action_width - 8.0; + let identity_right = (identity_left + design_system::MATERIAL_IDENTITY_WIDTH) + .min(actions_left) + .max(identity_left + 1.0); + let identity_rect = egui::Rect::from_min_max( + egui::pos2(identity_left, rect.top() + if *open { 8.0 } else { 7.0 }), + egui::pos2( + identity_right, + rect.bottom() - if *open { 8.0 } else { 7.0 }, + ), + ); + let identity = ui + .scope_builder(egui::UiBuilder::new().max_rect(identity_rect), |ui| { + ui.set_clip_rect(identity_rect.intersect(ui.clip_rect())); + if *open { + material_identity(ui, view, actions) + } else { + compact_material_identity(ui, view) + } + }) + .inner; + let actions_rect = egui::Rect::from_min_size( + egui::pos2(actions_left, rect.top() + 7.0), + egui::vec2(action_width, height - 14.0), + ); + ui.scope_builder(egui::UiBuilder::new().max_rect(actions_rect), |ui| { + if *open { + ui.with_layout(egui::Layout::top_down(egui::Align::Max), |ui| { + let (color, label, tooltip) = view.health.presentation(palette); + ui.horizontal(|ui| status(ui, color, label, tooltip)); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + overflow_menu(ui, view, actions, diagnostics_ui); + if view.can_clear + && icon_button(ui, icons::X, "Clear actor assignment", true).clicked() + { + actions.push(MaterialSlotAction::Clear); + } + if view.can_locate + && icon_button(ui, icons::CROSSHAIR, "Locate in Content Browser", true) + .clicked() + { + actions.push(MaterialSlotAction::Locate); + } + if icon_button(ui, icons::FOLDER_OPEN, "Browse project materials", true) + .clicked() + { + actions.push(MaterialSlotAction::BrowseLibrary); + } + }); + }); + } else { + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + overflow_menu(ui, view, actions, diagnostics_ui); + let (color, label, tooltip) = view.health.presentation(palette); + ui.horizontal(|ui| status(ui, color, label, tooltip)); + }); + } + }); + if response.clicked() { + if let Some(pointer) = ui.input(|input| input.pointer.interact_pos()) { + if !caret_rect.contains(pointer) + && !preview_rect.contains(pointer) + && !identity_rect.contains(pointer) + && !actions_rect.contains(pointer) + { + *open = !*open; + } + } + } + super::pickers::material_picker_popup( + ui, + id.with("material_picker"), + &preview.union(identity), + view, + actions, + ); + if response.hovered() + && view.drop_candidate.is_some() + && ui.input(|input| input.pointer.any_released()) + { + if let Some(candidate) = view.drop_candidate.as_ref() { + actions.push(MaterialSlotAction::Assign { + reference: candidate.reference.clone(), + from_drop: true, + }); + } + } + if response.hovered() { + if let Some(reason) = view.invalid_drop_reason.as_deref() { + response.on_hover_text(reason); + } + } +} + +fn compact_material_identity( + ui: &mut egui::Ui, + view: &MaterialSlotPanelViewModel, +) -> egui::Response { + let palette = design_system::palette(ui); + let name = ui + .add( + egui::Label::new( + TypeRole::Section + .text(&view.label) + .color(palette.text_primary), + ) + .truncate() + .sense(egui::Sense::click()), + ) + .on_hover_text(&view.label); + let detail_text = view + .inherited + .map(MaterialLayerBadge::label) + .unwrap_or(view.shader.as_str()); + let detail = ui + .add( + egui::Label::new(TypeRole::Small.text(detail_text).color(palette.text_muted)) + .truncate() + .sense(egui::Sense::click()), + ) + .on_hover_text(detail_text); + name.union(detail) +} + +fn parameter_body(ui: &mut egui::Ui, content_ui: impl FnOnce(&mut egui::Ui)) { + let palette = design_system::palette(ui); + egui::Frame::new() + .fill(palette.panel) + .inner_margin(egui::Margin { + left: 19, + right: 8, + top: 8, + bottom: 8, + }) + .show(ui, |ui| { + ui.label(TypeRole::Caption.text("PARAMETERS").color(palette.accent)); + let spine_x = ui.min_rect().left() - 7.0; + let spine_top = ui.cursor().top(); + content_ui(ui); + let spine_bottom = ui.min_rect().bottom().max(spine_top); + ui.painter().vline( + spine_x, + spine_top..=spine_bottom, + egui::Stroke::new(1.0_f32, palette.accent), + ); + }); +} + +fn material_identity( + ui: &mut egui::Ui, + view: &MaterialSlotPanelViewModel, + actions: &mut Vec, +) -> egui::Response { + let palette = design_system::palette(ui); + let name = ui + .add( + egui::Label::new( + TypeRole::Section + .text(&view.label) + .color(palette.text_primary), + ) + .truncate() + .sense(egui::Sense::click()), + ) + .on_hover_text(&view.label); + let path = view.path.as_deref().unwrap_or("Engine built-in material"); + let identity = view.inherited.map_or_else( + || path.to_string(), + |layer| format!("{path} · {}", layer.label()), + ); + let detail = ui + .add( + egui::Label::new(TypeRole::Small.text(&identity).color(palette.text_muted)) + .truncate() + .sense(egui::Sense::click()), + ) + .on_hover_text(&identity); + if view.can_edit_shader { + if let Some(mut kind) = view.shader_kind { + egui::ComboBox::from_id_salt("material_identity_shader_kind") + .selected_text(&view.shader) + .width(150.0_f32.min(ui.available_width().max(1.0))) + .show_ui(ui, |ui| { + ui.selectable_value(&mut kind, MaterialShaderKind::StandardLit, "Standard Lit"); + ui.selectable_value(&mut kind, MaterialShaderKind::Unlit, "Unlit"); + ui.selectable_value(&mut kind, MaterialShaderKind::Custom, "Custom Surface"); + }); + if Some(kind) != view.shader_kind { + actions.push(MaterialSlotAction::SetShader(kind)); + } + } + } else { + ui.add_sized( + [150.0_f32.min(ui.available_width().max(1.0)), 22.0], + egui::Label::new( + TypeRole::Body + .text(&view.shader) + .color(palette.text_secondary), + ), + ); + } + name.union(detail) +} + +fn material_thumbnail_at( + ui: &mut egui::Ui, + view: &MaterialSlotPanelViewModel, + rect: egui::Rect, +) -> egui::Response { + let palette = design_system::palette(ui); + let response = ui.interact( + rect, + ui.make_persistent_id(("material_preview", &view.slot_id)), + egui::Sense::click(), + ); + let size = rect.width(); + let cell = size / 4.0; + for row in 0..4 { + for column in 0..4 { + ui.painter().rect_filled( + egui::Rect::from_min_size( + rect.min + egui::vec2(column as f32 * cell, row as f32 * cell), + egui::vec2(cell, cell), + ) + .intersect(rect), + 0.0, + if (row + column) % 2 == 0 { + palette.checker + } else { + palette.recessed + }, + ); + } + } + match view.thumbnail { + MaterialThumbnailPresentation::Ready(texture) => { + ui.painter().image( + texture, + rect.shrink(2.0), + egui::Rect::from_min_max(egui::Pos2::ZERO, egui::pos2(1.0, 1.0)), + egui::Color32::WHITE, + ); + } + MaterialThumbnailPresentation::Pending => { + ui.painter().text( + rect.center(), + egui::Align2::CENTER_CENTER, + icons::CIRCLE_NOTCH.as_str(), + egui::FontId::new(22.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.text_secondary, + ); + } + MaterialThumbnailPresentation::Failed => { + ui.painter().text( + rect.center(), + egui::Align2::CENTER_CENTER, + icons::WARNING.as_str(), + egui::FontId::new(22.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.error, + ); + } + } + ui.painter().rect_stroke( + rect, + 4.0, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + response.on_hover_text(format!("Open {} material picker", view.label)) +} + +fn overflow_menu( + ui: &mut egui::Ui, + view: &MaterialSlotPanelViewModel, + actions: &mut Vec, + diagnostics_ui: impl FnOnce(&mut egui::Ui), +) { + let palette = design_system::palette(ui); + ui.menu_button(phosphor_icon(icons::DOTS_THREE, 16.0), |ui| { + if view.can_locate && menu_action(ui, icons::CROSSHAIR, "Locate", palette.text_primary) { + actions.push(MaterialSlotAction::Locate); + ui.close(); + } + if menu_action( + ui, + icons::FOLDER_OPEN, + "Browse Asset Library", + palette.text_primary, + ) { + actions.push(MaterialSlotAction::BrowseLibrary); + ui.close(); + } + if view.can_clear && menu_action(ui, icons::X, "Clear material", palette.text_primary) { + actions.push(MaterialSlotAction::Clear); + ui.close(); + } + if view.can_create_instance + && menu_action( + ui, + icons::COPY, + "Create Instance and Assign", + palette.text_primary, + ) + { + actions.push(MaterialSlotAction::CreateInstance); + ui.close(); + } + if view.can_extract + && menu_action(ui, icons::EXPORT, "Extract Editable…", palette.text_primary) + { + actions.push(MaterialSlotAction::ExtractEditable); + ui.close(); + } + ui.separator(); + ui.label(TypeRole::Section.text("Source & Diagnostics")); + diagnostics_ui(ui); + }) + .response + .on_hover_text("Material actions and diagnostics"); +} + +fn menu_action( + ui: &mut egui::Ui, + icon: egui_phosphor_icons::Icon, + label: &str, + color: egui::Color32, +) -> bool { + ui.add(egui::Button::new(icon_label( + icon, + label, + TypeRole::Control, + 14.0, + color, + ))) + .clicked() +} + +#[cfg(test)] +mod tests { + use super::*; + + fn view() -> MaterialSlotPanelViewModel { + MaterialSlotPanelViewModel { + slot_id: "slot:test".into(), + label: "M_Wood_Planks".into(), + path: Some("materials/wood/M_Wood_Planks.mat".into()), + shader: "Standard Lit".into(), + shader_kind: Some(MaterialShaderKind::StandardLit), + can_edit_shader: true, + thumbnail: MaterialThumbnailPresentation::Pending, + inherited: None, + health: MaterialHealth::Healthy, + assigned: None, + effective: None, + candidates: Vec::new(), + drop_candidate: None, + invalid_drop_reason: None, + can_locate: true, + can_clear: true, + can_extract: false, + can_create_instance: true, + } + } + + #[test] + fn slot_header_insets_match_the_current_penpot_export() { + assert_eq!(SLOT_ACCENT_X, 8.0); + assert_eq!(SLOT_CARET_CENTER_X, 23.0); + assert_eq!(SLOT_PREVIEW_X, 35.0); + assert_eq!(SLOT_PREVIEW_X - (SLOT_CARET_CENTER_X + 6.0), 6.0); + } + + #[test] + fn actor_component_body_preserves_penpot_slot_widths() { + let wide_body = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(596.0, 700.0)); + let compact_body = egui::Rect::from_min_size(egui::Pos2::ZERO, egui::vec2(396.0, 700.0)); + + let wide = actor_materials_rect(wide_body, 32.0); + let compact = actor_materials_rect(compact_body, 32.0); + + assert_eq!(wide.width(), 596.0); + assert_eq!(compact.width(), 396.0); + assert_eq!(wide.left(), 0.0); + assert_eq!(compact.left(), 0.0); + assert_eq!(wide.top(), 32.0); + assert_eq!(compact.top(), 32.0); + assert_eq!(wide.height(), 0.0); + assert_eq!(compact.height(), 0.0); + } + + #[test] + fn materials_height_uses_the_finite_layout_cursor_not_a_virtual_scroll_extent() { + assert_eq!(materials_used_bottom(948.0, 320.0), 948.0); + assert_eq!(materials_used_bottom(240.0, 320.0), 320.0); + assert_eq!(materials_used_bottom(f32::INFINITY, 320.0), 320.0); + } + + #[test] + fn penpot_direct_assignment_has_no_redundant_explicit_badge() { + assert!(view().inherited.is_none()); + } + + #[test] + fn penpot_assignment_action_carries_exact_stable_reference() { + let reference = EditorAssetRef::new("asset-id", "material:source", "M_Wood"); + let action = MaterialSlotPanelAction { + slot_id: "slot:test".into(), + action: MaterialSlotAction::Assign { + reference: reference.clone(), + from_drop: false, + }, + }; + assert_eq!( + action, + MaterialSlotPanelAction { + slot_id: "slot:test".into(), + action: MaterialSlotAction::Assign { + reference, + from_drop: false, + }, + } + ); + } + + #[test] + fn penpot_supported_material_states_share_one_view_model() { + for health in [ + MaterialHealth::Healthy, + MaterialHealth::Dirty, + MaterialHealth::Processing, + MaterialHealth::Broken, + MaterialHealth::ReadOnly, + ] { + let mut view = view(); + view.health = health; + let palette = DesignPalette::from(crate::ui::theme::BLACKSITE_PALETTE); + assert!(!view.health.presentation(palette).1.is_empty()); + } + } +} diff --git a/crates/editor/src/ui/materials/pickers.rs b/crates/editor/src/ui/materials/pickers.rs new file mode 100644 index 0000000..a2ec639 --- /dev/null +++ b/crates/editor/src/ui/materials/pickers.rs @@ -0,0 +1,411 @@ +//! Penpot-styled material and texture asset pickers. + +use bevy_egui::egui; +use egui_phosphor_icons::icons; +use shared::EditorAssetRef; + +use super::panel::{MaterialPickerCandidate, MaterialSlotAction, MaterialSlotPanelViewModel}; +use super::{MaterialTextureCandidate, MaterialThumbnailPresentation, TextureSlotResponse}; +use crate::ui::design_system; +use crate::ui::design_system::controls::icon_label; +use crate::ui::design_system::typography::TypeRole; + +const MATERIAL_PICKER_WIDTH: f32 = 244.0; +const TEXTURE_PICKER_WIDTH: f32 = 420.0; +const PICKER_ROW_HEIGHT: f32 = 44.0; +const PICKER_THUMBNAIL: f32 = 36.0; + +pub(super) fn material_picker_popup( + _ui: &mut egui::Ui, + id: egui::Id, + anchor: &egui::Response, + view: &MaterialSlotPanelViewModel, + actions: &mut Vec, +) { + egui::Popup::menu(anchor) + .id(id) + .width(MATERIAL_PICKER_WIDTH) + .show(|ui| { + ui.label( + TypeRole::Section + .text("Material Assets") + .color(design_system::palette(ui).text_primary), + ); + if let Some(current) = view.effective.as_ref() { + if let Some(candidate) = find_material_candidate(&view.candidates, current) { + material_menu_row(ui, candidate, true, actions); + } else { + unresolved_material_menu_row(ui, current); + } + } + + let recent_keys = recent_keys(ui, "material_picker_recents"); + let recent = candidates_for_recent_keys(&view.candidates, &recent_keys); + for candidate in recent.into_iter().take(4) { + let selected = view + .effective + .as_ref() + .is_some_and(|current| same_reference(current, &candidate.reference)); + if !selected { + material_menu_row(ui, candidate, false, actions); + } + } + picker_footer(ui, view.assigned.is_some(), actions); + }); +} + +pub(super) fn texture_picker_popup( + _ui: &mut egui::Ui, + id: egui::Id, + anchor: &egui::Response, + candidates: &[MaterialTextureCandidate], + selected: Option<&MaterialTextureCandidate>, + response: &mut TextureSlotResponse, +) { + egui::Popup::menu(anchor) + .id(id) + .width(TEXTURE_PICKER_WIDTH) + .show(|ui| { + picker_heading( + ui, + "Select Texture", + "Project textures and imported subassets", + ); + if let Some(current) = selected { + picker_section_label(ui, "CURRENT"); + texture_candidate_row(ui, current, true, response); + } + let recent_keys = recent_keys(ui, "texture_picker_recents"); + let recent = candidates_for_recent_texture_keys(candidates, &recent_keys); + if !recent.is_empty() { + picker_section_label(ui, "RECENT"); + for candidate in recent.into_iter().take(4) { + texture_candidate_row(ui, candidate, false, response); + } + } + picker_section_label(ui, "PROJECT TEXTURES"); + egui::ScrollArea::vertical() + .id_salt(id.with("project_textures")) + .max_height(240.0) + .auto_shrink([false, true]) + .show(ui, |ui| { + if candidates.is_empty() { + empty_picker_row(ui, "No project textures"); + } + for candidate in candidates { + let selected = selected.is_some_and(|current| { + same_reference(¤t.reference, &candidate.reference) + }); + texture_candidate_row(ui, candidate, selected, response); + } + }); + let palette = design_system::palette(ui); + ui.separator(); + if ui + .add(egui::Button::new(icon_label( + icons::FOLDER_OPEN, + "Browse Asset Library", + TypeRole::Control, + 14.0, + palette.text_primary, + ))) + .clicked() + { + response.browse_library = true; + ui.close(); + } + if selected.is_some() + && ui + .add(egui::Button::new(icon_label( + icons::X, + "Clear Texture", + TypeRole::Control, + 14.0, + palette.text_primary, + ))) + .clicked() + { + response.clear = true; + ui.close(); + } + }); +} + +fn picker_heading(ui: &mut egui::Ui, title: &str, subtitle: &str) { + let palette = design_system::palette(ui); + ui.label(TypeRole::Title.text(title).color(palette.text_primary)); + ui.label(TypeRole::Small.text(subtitle).color(palette.text_muted)); + ui.separator(); +} + +fn picker_section_label(ui: &mut egui::Ui, label: &str) { + let palette = design_system::palette(ui); + ui.add_space(4.0); + ui.label(TypeRole::Caption.text(label).color(palette.text_muted)); +} + +fn material_menu_row( + ui: &mut egui::Ui, + candidate: &MaterialPickerCandidate, + selected: bool, + actions: &mut Vec, +) { + let response = picker_asset_row( + ui, + &candidate.label, + &candidate.detail, + candidate.thumbnail, + selected, + ); + if response.clicked() { + remember_recent(ui, "material_picker_recents", &candidate.reference); + actions.push(MaterialSlotAction::Assign { + reference: candidate.reference.clone(), + from_drop: false, + }); + ui.close(); + } +} + +fn texture_candidate_row( + ui: &mut egui::Ui, + candidate: &MaterialTextureCandidate, + selected: bool, + response: &mut TextureSlotResponse, +) { + let row = picker_asset_row( + ui, + &candidate.label, + &candidate.detail, + candidate.thumbnail, + selected, + ); + if row.clicked() { + remember_recent(ui, "texture_picker_recents", &candidate.reference); + response.selected = Some(candidate.clone()); + ui.close(); + } +} + +fn picker_asset_row( + ui: &mut egui::Ui, + label: &str, + detail: &str, + thumbnail: MaterialThumbnailPresentation, + selected: bool, +) -> egui::Response { + let palette = design_system::palette(ui); + let (rect, response) = ui.allocate_exact_size( + egui::vec2(ui.available_width().max(1.0), PICKER_ROW_HEIGHT), + egui::Sense::click(), + ); + let fill = if selected { + palette.accent_dark + } else if response.hovered() { + palette.elevated + } else { + palette.recessed + }; + ui.painter().rect( + rect, + 5.0, + fill, + egui::Stroke::new( + 1.0_f32, + if selected { + palette.accent + } else { + palette.border + }, + ), + egui::StrokeKind::Inside, + ); + let thumb = egui::Rect::from_min_size( + rect.left_top() + egui::vec2(4.0, 4.0), + egui::vec2(PICKER_THUMBNAIL, PICKER_THUMBNAIL), + ); + paint_thumbnail(ui, thumb, thumbnail); + let text_rect = egui::Rect::from_min_max( + egui::pos2(thumb.right() + 8.0, rect.top() + 5.0), + egui::pos2(rect.right() - 8.0, rect.bottom() - 5.0), + ); + let mut child = ui.new_child( + egui::UiBuilder::new() + .max_rect(text_rect) + .layout(egui::Layout::top_down(egui::Align::Min)), + ); + child.set_clip_rect(rect.intersect(ui.clip_rect())); + child + .add(egui::Label::new(TypeRole::Body.text(label).color(palette.text_primary)).truncate()) + .on_hover_text(label); + child + .add(egui::Label::new(TypeRole::Small.text(detail).color(palette.text_muted)).truncate()) + .on_hover_text(detail); + response +} + +fn paint_thumbnail(ui: &egui::Ui, rect: egui::Rect, thumbnail: MaterialThumbnailPresentation) { + let palette = design_system::palette(ui); + ui.painter().rect_filled(rect, 4.0, palette.control); + match thumbnail { + MaterialThumbnailPresentation::Ready(texture) => { + ui.painter().image( + texture, + rect, + egui::Rect::from_min_max(egui::Pos2::ZERO, egui::pos2(1.0, 1.0)), + egui::Color32::WHITE, + ); + } + MaterialThumbnailPresentation::Pending => { + ui.painter().text( + rect.center(), + egui::Align2::CENTER_CENTER, + icons::CIRCLE_NOTCH.as_str(), + egui::FontId::new(14.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.text_muted, + ); + } + MaterialThumbnailPresentation::Failed => { + ui.painter().text( + rect.center(), + egui::Align2::CENTER_CENTER, + icons::WARNING.as_str(), + egui::FontId::new(14.0, egui::FontFamily::Name("phosphor-regular".into())), + palette.error, + ); + } + } + ui.painter().rect_stroke( + rect, + 4.0, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); +} + +fn picker_footer(ui: &mut egui::Ui, can_clear: bool, actions: &mut Vec) { + let palette = design_system::palette(ui); + ui.separator(); + if ui + .add(egui::Button::new(icon_label( + icons::FOLDER_OPEN, + "Browse Asset Library", + TypeRole::Control, + 14.0, + palette.text_primary, + ))) + .clicked() + { + actions.push(MaterialSlotAction::BrowseLibrary); + ui.close(); + } + if can_clear + && ui + .add(egui::Button::new(icon_label( + icons::X, + "Clear Material", + TypeRole::Control, + 14.0, + palette.text_primary, + ))) + .clicked() + { + actions.push(MaterialSlotAction::Clear); + ui.close(); + } +} + +fn unresolved_material_menu_row(ui: &mut egui::Ui, current: &EditorAssetRef) { + let palette = design_system::palette(ui); + ui.add_sized( + [ui.available_width().max(1.0), 28.0], + egui::Button::new(TypeRole::Body.text(¤t.label).color(palette.error)).selected(true), + ) + .on_hover_text("The currently assigned material could not be resolved"); +} + +fn empty_picker_row(ui: &mut egui::Ui, message: &str) { + let palette = design_system::palette(ui); + ui.add_sized( + [ui.available_width().max(1.0), 32.0], + egui::Label::new(TypeRole::Body.text(message).color(palette.text_muted)), + ); +} + +fn same_reference(left: &EditorAssetRef, right: &EditorAssetRef) -> bool { + left.asset_id == right.asset_id && left.sub_asset_id == right.sub_asset_id +} + +fn find_material_candidate<'a>( + candidates: &'a [MaterialPickerCandidate], + reference: &EditorAssetRef, +) -> Option<&'a MaterialPickerCandidate> { + candidates + .iter() + .find(|candidate| same_reference(&candidate.reference, reference)) +} + +fn recent_keys(ui: &egui::Ui, salt: &'static str) -> Vec<(String, String)> { + let id = ui.make_persistent_id(salt); + ui.ctx() + .data_mut(|data| data.get_persisted::>(id)) + .unwrap_or_default() +} + +fn remember_recent(ui: &egui::Ui, salt: &'static str, reference: &EditorAssetRef) { + let id = ui.make_persistent_id(salt); + let mut keys = recent_keys(ui, salt); + let key = (reference.asset_id.clone(), reference.sub_asset_id.clone()); + keys.retain(|current| current != &key); + keys.insert(0, key); + keys.truncate(8); + ui.ctx().data_mut(|data| data.insert_persisted(id, keys)); +} + +fn candidates_for_recent_keys<'a>( + candidates: &'a [MaterialPickerCandidate], + keys: &[(String, String)], +) -> Vec<&'a MaterialPickerCandidate> { + keys.iter() + .filter_map(|(asset_id, sub_asset_id)| { + candidates.iter().find(|candidate| { + candidate.reference.asset_id == *asset_id + && candidate.reference.sub_asset_id == *sub_asset_id + }) + }) + .collect() +} + +fn candidates_for_recent_texture_keys<'a>( + candidates: &'a [MaterialTextureCandidate], + keys: &[(String, String)], +) -> Vec<&'a MaterialTextureCandidate> { + keys.iter() + .filter_map(|(asset_id, sub_asset_id)| { + candidates.iter().find(|candidate| { + candidate.reference.asset_id == *asset_id + && candidate.reference.sub_asset_id == *sub_asset_id + }) + }) + .collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn penpot_picker_reference_comparison_uses_stable_identity_not_label() { + let left = EditorAssetRef::new("asset", "material:source", "Left"); + let right = EditorAssetRef::new("asset", "material:source", "Renamed"); + assert!(same_reference(&left, &right)); + } + + #[test] + fn penpot_picker_geometry_matches_penpot_assets() { + assert_eq!(MATERIAL_PICKER_WIDTH, 244.0); + assert_eq!(TEXTURE_PICKER_WIDTH, 420.0); + assert_eq!(PICKER_ROW_HEIGHT, 44.0); + assert_eq!(PICKER_THUMBNAIL, 36.0); + } +} diff --git a/crates/editor/src/ui/materials/texture_inputs.rs b/crates/editor/src/ui/materials/texture_inputs.rs new file mode 100644 index 0000000..22c7c7b --- /dev/null +++ b/crates/editor/src/ui/materials/texture_inputs.rs @@ -0,0 +1,408 @@ +//! Texture/channel controls shared by Material and Material Instance input tables. + +use super::*; + +use crate::ui::design_system; +use crate::ui::design_system::typography::TypeRole; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum TextureFieldAdornment { + TypedThumbnail, + BrokenReference, + Empty, +} + +fn texture_field_adornment( + presentation: Option, + current_present: bool, +) -> TextureFieldAdornment { + if presentation.is_some() { + TextureFieldAdornment::TypedThumbnail + } else if current_present { + TextureFieldAdornment::BrokenReference + } else { + TextureFieldAdornment::Empty + } +} + +pub(super) fn material_property_texture_binding( + textures: &[MaterialTextureBinding], + property: &MaterialInputDesc, +) -> MaterialTextureBinding { + textures + .iter() + .find(|texture| texture.name == property.name) + .cloned() + .unwrap_or_else(|| MaterialTextureBinding { + name: property.name.clone(), + texture: None, + channel: property + .texture + .as_ref() + .map_or(TextureChannel::Rgba, |desc| desc.default_channel), + }) +} + +pub(super) fn upsert_material_texture_binding( + textures: &mut Vec, + binding: MaterialTextureBinding, +) { + if let Some(existing) = textures + .iter_mut() + .find(|texture| texture.name == binding.name) + { + *existing = binding; + } else { + textures.push(binding); + } +} + +pub(super) fn material_texture_channel_ui( + ui: &mut egui::Ui, + property: &MaterialInputDesc, + binding: &mut MaterialTextureBinding, +) { + let allow_override = property + .texture + .as_ref() + .is_some_and(|texture| texture.allow_channel_override); + if !allow_override { + return; + } + egui::ComboBox::from_id_salt(("texture_channel", &property.name)) + .selected_text(texture_channel_label(binding.channel)) + .width(48.0) + .show_ui(ui, |ui| { + for channel in [ + TextureChannel::R, + TextureChannel::G, + TextureChannel::B, + TextureChannel::A, + ] { + ui.selectable_value( + &mut binding.channel, + channel, + texture_channel_label(channel), + ); + } + }); +} + +pub(super) fn texture_channel_label(channel: TextureChannel) -> &'static str { + match channel { + TextureChannel::R => "R", + TextureChannel::G => "G", + TextureChannel::B => "B", + TextureChannel::A => "A", + TextureChannel::Rgb => "RGB", + TextureChannel::Rgba => "RGBA", + } +} + +pub(super) fn ensure_material_texture_binding<'a>( + textures: &'a mut Vec, + name: &str, +) -> &'a mut MaterialTextureBinding { + let index = textures + .iter() + .position(|texture| texture.name == name) + .unwrap_or_else(|| { + textures.push(MaterialTextureBinding { + name: name.to_string(), + texture: None, + channel: TextureChannel::Rgba, + }); + textures.len() - 1 + }); + &mut textures[index] +} + +pub(super) fn texture_binding_ui( + ui: &mut egui::Ui, + binding: &mut MaterialTextureBinding, + texture_assets: &[MaterialTextureCandidate], + drop_candidate: Option<&MaterialTextureCandidate>, + inline_actions: bool, +) -> TextureSlotResponse { + let response = texture_slot_ui( + ui, + format!("binding_{}", binding.name), + TextureSlotSelection::Reference(binding.texture.as_ref()), + "(none)", + texture_assets, + drop_candidate, + inline_actions, + ); + if response.clear { + binding.texture = None; + } else if let Some(candidate) = response.selected.as_ref() { + binding.texture = Some(candidate.reference.clone()); + } + response +} + +pub(super) fn texture_slot_ui( + ui: &mut egui::Ui, + slot_id: impl std::hash::Hash, + current: TextureSlotSelection<'_>, + empty_label: &str, + candidates: &[MaterialTextureCandidate], + drop_candidate: Option<&MaterialTextureCandidate>, + inline_actions: bool, +) -> TextureSlotResponse { + let palette = design_system::palette(ui); + let mut result = TextureSlotResponse::default(); + ui.push_id(slot_id, |ui| { + let width = ui.available_width().max(1.0); + let (outer, _) = ui.allocate_exact_size(egui::vec2(width, 22.0), egui::Sense::hover()); + let group = outer; + let field_width = if inline_actions { + (group.width() - 60.0).max(1.0) + } else { + (group.width() - 30.0).max(1.0) + }; + let field_rect = egui::Rect::from_min_size(group.min, egui::vec2(field_width, 22.0)); + let locate_rect = egui::Rect::from_min_size( + group.min + egui::vec2(field_width + 6.0, 0.0), + egui::vec2(24.0, 22.0), + ); + let clear_rect = inline_actions.then(|| { + egui::Rect::from_min_size( + group.min + egui::vec2(field_width + 36.0, 0.0), + egui::vec2(24.0, 22.0), + ) + }); + let selected_candidate = candidates.iter().find(|candidate| match current { + TextureSlotSelection::Reference(reference) => reference.is_some_and(|reference| { + reference.asset_id == candidate.reference.asset_id + && reference.sub_asset_id == candidate.reference.sub_asset_id + }), + }); + let current_present = match current { + TextureSlotSelection::Reference(reference) => reference.is_some(), + }; + let display_label = selected_candidate + .map(|candidate| candidate.label.as_str()) + .or_else(|| match current { + TextureSlotSelection::Reference(reference) => { + reference.map(|reference| reference.label.as_str()) + } + }) + .unwrap_or(empty_label); + let presentation = selected_candidate.map(|candidate| candidate.thumbnail); + let adornment = texture_field_adornment(presentation, current_present); + let label_color = if current_present { + palette.text_primary + } else { + palette.text_muted + }; + ui.painter().rect( + field_rect, + 4.0, + palette.control, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + let field = ui.interact( + field_rect, + ui.make_persistent_id("texture_field"), + egui::Sense::click(), + ); + let image_rect = egui::Rect::from_center_size( + egui::pos2(field_rect.left() + 14.0, field_rect.center().y), + egui::vec2(16.0, 16.0), + ); + match selected_candidate.map(|candidate| candidate.thumbnail) { + Some(MaterialThumbnailPresentation::Ready(texture)) => { + ui.painter().image( + texture, + image_rect, + egui::Rect::from_min_max(egui::Pos2::ZERO, egui::pos2(1.0, 1.0)), + egui::Color32::WHITE, + ); + } + Some(MaterialThumbnailPresentation::Pending) => { + paint_field_icon(ui, image_rect, icons::CIRCLE_NOTCH, palette.text_muted); + } + Some(MaterialThumbnailPresentation::Failed) => { + paint_field_icon(ui, image_rect, icons::WARNING, palette.error); + } + None => paint_field_icon( + ui, + image_rect, + if adornment == TextureFieldAdornment::BrokenReference { + icons::WARNING + } else { + icons::IMAGE + }, + if adornment == TextureFieldAdornment::BrokenReference { + palette.error + } else { + palette.text_muted + }, + ), + } + let text_rect = egui::Rect::from_min_max( + egui::pos2(field_rect.left() + 27.0, field_rect.top()), + egui::pos2(field_rect.right() - 6.0, field_rect.bottom()), + ); + // `Label::truncate` centers its galley when forced into the full fixed field rectangle. + // Paint the truncated galley at the Penpot text origin instead: the typed thumbnail and + // the asset name then form one stable left-aligned identity regardless of field width. + let galley = egui::WidgetText::from(TypeRole::Body.text(display_label).color(label_color)) + .into_galley( + ui, + Some(egui::TextWrapMode::Truncate), + text_rect.width(), + egui::FontSelection::Default, + ); + let text_pos = egui::pos2( + text_rect.left(), + text_rect.center().y - galley.size().y * 0.5, + ); + let text_painter = ui + .painter() + .with_clip_rect(text_rect.intersect(ui.clip_rect())); + text_painter.galley(text_pos, galley, label_color); + field.clone().on_hover_text(display_label); + let drop_hovered = drop_candidate.is_some() && field.hovered(); + if drop_hovered { + ui.painter().rect_stroke( + field_rect, + 4.0, + egui::Stroke::new(2.0_f32, palette.accent), + egui::StrokeKind::Inside, + ); + } + super::pickers::texture_picker_popup( + ui, + field.id.with("texture_picker"), + &field, + candidates, + selected_candidate, + &mut result, + ); + if let Some(clear_rect) = clear_rect { + let locate = ui.put( + locate_rect, + egui::Button::new(icon_text(icons::CROSSHAIR, 14.0)) + .min_size(locate_rect.size()) + .fill(palette.control) + .stroke(egui::Stroke::new(1.0_f32, palette.border)), + ); + if selected_candidate.is_some() && locate.clicked() { + result.locate = selected_candidate.map(|candidate| candidate.selection.clone()); + } + locate.on_hover_text(if selected_candidate.is_some() { + "Locate texture in Content Browser" + } else { + "No texture to locate" + }); + let clear = ui.put( + clear_rect, + egui::Button::new(icon_text(icons::X, 14.0)) + .min_size(clear_rect.size()) + .fill(palette.control) + .stroke(egui::Stroke::new(1.0_f32, palette.border)), + ); + if current_present && clear.clicked() { + result.clear = true; + } + clear.on_hover_text(if current_present { + "Clear texture" + } else { + "No texture to clear" + }); + } else { + transient_texture_actions( + ui, + locate_rect, + selected_candidate, + current_present, + &mut result, + ); + } + if drop_hovered && ui.input(|input| input.pointer.any_released()) { + if let Some(candidate) = drop_candidate { + result.selected = Some(candidate.clone()); + result.accepted_drop = true; + } + } + }); + result +} + +fn transient_texture_actions( + ui: &mut egui::Ui, + rect: egui::Rect, + selected_candidate: Option<&MaterialTextureCandidate>, + current_present: bool, + result: &mut TextureSlotResponse, +) { + ui.scope_builder(egui::UiBuilder::new().max_rect(rect), |ui| { + ui.set_clip_rect(rect.intersect(ui.clip_rect())); + ui.menu_button(icon_text(icons::DOTS_THREE, 14.0), |ui| { + if ui + .add_enabled(selected_candidate.is_some(), egui::Button::new("Locate")) + .clicked() + { + result.locate = selected_candidate.map(|candidate| candidate.selection.clone()); + ui.close(); + } + if ui + .add_enabled(current_present, egui::Button::new("Clear")) + .clicked() + { + result.clear = true; + ui.close(); + } + }) + .response + .on_hover_text("Texture actions"); + }); +} + +fn paint_field_icon( + ui: &egui::Ui, + rect: egui::Rect, + icon: egui_phosphor_icons::Icon, + color: egui::Color32, +) { + ui.painter().text( + rect.center(), + egui::Align2::CENTER_CENTER, + icon.as_str(), + egui::FontId::new(12.0, egui::FontFamily::Name("phosphor-regular".into())), + color, + ); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn ready_texture_uses_its_thumbnail_without_a_redundant_asset_glyph() { + assert_eq!( + texture_field_adornment( + Some(MaterialThumbnailPresentation::Ready( + egui::TextureId::Managed(7) + )), + true, + ), + TextureFieldAdornment::TypedThumbnail + ); + } + + #[test] + fn unresolved_and_empty_texture_fields_keep_distinct_fallbacks() { + assert_eq!( + texture_field_adornment(None, true), + TextureFieldAdornment::BrokenReference + ); + assert_eq!( + texture_field_adornment(None, false), + TextureFieldAdornment::Empty + ); + } +} diff --git a/crates/editor/src/ui/materials/uv_transform.rs b/crates/editor/src/ui/materials/uv_transform.rs new file mode 100644 index 0000000..f67829e --- /dev/null +++ b/crates/editor/src/ui/materials/uv_transform.rs @@ -0,0 +1,131 @@ +//! Shared material UV-transform authoring used by Materials and Material Instances. + +use bevy::prelude::Vec2; +use bevy_egui::egui; +use egui_phosphor_icons::icons; +use shared::{MaterialInputSet, MaterialParameter, MaterialParameterValue}; + +use crate::ui::design_system; +use crate::ui::design_system::typography::TypeRole; + +pub(super) fn uv_transform_section( + ui: &mut egui::Ui, + offset: &mut Vec2, + tiling: &mut Vec2, + reset_offset: Vec2, + reset_tiling: Vec2, +) { + let palette = design_system::palette(ui); + let width = ui.available_width().max(1.0); + let height = match super::layout::ResponsiveMaterialLayout::for_width(width) { + super::layout::ResponsiveMaterialLayout::Reference => { + crate::ui::design_system::UV_SECTION_HEIGHT + } + super::layout::ResponsiveMaterialLayout::Compact => { + crate::ui::design_system::COMPACT_UV_SECTION_HEIGHT + } + super::layout::ResponsiveMaterialLayout::Transient => 100.0, + }; + let (rect, _) = ui.allocate_exact_size(egui::vec2(width, height), egui::Sense::hover()); + ui.painter().rect( + rect, + 5.0, + palette.section, + egui::Stroke::new(1.0_f32, palette.border), + egui::StrokeKind::Inside, + ); + let mut child = ui.new_child(egui::UiBuilder::new().max_rect(rect)); + child.set_clip_rect(rect.intersect(ui.clip_rect())); + let geometry = super::layout::UvSectionGeometry::for_rect(rect); + child.painter().text( + geometry.title.left_center(), + egui::Align2::LEFT_CENTER, + "UV", + TypeRole::Section.font(), + palette.text_primary, + ); + vec2_group( + &mut child, + geometry.offset, + "Offset", + offset, + reset_offset, + "Reset UV offset", + ); + vec2_group( + &mut child, + geometry.tiling, + "Tiling", + tiling, + reset_tiling, + "Reset UV tiling", + ); +} + +fn vec2_group( + ui: &mut egui::Ui, + geometry: super::layout::UvGroupGeometry, + label: &str, + value: &mut Vec2, + reset: Vec2, + tooltip: &str, +) { + let palette = design_system::palette(ui); + ui.painter().text( + geometry.label.left_center(), + egui::Align2::LEFT_CENTER, + label, + TypeRole::Small.font(), + palette.text_muted, + ); + ui.put( + geometry.x, + egui::DragValue::new(&mut value.x).speed(0.01).prefix("X "), + ); + ui.put( + geometry.y, + egui::DragValue::new(&mut value.y).speed(0.01).prefix("Y "), + ); + if let Some(reset_rect) = geometry.reset { + let enabled = *value != reset; + let response = ui.put( + reset_rect, + egui::Button::new( + egui::RichText::new(icons::ARROW_COUNTER_CLOCKWISE.as_str()).font( + egui::FontId::new(14.0, egui::FontFamily::Name("phosphor-regular".into())), + ), + ), + ); + if enabled && response.clicked() { + *value = reset; + } + response.on_hover_text(tooltip); + } +} + +pub(super) fn material_vec2_value(inputs: &MaterialInputSet, name: &str, default: Vec2) -> Vec2 { + inputs + .values + .iter() + .find(|parameter| parameter.name == name) + .and_then(|parameter| match parameter.value { + MaterialParameterValue::Vec2(value) => Some(value), + _ => None, + }) + .unwrap_or(default) +} + +pub(super) fn set_material_vec2_value(inputs: &mut MaterialInputSet, name: &str, value: Vec2) { + if let Some(parameter) = inputs + .values + .iter_mut() + .find(|parameter| parameter.name == name) + { + parameter.value = MaterialParameterValue::Vec2(value); + } else { + inputs.values.push(MaterialParameter { + name: name.into(), + value: MaterialParameterValue::Vec2(value), + }); + } +} diff --git a/crates/editor/src/ui/menu.rs b/crates/editor/src/ui/menu.rs index 50f8baf..5f6bb2e 100644 --- a/crates/editor/src/ui/menu.rs +++ b/crates/editor/src/ui/menu.rs @@ -42,6 +42,23 @@ pub fn top_menu_bar( panel_nodes: &mut PanelNodes, viewport_rect: egui::Rect, ) { + let (save_all_shortcut, save_shortcut) = root_ui.ctx().input_mut(|input| { + let save_all = input.consume_shortcut(&egui::KeyboardShortcut::new( + egui::Modifiers::CTRL | egui::Modifiers::SHIFT, + egui::Key::S, + )); + let save = !save_all + && input.consume_shortcut(&egui::KeyboardShortcut::new( + egui::Modifiers::CTRL, + egui::Key::S, + )); + (save_all, save) + }); + if save_all_shortcut { + crate::asset_documents::request_save_all(world); + } else if save_shortcut { + crate::asset_documents::request_contextual_save(world); + } egui::Panel::top("editor_menu_bar").show_inside(root_ui, |ui| { egui::MenuBar::new().ui(ui, |ui| { ui.menu_button("File", |ui| { @@ -73,7 +90,11 @@ pub fn top_menu_bar( } }); if menu_item(ui, "Save", Some("Ctrl+S"), true).clicked() { - world.resource_mut::().request = Some(SceneIoRequest::Save); + crate::asset_documents::request_contextual_save(world); + ui.close(); + } + if menu_item(ui, "Save All", Some("Ctrl+Shift+S"), true).clicked() { + crate::asset_documents::request_save_all(world); ui.close(); } if menu_item(ui, "Save Scene As...", None, true).clicked() { @@ -101,7 +122,12 @@ pub fn top_menu_bar( } ui.separator(); if menu_item(ui, "Import Assets...", None, true).clicked() { - world.resource_mut::().request = Some(SceneIoRequest::ImportAssets); + let destination = world + .resource::() + .current_folder + .clone(); + world.resource_mut::().request = + Some(SceneIoRequest::ImportAssets { destination }); ui.close(); } if menu_item(ui, "Export Selection...", None, true).clicked() { diff --git a/crates/editor/src/ui/mod.rs b/crates/editor/src/ui/mod.rs index 9052914..46975df 100644 --- a/crates/editor/src/ui/mod.rs +++ b/crates/editor/src/ui/mod.rs @@ -1,11 +1,14 @@ mod actor_inspector; mod animation_inspector; mod asset_browser; +mod asset_card; mod audio_inspector; mod build; pub mod component_registry; +pub(crate) mod design_system; mod diagnostics; mod dock_tabs; +pub(crate) mod document_status; mod fonts; pub(crate) mod helpers; mod hierarchy; @@ -14,6 +17,7 @@ pub mod hierarchy_state; pub(crate) mod inspector; mod layout; mod material_library; +pub(crate) mod materials; mod menu; pub(crate) mod navigation_inspector; mod play_controls; @@ -38,10 +42,7 @@ use crate::project_io::UserPreferences; use crate::selection::SelectedEntity; use crate::state::EditorMode; -pub(crate) use asset_browser::{ - adopt_material_conflict_save_as, reload_material_after_file_conflict, - validate_material_conflict_destination, -}; +pub(crate) use asset_browser::validate_material_conflict_destination; pub use build::BuildPanel; pub use diagnostics::{BrushDiagnosticsPanel, DiagnosticsPanel}; pub use layout::LayoutSaveTimer; @@ -50,7 +51,9 @@ pub use viewport_chrome::ViewportUiState; use diagnostics::diagnostics_window; use dock_tabs::PanelNodes; use hierarchy_state::HierarchyPanelState; -use layout::{load_dock_layout, mark_layout_dirty_if_changed, tick_layout_save}; +use layout::{ + clamp_inspector_width, load_dock_layout, mark_layout_dirty_if_changed, tick_layout_save, +}; use menu::top_menu_bar; use status_bar::status_bar_ui; use theme::{apply_editor_theme, editor_dock_style}; @@ -238,9 +241,19 @@ impl UiState { rename_buffer: &mut self.rename_buffer, }; + clamp_inspector_width( + &mut self.dock_state, + self.panel_nodes, + root_ui.available_width(), + ); DockArea::new(&mut self.dock_state) .style(editor_dock_style(ctx)) .show_inside(root_ui, &mut viewer); + clamp_inspector_width( + &mut self.dock_state, + self.panel_nodes, + root_ui.available_width(), + ); }); if let Some(tab) = world.resource_mut::().0.take() { @@ -280,6 +293,7 @@ impl UiState { }); crate::collaboration::file_conflict_modal(world, ctx); + asset_browser::draw_asset_import_review_modal(world, ctx); if ctx.input(|input| input.key_pressed(egui::Key::F1)) { world.resource_mut::().shortcuts_open = true; @@ -375,6 +389,7 @@ impl Plugin for EditorUiPlugin { .init_resource::() .init_resource::() .init_resource::() + .init_resource::() .init_resource::() .init_resource::() .init_resource::() @@ -384,7 +399,14 @@ impl Plugin for EditorUiPlugin { init_hierarchy_panel_from_prefs .after(crate::project_io::load_user_preferences_on_startup), ) - .add_systems(Startup, validate_editor_component_registry) + .add_systems( + Startup, + ( + inspector::register_builtin_component_inspectors, + validate_editor_component_registry, + ) + .chain(), + ) .add_systems( Startup, apply_ui_state_from_prefs @@ -407,10 +429,11 @@ impl Plugin for EditorUiPlugin { } fn validate_editor_component_registry(world: &mut World) { - let errors = world - .resource::() - .validate(world) - .err(); + let registry = world.resource::(); + if !registry.visible_descriptors_have_inspectors() { + panic!("every visible built-in component must register an Inspector callback"); + } + let errors = registry.validate(world).err(); if let Some(errors) = errors { panic!( "invalid authoring component registry:\n{}", @@ -443,6 +466,7 @@ pub(crate) fn show_ui_system(world: &mut World) { world.resource_scope::(|world, mut ui_state| { ui_state.ui(world, egui_context.get_mut(), dt); }); + crate::asset_documents::asset_recovery_modal(world, egui_context.get_mut()); } struct TabViewer<'a> { @@ -483,17 +507,20 @@ impl egui_dock::TabViewer for TabViewer<'_> { self.rename_buffer, ); } - EditorTab::Inspector => match self.selected_entities.as_slice() { - &[entity] if self.world.get_entity(entity).is_ok() => { - actor_inspector::draw_actor_inspector(self.world, ui, entity); + EditorTab::Inspector => { + ui.set_min_width(layout::INSPECTOR_MIN_WIDTH); + match self.selected_entities.as_slice() { + &[entity] if self.world.get_entity(entity).is_ok() => { + actor_inspector::draw_actor_inspector(self.world, ui, entity); + } + &[entity] => { + ui.label(format!("Entity {entity:?} is no longer in the world.")); + } + entities => { + actor_inspector::draw_multi_actor_inspector(self.world, ui, entities); + } } - &[entity] => { - ui.label(format!("Entity {entity:?} is no longer in the world.")); - } - entities => { - actor_inspector::draw_multi_actor_inspector(self.world, ui, entities); - } - }, + } EditorTab::Toolbar => { ui.label("Toolbar moved below the menu bar (Play, spawn, save)."); } diff --git a/crates/editor/src/ui/scene_tabs.rs b/crates/editor/src/ui/scene_tabs.rs index ebc3e48..c3343cd 100644 --- a/crates/editor/src/ui/scene_tabs.rs +++ b/crates/editor/src/ui/scene_tabs.rs @@ -86,7 +86,7 @@ pub fn scene_tabs_chrome( egui::Button::new(text) .fill(if active { SELECTION_BG } else { WIDGET_BG }) .stroke(egui::Stroke::new( - 1.0, + 1.0_f32, if active { SELECTION } else { BORDER }, )) .min_size(egui::vec2(128.0, 20.0)), diff --git a/crates/editor/src/ui/status_bar.rs b/crates/editor/src/ui/status_bar.rs index 07eb8cb..2daa7b7 100644 --- a/crates/editor/src/ui/status_bar.rs +++ b/crates/editor/src/ui/status_bar.rs @@ -32,9 +32,12 @@ pub fn status_bar_ui( ui, |ui| { let status = primary_status_line(world); + let asset_dirty = world + .get_resource::() + .is_some_and(|store| store.has_dirty_documents()); ui.label( egui::RichText::new("●") - .color(if world.resource::().dirty { + .color(if world.resource::().dirty || asset_dirty { ACCENT } else { SUCCESS @@ -121,7 +124,19 @@ fn scene_line(scene_io: &SceneIo) -> String { fn primary_status_line(world: &World) -> String { let scene_io = world.resource::(); - format!("{} | {}", scene_io.status, scene_line(scene_io)) + let dirty_assets = world + .get_resource::() + .map_or(0, |store| store.dirty_count()); + if dirty_assets == 0 { + format!("{} | {}", scene_io.status, scene_line(scene_io)) + } else { + format!( + "{} | {} | {dirty_assets} unsaved asset{}", + scene_io.status, + scene_line(scene_io), + if dirty_assets == 1 { "" } else { "s" } + ) + } } #[cfg(test)] diff --git a/crates/editor/src/ui/theme.rs b/crates/editor/src/ui/theme.rs index 10bd4ea..4493c40 100644 --- a/crates/editor/src/ui/theme.rs +++ b/crates/editor/src/ui/theme.rs @@ -1,8 +1,37 @@ //! Blacksite editor visual system for egui and egui_dock chrome. -use bevy_egui::egui::{self, Color32, CornerRadius, FontId, Stroke, Visuals}; +use bevy_egui::egui::{self, Color32, CornerRadius, FontId, Id, Stroke, Visuals}; use egui_dock::{Style as DockStyle, TabInteractionStyle, TabStyle}; +/// Semantic editor colors shared by every panel and reusable control. +/// +/// The default values preserve Blacksite's existing visual identity. Keeping the palette as data +/// lets a future Editor Settings page select or override a theme without teaching individual +/// widgets about preferences or duplicating color constants. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct EditorVisualPalette { + pub canvas: Color32, + pub panel: Color32, + pub panel_dark: Color32, + pub widget: Color32, + pub elevated: Color32, + pub accent: Color32, + pub accent_hover: Color32, + pub selection: Color32, + pub selection_secondary: Color32, + pub selection_bg: Color32, + pub selection_bg_muted: Color32, + pub text: Color32, + pub text_selected: Color32, + pub text_dim: Color32, + pub text_muted: Color32, + pub border: Color32, + pub border_strong: Color32, + pub success: Color32, + pub warning: Color32, + pub error: Color32, +} + pub const CANVAS_BG: Color32 = Color32::from_rgb(7, 8, 10); pub const PANEL_BG: Color32 = Color32::from_rgb(13, 15, 18); pub const PANEL_BG_DARK: Color32 = Color32::from_rgb(9, 11, 13); @@ -28,40 +57,80 @@ pub const AXIS_Y: Color32 = Color32::from_rgb(91, 201, 130); pub const AXIS_Z: Color32 = Color32::from_rgb(77, 147, 235); pub const VIEWPORT_OVERLAY: Color32 = Color32::from_rgba_premultiplied(7, 9, 11, 240); +pub const BLACKSITE_PALETTE: EditorVisualPalette = EditorVisualPalette { + canvas: CANVAS_BG, + panel: PANEL_BG, + panel_dark: PANEL_BG_DARK, + widget: WIDGET_BG, + elevated: ELEVATED_BG, + accent: ACCENT, + accent_hover: ACCENT_HOVER, + selection: SELECTION, + selection_secondary: SELECTION_SECONDARY, + selection_bg: SELECTION_BG, + selection_bg_muted: SELECTION_BG_MUTED, + text: TEXT, + text_selected: TEXT_SELECTED, + text_dim: TEXT_DIM, + text_muted: TEXT_MUTED, + border: BORDER, + border_strong: BORDER_STRONG, + success: SUCCESS, + warning: WARNING, + error: ERROR, +}; + +const EDITOR_PALETTE_ID: &str = "blacksite.editor.visual_palette"; + +pub fn editor_palette(ctx: &egui::Context) -> EditorVisualPalette { + ctx.data_mut(|data| { + data.get_temp::(Id::new(EDITOR_PALETTE_ID)) + .unwrap_or(BLACKSITE_PALETTE) + }) +} + pub fn apply_editor_theme(ctx: &egui::Context) { + let palette = editor_palette(ctx); + apply_editor_theme_with_palette(ctx, palette); +} + +/// Applies and remembers a palette. Future preference loading can call this without changing any +/// panel implementation. +pub fn apply_editor_theme_with_palette(ctx: &egui::Context, palette: EditorVisualPalette) { + ctx.data_mut(|data| data.insert_temp(Id::new(EDITOR_PALETTE_ID), palette)); let mut visuals = Visuals::dark(); - visuals.panel_fill = PANEL_BG; - visuals.window_fill = WIDGET_BG; - visuals.extreme_bg_color = CANVAS_BG; - visuals.faint_bg_color = Color32::from_rgb(17, 19, 22); - visuals.code_bg_color = PANEL_BG_DARK; - visuals.text_edit_bg_color = Some(CANVAS_BG); - visuals.weak_text_color = Some(TEXT_MUTED); - visuals.widgets.noninteractive.bg_fill = PANEL_BG; - visuals.widgets.noninteractive.bg_stroke = Stroke::new(1.0, BORDER); - visuals.widgets.noninteractive.fg_stroke = Stroke::new(1.0, TEXT_DIM); - visuals.widgets.inactive.bg_fill = WIDGET_BG; - visuals.widgets.inactive.weak_bg_fill = Color32::from_rgb(24, 27, 31); - visuals.widgets.inactive.bg_stroke = Stroke::new(1.0, BORDER); - visuals.widgets.inactive.fg_stroke = Stroke::new(1.0, TEXT); - visuals.widgets.hovered.bg_fill = ELEVATED_BG; - visuals.widgets.hovered.weak_bg_fill = ELEVATED_BG; - visuals.widgets.hovered.bg_stroke = Stroke::new(1.0, BORDER_STRONG); - visuals.widgets.hovered.fg_stroke = Stroke::new(1.0, TEXT_SELECTED); - visuals.widgets.active.bg_fill = Color32::from_rgb(38, 42, 47); - visuals.widgets.active.weak_bg_fill = Color32::from_rgb(38, 42, 47); - visuals.widgets.active.bg_stroke = Stroke::new(1.0, ACCENT); - visuals.widgets.active.fg_stroke = Stroke::new(1.0, TEXT_SELECTED); - visuals.widgets.open.bg_fill = ELEVATED_BG; - visuals.widgets.open.weak_bg_fill = ELEVATED_BG; - visuals.widgets.open.bg_stroke = Stroke::new(1.0, BORDER_STRONG); - visuals.widgets.open.fg_stroke = Stroke::new(1.0, TEXT_SELECTED); - visuals.selection.bg_fill = SELECTION_BG; - visuals.selection.stroke = Stroke::new(1.0, SELECTION); - visuals.hyperlink_color = SELECTION; - visuals.warn_fg_color = WARNING; - visuals.error_fg_color = ERROR; - visuals.window_stroke = Stroke::new(1.0, BORDER); + visuals.panel_fill = palette.panel; + visuals.window_fill = palette.widget; + visuals.extreme_bg_color = palette.canvas; + visuals.faint_bg_color = palette.panel_dark; + visuals.code_bg_color = palette.panel_dark; + visuals.text_edit_bg_color = Some(palette.canvas); + visuals.weak_text_color = Some(palette.text_muted); + visuals.widgets.noninteractive.bg_fill = palette.panel; + visuals.widgets.noninteractive.bg_stroke = Stroke::new(1.0_f32, palette.border); + visuals.widgets.noninteractive.fg_stroke = Stroke::new(1.0_f32, palette.text_dim); + visuals.widgets.inactive.bg_fill = palette.widget; + visuals.widgets.inactive.weak_bg_fill = palette.widget; + visuals.widgets.inactive.bg_stroke = Stroke::new(1.0_f32, palette.border); + visuals.widgets.inactive.fg_stroke = Stroke::new(1.0_f32, palette.text); + visuals.widgets.hovered.bg_fill = palette.elevated; + visuals.widgets.hovered.weak_bg_fill = palette.elevated; + visuals.widgets.hovered.bg_stroke = Stroke::new(1.0_f32, palette.border_strong); + visuals.widgets.hovered.fg_stroke = Stroke::new(1.0_f32, palette.text_selected); + visuals.widgets.active.bg_fill = palette.elevated; + visuals.widgets.active.weak_bg_fill = palette.elevated; + visuals.widgets.active.bg_stroke = Stroke::new(1.0_f32, palette.accent); + visuals.widgets.active.fg_stroke = Stroke::new(1.0_f32, palette.text_selected); + visuals.widgets.open.bg_fill = palette.elevated; + visuals.widgets.open.weak_bg_fill = palette.elevated; + visuals.widgets.open.bg_stroke = Stroke::new(1.0_f32, palette.border_strong); + visuals.widgets.open.fg_stroke = Stroke::new(1.0_f32, palette.text_selected); + visuals.selection.bg_fill = palette.selection_bg; + visuals.selection.stroke = Stroke::new(1.0_f32, palette.selection); + visuals.hyperlink_color = palette.selection; + visuals.warn_fg_color = palette.warning; + visuals.error_fg_color = palette.error; + visuals.window_stroke = Stroke::new(1.0_f32, palette.border); visuals.window_corner_radius = CornerRadius::same(4); visuals.menu_corner_radius = CornerRadius::same(3); visuals.window_shadow = egui::epaint::Shadow { @@ -115,38 +184,39 @@ pub fn apply_editor_theme(ctx: &egui::Context) { } pub fn editor_dock_style(ctx: &egui::Context) -> DockStyle { + let palette = editor_palette(ctx); let mut style = DockStyle::from_egui(ctx.global_style().as_ref()); style.dock_area_padding = Some(egui::Margin::same(1)); - style.main_surface_border_stroke = Stroke::new(1.0, BORDER); + style.main_surface_border_stroke = Stroke::new(1.0_f32, palette.border); style.main_surface_border_rounding = CornerRadius::ZERO; style.separator.width = 2.0; style.separator.extra_interact_width = 5.0; - style.separator.color_idle = BORDER; - style.separator.color_hovered = BORDER_STRONG; - style.separator.color_dragged = ACCENT_HOVER; + style.separator.color_idle = palette.border; + style.separator.color_hovered = palette.border_strong; + style.separator.color_dragged = palette.accent_hover; - style.tab_bar.bg_fill = PANEL_BG_DARK; + style.tab_bar.bg_fill = palette.panel_dark; style.tab_bar.height = 30.0; style.tab_bar.inner_margin = egui::Margin::symmetric(2, 1); - style.tab_bar.hline_color = ACCENT; + style.tab_bar.hline_color = palette.accent; style.tab_bar.corner_radius = CornerRadius::ZERO; let active = TabInteractionStyle { - outline_color: ACCENT, - bg_fill: PANEL_BG, - text_color: TEXT_SELECTED, + outline_color: palette.accent, + bg_fill: palette.panel, + text_color: palette.text_selected, corner_radius: CornerRadius::same(1), }; let inactive = TabInteractionStyle { outline_color: Color32::TRANSPARENT, bg_fill: Color32::TRANSPARENT, - text_color: TEXT_DIM, + text_color: palette.text_dim, corner_radius: CornerRadius::same(1), }; let hovered = TabInteractionStyle { - outline_color: BORDER_STRONG, - bg_fill: ELEVATED_BG, - text_color: TEXT, + outline_color: palette.border_strong, + bg_fill: palette.elevated, + text_color: palette.text, corner_radius: CornerRadius::same(1), }; @@ -163,11 +233,11 @@ pub fn editor_dock_style(ctx: &egui::Context) -> DockStyle { ..style.tab }; style.tab.tab_body.inner_margin = egui::Margin::same(4); - style.tab.tab_body.bg_fill = PANEL_BG; - style.tab.tab_body.stroke = Stroke::new(1.0, BORDER); - style.overlay.selection_color = SELECTION_BG; - style.overlay.button_color = SELECTION; - style.overlay.button_border_stroke = Stroke::new(1.0, SELECTION); + style.tab.tab_body.bg_fill = palette.panel; + style.tab.tab_body.stroke = Stroke::new(1.0_f32, palette.border); + style.overlay.selection_color = palette.selection_bg; + style.overlay.button_color = palette.selection; + style.overlay.button_border_stroke = Stroke::new(1.0_f32, palette.selection); style } @@ -180,7 +250,7 @@ pub fn status_bar_frame() -> egui::Frame { egui::Frame::new() .fill(PANEL_BG_DARK) .inner_margin(egui::Margin::symmetric(10, 3)) - .stroke(Stroke::new(1.0, BORDER)) + .stroke(Stroke::new(1.0_f32, BORDER)) } pub fn brand_mark_frame() -> egui::Frame { @@ -188,7 +258,7 @@ pub fn brand_mark_frame() -> egui::Frame { .fill(CANVAS_BG) .corner_radius(CornerRadius::same(2)) .inner_margin(egui::Margin::symmetric(8, 4)) - .stroke(Stroke::new(1.0, BORDER_STRONG)) + .stroke(Stroke::new(1.0_f32, BORDER_STRONG)) } pub fn viewport_toolbar_frame() -> egui::Frame { @@ -196,7 +266,7 @@ pub fn viewport_toolbar_frame() -> egui::Frame { .fill(VIEWPORT_OVERLAY) .corner_radius(CornerRadius::same(3)) .inner_margin(egui::Margin::same(5)) - .stroke(Stroke::new(1.0, BORDER_STRONG)) + .stroke(Stroke::new(1.0_f32, BORDER_STRONG)) .shadow(egui::epaint::Shadow { offset: [0, 3], blur: 12, @@ -210,7 +280,7 @@ pub fn overlay_chip_frame() -> egui::Frame { .fill(VIEWPORT_OVERLAY) .corner_radius(CornerRadius::same(3)) .inner_margin(egui::Margin::symmetric(8, 5)) - .stroke(Stroke::new(1.0, BORDER_STRONG)) + .stroke(Stroke::new(1.0_f32, BORDER_STRONG)) } pub fn toolbar_group_frame() -> egui::Frame { @@ -218,5 +288,5 @@ pub fn toolbar_group_frame() -> egui::Frame { .fill(PANEL_BG_DARK) .corner_radius(CornerRadius::same(3)) .inner_margin(egui::Margin::symmetric(5, 3)) - .stroke(Stroke::new(1.0, BORDER)) + .stroke(Stroke::new(1.0_f32, BORDER)) } diff --git a/crates/editor/src/ui/toolbar.rs b/crates/editor/src/ui/toolbar.rs index bdc0f05..e6fd92a 100644 --- a/crates/editor/src/ui/toolbar.rs +++ b/crates/editor/src/ui/toolbar.rs @@ -94,14 +94,14 @@ pub fn toolbar_ui( ui.painter().line_segment( [toolbar_rect.left_bottom(), toolbar_rect.right_bottom()], - egui::Stroke::new(1.0, super::theme::BORDER), + egui::Stroke::new(1.0_f32, super::theme::BORDER), ); ui.painter().line_segment( [ toolbar_rect.left_bottom() + egui::vec2(8.0, 0.0), toolbar_rect.left_bottom() + egui::vec2(134.0, 0.0), ], - egui::Stroke::new(2.0, ACCENT), + egui::Stroke::new(2.0_f32, ACCENT), ); } diff --git a/crates/editor/src/ui/viewport_chrome.rs b/crates/editor/src/ui/viewport_chrome.rs index 8ac3db3..3a34554 100644 --- a/crates/editor/src/ui/viewport_chrome.rs +++ b/crates/editor/src/ui/viewport_chrome.rs @@ -1,7 +1,7 @@ //! Unified viewport overlay chrome (toolbars, badges, HUD). use bevy::prelude::*; -use bevy_egui::{egui, EguiTextureHandle, EguiUserTextures}; +use bevy_egui::egui; use bevy_inspector_egui::bevy_inspector::hierarchy::SelectedEntities; use egui_phosphor_icons::icons; use transform_gizmo_bevy::prelude::GizmoOptions; @@ -14,7 +14,6 @@ use crate::assets::thumbnails::kind_icon; use crate::assets::{AssetSelection, AssetSubAssetKind, EditorAssets}; use crate::camera::EditorCamera; use crate::gizmos::{EditorGizmoMode, EditorGizmoSpace}; -use crate::render_target::ViewportRenderTarget; use crate::selection::{SelectedEntity, ViewportClick, ViewportPickStack}; use crate::state::PlayPossession; use crate::viewport::actor_icons::ActorIconSettings; @@ -24,6 +23,7 @@ use crate::viewport::physics_placement::{ begin_physics_placement, request_physics_placement, PhysicsPlacementPhase, PhysicsPlacementRequest, PhysicsPlacementState, }; +use crate::viewport::target_presenter::sync_viewport_target_texture; use crate::viewport::terrain_paint::{TerrainPaintMode, TerrainPaintState}; use crate::viewport::terrain_sculpt::{TerrainSculptMode, TerrainSculptState}; use crate::viewport::{ @@ -68,6 +68,7 @@ pub fn viewport_tab_ui( ) { let rect = ui.available_rect_before_wrap(); *viewport_rect = rect; + let viewport_texture = sync_viewport_target_texture(world); if rect.width() <= 1.0 || rect.height() <= 1.0 { *pointer_in_viewport = false; @@ -104,15 +105,7 @@ pub fn viewport_tab_ui( } } - if let Some(target) = world - .get_resource::() - .and_then(|target| target.0.clone()) - { - let mut textures = world.resource_mut::(); - let texture_id = textures - .image_id(target.image.id()) - .unwrap_or_else(|| textures.add_image(EguiTextureHandle::Strong(target.image.clone()))); - + if let Some(texture_id) = viewport_texture { let painter = ui.painter(); painter.rect_filled(rect, 0.0, egui::Color32::BLACK); painter.image( @@ -125,7 +118,7 @@ pub fn viewport_tab_ui( rect, 0.0, egui::Stroke::new( - 1.0, + 1.0_f32, if response.hovered() { BORDER_STRONG } else { @@ -576,7 +569,7 @@ fn scene_view_orientation_widget(world: &mut World, ctx: &egui::Context, scene_r }; painter.line_segment( [center, endpoint], - egui::Stroke::new(if facing { 2.2 } else { 1.2 }, color), + egui::Stroke::new(if facing { 2.2_f32 } else { 1.2_f32 }, color), ); painter.circle_filled(endpoint, if facing { 9.0 } else { 7.0 }, color); painter.text( @@ -1331,7 +1324,7 @@ fn viewport_asset_drop_ui( ui.painter().rect_stroke( viewport_rect.shrink(2.0), 0.0, - egui::Stroke::new(2.0, highlight_color), + egui::Stroke::new(2.0_f32, highlight_color), egui::StrokeKind::Inside, ); } @@ -1537,34 +1530,34 @@ fn draw_asset_drag_preview( if over_viewport { let painter = ui.painter(); painter.circle_filled(pointer, 3.0, highlight_color); - painter.circle_stroke(pointer, 11.0, egui::Stroke::new(1.5, highlight_color)); + painter.circle_stroke(pointer, 11.0, egui::Stroke::new(1.5_f32, highlight_color)); painter.line_segment( [ pointer - egui::vec2(17.0, 0.0), pointer - egui::vec2(7.0, 0.0), ], - egui::Stroke::new(1.5, highlight_color), + egui::Stroke::new(1.5_f32, highlight_color), ); painter.line_segment( [ pointer + egui::vec2(7.0, 0.0), pointer + egui::vec2(17.0, 0.0), ], - egui::Stroke::new(1.5, highlight_color), + egui::Stroke::new(1.5_f32, highlight_color), ); painter.line_segment( [ pointer - egui::vec2(0.0, 17.0), pointer - egui::vec2(0.0, 7.0), ], - egui::Stroke::new(1.5, highlight_color), + egui::Stroke::new(1.5_f32, highlight_color), ); painter.line_segment( [ pointer + egui::vec2(0.0, 7.0), pointer + egui::vec2(0.0, 17.0), ], - egui::Stroke::new(1.5, highlight_color), + egui::Stroke::new(1.5_f32, highlight_color), ); } @@ -1636,9 +1629,9 @@ fn draw_asset_drag_preview( ), ] { ui.painter() - .line_segment([a, a + b], egui::Stroke::new(3.0, highlight_color)); + .line_segment([a, a + b], egui::Stroke::new(3.0_f32, highlight_color)); ui.painter() - .line_segment([a, a + c], egui::Stroke::new(3.0, highlight_color)); + .line_segment([a, a + c], egui::Stroke::new(3.0_f32, highlight_color)); } } } diff --git a/crates/editor/src/ui/widgets.rs b/crates/editor/src/ui/widgets.rs index 5283e16..46a20fe 100644 --- a/crates/editor/src/ui/widgets.rs +++ b/crates/editor/src/ui/widgets.rs @@ -49,7 +49,7 @@ pub fn transport_button_large( fill }; let stroke = egui::Stroke::new( - if response.hovered() { 1.5 } else { 1.0 }, + if response.hovered() { 1.5_f32 } else { 1.0_f32 }, if accent { SUCCESS.linear_multiply(1.15) } else if response.hovered() { @@ -74,7 +74,7 @@ pub fn icon_button(ui: &mut Ui, icon: Icon, tooltip: &str) -> egui::Response { ui.add( Button::new(phosphor_icon(icon, 17.0)) .fill(WIDGET_BG.linear_multiply(0.78)) - .stroke(egui::Stroke::new(1.0, BORDER)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) .min_size(egui::vec2(32.0, 32.0)), ) .on_hover_text(tooltip) @@ -84,7 +84,7 @@ pub fn icon_button_small(ui: &mut Ui, icon: Icon, tooltip: &str) -> egui::Respon ui.add( Button::new(phosphor_icon(icon, 16.0)) .fill(WIDGET_BG.linear_multiply(0.72)) - .stroke(egui::Stroke::new(1.0, BORDER)) + .stroke(egui::Stroke::new(1.0_f32, BORDER)) .min_size(egui::vec2(27.0, 27.0)) .corner_radius(4.0), ) @@ -128,7 +128,7 @@ fn tool_button_with_color( Button::new(phosphor_icon(icon, 17.0)) .fill(fill) .stroke(egui::Stroke::new( - 1.0, + 1.0_f32, if selected { selected_stroke } else { BORDER }, )) .min_size(egui::vec2(30.0, 30.0)) diff --git a/crates/editor/src/viewport/material_drop.rs b/crates/editor/src/viewport/material_drop.rs index d9571a2..7993d22 100644 --- a/crates/editor/src/viewport/material_drop.rs +++ b/crates/editor/src/viewport/material_drop.rs @@ -4,7 +4,7 @@ use bevy::ecs::system::SystemParam; use bevy::picking::mesh_picking::ray_cast::{MeshRayCast, MeshRayCastSettings, RayCastVisibility}; use bevy::prelude::*; use shared::{ - BrushDesc, ComponentInstanceId, EditorAssetRef, HydratedRendererMaterialBinding, LevelObject, + BrushDesc, ComponentInstanceId, EditorAssetRef, HydratedMaterialSlotBinding, LevelObject, MaterialDesc, MaterialInstanceAsset, MaterialRef, Primitive, SkinnedMeshRenderer, StaticMeshRenderer, }; @@ -13,9 +13,7 @@ use crate::asset_db::{find_asset_by_path, AssetRegistry}; use crate::assets::materials::ensure_static_material_slots; use crate::assets::{AssetSelection, AssetSubAssetKind, EditorAssetKind, EditorAssets}; use crate::camera::EditorCamera; -use crate::history::{ - reflected_component_transaction, set_brush_with_history, set_material_with_history, -}; +use crate::history::{reflected_component_transaction, set_brush_with_history}; use crate::infra::EditorOnly; use crate::operators::{ run_immediate_operator, ActiveOperator, OperatorAvailability, OperatorPhase, OperatorStatus, @@ -198,7 +196,6 @@ enum SurfaceDropPayload { Texture { label: String, reference: EditorAssetRef, - source_path: String, }, } @@ -237,10 +234,10 @@ enum MaterialDropSnapshot { before: SkinnedMeshRenderer, after: SkinnedMeshRenderer, }, - Material { + Primitive { entity: Entity, - before: Option>, - after: Box, + before: Box, + after: Box, }, Brush { entity: Entity, @@ -261,7 +258,7 @@ impl MaterialDropSnapshot { Self::SkinnedRenderer { after, .. } => { entity.insert(after.clone()); } - Self::Material { after, .. } => { + Self::Primitive { after, .. } => { entity.insert(after.as_ref().clone()); } Self::Brush { after, .. } => { @@ -282,12 +279,8 @@ impl MaterialDropSnapshot { Self::SkinnedRenderer { before, .. } => { entity.insert(before.clone()); } - Self::Material { before, .. } => { - if let Some(before) = before { - entity.insert(before.as_ref().clone()); - } else { - entity.remove::(); - } + Self::Primitive { before, .. } => { + entity.insert(before.as_ref().clone()); } Self::Brush { before, .. } => { entity.insert(before.clone()); @@ -299,7 +292,7 @@ impl MaterialDropSnapshot { match self { Self::StaticRenderer { entity, .. } | Self::SkinnedRenderer { entity, .. } - | Self::Material { entity, .. } + | Self::Primitive { entity, .. } | Self::Brush { entity, .. } => *entity, } } @@ -308,7 +301,7 @@ impl MaterialDropSnapshot { #[derive(SystemParam)] struct MaterialDropQueries<'w, 's> { cameras: Query<'w, 's, (&'static Camera, &'static GlobalTransform), With>, - bindings: Query<'w, 's, &'static HydratedRendererMaterialBinding>, + bindings: Query<'w, 's, &'static HydratedMaterialSlotBinding>, levels: Query<'w, 's, (), With>, parents: Query<'w, 's, &'static ChildOf>, editor_only: Query<'w, 's, (), With>, @@ -564,7 +557,6 @@ fn surface_drop_payload( asset.label.clone(), ) .with_source_path(path.clone()), - source_path: path.clone(), }), _ => Err(format!("{} is not a material or texture", asset.label)), } @@ -610,7 +602,6 @@ fn surface_drop_payload( label.clone(), ) .with_source_path(source_path.clone()), - source_path, }) } _ => Err("selection is not a material or texture".into()), @@ -684,14 +675,18 @@ fn begin_material_drop_preview( } } MaterialDropTargetKey::Primitive(owner) => { - if world.get::(*owner).is_none() { - return Err("primitive target no longer exists".into()); - } - let before = world.get::(*owner).cloned(); - let after = material_desc_for_surface(before.clone(), payload)?; - MaterialDropSnapshot::Material { + let SurfaceDropPayload::Material { reference, .. } = payload else { + return Err("Textures cannot be assigned directly to primitive material slots; create or edit a Material Instance".into()); + }; + let before = world + .get::(*owner) + .cloned() + .ok_or_else(|| "primitive target no longer exists".to_string())?; + let mut after = before.clone(); + after.surface.material = Some(reference.clone()); + MaterialDropSnapshot::Primitive { entity: *owner, - before: before.map(Box::new), + before: Box::new(before), after: Box::new(after), } } @@ -740,26 +735,6 @@ fn begin_material_drop_preview( }) } -fn material_desc_for_surface( - before: Option, - payload: &SurfaceDropPayload, -) -> Result { - match payload { - SurfaceDropPayload::Material { - resolved: Some(desc), - .. - } => Ok(desc.as_ref().clone()), - SurfaceDropPayload::Material { resolved: None, .. } => { - Err("Embedded source materials can only be assigned to renderer slots".into()) - } - SurfaceDropPayload::Texture { source_path, .. } => { - let mut material = before.unwrap_or_default(); - material.base_color_texture = Some(source_path.clone()); - Ok(material) - } - } -} - fn update_material_drop_session(world: &mut World) { let mut state = world .remove_resource::() @@ -956,10 +931,17 @@ fn commit_material_drop_snapshot( Ok(()) }, ), - MaterialDropSnapshot::Material { after, .. } => { - set_material_with_history(world, entity, *after); - Ok(()) - } + MaterialDropSnapshot::Primitive { after, .. } => reflected_component_transaction( + world, + entity, + "Assign Primitive Material Slot", + shared::AUTHORING_COMPONENT_PRIMITIVE, + shared::COMPONENT_PRIMITIVE, + move |world, entity| { + world.entity_mut(entity).insert(*after); + Ok(()) + }, + ), MaterialDropSnapshot::Brush { after, .. } => { set_brush_with_history(world, entity, after); Ok(()) @@ -1086,13 +1068,11 @@ mod tests { RendererMaterialSlot { id: slot_a.clone(), name: "A".into(), - source_material: None, material: None, }, RendererMaterialSlot { id: slot_b.clone(), name: "B".into(), - source_material: None, material: None, }, ], @@ -1251,7 +1231,6 @@ mod tests { slots: vec![RendererMaterialSlot { id: slot_id.clone(), name: "Body".into(), - source_material: None, material: None, }], orphaned_assignments: Vec::new(), @@ -1273,7 +1252,6 @@ mod tests { label: "Grid".into(), reference: EditorAssetRef::new("grid", "texture:source", "Grid") .with_source_path("assets/textures/grid.png"), - source_path: "assets/textures/grid.png".into(), }; let error = begin_material_drop_preview( @@ -1291,37 +1269,50 @@ mod tests { #[test] fn resolved_project_material_is_supported_for_primitives() { - let mut material = material_desc_for_surface(None, &material_payload("steel")).unwrap(); - assert_eq!(material.roughness, 0.2); + let mut app = test_app(); + let world = app.world_mut(); + let entity = world + .spawn((LevelObject, ActorKind::StaticMesh, Primitive::default())) + .id(); + let target = MaterialDropTarget::Primitive { + owner: entity, + owner_label: "Cube".into(), + hit_point: Vec3::ZERO, + hit_normal: Vec3::Y, + }; + let preview = begin_material_drop_preview( + world, + AssetSelection::File("assets/materials/steel.ron".into()), + &target, + &material_payload("steel"), + ) + .unwrap(); + + let primitive = world.get::(entity).unwrap(); assert_eq!( - material.material_asset_path.as_deref(), + primitive + .surface + .material + .as_ref() + .and_then(|material| material.0.source_path.as_deref()), Some("assets/materials/steel.ron") ); - material.base_color_texture = None; - let texture = SurfaceDropPayload::Texture { - label: "Grid".into(), - reference: EditorAssetRef::default(), - source_path: "assets/textures/grid.png".into(), - }; - let textured = material_desc_for_surface(Some(material), &texture).unwrap(); - assert_eq!( - textured.base_color_texture.as_deref(), - Some("assets/textures/grid.png") - ); + preview.snapshot.restore(world); + assert!(world + .get::(entity) + .unwrap() + .surface + .material + .is_none()); } #[test] fn locked_target_rejects_preview_without_mutation_or_history() { let mut app = test_app(); let world = app.world_mut(); - let original = MaterialDesc::default(); + let original = Primitive::default(); let entity = world - .spawn(( - LevelObject, - ActorKind::Empty, - Primitive::default(), - original.clone(), - )) + .spawn((LevelObject, ActorKind::Empty, original.clone())) .id(); let mut hierarchy = crate::ui::hierarchy_state::HierarchyPanelState::default(); hierarchy.locked.insert(entity); @@ -1342,7 +1333,7 @@ mod tests { .unwrap_err(); assert!(error.contains("locked")); - assert_eq!(world.get::(entity), Some(&original)); + assert_eq!(world.get::(entity), Some(&original)); assert_eq!(world.resource::().undo_depth(), 0); assert!(!world.resource::().dirty); } diff --git a/crates/editor/src/viewport/mod.rs b/crates/editor/src/viewport/mod.rs index 9842ae1..4770e6c 100644 --- a/crates/editor/src/viewport/mod.rs +++ b/crates/editor/src/viewport/mod.rs @@ -14,6 +14,7 @@ pub mod render_view; pub mod rendering_diagnostics; pub mod selection; pub mod selection_outline; +pub(crate) mod target_presenter; pub mod terrain_paint; pub mod terrain_sculpt; pub mod viewport_mode; diff --git a/crates/editor/src/viewport/target_presenter.rs b/crates/editor/src/viewport/target_presenter.rs new file mode 100644 index 0000000..cd8dcfa --- /dev/null +++ b/crates/editor/src/viewport/target_presenter.rs @@ -0,0 +1,104 @@ +//! Bounded Egui ownership for the editor viewport render target. + +use bevy::asset::AssetId; +use bevy::prelude::*; +use bevy_egui::{egui, EguiTextureHandle, EguiUserTextures}; + +use crate::render_target::ViewportRenderTarget; + +#[derive(Resource, Default, Debug, Clone, Copy)] +struct ViewportTextureRegistration { + image: Option>, +} + +/// Returns the Egui texture for the current viewport target while retaining exactly one strong +/// image registration. Replacements and an absent target relinquish the previous registration. +pub(crate) fn sync_viewport_target_texture(world: &mut World) -> Option { + if !world.contains_resource::() { + world.insert_resource(ViewportTextureRegistration::default()); + } + + let target = world + .get_resource::() + .and_then(|target| target.0.as_ref()) + .map(|target| target.image.clone()); + let next_image = target.as_ref().map(Handle::id); + let previous_image = world.resource::().image; + + if previous_image != next_image { + if let Some(previous_image) = previous_image { + world + .resource_mut::() + .remove_image(previous_image); + } + world.resource_mut::().image = None; + } + + let target = target?; + let image_id = target.id(); + let texture_id = { + let mut textures = world.resource_mut::(); + textures + .image_id(image_id) + .unwrap_or_else(|| textures.add_image(EguiTextureHandle::Strong(target))) + }; + world.resource_mut::().image = Some(image_id); + Some(texture_id) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::render_target::ViewportTarget; + + fn world_with_target(image: Handle) -> World { + let mut world = World::new(); + world.insert_resource(EguiUserTextures::default()); + world.insert_resource(ViewportRenderTarget(Some(ViewportTarget { image }))); + world + } + + #[test] + fn viewport_replacement_releases_the_previous_egui_registration() { + let mut images = Assets::::default(); + let first = images.add(Image::default()); + let second = images.add(Image::default()); + let first_id = first.id(); + let second_id = second.id(); + let mut world = world_with_target(first); + + let first_texture = sync_viewport_target_texture(&mut world).expect("first registration"); + assert_eq!( + world.resource::().image_id(first_id), + Some(first_texture) + ); + + world.resource_mut::().0 = Some(ViewportTarget { image: second }); + sync_viewport_target_texture(&mut world).expect("replacement registration"); + assert!(world + .resource::() + .image_id(first_id) + .is_none()); + assert!(world + .resource::() + .image_id(second_id) + .is_some()); + + world.resource_mut::().0 = None; + assert!(sync_viewport_target_texture(&mut world).is_none()); + assert!(world + .resource::() + .image_id(second_id) + .is_none()); + } + + #[test] + fn stable_viewport_image_reuses_the_same_egui_texture() { + let mut images = Assets::::default(); + let image = images.add(Image::default()); + let mut world = world_with_target(image); + let first = sync_viewport_target_texture(&mut world).expect("first registration"); + let second = sync_viewport_target_texture(&mut world).expect("stable registration"); + assert_eq!(first, second); + } +} diff --git a/crates/game/src/launch.rs b/crates/game/src/launch.rs index 84d2224..36f0e2d 100644 --- a/crates/game/src/launch.rs +++ b/crates/game/src/launch.rs @@ -6,7 +6,10 @@ use bevy::app::PluginGroupBuilder; use bevy::asset::AssetPlugin; use bevy::log::{LogPlugin, DEFAULT_FILTER}; use bevy::prelude::*; -use bevy::window::{CompositeAlphaMode, ExitCondition, PresentMode, WindowMode, WindowPlugin}; +use bevy::window::{ + CompositeAlphaMode, ExitCondition, PresentMode, WindowMode, WindowPlugin, + WindowResizeConstraints, +}; /// Runtime switch for the HDR camera pass. /// @@ -53,13 +56,30 @@ pub fn editor_plugins(title: impl Into) -> PluginGroupBuilder { fn editor_window_plugin(title: impl Into) -> WindowPlugin { WindowPlugin { - primary_window: Some(primary_window(title)), + primary_window: Some(editor_window(title)), exit_condition: ExitCondition::DontExit, close_when_requested: false, ..default() } } +fn editor_window(title: impl Into) -> Window { + Window { + // A FIFO swapchain can spend roughly one second in each texture + // acquisition while an NVIDIA Wayland window is being interactively + // resized. Repeated acquire timeouts make the editor appear frozen. + // Prefer Immediate/Mailbox for the authoring host while retaining the + // normal VSync contract for packaged game windows. + present_mode: PresentMode::AutoNoVsync, + resize_constraints: WindowResizeConstraints { + min_width: 960.0, + min_height: 620.0, + ..default() + }, + ..primary_window(title) + } +} + fn configured_plugins(window_plugin: WindowPlugin) -> PluginGroupBuilder { DefaultPlugins .set(LogPlugin { @@ -105,7 +125,7 @@ pub fn hdr_enabled_from_env() -> bool { #[cfg(test)] mod tests { use super::{editor_window_plugin, primary_window, resolve_assets_directory}; - use bevy::window::{CompositeAlphaMode, ExitCondition}; + use bevy::window::{CompositeAlphaMode, ExitCondition, PresentMode}; #[test] fn primary_window_is_opaque() { @@ -113,6 +133,7 @@ mod tests { assert!(!window.transparent); assert_eq!(window.composite_alpha_mode, CompositeAlphaMode::Opaque); + assert_eq!(window.present_mode, PresentMode::AutoVsync); } #[test] @@ -121,6 +142,13 @@ mod tests { assert!(!plugin.close_when_requested); assert!(matches!(plugin.exit_condition, ExitCondition::DontExit)); + assert_eq!( + plugin + .primary_window + .expect("editor primary window") + .present_mode, + PresentMode::AutoNoVsync + ); } #[test] diff --git a/crates/game/src/lib.rs b/crates/game/src/lib.rs index 5432071..6ebb272 100644 --- a/crates/game/src/lib.rs +++ b/crates/game/src/lib.rs @@ -56,7 +56,10 @@ pub struct GameSceneBootstrap { pub defer_default_level: bool, } -#[cfg(not(feature = "hot-reload"))] +// Unit tests exercise the deterministic in-process systems even when Cargo's all-feature gate +// enables `hot-reload`; the test binary does not publish the separate `libgame_hot` dylib watched +// by hot-lib-reloader. +#[cfg(any(not(feature = "hot-reload"), test))] mod systems { pub use game_hot::{ apply_ambient_light, apply_player_intent, grab_cursor, move_and_slide, @@ -67,7 +70,7 @@ mod systems { }; } -#[cfg(feature = "hot-reload")] +#[cfg(all(feature = "hot-reload", not(test)))] mod systems { pub use crate::hot::{ apply_ambient_light, apply_player_intent, grab_cursor, move_and_slide, @@ -78,7 +81,7 @@ mod systems { }; } -#[cfg(feature = "hot-reload")] +#[cfg(all(feature = "hot-reload", not(test)))] #[hot_lib_reloader::hot_module(dylib = "game_hot", lib_dir = concat!(env!("CARGO_MANIFEST_DIR"), "/../../target/debug"))] mod hot { use avian3d::prelude::*; @@ -113,7 +116,7 @@ mod hot { pub fn subscribe() -> hot_lib_reloader::LibReloadObserver {} } -#[cfg(feature = "hot-reload")] +#[cfg(all(feature = "hot-reload", not(test)))] pub fn hot_reload_subscribe() -> hot_lib_reloader::LibReloadObserver { hot::subscribe() } diff --git a/crates/scene/Cargo.toml b/crates/scene/Cargo.toml index 0214a98..898b975 100644 --- a/crates/scene/Cargo.toml +++ b/crates/scene/Cargo.toml @@ -15,3 +15,4 @@ polyanya.workspace = true rerecast.workspace = true shared.workspace = true settings.workspace = true +uuid = { version = "1", features = ["serde"] } diff --git a/crates/scene/src/document.rs b/crates/scene/src/document.rs index 5b35357..796f237 100644 --- a/crates/scene/src/document.rs +++ b/crates/scene/src/document.rs @@ -743,7 +743,7 @@ mod tests { let body = "(resources: {}, entities: {})"; let document = SceneDocument::from_ron_text(body).unwrap(); let text = document.to_ron_text().unwrap(); - assert!(text.starts_with("(schema_version: 4,")); + assert!(text.starts_with("(schema_version: 6,")); assert!(SceneDocument::from_ron_text(&text) .unwrap() .entities diff --git a/crates/scene/src/lib.rs b/crates/scene/src/lib.rs index 022f39f..8080d0e 100644 --- a/crates/scene/src/lib.rs +++ b/crates/scene/src/lib.rs @@ -18,7 +18,8 @@ use serde::{Deserialize, Serialize}; pub use composition::{validate_composition_graph, validate_scene_composition}; pub use migrate::{ - migrate_v1_to_v2, migrate_v2_to_v3, migrate_v3_to_v4, DEFAULT_SUN_ILLUMINANCE_LUX, + migrate_v1_to_v2, migrate_v2_to_v3, migrate_v3_to_v4, migrate_v4_to_v5, + DEFAULT_SUN_ILLUMINANCE_LUX, }; pub use prefab::{ prefab_graph_revision, validate_prefab_graph, validate_prefab_graph_text, @@ -30,7 +31,7 @@ pub use project_validation::{ }; pub use upgrade::{upgrade_project, ProjectUpgradeChange, ProjectUpgradeReport}; -pub const CURRENT_SCENE_SCHEMA_VERSION: u32 = 4; +pub const CURRENT_SCENE_SCHEMA_VERSION: u32 = 6; /// Whether an asset-relative path names a tree excluded from runtime packages. pub fn is_runtime_package_excluded_tree(relative: &Path) -> bool { @@ -135,10 +136,13 @@ pub fn migrate_scene_text(text: &str) -> Result { }; let migrated_body = match version { - 0 | 1 => migrate_v3_to_v4(&migrate_v2_to_v3(&migrate_v1_to_v2(&body))), - 2 => migrate_v3_to_v4(&migrate_v2_to_v3(&body)), - 3 => migrate_v3_to_v4(&body), - 4 => body, + 0 | 1 => migrate_v4_to_v5(&migrate_v3_to_v4(&migrate_v2_to_v3(&migrate_v1_to_v2( + &body, + )))), + 2 => migrate_v4_to_v5(&migrate_v3_to_v4(&migrate_v2_to_v3(&body))), + 3 => migrate_v4_to_v5(&migrate_v3_to_v4(&body)), + 4 => migrate_v4_to_v5(&body), + 5 | 6 => body, _ => { return Err(format!( "scene schema version {version} is newer than supported version {CURRENT_SCENE_SCHEMA_VERSION}" @@ -228,7 +232,7 @@ mod tests { fn stamp_and_strip_round_trip() { let body = "(resources: {}, entities: {})"; let stamped = stamp_schema_version(body).unwrap(); - assert!(stamped.starts_with("(schema_version: 4,")); + assert!(stamped.starts_with(&format!("(schema_version: {CURRENT_SCENE_SCHEMA_VERSION},"))); let stripped = strip_schema_version(&stamped).unwrap(); assert_eq!(stripped, body); } @@ -237,7 +241,7 @@ mod tests { fn legacy_scene_migrates_to_current_schema() { let legacy = "(resources: {}, entities: {4294967133: ()})"; let migrated = migrate_scene_text(legacy).unwrap(); - assert!(migrated.contains("schema_version: 4")); + assert!(migrated.contains(&format!("schema_version: {CURRENT_SCENE_SCHEMA_VERSION}"))); } #[test] diff --git a/crates/scene/src/migrate.rs b/crates/scene/src/migrate.rs index 5ade779..5b5f29b 100644 --- a/crates/scene/src/migrate.rs +++ b/crates/scene/src/migrate.rs @@ -63,6 +63,15 @@ pub fn migrate_v3_to_v4(body: &str) -> String { body.to_string() } +/// Schema v5 moves primitive and mesh material ownership into stable material slots. +/// +/// Normal loading remains read-only, so the text migration only advances the in-memory schema. +/// `cargo upgrade-project --apply` materializes referenced Material assets and removes legacy +/// actor-level descriptors transactionally. +pub fn migrate_v4_to_v5(body: &str) -> String { + body.to_string() +} + fn backfill_actor_kinds(text: &str) -> String { let mut result = String::with_capacity(text.len() + 1024); let mut rest = text; diff --git a/crates/scene/src/project_validation.rs b/crates/scene/src/project_validation.rs index 8819c6b..11b0cdf 100644 --- a/crates/scene/src/project_validation.rs +++ b/crates/scene/src/project_validation.rs @@ -12,8 +12,8 @@ use shared::{ AnimationControllerDesc, AnimationDiagnosticSeverity, AnimationManifest, AssetSourceFingerprint, AudioListenerDesc, AudioSourceDesc, BrushDesc, ColliderDesc, ColliderShapeDesc, EditorAssetRef, MaterialAsset, MaterialDesc, MaterialInstanceAsset, - MaterialOverride, ModelRef, PostProcessEffectAsset, PostProcessVolumeDesc, PrefabInstance, - PrefabRef, RendererMaterialSet, ShaderSchemaAsset, SkinnedMeshRenderer, StaticMeshRenderer, + MaterialOverride, MaterialSlotSet, ModelRef, PostProcessEffectAsset, PostProcessVolumeDesc, + PrefabInstance, PrefabRef, ShaderSchemaAsset, SkinnedMeshRenderer, StaticMeshRenderer, TerrainDesc, ANIMATION_MANIFEST_SCHEMA_VERSION, AUDIO_CLIP_SUB_ASSET_ID, COMPONENT_ANIMATION_CONTROLLER_DESC, COMPONENT_SKINNED_MESH_RENDERER, NAVIGATION_GENERATED_ARTIFACT_DIRECTORY, @@ -192,7 +192,9 @@ fn validate_project_manifest( repair: "Repair the project audio buses so required IDs exist and all parent routes terminate at Master.".into(), }); } - if manifest.version != 1 || manifest.template_version > 1 { + if manifest.version != settings::SETTINGS_VERSION + || manifest.template_version > settings::PROJECT_TEMPLATE_VERSION + { report.findings.push(ProjectValidationFinding { severity: ValidationSeverity::Error, code: "project.incompatible_schema".into(), @@ -206,6 +208,17 @@ fn validate_project_manifest( repair: "Open the project in a compatible editor or run its project migration.".into(), }); } + if manifest.asset_roots != ["assets"] { + report.findings.push(ProjectValidationFinding { + severity: ValidationSeverity::Error, + code: "project.noncanonical_asset_roots".into(), + source_path: source.into(), + owner_actor_id: None, + reference: None, + message: "project asset_roots must be exactly [\"assets\"]".into(), + repair: "Run `cargo upgrade-project --project . --apply` to adopt the managed content workspace.".into(), + }); + } add_reference( project_root, report, @@ -330,6 +343,27 @@ struct RegistryAssetRecord { dependencies: Vec, } +impl From for RegistryAssetRecord { + fn from(record: shared::AssetRecord) -> Self { + let model = record.import_settings.model(); + Self { + id: RegistryAssetId(record.id.as_string()), + path: record.path, + kind_tag: format!("{:?}", record.kind), + source_fingerprint: record.source_fingerprint, + import_settings: RegistryImportSettings { + static_mesh_manifest_path: model + .and_then(|settings| settings.static_mesh_manifest_path.clone()), + animation_manifest_path: model + .and_then(|settings| settings.animation_manifest_path.clone()), + default_animation_clip_id: model + .and_then(|settings| settings.default_animation_clip_id.clone()), + }, + dependencies: record.dependencies, + } + } +} + #[derive(Debug, Clone)] struct AnimationRegistryRecord { source_path: String, @@ -367,13 +401,44 @@ fn validate_asset_registry( }); return animation_catalog; } - let Some(records) = parse_document::>( - &path, - "assets/.index/registry.ron", - "registry", - report, - ) else { - return animation_catalog; + let records = match std::fs::read_to_string(&path) { + Ok(source) => match shared::parse_asset_registry(&source) { + Ok(loaded) => loaded + .document + .records + .into_iter() + .map(RegistryAssetRecord::from) + .collect::>(), + // Validator fixtures and legacy projects may use symbolic IDs. Preserve the previous + // read-only validation view while production registry v2 remains UUID-typed. + Err(shared_error) => match ron::from_str::>(&source) { + Ok(records) => records, + Err(_) => { + report.findings.push(ProjectValidationFinding { + severity: ValidationSeverity::Error, + code: "registry.invalid".into(), + source_path: "assets/.index/registry.ron".into(), + owner_actor_id: None, + reference: None, + message: format!("could not parse registry: {shared_error}"), + repair: "Repair or regenerate the registry document.".into(), + }); + return animation_catalog; + } + }, + }, + Err(error) => { + report.findings.push(ProjectValidationFinding { + severity: ValidationSeverity::Error, + code: "registry.invalid".into(), + source_path: "assets/.index/registry.ron".into(), + owner_actor_id: None, + reference: None, + message: format!("could not read registry: {error}"), + repair: "Repair or regenerate the registry document.".into(), + }); + return animation_catalog; + } }; let mut ids = BTreeSet::new(); let mut paths = BTreeSet::new(); @@ -619,15 +684,8 @@ fn validate_material_assets(project_root: &Path, report: &mut ProjectValidationR .into(), }); } - if let Some(shader) = asset.shader { - add_reference( - project_root, - report, - &source, - None, - "shader_schema", - &shader, - ); + if let Some(shader) = asset.shader.schema_path.as_deref() { + add_reference(project_root, report, &source, None, "shader_schema", shader); } if let Some(shader) = asset.shader_ref { collect_asset_ref( @@ -639,7 +697,12 @@ fn validate_material_assets(project_root: &Path, report: &mut ProjectValidationR &shader, ); } - collect_material(project_root, report, &source, None, &asset.material); + let mut material = shared::MaterialDesc { + shader: asset.shader.clone(), + ..Default::default() + }; + asset.inputs.apply_to_material_desc(&mut material); + collect_material(project_root, report, &source, None, &material); continue; } if let Ok(instance) = ron::from_str::(&text) { @@ -684,7 +747,7 @@ fn validate_material_assets(project_root: &Path, report: &mut ProjectValidationR "material", &instance.base.0, ); - for texture in instance.textures { + for texture in instance.overrides.textures { if let Some(reference) = texture.texture { collect_asset_ref(project_root, report, &source, None, "texture", &reference); } @@ -764,9 +827,17 @@ fn validate_shader_assets(project_root: &Path, report: &mut ProjectValidationRep } } } - for texture in asset.default_textures { - if let Some(reference) = texture.texture { - collect_asset_ref(project_root, report, &source, None, "texture", &reference); + for input in asset.schema.inputs { + if input.texture.is_some() && input.name.trim().is_empty() { + report.findings.push(ProjectValidationFinding { + severity: ValidationSeverity::Error, + code: "surface_shader.invalid_input".into(), + source_path: source.clone(), + owner_actor_id: None, + reference: None, + message: "shader texture input names cannot be empty".into(), + repair: "Assign a stable input name in the shader schema.".into(), + }); } } } @@ -798,6 +869,8 @@ struct StaticMeshManifestView { import: StaticMeshImportView, #[serde(default)] warnings: Vec, + #[serde(default)] + parts: Vec, } #[derive(Deserialize)] @@ -815,6 +888,18 @@ struct StaticMeshSourceView { struct StaticMeshImportView { #[serde(default)] material_policy: StaticMeshMaterialPolicyView, + #[serde(default)] + material_slots: Vec, +} + +#[derive(Default, Deserialize)] +struct StaticMeshPartView { + #[serde(default)] + id: String, + #[serde(default)] + material_id: Option, + #[serde(default)] + material_label: Option, } #[derive(Default, Deserialize, PartialEq, Eq)] @@ -877,7 +962,7 @@ fn validate_static_mesh_manifests(project_root: &Path, report: &mut ProjectValid "static mesh source", ); let optional_source_textures = manifest.source.format.eq_ignore_ascii_case("fbx") - && manifest.import.material_policy == StaticMeshMaterialPolicyView::AuthoringOverride; + && !static_manifest_uses_source_materials(&manifest); add_import_dependencies( project_root, report, @@ -901,6 +986,35 @@ fn validate_static_mesh_manifests(project_root: &Path, report: &mut ProjectValid } } +fn static_manifest_uses_source_materials(manifest: &StaticMeshManifestView) -> bool { + if manifest.import.material_policy == StaticMeshMaterialPolicyView::AuthoringOverride { + return false; + } + if manifest.parts.is_empty() { + return manifest.import.material_slots.is_empty() + || manifest + .import + .material_slots + .iter() + .any(|slot| matches!(slot.selection, shared::ModelMaterialSelection::Source)); + } + manifest.parts.iter().any(|part| { + if part.material_id.is_none() && part.material_label.is_none() { + return false; + } + if part.id.trim().is_empty() { + return true; + } + let slot_id = format!("slot:{}", part.id); + manifest + .import + .material_slots + .iter() + .find(|slot| slot.slot_id.0 == slot_id) + .is_none_or(|slot| matches!(slot.selection, shared::ModelMaterialSelection::Source)) + }) +} + fn add_import_dependencies( project_root: &Path, report: &mut ProjectValidationReport, @@ -955,7 +1069,7 @@ fn add_import_dependencies( reference: Some(missing.join(", ")), message: if optional_source_textures { format!( - "{} FBX source texture(s) are unavailable and intentionally ignored by Authoring Override", + "{} FBX source texture(s) are unavailable and intentionally unused by the model's per-slot material selections", missing.len() ) } else { @@ -965,10 +1079,10 @@ fn add_import_dependencies( ) }, repair: if optional_source_textures { - "No action is required while Authoring Override remains active; restore the texture bundle before selecting Source Materials." + "No action is required while every imported slot uses Project or Default; restore the texture bundle before selecting Source on a slot." .into() } else { - "Restore the referenced texture bundle and reimport, or select Authoring Override for a deliberately untextured asset." + "Restore the referenced texture bundle and reimport, or select Project/Default for every deliberately untextured slot." .into() }, }); @@ -1597,6 +1711,29 @@ fn validate_document( } let mut enabled_listeners = Vec::new(); for entity in &document.entities { + let has_legacy_material = entity + .components + .iter() + .any(|component| component.type_name == MATERIAL_DESC); + let uses_material_slots = entity.components.iter().any(|component| { + matches!( + component.type_name.as_str(), + "shared::components::Primitive" + | STATIC_MESH_RENDERER + | COMPONENT_SKINNED_MESH_RENDERER + ) + }); + if has_legacy_material && uses_material_slots { + report.findings.push(ProjectValidationFinding { + severity: ValidationSeverity::Warning, + code: "material.legacy_actor_component".into(), + source_path: source_path.clone(), + owner_actor_id: entity.actor_id.clone(), + reference: Some(MATERIAL_DESC.into()), + message: "primitive or mesh actor still stores a legacy actor-local MaterialDesc; the material-slot fallback is used until the project is upgraded".into(), + repair: "Run `cargo upgrade-project --project . --apply` to materialize a shared Material asset and assign the exact saved slot.".into(), + }); + } for component in &entity.components { if component.type_name == AUDIO_LISTENER_DESC { if let Ok(listener) = ron::from_str::(&component.ron) { @@ -2044,16 +2181,6 @@ fn collect_component_references( "mesh", &slot.mesh, ); - if let Some(material) = slot.material { - collect_asset_ref( - project_root, - report, - source_path, - actor_id, - "material", - &material, - ); - } } } BRUSH_DESC => { @@ -2207,13 +2334,10 @@ fn collect_renderer_material_references( report: &mut ProjectValidationReport, source_path: &str, actor_id: Option<&str>, - materials: &RendererMaterialSet, + materials: &MaterialSlotSet, ) { for slot in &materials.slots { - for reference in [slot.source_material.as_ref(), slot.material.as_ref()] - .into_iter() - .flatten() - { + if let Some(reference) = slot.material.as_ref() { collect_asset_ref( project_root, report, @@ -3255,7 +3379,7 @@ mod tests { std::fs::create_dir_all(root.join("assets/levels")).unwrap(); std::fs::create_dir_all(root.join("assets/.index")).unwrap(); std::fs::write(root.join("assets/.index/registry.ron"), "[]").unwrap(); - write_manifest(&root, 1); + write_manifest(&root, settings::SETTINGS_VERSION); root } @@ -3373,7 +3497,7 @@ mod tests { .find(|finding| finding.code == "import.external_texture_missing") .expect("Authoring Override should retain one actionable dependency state"); assert_eq!(finding.severity, ValidationSeverity::Info); - assert!(finding.message.contains("Authoring Override")); + assert!(finding.message.contains("per-slot material selections")); assert!(report.is_release_ready(), "{:?}", report.findings); assert_eq!(std::fs::read(&artifact).unwrap(), before); std::fs::remove_dir_all(root).unwrap(); @@ -3465,7 +3589,7 @@ mod tests { std::fs::write( root.join("assets/project.ron"), format!( - "(version:{version},template_version:1,default_level:\"assets/levels/main.scn.ron\",asset_roots:[\"assets/levels\"],capabilities:[])" + "(version:{version},template_version:2,default_level:\"assets/levels/main.scn.ron\",asset_roots:[\"assets\"],capabilities:[])" ), ) .unwrap(); @@ -4543,7 +4667,7 @@ mod tests { .unwrap(); std::fs::write( root.join("assets/project.ron"), - "(version:1,template_version:1,default_level:\"assets/custom/start.scn.ron\",asset_roots:[\"assets/levels\"],capabilities:[])", + "(version:2,template_version:2,default_level:\"assets/custom/start.scn.ron\",asset_roots:[\"assets\"],capabilities:[])", ) .unwrap(); @@ -4562,7 +4686,7 @@ mod tests { std::fs::write(root.join("assets/levels/splash.png"), b"not a scene").unwrap(); std::fs::write( root.join("assets/project.ron"), - "(version:1,template_version:1,default_level:\"assets/levels/splash.png\",asset_roots:[\"assets/levels\"],capabilities:[])", + "(version:2,template_version:2,default_level:\"assets/levels/splash.png\",asset_roots:[\"assets\"],capabilities:[])", ) .unwrap(); diff --git a/crates/scene/src/sample_pack.rs b/crates/scene/src/sample_pack.rs index d2375af..3d7bd68 100644 --- a/crates/scene/src/sample_pack.rs +++ b/crates/scene/src/sample_pack.rs @@ -63,7 +63,9 @@ impl EditorSampleArea { fn required_components(self) -> &'static [&'static str] { match self { Self::Brush => &[COMPONENT_BRUSH_DESC], - Self::Material => &[COMPONENT_MATERIAL_DESC], + // Materials are authored through renderer-owned slots. The Material Lab uses + // Primitive.surface slots; actor-local MaterialDesc is a brush-only legacy path. + Self::Material => &[COMPONENT_PRIMITIVE], Self::Terrain => &[COMPONENT_TERRAIN_DESC], Self::PhysicsPlacement => &[COMPONENT_RIGID_BODY_DESC, COMPONENT_COLLIDER_DESC], Self::Rendering => &[COMPONENT_POST_PROCESS_VOLUME], @@ -717,6 +719,7 @@ mod tests { fn valid_component_ron(type_name: &str) -> String { match type_name { COMPONENT_BRUSH_DESC => ron::to_string(&BrushDesc::default()).unwrap(), + COMPONENT_PRIMITIVE => ron::to_string(&Primitive::default()).unwrap(), COMPONENT_MATERIAL_DESC => ron::to_string(&MaterialDesc::default()).unwrap(), COMPONENT_TERRAIN_DESC => ron::to_string(&TerrainDesc::default()).unwrap(), COMPONENT_RIGID_BODY_DESC => ron::to_string(&RigidBodyDesc::default()).unwrap(), @@ -858,7 +861,7 @@ mod tests { fn every_required_area_payload_is_type_checked() { for malformed_type in [ COMPONENT_BRUSH_DESC, - COMPONENT_MATERIAL_DESC, + COMPONENT_PRIMITIVE, COMPONENT_TERRAIN_DESC, COMPONENT_RIGID_BODY_DESC, COMPONENT_COLLIDER_DESC, diff --git a/crates/scene/src/upgrade.rs b/crates/scene/src/upgrade.rs index 761a46f..7dfec88 100644 --- a/crates/scene/src/upgrade.rs +++ b/crates/scene/src/upgrade.rs @@ -4,15 +4,23 @@ use std::fs; use std::path::{Path, PathBuf}; use std::time::{SystemTime, UNIX_EPOCH}; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use shared::{ - AuthoringComponentStates, ComponentInstanceId, InspectorOrder, MaterialAsset, - MaterialInstanceAsset, MaterialRef, RendererMaterialSlot, ShaderSchemaAsset, - StaticMeshRenderer, COMPONENT_STATIC_MESH_RENDERER, + AssetId, AssetKind, AssetRecord, AssetRegistryDocument, AuthoringComponentStates, + ComponentInstanceId, InspectorOrder, MaterialAsset, MaterialDesc, MaterialInputGroupDesc, + MaterialInputSchema, MaterialInputSet, MaterialInstanceAsset, MaterialOverride, + MaterialParameter, MaterialProvenance, MaterialRef, MaterialRenderState, MaterialSlot, + Primitive, ShaderPropertyType, ShaderSchemaAsset, SkinnedMeshRenderer, StaticMeshRenderer, + COMPONENT_MATERIAL_DESC, COMPONENT_MATERIAL_OVERRIDE, COMPONENT_PRIMITIVE, + COMPONENT_SKINNED_MESH_RENDERER, COMPONENT_STATIC_MESH_RENDERER, MATERIAL_ASSET_SCHEMA_VERSION, }; use crate::document::{SceneComponentBlob, SceneDocument}; +#[path = "upgrade/io.rs"] +mod io; +use io::{collect_files, normalize_text}; + const INSPECTOR_ORDER_COMPONENT: &str = "shared::components::InspectorOrder"; const AUTHORING_COMPONENT_STATES_COMPONENT: &str = "shared::components::AuthoringComponentStates"; @@ -34,10 +42,29 @@ struct PendingWrite { path: PathBuf, contents: String, kind: &'static str, + existed: bool, +} + +struct LegacyMaterialMigration<'a> { + root: &'a Path, + registry: AssetRegistryDocument, + material_writes: std::collections::BTreeMap, } pub fn upgrade_project(root: &Path, apply: bool) -> Result { let assets = root.join("assets"); + let registry_path = assets.join(".index/registry.ron"); + let registry_original = fs::read_to_string(®istry_path).unwrap_or_default(); + let registry = if registry_original.trim().is_empty() { + AssetRegistryDocument::default() + } else { + shared::parse_asset_registry(®istry_original)?.document + }; + let mut legacy_materials = LegacyMaterialMigration { + root, + registry, + material_writes: std::collections::BTreeMap::new(), + }; let mut files = Vec::new(); collect_files(&assets, &mut files)?; files.sort(); @@ -54,21 +81,41 @@ pub fn upgrade_project(root: &Path, apply: bool) -> Result Some((value, "scene-schema")), Err(error) => { warnings.push(format!("{normalized}: {error}")); None } } - } else if normalized.contains("/materials/") && normalized.ends_with(".ron") { - canonical_material_document(&path, &original) - } else if normalized.contains("/shaders/") && normalized.ends_with(".shader.ron") { + } else if registered_kind == Some(AssetKind::ShaderSchema) + || normalized.ends_with(".shader.ron") + { canonical_shader_document(&original) + } else if matches!( + registered_kind, + Some(AssetKind::Material | AssetKind::MaterialInstance) + ) || normalized.ends_with(".material.ron") + || normalized.ends_with(".material-instance.ron") + { + canonical_material_document(&path, &original, registered_kind, &mut legacy_materials) } else { None }; @@ -80,10 +127,39 @@ pub fn upgrade_project(root: &Path, apply: bool) -> Result Result Result Result Result { +fn rollback_project_upgrade( + root: &Path, + backup_root: &Path, + changes: &[ProjectUpgradeChange], + staged: &[(PathBuf, PathBuf)], + created_directories: &[PathBuf], +) { + for change in changes { + let backup = backup_root.join(&change.path); + let destination = root.join(&change.path); + if backup.exists() { + let _ = fs::copy(backup, destination); + } else { + let _ = fs::remove_file(destination); + } + } + for (temporary, _) in staged { + let _ = fs::remove_file(temporary); + } + for directory in created_directories.iter().rev() { + let _ = fs::remove_dir(directory); + } + let _ = fs::remove_dir_all(backup_root); +} + +fn canonical_project_settings(text: &str) -> Option<(String, &'static str)> { + let mut project = ron::from_str::(text).ok()?; + project.version = settings::SETTINGS_VERSION; + project.template_version = settings::PROJECT_TEMPLATE_VERSION; + project.asset_roots = vec!["assets".into()]; + settings::save_project_settings_to_string(&project) + .ok() + .map(|contents| (contents, "project-content-settings-v2")) +} + +fn canonical_scene_document( + text: &str, + legacy_materials: &mut LegacyMaterialMigration<'_>, +) -> Result { let mut document = SceneDocument::from_ron_text(text)?; for entity in &mut document.entities { + let legacy_material = entity + .components + .iter() + .find(|component| component.type_name == COMPONENT_MATERIAL_DESC) + .map(|component| { + ron::from_str::(&component.ron) + .map_err(|error| format!("could not upgrade MaterialDesc component: {error}")) + }) + .transpose()?; + let legacy_overrides = entity + .components + .iter() + .find(|component| component.type_name == COMPONENT_MATERIAL_OVERRIDE) + .map(|component| { + ron::from_str::(&component.ron).map_err(|error| { + format!("could not upgrade MaterialOverride component: {error}") + }) + }) + .transpose()?; + let mut consumed_legacy_material = false; + + if let Some(index) = entity + .components + .iter() + .position(|component| component.type_name == COMPONENT_PRIMITIVE) + { + let mut primitive: Primitive = ron::from_str(&entity.components[index].ron) + .map_err(|error| format!("could not upgrade Primitive component: {error}"))?; + normalize_primitive_surface(&mut primitive); + if let Some(material) = legacy_material.as_ref() { + primitive.surface.material = Some(legacy_materials.reference_for(material)?); + consumed_legacy_material = true; + } + entity.components[index] = + SceneComponentBlob::from_serializable(COMPONENT_PRIMITIVE, &primitive)?; + } + + if let Some(index) = entity + .components + .iter() + .position(|component| component.type_name == COMPONENT_STATIC_MESH_RENDERER) + { + let mut renderer: StaticMeshRenderer = ron::from_str(&entity.components[index].ron) + .map_err(|error| { + format!("could not upgrade StaticMeshRenderer component: {error}") + })?; + normalize_static_renderer(&mut renderer); + if let Some(material) = legacy_material.as_ref() { + let reference = legacy_materials.reference_for(material)?; + for slot in &mut renderer.materials.slots { + slot.material = Some(reference.clone()); + } + consumed_legacy_material = true; + } else if let Some(overrides) = legacy_overrides.as_ref() { + for override_slot in &overrides.slots { + let Some(part) = renderer + .slots + .iter() + .find(|part| part.id == override_slot.slot_id) + else { + continue; + }; + let Some(slot) = renderer.materials.slot_mut(&part.material_slot_id) else { + continue; + }; + slot.material = Some(legacy_materials.reference_for(&override_slot.material)?); + } + } + entity.components[index] = + SceneComponentBlob::from_serializable(COMPONENT_STATIC_MESH_RENDERER, &renderer)?; + } + + if let Some(index) = entity + .components + .iter() + .position(|component| component.type_name == COMPONENT_SKINNED_MESH_RENDERER) + { + let mut renderer: SkinnedMeshRenderer = ron::from_str(&entity.components[index].ron) + .map_err(|error| { + format!("could not upgrade SkinnedMeshRenderer component: {error}") + })?; + if let Some(material) = legacy_material.as_ref() { + let reference = legacy_materials.reference_for(material)?; + for slot in &mut renderer.materials.slots { + slot.material = Some(reference.clone()); + } + consumed_legacy_material = true; + } else if let Some(overrides) = legacy_overrides.as_ref() { + for override_slot in &overrides.slots { + if let Some(slot) = renderer.materials.slot_mut(&override_slot.slot_id) { + slot.material = + Some(legacy_materials.reference_for(&override_slot.material)?); + } + } + } + entity.components[index] = + SceneComponentBlob::from_serializable(COMPONENT_SKINNED_MESH_RENDERER, &renderer)?; + } + + if consumed_legacy_material + || entity.components.iter().any(|component| { + component.type_name == COMPONENT_STATIC_MESH_RENDERER + || component.type_name == COMPONENT_SKINNED_MESH_RENDERER + }) + { + entity.components.retain(|component| { + component.type_name != COMPONENT_MATERIAL_DESC + && component.type_name != COMPONENT_MATERIAL_OVERRIDE + }); + } + let present_types = entity .components .iter() @@ -178,20 +438,6 @@ fn canonical_scene_document(text: &str) -> Result { .map(|component| component.type_name.clone()) .collect::>(); - if let Some(component) = entity - .components - .iter_mut() - .find(|component| component.type_name == COMPONENT_STATIC_MESH_RENDERER) - { - let mut renderer: StaticMeshRenderer = - ron::from_str(&component.ron).map_err(|error| { - format!("could not upgrade StaticMeshRenderer component: {error}") - })?; - normalize_static_renderer(&mut renderer); - *component = - SceneComponentBlob::from_serializable(COMPONENT_STATIC_MESH_RENDERER, &renderer)?; - } - let states_index = entity .components .iter() @@ -255,25 +501,151 @@ fn normalize_static_renderer(renderer: &mut StaticMeshRenderer) { if part.material_slot_id.is_empty() { part.material_slot_id = ComponentInstanceId::new(format!("slot:{}", part.id.0)); } - let legacy_material = part.material.take().map(MaterialRef::new); if let Some(slot) = renderer.materials.slot_mut(&part.material_slot_id) { - if slot.source_material.is_none() { - slot.source_material = legacy_material; - } if slot.name.trim().is_empty() { slot.name = part.name.clone(); } } else { - renderer.materials.slots.push(RendererMaterialSlot { + renderer.materials.slots.push(MaterialSlot { id: part.material_slot_id.clone(), name: part.name.clone(), - source_material: legacy_material, material: None, }); } } } +fn normalize_primitive_surface(primitive: &mut Primitive) { + if primitive.surface.id.is_empty() { + primitive.surface.id = ComponentInstanceId::new(shared::PRIMITIVE_SURFACE_SLOT_ID); + } + if primitive.surface.name.trim().is_empty() { + primitive.surface.name = "Surface".into(); + } +} + +impl LegacyMaterialMigration<'_> { + fn reference_for(&mut self, material: &MaterialDesc) -> Result { + if let Some(path) = material.material_asset_path.as_deref() { + if let Some(reference) = self.reference_for_existing(path) { + return Ok(reference); + } + } + + let mut canonical = material.clone(); + canonical.material_asset_path = None; + let canonical_ron = ron::ser::to_string(&canonical) + .map_err(|error| format!("could not canonicalize legacy material: {error}"))?; + let hash = blake3::hash(canonical_ron.as_bytes()).to_hex().to_string(); + let short = &hash[..16]; + let relative = format!("assets/materials/migrated/legacy-{short}.material.ron"); + let destination = self.root.join(&relative); + let label = format!("Legacy Material {short}"); + let asset = MaterialAsset { + schema_version: MATERIAL_ASSET_SCHEMA_VERSION, + label: label.clone(), + shader: canonical.shader.clone(), + shader_ref: None, + render_state: shared::MaterialRenderState::default(), + provenance: None, + inputs: shared::MaterialInputSet::from_material_desc(&canonical), + }; + let contents = ron::ser::to_string_pretty(&asset, ron::ser::PrettyConfig::default()) + .map_err(|error| format!("could not serialize migrated material: {error}"))?; + + if destination.exists() { + let existing = MaterialAsset::load_from_path(destination.to_string_lossy().as_ref()) + .map_err(|_| { + format!( + "legacy material migration collision at {}; choose another migration destination", + destination.display() + ) + })?; + if existing.inputs != shared::MaterialInputSet::from_material_desc(&canonical) { + return Err(format!( + "legacy material migration collision at {}", + destination.display() + )); + } + } else { + self.material_writes.entry(destination).or_insert(contents); + } + + let record_index = if let Some(index) = self + .registry + .records + .iter() + .position(|record| record.path == relative) + { + index + } else { + let digest = blake3::hash(format!("blacksite:{relative}").as_bytes()); + let mut bytes = [0_u8; 16]; + bytes.copy_from_slice(&digest.as_bytes()[..16]); + bytes[6] = (bytes[6] & 0x0f) | 0x50; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + self.registry.records.push(AssetRecord { + id: AssetId(uuid::Uuid::from_bytes(bytes)), + path: relative.clone(), + label: label.clone(), + kind: AssetKind::Material, + source_fingerprint: None, + import_settings: shared::AssetImportSettings::None, + dependencies: material_dependencies(&canonical), + }); + self.registry.records.len() - 1 + }; + let record = &self.registry.records[record_index]; + Ok(MaterialRef::new( + shared::EditorAssetRef::new(record.id.as_string(), "material:source", &record.label) + .with_source_path(&record.path), + )) + } + + fn reference_for_existing(&self, path: &str) -> Option { + let record = self + .registry + .records + .iter() + .find(|record| record.path == path)?; + let full = self.root.join(path); + let sub_asset_id = + if MaterialInstanceAsset::load_from_path(full.to_string_lossy().as_ref()).is_ok() { + "material:instance" + } else if MaterialAsset::load_from_path(full.to_string_lossy().as_ref()).is_ok() { + "material:source" + } else { + return None; + }; + Some(MaterialRef::new( + shared::EditorAssetRef::new(record.id.as_string(), sub_asset_id, &record.label) + .with_source_path(path), + )) + } +} + +fn material_dependencies(material: &MaterialDesc) -> Vec { + let mut dependencies = [ + material.base_color_texture.as_ref(), + material.emissive_texture.as_ref(), + material.normal_map_texture.as_ref(), + material.metallic_roughness_texture.as_ref(), + ] + .into_iter() + .flatten() + .cloned() + .collect::>(); + dependencies.extend(material.textures.iter().filter_map(|texture| { + texture + .texture + .as_ref() + .and_then(|reference| reference.source_path.clone()) + })); + dependencies.sort(); + dependencies.dedup(); + dependencies +} + fn normalize_component_states(states: &mut AuthoringComponentStates) { let old = std::mem::take(&mut states.states); for state in old { @@ -288,60 +660,315 @@ fn normalize_component_states(states: &mut AuthoringComponentStates) { } } -fn canonical_material_document(path: &Path, text: &str) -> Option<(String, &'static str)> { - if let Ok(asset) = ron::from_str::(text) { - return ron::ser::to_string_pretty(&asset, ron::ser::PrettyConfig::default()) - .ok() - .map(|text| (text, "material-schema")); - } - if let Ok(instance) = ron::from_str::(text) { +#[derive(Deserialize)] +struct LegacyMaterialAssetV1 { + label: String, + #[serde(default)] + shader: Option, + #[serde(default)] + shader_ref: Option, + #[serde(default)] + render_state: MaterialRenderState, + #[serde(default)] + provenance: Option, + material: MaterialDesc, +} + +#[derive(Deserialize)] +struct LegacyMaterialInstanceV1 { + label: String, + base: MaterialRef, + #[serde(default)] + parameters: Vec, + #[serde(default)] + textures: Vec, +} + +#[derive(Deserialize)] +struct LegacyShaderSchemaV1 { + label: String, + kind: shared::MaterialShaderKind, + #[serde(default)] + wgsl_path: Option, + #[serde(default)] + parameters: Vec, + #[serde(default)] + default_values: Vec, + #[serde(default)] + default_textures: Vec, +} + +#[derive(Deserialize)] +struct LegacyShaderInputV1 { + name: String, + display_name: String, + #[serde(default)] + group: String, + property_type: ShaderPropertyType, +} + +fn canonical_material_document( + path: &Path, + text: &str, + registered_kind: Option, + migration: &mut LegacyMaterialMigration<'_>, +) -> Option<(String, &'static str)> { + let is_instance = registered_kind == Some(AssetKind::MaterialInstance) + || path + .file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name.ends_with(".material-instance.ron")); + if is_instance { + if let Ok(instance) = ron::from_str::(text) { + if instance.schema_version == shared::MATERIAL_INSTANCE_SCHEMA_VERSION { + return ron::ser::to_string_pretty(&instance, ron::ser::PrettyConfig::default()) + .ok() + .map(|text| (text, "material-instance-schema")); + } + } + let legacy = ron::from_str::(text).ok()?; + let mut overrides = MaterialInputSet { + values: legacy.parameters, + textures: legacy.textures, + }; + resolve_texture_references(&mut overrides, &migration.registry); + let instance = MaterialInstanceAsset { + schema_version: shared::MATERIAL_INSTANCE_SCHEMA_VERSION, + label: legacy.label, + base: legacy.base, + overrides, + }; + update_material_instance_registry_dependencies(path, &instance, migration); return ron::ser::to_string_pretty(&instance, ron::ser::PrettyConfig::default()) .ok() - .map(|text| (text, "material-instance-schema")); + .map(|text| (text, "material-instance-schema-v2")); + } + + if let Ok(asset) = ron::from_str::(text) { + if asset.schema_version == shared::MATERIAL_ASSET_SCHEMA_VERSION { + return ron::ser::to_string_pretty(&asset, ron::ser::PrettyConfig::default()) + .ok() + .map(|text| (text, "material-schema")); + } + } + if let Ok(legacy) = ron::from_str::(text) { + let mut inputs = MaterialInputSet::from_material_desc(&legacy.material); + resolve_texture_references(&mut inputs, &migration.registry); + let mut shader = legacy.material.shader; + if shader.schema_path.is_none() { + shader.schema_path = legacy + .shader + .as_deref() + .filter(|path| path.ends_with(".ron")) + .map(str::to_string); + } + let asset = MaterialAsset { + schema_version: shared::MATERIAL_ASSET_SCHEMA_VERSION, + label: legacy.label, + shader, + shader_ref: legacy.shader_ref, + render_state: legacy.render_state, + provenance: legacy.provenance, + inputs, + }; + update_material_registry_dependencies(path, &asset.inputs, migration); + return ron::ser::to_string_pretty(&asset, ron::ser::PrettyConfig::default()) + .ok() + .map(|text| (text, "material-schema-v2")); } - let _ = path; None } fn canonical_shader_document(text: &str) -> Option<(String, &'static str)> { - let schema = ron::from_str::(text).ok()?; - ron::ser::to_string_pretty(&schema, ron::ser::PrettyConfig::default()) - .ok() - .map(|text| (text, "surface-shader-schema")) -} - -fn collect_files(path: &Path, output: &mut Vec) -> Result<(), String> { - if !path.exists() { - return Ok(()); - } - for entry in fs::read_dir(path).map_err(|error| error.to_string())? { - let entry = entry.map_err(|error| error.to_string())?; - let path = entry.path(); - if entry - .file_type() - .map_err(|error| error.to_string())? - .is_dir() - { - collect_files(&path, output)?; - } else { - output.push(path); + if let Ok(schema) = ron::from_str::(text) { + if schema.schema_version == shared::SURFACE_SHADER_SCHEMA_VERSION { + return ron::ser::to_string_pretty(&schema, ron::ser::PrettyConfig::default()) + .ok() + .map(|text| (text, "surface-shader-schema")); } } - Ok(()) + let legacy = ron::from_str::(text).ok()?; + let schema = if legacy.kind == shared::MaterialShaderKind::StandardLit { + shared::standard_lit_input_schema() + } else { + legacy_shader_input_schema(&legacy) + }; + let schema = ShaderSchemaAsset { + schema_version: shared::SURFACE_SHADER_SCHEMA_VERSION, + label: legacy.label, + kind: legacy.kind, + wgsl_path: legacy.wgsl_path, + schema, + }; + ron::ser::to_string_pretty(&schema, ron::ser::PrettyConfig::default()) + .ok() + .map(|text| (text, "surface-shader-schema-v2")) } -fn normalize_text(text: &str) -> String { - text.trim().replace("\r\n", "\n") +fn resolve_texture_references(inputs: &mut MaterialInputSet, registry: &AssetRegistryDocument) { + for binding in &mut inputs.textures { + let Some(reference) = binding.texture.as_mut() else { + continue; + }; + let Some(path) = reference.source_path.as_deref() else { + continue; + }; + if let Some(record) = registry.records.iter().find(|record| record.path == path) { + reference.asset_id = record.id.as_string(); + reference.sub_asset_id = "texture:source".into(); + reference.label = record.label.clone(); + } + } +} + +fn update_material_registry_dependencies( + path: &Path, + inputs: &MaterialInputSet, + migration: &mut LegacyMaterialMigration<'_>, +) { + let relative = path + .strip_prefix(migration.root) + .unwrap_or(path) + .to_string_lossy() + .replace('\\', "/"); + let dependencies = inputs + .textures + .iter() + .filter_map(|binding| binding.texture.as_ref()) + .filter_map(|reference| reference.source_path.clone()) + .collect::>() + .into_iter() + .collect::>(); + if let Some(record) = migration + .registry + .records + .iter_mut() + .find(|record| record.path == relative) + { + record.dependencies = dependencies; + } +} + +fn update_material_instance_registry_dependencies( + path: &Path, + instance: &MaterialInstanceAsset, + migration: &mut LegacyMaterialMigration<'_>, +) { + let relative = path + .strip_prefix(migration.root) + .unwrap_or(path) + .to_string_lossy() + .replace('\\', "/"); + let mut dependencies = instance + .overrides + .textures + .iter() + .filter_map(|binding| binding.texture.as_ref()) + .filter_map(|reference| reference.source_path.clone()) + .collect::>(); + if let Some(path) = instance.base.0.source_path.as_ref() { + dependencies.insert(path.clone()); + } + if let Some(record) = migration + .registry + .records + .iter_mut() + .find(|record| record.path == relative) + { + record.dependencies = dependencies.into_iter().collect(); + } +} + +fn legacy_shader_input_schema(legacy: &LegacyShaderSchemaV1) -> MaterialInputSchema { + let mut group_names = Vec::new(); + for input in &legacy.parameters { + if !group_names.contains(&input.group) { + group_names.push(input.group.clone()); + } + } + let groups = group_names + .iter() + .enumerate() + .map(|(index, name)| MaterialInputGroupDesc { + id: legacy_group_id(name), + display_name: if name.trim().is_empty() { + "Properties".into() + } else { + name.clone() + }, + order: index as i32, + advanced: name.to_ascii_lowercase().contains("advanced"), + }) + .collect::>(); + let inputs = legacy + .parameters + .iter() + .enumerate() + .map(|(index, input)| shared::MaterialInputDesc { + name: input.name.clone(), + display_name: input.display_name.clone(), + group: legacy_group_id(&input.group), + order: index as i32, + property_type: input.property_type.clone(), + default_value: legacy + .default_values + .iter() + .find(|value| value.name == input.name) + .map(|value| value.value.clone()), + texture: matches!(input.property_type, ShaderPropertyType::Texture).then(|| { + let default_channel = legacy + .default_textures + .iter() + .find(|binding| binding.name == input.name) + .map(|binding| binding.channel) + .unwrap_or_default(); + shared::MaterialTextureInputDesc { + semantic: shared::TextureSemantic::Mask, + default_channel, + allow_channel_override: true, + } + }), + ..Default::default() + }) + .collect(); + MaterialInputSchema { groups, inputs } +} + +fn legacy_group_id(name: &str) -> String { + let value = name + .chars() + .map(|character| { + if character.is_ascii_alphanumeric() { + character.to_ascii_lowercase() + } else { + '_' + } + }) + .collect::(); + let value = value.trim_matches('_'); + if value.is_empty() { + "properties".into() + } else { + value.into() + } } #[cfg(test)] mod tests { use super::*; use shared::{ - EditorAssetRef, InspectorComponentState, MeshRenderSlot, - AUTHORING_COMPONENT_STATIC_MESH_RENDERER, + EditorAssetRef, InspectorComponentState, MaterialSlotOverride, MaterialSlotSet, + MeshRenderSlot, AUTHORING_COMPONENT_STATIC_MESH_RENDERER, }; + fn migration_context(root: &Path) -> LegacyMaterialMigration<'_> { + LegacyMaterialMigration { + root, + registry: AssetRegistryDocument::default(), + material_writes: std::collections::BTreeMap::new(), + } + } + #[test] fn dry_run_does_not_write_and_apply_creates_backup() { let root = std::env::temp_dir().join(format!( @@ -357,7 +984,15 @@ mod tests { let dry_run = upgrade_project(&root, false).unwrap(); assert!(!dry_run.applied); - assert_eq!(dry_run.changes.len(), 1); + assert_eq!(dry_run.changes.len(), 2); + assert!(dry_run + .changes + .iter() + .any(|change| change.path == "assets/levels/main.scn.ron")); + assert!(dry_run + .changes + .iter() + .any(|change| change.path == "assets/.index/registry.ron")); assert!(fs::read_to_string(&level) .unwrap() .contains("schema_version: 3")); @@ -366,7 +1001,7 @@ mod tests { assert!(applied.applied); assert!(fs::read_to_string(&level) .unwrap() - .contains("schema_version: 4")); + .contains("schema_version: 6")); assert!(root.join(applied.backup_path.unwrap()).exists()); fs::remove_dir_all(root).unwrap(); } @@ -378,14 +1013,21 @@ mod tests { id: ComponentInstanceId::new("draw:body"), name: "Body".into(), mesh: EditorAssetRef::new("model", "mesh:body", "Body"), - material: Some(EditorAssetRef::new( - "model", - "material:body", - "Body Material", - )), + material_slot_id: ComponentInstanceId::new("slot:draw:body"), ..Default::default() }], - ..Default::default() + materials: MaterialSlotSet { + slots: vec![MaterialSlot { + id: ComponentInstanceId::new("slot:draw:body"), + name: "Body".into(), + material: Some(MaterialRef::new(EditorAssetRef::new( + "model", + "material:body", + "Body Material", + ))), + }], + orphaned_assignments: Vec::new(), + }, }; let order = InspectorOrder { component_type_names: vec![COMPONENT_STATIC_MESH_RENDERER.into()], @@ -402,7 +1044,15 @@ mod tests { ron::to_string(&order).unwrap(), ); - let upgraded = canonical_scene_document(&text).unwrap(); + let migration_root = std::env::temp_dir().join(format!( + "blacksite-canonical-upgrader-{}", + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + let mut migration = migration_context(&migration_root); + let upgraded = canonical_scene_document(&text, &mut migration).unwrap(); let document = SceneDocument::from_ron_text(&upgraded).unwrap(); let components = &document.entities[0].components; let renderer: StaticMeshRenderer = ron::from_str( @@ -413,11 +1063,11 @@ mod tests { .ron, ) .unwrap(); - assert!(renderer.slots[0].material.is_none()); + assert_eq!(renderer.slots[0].material_slot_id.0, "slot:draw:body"); assert_eq!(renderer.materials.slots.len(), 1); assert_eq!( renderer.materials.slots[0] - .source_material + .material .as_ref() .unwrap() .0 @@ -447,4 +1097,168 @@ mod tests { .unwrap(); assert!(!states.is_component_active(COMPONENT_STATIC_MESH_RENDERER)); } + + #[test] + fn primitive_legacy_material_becomes_one_deduplicated_project_asset_and_surface_assignment() { + let root = std::env::temp_dir().join(format!( + "blacksite-primitive-material-upgrader-{}", + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + let primitive = Primitive::default(); + let material = MaterialDesc { + metallic: 0.65, + roughness: 0.2, + ..Default::default() + }; + let entity = format!( + "(components: {{\"{COMPONENT_PRIMITIVE}\": {}, \"{COMPONENT_MATERIAL_DESC}\": {}}})", + ron::to_string(&primitive).unwrap(), + ron::to_string(&material).unwrap(), + ); + let text = + format!("(schema_version: 4, resources: {{}}, entities: {{1: {entity}, 2: {entity}}})"); + let mut migration = migration_context(&root); + + let upgraded = canonical_scene_document(&text, &mut migration).unwrap(); + let document = SceneDocument::from_ron_text(&upgraded).unwrap(); + + assert_eq!(migration.material_writes.len(), 1); + assert_eq!(migration.registry.records.len(), 1); + let assigned = document + .entities + .iter() + .map(|entity| { + assert!(!entity + .components + .iter() + .any(|component| component.type_name == COMPONENT_MATERIAL_DESC)); + let primitive: Primitive = ron::from_str( + &entity + .components + .iter() + .find(|component| component.type_name == COMPONENT_PRIMITIVE) + .unwrap() + .ron, + ) + .unwrap(); + assert_eq!(primitive.surface.id.0, shared::PRIMITIVE_SURFACE_SLOT_ID); + primitive.surface.material.unwrap() + }) + .collect::>(); + assert_eq!(assigned[0], assigned[1]); + assert_eq!( + assigned[0].0.asset_id, + migration.registry.records[0].id.as_string() + ); + } + + #[test] + fn skinned_slot_override_migrates_to_the_exact_saved_slot() { + let root = std::env::temp_dir().join(format!( + "blacksite-skinned-material-upgrader-{}", + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + let slot_id = ComponentInstanceId::new("slot:body"); + let renderer = SkinnedMeshRenderer { + materials: MaterialSlotSet { + slots: vec![MaterialSlot { + id: slot_id.clone(), + name: "Body".into(), + ..Default::default() + }], + ..Default::default() + }, + ..Default::default() + }; + let overrides = MaterialOverride { + slots: vec![MaterialSlotOverride { + slot_id: slot_id.clone(), + base_material: None, + material: MaterialDesc { + metallic: 1.0, + ..Default::default() + }, + }], + }; + let text = format!( + "(schema_version: 4, resources: {{}}, entities: {{1: (components: {{\"{COMPONENT_SKINNED_MESH_RENDERER}\": {}, \"{COMPONENT_MATERIAL_OVERRIDE}\": {}}})}})", + ron::to_string(&renderer).unwrap(), + ron::to_string(&overrides).unwrap(), + ); + let mut migration = migration_context(&root); + + let upgraded = canonical_scene_document(&text, &mut migration).unwrap(); + let document = SceneDocument::from_ron_text(&upgraded).unwrap(); + let components = &document.entities[0].components; + let renderer: SkinnedMeshRenderer = ron::from_str( + &components + .iter() + .find(|component| component.type_name == COMPONENT_SKINNED_MESH_RENDERER) + .unwrap() + .ron, + ) + .unwrap(); + + assert!(renderer + .materials + .slot(&slot_id) + .unwrap() + .material + .is_some()); + assert!(!components + .iter() + .any(|component| component.type_name == COMPONENT_MATERIAL_OVERRIDE)); + assert_eq!(migration.material_writes.len(), 1); + } + + #[test] + fn material_collision_blocks_apply_without_writing_any_project_bytes() { + let root = std::env::temp_dir().join(format!( + "blacksite-material-collision-upgrader-{}", + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos() + )); + let material = MaterialDesc { + metallic: 0.42, + ..Default::default() + }; + let scene = root.join("assets/levels/collision.scn.ron"); + fs::create_dir_all(scene.parent().unwrap()).unwrap(); + let scene_bytes = format!( + "(schema_version: 4, resources: {{}}, entities: {{1: (components: {{\"{COMPONENT_PRIMITIVE}\": {}, \"{COMPONENT_MATERIAL_DESC}\": {}}})}})", + ron::to_string(&Primitive::default()).unwrap(), + ron::to_string(&material).unwrap(), + ); + fs::write(&scene, &scene_bytes).unwrap(); + let canonical = ron::ser::to_string(&material).unwrap(); + let hash = blake3::hash(canonical.as_bytes()).to_hex().to_string(); + let collision = root.join(format!( + "assets/materials/migrated/legacy-{}.material.ron", + &hash[..16] + )); + fs::create_dir_all(collision.parent().unwrap()).unwrap(); + fs::write(&collision, "owned by another asset").unwrap(); + + let preview = upgrade_project(&root, false).unwrap(); + assert_eq!(preview.warnings.len(), 1); + let error = upgrade_project(&root, true).unwrap_err(); + + assert!(error.contains("blocked")); + assert_eq!(fs::read_to_string(&scene).unwrap(), scene_bytes); + assert_eq!( + fs::read_to_string(&collision).unwrap(), + "owned by another asset" + ); + assert!(!root.join("assets/.index/registry.ron").exists()); + assert!(!root.join(".blacksite").exists()); + fs::remove_dir_all(root).unwrap(); + } } diff --git a/crates/scene/src/upgrade/io.rs b/crates/scene/src/upgrade/io.rs new file mode 100644 index 0000000..91dc4cb --- /dev/null +++ b/crates/scene/src/upgrade/io.rs @@ -0,0 +1,26 @@ +use std::fs; +use std::path::{Path, PathBuf}; + +pub(super) fn collect_files(path: &Path, output: &mut Vec) -> Result<(), String> { + if !path.exists() { + return Ok(()); + } + for entry in fs::read_dir(path).map_err(|error| error.to_string())? { + let entry = entry.map_err(|error| error.to_string())?; + let path = entry.path(); + if entry + .file_type() + .map_err(|error| error.to_string())? + .is_dir() + { + collect_files(&path, output)?; + } else { + output.push(path); + } + } + Ok(()) +} + +pub(super) fn normalize_text(text: &str) -> String { + text.trim().replace("\r\n", "\n") +} diff --git a/crates/settings/src/lib.rs b/crates/settings/src/lib.rs index b5862fd..136263d 100644 --- a/crates/settings/src/lib.rs +++ b/crates/settings/src/lib.rs @@ -20,8 +20,8 @@ use bevy::prelude::*; use serde::{Deserialize, Serialize}; pub const DEFAULT_PROJECT_PATH: &str = "assets/project.ron"; -pub const SETTINGS_VERSION: u32 = 1; -pub const PROJECT_TEMPLATE_VERSION: u32 = 1; +pub const SETTINGS_VERSION: u32 = 2; +pub const PROJECT_TEMPLATE_VERSION: u32 = 2; #[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, Reflect, PartialEq, Eq)] #[reflect(Clone)] @@ -73,13 +73,7 @@ impl Default for ProjectSettings { "audio".into(), ], default_level: "assets/levels/editor_scene.scn.ron".into(), - asset_roots: vec![ - "assets/models".into(), - "assets/textures".into(), - "assets/materials".into(), - "assets/levels".into(), - "assets/audio".into(), - ], + asset_roots: vec!["assets".into()], rendering: RenderingSettings::default(), audio: AudioSettings::default(), physics: PhysicsSettings::default(), @@ -334,14 +328,11 @@ mod tests { } #[test] - fn project_defaults_include_audio_capability_and_asset_root() { + fn project_defaults_include_audio_capability_and_one_content_root() { let settings = ProjectSettings::default(); assert!(settings.capabilities.iter().any(|item| item == "audio")); - assert!(settings - .asset_roots - .iter() - .any(|item| item == "assets/audio")); + assert_eq!(settings.asset_roots, ["assets"]); assert!(settings.audio.validate().is_ok()); } diff --git a/crates/settings/src/plugin.rs b/crates/settings/src/plugin.rs index 9b7a9bb..d75b313 100644 --- a/crates/settings/src/plugin.rs +++ b/crates/settings/src/plugin.rs @@ -78,7 +78,12 @@ pub struct ProjectSettingsPlugin; impl Plugin for ProjectSettingsPlugin { fn build(&self, app: &mut App) { - app.init_resource::() + // Startup systems from hot-loaded crates validate their resource + // parameters before the deferred `PreStartup` load is guaranteed to + // have been applied. Keep a default value present synchronously, then + // replace it with the authored project document in `load_settings`. + app.init_resource::() + .init_resource::() .register_type::() .register_type::() .register_type::() @@ -121,3 +126,16 @@ pub fn save_project_settings( io.dirty = false; Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn plugin_makes_project_settings_available_before_startup_runs() { + let mut app = App::new(); + app.add_plugins(ProjectSettingsPlugin); + + assert!(app.world().contains_resource::()); + } +} diff --git a/crates/shared/AGENTS.md b/crates/shared/AGENTS.md new file mode 100644 index 0000000..4bbec6c --- /dev/null +++ b/crates/shared/AGENTS.md @@ -0,0 +1,8 @@ +# Shared subtree rules + +- Public schema or type changes require migration analysis and focused compatibility tests. +- Ordinary loading remains read-only unless an accepted architecture decision explicitly says + otherwise. +- Update accepted ADRs and canonical docs at the slice boundary. +- A shared type change invalidates dependents according to the verification matrix; it does not + automatically require packaging in the fast loop. diff --git a/crates/shared/Cargo.toml b/crates/shared/Cargo.toml index 4a49cb9..11ff97c 100644 --- a/crates/shared/Cargo.toml +++ b/crates/shared/Cargo.toml @@ -12,3 +12,4 @@ blake3 = "1" ron = "0.8" serde.workspace = true settings.workspace = true +uuid = { version = "1", features = ["v4", "serde"] } diff --git a/crates/shared/src/animation.rs b/crates/shared/src/animation.rs index 17036e4..0879bfd 100644 --- a/crates/shared/src/animation.rs +++ b/crates/shared/src/animation.rs @@ -94,7 +94,7 @@ pub struct SkinnedMeshRenderer { pub scene_index: usize, /// Stable material slots for every draw binding in the imported animated hierarchy. #[serde(default)] - pub materials: crate::RendererMaterialSet, + pub materials: crate::MaterialSlotSet, } impl SkinnedMeshRenderer { @@ -103,7 +103,7 @@ impl SkinnedMeshRenderer { asset_id: String::new(), path: path.into(), scene_index: 0, - materials: crate::RendererMaterialSet::default(), + materials: crate::MaterialSlotSet::default(), } } diff --git a/crates/shared/src/components.rs b/crates/shared/src/components.rs index d9efe7a..44dd717 100644 --- a/crates/shared/src/components.rs +++ b/crates/shared/src/components.rs @@ -2,6 +2,8 @@ use avian3d::prelude::ColliderConstructor; use bevy::prelude::*; use serde::{Deserialize, Serialize}; +use crate::{ColorDesc, MaterialDesc}; + /// Stable persisted identity for an actor. Bevy [`Entity`] IDs are runtime-only. #[derive( Component, Reflect, Default, Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, @@ -617,12 +619,24 @@ pub enum PrimitiveShape { Ramp, } +pub const PRIMITIVE_SURFACE_SLOT_ID: &str = "slot:primitive:surface"; + +fn default_primitive_surface() -> crate::MaterialSlot { + crate::MaterialSlot { + id: ComponentInstanceId::new(PRIMITIVE_SURFACE_SLOT_ID), + name: "Surface".into(), + material: None, + } +} + /// Reflectable authoring primitive. Hydration turns this into `Mesh3d`. #[derive(Component, Reflect, Debug, Clone, PartialEq, Serialize, Deserialize)] #[reflect(Component, Default, Debug, PartialEq, Serialize, Deserialize)] pub struct Primitive { pub shape: PrimitiveShape, pub size: Vec3, + #[serde(default = "default_primitive_surface")] + pub surface: crate::MaterialSlot, } impl Primitive { @@ -630,6 +644,7 @@ impl Primitive { Self { shape: PrimitiveShape::Box, size, + surface: default_primitive_surface(), } } @@ -637,6 +652,7 @@ impl Primitive { Self { shape: PrimitiveShape::Sphere, size: Vec3::splat(radius * 2.0), + surface: default_primitive_surface(), } } @@ -644,6 +660,7 @@ impl Primitive { Self { shape: PrimitiveShape::Ramp, size, + surface: default_primitive_surface(), } } } @@ -1132,10 +1149,6 @@ pub struct MeshRenderSlot { /// Stable renderer material slot used by this draw part. #[serde(default)] pub material_slot_id: ComponentInstanceId, - /// Legacy inline imported-material reference. Schema-v4 migration moves this into the - /// renderer's shared `RendererMaterialSet`. - #[serde(default)] - pub material: Option, #[serde(default)] pub local_transform: Transform, #[serde(default = "default_true")] @@ -1153,7 +1166,6 @@ impl Default for MeshRenderSlot { name: "Mesh".into(), mesh: EditorAssetRef::default(), material_slot_id: ComponentInstanceId::default(), - material: None, local_transform: Transform::default(), visible: true, cast_shadows: true, @@ -1176,14 +1188,14 @@ pub struct StaticMeshRenderer { #[serde(default, alias = "entries")] pub slots: Vec, #[serde(default)] - pub materials: crate::RendererMaterialSet, + pub materials: crate::MaterialSlotSet, } impl StaticMeshRenderer { pub fn empty() -> Self { Self { slots: Vec::new(), - materials: crate::RendererMaterialSet::default(), + materials: crate::MaterialSlotSet::default(), } } @@ -1191,12 +1203,10 @@ impl StaticMeshRenderer { if slot.material_slot_id.0.trim().is_empty() { slot.material_slot_id = ComponentInstanceId::new(format!("slot:{}", slot.id.0)); } - let source_material = slot.material.clone().map(crate::MaterialRef::new); - let materials = crate::RendererMaterialSet { - slots: vec![crate::RendererMaterialSlot { + let materials = crate::MaterialSlotSet { + slots: vec![crate::MaterialSlot { id: slot.material_slot_id.clone(), name: slot.name.clone(), - source_material, material: None, }], orphaned_assignments: Vec::new(), @@ -1207,10 +1217,7 @@ impl StaticMeshRenderer { } } - pub fn material_slot_for_part( - &self, - part: &MeshRenderSlot, - ) -> Option<&crate::RendererMaterialSlot> { + pub fn material_slot_for_part(&self, part: &MeshRenderSlot) -> Option<&crate::MaterialSlot> { let slot_id = if part.material_slot_id.0.trim().is_empty() { &part.id } else { @@ -1262,148 +1269,6 @@ impl Default for ShaderRefDesc { } /// Typed material parameter value exposed by a shader schema. -#[derive(Reflect, Debug, Clone, PartialEq, Serialize, Deserialize)] -#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] -pub enum MaterialParameterValue { - Bool(bool), - Float(f32), - Vec2(Vec2), - Vec3(Vec3), - Color(ColorDesc), - Enum(String), -} - -impl Default for MaterialParameterValue { - fn default() -> Self { - Self::Float(0.0) - } -} - -#[derive(Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)] -#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] -pub struct MaterialParameter { - pub name: String, - pub value: MaterialParameterValue, -} - -#[derive(Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)] -#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] -pub struct MaterialTextureBinding { - pub name: String, - pub texture: Option, -} - -/// Per-render-slot material override stored on scene actors. -#[derive(Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)] -#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] -pub struct MaterialSlotOverride { - pub slot_id: ComponentInstanceId, - #[serde(default)] - pub base_material: Option, - pub material: MaterialDesc, -} - -/// Actor-level material overrides. Shared material assets are edited by asset -/// inspectors, while actor inspectors write only to this component. -#[derive(Component, Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)] -#[reflect(Component, Default, Debug, PartialEq, Serialize, Deserialize)] -pub struct MaterialOverride { - #[serde(default)] - pub slots: Vec, -} - -/// Serializable color description. This avoids coupling saved scenes to any -/// internal color representation details. -#[derive(Reflect, Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] -#[reflect(Default, Debug, Serialize, Deserialize)] -pub struct ColorDesc { - pub r: f32, - pub g: f32, - pub b: f32, - pub a: f32, -} - -impl ColorDesc { - pub const fn srgb(r: f32, g: f32, b: f32) -> Self { - Self { r, g, b, a: 1.0 } - } - - pub fn to_color(self) -> Color { - Color::srgba(self.r, self.g, self.b, self.a) - } -} - -impl Default for ColorDesc { - fn default() -> Self { - Self::srgb(0.8, 0.8, 0.8) - } -} - -/// Reflectable authoring material. Hydration turns this into `StandardMaterial`. -#[derive(Component, Reflect, Debug, Clone, PartialEq, Serialize, Deserialize)] -#[reflect(Component, Default, Debug, Serialize, Deserialize)] -pub struct MaterialDesc { - #[serde(default)] - pub shader: ShaderRefDesc, - pub base_color: ColorDesc, - pub metallic: f32, - pub roughness: f32, - /// Emissive radiance tint. Values are multiplied by `emissive_intensity`. - #[serde(default = "default_emissive_color")] - pub emissive_color: ColorDesc, - /// Emissive luminance multiplier in nits. `0.0` means non-emissive. - #[serde(default)] - pub emissive_intensity: f32, - /// Optional base color (albedo) texture, path relative to `assets/`. - pub base_color_texture: Option, - /// Optional emissive texture, path relative to `assets/`. - #[serde(default)] - pub emissive_texture: Option, - /// Optional normal map texture, path relative to `assets/`. - pub normal_map_texture: Option, - /// Optional metallic/roughness texture, path relative to `assets/`. - pub metallic_roughness_texture: Option, - /// When set, references a [`crate::MaterialAsset`] RON under `assets/materials/`. - #[serde(default)] - pub material_asset_path: Option, - /// Shader-schema-driven scalar/vector/color values. - #[serde(default)] - pub parameters: Vec, - /// Shader-schema-driven texture references. - #[serde(default)] - pub textures: Vec, -} - -impl MaterialDesc { - pub fn new(base_color: ColorDesc, metallic: f32, roughness: f32) -> Self { - Self { - shader: ShaderRefDesc::default(), - base_color, - metallic, - roughness, - emissive_color: default_emissive_color(), - emissive_intensity: 0.0, - base_color_texture: None, - emissive_texture: None, - normal_map_texture: None, - metallic_roughness_texture: None, - material_asset_path: None, - parameters: Vec::new(), - textures: Vec::new(), - } - } -} - -fn default_emissive_color() -> ColorDesc { - ColorDesc::srgb(1.0, 1.0, 1.0) -} - -impl Default for MaterialDesc { - fn default() -> Self { - Self::new(ColorDesc::default(), 0.0, 0.65) - } -} - /// Reflectable reference to an imported 3D model scene (glTF/GLB or FBX). /// Hydration turns this into a `WorldAssetRoot` on the entity. #[derive(Component, Reflect, Default, Debug, Clone, Serialize, Deserialize)] @@ -1906,8 +1771,8 @@ impl Default for PhysicsBody { #[cfg(test)] mod tests { use super::{ - AudioListenerDesc, AudioRolloff, AudioSourceDesc, EditorAssetRef, ModelRef, - AUDIO_CLIP_SUB_ASSET_ID, + AudioListenerDesc, AudioRolloff, AudioSourceDesc, EditorAssetRef, ModelRef, Primitive, + AUDIO_CLIP_SUB_ASSET_ID, PRIMITIVE_SURFACE_SLOT_ID, }; use bevy::light::light_consts; @@ -1948,6 +1813,15 @@ mod tests { assert_eq!(model.scene_index, 2); } + #[test] + fn legacy_primitive_deserializes_with_stable_unassigned_surface_slot() { + let primitive: Primitive = ron::from_str("(shape:Box,size:(1.0,2.0,3.0))").unwrap(); + + assert_eq!(primitive.surface.id.0, PRIMITIVE_SURFACE_SLOT_ID); + assert_eq!(primitive.surface.name, "Surface"); + assert!(primitive.surface.material.is_none()); + } + #[test] fn audio_authoring_descriptors_round_trip() { let source = AudioSourceDesc { diff --git a/crates/shared/src/content.rs b/crates/shared/src/content.rs new file mode 100644 index 0000000..ecb7ef2 --- /dev/null +++ b/crates/shared/src/content.rs @@ -0,0 +1,693 @@ +//! Stable project-content registry and import contracts shared by editor, runtime, and tools. + +use bevy::prelude::Resource; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::{AssetSourceFingerprint, ComponentInstanceId, EditorAssetRef, MaterialRef}; + +pub const ASSET_REGISTRY_SCHEMA_VERSION: u32 = 3; +pub const RUNTIME_CONTENT_CATALOG_VERSION: u32 = 2; + +/// Stable identity for one top-level project asset. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub struct AssetId(pub Uuid); + +impl AssetId { + pub fn new() -> Self { + Self(Uuid::new_v4()) + } + + pub fn as_string(&self) -> String { + self.0.to_string() + } +} + +impl Default for AssetId { + fn default() -> Self { + Self::new() + } +} + +/// Folder-independent authored/imported asset classification. +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum AssetKind { + Model, + Texture, + Material, + MaterialInstance, + AudioClip, + Level, + Prefab, + PostProcessEffect, + RenderingProfile, + ShaderSchema, + #[default] + Unknown, +} + +impl AssetKind { + pub fn from_legacy_tag(tag: &str) -> Self { + match tag { + "Model" => Self::Model, + "Texture" => Self::Texture, + "Material" => Self::Material, + "MaterialInstance" => Self::MaterialInstance, + "AudioClip" => Self::AudioClip, + "Level" => Self::Level, + "Prefab" => Self::Prefab, + "PostProcessEffect" => Self::PostProcessEffect, + "RenderingProfile" => Self::RenderingProfile, + "ShaderSchema" => Self::ShaderSchema, + _ => Self::Unknown, + } + } + + pub const fn is_imported_source(self) -> bool { + matches!(self, Self::Model | Self::Texture | Self::AudioClip) + } +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] +pub enum ModelPlacementMode { + #[default] + StaticAsset, + SceneInstance, +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] +pub enum ModelHierarchyMode { + #[default] + SingleActor, + SourceHierarchy, +} + +/// Legacy whole-model policy retained only for registry-v1 migration. +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] +pub enum MaterialImportPolicy { + #[default] + SourceMaterials, + AuthoringOverride, +} + +/// Persisted model-asset default for one stable imported material slot. +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] +pub enum ModelMaterialSelection { + #[default] + Source, + Project(MaterialRef), + Default, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] +pub struct ModelMaterialSlotSelection { + pub slot_id: ComponentInstanceId, + #[serde(default)] + pub selection: ModelMaterialSelection, +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] +pub struct OrphanedModelMaterialSelection { + pub slot_id: ComponentInstanceId, + #[serde(default)] + pub last_known_name: String, + pub material: MaterialRef, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct ModelImportSettings { + pub scale: f32, + pub generate_collider: bool, + pub lod0_only: bool, + #[serde(default)] + pub placement_mode: ModelPlacementMode, + #[serde(default)] + pub hierarchy_mode: ModelHierarchyMode, + /// Registry-v1 compatibility input. Registry-v2 writers keep this at its default and use + /// `material_slots` instead. + #[serde(default, skip_serializing_if = "material_import_policy_is_default")] + pub material_policy: MaterialImportPolicy, + #[serde(default)] + pub material_slots: Vec, + #[serde(default)] + pub orphaned_material_slots: Vec, + #[serde(default)] + pub static_mesh_manifest_path: Option, + #[serde(default)] + pub animation_manifest_path: Option, + #[serde(default)] + pub default_animation_clip_id: Option, +} + +fn material_import_policy_is_default(policy: &MaterialImportPolicy) -> bool { + *policy == MaterialImportPolicy::SourceMaterials +} + +impl Default for ModelImportSettings { + fn default() -> Self { + Self { + scale: 1.0, + generate_collider: true, + lod0_only: true, + placement_mode: ModelPlacementMode::default(), + hierarchy_mode: ModelHierarchyMode::default(), + material_policy: MaterialImportPolicy::default(), + material_slots: Vec::new(), + orphaned_material_slots: Vec::new(), + static_mesh_manifest_path: None, + animation_manifest_path: None, + default_animation_clip_id: None, + } + } +} + +/// Source role used to infer safe color-space and compression defaults. +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum TextureAssetSemantic { + #[default] + Auto, + Color, + Normal, + MaskData, + Ui, + Hdr, +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum TextureColorSpace { + #[default] + Auto, + Srgb, + Linear, +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum TextureMipmapMode { + #[default] + Generate, + PreserveSource, + None, +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum TextureCompression { + #[default] + Auto, + Uastc, + Uncompressed, +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum TextureFilter { + Nearest, + #[default] + Linear, +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum TextureWrap { + #[default] + Repeat, + Clamp, + Mirror, +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub enum NormalMapConvention { + #[default] + OpenGl, + DirectX, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] +pub struct TextureImportSettings { + #[serde(default)] + pub semantic: TextureAssetSemantic, + #[serde(default)] + pub color_space: TextureColorSpace, + #[serde(default)] + pub mipmaps: TextureMipmapMode, + #[serde(default)] + pub compression: TextureCompression, + #[serde(default)] + pub max_dimension: Option, + #[serde(default)] + pub filter: TextureFilter, + #[serde(default)] + pub wrap: TextureWrap, + #[serde(default = "default_texture_anisotropy")] + pub anisotropy: u16, + #[serde(default)] + pub normal_map_convention: NormalMapConvention, +} + +const fn default_texture_anisotropy() -> u16 { + 8 +} + +impl Default for TextureImportSettings { + fn default() -> Self { + Self { + semantic: TextureAssetSemantic::Auto, + color_space: TextureColorSpace::Auto, + mipmaps: TextureMipmapMode::Generate, + compression: TextureCompression::Auto, + max_dimension: None, + filter: TextureFilter::Linear, + wrap: TextureWrap::Repeat, + anisotropy: default_texture_anisotropy(), + normal_map_convention: NormalMapConvention::OpenGl, + } + } +} + +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)] +pub enum AssetImportSettings { + #[default] + None, + Model(ModelImportSettings), + Texture(TextureImportSettings), +} + +impl AssetImportSettings { + pub fn for_kind(kind: AssetKind) -> Self { + match kind { + AssetKind::Model => Self::Model(ModelImportSettings::default()), + AssetKind::Texture => Self::Texture(TextureImportSettings::default()), + _ => Self::None, + } + } + + pub fn model(&self) -> Option<&ModelImportSettings> { + match self { + Self::Model(settings) => Some(settings), + _ => None, + } + } + + pub fn model_mut(&mut self) -> Option<&mut ModelImportSettings> { + match self { + Self::Model(settings) => Some(settings), + _ => None, + } + } + + pub fn texture(&self) -> Option<&TextureImportSettings> { + match self { + Self::Texture(settings) => Some(settings), + _ => None, + } + } + + pub fn texture_mut(&mut self) -> Option<&mut TextureImportSettings> { + match self { + Self::Texture(settings) => Some(settings), + _ => None, + } + } +} + +impl From for AssetImportSettings { + fn from(settings: ModelImportSettings) -> Self { + Self::Model(settings) + } +} + +impl From for AssetImportSettings { + fn from(settings: TextureImportSettings) -> Self { + Self::Texture(settings) + } +} + +/// One-cycle source alias used by model processing APIs while call sites adopt the typed enum. +pub type ImportSettings = ModelImportSettings; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct AssetRecord { + pub id: AssetId, + pub path: String, + pub label: String, + pub kind: AssetKind, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub source_fingerprint: Option, + #[serde(default)] + pub import_settings: AssetImportSettings, + #[serde(default)] + pub dependencies: Vec, +} + +impl AssetRecord { + pub fn model_import(&self) -> &ModelImportSettings { + self.import_settings + .model() + .expect("model asset record must carry model import settings") + } + + pub fn model_import_mut(&mut self) -> &mut ModelImportSettings { + self.import_settings + .model_mut() + .expect("model asset record must carry model import settings") + } + + pub fn texture_import(&self) -> Option<&TextureImportSettings> { + self.import_settings.texture() + } + + pub fn texture_import_mut(&mut self) -> Option<&mut TextureImportSettings> { + self.import_settings.texture_mut() + } +} + +#[derive(Resource, Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] +pub struct ProjectContentDefaults { + #[serde(default)] + pub default_material: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct AssetRegistryDocument { + #[serde(default = "asset_registry_schema_version")] + pub schema_version: u32, + #[serde(default)] + pub defaults: ProjectContentDefaults, + #[serde(default)] + pub records: Vec, +} + +impl Default for AssetRegistryDocument { + fn default() -> Self { + Self { + schema_version: ASSET_REGISTRY_SCHEMA_VERSION, + defaults: ProjectContentDefaults::default(), + records: Vec::new(), + } + } +} + +const fn asset_registry_schema_version() -> u32 { + ASSET_REGISTRY_SCHEMA_VERSION +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +struct LegacyAssetRecord { + id: AssetId, + path: String, + label: String, + kind_tag: String, + #[serde(default)] + source_fingerprint: Option, + #[serde(default)] + import_settings: ModelImportSettings, + #[serde(default)] + dependencies: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +struct AssetRegistryDocumentV2 { + schema_version: u32, + #[serde(default)] + defaults: ProjectContentDefaults, + #[serde(default)] + records: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +struct AssetRecordV2 { + id: AssetId, + path: String, + label: String, + kind: AssetKind, + #[serde(default)] + source_fingerprint: Option, + #[serde(default)] + import_settings: ModelImportSettings, + #[serde(default)] + dependencies: Vec, +} + +pub struct LoadedAssetRegistry { + pub document: AssetRegistryDocument, + pub migration_required: bool, +} + +pub fn parse_asset_registry(source: &str) -> Result { + if let Ok(document) = ron::from_str::(source) { + if document.schema_version != ASSET_REGISTRY_SCHEMA_VERSION { + return Err(format!( + "unsupported asset registry schema {}; expected {}", + document.schema_version, ASSET_REGISTRY_SCHEMA_VERSION + )); + } + return Ok(LoadedAssetRegistry { + document, + migration_required: false, + }); + } + + if let Ok(document) = ron::from_str::(source) { + if document.schema_version != 2 { + return Err(format!( + "unsupported asset registry schema {}; expected {}", + document.schema_version, ASSET_REGISTRY_SCHEMA_VERSION + )); + } + return Ok(LoadedAssetRegistry { + document: AssetRegistryDocument { + schema_version: ASSET_REGISTRY_SCHEMA_VERSION, + defaults: document.defaults, + records: document + .records + .into_iter() + .map(|record| { + let import_settings = match record.kind { + AssetKind::Model => AssetImportSettings::Model(record.import_settings), + AssetKind::Texture => { + AssetImportSettings::Texture(TextureImportSettings::default()) + } + _ => AssetImportSettings::None, + }; + AssetRecord { + id: record.id, + path: record.path, + label: record.label, + kind: record.kind, + source_fingerprint: record.source_fingerprint, + import_settings, + dependencies: record.dependencies, + } + }) + .collect(), + }, + migration_required: true, + }); + } + + match ron::from_str::>(source) { + Ok(records) => Ok(LoadedAssetRegistry { + document: AssetRegistryDocument { + records: records + .into_iter() + .map(|record| { + let kind = AssetKind::from_legacy_tag(&record.kind_tag); + let import_settings = match kind { + AssetKind::Model => AssetImportSettings::Model(record.import_settings), + AssetKind::Texture => { + AssetImportSettings::Texture(TextureImportSettings::default()) + } + _ => AssetImportSettings::None, + }; + AssetRecord { + id: record.id, + path: record.path, + label: record.label, + kind, + source_fingerprint: record.source_fingerprint, + import_settings, + dependencies: record.dependencies, + } + }) + .collect(), + ..Default::default() + }, + migration_required: true, + }), + Err(error) => Err(format!("invalid asset registry RON: {error}")), + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct TextureRuntimeData { + pub source_path: String, + #[serde(default)] + pub processed_path: Option, + #[serde(default)] + pub processing_key: Option, + pub settings: TextureImportSettings, + pub is_srgb: bool, +} + +/// Runtime-only description of one project texture load. This keeps Bevy-specific loading out of +/// the content catalog while ensuring every renderer consumes the same authored sampling state. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct RuntimeTextureLoadSpec { + pub path: String, + pub is_srgb: bool, + pub filter: TextureFilter, + pub wrap: TextureWrap, + pub anisotropy: u16, +} + +impl TextureRuntimeData { + pub fn load_spec(&self) -> RuntimeTextureLoadSpec { + RuntimeTextureLoadSpec { + path: self + .processed_path + .clone() + .unwrap_or_else(|| self.source_path.clone()), + is_srgb: self.is_srgb, + filter: self.settings.filter, + wrap: self.settings.wrap, + anisotropy: self.settings.anisotropy, + } + } +} + +impl RuntimeContentCatalog { + pub fn texture_load_spec(&self, reference: &EditorAssetRef) -> Option { + self.records + .iter() + .find(|record| record.id.as_string() == reference.asset_id) + .and_then(|record| record.texture.as_ref()) + .map(TextureRuntimeData::load_spec) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct MaterialRuntimeData { + #[serde(default)] + pub packed_arm_path: Option, + #[serde(default)] + pub processing_key: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct RuntimeContentRecord { + pub id: AssetId, + pub path: String, + pub label: String, + pub kind: AssetKind, + #[serde(default)] + pub material_slots: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub texture: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub material: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct RuntimeContentCatalog { + pub version: u32, + #[serde(default)] + pub defaults: ProjectContentDefaults, + #[serde(default)] + pub records: Vec, +} + +impl From<&AssetRegistryDocument> for RuntimeContentCatalog { + fn from(document: &AssetRegistryDocument) -> Self { + Self { + version: RUNTIME_CONTENT_CATALOG_VERSION, + defaults: document.defaults.clone(), + records: document + .records + .iter() + .map(|record| RuntimeContentRecord { + id: record.id.clone(), + path: record.path.clone(), + label: record.label.clone(), + kind: record.kind, + material_slots: record + .import_settings + .model() + .map(|settings| settings.material_slots.clone()) + .unwrap_or_default(), + texture: record + .import_settings + .texture() + .map(|settings| TextureRuntimeData { + source_path: record.path.clone(), + processed_path: None, + processing_key: None, + settings: settings.clone(), + is_srgb: resolves_srgb(settings), + }), + material: None, + }) + .collect(), + } + } +} + +pub fn resolves_srgb(settings: &TextureImportSettings) -> bool { + match settings.color_space { + TextureColorSpace::Srgb => true, + TextureColorSpace::Linear => false, + TextureColorSpace::Auto => matches!( + settings.semantic, + TextureAssetSemantic::Auto | TextureAssetSemantic::Color | TextureAssetSemantic::Ui + ), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn legacy_record_lists_require_explicit_migration() { + let source = r#"[(id:("00000000-0000-0000-0000-000000000001"),path:"assets/Props/a.glb",label:"a",kind_tag:"Model")]"#; + let loaded = parse_asset_registry(source).unwrap(); + assert!(loaded.migration_required); + assert_eq!(loaded.document.records[0].kind, AssetKind::Model); + } + + #[test] + fn runtime_catalog_strips_editor_import_state() { + let record = AssetRecord { + id: AssetId::new(), + path: "assets/Props/a.glb".into(), + label: "a".into(), + kind: AssetKind::Model, + source_fingerprint: None, + import_settings: AssetImportSettings::Model(ImportSettings::default()), + dependencies: vec!["assets/Props/a.bin".into()], + }; + let document = AssetRegistryDocument { + records: vec![record], + ..Default::default() + }; + let runtime = RuntimeContentCatalog::from(&document); + assert_eq!(runtime.records.len(), 1); + assert_eq!(runtime.records[0].kind, AssetKind::Model); + } + + #[test] + fn registry_v2_writers_omit_the_legacy_whole_model_material_policy() { + let document = AssetRegistryDocument { + records: vec![AssetRecord { + id: AssetId::new(), + path: "assets/model.glb".into(), + label: "Model".into(), + kind: AssetKind::Model, + source_fingerprint: None, + import_settings: AssetImportSettings::Model(ImportSettings::default()), + dependencies: Vec::new(), + }], + ..Default::default() + }; + + let serialized = ron::ser::to_string(&document).unwrap(); + + assert!(!serialized.contains("material_policy")); + } +} diff --git a/crates/shared/src/hydration/brushes.rs b/crates/shared/src/hydration/brushes.rs index 2edb67b..4d6a067 100644 --- a/crates/shared/src/hydration/brushes.rs +++ b/crates/shared/src/hydration/brushes.rs @@ -15,6 +15,7 @@ use crate::{ }; use super::materials::material_from_desc; +use super::{default_grid_emergency_handle, DefaultGridEmergencyMaterial}; /// Runtime marker for generated brush render/collider children. #[derive(Component, Reflect, Default, Debug, Clone, Copy)] @@ -22,11 +23,16 @@ use super::materials::material_from_desc; pub struct HydratedBrushMesh; #[allow(clippy::type_complexity)] +#[expect( + clippy::too_many_arguments, + reason = "Bevy system parameters keep independently change-tracked brush inputs explicit" +)] pub fn hydrate_brushes( mut commands: Commands, asset_server: Res, mut meshes: ResMut>, mut materials: ResMut>, + mut fallback: ResMut, brushes: Query< ( Entity, @@ -61,6 +67,7 @@ pub fn hydrate_brushes( &asset_server, &mut meshes, &mut materials, + &mut fallback, entity, brush, material.filter(|_| { @@ -82,6 +89,7 @@ pub fn spawn_brush_mesh( asset_server: &AssetServer, meshes: &mut Assets, materials: &mut Assets, + fallback: &mut DefaultGridEmergencyMaterial, parent: Entity, brush: &BrushDesc, material: Option<&MaterialDesc>, @@ -103,22 +111,35 @@ pub fn spawn_brush_mesh( continue; }; let mesh = meshes.add(mesh); - let material = materials.add(brush_group_material( - asset_server, - material, - group.material_path.as_deref(), - group.texture_path.as_deref(), - )); + let uses_default_grid = + material.is_none() && group.material_path.is_none() && group.texture_path.is_none(); + let material_handle = if uses_default_grid { + default_grid_emergency_handle(materials, fallback) + } else { + materials.add(brush_group_material( + asset_server, + material, + group.material_path.as_deref(), + group.texture_path.as_deref(), + )) + }; let mut brush_child = commands.spawn(( HydratedBrushMesh, Name::new("Hydrated Brush Mesh"), Mesh3d(mesh), - MeshMaterial3d(material), + MeshMaterial3d(material_handle), Transform::default(), Visibility::Visible, ChildOf(parent), )); + if uses_default_grid { + brush_child.insert(crate::HydratedMaterialSlotBinding { + owner: parent, + slot_id: crate::ComponentInstanceId::new("brush:default"), + selection: crate::HydratedMaterialSelection::Inherit, + }); + } if !brush.cast_shadows { brush_child.insert(NotShadowCaster); } diff --git a/crates/shared/src/hydration/materials.rs b/crates/shared/src/hydration/materials.rs index d76626e..7880c8e 100644 --- a/crates/shared/src/hydration/materials.rs +++ b/crates/shared/src/hydration/materials.rs @@ -1,50 +1,29 @@ //! Standard materials from [`MaterialDesc`] authoring data. -use bevy::prelude::*; - -use crate::{ - asset_server_path, authoring_component_active, AuthoringComponentStates, InspectorOrder, - LevelObject, MaterialDesc, MaterialShaderKind, Primitive, COMPONENT_MATERIAL_DESC, +use bevy::{ + image::{ + ImageAddressMode, ImageFilterMode, ImageLoaderSettings, ImageSampler, + ImageSamplerDescriptor, + }, + prelude::*, }; -#[allow(clippy::type_complexity)] -pub fn hydrate_materials( - mut commands: Commands, - asset_server: Res, - mut materials: ResMut>, - targets: Query< - ( - Entity, - &MaterialDesc, - Option<&AuthoringComponentStates>, - Option<&InspectorOrder>, - ), - ( - With, - With, - Or<( - Changed, - Added, - Changed, - Changed, - Changed, - )>, - ), - >, -) { - for (entity, desc, states, legacy_order) in &targets { - if !authoring_component_active(states, legacy_order, COMPONENT_MATERIAL_DESC) { - commands - .entity(entity) - .remove::>(); - continue; - } - let material = materials.add(material_from_desc(&asset_server, desc)); - commands.entity(entity).insert(MeshMaterial3d(material)); - } -} +use crate::{ + asset_server_path, MaterialDesc, MaterialShaderKind, RuntimeTextureLoadSpec, TextureFilter, + TextureWrap, +}; pub fn material_from_desc(asset_server: &AssetServer, desc: &MaterialDesc) -> StandardMaterial { + material_from_desc_with_texture_loader(asset_server, desc, |path| { + asset_server.load(asset_server_path(path)) + }) +} + +pub fn material_from_desc_with_texture_loader( + _asset_server: &AssetServer, + desc: &MaterialDesc, + mut load_texture: impl FnMut(&str) -> Handle, +) -> StandardMaterial { StandardMaterial { base_color: desc.base_color.to_color(), metallic: desc.metallic, @@ -53,7 +32,7 @@ pub fn material_from_desc(asset_server: &AssetServer, desc: &MaterialDesc) -> St base_color_texture: desc .base_color_texture .as_ref() - .map(|path| asset_server.load(asset_server_path(path))), + .map(|path| load_texture(path)), emissive: LinearRgba::rgb( desc.emissive_color.r * desc.emissive_intensity, desc.emissive_color.g * desc.emissive_intensity, @@ -62,19 +41,70 @@ pub fn material_from_desc(asset_server: &AssetServer, desc: &MaterialDesc) -> St emissive_texture: desc .emissive_texture .as_ref() - .map(|path| asset_server.load(asset_server_path(path))), + .map(|path| load_texture(path)), normal_map_texture: desc .normal_map_texture .as_ref() - .map(|path| asset_server.load(asset_server_path(path))), + .map(|path| load_texture(path)), metallic_roughness_texture: desc .metallic_roughness_texture .as_ref() - .map(|path| asset_server.load(asset_server_path(path))), + .map(|path| load_texture(path)), + occlusion_texture: desc + .occlusion_texture + .as_ref() + .map(|path| load_texture(path)), + uv_transform: bevy::math::Affine2::from_scale_angle_translation( + desc.uv_tiling, + 0.0, + desc.uv_offset, + ), ..default() } } +pub fn load_runtime_texture( + asset_server: &AssetServer, + spec: &RuntimeTextureLoadSpec, +) -> Handle { + let sampler = ImageSampler::Descriptor(runtime_image_sampler_descriptor(spec)); + let is_srgb = spec.is_srgb; + asset_server + .load_builder() + .with_settings(move |settings: &mut ImageLoaderSettings| { + settings.is_srgb = is_srgb; + settings.sampler = sampler.clone(); + }) + .load(asset_server_path(&spec.path)) +} + +pub fn runtime_image_sampler_descriptor(spec: &RuntimeTextureLoadSpec) -> ImageSamplerDescriptor { + let address_mode = match spec.wrap { + TextureWrap::Repeat => ImageAddressMode::Repeat, + TextureWrap::Clamp => ImageAddressMode::ClampToEdge, + TextureWrap::Mirror => ImageAddressMode::MirrorRepeat, + }; + let filter = match spec.filter { + TextureFilter::Nearest => ImageFilterMode::Nearest, + TextureFilter::Linear => ImageFilterMode::Linear, + }; + let anisotropy = if filter == ImageFilterMode::Linear { + spec.anisotropy.clamp(1, 16) + } else { + 1 + }; + ImageSamplerDescriptor { + address_mode_u: address_mode, + address_mode_v: address_mode, + address_mode_w: address_mode, + mag_filter: filter, + min_filter: filter, + mipmap_filter: filter, + anisotropy_clamp: anisotropy, + ..Default::default() + } +} + #[cfg(test)] mod tests { use super::*; @@ -97,4 +127,46 @@ mod tests { assert_eq!(material.emissive.green, 250.0); assert_eq!(material.emissive.blue, 1000.0); } + + #[test] + fn shared_uv_transform_maps_to_standard_material() { + let mut app = App::new(); + app.add_plugins((MinimalPlugins, AssetPlugin::default())); + let asset_server = app.world().resource::(); + let desc = MaterialDesc { + uv_offset: Vec2::new(0.25, -0.5), + uv_tiling: Vec2::new(4.0, 2.0), + ..Default::default() + }; + + let material = material_from_desc(asset_server, &desc); + + assert_eq!(material.uv_transform.translation, desc.uv_offset); + assert_eq!(material.uv_transform.matrix2.x_axis.x, desc.uv_tiling.x); + assert_eq!(material.uv_transform.matrix2.y_axis.y, desc.uv_tiling.y); + } + + #[test] + fn runtime_sampler_maps_authored_wrap_filter_and_anisotropy() { + let spec = RuntimeTextureLoadSpec { + path: "texture.basis".into(), + is_srgb: false, + filter: TextureFilter::Linear, + wrap: TextureWrap::Repeat, + anisotropy: 64, + }; + let sampler = runtime_image_sampler_descriptor(&spec); + assert_eq!(sampler.address_mode_u, ImageAddressMode::Repeat); + assert_eq!(sampler.address_mode_v, ImageAddressMode::Repeat); + assert_eq!(sampler.address_mode_w, ImageAddressMode::Repeat); + assert_eq!(sampler.min_filter, ImageFilterMode::Linear); + assert_eq!(sampler.anisotropy_clamp, 16); + + let mut nearest = spec; + nearest.filter = TextureFilter::Nearest; + nearest.wrap = TextureWrap::Mirror; + let sampler = runtime_image_sampler_descriptor(&nearest); + assert_eq!(sampler.address_mode_u, ImageAddressMode::MirrorRepeat); + assert_eq!(sampler.anisotropy_clamp, 1); + } } diff --git a/crates/shared/src/hydration/mod.rs b/crates/shared/src/hydration/mod.rs index c42fe5a..eeb9190 100644 --- a/crates/shared/src/hydration/mod.rs +++ b/crates/shared/src/hydration/mod.rs @@ -21,8 +21,10 @@ use bevy::prelude::*; use brushes::{hydrate_brushes, spawn_brush_mesh, HydratedBrushMesh}; use lights::{hydrate_lights, reconcile_missing_runtime_lights}; -use materials::hydrate_materials; -pub use materials::material_from_desc; +pub use materials::{ + load_runtime_texture, material_from_desc, material_from_desc_with_texture_loader, + runtime_image_sampler_descriptor, +}; use models::hydrate_models; pub use models::HydratedModelRoot; use physics::hydrate_physics; @@ -34,9 +36,9 @@ use skinned_meshes::{ apply_skinned_renderer_material_changes, cleanup_removed_skinned_mesh_renderers, hydrate_skinned_mesh_renderers, mark_skinned_materials_ready, }; +pub use static_meshes::StaticMeshArtifactCache; use static_meshes::{ hydrate_static_mesh_renderers, spawn_static_mesh_parts, HydratedStaticMeshPart, - StaticMeshArtifactCache, }; pub use terrain::HydratedTerrainChunk; use terrain::{cleanup_removed_terrain, hydrate_terrain}; @@ -48,11 +50,32 @@ use visibility::{ use crate::{ authoring_component_active, AuthoringComponentStates, BrushDesc, ColliderDesc, InspectorOrder, - LevelObject, MaterialDesc, MaterialOverride, Primitive, StaticMeshRenderer, - COMPONENT_BRUSH_DESC, COMPONENT_COLLIDER_DESC, COMPONENT_LIGHT_DESC, COMPONENT_MATERIAL_DESC, - COMPONENT_PRIMITIVE, COMPONENT_STATIC_MESH_RENDERER, + LevelObject, MaterialDesc, Primitive, StaticMeshRenderer, COMPONENT_BRUSH_DESC, + COMPONENT_COLLIDER_DESC, COMPONENT_LIGHT_DESC, COMPONENT_MATERIAL_DESC, COMPONENT_PRIMITIVE, + COMPONENT_STATIC_MESH_RENDERER, }; +/// One neutral emergency handle used until the Surface plugin replaces it with embedded DefaultGrid. +#[derive(Resource, Default, Debug, Clone)] +pub struct DefaultGridEmergencyMaterial(pub Option>); + +pub(crate) fn default_grid_emergency_handle( + materials: &mut Assets, + fallback: &mut DefaultGridEmergencyMaterial, +) -> Handle { + fallback + .0 + .get_or_insert_with(|| { + materials.add(StandardMaterial { + base_color: Color::srgb(0.46, 0.46, 0.46), + perceptual_roughness: 0.86, + cull_mode: None, + ..default() + }) + }) + .clone() +} + /// Registers hydration systems in deterministic order. pub struct HydrationPlugin; @@ -65,6 +88,7 @@ enum HydrationSet { impl Plugin for HydrationPlugin { fn build(&self, app: &mut App) { app.init_resource::() + .init_resource::() .add_observer(tag_hydrated_prefab_members) .add_observer(mark_skinned_materials_ready) .add_observer(crate::prefab_overrides::apply_prefab_overrides_on_ready) @@ -78,7 +102,6 @@ impl Plugin for HydrationPlugin { hydrate_primitives, hydrate_brushes, hydrate_terrain, - hydrate_materials, hydrate_lights, reconcile_missing_runtime_lights, hydrate_static_mesh_renderers, @@ -115,6 +138,9 @@ pub fn flush_level_object_hydration(world: &mut World) { if !world.contains_resource::() { world.insert_resource(StaticMeshArtifactCache::default()); } + if !world.contains_resource::() { + world.insert_resource(DefaultGridEmergencyMaterial::default()); + } initialize_level_object_visibility_hierarchy(world); @@ -132,20 +158,6 @@ pub fn flush_level_object_hydration(world: &mut World) { .map(|(entity, primitive, _, _)| (entity, primitive.clone())) .collect(); - let material_targets: Vec<(Entity, MaterialDesc)> = world - .query_filtered::<( - Entity, - &MaterialDesc, - Option<&AuthoringComponentStates>, - Option<&InspectorOrder>, - ), With>() - .iter(world) - .filter(|(_, _, states, order)| { - authoring_component_active(*states, *order, COMPONENT_MATERIAL_DESC) - }) - .map(|(entity, desc, _, _)| (entity, desc.clone())) - .collect(); - let brush_entities_for_cleanup: Vec = world .query_filtered::<(Entity, &BrushDesc), With>() .iter(world) @@ -190,45 +202,27 @@ pub fn flush_level_object_hydration(world: &mut World) { .map(|(entity, _)| entity) .collect(); - let static_mesh_renderers: Vec<( - Entity, - StaticMeshRenderer, - Option, - Option, - Option, - )> = world + let static_mesh_renderers: Vec<(Entity, StaticMeshRenderer, Option)> = world .query_filtered::<( Entity, &StaticMeshRenderer, - Option<&MaterialDesc>, - Option<&MaterialOverride>, Option<&ColliderDesc>, Option<&AuthoringComponentStates>, Option<&InspectorOrder>, ), With>() .iter(world) - .filter(|(_, _, _, _, _, states, order)| { + .filter(|(_, _, _, states, order)| { authoring_component_active(*states, *order, COMPONENT_STATIC_MESH_RENDERER) }) - .map( - |(entity, renderer, material, material_override, collider, states, order)| { - ( - entity, - renderer.clone(), - material - .filter(|_| { - authoring_component_active(states, order, COMPONENT_MATERIAL_DESC) - }) - .cloned(), - material_override.cloned(), - collider - .filter(|_| { - authoring_component_active(states, order, COMPONENT_COLLIDER_DESC) - }) - .cloned(), - ) - }, - ) + .map(|(entity, renderer, collider, states, order)| { + ( + entity, + renderer.clone(), + collider + .filter(|_| authoring_component_active(states, order, COMPONENT_COLLIDER_DESC)) + .cloned(), + ) + }) .collect(); let mut generated_static_mesh_parts = Vec::new(); @@ -285,21 +279,33 @@ pub fn flush_level_object_hydration(world: &mut World) { ResMut>, ResMut>, ResMut, + ResMut, )> = SystemState::new(world); { - let (mut commands, asset_server, mut meshes, mut materials, mut artifact_cache) = state + let ( + mut commands, + asset_server, + mut meshes, + mut materials, + mut artifact_cache, + mut fallback, + ) = state .get_mut(world) .expect("hydrate_level_objects system params should be valid"); for (entity, primitive) in primitives { let mesh = meshes.add(primitive_mesh(&primitive)); - commands.entity(entity).insert(Mesh3d(mesh)); - } - - for (entity, desc) in material_targets { - let material = materials.add(material_from_desc(&asset_server, &desc)); - commands.entity(entity).insert(MeshMaterial3d(material)); + let material = default_grid_emergency_handle(&mut materials, &mut fallback); + commands.entity(entity).insert(( + Mesh3d(mesh), + MeshMaterial3d(material), + crate::HydratedMaterialSlotBinding { + owner: entity, + slot_id: primitive.surface.id.clone(), + selection: primitive.surface.hydrated_selection(), + }, + )); } for child in generated_brush_meshes { @@ -312,6 +318,7 @@ pub fn flush_level_object_hydration(world: &mut World) { &asset_server, &mut meshes, &mut materials, + &mut fallback, *entity, brush, material.as_ref(), @@ -323,16 +330,15 @@ pub fn flush_level_object_hydration(world: &mut World) { commands.entity(child).despawn(); } - for (entity, renderer, material, material_override, collider) in &static_mesh_renderers { + for (entity, renderer, collider) in &static_mesh_renderers { spawn_static_mesh_parts( &mut commands, &asset_server, &mut materials, &mut artifact_cache, + &mut fallback, *entity, renderer, - material.as_ref(), - material_override.as_ref(), collider.as_ref(), ); } @@ -510,7 +516,7 @@ mod tests { } #[test] - fn flush_hydration_spawns_mesh_material_from_primitive_and_desc() { + fn primitive_legacy_descriptors_do_not_create_actor_local_materials() { let mut app = App::new(); app.add_plugins(MinimalPlugins); app.add_plugins(AssetPlugin::default()); @@ -518,7 +524,7 @@ mod tests { app.init_asset::(); let material = MaterialDesc::new(ColorDesc::srgb(0.85, 0.85, 0.88), 0.0, 0.3); - let entity = app + let first = app .world_mut() .spawn(( LevelObject, @@ -526,13 +532,31 @@ mod tests { material, )) .id(); + let second = app + .world_mut() + .spawn(( + LevelObject, + Primitive::sphere(1.0), + MaterialDesc::new(ColorDesc::srgb(0.1, 0.8, 0.2), 1.0, 0.05), + )) + .id(); flush_level_object_hydration(app.world_mut()); - assert!(app.world().get::(entity).is_some()); + let first_handle = app + .world() + .get::>(first) + .unwrap(); + let second_handle = app + .world() + .get::>(second) + .unwrap(); + assert_eq!(first_handle.0, second_handle.0); assert!(app .world() - .get::>(entity) - .is_some()); + .get::(first) + .is_some_and(|binding| { + matches!(binding.selection, crate::HydratedMaterialSelection::Inherit) + })); } } diff --git a/crates/shared/src/hydration/primitives.rs b/crates/shared/src/hydration/primitives.rs index 982a23c..1175192 100644 --- a/crates/shared/src/hydration/primitives.rs +++ b/crates/shared/src/hydration/primitives.rs @@ -2,6 +2,7 @@ use bevy::prelude::*; +use super::{default_grid_emergency_handle, DefaultGridEmergencyMaterial}; use crate::{ authoring_component_active, AuthoringComponentStates, InspectorOrder, LevelObject, Primitive, PrimitiveShape, COMPONENT_PRIMITIVE, @@ -49,6 +50,8 @@ pub fn hydrate_primitives( ), >, mut meshes: ResMut>, + mut materials: ResMut>, + mut fallback: ResMut, ) { for (entity, primitive, states, legacy_order) in &primitives { if !authoring_component_active(states, legacy_order, COMPONENT_PRIMITIVE) { @@ -59,8 +62,17 @@ pub fn hydrate_primitives( continue; } let mesh = meshes.add(primitive_mesh(primitive)); + let material = default_grid_emergency_handle(&mut materials, &mut fallback); - commands.entity(entity).insert(Mesh3d(mesh)); + commands.entity(entity).insert(( + Mesh3d(mesh), + MeshMaterial3d(material), + crate::HydratedMaterialSlotBinding { + owner: entity, + slot_id: primitive.surface.id.clone(), + selection: primitive.surface.hydrated_selection(), + }, + )); } } diff --git a/crates/shared/src/hydration/skinned_meshes.rs b/crates/shared/src/hydration/skinned_meshes.rs index 749dd7f..46aa8a8 100644 --- a/crates/shared/src/hydration/skinned_meshes.rs +++ b/crates/shared/src/hydration/skinned_meshes.rs @@ -10,13 +10,14 @@ use serde::Deserialize; use crate::{ asset_server_path, authoring_component_active, AuthoringComponentStates, - HydratedRendererMaterialBinding, InspectorOrder, LevelObject, SkinnedMeshRenderer, + HydratedMaterialSlotBinding, InspectorOrder, LevelObject, SkinnedMeshRenderer, ANIMATION_ARTIFACT_DIR, COMPONENT_SKINNED_MESH_RENDERER, }; use super::static_meshes::{ renderer_error_material, resolve_renderer_material_handle, StaticMeshArtifactCache, }; +use super::DefaultGridEmergencyMaterial; /// Runtime hierarchy root generated for one authored [`SkinnedMeshRenderer`]. /// @@ -176,6 +177,7 @@ pub(super) fn apply_skinned_renderer_material_changes( asset_server: Res, mut materials: ResMut>, mut artifact_cache: ResMut, + mut fallback: ResMut, dirty_roots: Query<(Entity, &HydratedSkinnedMeshRoot), With>, renderers: Query<&SkinnedMeshRenderer>, children: Query<&Children>, @@ -238,30 +240,27 @@ pub(super) fn apply_skinned_renderer_material_changes( continue; }; used.insert(*entity); - let effective = slot.effective_material().cloned(); - let Some(reference) = effective.as_ref() else { - commands - .entity(*entity) - .insert(HydratedRendererMaterialBinding { - owner: root.owner, - slot_id: slot.id.clone(), - effective_material: None, - }); - continue; + let mut selection = slot.hydrated_selection(); + if matches!(selection, crate::HydratedMaterialSelection::Inherit) { + selection = + artifact_cache.resolve_model_material_selection(&renderer.asset_id, &slot.id); + } + let handle = match &selection { + crate::HydratedMaterialSelection::ImportedSource { reference } => { + resolve_renderer_material_handle(&asset_server, &mut artifact_cache, reference) + .unwrap_or_else(|| renderer_error_material(&mut materials, &mut fallback)) + } + crate::HydratedMaterialSelection::Project { .. } + | crate::HydratedMaterialSelection::Inherit => { + renderer_error_material(&mut materials, &mut fallback) + } }; - let handle = resolve_renderer_material_handle( - &asset_server, - &mut materials, - &mut artifact_cache, - reference, - ) - .unwrap_or_else(|| renderer_error_material(&mut materials)); commands.entity(*entity).insert(( MeshMaterial3d(handle), - HydratedRendererMaterialBinding { + HydratedMaterialSlotBinding { owner: root.owner, slot_id: slot.id.clone(), - effective_material: effective, + selection, }, )); } diff --git a/crates/shared/src/hydration/static_meshes.rs b/crates/shared/src/hydration/static_meshes.rs index 9b65166..2fef156 100644 --- a/crates/shared/src/hydration/static_meshes.rs +++ b/crates/shared/src/hydration/static_meshes.rs @@ -3,19 +3,19 @@ use avian3d::prelude::ColliderConstructor; use bevy::light::{NotShadowCaster, NotShadowReceiver}; use bevy::prelude::*; -use bevy::render::render_resource::Face; use serde::Deserialize; use std::collections::{HashMap, HashSet}; use crate::{ asset_server_path, authoring_component_active, standard_material_asset_path, AuthoringComponentStates, ColliderDesc, ColliderShapeDesc, EditorAssetRef, - HydratedRendererMaterialBinding, InspectorOrder, LevelObject, MaterialAlphaMode, MaterialDesc, - MaterialOverride, MaterialRef, StaticMeshRenderer, StaticMeshRendererEntry, - COMPONENT_COLLIDER_DESC, COMPONENT_MATERIAL_DESC, COMPONENT_STATIC_MESH_RENDERER, + HydratedMaterialLayer, HydratedMaterialSelection, HydratedMaterialSlotBinding, InspectorOrder, + LevelObject, MaterialRef, ModelMaterialSelection, ModelMaterialSlotSelection, + StaticMeshRenderer, StaticMeshRendererEntry, COMPONENT_COLLIDER_DESC, + COMPONENT_STATIC_MESH_RENDERER, }; -use super::materials::material_from_desc; +use super::{default_grid_emergency_handle, DefaultGridEmergencyMaterial}; pub const STATIC_MESH_ARTIFACT_DIR: &str = "assets/meshes/generated"; @@ -28,7 +28,6 @@ pub struct HydratedStaticMeshPart; struct ResolvedStaticMeshPart { source_path: String, mesh_label: String, - material_label: Option, } #[derive(Debug, Clone)] @@ -48,10 +47,10 @@ pub(crate) struct ResolvedRendererDraw { pub struct StaticMeshArtifactCache { parts: HashMap<(String, String), ResolvedStaticMeshPart>, materials: HashMap<(String, String), ResolvedStaticMeshMaterial>, + model_materials: HashMap<(String, String), HydratedMaterialSelection>, draw_bindings: HashMap<(String, String), ResolvedRendererDraw>, loaded_assets: HashSet, failed_assets: HashSet, - project_materials: HashMap>, } impl StaticMeshArtifactCache { @@ -70,6 +69,18 @@ impl StaticMeshArtifactCache { self.draw_bindings.get(&key).cloned() } + pub(crate) fn resolve_model_material_selection( + &mut self, + asset_id: &str, + slot_id: &crate::ComponentInstanceId, + ) -> HydratedMaterialSelection { + let key = (asset_id.to_string(), slot_id.0.clone()); + if !self.loaded_assets.contains(asset_id) && !self.failed_assets.contains(asset_id) { + self.load_artifact(asset_id); + } + self.model_materials.get(&key).cloned().unwrap_or_default() + } + fn resolve(&mut self, mesh: &EditorAssetRef) -> Option { if !mesh.is_resolved() { return None; @@ -122,7 +133,7 @@ impl StaticMeshArtifactCache { }; let slot_id = format!("slot:{part_id}"); self.draw_bindings.insert( - (asset_id.to_string(), slot_id), + (asset_id.to_string(), slot_id.clone()), ResolvedRendererDraw { mesh_label: part.mesh_label.clone(), source_node: part.source_node.clone(), @@ -141,6 +152,39 @@ impl StaticMeshArtifactCache { material_label, }); } + let model_selection = manifest + .import + .material_slots + .iter() + .find(|selection| selection.slot_id.0 == slot_id) + .map(|selection| selection.selection.clone()) + .unwrap_or(ModelMaterialSelection::Source); + let hydrated_selection = match model_selection { + ModelMaterialSelection::Project(reference) => { + HydratedMaterialSelection::Project { + reference, + layer: HydratedMaterialLayer::Model, + } + } + ModelMaterialSelection::Default => HydratedMaterialSelection::Inherit, + ModelMaterialSelection::Source => part + .material_id + .clone() + .filter(|id| !id.trim().is_empty()) + .or_else(|| part.material_label.as_deref().map(material_id_from_label)) + .map(|material_id| HydratedMaterialSelection::ImportedSource { + reference: MaterialRef::new(EditorAssetRef::new( + asset_id, + material_id, + part.material_label + .clone() + .unwrap_or_else(|| "Imported Material".into()), + )), + }) + .unwrap_or_default(), + }; + self.model_materials + .insert((asset_id.to_string(), slot_id), hydrated_selection); if part.skinned || manifest.metadata.animation_count > 0 || manifest.metadata.skin_count > 0 @@ -156,7 +200,6 @@ impl StaticMeshArtifactCache { ResolvedStaticMeshPart { source_path: manifest.source.path.clone(), mesh_label: part.mesh_label.clone(), - material_label: part.material_label.clone(), }, ); } @@ -174,11 +217,19 @@ impl StaticMeshArtifactCache { struct StaticMeshResolveManifest { source: StaticMeshResolveSource, #[serde(default)] + import: StaticMeshResolveImport, + #[serde(default)] metadata: StaticMeshResolveMetadata, #[serde(default)] parts: Vec, } +#[derive(Debug, Default, Deserialize)] +struct StaticMeshResolveImport { + #[serde(default)] + material_slots: Vec, +} + #[derive(Debug, Default, Deserialize)] struct StaticMeshResolveMetadata { #[serde(default)] @@ -208,17 +259,20 @@ struct StaticMeshResolvePart { } #[allow(clippy::type_complexity)] +#[expect( + clippy::too_many_arguments, + reason = "Bevy system parameters keep independently change-tracked renderer inputs explicit" +)] pub fn hydrate_static_mesh_renderers( mut commands: Commands, asset_server: Res, mut materials: ResMut>, mut artifact_cache: ResMut, + mut fallback: ResMut, renderers: Query< ( Entity, &StaticMeshRenderer, - Option<&MaterialDesc>, - Option<&MaterialOverride>, Option<&ColliderDesc>, Option<&AuthoringComponentStates>, Option<&InspectorOrder>, @@ -228,8 +282,6 @@ pub fn hydrate_static_mesh_renderers( Or<( Added, Changed, - Changed, - Changed, Changed, Changed, Changed, @@ -239,15 +291,11 @@ pub fn hydrate_static_mesh_renderers( children: Query<&Children>, generated_parts: Query<(), With>, ) { - for (entity, renderer, parent_material, material_override, collider, states, order) in - &renderers - { + for (entity, renderer, collider, states, order) in &renderers { despawn_static_mesh_parts(&mut commands, entity, &children, &generated_parts); if !authoring_component_active(states, order, COMPONENT_STATIC_MESH_RENDERER) { continue; } - let parent_material = parent_material - .filter(|_| authoring_component_active(states, order, COMPONENT_MATERIAL_DESC)); let collider = collider.filter(|_| authoring_component_active(states, order, COMPONENT_COLLIDER_DESC)); spawn_static_mesh_parts( @@ -255,10 +303,9 @@ pub fn hydrate_static_mesh_renderers( &asset_server, &mut materials, &mut artifact_cache, + &mut fallback, entity, renderer, - parent_material, - material_override, collider, ); } @@ -273,10 +320,9 @@ pub fn spawn_static_mesh_parts( asset_server: &AssetServer, materials: &mut Assets, artifact_cache: &mut StaticMeshArtifactCache, + fallback: &mut DefaultGridEmergencyMaterial, parent: Entity, renderer: &StaticMeshRenderer, - parent_material: Option<&MaterialDesc>, - material_override: Option<&MaterialOverride>, collider: Option<&ColliderDesc>, ) { let mut spawned = 0usize; @@ -295,15 +341,22 @@ pub fn spawn_static_mesh_parts( let source_path = asset_server_path(&resolved.source_path); let mesh_handle: Handle = asset_server.load(labeled_asset_path(&source_path, &resolved.mesh_label)); - let material_handle = material_for_entry( + let material_slot_id = effective_material_slot_id(entry); + let selection = renderer + .materials + .slot(&material_slot_id) + .map(crate::MaterialSlot::hydrated_selection) + .filter(|selection| !matches!(selection, HydratedMaterialSelection::Inherit)) + .unwrap_or_else(|| { + artifact_cache + .resolve_model_material_selection(&entry.mesh.asset_id, &material_slot_id) + }); + let material_handle = material_for_selection( asset_server, materials, artifact_cache, - renderer, - entry, - &resolved, - parent_material, - material_override, + fallback, + &selection, ); let name = if entry.name.trim().is_empty() { format!("Static Mesh Part {index}") @@ -316,10 +369,10 @@ pub fn spawn_static_mesh_parts( Name::new(name), Mesh3d(mesh_handle), MeshMaterial3d(material_handle), - HydratedRendererMaterialBinding { + HydratedMaterialSlotBinding { owner: parent, - slot_id: effective_material_slot_id(entry), - effective_material: effective_material_ref(renderer, entry).cloned(), + slot_id: material_slot_id, + selection, }, entry.local_transform, Visibility::Visible, @@ -361,37 +414,15 @@ pub fn despawn_static_mesh_parts( } #[allow(clippy::too_many_arguments)] -fn material_for_entry( +fn material_for_selection( asset_server: &AssetServer, materials: &mut Assets, artifact_cache: &mut StaticMeshArtifactCache, - renderer: &StaticMeshRenderer, - entry: &StaticMeshRendererEntry, - resolved: &ResolvedStaticMeshPart, - parent_material: Option<&MaterialDesc>, - material_override: Option<&MaterialOverride>, + fallback: &mut DefaultGridEmergencyMaterial, + selection: &HydratedMaterialSelection, ) -> Handle { - if let Some(parent_material) = parent_material { - return materials.add(material_from_desc(asset_server, parent_material)); - } - - if let Some(override_material) = material_override.and_then(|overrides| { - overrides - .slots - .iter() - .find(|slot| slot.slot_id == entry.id) - .map(|slot| &slot.material) - }) { - return materials.add(material_from_desc(asset_server, override_material)); - } - - if let Some(material_ref) = effective_material_ref(renderer, entry) { - if let Some(handle) = - resolve_shared_material(asset_server, materials, artifact_cache, material_ref) - { - return handle; - } - if let Some(resolved_material) = artifact_cache.resolve_material(&material_ref.0) { + if let HydratedMaterialSelection::ImportedSource { reference } = selection { + if let Some(resolved_material) = artifact_cache.resolve_material(&reference.0) { let source_path = asset_server_path(&resolved_material.source_path); return asset_server.load(standard_material_asset_path( &source_path, @@ -400,34 +431,10 @@ fn material_for_entry( } debug!( "Static mesh material ref unresolved: asset_id='{}' material='{}' label='{}'", - material_ref.0.asset_id, material_ref.0.sub_asset_id, material_ref.0.label + reference.0.asset_id, reference.0.sub_asset_id, reference.0.label ); } - - // Read-only compatibility path for schema-v1/v2 scenes. The explicit project upgrader moves - // this reference into `RendererMaterialSet` and clears the legacy draw-part field. - if let Some(material_ref) = entry.material.as_ref() { - let material_ref = MaterialRef::new(material_ref.clone()); - if let Some(handle) = - resolve_shared_material(asset_server, materials, artifact_cache, &material_ref) - { - return handle; - } - if let Some(resolved_material) = artifact_cache.resolve_material(&material_ref.0) { - let source_path = asset_server_path(&resolved_material.source_path); - return asset_server.load(standard_material_asset_path( - &source_path, - &resolved_material.material_label, - )); - } - } - - if let Some(label) = resolved.material_label.as_deref() { - let source_path = asset_server_path(&resolved.source_path); - return asset_server.load(standard_material_asset_path(&source_path, label)); - } - - materials.add(error_material()) + default_grid_emergency_handle(materials, fallback) } fn effective_material_slot_id(entry: &StaticMeshRendererEntry) -> crate::ComponentInstanceId { @@ -438,47 +445,11 @@ fn effective_material_slot_id(entry: &StaticMeshRendererEntry) -> crate::Compone } } -fn effective_material_ref<'a>( - renderer: &'a StaticMeshRenderer, - entry: &'a StaticMeshRendererEntry, -) -> Option<&'a MaterialRef> { - let slot_id = effective_material_slot_id(entry); - renderer.materials.effective_material(&slot_id) -} - -fn resolve_shared_material( - asset_server: &AssetServer, - materials: &mut Assets, - cache: &mut StaticMeshArtifactCache, - reference: &MaterialRef, -) -> Option> { - if let Some(handle) = cache.project_materials.get(reference) { - return Some(handle.clone()); - } - let path = reference.0.source_path.as_deref()?; - let desc_and_state = crate::load_resolved_material_from_path(path).ok()?; - let mut material = material_from_desc(asset_server, &desc_and_state.0); - material.alpha_mode = match desc_and_state.1.alpha_mode { - MaterialAlphaMode::Opaque => AlphaMode::Opaque, - MaterialAlphaMode::Cutout => AlphaMode::Mask(desc_and_state.1.alpha_cutoff), - }; - material.cull_mode = (!desc_and_state.1.double_sided).then_some(Face::Back); - let handle = materials.add(material); - cache - .project_materials - .insert(reference.clone(), handle.clone()); - Some(handle) -} - pub(crate) fn resolve_renderer_material_handle( asset_server: &AssetServer, - materials: &mut Assets, cache: &mut StaticMeshArtifactCache, reference: &MaterialRef, ) -> Option> { - if let Some(handle) = resolve_shared_material(asset_server, materials, cache, reference) { - return Some(handle); - } let resolved = cache.resolve_material(&reference.0)?; let source_path = asset_server_path(&resolved.source_path); Some(asset_server.load(standard_material_asset_path( @@ -489,17 +460,9 @@ pub(crate) fn resolve_renderer_material_handle( pub(crate) fn renderer_error_material( materials: &mut Assets, + fallback: &mut DefaultGridEmergencyMaterial, ) -> Handle { - materials.add(error_material()) -} - -fn error_material() -> StandardMaterial { - StandardMaterial { - base_color: Color::srgb(1.0, 0.0, 1.0), - perceptual_roughness: 0.35, - metallic: 0.0, - ..default() - } + default_grid_emergency_handle(materials, fallback) } fn labeled_asset_path(path: &str, label: &str) -> String { diff --git a/crates/shared/src/lib.rs b/crates/shared/src/lib.rs index 360d6fe..345f4e2 100644 --- a/crates/shared/src/lib.rs +++ b/crates/shared/src/lib.rs @@ -9,8 +9,10 @@ mod animation; mod asset_fingerprint; pub mod brush_math; mod components; +pub mod content; mod hydration; mod material_asset; +mod material_desc; mod navigation; mod post_process_effect_asset; mod prefab_overrides; @@ -21,17 +23,24 @@ pub use actor::{infer_actor_kind, validate_actor, ActorValidationError}; pub use animation::*; pub use asset_fingerprint::AssetSourceFingerprint; pub use components::*; +pub use content::*; pub use hydration::{ cascade_config_from_rendering, flush_level_object_hydration, - initialize_level_object_visibility_hierarchy, material_from_desc, strip_hydrated, + initialize_level_object_visibility_hierarchy, load_runtime_texture, material_from_desc, + material_from_desc_with_texture_loader, runtime_image_sampler_descriptor, strip_hydrated, strip_hydrated_entity, HydratedModelRoot, HydratedPrefabMember, HydratedPrefabReady, HydratedSkinnedMeshRoot, HydratedTerrainChunk, HydrationPlugin, PrefabHydrationBlocked, + StaticMeshArtifactCache, }; pub use material_asset::{ - load_resolved_material_from_path, MaterialAlphaMode, MaterialAsset, MaterialInstanceAsset, - MaterialRenderState, ShaderPropertyDesc, ShaderPropertyType, ShaderSchemaAsset, - MATERIAL_ASSET_SCHEMA_VERSION, MATERIAL_INSTANCE_SCHEMA_VERSION, SURFACE_SHADER_SCHEMA_VERSION, + load_resolved_material_from_path, standard_lit_input_schema, MaterialAlphaMode, MaterialAsset, + MaterialInputDesc, MaterialInputGroupDesc, MaterialInputPresentation, MaterialInputSchema, + MaterialInputSet, MaterialInstanceAsset, MaterialProvenance, MaterialRenderState, + MaterialTextureInputDesc, ShaderPropertyDesc, ShaderPropertyType, ShaderSchemaAsset, + TextureSemantic, MATERIAL_ASSET_SCHEMA_VERSION, MATERIAL_INSTANCE_SCHEMA_VERSION, + SURFACE_SHADER_SCHEMA_VERSION, }; +pub use material_desc::*; pub use navigation::*; pub use post_process_effect_asset::{PostProcessEffectAsset, PostProcessEffectKind}; pub use prefab_overrides::{ @@ -69,7 +78,7 @@ pub fn standard_material_asset_path(asset_path: &str, material_label: &str) -> S format!("{asset_path}#{label}") } -use bevy::prelude::*; +use bevy::prelude::{App, Commands, Entity, Plugin, Query, Update, With, Without}; /// Registers all reflectable authoring types and installs hydration systems. pub struct SharedTypesPlugin; @@ -88,8 +97,8 @@ impl Plugin for SharedTypesPlugin { .register_type::() .register_type::() .register_type::() - .register_type::() - .register_type::() + .register_type::() + .register_type::() .register_type::() .register_type::() .register_type::() @@ -131,6 +140,8 @@ impl Plugin for SharedTypesPlugin { .register_type::() .register_type::() .register_type::() + .register_type::() + .register_type::() .register_type::() .register_type::() .register_type::() @@ -183,6 +194,27 @@ fn migrate_legacy_authoring_component_states( #[cfg(test)] mod tests { use super::*; + use bevy::{ecs::reflect::AppTypeRegistry, reflect::TypeInfo}; + + #[test] + fn runtime_material_property_blocks_are_registered_for_editor_tooling() { + let mut app = App::new(); + app.add_plugins(SharedTypesPlugin); + + let registry = app.world().resource::().read(); + let block = registry + .get(std::any::TypeId::of::()) + .expect("MaterialPropertyBlock must be registered"); + let TypeInfo::Struct(block_info) = block.type_info() else { + panic!("MaterialPropertyBlock must reflect as a struct"); + }; + assert!(block_info.field("parameters").is_some()); + assert!(block_info.field("textures").is_some()); + + assert!(registry + .get(std::any::TypeId::of::()) + .is_some()); + } #[test] fn gltf_standard_material_paths_use_pbr_conversion_label() { diff --git a/crates/shared/src/material_asset.rs b/crates/shared/src/material_asset.rs index 13bad01..04c5000 100644 --- a/crates/shared/src/material_asset.rs +++ b/crates/shared/src/material_asset.rs @@ -4,13 +4,13 @@ use bevy::prelude::*; use serde::{Deserialize, Serialize}; use crate::{ - EditorAssetRef, MaterialDesc, MaterialParameter, MaterialRef, MaterialShaderKind, - MaterialTextureBinding, + ColorDesc, EditorAssetRef, MaterialDesc, MaterialParameter, MaterialParameterValue, + MaterialRef, MaterialShaderKind, MaterialTextureBinding, ShaderRefDesc, TextureChannel, }; -pub const MATERIAL_ASSET_SCHEMA_VERSION: u32 = 1; -pub const MATERIAL_INSTANCE_SCHEMA_VERSION: u32 = 1; -pub const SURFACE_SHADER_SCHEMA_VERSION: u32 = 1; +pub const MATERIAL_ASSET_SCHEMA_VERSION: u32 = 2; +pub const MATERIAL_INSTANCE_SCHEMA_VERSION: u32 = 2; +pub const SURFACE_SHADER_SCHEMA_VERSION: u32 = 2; const fn default_material_schema_version() -> u32 { MATERIAL_ASSET_SCHEMA_VERSION @@ -55,20 +55,230 @@ impl Default for MaterialRenderState { } } -/// RON material asset: label plus authoring [`MaterialDesc`]. -#[derive(Asset, TypePath, Debug, Clone, Serialize, Deserialize)] +/// Canonical values and texture bindings consumed by both built-in and custom material schemas. +/// +/// Values are keyed by stable input names. Validation rejects duplicates before publication; +/// vectors are retained instead of maps so shader-defined presentation order remains serializable. +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)] +pub struct MaterialInputSet { + #[serde(default)] + pub values: Vec, + #[serde(default)] + pub textures: Vec, +} + +impl MaterialInputSet { + pub fn from_material_desc(material: &MaterialDesc) -> Self { + let mut values = vec![ + MaterialParameter { + name: "base_color".into(), + value: MaterialParameterValue::Color(material.base_color), + }, + MaterialParameter { + name: "metallic".into(), + value: MaterialParameterValue::Float(material.metallic), + }, + MaterialParameter { + name: "roughness".into(), + value: MaterialParameterValue::Float(material.roughness), + }, + MaterialParameter { + name: "emissive_color".into(), + value: MaterialParameterValue::Color(material.emissive_color), + }, + MaterialParameter { + name: "emissive_intensity".into(), + value: MaterialParameterValue::Float(material.emissive_intensity), + }, + MaterialParameter { + name: "uv_offset".into(), + value: MaterialParameterValue::Vec2(material.uv_offset), + }, + MaterialParameter { + name: "uv_tiling".into(), + value: MaterialParameterValue::Vec2(material.uv_tiling), + }, + ]; + for parameter in &material.parameters { + if !is_standard_value_name(¶meter.name) { + upsert_parameter(&mut values, parameter.clone()); + } + } + + let mut textures = Vec::new(); + if let Some(path) = material.base_color_texture.as_deref() { + textures.push(path_texture_binding( + "base_color", + path, + TextureChannel::Rgba, + )); + } + if let Some(path) = material.normal_map_texture.as_deref() { + textures.push(path_texture_binding("normal", path, TextureChannel::Rgb)); + } + if let Some(path) = material.metallic_roughness_texture.as_deref() { + textures.push(path_texture_binding("occlusion", path, TextureChannel::R)); + textures.push(path_texture_binding("roughness", path, TextureChannel::G)); + textures.push(path_texture_binding("metallic", path, TextureChannel::B)); + } + if let Some(path) = material.occlusion_texture.as_deref() { + upsert_texture( + &mut textures, + path_texture_binding("occlusion", path, TextureChannel::R), + ); + } + if let Some(path) = material.emissive_texture.as_deref() { + textures.push(path_texture_binding("emissive", path, TextureChannel::Rgb)); + } + for texture in &material.textures { + if !is_standard_texture_name(&texture.name) { + upsert_texture(&mut textures, texture.clone()); + } + } + Self { values, textures } + } + + pub fn apply_to_material_desc(&self, material: &mut MaterialDesc) { + material.parameters.clear(); + material.textures.clear(); + for parameter in &self.values { + match (parameter.name.as_str(), ¶meter.value) { + ("base_color", MaterialParameterValue::Color(value)) => { + material.base_color = *value + } + ("metallic", MaterialParameterValue::Float(value)) => material.metallic = *value, + ("roughness", MaterialParameterValue::Float(value)) => material.roughness = *value, + ("emissive_color", MaterialParameterValue::Color(value)) => { + material.emissive_color = *value + } + ("emissive_intensity", MaterialParameterValue::Float(value)) => { + material.emissive_intensity = *value + } + ("uv_offset", MaterialParameterValue::Vec2(value)) => material.uv_offset = *value, + ("uv_tiling", MaterialParameterValue::Vec2(value)) => material.uv_tiling = *value, + _ => upsert_parameter(&mut material.parameters, parameter.clone()), + } + } + material.base_color_texture = binding_path(self.texture("base_color")); + material.normal_map_texture = binding_path(self.texture("normal")); + material.emissive_texture = binding_path(self.texture("emissive")); + let roughness = binding_path(self.texture("roughness")); + let metallic = binding_path(self.texture("metallic")); + material.metallic_roughness_texture = match (roughness, metallic) { + (Some(roughness), Some(metallic)) if roughness == metallic => Some(roughness), + (Some(path), None) | (None, Some(path)) => Some(path), + _ => None, + }; + material.occlusion_texture = binding_path(self.texture("occlusion")); + for texture in &self.textures { + if !is_standard_texture_name(&texture.name) { + upsert_texture(&mut material.textures, texture.clone()); + } + } + } + + pub fn texture(&self, name: &str) -> Option<&MaterialTextureBinding> { + self.textures.iter().find(|binding| binding.name == name) + } + + pub fn validate_unique(&self) -> Result<(), String> { + let mut names = std::collections::HashSet::new(); + for value in &self.values { + if !names.insert(("value", value.name.as_str())) { + return Err(format!( + "material value `{}` is assigned more than once", + value.name + )); + } + } + for texture in &self.textures { + if !names.insert(("texture", texture.name.as_str())) { + return Err(format!( + "material texture `{}` is assigned more than once", + texture.name + )); + } + } + Ok(()) + } +} + +fn path_texture_binding(name: &str, path: &str, channel: TextureChannel) -> MaterialTextureBinding { + let label = std::path::Path::new(path) + .file_stem() + .and_then(|value| value.to_str()) + .unwrap_or(path); + MaterialTextureBinding { + name: name.into(), + texture: Some( + EditorAssetRef::new(String::new(), format!("texture:{name}"), label) + .with_source_path(path), + ), + channel, + } +} + +fn binding_path(binding: Option<&MaterialTextureBinding>) -> Option { + binding + .and_then(|binding| binding.texture.as_ref()) + .and_then(|reference| reference.source_path.clone()) +} + +fn is_standard_value_name(name: &str) -> bool { + matches!( + name, + "base_color" + | "metallic" + | "roughness" + | "emissive_color" + | "emissive_intensity" + | "uv_offset" + | "uv_tiling" + ) +} + +fn is_standard_texture_name(name: &str) -> bool { + matches!( + name, + "base_color" + | "base_color_texture" + | "normal" + | "normal_map_texture" + | "occlusion" + | "roughness" + | "metallic" + | "metallic_roughness" + | "metallic_roughness_texture" + | "emissive" + | "emissive_texture" + ) +} + +/// RON material asset with schema-driven authoring inputs. +#[derive(Asset, TypePath, Debug, Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] pub struct MaterialAsset { #[serde(default = "default_material_schema_version")] pub schema_version: u32, pub label: String, - /// Legacy path/label retained for v0 compatibility. New assets use `shader_ref`. #[serde(default)] - pub shader: Option, + pub shader: ShaderRefDesc, #[serde(default)] pub shader_ref: Option, #[serde(default)] pub render_state: MaterialRenderState, - pub material: MaterialDesc, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub provenance: Option, + #[serde(default)] + pub inputs: MaterialInputSet, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct MaterialProvenance { + pub source_path: String, + pub source_fingerprint: String, + pub source_sub_asset_id: String, + pub source_label: String, } impl MaterialAsset { @@ -87,7 +297,11 @@ pub fn load_resolved_material_from_path( catalog_path: &str, ) -> Result<(MaterialDesc, MaterialRenderState), String> { if let Ok(asset) = MaterialAsset::load_from_path(catalog_path) { - let mut material = asset.material; + let mut material = MaterialDesc { + shader: asset.shader, + ..Default::default() + }; + asset.inputs.apply_to_material_desc(&mut material); material.material_asset_path = Some(catalog_path.to_string()); return Ok((material, asset.render_state)); } @@ -100,7 +314,11 @@ pub fn load_resolved_material_from_path( ) })?; let base = MaterialAsset::load_from_path(base_path)?; - let mut material = base.material; + let mut material = MaterialDesc { + shader: base.shader, + ..Default::default() + }; + base.inputs.apply_to_material_desc(&mut material); instance.apply_to(&mut material); material.material_asset_path = Some(catalog_path.to_string()); Ok((material, base.render_state)) @@ -108,15 +326,14 @@ pub fn load_resolved_material_from_path( /// Explicit reusable overrides over one project Material asset. #[derive(Asset, TypePath, Debug, Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] pub struct MaterialInstanceAsset { #[serde(default = "default_material_instance_schema_version")] pub schema_version: u32, pub label: String, pub base: MaterialRef, #[serde(default)] - pub parameters: Vec, - #[serde(default)] - pub textures: Vec, + pub overrides: MaterialInputSet, } impl MaterialInstanceAsset { @@ -129,7 +346,7 @@ impl MaterialInstanceAsset { /// Applies this instance's sparse overrides without mutating the shared base asset. pub fn apply_to(&self, material: &mut MaterialDesc) { - for parameter in &self.parameters { + for parameter in &self.overrides.values { match (parameter.name.as_str(), ¶meter.value) { ("base_color", crate::MaterialParameterValue::Color(value)) => { material.base_color = *value; @@ -146,23 +363,45 @@ impl MaterialInstanceAsset { ("emissive_intensity", crate::MaterialParameterValue::Float(value)) => { material.emissive_intensity = *value; } + ("uv_offset", crate::MaterialParameterValue::Vec2(value)) => { + material.uv_offset = *value; + } + ("uv_tiling", crate::MaterialParameterValue::Vec2(value)) => { + material.uv_tiling = *value; + } _ => upsert_parameter(&mut material.parameters, parameter.clone()), } } - for texture in &self.textures { + for texture in &self.overrides.textures { let path = texture .texture .as_ref() .and_then(|reference| reference.source_path.clone()); match texture.name.as_str() { - "base_color_texture" => material.base_color_texture = path, - "emissive_texture" => material.emissive_texture = path, - "normal_map_texture" => material.normal_map_texture = path, - "metallic_roughness_texture" => material.metallic_roughness_texture = path, + "base_color" | "base_color_texture" => material.base_color_texture = path, + "emissive" | "emissive_texture" => material.emissive_texture = path, + "normal" | "normal_map_texture" => material.normal_map_texture = path, + "roughness" | "metallic" | "metallic_roughness_texture" => { + material.metallic_roughness_texture = path + } _ => upsert_texture(&mut material.textures, texture.clone()), } } } + + /// Overlays sparse runtime/property-block values onto this direct-base instance. + pub fn merge_overrides( + &mut self, + parameters: impl IntoIterator, + textures: impl IntoIterator, + ) { + for parameter in parameters { + upsert_parameter(&mut self.overrides.values, parameter); + } + for texture in textures { + upsert_texture(&mut self.overrides.textures, texture); + } + } } fn upsert_parameter(values: &mut Vec, value: MaterialParameter) { @@ -192,17 +431,107 @@ pub enum ShaderPropertyType { Texture, } +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] +pub struct MaterialInputGroupDesc { + pub id: String, + pub display_name: String, + #[serde(default)] + pub order: i32, + #[serde(default)] + pub advanced: bool, +} + +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)] +pub enum TextureSemantic { + #[default] + Auto, + Color, + Normal, + Scalar, + Mask, + Hdr, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct MaterialTextureInputDesc { + #[serde(default)] + pub semantic: TextureSemantic, + #[serde(default)] + pub default_channel: TextureChannel, + #[serde(default)] + pub allow_channel_override: bool, +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] -pub struct ShaderPropertyDesc { +pub struct MaterialInputDesc { pub name: String, pub display_name: String, #[serde(default)] pub group: String, + #[serde(default)] + pub order: i32, pub property_type: ShaderPropertyType, + #[serde(default)] + pub default_value: Option, + #[serde(default)] + pub texture: Option, + #[serde(default)] + pub tooltip: String, + #[serde(default)] + pub advanced: bool, + /// Authoring presentation only. Runtime evaluation continues to address inputs by `name`. + #[serde(default)] + pub presentation: MaterialInputPresentation, +} + +impl Default for MaterialInputDesc { + fn default() -> Self { + Self { + name: String::new(), + display_name: String::new(), + group: String::new(), + order: 0, + property_type: ShaderPropertyType::Float { + min: None, + max: None, + }, + default_value: None, + texture: None, + tooltip: String::new(), + advanced: false, + presentation: MaterialInputPresentation::Row, + } + } +} + +/// Declares whether an input owns a visible row or is edited through another input's row. +/// +/// Companion values remain independent in [`MaterialInputSet`]. This keeps the schema suitable for +/// generated/custom shaders while allowing related controls such as emissive color and intensity +/// to share one coherent Inspector row. +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] +pub enum MaterialInputPresentation { + #[default] + Row, + Companion { + owner: String, + }, +} + +/// Compatibility source alias for code that has not yet adopted the material-input terminology. +pub type ShaderPropertyDesc = MaterialInputDesc; + +#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)] +pub struct MaterialInputSchema { + #[serde(default)] + pub groups: Vec, + #[serde(default)] + pub inputs: Vec, } /// RON shader schema describing material inspector parameters. #[derive(Asset, TypePath, Debug, Clone, Serialize, Deserialize, PartialEq)] +#[serde(deny_unknown_fields)] pub struct ShaderSchemaAsset { #[serde(default = "default_surface_shader_schema_version")] pub schema_version: u32, @@ -211,11 +540,7 @@ pub struct ShaderSchemaAsset { #[serde(default)] pub wgsl_path: Option, #[serde(default)] - pub parameters: Vec, - #[serde(default)] - pub default_values: Vec, - #[serde(default)] - pub default_textures: Vec, + pub schema: MaterialInputSchema, } impl ShaderSchemaAsset { @@ -227,18 +552,194 @@ impl ShaderSchemaAsset { } } +/// Engine-owned Standard Lit authoring schema. It is consumed by the same renderer used for +/// project Surface schemas, so a future graph compiler only needs to emit this descriptor shape. +pub fn standard_lit_input_schema() -> MaterialInputSchema { + let groups = vec![ + MaterialInputGroupDesc { + id: "surface_inputs".into(), + display_name: "Surface Inputs".into(), + order: 0, + advanced: false, + }, + MaterialInputGroupDesc { + id: "advanced_inputs".into(), + display_name: "Advanced Inputs".into(), + order: 100, + advanced: true, + }, + MaterialInputGroupDesc { + id: "uv_transform".into(), + display_name: "UV Transform".into(), + order: 90, + advanced: false, + }, + ]; + let scalar_texture = |channel| MaterialTextureInputDesc { + semantic: TextureSemantic::Scalar, + default_channel: channel, + allow_channel_override: true, + }; + let inputs = vec![ + MaterialInputDesc { + name: "base_color".into(), + display_name: "Base Color".into(), + group: "surface_inputs".into(), + order: 0, + property_type: ShaderPropertyType::Color, + default_value: Some(MaterialParameterValue::Color(ColorDesc::default())), + texture: Some(MaterialTextureInputDesc { + semantic: TextureSemantic::Color, + default_channel: TextureChannel::Rgba, + allow_channel_override: false, + }), + tooltip: "Color multiplier applied to the base-color texture.".into(), + advanced: false, + presentation: MaterialInputPresentation::Row, + }, + MaterialInputDesc { + name: "metallic".into(), + display_name: "Metallic".into(), + group: "surface_inputs".into(), + order: 10, + property_type: ShaderPropertyType::Float { + min: Some(0.0), + max: Some(1.0), + }, + default_value: Some(MaterialParameterValue::Float(0.0)), + texture: Some(scalar_texture(TextureChannel::B)), + tooltip: "Scalar multiplier; ARM/ORM uses the blue channel.".into(), + advanced: false, + presentation: MaterialInputPresentation::Row, + }, + MaterialInputDesc { + name: "roughness".into(), + display_name: "Roughness".into(), + group: "surface_inputs".into(), + order: 20, + property_type: ShaderPropertyType::Float { + min: Some(0.0), + max: Some(1.0), + }, + default_value: Some(MaterialParameterValue::Float(0.65)), + texture: Some(scalar_texture(TextureChannel::G)), + tooltip: "Scalar multiplier; ARM/ORM uses the green channel.".into(), + advanced: false, + presentation: MaterialInputPresentation::Row, + }, + MaterialInputDesc { + name: "occlusion".into(), + display_name: "Occlusion".into(), + group: "surface_inputs".into(), + order: 30, + property_type: ShaderPropertyType::Float { + min: Some(0.0), + max: Some(1.0), + }, + default_value: Some(MaterialParameterValue::Float(1.0)), + texture: Some(scalar_texture(TextureChannel::R)), + tooltip: "Ambient-occlusion strength; ARM/ORM uses the red channel.".into(), + advanced: false, + presentation: MaterialInputPresentation::Row, + }, + MaterialInputDesc { + name: "normal".into(), + display_name: "Normal".into(), + group: "surface_inputs".into(), + order: 40, + property_type: ShaderPropertyType::Float { + min: Some(0.0), + max: Some(1.0), + }, + default_value: Some(MaterialParameterValue::Float(0.85)), + texture: Some(MaterialTextureInputDesc { + semantic: TextureSemantic::Normal, + default_channel: TextureChannel::Rgb, + allow_channel_override: false, + }), + tooltip: String::new(), + advanced: false, + presentation: MaterialInputPresentation::Row, + }, + MaterialInputDesc { + name: "emissive_color".into(), + display_name: "Emissive".into(), + group: "surface_inputs".into(), + order: 50, + property_type: ShaderPropertyType::Color, + default_value: Some(MaterialParameterValue::Color(ColorDesc::srgb( + 1.0, 1.0, 1.0, + ))), + texture: Some(MaterialTextureInputDesc { + semantic: TextureSemantic::Color, + default_channel: TextureChannel::Rgb, + allow_channel_override: false, + }), + tooltip: "Emissive color multiplied by the texture and intensity.".into(), + advanced: false, + presentation: MaterialInputPresentation::Row, + }, + MaterialInputDesc { + name: "emissive_intensity".into(), + display_name: "Emissive Intensity".into(), + group: "surface_inputs".into(), + order: 60, + property_type: ShaderPropertyType::Float { + min: Some(0.0), + max: Some(50_000.0), + }, + default_value: Some(MaterialParameterValue::Float(0.0)), + texture: None, + tooltip: "Emissive luminance multiplier in nits.".into(), + advanced: false, + presentation: MaterialInputPresentation::Companion { + owner: "emissive_color".into(), + }, + }, + MaterialInputDesc { + name: "uv_offset".into(), + display_name: "Offset".into(), + group: "uv_transform".into(), + order: 0, + property_type: ShaderPropertyType::Vec2, + default_value: Some(MaterialParameterValue::Vec2(Vec2::ZERO)), + texture: None, + tooltip: "Shared UV translation for every texture on this material.".into(), + advanced: false, + presentation: MaterialInputPresentation::Row, + }, + MaterialInputDesc { + name: "uv_tiling".into(), + display_name: "Tiling".into(), + group: "uv_transform".into(), + order: 10, + property_type: ShaderPropertyType::Vec2, + default_value: Some(MaterialParameterValue::Vec2(Vec2::ONE)), + texture: None, + tooltip: "Shared UV scale for every texture on this material.".into(), + advanced: false, + presentation: MaterialInputPresentation::Row, + }, + ]; + MaterialInputSchema { groups, inputs } +} + #[cfg(test)] mod tests { use super::*; #[test] - fn legacy_material_defaults_to_current_schema_and_opaque() { - let parsed: MaterialAsset = ron::from_str( - r#"(label: "Legacy", material: (base_color: (r: 1.0, g: 1.0, b: 1.0, a: 1.0), metallic: 0.0, roughness: 0.5, base_color_texture: None, normal_map_texture: None, metallic_roughness_texture: None))"#, - ) - .expect("legacy material should remain readable"); + fn material_v2_defaults_to_opaque() { + let parsed = MaterialAsset { + schema_version: MATERIAL_ASSET_SCHEMA_VERSION, + label: "Material".into(), + shader: ShaderRefDesc::default(), + shader_ref: None, + render_state: MaterialRenderState::default(), + provenance: None, + inputs: MaterialInputSet::default(), + }; - assert_eq!(parsed.schema_version, MATERIAL_ASSET_SCHEMA_VERSION); assert_eq!(parsed.render_state.alpha_mode, MaterialAlphaMode::Opaque); } @@ -252,8 +753,7 @@ mod tests { "material:source", "Base", )), - parameters: Vec::new(), - textures: Vec::new(), + overrides: MaterialInputSet::default(), }; assert!(instance.base.is_resolved()); @@ -266,23 +766,26 @@ mod tests { schema_version: MATERIAL_INSTANCE_SCHEMA_VERSION, label: "Variant".into(), base: MaterialRef::default(), - parameters: vec![ - MaterialParameter { - name: "roughness".into(), - value: crate::MaterialParameterValue::Float(0.2), - }, - MaterialParameter { - name: "edge_width".into(), - value: crate::MaterialParameterValue::Float(3.0), - }, - ], - textures: vec![MaterialTextureBinding { - name: "base_color_texture".into(), - texture: Some( - EditorAssetRef::new("texture", "texture:source", "Grid") - .with_source_path("assets/textures/grid.png"), - ), - }], + overrides: MaterialInputSet { + values: vec![ + MaterialParameter { + name: "roughness".into(), + value: crate::MaterialParameterValue::Float(0.2), + }, + MaterialParameter { + name: "edge_width".into(), + value: crate::MaterialParameterValue::Float(3.0), + }, + ], + textures: vec![MaterialTextureBinding { + name: "base_color_texture".into(), + texture: Some( + EditorAssetRef::new("texture", "texture:source", "Grid") + .with_source_path("assets/textures/grid.png"), + ), + channel: TextureChannel::Rgba, + }], + }, }; instance.apply_to(&mut material); @@ -298,6 +801,88 @@ mod tests { .any(|value| value.name == "edge_width")); } + #[test] + fn material_inputs_round_trip_shared_uv_transform() { + let source = MaterialDesc { + uv_offset: Vec2::new(0.25, -0.5), + uv_tiling: Vec2::new(4.0, 2.0), + ..Default::default() + }; + let inputs = MaterialInputSet::from_material_desc(&source); + let mut resolved = MaterialDesc::default(); + + inputs.apply_to_material_desc(&mut resolved); + + assert_eq!(resolved.uv_offset, source.uv_offset); + assert_eq!(resolved.uv_tiling, source.uv_tiling); + } + + #[test] + fn standard_lit_surface_inputs_match_penpot_bindings() { + let schema = standard_lit_input_schema(); + let surface = schema + .inputs + .iter() + .filter(|input| input.group == "surface_inputs") + .collect::>(); + let rows = surface + .iter() + .filter(|input| matches!(input.presentation, MaterialInputPresentation::Row)) + .count(); + assert_eq!(surface.len(), 7); + assert_eq!(rows, 6); + assert_eq!(surface[0].name, "base_color"); + assert_eq!(surface[4].name, "normal"); + assert!(matches!( + surface[4].property_type, + ShaderPropertyType::Float { + min: Some(0.0), + max: Some(1.0) + } + )); + assert_eq!(surface[6].name, "emissive_intensity"); + assert_eq!( + surface[6].presentation, + MaterialInputPresentation::Companion { + owner: "emissive_color".into() + } + ); + } + + #[test] + fn promotion_merge_replaces_existing_values_without_duplicates() { + let mut instance = MaterialInstanceAsset { + schema_version: MATERIAL_INSTANCE_SCHEMA_VERSION, + label: "Variant".into(), + base: MaterialRef::default(), + overrides: MaterialInputSet { + values: vec![MaterialParameter { + name: "roughness".into(), + value: crate::MaterialParameterValue::Float(0.8), + }], + textures: Vec::new(), + }, + }; + instance.merge_overrides( + [MaterialParameter { + name: "roughness".into(), + value: crate::MaterialParameterValue::Float(0.2), + }], + [MaterialTextureBinding { + name: "normal_map_texture".into(), + texture: None, + channel: TextureChannel::Rgb, + }], + ); + + assert_eq!(instance.overrides.values.len(), 1); + assert_eq!( + instance.overrides.values[0].value, + crate::MaterialParameterValue::Float(0.2) + ); + assert_eq!(instance.overrides.textures.len(), 1); + } + #[test] fn resolved_material_instance_applies_sparse_overrides_and_keeps_instance_path() { let root = std::env::temp_dir().join(format!( @@ -313,16 +898,17 @@ mod tests { let base = MaterialAsset { schema_version: MATERIAL_ASSET_SCHEMA_VERSION, label: "Base".into(), - shader: None, + shader: ShaderRefDesc::default(), shader_ref: None, render_state: MaterialRenderState { double_sided: true, ..Default::default() }, - material: MaterialDesc { + provenance: None, + inputs: MaterialInputSet::from_material_desc(&MaterialDesc { roughness: 0.8, ..Default::default() - }, + }), }; std::fs::write( &base_path, @@ -336,11 +922,13 @@ mod tests { EditorAssetRef::new("base", "material:source", "Base") .with_source_path(base_path.to_string_lossy().into_owned()), ), - parameters: vec![MaterialParameter { - name: "roughness".into(), - value: crate::MaterialParameterValue::Float(0.25), - }], - textures: Vec::new(), + overrides: MaterialInputSet { + values: vec![MaterialParameter { + name: "roughness".into(), + value: crate::MaterialParameterValue::Float(0.25), + }], + textures: Vec::new(), + }, }; std::fs::write( &instance_path, diff --git a/crates/shared/src/material_desc.rs b/crates/shared/src/material_desc.rs new file mode 100644 index 0000000..8e3e889 --- /dev/null +++ b/crates/shared/src/material_desc.rs @@ -0,0 +1,176 @@ +//! Runtime and legacy-compatible material descriptor types. + +use bevy::prelude::*; +use serde::{Deserialize, Serialize}; + +use crate::{ComponentInstanceId, EditorAssetRef, ShaderRefDesc}; + +#[derive(Reflect, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] +#[type_path = "shared::components"] +pub enum MaterialParameterValue { + Bool(bool), + Float(f32), + Vec2(Vec2), + Vec3(Vec3), + Color(ColorDesc), + Enum(String), +} + +impl Default for MaterialParameterValue { + fn default() -> Self { + Self::Float(0.0) + } +} + +#[derive(Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] +#[type_path = "shared::components"] +pub struct MaterialParameter { + pub name: String, + pub value: MaterialParameterValue, +} + +/// Channels sampled from a texture binding. Scalar material inputs use one channel while +/// color/normal inputs use RGB or RGBA. The default preserves the pre-v2 whole-texture behavior. +#[derive(Reflect, Default, Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] +#[type_path = "shared::components"] +pub enum TextureChannel { + R, + G, + B, + A, + Rgb, + #[default] + Rgba, +} + +#[derive(Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] +#[type_path = "shared::components"] +pub struct MaterialTextureBinding { + pub name: String, + pub texture: Option, + #[serde(default)] + pub channel: TextureChannel, +} + +/// Per-render-slot material override stored on scene actors. +#[derive(Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] +#[type_path = "shared::components"] +pub struct MaterialSlotOverride { + pub slot_id: ComponentInstanceId, + #[serde(default)] + pub base_material: Option, + pub material: MaterialDesc, +} + +/// Actor-level material overrides retained for legacy scene upgrade only. +#[derive(Component, Reflect, Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[reflect(Component, Default, Debug, PartialEq, Serialize, Deserialize)] +#[type_path = "shared::components"] +pub struct MaterialOverride { + #[serde(default)] + pub slots: Vec, +} + +/// Serializable color description. This avoids coupling saved scenes to any internal color +/// representation details. +#[derive(Reflect, Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +#[reflect(Default, Debug, Serialize, Deserialize)] +#[type_path = "shared::components"] +pub struct ColorDesc { + pub r: f32, + pub g: f32, + pub b: f32, + pub a: f32, +} + +impl ColorDesc { + pub const fn srgb(r: f32, g: f32, b: f32) -> Self { + Self { r, g, b, a: 1.0 } + } + + pub fn to_color(self) -> Color { + Color::srgba(self.r, self.g, self.b, self.a) + } +} + +impl Default for ColorDesc { + fn default() -> Self { + Self::srgb(0.8, 0.8, 0.8) + } +} + +/// Resolved runtime and legacy-compatible material representation. Project authoring uses +/// `MaterialAsset`/`MaterialInputSet`; hydration maps this descriptor to renderer materials. +#[derive(Component, Reflect, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[reflect(Component, Default, Debug, Serialize, Deserialize)] +#[type_path = "shared::components"] +pub struct MaterialDesc { + #[serde(default)] + pub shader: ShaderRefDesc, + pub base_color: ColorDesc, + pub metallic: f32, + pub roughness: f32, + #[serde(default = "default_emissive_color")] + pub emissive_color: ColorDesc, + #[serde(default)] + pub emissive_intensity: f32, + pub base_color_texture: Option, + #[serde(default)] + pub emissive_texture: Option, + pub normal_map_texture: Option, + pub metallic_roughness_texture: Option, + #[serde(default)] + pub occlusion_texture: Option, + #[serde(default)] + pub material_asset_path: Option, + #[serde(default)] + pub parameters: Vec, + #[serde(default)] + pub textures: Vec, + #[serde(default)] + pub uv_offset: Vec2, + #[serde(default = "default_material_uv_tiling")] + pub uv_tiling: Vec2, +} + +impl MaterialDesc { + pub fn new(base_color: ColorDesc, metallic: f32, roughness: f32) -> Self { + Self { + shader: ShaderRefDesc::default(), + base_color, + metallic, + roughness, + emissive_color: default_emissive_color(), + emissive_intensity: 0.0, + base_color_texture: None, + emissive_texture: None, + normal_map_texture: None, + metallic_roughness_texture: None, + occlusion_texture: None, + material_asset_path: None, + parameters: Vec::new(), + textures: Vec::new(), + uv_offset: Vec2::ZERO, + uv_tiling: Vec2::ONE, + } + } +} + +fn default_material_uv_tiling() -> Vec2 { + Vec2::ONE +} + +fn default_emissive_color() -> ColorDesc { + ColorDesc::srgb(1.0, 1.0, 1.0) +} + +impl Default for MaterialDesc { + fn default() -> Self { + Self::new(ColorDesc::default(), 0.0, 0.65) + } +} diff --git a/crates/shared/src/prefab_overrides.rs b/crates/shared/src/prefab_overrides.rs index a3a59cf..ba4f196 100644 --- a/crates/shared/src/prefab_overrides.rs +++ b/crates/shared/src/prefab_overrides.rs @@ -10,7 +10,10 @@ use bevy::world_serialization::{WorldInstanceReady, WorldInstanceSpawner}; use serde::de::{DeserializeOwned, DeserializeSeed}; use serde::{Deserialize, Serialize}; -use crate::{ActorId, EditorVisibility, HydratedPrefabMember, MaterialDesc, PrefabInstance}; +use crate::{ + ActorId, EditorVisibility, HydratedPrefabMember, MaterialDesc, PrefabInstance, + COMPONENT_MATERIAL_DESC, +}; pub const PREFAB_OVERRIDE_FORMAT_VERSION: u32 = 2; @@ -399,7 +402,7 @@ fn apply_component_override( world.resource_scope(|world, registry: Mut| { let registry = registry.read(); let registration = registry - .get_with_type_path(&component.component_type) + .get_with_type_path(reflected_component_type_path(&component.component_type)) .ok_or_else(|| { format!( "component type `{}` is not registered", @@ -449,7 +452,7 @@ fn apply_property_override( world.resource_scope(|world, registry: Mut| { let registry = registry.read(); let registration = registry - .get_with_type_path(&property.component_type) + .get_with_type_path(reflected_component_type_path(&property.component_type)) .ok_or_else(|| { format!( "component type `{}` is not registered", @@ -489,6 +492,17 @@ fn apply_property_override( }) } +/// Rust's concrete type name follows the owning module after a domain extraction, while saved +/// reflected scene data deliberately keeps its stable public component path. Accept the concrete +/// name emitted by editor authoring without duplicating the type registration. +fn reflected_component_type_path(component_type: &str) -> &str { + if component_type == std::any::type_name::() { + COMPONENT_MATERIAL_DESC + } else { + component_type + } +} + fn deserialize_component( text: &str, registration: &bevy::reflect::TypeRegistration, @@ -633,6 +647,7 @@ mod tests { let value = crate::Primitive { shape: crate::PrimitiveShape::Sphere, size: Vec3::splat(99.0), + ..Default::default() }; let merged = apply_serialized_navigation_property_override( std::any::type_name::(), diff --git a/crates/shared/src/renderer_material.rs b/crates/shared/src/renderer_material.rs index 8acb173..b709a8e 100644 --- a/crates/shared/src/renderer_material.rs +++ b/crates/shared/src/renderer_material.rs @@ -32,23 +32,31 @@ impl From for MaterialRef { } } -/// One stable, named material assignment exposed by a renderer. +/// One stable, named material assignment exposed by any renderable surface. #[derive(Reflect, Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] -pub struct RendererMaterialSlot { +pub struct MaterialSlot { pub id: ComponentInstanceId, pub name: String, - /// Read-only imported default. Clearing `material` returns to this reference. - #[serde(default)] - pub source_material: Option, - /// Explicit shared Material or Material Instance assignment. + /// Actor-owned shared Material or Material Instance assignment. + /// Model defaults and imported source materials remain asset-owned. #[serde(default)] pub material: Option, } -impl RendererMaterialSlot { +impl MaterialSlot { pub fn effective_material(&self) -> Option<&MaterialRef> { - self.material.as_ref().or(self.source_material.as_ref()) + self.material.as_ref() + } + + pub fn hydrated_selection(&self) -> HydratedMaterialSelection { + self.material + .clone() + .map(|reference| HydratedMaterialSelection::Project { + reference, + layer: HydratedMaterialLayer::Actor, + }) + .unwrap_or_default() } } @@ -62,31 +70,36 @@ pub struct OrphanedMaterialAssignment { pub material: MaterialRef, } -/// Material slots shared by static and skinned renderer authoring components. +/// Material slots shared by primitive, static, and skinned authoring components. #[derive(Reflect, Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[reflect(Default, Debug, PartialEq, Serialize, Deserialize)] -pub struct RendererMaterialSet { +pub struct MaterialSlotSet { #[serde(default)] - pub slots: Vec, + pub slots: Vec, #[serde(default)] pub orphaned_assignments: Vec, } -impl RendererMaterialSet { - pub fn slot(&self, id: &ComponentInstanceId) -> Option<&RendererMaterialSlot> { +impl MaterialSlotSet { + pub fn slot(&self, id: &ComponentInstanceId) -> Option<&MaterialSlot> { self.slots.iter().find(|slot| &slot.id == id) } - pub fn slot_mut(&mut self, id: &ComponentInstanceId) -> Option<&mut RendererMaterialSlot> { + pub fn slot_mut(&mut self, id: &ComponentInstanceId) -> Option<&mut MaterialSlot> { self.slots.iter_mut().find(|slot| &slot.id == id) } pub fn effective_material(&self, id: &ComponentInstanceId) -> Option<&MaterialRef> { - self.slot(id) - .and_then(RendererMaterialSlot::effective_material) + self.slot(id).and_then(MaterialSlot::effective_material) } } +/// Source-compatible name retained for the schema-v4 transition. +pub type RendererMaterialSlot = MaterialSlot; + +/// Source-compatible name retained for the schema-v4 transition. +pub type RendererMaterialSet = MaterialSlotSet; + /// Runtime-only property overrides analogous to a material property block. /// /// Blocks never alter shared assets and are deliberately excluded from scene/prefab persistence. @@ -94,9 +107,7 @@ impl RendererMaterialSet { #[reflect(Default, Debug, PartialEq)] pub struct MaterialPropertyBlock { pub slot_id: ComponentInstanceId, - #[reflect(ignore)] pub parameters: Vec, - #[reflect(ignore)] pub textures: Vec, } @@ -107,14 +118,47 @@ pub struct MaterialPropertyBlocks { } /// Runtime ownership/binding marker placed on every hydrated renderer draw entity. +#[derive(Reflect, Debug, Clone, Copy, PartialEq, Eq)] +#[reflect(Debug, PartialEq)] +pub enum HydratedMaterialLayer { + Actor, + Model, +} + +#[derive(Reflect, Debug, Clone, PartialEq, Eq, Default)] +#[reflect(Debug, PartialEq, Default)] +pub enum HydratedMaterialSelection { + Project { + reference: MaterialRef, + layer: HydratedMaterialLayer, + }, + ImportedSource { + reference: MaterialRef, + }, + #[default] + Inherit, +} + +impl HydratedMaterialSelection { + pub fn project_reference(&self) -> Option<&MaterialRef> { + match self { + Self::Project { reference, .. } => Some(reference), + Self::ImportedSource { .. } | Self::Inherit => None, + } + } +} + #[derive(Component, Reflect, Debug, Clone, PartialEq, Eq)] #[reflect(Component, Debug, PartialEq)] -pub struct HydratedRendererMaterialBinding { +pub struct HydratedMaterialSlotBinding { pub owner: Entity, pub slot_id: ComponentInstanceId, - pub effective_material: Option, + pub selection: HydratedMaterialSelection, } +/// Source-compatible name retained for the schema-v4 transition. +pub type HydratedRendererMaterialBinding = HydratedMaterialSlotBinding; + /// Runtime ownership marker consumed by the project terrain-layer renderer. #[derive(Component, Reflect, Debug, Clone, PartialEq)] #[reflect(Component, Default, Debug, PartialEq)] @@ -141,19 +185,28 @@ mod tests { } #[test] - fn explicit_assignment_precedes_imported_source() { - let source = material_ref("source"); + fn slot_contains_only_the_actor_assignment() { let assigned = material_ref("assigned"); let mut slot = RendererMaterialSlot { id: ComponentInstanceId::new("slot:body"), name: "Body".into(), - source_material: Some(source.clone()), material: Some(assigned.clone()), }; assert_eq!(slot.effective_material(), Some(&assigned)); + assert!(matches!( + slot.hydrated_selection(), + HydratedMaterialSelection::Project { + layer: HydratedMaterialLayer::Actor, + .. + } + )); slot.material = None; - assert_eq!(slot.effective_material(), Some(&source)); + assert_eq!(slot.effective_material(), None); + assert_eq!( + slot.hydrated_selection(), + HydratedMaterialSelection::Inherit + ); } #[test] @@ -162,7 +215,6 @@ mod tests { slots: vec![RendererMaterialSlot { id: ComponentInstanceId::new("slot:body"), name: "Body".into(), - source_material: Some(material_ref("source")), material: None, }], orphaned_assignments: vec![], diff --git a/docs/AGENTS.md b/docs/AGENTS.md new file mode 100644 index 0000000..c1fd551 --- /dev/null +++ b/docs/AGENTS.md @@ -0,0 +1,9 @@ +# Documentation subtree rules + +- Read `docs/authority.toml` before treating a document as current. +- Canonical docs describe current behavior; active plans describe incomplete work; accepted ADRs + describe decisions and constraints; evaluations describe dated evidence. +- Historical and superseded documents are not current requirements. +- Do not duplicate detailed contracts across README, guides, plans, ADRs, and tracker bodies. +- Update the smallest canonical surface that owns the changed behavior. +- Run `scripts/codex/docs_audit.py` through the documentation-integrity workflow. diff --git a/docs/README.md b/docs/README.md index 6d94d55..a3a3328 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,14 +1,27 @@ # Project Documentation -Central index for design decisions, mission, and editor framework docs. Agents and contributors should keep this map current—see [`.cursor/rules/documentation.mdc`](../.cursor/rules/documentation.mdc). +Central index for design decisions, mission, editor framework docs, and repository workflow. +Before treating any document as current guidance, read [`authority.toml`](authority.toml). ## Core | Document | Purpose | |----------|---------| +| [authority.toml](authority.toml) | Machine-readable current/plan/evidence/historical/superseded classification | | [mission.md](mission.md) | Why the editor framework exists, principles, audience, non-goals | | [../README.md](../README.md) | Run/build instructions, controls, implementation checklist | +## Repository workflow + +| Document | Purpose | +|----------|---------| +| [workflow/codex-workflow.md](workflow/codex-workflow.md) | Task lifecycle, scope deltas, and completion states | +| [workflow/documentation-policy.md](workflow/documentation-policy.md) | Authority hierarchy, lifecycle classes, and integrity audit | +| [workflow/verification-policy.md](workflow/verification-policy.md) | Fast, slice, and candidate verification tiers | +| [workflow/build-storage-policy.md](workflow/build-storage-policy.md) | Managed Cargo lanes, budgets, and safe pruning | +| [workflow/gitea-tracking-policy.md](workflow/gitea-tracking-policy.md) | Tracker state and mutation boundaries | +| [archive/](archive/) | Preserved non-current documentation records | + ## Architecture Decision Records (ADRs) Immutable-style log of significant decisions. Add a new numbered ADR when changing boundaries, formats, or policies. @@ -59,15 +72,21 @@ Immutable-style log of significant decisions. Add a new numbered ADR when changi | [0042](adr/0042-guarded-editor-shutdown-and-document-savepoints.md) | Guarded native editor exit and canonical per-document clean checkpoints | | [0043](adr/0043-content-addressed-import-fingerprints.md) | Content-addressed imported-source identity and byte-preserving artifact publication | | [0044](adr/0044-sandboxed-fbx-external-texture-dependencies.md) | Sandboxed FBX texture bundles, validation policy, and deduplicated loading | +| [0045](adr/0045-content-workspace-and-material-fallback-contract.md) | Path-agnostic content workspace, registry v3, model material defaults, and DefaultGrid fallback | +| [0046](adr/0046-schema-driven-material-inputs-and-processed-textures.md) | Schema-driven Material inputs, registry v3 Texture settings, ARM packing, and deterministic runtime textures | +| [0047](adr/0047-editor-authored-asset-documents.md) | Editor-dirty asset documents, explicit saves, recovery, and background derived publication | +| [0048](adr/0048-modular-editor-composition-and-debt-ratchet.md) | Thin editor composition, registry-only Inspector dispatch, and automated architecture debt ratchet | +| [0049](adr/0049-penpot-led-editor-visual-system.md) | Penpot-led visual tokens, responsive editor components, Source Sans Pro typography, and picker interaction | ## Editor framework | Document | Purpose | |----------|---------| -| [editor/release-notes.md](editor/release-notes.md) | Editor framework 1.0 baseline | -| [editor/evaluations/](editor/evaluations/) | Acceptance records, screenshots, and Gitea evidence-publishing policy | +| [editor/release-notes.md](editor/release-notes.md) | Historical editor framework 1.0 snapshot | +| [editor/evaluations/](editor/evaluations/) | Dated acceptance evidence and Gitea evidence-publishing policy; not product specification | | [editor/architecture.md](editor/architecture.md) | Viewport / PIE / settings data flow | | [editor/visual-language.md](editor/visual-language.md) | Editor chrome, viewport, selection, gizmo, and visualizer language | +| [editor/design-system.md](editor/design-system.md) | Penpot-led visual tokens, reusable controls, responsive geometry, and material-inspector presentation | | [editor/roadmap.md](editor/roadmap.md) | Phased editor roadmap and status | | [editor/brp.md](editor/brp.md) | BRP automation and authoring-only policy | | [editor/debt-audit.md](editor/debt-audit.md) | Zero-debt phase gates | @@ -83,6 +102,7 @@ Immutable-style log of significant decisions. Add a new numbered ADR when changi | [editor/navigation-authoring.md](editor/navigation-authoring.md) | Bounds/obstacles/areas/links, deterministic bake, overlay, path preview, and runtime queries | | [editor/extensibility.md](editor/extensibility.md) | Static authoring component registration, lifecycle, composition, and history contract | | [editor/material-system.md](editor/material-system.md) | Shared material assets and instances, renderer-slot assignment, Surface evaluators, migration, and diagnostics | +| [editor/content-workspace.md](editor/content-workspace.md) | File-manager content organization, destination-first import, stable IDs, and model material authoring | | [editor/collaborative-file-safety.md](editor/collaborative-file-safety.md) | Guarded authored writes, compact Git/read-only status, conflict recovery, and ownership providers | | [editor/native-dialogs.md](editor/native-dialogs.md) | Non-blocking native dialog acquisition and main-thread result application | | [editor/terrain.md](editor/terrain.md) | Terrain schema, inspector workflow, chunk hydration, collision, and follow-on boundaries | @@ -101,33 +121,20 @@ Immutable-style log of significant decisions. Add a new numbered ADR when changi | [editor/evaluations/scoped-ui-actions/](editor/evaluations/scoped-ui-actions/) | Exact-implementation source and native acceptance evidence for actions invoked during scoped egui rendering | | [editor/evaluations/deterministic-asset-fingerprints/](editor/evaluations/deterministic-asset-fingerprints/) | Source, fresh-checkout, hash-stability, and native acceptance evidence for imported-source fingerprints | | [editor/evaluations/fbx-external-texture-dependencies/](editor/evaluations/fbx-external-texture-dependencies/) | Source, validation, and native acceptance evidence for sandboxed FBX texture dependencies and override states | +| [editor/evaluations/content-workspace-m2/](editor/evaluations/content-workspace-m2/) | Native M2 evidence for Content Browser file-manager selection, context menus, managed-folder visibility, and Details resizing | | [editor/evaluations/production-readiness/](editor/evaluations/production-readiness/) | Current versioned production gate, evidence matrix, candidate commands, soak protocol, and independent sign-off requirements | -## Working plans (not canonical long-term) +## Plans -Detailed milestone and feature plans live in [`.cursor/plans/`](../.cursor/plans/). Promote stable outcomes into ADRs or `docs/` when shipped. +Plans describe desired scope and acceptance, never current implementation truth. Their authoritative +classification is in [`authority.toml`](authority.toml); completed plans are frozen as historical +records instead of being rewritten as status diaries. -| Plan | Topic | -|------|-------| -| `project_roadmap_*.plan.md` | M0–M8 program index | -| `editor_framework_mission_roadmap_*.plan.md` | Editor mission + phased roadmap | -| `project_settings_and_pie_eject_*.plan.md` | M1.5: settings, rendering parity, PIE eject | -| `rendering_unification_*.plan.md` | Unified rendering stack, Hybrid Auto GI, emissive materials | -| `static_mesh_asset_refactor_*.plan.md` | Static mesh renderer, normalized model artifacts, inspector redesign | -| `component_system_refactor_*.plan.md` | Component registry, imported asset refs, collider split, material overrides | -| `jackdaw_feature_roadmap_*.plan.md` | Jackdaw-inspired production roadmap; tracked in Gitea as `BS-JD-*` issues | -| `blacksite_production_readiness_*.plan.md` | M6-M7 reliability, content production, shipping, and acceptance gates | -| `animation_authoring_*.plan.md` | M7 glTF skeletal animation import, preview, controller, and runtime acceptance | -| `navigation_authoring_*.plan.md` | M7 navigation bounds, deterministic bake, diagnostics, preview, and runtime query API | -| `renderer_material_component_foundation_*.plan.md` | Renderer/material slots, skinned pose lifecycle, Surface ABI, and component foundation | -| `source_control_collaboration_safety_*.plan.md` | Exact authored-file guards, observational Git status, conflict recovery, and provider contract | -| `production_readiness_acceptance_*.plan.md` | Release-candidate evidence matrix, blocker sequence, clean-checkout checks, soak, budgets, and independent sign-off | -| `material_library_and_targeted_drop_*.plan.md` | Dedicated Material Library, exact viewport slot/primitive/brush targeting, hover preview, cancel, and grouped history | -| `terrain_material_layers_*.plan.md` | Terrain shared-material layers, normalized weights, blended hydration, and modal painting | -| `operator_invariants_completion_*.plan.md` | Production operator dispatch, interruption, rollback, cleanup, and undo/redo acceptance | -| `editor_sample_regression_pack_*.plan.md` | Five-area sample manifest, editor catalog, deterministic validation, and native regression acceptance | -| `guarded_shutdown_savepoints_*.plan.md` | Native close coordination, asynchronous Save All, and canonical history clean points | -| `fbx_external_texture_dependencies_*.plan.md` | Sandboxed FBX sidecar discovery, import transactions, validation, loader behavior, and Asset Browser states | +Current active plans: + +- [Content workspace and import authoring](../.cursor/plans/content_workspace_and_import_authoring_2026-07-13.plan.md) +- [Production-readiness program](../.cursor/plans/blacksite_production_readiness_2026-07-10.plan.md) +- [Production-readiness acceptance gate](../.cursor/plans/production_readiness_acceptance_2026-07-12.plan.md) ## Crate responsibilities (quick reference) @@ -135,6 +142,7 @@ Detailed milestone and feature plans live in [`.cursor/plans/`](../.cursor/plans crates/protocol/ Tick rate, input intent, message shapes crates/sim/ Fixed-step gameplay; no rendering crates/shared/ Authoring components + hydration +crates/content_pipeline/ UI-independent content catalog, transaction, import, and processing engine crates/game/ Client presentation, GamePlugin, rendering crates/editor/ In-process egui editor, BRP, PIE crates/settings/ Project settings, active/effective render profile contracts diff --git a/docs/adr/0014-unified-viewport-model.md b/docs/adr/0014-unified-viewport-model.md index 079cdb6..c20d6e2 100644 --- a/docs/adr/0014-unified-viewport-model.md +++ b/docs/adr/0014-unified-viewport-model.md @@ -23,6 +23,12 @@ The editor has one primary **Viewport** tab backed by one HDR `ViewportRenderTar transform gizmos, visualizers, and selectable proxies without changing camera ownership. - `Ctrl+G` toggles the grid. - Saved dock layouts containing the old Game View tab are migrated to one Viewport tab. +- Ordinary dock and Inspector resizing mutates the existing HDR Image asset's extent while keeping + its stable asset ID. Egui owns exactly one strong registration for that ID; an exceptional target + replacement or absent/collapsed target explicitly unregisters the previous image. +- The editor host window prefers a non-FIFO presentation path (`AutoNoVsync`) so interactive + NVIDIA/Wayland window resizing cannot wedge the UI behind repeated one-second swapchain-acquire + timeouts. Packaged game windows retain `AutoVsync`. - Multi-viewport support is represented as future-facing state/API shape only; secondary visible viewports remain future work. @@ -32,6 +38,10 @@ The editor has one primary **Viewport** tab backed by one HDR `ViewportRenderTar - Camera ownership is explicit: F8 possession selects player camera vs editor camera; G only hides editor overlays. - The HDR/swapchain invariant remains centralized around one offscreen viewport target. +- Repeated splitter movement has bounded render-target ownership instead of retaining one + full-resolution HDR image per intermediate panel width. +- Repeated native-window resizing remains interactive even when the compositor cannot immediately + supply a FIFO swapchain image; this editor-specific latency choice does not change game VSync. - Future secondary viewports should add viewport-id keyed rects, targets, cameras, and overlay state rather than reintroducing a Scene View/Game View split. - Post-FX and GI on the active viewport camera are owned by `game_hot::rendering::viewport_camera` diff --git a/docs/adr/0035-shared-material-assets-and-renderer-slots.md b/docs/adr/0035-shared-material-assets-and-renderer-slots.md index cf895b7..88460f8 100644 --- a/docs/adr/0035-shared-material-assets-and-renderer-slots.md +++ b/docs/adr/0035-shared-material-assets-and-renderer-slots.md @@ -12,51 +12,81 @@ copies per actor, and left rigged geometry without the same assignment model as Matching imported materials by a display name was also unsafe: names are neither unique nor stable when a model is reimported. -Static and skinned renderers need the same Unity-like authoring contract without sharing their mesh -or hydration components. A project material must be reusable, an instance must express explicit -overrides over one base material, and each renderer must expose stable material slots independently -from its draw or skeleton representation. +Primitives, static renderers, and skinned renderers need the same Unity-like authoring contract +without sharing their geometry or hydration components. A project material must be reusable, an +instance must express explicit overrides over one base material, and every renderable surface must +expose stable material slots independently from its draw or skeleton representation. ## Decision - Project materials use versioned `MaterialAsset` documents. A `MaterialInstanceAsset` references one direct base `MaterialAsset` and stores parameter and texture overrides. Nested material - instances are invalid. + instances are invalid. Schema-driven input storage and processed Texture bindings are defined by + [ADR 0046](0046-schema-driven-material-inputs-and-processed-textures.md). - `MaterialRef` is the assignment type. Its registry UUID and subasset ID are authoritative; `source_path` is a cached loading hint that validation or migration may repair after a move. -- `StaticMeshRenderer` and `SkinnedMeshRenderer` each own a `RendererMaterialSet`. They do not share - a mesh component or hydration path. Each `RendererMaterialSlot` has a stable ID, a presentation - name, a read-only imported `source_material`, and an optional explicit `material` assignment. - Explicit assignment wins; clearing it returns to the imported source material. +- `Primitive`, `StaticMeshRenderer`, and `SkinnedMeshRenderer` own `MaterialSlot` values. Mesh + renderers use a `MaterialSlotSet`; a primitive owns one stable `surface` slot with ID + `slot:primitive:surface`. They do not share a geometry component or hydration path. Each saved + slot has a stable ID, a presentation name, and only an optional actor/prefab `material` + assignment. Model defaults and imported source materials remain asset-owned in model import + metadata and runtime manifests. Clearing an actor assignment returns resolution to those weaker + model-owned layers. - Static draw parts and imported skinned-hierarchy draws bind to material slots by stable IDs. Reimport reconciles by ID only. An explicit assignment whose source slot disappears is retained as an `OrphanedMaterialAssignment`; the editor never silently reconnects it by display name. -- Asset Browser **Apply Material** assigns a shared material or material instance to every material - slot on each selected static or skinned renderer. Renderer inspectors provide per-slot - Browse/Select/Locate/Clear controls and expose orphan warnings. -- `HydratedRendererMaterialBinding` identifies each runtime draw's owner, slot, and effective - material. A skinned renderer material-only edit patches the instantiated hierarchy without - reloading its source hierarchy or joints. +- Asset Browser **Apply Material** assigns a shared material or material instance to a selected + primitive surface or every material slot on each selected static/skinned renderer. One inspector + widget provides drag/drop, Browse/Locate/Clear, inherited status, expandable shared parameters, + exact-slot extraction, and orphan diagnostics. +- `HydratedMaterialSlotBinding` identifies each runtime draw's owner and exact slot. + `HydratedMaterialSelection` carries Project Actor, Project Model, Imported Source, or Inherit + ownership without copying model defaults into the scene. A skinned renderer material-only edit + patches the instantiated hierarchy without reloading its source hierarchy or joints. - `MaterialPropertyBlocks` are runtime-only, per-slot overrides. They do not mutate a shared asset and are excluded from scene and prefab persistence. Persisting a reusable variation requires an explicit material instance. -- Scene schema v4 migrates legacy renderer assignments into `RendererMaterialSet`. Project material, - material-instance, shader-schema, and scene rewrites are performed by the explicit transactional - `cargo upgrade-project` command; ordinary loading remains read-only. +- Model assets may provide a project Material/Instance default between their imported source and a + scene/prefab assignment. The terminal fallback chain and immutable DefaultGrid contract are owned + by [ADR 0045](0045-content-workspace-and-material-fallback-contract.md). +- Effective precedence is runtime MaterialPropertyBlock, scene/prefab assignment, model-asset + default, imported source, project default, then built-in DefaultGrid. A configured but broken + authored reference uses the fallback with diagnostics instead of silently exposing another + authored layer. +- Repository scenes use schema v6, where renderable slots persist actor/prefab assignments only. + This pre-production project updates its fixtures directly. The explicit project upgrader remains + available for legacy primitive `MaterialDesc`, mesh-wide descriptors, and per-slot + `MaterialOverride` values: it deduplicates canonical descriptors as deterministic project + Materials under `assets/materials/migrated/` and rewrites project references transactionally. + Ordinary loading remains non-writing. ## Consequences -- Static and skinned renderers have a consistent material-slot workflow while retaining distinct - geometry ownership and hydration behavior. +- Primitives, static renderers, and skinned renderers have one material-slot workflow while + retaining distinct geometry ownership and hydration behavior. - An assignment remains a reference rather than a copied material value, so editing or replacing a shared asset does not create actor-local material copies. Material/base/schema/evaluator dependency revisions update the shared runtime handle in place across all assigned slots. - Source reimport cannot silently move an override to the wrong draw. Orphans require an explicit user decision to reassign or discard. -- Legacy primitive/actor `MaterialDesc` paths remain compatibility paths until their consumers move - to renderer slots; new mesh-renderer work uses shared references. -- `MaterialPropertyBlocks` currently define the runtime-only schema and persistence exclusion, but - renderer application and the editor promote-to-instance transaction are not implemented. Gitea - #53 owns that complete workflow; callers must not treat the component as visibly applied yet. -- Material graph authoring, nested instances, blended/transmissive materials, and a generalized - per-renderer property-block inspector are outside this decision. +- Component-form `MaterialDesc` is restricted to the brush fallback compatibility path. It is not + addable to primitives or mesh renderers, does not override their slots, and never causes a + primitive-local runtime material allocation. Unmigrated actor material components produce an + upgrade diagnostic and visible fallback. +- `MaterialPropertyBlocks` define the runtime-only schema and persistence exclusion. Runtime + application clones and caches the resolved Standard or Surface material per owner/slot, above + direct-base Material Instance values. An invalid block leaves the resolved base visible and emits + a deduplicated diagnostic instead of applying a partial override. Promotion to a reusable + instance uses an explicit target-path review and source/target fingerprint guards, assigns one + exact slot through history, and clears the block only after the file, registry, and scene + transaction succeeds. It may never use DefaultGrid as its base. The editor registers the + component with reflection for trusted local BRP runtime injection and native promotion testing; + that registration does not add it to authoring persistence or the Inspector component registry. +- Material graph authoring, nested instances, and blended/transmissive materials are outside this + decision. + +Scene schema v6 stores only the actor/prefab assignment in a renderable slot. Model defaults and +imported source selections remain model-owned, and hydration carries their origin through +`HydratedMaterialSelection`. Live project resolution is owned solely by the overlay/cache boundary +in [ADR 0047](0047-editor-authored-asset-documents.md); shared slot presentation follows +[ADR 0048](0048-modular-editor-composition-and-debt-ratchet.md). diff --git a/docs/adr/0036-surface-abi-and-solari-parity.md b/docs/adr/0036-surface-abi-and-solari-parity.md index fa4926e..a90a222 100644 --- a/docs/adr/0036-surface-abi-and-solari-parity.md +++ b/docs/adr/0036-surface-abi-and-solari-parity.md @@ -31,6 +31,8 @@ lighting, fog, shadows, and render-pipeline bindings under engine ownership. `SurfaceInput` provides UV0, world position, and world normal. `Surface` returns base color, tangent-space normal, emissive, metallic, perceptual roughness, reflectance, occlusion, alpha, and lit/unlit model selection. +- The schema-driven authoring inputs and canonical processed Texture/ARM artifacts feeding this ABI + are defined by [ADR 0046](0046-schema-driven-material-inputs-and-processed-textures.md). - The ABI has 16 `vec4` parameter lanes, eight sampled 2D texture slots with UV transforms, and a 400-byte `SurfaceUniform`. Shader schemas map typed Bool/Float/Vec2/Vec3/Color/Enum properties and texture properties into that fixed layout. Exceeding either limit is a validation error. diff --git a/docs/adr/0037-collaborative-authored-file-safety.md b/docs/adr/0037-collaborative-authored-file-safety.md index b0c7b24..131ac73 100644 --- a/docs/adr/0037-collaborative-authored-file-safety.md +++ b/docs/adr/0037-collaborative-authored-file-safety.md @@ -51,3 +51,5 @@ provider. - Native filesystem replacement cannot coordinate with unrelated writers that ignore advisory conventions after Blacksite's final revision check; the narrow check-to-rename interval is the platform boundary, and deterministic race hooks cover the editor-controlled interval. +- [ADR 0047](0047-editor-authored-asset-documents.md) applies these guards at explicit asset Save + boundaries; interactive parameter edits never enter the authored-file publication path. diff --git a/docs/adr/0042-guarded-editor-shutdown-and-document-savepoints.md b/docs/adr/0042-guarded-editor-shutdown-and-document-savepoints.md index 15a7a8b..74bbce9 100644 --- a/docs/adr/0042-guarded-editor-shutdown-and-document-savepoints.md +++ b/docs/adr/0042-guarded-editor-shutdown-and-document-savepoints.md @@ -55,3 +55,5 @@ tabs switch, while saves may establish a clean point in the middle of a timeline direct non-history repairs, entity respawns, and tab switches. - Operating-system process kill and power loss cannot be confirmed; recovery and abnormal-session handling remain the safety boundary for those cases. +- [ADR 0047](0047-editor-authored-asset-documents.md) extends the guarded decision to dirty asset + documents and project settings while derived processing remains resumable after source save. diff --git a/docs/adr/0044-sandboxed-fbx-external-texture-dependencies.md b/docs/adr/0044-sandboxed-fbx-external-texture-dependencies.md index 76fab6f..703f454 100644 --- a/docs/adr/0044-sandboxed-fbx-external-texture-dependencies.md +++ b/docs/adr/0044-sandboxed-fbx-external-texture-dependencies.md @@ -16,8 +16,8 @@ paths more than once. Import, manifest generation, project validation, editor previews, and the runtime loader must agree on one dependency graph. That graph also crosses a security boundary: an imported source must not read or copy a parent-traversing path or an arbitrary absolute path outside its bundle. A missing -source texture is required when Source Materials is active, but it can be an intentional authoring -condition when an asset explicitly uses Authoring Override. +source texture is required when any stable model slot selects Source, but it can be an intentional +authoring condition when every slot selects a project Material/Instance or Default. ## Decision @@ -36,8 +36,10 @@ loader warning instead of deferred asset-server requests. Static-mesh manifests are the authoritative model import dependency graph. Their existing `source.dependencies` list records every parsed FBX external texture, including unavailable files. Project validation checks that list without loading native assets. Missing FBX textures are a -blocking consolidated finding under Source Materials and an informational consolidated finding -under Authoring Override. Unsafe paths remain blocking under either policy. Model registry records +blocking consolidated finding while any slot selects Source and an informational consolidated +finding when every slot selects Project/Default. The former whole-model Authoring Override value is +accepted only as registry-v1 migration input and expands to explicit Default selections. Unsafe +paths remain blocking under either selection state. Model registry records mirror the list for editor details, but validation does not duplicate it when a generated static manifest exists. @@ -50,16 +52,17 @@ Unreferenced `.fbm` contents are not copied. The Asset Browser renders FBX model and mesh thumbnails through the neutral direct mesh path. Source-material thumbnails preflight the authoritative dependency resolver first and cache one non-retryable actionable failure when required textures are unavailable. Dependency rows expose -present/missing state. The committed painted-chair fixture uses Authoring Override deliberately and -remains untextured; its three source paths stay visible in manifests, validation, and asset details. +present/missing state. The committed painted-chair fixture's legacy Authoring Override migrates to +per-slot Default selections and remains untextured; its three source paths stay visible in +manifests, validation, and asset details. ## Consequences - FBX sibling `textures/` and `.fbm/` bundles import and validate with identical normalized paths. - Missing texture files are visible before native loading and cannot create repeated Bevy asset-server errors. -- Source Materials fails release validation when its FBX textures are absent. Authoring Override - remains release-valid but retains an informational dependency finding. +- Any Source slot fails release validation when its FBX textures are absent. An all-Project/Default + model remains release-valid but retains an informational dependency finding. - Absolute exporter paths, traversal attempts, and destination symlink redirects cannot read or copy arbitrary host files. - FBX files with external textures are parsed twice during loading so no non-`Send` ufbx scene diff --git a/docs/adr/0045-content-workspace-and-material-fallback-contract.md b/docs/adr/0045-content-workspace-and-material-fallback-contract.md new file mode 100644 index 0000000..883282c --- /dev/null +++ b/docs/adr/0045-content-workspace-and-material-fallback-contract.md @@ -0,0 +1,90 @@ +# ADR 0045: Content Workspace and Material Fallback Contract + +## Status + +Accepted + +## Context + +Blacksite's Content Browser scans the project `assets/` tree, but authored RON type detection and +import destinations still depend on conventional folders. The asset registry is editor-owned and +serialized as an unversioned record list, so validation, packaging, runtime hydration, and future +headless processing duplicate parts of its contract. Imported model materials are either read-only +source defaults or scene-level assignments; a model asset cannot own editable project defaults. + +Missing renderer materials currently create separate magenta `StandardMaterial` values, while +skinned, primitive, brush, terrain, thumbnail, raster, and Solari paths use different fallback +rules. A missing or broken material therefore does not have one predictable, production-safe +result. + +## Decision + +- User-authored content may live in any normal nested folder beneath the project `assets/` root. + Folder names are organizational only. External absolute linked assets are not supported. +- `AssetId` is authoritative identity. Project-relative paths and labels are repairable cached + metadata. Moves and reimports reconcile by stable IDs and never by display name. +- Registry contracts move to `shared::content`: typed asset kinds, versioned registry documents, + project content defaults, import settings, model material policies, and runtime catalog records. + UI-independent filesystem scanning, classification, transaction planning, import/reimport, and + processing live in a `content_pipeline` crate used by the editor, validator, watcher, and xtask. +- Registry schema v3 is `AssetRegistryDocument { schema_version, defaults, records }` with typed + Model/Texture import settings as extended by [ADR 0046](0046-schema-driven-material-inputs-and-processed-textures.md). The source + registry remains editor-managed under `assets/.index/`; packages receive a stripped runtime + catalog without editor import provenance or source-only dependencies. +- Project content roots normalize to `assets/`. `.index`, `.trash`, thumbnails, recovery data, and + implementation-owned derived artifacts are hidden and protected from normal file operations. +- Fixed-folder consumers are retired or explicitly constrained as follows: + + | Consumer | Current contract / migration | + |----------|------------------------------| + | Project settings and templates | `asset_roots` upgrades to exactly `["assets"]`; the explicit project upgrader performs the write. | + | Content Browser and registry scanner | Walk all user-managed descendants and classify by extension plus document schema, never by parent folder. | + | Material, shader, model, audio, level, and prefab lookup | Resolve the registry's stable ID to its current path; a cached path is a repair hint only. | + | Scene/prefab validation and hydration | Consume registry/runtime-catalog resolution rather than conventional authoring directories. | + | Packaging and headless processing | Scan the same content root and publish the same stripped catalog and normalized model manifests. | + | Material creation UX | The current browser folder is authoritative; `assets/materials/` remains only a Material Library convenience default. | + | Generated mesh, animation, navigation, thumbnail, trash, and index data | Their fixed implementation-owned locations remain hidden managed storage, excluded from user classification and ordinary file operations. | + +- Model material selections are per stable slot: Source, Project Material/Instance, or Default. + Extracting a source material creates an ordinary project Material and then stores a Project + selection. Re-extraction may replace a provenance-matched Material only after an explicit diff + and fingerprint-guarded Apply decision; Create New remains available and unrelated provenance is + never overwritten. Reimport retains removed project assignments as explicit orphans. +- Effective material precedence, strongest first, is: runtime MaterialPropertyBlock, scene/prefab + assignment, model-asset default, imported source, project default, built-in DefaultGrid. Missing + layers inherit downward. A configured but broken authored reference renders the fallback and + reports the broken layer rather than silently revealing a different authored layer. +- Primitive surfaces participate in that same chain through their saved + `slot:primitive:surface`; they no longer hydrate from a separate actor-local descriptor. Static + and skinned draws bind their exact saved slot IDs through the same runtime binding contract. +- DefaultGrid is immutable engine content compiled into the renderer. It is a shared, + UV-independent world-space checker with raster/Solari parity and a neutral StandardMaterial + emergency path. A project may choose a Material/Instance fallback; clearing or breaking it + returns to DefaultGrid. Terrain retains its specialized layer fallback. +- Built-in DefaultGrid is not editable, instanceable, or a valid MaterialPropertyBlock promotion + base. Promotion requires a resolved project or imported Material base. +- Ordinary editor/runtime loading is read-only. Registry, project-settings, and scene migrations + run only through the explicit transactional project upgrader. + +## Consequences + +- Editor, runtime, validation, packaging, watcher, and headless processing share one content model + and one stable-ID resolver. +- Arbitrary organization no longer changes asset type, runtime behavior, or package inclusion. +- The content pipeline becomes a reusable crate boundary instead of an editor implementation + detail; this adds one workspace crate and moves registry types out of `editor`. +- Older registries, conventional asset roots, global model material policy, and legacy mesh material + overrides require the explicit transactional upgrader; normal loading accepts current schemas. +- Broken assignments stay visible and diagnosable, but may look different from their previous + imported source because failure uses the project/engine fallback deliberately. +- One cached DefaultGrid/emergency handle covers repeated primitive and mesh hydration, so missing + assignments do not grow the material asset stores. +- Thumbnail cache ownership includes the backing Egui image registration. Replacement, retry, and + catalog invalidation explicitly release the last registration before a new studio render owns + the key, preventing refresh-driven GPU resource growth. +- File operations and imports must be staged transactions that update authored references, + registry state, derived manifests, and runtime catalogs together. +- Ordinary asset-property edits use the explicit dirty-document and two-phase publication boundary + defined by [ADR 0047](0047-editor-authored-asset-documents.md); topology transactions remain immediate. +- Scene schema v6 carries actor/model/imported/inherit origin explicitly at hydration time, so a + broken authored layer uses DefaultGrid instead of accidentally revealing a weaker layer. diff --git a/docs/adr/0046-schema-driven-material-inputs-and-processed-textures.md b/docs/adr/0046-schema-driven-material-inputs-and-processed-textures.md new file mode 100644 index 0000000..a4ad1b1 --- /dev/null +++ b/docs/adr/0046-schema-driven-material-inputs-and-processed-textures.md @@ -0,0 +1,55 @@ +# ADR 0046: Schema-driven material inputs and processed textures + +## Status + +Accepted + +## Context + +The first Material asset format stored a resolved `MaterialDesc` plus a second generic parameter +list. The editor consequently rendered Standard Lit twice, could not pair a scalar or color with its +texture, and had no stable place to describe future shader-graph inputs. Texture files also carried +no import intent, so color maps, normals, and packed mask data could be sampled interchangeably. + +## Decision + +Material, direct-base Material Instance, and Shader Schema documents use schema v2. +`MaterialInputSchema` is the presentation and validation contract for built-in Standard Lit, +custom Surface evaluators, and future generated shaders. `MaterialInputSet` is the only authored +value/texture store; instance sets remain sparse. Scalar texture bindings select R, G, B, or A, +and scalar values multiply the sampled value. Standard Lit pairs Base Color with albedo, Metallic +and Roughness with scalar maps, Occlusion with a scalar map, and Emissive Color/Intensity with an +emissive map. + +The registry uses v3 `AssetImportSettings`, with typed Model and Texture settings. Texture settings +own semantic, color space, mip policy, compression, size limit, filtering, wrapping, anisotropy, +and normal convention. One GPU-free processor is called by editor publication, imports, the +watcher refresh path, and `cargo process-assets`. It writes content-addressed UASTC Basis or +uncompressed KTX2 artifacts below `assets/.import-cache/runtime/`, records sampler/color-space data +in runtime catalog v2, and canonicalizes authored AO/Roughness/Metallic selections to R/G/B ARM. +Source images remain editable and unchanged. Processing computes the normalized content key before +image decode or compression. An existing artifact at that key is reused directly, so validation and +catalog repair do not recompress unchanged Texture or packed-Material inputs. + +The actor inspector and asset editors consume the same schema-driven controls. A renderable owns +one compact material-slot header; expanding it edits the resolved shared Material or Instance. +Slot provenance and diagnostics live outside parameter rows. Valid authoring changes refresh the +shared runtime handle immediately but only mark the asset document dirty. Explicit save uses the +two-phase source/derived boundary from [ADR 0047](0047-editor-authored-asset-documents.md), without +recompiling an unchanged Surface evaluator or scheduling a project-wide watcher pass. + +This is an intentional foundation break. Normal loading accepts current documents only; explicit +`cargo upgrade-project --project --apply` converts the repository's v1/v2 documents and +backs up every replaced file transactionally. + +## Consequences + +- Shader additions no longer require bespoke inspector layout code when their schema can describe + the input. +- Color-space and packed-channel choices are deterministic in editor, CI, and packages. +- Cached content-addressed artifacts keep `process-assets --check` and unchanged dependency refreshes + on the source-hash/catalog path instead of the image-compression path. +- Runtime and Solari receive the same canonical input mapping. +- Changing a Texture setting can invalidate dependent packed Material artifacts. +- The future node-graph compiler must emit this schema and Surface WGSL; graph authoring itself is + outside this decision. diff --git a/docs/adr/0047-editor-authored-asset-documents.md b/docs/adr/0047-editor-authored-asset-documents.md new file mode 100644 index 0000000..e685725 --- /dev/null +++ b/docs/adr/0047-editor-authored-asset-documents.md @@ -0,0 +1,71 @@ +# ADR 0047: Editor Authored-Asset Documents and Two-Phase Publication + +## Status + +Accepted + +## Context + +Material controls previously updated the viewport immediately but also wrote source when a pointer +interaction ended. That publication could trigger file guards, Git refresh, watcher work, +thumbnail invalidation, and whole-project processing on the editor frame thread. A slider release +therefore behaved like an implicit save and could freeze the editor. + +Project RON files and registry metadata are already suitable authoritative source documents. The +editor needs a fast, durable edit boundary without adding an opaque asset database or conflating +editor-dirty documents with source-control status. + +## Decision + +The editor owns an `AuthoredAssetDocumentStore` keyed by stable asset ID and document kind. It +holds clean and current values, source path, loaded file revision, editor revision, publication +error, recovery state, and derived-processing state for Materials, Material Instances, model import +settings, Texture import settings, and project content defaults. + +Interactive controls mutate the current document and `blacksite_surface`'s stable-ID-keyed +`LiveMaterialDocumentOverlay` in the same tick. `SurfaceMaterialCache` is the sole owner of project +Material and Material Instance handles; resolution is overlay-first and disk-second. Controls +perform no source write, watcher refresh, Git query, thumbnail invalidation, or derived processing, +including when the pointer is released. Dirtiness is derived from `current != clean` and remains +distinct from Git `MODIFIED`, `UNTRACKED`, and `CONFLICT` state. + +The cache never polls file metadata or reparses a project Material for every bound entity. Explicit +Save and accepted watcher events invalidate the disk generation once; interactive overlay +revisions mutate the existing cached handle in place. Imported glTF/FBX source materials stay on +their AssetServer-owned path and do not enter the project-material resolver. + +`Ctrl+S` saves the last edited context. `Ctrl+Shift+S` and **File > Save All** save every dirty +scene, authored asset document, and project setting. Source publication remains guarded and atomic. +Registry-backed documents use a clean registry baseline plus per-document overlays so saving one +setting cannot publish another unsaved setting. + +Successful source publication advances the clean value, then classifies its +`DerivedProcessingImpact`. Scalar, color, emissive, shader-value, label, and render-state Material +changes queue no derived work. ARM/ORM texture or channel changes queue material packing; Texture +settings, model settings, and project defaults queue only their exact dependency closure. Packing +signatures exclude scalar multipliers and are checked before image decoding so an existing +content-addressed artifact can be reused. The previous valid runtime artifact remains authoritative until replacement +publication succeeds; a processing failure is reported separately and does not make saved source +dirty again. Stale job completions are ignored. + +Dirty asset documents receive editor-local recovery snapshots after two seconds of inactivity, +with five generations retained outside `assets/`. Startup restoration never overwrites source: a +changed source fingerprint restores the document as an external conflict. Guarded shutdown and +project switching count scenes, assets, and project settings in the same Save All / Discard / +Cancel decision. Returning a document exactly to its clean value retires any older recovery +generation on the next editor tick. Startup also discards a recovery envelope whose value already +matches authoritative source, covering a crash between the clean edit and that cleanup tick. + +## Consequences + +- Parameter editing and pointer release stay frame-local and responsive. +- Material and direct-base Instance users share one stable live handle authority instead of + competing editor and renderer caches. +- Saving source and generating derived artifacts are observable, independent phases. +- The project remains plain, reviewable RON plus source assets; no asset binary database is added. +- Unsaved editor state survives selection changes and can be recovered after a crash without + affecting Git until the user saves. +- Packaging and read-only processing validation must reject required pending or failed derived + work rather than silently packaging stale content. +- Import, extract, create, rename, move, and delete remain explicit immediate transactions because + they create or remove project identity. diff --git a/docs/adr/0048-modular-editor-composition-and-debt-ratchet.md b/docs/adr/0048-modular-editor-composition-and-debt-ratchet.md new file mode 100644 index 0000000..a7a6fda --- /dev/null +++ b/docs/adr/0048-modular-editor-composition-and-debt-ratchet.md @@ -0,0 +1,52 @@ +# ADR 0048: Modular Editor Composition and Architecture-Debt Ratchet + +## Status + +Accepted + +## Context + +The Content Browser and Inspector accumulated unrelated navigation, rendering, import, material, +transaction, and component-card behavior in files thousands of lines long. That made small changes +high-risk, encouraged duplicate UI, and obscured ownership. ADR 0012 states a zero-debt intent but +did not provide an enforceable point-of-change budget. + +## Decision + +Editor panels are composed from thin shells, domain modules, and UI-independent services. The +Inspector delegates every visible built-in component through `EditorComponentRegistry`; a +hard-coded type dispatcher is not a second authority. Material slot presentation uses a shared +view-model/action contract, and Content Browser and Material Library cards use one bounded asset +card/status model. + +The machine-readable policy is `.codex/architecture.toml`. Its audit enforces 500 nonblank lines +for UI shells, 800 for other UI modules, and 1,200 for other production Rust modules. Existing +over-limit modules have frozen ceilings. A temporary exception requires a tracker issue, rationale, +hard maximum, extraction target, and expiry milestone. Selective verification and candidate CI run +the audit. + +The M2 extraction is tracked by Gitea #68. The Content Browser and Inspector shells are now below +the 500-line budget, their domain behavior lives in bounded submodules, and no temporary #68 +exception is active. Closing the issue still requires the selective and native acceptance evidence +defined by the milestone. + +The Penpot-led material-inspector refinement remains inside #68's shared-UI scope. The reusable +visual primitives live in `ui/design_system`, while `ui/materials` owns the action-returning domain +panel. This keeps authored visual policy separate from Inspector world access and prevents the +first design-system migration from rebuilding a panel monolith. ADR 0049 owns the visual contract. + +## Consequences + +- New behavior is added through a sustainable extension seam instead of enlarging a monolith. +- Shrinking an over-limit module is always accepted; regrowth above its frozen baseline fails. +- Passing the audit is a no-regression statement; issue closure additionally requires functional + and native evidence for the extracted seams. +- Architecture work remains visible in the same tracker and milestone as the feature that exposes + it. +- ADR 0034 owns registry-driven component semantics; this ADR owns editor composition and the + mechanical debt guard. + +Related decisions: [ADR 0012](0012-zero-tech-debt-editor.md), +[ADR 0034](0034-registry-driven-authoring-components.md), and +[ADR 0047](0047-editor-authored-asset-documents.md), and +[ADR 0049](0049-penpot-led-editor-visual-system.md). diff --git a/docs/adr/0049-penpot-led-editor-visual-system.md b/docs/adr/0049-penpot-led-editor-visual-system.md new file mode 100644 index 0000000..72a6c62 --- /dev/null +++ b/docs/adr/0049-penpot-led-editor-visual-system.md @@ -0,0 +1,119 @@ +# ADR 0049: Penpot-Led Editor Visual System + +## Status + +Accepted + +## Context + +Blacksite's editor controls evolved inside individual panels. Even after the material data and +Inspector composition became shared, local egui styling still produced inconsistent spacing, +typography, interaction states, and narrow-panel behavior. The Penpot **Inspector Material Slot** +provides an authored reference for the visual language rather than another implementation-specific +mock-up. + +## Decision + +The Penpot **Inspector Material Slot** is the source of truth for geometry, type roles, control +heights, radii, spacing, property-column geometry, and interaction states. Color is semantic rather +than panel-owned: Penpot's Assets / Colors library and `editor::ui::theme::EditorVisualPalette` +name the same roles, with Blacksite's existing palette as the default. A later Editor Settings slice +may select or override that palette without changing widgets or material behavior. At the 620 px +reference width, implementations match the documented geometry. Below that width, controls deliberately +reflow instead of shrinking, clipping, scrolling horizontally, or hiding required state. + +Fixed Penpot sections use deterministic geometry models rather than nested egui flow layouts. +Surface, parameter rows, texture fields, UV groups, and Advanced each receive an owning rectangle; +every child rectangle is derived from it and clipped to it. The 569 px and 369 px section widths +encode the exported wide and compact references. A bounded transient mode below 372 px keeps all +rectangles finite, stacks the row, and collapses low-frequency texture actions into overflow while +the Inspector restores its 420 px minimum. + +The reusable implementation lives under `editor::ui::design_system`. It consumes the editor-owned +semantic palette and owns spacing tokens, Source Sans Pro Regular/Bold typography roles, section chrome, property grids, +asset and texture fields, segmented controls, switches, status presentation, and the Blacksite +color picker. Domain widgets consume these primitives instead of copying raw colors or absolute +Penpot coordinates. + +Material authoring is the first migrated domain. One action-returning `MaterialsSection` is used by +primitive, static-mesh, and skinned-mesh inspectors. It owns an ordered list of collapsible +`MaterialSlotPanel` models, and every returned action carries its stable slot ID. The widgets do not +query or mutate arbitrary world state. +Supported material behavior only is shown. Asset identity, health, inheritance, dirty state, and +read-only state share one geometry, while stable IDs and fingerprints remain in secondary +diagnostics. + +The final Penpot component supersedes the earlier v2.2/v2.3 geometry. A 32 px **Materials** heading +precedes repeated slots. Expanded slot headers are 82 px with a 64 px preview; collapsed headers +are 52 px with a 32 px preview. A cyan disclosure spine and **PARAMETERS** ownership label inset the +Surface, Inputs, UV, and Advanced body. The asset identity block owns the single Shader selector. Penpot's former duplicate Surface +"Shading Model" selector was removed from the component and every state reference in handoff +v2.3.1. Surface contains blend mode, Separate/ORM selection, and Double Sided. UV +precedes Advanced with +an explicit 8 px section gap. Advanced render controls +that do not yet have renderer contracts are shown only as a clearly disabled preview: they emit no +actions and create no authored or runtime state. + +The Material slot header is one assignment interaction, not an identity block beside a second drop +box. Its whole 596 x 82 px wide reference area accepts valid Material/Instance drops. Preview and +identity clicks plus the first-class Browse action open the compact current/recent Penpot menu; +Shader, Locate, Clear, +and overflow actions are isolated and cannot accidentally open it. The picker returns a stable +asset reference to the owning Inspector instead of mutating scene or world state. + +The custom 420 x 350 color popup is a fixed modal centered over its owning Inspector clip, with an +Inspector-local dim layer rather than application- or viewport-relative placement. Its header, +mode tabs, wheel and values regions, RGBA byte fields, HSV degree/percentage fields, HEX copy, +checkerboard alpha control, recents, and footer use the exported Penpot coordinates. The exported +eyedropper lane remains a tooltip-labelled disabled preview until screen sampling has an owned +runtime contract. Apply keeps the in-memory dirty value and closes; Cancel, Escape, Close, or +outside dismissal restores the exact pre-open value. Neither path saves source or schedules derived +processing. + +Standard Lit declares seven independently stored inputs but six primary presentation rows. +`emissive_intensity` is a schema companion of `emissive_color`; the Emissive popup previews and +restores both values as one interaction without merging their authored/runtime identities. Custom +shader binding counts likewise count primary rows while rendering companions through their owner. + +Bounded scalar material inputs use one 132 px control composed from a 78 px track, 6 px gap, and +48 x 22 numeric field. Expanding the 178 px Advanced preview requests a bounded +Inspector scroll reveal so its note and lower boundary are visible. The same no-implicit-persistence +rule applies to sliders, texture assignments, and shader controls. + +Inspector overflow is part of the shared visual contract. A floating scrollbar keeps component +width stable as content crosses the vertical overflow threshold, and every nested component clip is +an intersection with the owning Inspector body. Ready texture fields use the typed thumbnail as +their sole leading identity; generic image glyphs are reserved for empty states. + +Standard Lit exposes one shared UV Offset/Tiling transform through the same schema-driven input +document. The renderer maps it to Bevy StandardMaterial UV transforms and to every Surface ABI +texture lane. Material Instances may override it sparsely; resetting an instance restores its base. + +Penpot's `CODEGEN MAP` and handoff annotations are design documentation. Runtime egui layout remains +responsive and semantic; generated SVG or code is not copied into production. Reviewed numeric +geometry is represented by small testable layout models instead of ad hoc child flow or generated +widget trees. +The same release slice applies the active Inspector Header, Array Header, renderer-panel, asset +field, vector, selection, and overlay components across the Inspector. Built-in component cards +dispatch through the registry and share one clipped actor-body scroll owner; domain behavior stays +outside the visual primitives. + +## Consequences + +- New editor UI has one reviewed visual vocabulary rather than panel-local approximations. +- Theme colors have one runtime owner and one design-side asset vocabulary; the material panel does + not carry a private blue/teal palette. +- The 620 px and 420 px geometries are deterministic and unit-testable. The Inspector has a 420 px + floor and one actor-body scroll region; material slots never introduce nested scrolling. +- Unsupported prototype controls are omitted until their runtime contracts exist. +- The explicitly approved Advanced preview is the sole exception: it is disabled, muted, and + labelled as planned work rather than functioning authoring state. +- Native acceptance compares rendered geometry, typography, states, and interaction behavior with + the Penpot reference; compile-only evidence is insufficient. +- Source Sans Pro and its SIL Open Font License are bundled with the editor. +- ADR 0048 continues to own composition and module-size policy. This ADR owns visual tokens, + responsive component geometry, and interaction presentation. + +Related decisions: [ADR 0035](0035-shared-material-assets-and-renderer-slots.md), +[ADR 0047](0047-editor-authored-asset-documents.md), and +[ADR 0048](0048-modular-editor-composition-and-debt-ratchet.md). diff --git a/docs/archive/README.md b/docs/archive/README.md new file mode 100644 index 0000000..2d118ab --- /dev/null +++ b/docs/archive/README.md @@ -0,0 +1,9 @@ +# Documentation Archive + +This directory preserves documents that retain provenance or evidentiary value but no longer belong +in a live topic tree. Archived documents are historical, not current guidance, and must retain an +obvious historical banner linking the relevant canonical document. + +Moving a record here does not change architecture or product behavior. Classify it in +`docs/authority.toml`, preserve useful dates and commit references, and update the live index rather +than copying its detailed contract into multiple places. diff --git a/docs/authority.toml b/docs/authority.toml new file mode 100644 index 0000000..67f30b2 --- /dev/null +++ b/docs/authority.toml @@ -0,0 +1,307 @@ +version = 1 +classifications = ["current", "active-plan", "evidence", "historical", "superseded"] +roles = ["overview", "canonical", "architecture", "active-plan", "evidence", "historical", "superseded"] + +[discovery] +paths = ["README.md"] +trees = ["docs", ".cursor/plans"] + +# Rules are deterministic: the highest priority matching rule wins. Equal-priority +# matches must agree. Repository-root paths are used throughout. + +[[rules]] +id = "root-readme" +path = "README.md" +classification = "current" +role = "overview" +topics = ["project-overview", "user-workflow"] +priority = 100 + +[[rules]] +id = "documentation-default" +prefix = "docs/" +classification = "current" +role = "canonical" +priority = 10 + +[[rules]] +id = "accepted-adrs" +prefix = "docs/adr/" +classification = "current" +role = "architecture" +priority = 20 + +[[rules]] +id = "superseded-render-timeout-adr" +path = "docs/adr/0019-local-bevy-render-timeout-patch.md" +classification = "superseded" +role = "superseded" +replacement = "docs/adr/0022-bevy-0-19-upgrade.md" +priority = 100 + +[[rules]] +id = "superseded-component-spec" +path = "docs/editor/Bevy_Editor_Component_System_Spec.md" +classification = "superseded" +role = "superseded" +replacement = "docs/adr/0034-registry-driven-authoring-components.md" +priority = 100 + +[[rules]] +id = "historical-release-notes" +path = "docs/editor/release-notes.md" +classification = "historical" +role = "historical" +replacement = "docs/README.md" +priority = 100 + +[[rules]] +id = "active-editor-debt-gate" +path = "docs/editor/debt-audit.md" +classification = "active-plan" +role = "active-plan" +topics = ["editor-debt", "production-readiness"] +priority = 100 + +[[rules]] +id = "evaluation-records" +prefix = "docs/editor/evaluations/" +classification = "evidence" +role = "evidence" +replacement = "docs/README.md" +priority = 30 + +[[rules]] +id = "evaluation-index" +path = "docs/editor/evaluations/README.md" +classification = "current" +role = "overview" +topics = ["acceptance-evidence"] +priority = 100 + +[[rules]] +id = "historical-h1" +path = "docs/editor/evaluations/h1-signoff.md" +classification = "historical" +role = "historical" +replacement = "docs/editor/evaluations/production-readiness/README.md" +priority = 100 + +[[rules]] +id = "historical-h2" +path = "docs/editor/evaluations/h2-signoff.md" +classification = "historical" +role = "historical" +replacement = "docs/editor/evaluations/production-readiness/README.md" +priority = 100 + +[[rules]] +id = "historical-h3" +path = "docs/editor/evaluations/h3-signoff.md" +classification = "historical" +role = "historical" +replacement = "docs/editor/evaluations/production-readiness/README.md" +priority = 100 + +[[rules]] +id = "historical-h4" +path = "docs/editor/evaluations/h4-signoff.md" +classification = "historical" +role = "historical" +replacement = "docs/editor/evaluations/production-readiness/README.md" +priority = 100 + +[[rules]] +id = "historical-h5" +path = "docs/editor/evaluations/h5-signoff.md" +classification = "historical" +role = "historical" +replacement = "docs/editor/evaluations/production-readiness/README.md" +priority = 100 + +[[rules]] +id = "historical-h6" +path = "docs/editor/evaluations/h6-signoff.md" +classification = "historical" +role = "historical" +replacement = "docs/editor/evaluations/production-readiness/README.md" +priority = 100 + +[[rules]] +id = "archive-records" +prefix = "docs/archive/" +classification = "historical" +role = "historical" +replacement = "docs/README.md" +priority = 30 + +[[rules]] +id = "archive-index" +path = "docs/archive/README.md" +classification = "current" +role = "overview" +priority = 100 + +[[rules]] +id = "plans-default" +prefix = ".cursor/plans/" +classification = "historical" +role = "historical" +replacement = "docs/README.md" +priority = 10 + +[[rules]] +id = "superseded-project-roadmap" +path = ".cursor/plans/project_roadmap_8a452d43.plan.md" +classification = "superseded" +role = "superseded" +replacement = "docs/README.md" +priority = 100 + +[[rules]] +id = "active-production-program" +path = ".cursor/plans/blacksite_production_readiness_2026-07-10.plan.md" +classification = "active-plan" +role = "active-plan" +topics = ["production-readiness"] +priority = 100 + +[[rules]] +id = "active-production-gate" +path = ".cursor/plans/production_readiness_acceptance_2026-07-12.plan.md" +classification = "active-plan" +role = "active-plan" +topics = ["production-readiness"] +priority = 100 + +[[rules]] +id = "active-content-workspace" +path = ".cursor/plans/content_workspace_and_import_authoring_2026-07-13.plan.md" +classification = "active-plan" +role = "active-plan" +topics = ["content-workspace", "asset-import", "content-browser", "materials"] +priority = 100 + +[[rules]] +id = "canonical-content-workspace" +path = "docs/editor/content-workspace.md" +classification = "current" +role = "canonical" +topics = ["content-workspace", "asset-import", "content-browser"] +priority = 100 + +[[rules]] +id = "canonical-material-system" +path = "docs/editor/material-system.md" +classification = "current" +role = "canonical" +topics = ["materials", "material-slots", "default-grid", "texture-processing"] +priority = 100 + +[[rules]] +id = "workflow-overview" +path = "docs/workflow/codex-workflow.md" +classification = "current" +role = "overview" +topics = ["codex-workflow"] +priority = 100 + +[[rules]] +id = "canonical-documentation-policy" +path = "docs/workflow/documentation-policy.md" +classification = "current" +role = "canonical" +topics = ["documentation-authority"] +priority = 100 + +[[rules]] +id = "canonical-verification-policy" +path = "docs/workflow/verification-policy.md" +classification = "current" +role = "canonical" +topics = ["selective-verification"] +priority = 100 + +[[rules]] +id = "canonical-build-storage-policy" +path = "docs/workflow/build-storage-policy.md" +classification = "current" +role = "canonical" +topics = ["build-storage"] +priority = 100 + +[[rules]] +id = "canonical-gitea-policy" +path = "docs/workflow/gitea-tracking-policy.md" +classification = "current" +role = "canonical" +topics = ["gitea-tracking"] +priority = 100 + +[[rules]] +id = "content-workspace-architecture" +path = "docs/adr/0045-content-workspace-and-material-fallback-contract.md" +classification = "current" +role = "architecture" +topics = ["content-workspace", "materials", "default-grid"] +priority = 100 + +[[rules]] +id = "material-input-architecture" +path = "docs/adr/0046-schema-driven-material-inputs-and-processed-textures.md" +classification = "current" +role = "architecture" +topics = ["materials", "texture-processing"] +priority = 100 + +[[rules]] +id = "authored-asset-document-architecture" +path = "docs/adr/0047-editor-authored-asset-documents.md" +classification = "current" +role = "architecture" +topics = ["content-workspace", "materials", "recovery", "collaboration"] +priority = 100 + +[[rules]] +id = "penpot-editor-visual-architecture" +path = "docs/adr/0049-penpot-led-editor-visual-system.md" +classification = "current" +role = "architecture" +topics = ["editor-design-system", "materials", "responsive-ui"] +priority = 100 + +[[rules]] +id = "canonical-editor-design-system" +path = "docs/editor/design-system.md" +classification = "current" +role = "canonical" +topics = ["editor-design-system", "responsive-ui"] +priority = 100 + +[[rules]] +id = "m2-content-evidence" +path = "docs/editor/evaluations/content-workspace-m2/README.md" +classification = "evidence" +role = "evidence" +topics = ["content-workspace", "content-browser"] +replacement = "docs/README.md" +priority = 100 + +[[rules]] +id = "production-readiness-evidence" +path = "docs/editor/evaluations/production-readiness/README.md" +classification = "evidence" +role = "evidence" +topics = ["production-readiness"] +replacement = "docs/README.md" +priority = 100 + +[[stale_terms]] +pattern = "registry v2" +replacement = "registry v3 or explicit migration wording" +allowed_paths = ["docs/editor/evaluations/**", "docs/archive/**"] + +[[stale_terms]] +pattern = "Authoring Material" +replacement = "material slot" +allowed_paths = ["README.md", "docs/adr/**", "docs/archive/**", "docs/editor/evaluations/**"] diff --git a/docs/editor/Bevy_Editor_Component_System_Spec.md b/docs/editor/Bevy_Editor_Component_System_Spec.md index a4c6c4f..9393891 100644 --- a/docs/editor/Bevy_Editor_Component_System_Spec.md +++ b/docs/editor/Bevy_Editor_Component_System_Spec.md @@ -1,5 +1,7 @@ # Tech Spec: Unity-style Component List for a Bevy Level Editor +> **Superseded specification — not current implementation guidance.** Component ownership is defined by [ADR 0034](../adr/0034-registry-driven-authoring-components.md); material-slot ownership is defined by [ADR 0035](../adr/0035-shared-material-assets-and-renderer-slots.md). + ## Purpose The component list is the main authoring UI for a selected **Actor** in the level. In this editor, an **Actor** is a Bevy `Entity` plus editor-facing metadata: stable ID, display name, hierarchy position, prefab/link info, and a curated list of inspectable components. diff --git a/docs/editor/README.md b/docs/editor/README.md index afea590..4871ad7 100644 --- a/docs/editor/README.md +++ b/docs/editor/README.md @@ -1,13 +1,15 @@ # Editor Framework Documentation Docs for the in-process egui editor (`crates/editor/`). Update this index when adding editor subsystems. +Consult [`docs/authority.toml`](../authority.toml) before using a page as current guidance. Evaluation +records below are dated evidence, not product specifications. ## Documents | Document | Contents | |----------|----------| | [roadmap.md](roadmap.md) | Phased editor work and status | -| [architecture.md](architecture.md) | Plugins, cameras, PIE, settings split | +| [architecture.md](architecture.md) | Plugins, cameras, PIE, settings split, and modular panel composition | | [brp.md](brp.md) | Remote protocol, authoring-only policy, commands | | [debt-audit.md](debt-audit.md) | Zero-debt phase gates and remaining items | | [rendering.md](rendering.md) | GI modes, post-process volumes, presets, post FX assets | @@ -22,14 +24,16 @@ Docs for the in-process egui editor (`crates/editor/`). Update this index when a | [animation-authoring.md](animation-authoring.md) | glTF rig/clip import, stable controller states, preview, runtime API, and validation | | [navigation-authoring.md](navigation-authoring.md) | Bounds, source geometry, deterministic bake, viewport path preview, and runtime query workflow | | [extensibility.md](extensibility.md) | Static authoring component lifecycle registration, stable IDs, composition, and generic history | -| [material-system.md](material-system.md) | Shared Material/Material Instance assets, static/skinned renderer slots, Surface ABI, Solari scope, and migration | +| [design-system.md](design-system.md) | Penpot-led tokens, typography, responsive property grids, material controls, and picker behavior | +| [material-system.md](material-system.md) | Unified primitive/static/skinned slots, schema-driven inputs, processed textures, Surface ABI, and migration | +| [content-workspace.md](content-workspace.md) | File-manager content organization, destination-first import, stable identity, and model material mapping | | [collaborative-file-safety.md](collaborative-file-safety.md) | Exact authored-file revisions, Git/read-only status, conflict recovery, and optional ownership providers | | [native-dialogs.md](native-dialogs.md) | Non-blocking file/folder/confirmation acquisition and main-thread result application | | [terrain.md](terrain.md) | Inline height-grid terrain, chunk hydration, collision, inspector workflow, and fixtures | | [physics-placement.md](physics-placement.md) | Transactional gravity placement, prerequisites, isolation, commit/cancel, and undo | | [collider-authoring.md](collider-authoring.md) | Collider shape editing, shared health diagnostics, overlays, hydration status, and placement reuse | | [sample-regression-pack.md](sample-regression-pack.md) | Five-area sample manifest, native workflow, visual composition, validation, and maintenance contract | -| [evaluations/](evaluations/) | Acceptance evidence records and native Gitea attachment publishing policy | +| [evaluations/](evaluations/) | Dated acceptance evidence and native Gitea attachment publishing policy; not current behavior guidance | | [evaluations/material-renderer-foundation/](evaluations/material-renderer-foundation/) | Live screenshots and verification record for the renderer/material/component foundation | | [evaluations/material-library-targeted-drop/](evaluations/material-library-targeted-drop/) | Live screenshot and verification record for the docked Material Library and exact reversible surface drops | | [evaluations/collaborative-file-safety/](evaluations/collaborative-file-safety/) | Live screenshot and verification record for source-control status and guarded external-change recovery | @@ -46,6 +50,7 @@ Docs for the in-process egui editor (`crates/editor/`). Update this index when a | [evaluations/scoped-ui-actions/](evaluations/scoped-ui-actions/) | Exact-implementation source and native acceptance evidence for actions invoked during scoped egui rendering | | [evaluations/deterministic-asset-fingerprints/](evaluations/deterministic-asset-fingerprints/) | Source, fresh-checkout, hash-stability, and native acceptance evidence for imported-source fingerprints | | [evaluations/fbx-external-texture-dependencies/](evaluations/fbx-external-texture-dependencies/) | Source, validation, and native acceptance evidence for sandboxed FBX sidecar dependencies and override states | +| [evaluations/content-workspace-m2/](evaluations/content-workspace-m2/) | Native M2 evidence for file-manager selection, item/empty-space context menus, managed-folder visibility, and resizable Content Browser Details | | [evaluations/production-readiness/](evaluations/production-readiness/) | Current #50 release-candidate matrix and required clean-checkout, soak, performance, limitation, and independent-signoff evidence | ## Subsystems (code → doc) @@ -63,10 +68,10 @@ Docs for the in-process egui editor (`crates/editor/`). Update this index when a | `play/audio_preview.rs` / `game::audio` | Non-dirty editor audition and authored runtime playback/bus adapter | audio-authoring.md, ADR 0030 | | `assets/animation.rs` / `ui/animation_inspector.rs` / `game::animation` | Generated animation manifests, controller authoring/preview, and runtime state adapter | animation-authoring.md, ADR 0031 | | `ui/navigation_inspector.rs` / `scene::navigation` / `game::navigation` | Navigation authoring, deterministic bake artifacts, viewport preview, and runtime path queries | navigation-authoring.md, ADR 0032 | -| `assets/materials.rs` / `ui/material_library.rs` / `viewport/material_drop.rs` / `shared::renderer_material` | Shared material discovery, docked catalog/usage UI, exact reversible surface drops, stable renderer slots, and draw binding | material-system.md, ADR 0035 | +| `ui/design_system/` / `ui/materials/` / `ui/asset_card.rs` / `assets/materials.rs` / `viewport/material_drop.rs` / `shared::renderer_material` | Penpot-led editor primitives, shared material view models, bounded asset-card status, unified slot authoring, exact reversible surface drops, and draw binding | design-system.md, material-system.md, ADR 0035, ADR 0046, ADR 0048, ADR 0049 | | `blacksite_surface` / `game_hot::rendering::solari` / `third_party/bevy_solari` | Surface ABI packing, raster composition, Solari evaluator dispatch, and deformation eligibility | material-system.md, rendering.md, ADR 0036 | | `assets/fingerprint.rs` / `shared::AssetSourceFingerprint` | Content-addressed imported-source identity and byte-preserving registry/manifest publication | ADR 0043, evaluations/deterministic-asset-fingerprints/ | -| `assets/` | Catalog, transactional import bundles, asset DB, static mesh artifacts, `thumbnails/`, `materials.rs`, prefab overrides v2 | this file (below), prefab-authoring.md, ADR 0017, ADR 0027, ADR 0044 | +| `assets/` / `content_pipeline` | Catalog, typed model/Texture import settings, deterministic runtime artifacts, transactional imports, thumbnails, and prefab overrides | this file (below), content-workspace.md, ADR 0017, ADR 0027, ADR 0044, ADR 0046 | | `shared::prefab_overrides` | Versioned stable override schema and editor-independent runtime application | prefab-authoring.md, ADR 0027 | | `project/` | Workspace, settings UI, user prefs, support diagnostics | roadmap Phase 1 | | `project/collaboration.rs` | Guarded authored writes, asynchronous Git status, and optional ownership providers | collaborative-file-safety.md, ADR 0037 | @@ -93,7 +98,7 @@ Docs for the in-process egui editor (`crates/editor/`). Update this index when a - **Dedicated egui `Camera2d`** at full window — never attach `PrimaryEguiContext` to a viewport-cropped 3D camera (NaN layout panic). - **Unified viewport** uses one render-to-texture target for both the editor fly camera and the possessed player camera so HDR/atmosphere is not broken by sub-viewport cropping. - **PIE:** F8 possess/eject while sim runs; **F6** pauses/resumes simulation in Play; project settings drive shared rendering for the active viewport camera. -- **Asset browser** mirrors the on-disk `assets/` directory with project tree, breadcrumb, search/filter/sort, grid/list views, texture/model/material thumbnails, a details pane, and context-aware row/menu actions; narrow docks prioritize content, keep the root panel fixed, switch list view to a compact single-column layout, and hide tree/details panes when they would crowd the content area. The footer stays pinned while only the project tree, asset content, and details panels scroll. **Built-ins** holds spawnable primitives and lights. **Materials** folder scans `assets/materials/*.ron`, renders material thumbnails on a sphere using `MaterialDesc`, and exposes shader-schema-driven parameters/textures in the details editor; **Shaders** holds shader schema RON files. **Audio** accepts Bevy-supported Ogg/Vorbis and Speex (`.ogg`, `.oga`, `.spx`), WAV, MP3, and FLAC clips under `assets/audio/`, with a dedicated filter, waveform icon, format/file details, and stable registry-backed references that retain a runtime source path. glTF/GLB/FBX rows can expand into a shelf of normalized embedded mesh, material, and texture subassets with independent generated thumbnails. Mesh subassets can be selected, dragged into the viewport, or placed from details/context menus; material subassets render source-material spheres; texture subassets can be applied to the selected actor. Model import settings are staged with **Apply** / **Revert**, asset context menus can regenerate thumbnails, material asset details edit shared `MaterialAsset` fields, and file asset deletion moves sources/generated artifacts into `assets/.trash/`. Before thumbnail loading, glTF sources preflight local external buffers/images. FBX source-material previews use the same sandboxed resolver as import and validation, expose one cached hover-visible dependency failure, and never enqueue known-missing texture paths; neutral model/mesh previews remain available. Asset details mark present/missing dependencies and identify missing textures intentionally ignored by Authoring Override. FBX bundle import preserves referenced sibling or `.fbm/` layout transactionally. See [ADR 0044](../adr/0044-sandboxed-fbx-external-texture-dependencies.md). +- **Asset browser** mirrors the on-disk `assets/` directory with project tree, breadcrumb, search/filter/sort, grid/list views, texture/model/material thumbnails, a details pane, and context-aware row/menu actions. It uses file-manager selection semantics across files and folders (click, Ctrl/Cmd toggle, Shift range, Ctrl/Cmd+A), batch clipboard/duplicate/trash/drag operations, keyboard shortcuts, and empty-space workspace menus. The details divider is draggable so asset and import settings can use more horizontal space, and double-clicking it restores the default width. Narrow docks prioritize content, keep the root panel fixed, switch list view to a compact single-column layout, and hide tree/details panes when they would crowd the content area. The footer stays pinned while only the project tree, asset content, and details panels scroll. **Built-ins** holds spawnable primitives and lights. Materials and shaders are classified by document schema anywhere under `assets/`; the browser renders material thumbnails on a sphere and exposes shader-schema-driven parameters/textures in Details. **Audio** accepts Bevy-supported Ogg/Vorbis and Speex (`.ogg`, `.oga`, `.spx`), WAV, MP3, and FLAC clips, with a dedicated filter, waveform icon, format/file details, and stable registry-backed references. glTF/GLB/FBX rows expand into normalized embedded mesh, material, and texture subassets. Model and Texture Details edit asset-keyed **UNSAVED** documents; `Ctrl+S` saves the active context and `Ctrl+Shift+S` saves all before affected-only background processing. FBX previews use the same sandboxed dependency resolver as import and validation; missing textures are required when any slot uses Source and informational when every slot uses Project/Default. Bundle import preserves referenced sibling or `.fbm/` layout transactionally. See [content-workspace.md](content-workspace.md) and [ADR 0044](../adr/0044-sandboxed-fbx-external-texture-dependencies.md). - **Imported-source fingerprints** use exact byte length plus lowercase BLAKE3 for model, texture, and audio registry records and for generated static-mesh/animation manifests. Filesystem timestamps are scan hints only; equivalent refresh preserves the exact committed RON bytes and registry publication order is normalized by project path. See [ADR 0043](../adr/0043-content-addressed-import-fingerprints.md) and the [acceptance record](evaluations/deterministic-asset-fingerprints/). - **Material Library** is a dockable bottom-panel catalog for cross-folder Material and direct-base Material Instance authoring. It provides search, type and scene-usage filters, grid/list thumbnails, dependency health, usage counts, creation, guarded details editing, and first-class drag sources. Viewport drops resolve an exact renderer slot, primitive, or brush face under the pointer, preview transiently, reject incompatible/read-only targets explicitly, restore on target change/cancel, and commit one typed undo step on release. - **Static/skinned renderer split** — model drag/drop uses normalized artifacts under `assets/meshes/generated/`. Unrigged, non-animated sources create `ActorKind::StaticMesh + StaticMeshRenderer`; skin-bound or animated sources create `ActorKind::SkinnedMesh + SkinnedMeshRenderer` and preserve the imported hierarchy. Static slots never contain marked skinned primitives or geometry from animated sources. `SceneInstance` placement keeps `ImportedModel + ModelRef` for generic full-source scenes. See [ADR 0033](../adr/0033-dedicated-skinned-mesh-renderer.md). @@ -103,7 +108,7 @@ Docs for the in-process egui editor (`crates/editor/`). Update this index when a - **Draw Brush** — `B`, toolbar pencil, or command `brush.draw` enters a floor-polygon draw mode. LMB places snapped points, Backspace removes the last point, Enter locks the outline for height editing, mouse up/down adjusts height, and Enter/LMB creates additive prism brushes through history. Esc/right-click cancels. Simple concave outlines decompose into convex brush parts; self-intersections remain blocked. - **Brush edit modes** — with a brush selected, `1`/`2`/`3`/`4` enter vertex, edge, face, and clip element modes. Element modes show brush handles in the viewport, own LMB picking, support Shift multi-select, show a mode badge, and Esc returns to object mode. Vertex/edge/face selections use the standard `W`/`E`/`R` gizmo at the element pivot and commit undoable `SetBrush` edits. Clip previews a bounds-based half-brush and commits with Enter; command-palette intersect, convex merge, and subtract operations use the same preview/commit lifecycle for conservative cuboid/prism blockout. - **Collider split and health** — imported mesh collision lives in a separate `ColliderDesc::StaticMesh` plus optional `RigidBodyDesc`; renderer slots own only render visibility, shadows, mesh, and material references. Inspector, viewport, Diagnostics, and physics placement share one authored/runtime health result; see [collider-authoring.md](collider-authoring.md). -- **Material assets and renderer slots** — Material and direct-base Material Instance documents are shared assets. `StaticMeshRenderer` and `SkinnedMeshRenderer` each own stable material slots with imported source defaults and explicit shared assignments; Clear returns to the source default, while reimported missing slots retain overrides as orphans instead of matching by name. The property-block schema is runtime-only and persistence-excluded, while renderer application/promotion remains #53. Custom Surface evaluators use the same constrained ABI for raster and Solari-eligible non-deformed geometry; skinned/morph geometry is deliberately excluded from Solari until #54 adds deformed BLAS updates. See [material-system.md](material-system.md), [ADR 0035](../adr/0035-shared-material-assets-and-renderer-slots.md), and [ADR 0036](../adr/0036-surface-abi-and-solari-parity.md). +- **Material assets and renderer slots** — Material and direct-base Material Instance documents are shared assets. `StaticMeshRenderer` and `SkinnedMeshRenderer` each own stable material slots with scene, model, source, project-default, and DefaultGrid resolution. Reimported missing project mappings remain visible orphans. Runtime-only property blocks clone and cache the resolved Standard or Surface base per owner/slot, leaving invalid overrides non-destructive. Custom Surface evaluators use the same constrained ABI for raster and Solari-eligible non-deformed geometry; skinned/morph geometry is deliberately excluded from Solari until #54 adds deformed BLAS updates. See [material-system.md](material-system.md), [content-workspace.md](content-workspace.md), [ADR 0035](../adr/0035-shared-material-assets-and-renderer-slots.md), and [ADR 0036](../adr/0036-surface-abi-and-solari-parity.md). - **Prefab authoring** — shared `PrefabOverrides` targets generated actors by nested anchor chain plus stable `ActorId`, and applies reflected property/component plus same-layer structural operations in editor and game hydration. The editor supports scoped Revert and transactional **Apply to source** with three-way conflict checks, exact-file undo guards, and recoverable changed/broken/conflict states. `HydratedPrefabMember` keeps generated content out of owner serialization; linked-root saves retain local structure as variants. **Unpack Layer** preserves nested links, while **Convert to Local** recursively removes them. See [prefab-authoring.md](prefab-authoring.md) and [ADR 0027](../adr/0027-stable-prefab-ownership-and-variants.md). - **Visual language** uses a near-black industrial shell, a compact Blacksite identity mark, restrained amber actions/primary selection, cyan secondary selection, semantic status colors, stable grouped controls, and shared elevated viewport chips. Primary/secondary selection roles remain consistent across hierarchy rows, viewport x-ray shells/corner brackets, the selection HUD, and transform interactions. See [visual-language.md](visual-language.md). - **Hierarchy** shows authored objects plus useful runtime context (`Player`, `PlayerCamera`, Project Sun). Ordinary runtime rows remain read-only; generated prefab rows expose override-aware inspection and same-layer remove/reparent actions while rejecting cross-instance/layer and composition-boundary drops. Locks prevent selection, gizmos, drag participation, structural targets, and mutating context actions. Authored reparenting preserves world placement and records parent/local-transform/manual-order changes as one undoable command. diff --git a/docs/editor/architecture.md b/docs/editor/architecture.md index 51f7b0e..098c1b1 100644 --- a/docs/editor/architecture.md +++ b/docs/editor/architecture.md @@ -129,7 +129,12 @@ Three camera roles coexist: **WYSIWYG rendering:** `render_view.rs` is the only editor system that mutates viewport post-FX. It calls `game_hot::sync_viewport_camera_stack` on the active camera (editor fly or possessed player), driven by `ActiveCameraRenderProfile` from project settings and volumes plus `EffectiveRenderStack` for requested/effective GI fallback. `scene_view` and `play/session` set HDR render targets and `is_active` only—they do not strip FX. Only one camera carries the stack at a time (mesh-view bind group limits). See [ADR 0015](../adr/0015-viewport-camera-stack-ownership.md) and [ADR 0016](../adr/0016-unified-rendering-contract.md). -The viewport uses **render-to-texture**: the active camera renders to an offscreen HDR target sized to the dock panel (`panel_physical_size()`), then egui displays that texture. Cameras use `viewport = None` on image targets so the scissor always matches the texture; panel size only drives texture allocation, not a sub-viewport on the image. +The viewport uses **render-to-texture**: the active camera renders to an offscreen HDR target sized +to the dock panel (`panel_physical_size()`), then egui displays that texture. Cameras use +`viewport = None` on image targets so the scissor always matches the texture; panel size only drives +the image extent, not a sub-viewport on the image. Resizing mutates the existing Image asset so its +ID and Egui texture registration remain stable. The presentation layer owns at most one strong Egui +registration and removes it when the target is replaced or absent. **HDR invariant:** Atmosphere, authored HDR, and effective Solari all require an `Hdr` camera target; they must never render to the primary window swapchain @@ -220,12 +225,15 @@ the Edit-to-Play boundary restore the complete runtime snapshot. See ## Model import (glTF + FBX) -- **Import:** File -> Import Assets copies glTF/GLB/FBX into `assets/models/`. An FBX import +- **Import:** **Import Here** and **Import To...** copy glTF/GLB/FBX into the chosen normal folder + beneath `assets/` without type-directory routing. An FBX import parses every safe external texture reference, including sibling `textures/` and `.fbm/` layouts, then stages and publishes the complete referenced bundle transactionally. Absolute non-sidecar paths, parent traversal, and dependencies that canonically escape the source folder are rejected before project files change; unreferenced sidecar contents are not copied. -- **Processing:** the asset registry generates normalized model manifests under +- **Processing:** `content_pipeline` owns one scan/reconciliation path used by editor startup, + manual refresh, the debounced watcher, validation, packaging, and the headless command. Browser + selection changes never trigger registry scans. The processor generates normalized model manifests under `assets/meshes/generated/`. The manifests store stable part IDs, glTF/FBX mesh/material subasset labels, whether each part is skin-bound, source metadata, dependencies, and import settings. Model, texture, and audio registry records use byte length plus BLAKE3 source identity; model @@ -236,8 +244,8 @@ the Edit-to-Play boundary restore the complete runtime snapshot. See - **FBX dependencies:** the local `bevy_ufbx` resolver owns separator normalization, safe `.fbm/` rebasing, deduplication, and sandbox rejection. Static-mesh manifests record every declared external texture even when it is absent. Project validation reports one blocking finding for - missing Source Materials textures, or one informational finding when Authoring Override - deliberately leaves the model untextured. The runtime loader reads unique dependencies through + missing textures used by any per-slot Source selection, or one informational finding when every + slot deliberately uses Project/Default. The runtime loader reads unique dependencies through `LoadContext` and creates labeled images directly, so missing paths cannot fan out into repeated asset-server errors. See [ADR 0044](../adr/0044-sandboxed-fbx-external-texture-dependencies.md). - **Browser subassets:** model rows can expand into a content shelf backed by the generated @@ -300,6 +308,26 @@ PIE stop restores player simulation state only; authored `LevelObject` edits mad | `history/` | Undo commands + plugin | | `ui/` | egui dock shell | +### Panel composition and debt budgets + +`ui/inspector.rs` and `ui/asset_browser/panel.rs` are thin composition shells and are not homes for +new domain behavior. Inspector component cards register callbacks through +`EditorComponentRegistry`; the registry is the only visible built-in dispatcher. Shared Material +presentation lives under `ui/materials/`, while bounded thumbnail/footer/status presentation lives +in `ui/asset_card.rs`. Content transactions, material resolution, authored-document publication, +and derived-processing decisions remain outside egui rendering. + +The actor Inspector owns one fixed identity header and one actor-keyed component scroll region. +Its scrollbar is floating with stable width reservation, so vertical overflow never changes the +width supplied to responsive component cards. Nested component UIs intersect their local bounds +with the inherited clip and must not expand painting or input above the fixed actor header. + +The enforceable budgets and frozen legacy ceilings live in `.codex/architecture.toml`; +`scripts/codex/architecture_audit.py` runs in selective verification and candidate CI. Both UI +shells satisfy the 500-nonblank-line limit. Any future exception requires a tracker, rationale, +maximum, extraction target, and expiry milestone. +See [ADR 0048](../adr/0048-modular-editor-composition-and-debt-ratchet.md). + Shared scene schema lives in the Bevy-free `crates/scene` crate (stamp/migrate/validate on save, load, and CI). `game::schema_world_loader` is the runtime adapter that validates and unwraps the schema envelope before Bevy deserializes versioned prefab assets; both game and editor install it @@ -307,7 +335,21 @@ through `GamePlugin`. ## HDR / swapchain invariant -The unified viewport renders through an HDR offscreen target (`render_target.rs`). When the panel target is missing (egui reflow), cameras must strip atmosphere/post-FX before targeting the swapchain. User-authored HDR may be disabled, but atmosphere and effective Solari still force `Hdr` on the active viewport camera because Bevy sky/Solari pipelines are not safe to carry across SDR targets. `render_view::sync_project_render_view` runs in **PostUpdate** after RTT target assignment and reapplies the project FX stack whenever the active panel target handle changes (startup, resize), not only on settings Apply. Project Settings uses a **draft buffer**; **Apply** commits after render targets resync. +The unified viewport renders through an HDR offscreen target (`render_target.rs`). When the panel +target is missing (egui reflow), cameras must strip atmosphere/post-FX before targeting the +swapchain. User-authored HDR may be disabled, but atmosphere and effective Solari still force `Hdr` +on the active viewport camera because Bevy sky/Solari pipelines are not safe to carry across SDR +targets. `render_view::sync_project_render_view` runs in **PostUpdate** after RTT target assignment +and reapplies the project FX stack whenever the active panel target handle changes (startup or +exceptional replacement), not only on settings Apply. Ordinary resize preserves the handle and +updates the Image asset in place. Project Settings uses a **draft buffer**; **Apply** commits after +render targets resync. + +The editor host and packaged game intentionally use different presentation priorities. The editor +uses `AutoNoVsync`, preferring Immediate or Mailbox where supported, because FIFO acquisition on +NVIDIA Wayland can block for about one second per frame throughout an interactive native-window +resize. Packaged game windows retain `AutoVsync`. This complements the stable offscreen-target +ownership rule; it does not replace it. Bevy 0.19 removed the workspace's prior local `bevy_render` swapchain-timeout patch. The only active Bevy-adjacent patches are compatibility shims for ecosystem crates: `transform-gizmo-bevy` and `bevy_ufbx` under `third_party/`. diff --git a/docs/editor/brp.md b/docs/editor/brp.md index bbf3596..1449d3f 100644 --- a/docs/editor/brp.md +++ b/docs/editor/brp.md @@ -19,23 +19,32 @@ Default HTTP endpoint follows Bevy 0.19 remote defaults (port **15702**, routes ## Authoring-only mutation policy -**BRP and automation must mutate authoring components only** — the same allowlist used on scene save in `scene_io.rs`. Hydration rebuilds runtime ECS (`Mesh3d`, Bevy lights, physics, `WorldAssetRoot`, etc.) on the next frame. +**BRP and durable automation must mutate authoring components only** — the same allowlist used on +scene save in `scene_io.rs`. Hydration rebuilds runtime ECS (`Mesh3d`, Bevy lights, physics, +`WorldAssetRoot`, etc.) on the next frame. One deliberate editor-only exception exists for +`MaterialPropertyBlocks`: trusted local tooling may inject this explicitly runtime-only component +to preview or promote a transient override. It is still excluded from scene/prefab persistence and +the Add Component registry. | Allowed (examples) | Forbidden on level objects | |--------------------|----------------------------| | `Transform`, `Name`, `ActorKind` | `PointLight`, `SpotLight`, `DirectionalLight` | -| `Primitive`, `StaticMeshRenderer`, `SkinnedMeshRenderer`, `MaterialDesc`, `MaterialOverride`, `LightDesc` | `Mesh3d`, `MeshMaterial3d`, `RigidBody`, `Collider` | +| `Primitive`, `StaticMeshRenderer`, `SkinnedMeshRenderer`, brush-only legacy `MaterialDesc`, `LightDesc` | `Mesh3d`, `MeshMaterial3d`, `RigidBody`, `Collider` | | `ModelRef`, `RigidBodyDesc`, `ColliderDesc`, legacy `PhysicsBody`, gameplay markers | `WorldAssetRoot`, generated static/skinned roots, internal visibility types | | `PostProcessVolumeDesc` | Runtime post-process components on cameras | +`shared::renderer_material::MaterialPropertyBlocks` is a runtime diagnostic/tooling exception, not +a durable authoring component. Use **Promote to Material Instance** in the exact Inspector slot when +the variation should become project content. + Prefer: 1. Editing `LightDesc` instead of `SpotLight` / `DirectionalLight` -2. Editing `MaterialDesc` instead of `StandardMaterial` handles +2. Editing the owning `Primitive.surface` or renderer `MaterialSlotSet` instead of `StandardMaterial` handles; `MaterialDesc` is limited to the brush/legacy fallback path 3. Editing `StaticMeshRenderer` instead of child `Mesh3d` entities 4. Editing `SkinnedMeshRenderer` instead of its hydrated joint/mesh hierarchy 5. Editing `ColliderDesc` / `RigidBodyDesc` instead of runtime Avian components -5. Version-controlled `assets/levels/*.scn.ron` for durable changes +6. Version-controlled `assets/levels/*.scn.ron` for durable changes See [ADR 0009 — Authoring vs hydrated](../adr/0009-authoring-vs-hydrated.md). diff --git a/docs/editor/content-workspace.md b/docs/editor/content-workspace.md new file mode 100644 index 0000000..274c8ca --- /dev/null +++ b/docs/editor/content-workspace.md @@ -0,0 +1,200 @@ +# Content Workspace + +Blacksite treats the project `assets/` tree as a user-organized content workspace. Folders are for +organization and do not determine asset type. The stable asset registry ID is authoritative; a path +is mutable metadata that moves, validation, and packaging repair through the shared content catalog. + +## Content boundaries + +- User assets may live in any normal nested folder beneath `assets/`. +- External absolute linked assets are unsupported so projects remain portable and packageable. +- `.index`, `.trash`, thumbnails, recovery data, and derived artifacts are hidden and protected. +- Authored document schemas and typed registry records identify RON assets. Ambiguous or invalid + documents report diagnostics instead of being guessed from their folder. + +## Content Browser workflow + +The Content Browser toolbar provides **New Folder**, **Rename**, **Duplicate**, **Cut**, **Copy**, +and **Paste**. The selected folder is the destination for paste and **File > Import Assets**. These +operations use the shared content transaction engine: it previews collisions, rejects managed or +symlink paths, stages filesystem and cached-reference changes together, preserves IDs on moves, +assigns new IDs to copies, and rolls back on failure. Successful move, rename, create-folder, copy, +duplicate, and authored-file creation transactions add a content-specific **Undo Content** entry. +Move/rename undo applies the inverse reference-safe transaction. Undoing newly created content +moves the unchanged result into transactional Trash, so it remains restorable instead of being +permanently deleted. Every undo is blocked if any affected file or folder has changed externally +since commit. Registry and stripped runtime-catalog publication are part of the same rollback +boundary. + +Before create-folder, rename, move, copy, duplicate, paste, or drag-to-folder commits, **Review +Content Operation** lists every source/destination, affected registered-asset count, and each cached +RON document whose path hint will be rewritten. Collisions are shown in the same window and disable +commit. Read-only files, provider locks, and source-control conflicts are visible and block commit; +modified/untracked state remains visible but does not. Source and rewrite-document fingerprints are +captured for the review, so any external edit before confirmation also blocks the stale transaction. +Cancel restores the pre-review folder, selection, anchor, status, clipboard, and drag state; a +cancelled drag review clears only the stale drag gesture. Folder-scoped **Paste Into** and +**Import To** pin their destinations without navigating the browser. + +Delete remains trash-first. **Trash** in the toolbar, **Open Trash** in a folder/empty-space context +menu, and the restore window expose complete deletion batches. A new batch records the original +paths and registry records before moving bytes under `assets/.trash/`. Model batches also carry +their generated static/animation manifests so deletion or guarded undo cannot leave orphan runtime +artifacts; restoring the batch restores those exact derived bytes with the source. Restore preserves +stable IDs and is blocked if a destination path, derived path, or registry ID is now occupied. +Legacy trash batches are shown when their original paths can be inferred, but have no historical +registry IDs to recover. A normal Move to Trash action also records the exact batch in Content Undo, +so Ctrl/Cmd+Z restores it when the batch fingerprint and destinations remain valid. +Before confirmation, the trash review enumerates external authored RON documents, model mappings, +project-default selection, and dependency records that will become unresolved; references inside +the same selected tree are excluded from that warning. + +Selection follows desktop file-manager conventions in both grid and list views: click selects one, +Ctrl/Cmd-click toggles an item, Shift-click selects the visible range from the anchor, and +Ctrl/Cmd+A selects every visible result. Folders are first-class selectable and draggable items; +double-click opens them and clears the previous folder's selection so hidden content cannot be +changed accidentally. Starting a drag on an unselected item selects that item first, while dragging +one member of an existing multi-selection preserves the complete batch. Batch Cut, Copy, Duplicate, +drag-to-folder, and Move to Trash operate on the complete selection while removing nested duplicates +such as a selected folder and one of its children; the menu reports those children as covered by +the parent rather than mislabeling them as ignored. Changing search text, recursive scope, or the +kind filter clears the selection so a now-hidden item cannot receive a keyboard operation. Sorting +and switching grid/list view preserve selection because they do not hide results. Content shortcuts only take ownership while the +pointer is over the content pane: Ctrl/Cmd+C, X, V, D, A and Z, Ctrl/Cmd+Shift+N, F2, and Delete. +Ctrl/Cmd+Z invokes the most recent guarded Content Browser operation; it does not consume scene +history while the pointer is outside the content pane. The browser surface and its shortcuts are +disabled while any Content Browser review/modal or popup menu is open, so a confirmation click or +keystroke cannot also mutate the selection behind it. Cut/Paste keeps the exact requested basename; an occupied destination is +shown as a collision in **Review Content Operation** instead of being silently renamed. +Embedded mesh, material, texture, skeleton, and animation rows are authoring subassets rather than +filesystem entries; generic rename/clipboard/drag-to-folder/trash commands never reinterpret one as +its parent model file. + +Right-clicking an unselected file, folder, or embedded model subasset makes it the primary selection +before opening its menu. Right-clicking one member of an existing multi-selection preserves the +complete batch. File menus expose type-specific actions plus Rename, Cut, Copy, Duplicate, and Move +to Trash. Folder menus add destination-scoped import, paste, and creation actions. Right-clicking +unused content space clears any old selection and opens workspace actions for **Import Here**, +**Import To**, **Create Material Here**, **Create Materials From Folder**, **New Folder**, **Paste**, +**Select All**, **Refresh**, and grid/list view selection. New Materials are authored directly in the +current folder; the Material Library's create button retains `assets/materials/` as its convenient +default. +Double-clicking a scene opens it, a model toggles its embedded contents, and other asset types reveal +their editable Details. The footer and Details pane summarize multi-selections; single-selection +Details remains the authoritative editor for import and material settings. Drag the Details divider +to resize it for long slot/shader forms; double-click the divider to restore its default width. +Texture Details uses the same pane for semantic/color-space intent, mip generation, UASTC or +uncompressed KTX2 output, resize limits, sampler settings, and normal-Y conversion. Changes become +an **UNSAVED** Texture document immediately; explicit Save publishes the settings and queues +affected-only derived processing without rewriting the editable source image. + +Thumbnail cache keys are typed by asset category. Texture cards may use direct image loads, while +model cards always queue the offscreen geometry studio—even when a glTF has a base-color texture. +Expanded mesh rows request their exact mesh-subasset render, and source materials use a separate +material-sphere key. Missing dependencies produce an explicit failed thumbnail; a model or mesh +card never substitutes an albedo texture. Replacing, retrying, or invalidating a thumbnail also +unregisters its last Egui image handle, so repeated catalog refreshes release the prior GPU image +instead of accumulating hidden render targets. + +**Import Here** pins the current/selected folder before the native picker opens. **Import To...** +first opens a project-folder chooser without navigating away from the current browser location. +After files are chosen, a second review lists every source dependency and exact final project path; +collisions disable commit and cancel publishes nothing. Source/dependency fingerprints and target +absence are checked again at commit so external changes after review cannot overwrite project data. + +External FBX and textual glTF imports preserve relative texture/buffer layouts as one staged bundle. +The complete multi-source picker batch is preflighted before mutation: existing targets and two +sources mapping to one target are reported as collisions, and any publication failure removes all +new files and directories from that batch. Missing dependencies, traversal, and symlink escapes +also fail before the destination changes. GLB is self-contained. Files already under `assets/` are +shown as **Adopt in place** in the review and processed without copying or type-folder sorting. + +Folder/file Move preserves registry IDs and rewrites cached paths in project documents, model +defaults, the runtime catalog, and generated manifests. Copy/Duplicate assigns new IDs, remaps only +references internal to the copied tree, and leaves the originals plus external references +untouched. Copied models discard inherited generated-manifest paths so normal processing publishes +fresh artifacts under the copied model ID. +Out-of-editor moves reconcile imported assets only when one missing record has the matching kind +and source fingerprint. If the watcher finds one new file matching multiple missing records, it +opens **Resolve Ambiguous External Moves** and leaves registry/manifests unchanged. Each row must +either preserve exactly one candidate ID or intentionally **Register as New Asset**; one old ID +cannot be assigned to two new paths. **Review Later** leaves a **Resolve Moves** toolbar action, and +Apply rechecks the registry, files, and candidate set before publishing. Headless processing fails +with the same candidate paths until the choice is completed in the editor; neither path silently +replaces stable identity. + +Imported static and skinned model Details expose stable material slots. Each slot selects its source +material, a project Material/Instance, or **Default**; bulk Source and Default actions are +available. Default intentionally skips the imported source and resolves through the project +fallback, then immutable DefaultGrid. Reimport reconciles by stable slot ID and retains removed project assignments as explicit +orphans. The displayed source health makes a missing imported material distinct from an intentional +Default selection. **Locate** reveals the referenced project Material/Instance, while **Clear** +returns an active model slot to Source. Orphan rows provide **Locate** and **Clear Orphan** so a +removed source slot can be reviewed and resolved explicitly before applying the import settings. + +The former whole-model Source Materials/Authoring Override switch is migration input only. Explicit +processing expands legacy Authoring Override into a Default selection for each stable slot, resets +the legacy field, and publishes only per-slot selections to current registry/manifests. Validation +requires an FBX texture bundle while any slot uses Source; an all-Project/Default model keeps missing +source textures visible as informational provenance instead of a release blocker. + +For glTF, GLB, and FBX, **Extract Editable Materials Here** opens a conversion review containing +every source material, converted metallic/roughness and render state, detected external texture +channels, and the editable final project paths. Embedded texture payloads remain source-owned; the +review still converts supported scalar PBR values. Confirmed entries become normal +`*.material.ron` assets and every model draw slot using that source material is changed to a +`Project(...)` selection in the same rollback-capable content transaction. The generated model +manifest is refreshed immediately so editor and packaged runtime bindings agree. A first +extraction uses a collision-free path. On a later extraction into the same folder, matching source +path and stable source-slot provenance opens an explicit diff: choose **Apply Reviewed Update** to +replace the edited Material, or **Create New Copy** to preserve it as a separate revision. Apply is +guarded by the reviewed file fingerprint, participates in transaction rollback, and is blocked if +the file changes before publication; mismatched provenance can never overwrite an unrelated +Material. Each extracted Material records read-only source path, stable source-slot identity, and +source-content fingerprint provenance in Details. + +For loose texture sets, right-click their folder or unused space inside it and choose **Create +Materials From Folder**. The review window detects common PBR suffixes such as `albedo`, +`basecolor`, `diff`, `normal`, `nor_gl`, `roughness`, `metallic`, `ao`, `orm`/`arm`, `height`, and +`displacement`. Every row shows its confidence and stays editable. Change a row's **Target** to +merge it into another material or split it into a new material; change **Role** to correct a guess. +Unresolved images remain visible and start unchecked. Creation publishes every selected group as +one atomic content transaction and chooses a suffixed filename instead of overwriting an existing +Material. Packed ORM/ARM maps use R=occlusion, G=roughness, and B=metallic. + +Project Settings > Content selects an optional project fallback Material/Instance. Clear restores +the immutable **Default Grid — Engine Built-in**. DefaultGrid is world-space and UV-independent, so +broken or unassigned meshes stay visible. + +Material, Material Instance, model-import, Texture-import, and project-default edits live in an +editor-owned authored-document store until explicitly saved. **UNSAVED** is editor state and is +shown separately from Git state. `Ctrl+S` saves the last edited context; `Ctrl+Shift+S` and +**File > Save All** save every dirty scene, asset document, and project setting. Selection changes +never discard a dirty asset. Source publication is guarded and atomic, then affected-only derived +processing runs in the background while the previous valid artifact remains active. +Material scalar/color/render-state saves do not show `PROCESSING`; only packed-map binding changes +do. Content Browser and Material Library cards share clipped two-line labels, a top-right grid-card +status rail, and fixed-width list markers, so state never paints over or shifts an asset name. + +## Headless processing + +Run `cargo process-assets --project ` to deterministically refresh registry v3, normalized +static/animation model manifests, processed Texture artifacts, canonical Material ARM maps, and +`assets/content.catalog.ron` without a GPU. All planned artifacts and both catalogs publish under +one rollback boundary. Use `--check` in CI for a strictly read-only comparison that fails on any +stale artifact, and `--json` for machine-readable diagnostics. Texture and packed-Material keys are +resolved before image decode; an existing content-addressed artifact is reused, so an unchanged +check validates source hashes and catalog references without recompressing images. +Editor startup, the toolbar/empty-space **Refresh** action, and the shared watcher all use the same +processor. Saved authored documents enqueue revisioned, coalesced jobs rather than running the +whole processor on the UI frame. The watcher debounces and deduplicates user-content paths, ignores +managed/generated publication noise, incrementally rescans the same registry/catalog model, +refreshes selection-safe browser state, and invalidates thumbnail caches. Selection-only UI changes +never fingerprint or republish content. Editor transactions suppress their filesystem events until commit. Failures remain visible +in the editor status line. When an external deletion leaves authored references unresolved, the +status includes their count and affected document paths. Thumbnail rendering remains editor-owned. +Ambiguous move repair is rediscovered on startup and manual refresh, so choosing **Review Later** +cannot lose the repair entry across an editor restart. + +The permanent storage, material precedence, and fallback decisions are in +[ADR 0045](../adr/0045-content-workspace-and-material-fallback-contract.md). diff --git a/docs/editor/debt-audit.md b/docs/editor/debt-audit.md index c1696d2..95289dc 100644 --- a/docs/editor/debt-audit.md +++ b/docs/editor/debt-audit.md @@ -1,5 +1,7 @@ # Editor zero-debt audit checklist +> **Active plan — describes incomplete release/debt gate work.** Current shipped behavior is indexed in the [canonical documentation](../README.md). + Living checklist for the production editor program ([ADR 0012](../adr/0012-zero-tech-debt-editor.md)). Update when closing a phase or removing debt. ## Must not ship (gate before phase sign-off) @@ -17,6 +19,10 @@ Living checklist for the production editor program ([ADR 0012](../adr/0012-zero- | Checkout metadata or filesystem enumeration can rewrite imported-asset artifacts | Done | Shared content fingerprints, semantic byte-preserving publication, normalized registry order, clean-checkout validators, and live mtime-only drift pass at `cbd380a`; see the [evaluation](evaluations/deterministic-asset-fingerprints/). | | Dual FBX thumbnail ad-hoc path (parallel to unified pipeline) | Partial | Phase 5 `assets/thumbnails/` refactor | | `failed_keys` thumbnail cache without retry API | Partial | `asset_thumbnails.rs`; Phase 5 `ThumbnailState` | +| Inspector hard-coded component dispatcher | Done | `EditorComponentRegistry` is the sole visible built-in dispatcher; startup rejects missing callbacks | +| `ui/inspector.rs` monolith | Done — P0 #68 | 363 nonblank-line registry-dispatch shell; component cards and complex domains are separate modules | +| `ui/asset_browser/panel.rs` monolith | Done — P0 #68 | 450 nonblank-line shell; navigation, cards, Details, import, extraction, transactions, trash, and undo are separate modules | +| Architecture debt can grow silently | Done | `.codex/architecture.toml` plus `scripts/codex/architecture_audit.py`; exact frozen baselines ratchet every remaining legacy module | ## Phase completion gates diff --git a/docs/editor/design-system.md b/docs/editor/design-system.md new file mode 100644 index 0000000..1d154ec --- /dev/null +++ b/docs/editor/design-system.md @@ -0,0 +1,153 @@ +# Editor Design System + +Blacksite's editor uses the Penpot **Inspector Material Slot** as its visual source of truth. This +guide defines the reusable visual and interaction language; domain behavior remains in its owning +editor subsystem. See [ADR 0049](../adr/0049-penpot-led-editor-visual-system.md). + +## Semantic palette + +The default theme mirrors Blacksite's established palette. These values are published under +Penpot Assets / Colors and represented by `EditorVisualPalette`; domain widgets consume semantic +roles rather than literals. Theme selection and persistence are intentionally deferred to Editor +Settings, but the renderer-facing UI seam already accepts a different palette. + +| Role | Default | +|------|-------| +| Canvas / panel / recessed | `#07080A` / `#0D0F12` / `#090B0D` | +| Control / elevated | `#15181C` / `#1F2328` | +| Brand accent / hover | `#E5A433` / `#F9C14F` | +| Selection and valid drop | `#41C6CF` | +| Border / strong border | `#262B31` / `#40474F` | +| Primary / secondary / muted text | `#DCE1E5` / `#9BA3AB` / `#606972` | +| Healthy / warning / error | `#54BE7F` / `#EBB448` / `#E25E5E` | + +Source Sans Pro Regular and Bold are bundled in `crates/editor/assets/fonts/source-sans/`. Type +roles use the Penpot 9–16 px scale; weight is selected through separate egui font families rather +than simulated styling. Spacing follows 4/8/12 px steps. Common controls are 22–31 px tall with +4/5/6/7/8 px radii. + +Use semantic tokens from `ui/design_system`; do not copy literal colors into a domain card. The +selection color is reserved for focus, valid drag targets, selection, and active values. Health, +unsaved, processing, failed, read-only, inherited, and built-in states keep the same geometry. + +## Composition contract + +Reusable controls render a supplied view model and return actions. They do not query unrelated +Bevy resources, save files, schedule processing, or directly mutate scene/world state. The owning +domain resolves actions after rendering. This keeps the visual system reusable in the Inspector, +Content Browser, Material Library, and future editor panels. + +The material implementation is split as follows: + +- `ui/design_system` owns tokens, typography, control chrome, property-grid geometry, and the color + popup. +- `ui/materials/panel.rs` owns the material-slot view model and action contract, while + `ui/materials/pickers.rs` owns the compact current/recent Material menu and the richer Texture + asset-picker presentation. +- `ui/materials/inputs.rs` renders schema-declared material controls. +- Inspector and asset editors provide state and apply returned actions through authored documents. + +## Reference layout + +At the current 620 px wide reference, 12 px outer padding produces a 596 px slot and a 569 px parameter +body. A 32 px **Materials** heading precedes repeated slots. Expanded headers are 82 px with a +64 px preview; collapsed headers are 52 px with a 32 px preview. Surface is 46 px, Inputs is +216 px (24 px header plus six 32 px rows), UV is 54 px, and Advanced is 30 px collapsed or 178 px +expanded. An expanded wide row keeps its label/value/channel geometry fixed while only the texture +field grows above the reference width. + +| Column | Width | +|--------|-------| +| Parameter label | 82 px | +| Value | 132 px | +| Value/channel gap | 6 px | +| Channel | 48 px | +| Channel/texture gap | 16.5 px | +| Texture field | 198.5 px at the reference width | +| Locate / Clear | 24 px each, separated by 6 px | + +At the 420 px Inspector floor, the slot is 396 px and parameter sections are 369 px. Surface remains +46 px and Inputs is 372 px: each of the six rows uses a 58 px two-line layout with parameter, +value, and channel above a 345 px asset picker. UV reflows from 54 px to 94 px. The layout must not introduce nested or horizontal +scrolling, clipped buttons, or height-dependent width changes. + +These reference dimensions are implemented as owning rectangles, not nested `horizontal` flow. +At 569 px, each input row begins its value at x96, channel at x234, and texture group at x298.5. +At 369 px, the parameter line is `x12/y5/w345` and the texture line is +`x12/y31/w345`. Texture names are clipped and ellipsized inside the field, so content cannot move +the fixed Locate/Clear anchors. A transient width below 372 px retains finite clipped rectangles +and replaces the two low-frequency texture actions with one overflow control until the Inspector +minimum is restored. + +## Material controls + +Primitive, static-mesh, and skinned-mesh surfaces use the same ordered `MaterialsSection` and +slot-keyed `MaterialSlotPanel` actions. Static/skinned geometry cards do not embed duplicate +material presentations. The slot header and +asset zone include the material sphere, bounded name and project-relative path, shader, health, +assignment interaction, and responsive actions. The entire zone is the drop target; there is no +second “Drop material asset” box. Preview/name/path and Browse open the picker, while Shader, +Locate, Clear, and overflow remain isolated. Direct assignments do not show an “Explicit” badge. +Inherited identities are limited to Model Source, Model Default, Project Default, and Default Grid. + +Expanded content shows supported controls only: + +- Surface: Opaque/Cutout, cutoff when Cutout, Separate/ORM, and Double Sided. +- Inputs: six Standard Lit rows. Emissive color owns the independently stored intensity companion + and edits/restores both through the Emissive popup. +- UV: two equal Offset/Tiling groups with fixed X/Y controls and independent resets; Material + Instances reset to inheritance. +- Advanced Inputs: only evaluator-supported schema declarations. + +Imported source content is read-only with Extract Editable in overflow. DefaultGrid is immutable. +Broken explicit references keep their failed identity and diagnostics rather than exposing a weaker +layer. Stable IDs, fingerprints, orphan state, and provenance live in overflow diagnostics, not in +the parameter grid. + +## Pickers and direct manipulation + +The compact Material menu shows the current assignment and editor-local recent choices, then offers +Browse Asset Library and Clear. The richer Texture picker uses bounded thumbnail rows for current, +recent, and project textures. A popup dismissal or invalid choice does not assign anything. Material and +Instance drops use the active theme's selection highlight; Texture drops show an explicit invalid state. + +Handoff v2.3.1 has one Shader selector in the asset identity block. Surface contains the blend mode +and Double Sided without a visible `Blend` label; it does not mirror Shader as a second "Shading +Model" control. UV is followed by a +collapsed Advanced row. Its culling, render queue, depth-write, and receive-shadows mock controls are +explicitly painted muted previews until those renderer contracts exist, and therefore never return +actions. Standard egui disabled opacity is not compounded over these controls. + +The Inspector actor identity remains fixed. The remaining dock-tab body is one actor-salted +component scroll region whose clip is intersected with the dock body, so scrolled Transform or +component cards cannot paint or receive input beneath the actor header. Component-local children +must preserve that inherited clip rather than replacing it with their own maximum rectangle. The +vertical scrollbar floats over a stable four-pixel interaction rail, so crossing the height overflow +threshold cannot change the content width or trigger a responsive-layout flip. + +Texture fields open their picker when the field itself is clicked. They show a thumbnail or typed +fallback icon plus Locate and Clear actions. A ready typed thumbnail replaces the generic Texture +glyph rather than appearing beside a redundant icon; a redundant folder button is not used. + +The color popup is a fixed 420 x 350 px modal centered over the owning Inspector region, with a +dimmed Inspector-local scrim. Its exported geometry includes a 38 px header, 250 x 26 mode tabs, +178 x 202 wheel editor, 198 x 186 values region, byte RGBA fields, degree/percentage HSV fields, +functional HEX copy, a 156 x 14 checkerboard alpha control, 396 x 28 recents row, and 396 x 26 +footer. Wheel, Sliders, and Presets share that fixed frame. The exported eyedropper lane is a muted, +non-interactive preview labelled `Planned — screen sampling pending`. + +Every preview updates the live material document. Apply keeps the dirty in-memory value; Cancel, +Escape, Close, and outside dismissal restore the exact value captured on open. No picker action +writes source or queues derived processing. Material scalar inputs use the reusable 130 x 22 +Penpot control: a 70 x 14 track, 10 px thumb, 8 px separation, and 48 x 22 numeric field. Expanding +Advanced scrolls its complete 178 px disabled-preview body into view rather than revealing a clipped +partial section. + +## Review checklist + +- Verify the 620 px geometry numerically and in a native capture. +- Verify the narrow reflow, long and Unicode names, invalid drops, read-only/imported/built-in + states, and popup cancellation. +- Verify handle identity and dirty-document behavior during live interaction. +- Run `python scripts/codex/architecture_audit.py check`; new design-system work does not earn an + exception from the module-size ratchet. diff --git a/docs/editor/evaluations/README.md b/docs/editor/evaluations/README.md index c1d508d..ca7c0ee 100644 --- a/docs/editor/evaluations/README.md +++ b/docs/editor/evaluations/README.md @@ -1,8 +1,11 @@ # Editor Evaluation Evidence -Each subdirectory keeps the canonical, versioned acceptance record for an editor feature. Record -visual evidence with its attachment ID, dimensions, and checksum. A repository image copy is -optional; the committed Markdown record, not a raw image URL, is the source of truth. +Each subdirectory keeps dated acceptance evidence for an editor feature. Evidence records describe +what was observed against a named implementation; they are not current product specifications. +Resolve current behavior through [`docs/authority.toml`](../../authority.toml) and the linked +canonical guide or ADR. Record visual evidence with its attachment ID, dimensions, and checksum. A +repository image copy is optional; the committed Markdown record, not a raw image URL, is the +durable evidence source. ## Publishing To Gitea @@ -15,3 +18,9 @@ attachment so the evidence remains traceable to its tested source and exact comm Native attachments are the presentation copies used by issues and pull requests. Do not commit a duplicate image solely to publish it; retain verification notes and attachment metadata in the evaluation record. + +## Records + +The [editor documentation index](../README.md) lists feature evidence records. The +[production-readiness matrix](production-readiness/) is the active candidate-evidence ledger; +H1–H6 sign-offs are historical snapshots. diff --git a/docs/editor/evaluations/collaborative-file-safety/README.md b/docs/editor/evaluations/collaborative-file-safety/README.md index e24893c..b9032a7 100644 --- a/docs/editor/evaluations/collaborative-file-safety/README.md +++ b/docs/editor/evaluations/collaborative-file-safety/README.md @@ -1,5 +1,7 @@ # Collaborative File Safety Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Date: 2026-07-12 Branch: `codex/collaboration-live-acceptance` Implementation commits: `5a82a9e`, `f2ad88f` diff --git a/docs/editor/evaluations/collider-diagnostics/README.md b/docs/editor/evaluations/collider-diagnostics/README.md index ec62bba..dd2e9d5 100644 --- a/docs/editor/evaluations/collider-diagnostics/README.md +++ b/docs/editor/evaluations/collider-diagnostics/README.md @@ -1,5 +1,7 @@ # Collider Diagnostics Acceptance +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Issue: Gitea #26 (`BS-JD-305`) ## Evidence diff --git a/docs/editor/evaluations/content-workspace-m2/README.md b/docs/editor/evaluations/content-workspace-m2/README.md new file mode 100644 index 0000000..cd42d6e --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/README.md @@ -0,0 +1,205 @@ +# M2 Content Workspace Native Evaluation + +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + +**Date:** 2026-07-14 + +**Milestone:** [M2 - Content workspace and asset pipeline](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/milestone/12) + +**Epic:** [Gitea #59](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/59) + +**Base commit:** `931f561e7ff1489f897e22ebb3cc7545fcfef702` + +**Implementation revision:** Candidate tree passed all gates; exact commit assigned at publication + +**Release-candidate commit:** Pending publication commit + +**Native interaction acceptance:** **Pass for the workflows recorded below** + +**Pinned Penpot acceptance targets:** [export index](penpot/README.md) + +This feature-level record covers the Content Browser interaction pass added during M2 completion. +It does not close the milestone or replace the exact-commit, clean-checkout, import/reimport, +forward/Solari, packaging, and independent signoff gates in the M2 plan. + +## Native Protocol + +The normal debug editor was rebuilt with `cargo build -p editor --bin editor`, launched as +`LD_LIBRARY_PATH=target/debug/deps target/debug/editor --project .`, and exercised in native +Wayland windows at 3426x1384 and 1440x3440. The project stayed live throughout each workflow and +was stopped without saving the temporary placement scene. + +| Workflow | Result | Evidence | +|----------|--------|----------| +| Managed storage visibility | Pass | `assets/.index`, `.trash`, `.thumbnails`, `.import-cache`, and generated artifact directories were absent from the tree and content grid; ordinary content folders remained visible. | +| Empty workspace context | Pass | Right-clicking visible unused content space cleared the selected model and opened Import Here, PBR grouping, Create Material Here, New Folder, Open Trash, Paste, Undo, Select All, Refresh, and view actions. | +| Multi-selection | Pass | Ctrl-click selected `assets/build_profiles` and `assets/levels` together; both tiles, the two-item footer, and the multi-selection Details summary stayed synchronized. | +| Batch context menu | Pass | Right-clicking one selected folder preserved both selections and exposed Cut, Copy, Duplicate, and Move Selection To Trash. | +| Item context menu | Pass | Right-clicking the Poly Haven desk model selected it and exposed model actions plus Rename, Cut, Copy, Duplicate, and Move To Trash. | +| Details resizing | Pass | Dragging the Content Browser divider expanded the Details pane; its hover affordance described drag resize and double-click reset. | +| Background/item priority | Pass | The workspace background menu remained available without intercepting folder/model clicks or Ctrl multi-selection. | +| Destination-first bundled import | Pass | Created `assets/Props/Office/` through reviewed folder transactions, chose **Import Here** from genuinely empty space, and imported the Poly Haven `metal_office_desk_2k.gltf` directly there with its `.bin` and three relative textures. No type-specific routing occurred. | +| Import To and final-path review | Pass | Chose `assets/Furniture/Office` without navigating away from the root browser view, opened the native picker, selected `/tmp/m2-live.png`, and confirmed the second review showed the pinned destination plus exact `assets/Furniture/Office/m2-live.png` target. Cancel closed the review and a filesystem assertion confirmed that no target was published. | +| Destination-first skeletal import and placement | Pass | Chose **Import Here** in `assets/Furniture/Office/`, imported `blacksite-m2-robot-expressive.glb` directly there, inspected its stable draw-slot IDs, and placed it as a live `SkinnedMesh` actor with its skeleton hierarchy intact. Registry ID `5b4640dd-fc17-4703-b9ea-e4eb49a8c7fc` and both generated manifests survived the final headless refresh. | +| Editable material extraction | Pass | The review exposed the converted metallic/roughness values, base/normal/packed texture channels, double-sided state, destination path, and stable source provenance before one transactional publication. | +| Re-extraction diff/apply safety | Pass after corrective implementation | Native review found the provenance-matched Material, exposed a source-revision diff, and kept Extract disabled until **Apply Reviewed Update** or **Create New Copy** was chosen. Apply preserved Material ID `647a63d4-64c6-4431-ba46-9efdd515cd8f`, mapped all eight active slots, and **Undo Content** restored the exact prior Material bytes. Pipeline tests additionally prove external-edit rejection and exact-byte rollback when dependent publication fails; editor tests prove undecided and stale reviews cannot publish. | +| Extract-and-map contract | Pass after corrective implementation | Native QA found that extraction initially created the Material without changing model defaults. The transaction now registers the Material and maps all nine draw-slot IDs using source material 0 before publishing either registry document; the generated static-mesh manifest contains the same nine `Project(...)` selections. | +| Guarded create/write undo | Pass | **Undo Content** moved the first extracted Material into one Trash batch while leaving the model bundle untouched. The corrected extraction was then rerun against the same fixture. | +| Forward/Solari DefaultGrid visibility | Pass | The scene's UV-independent neutral grid remained visible in `Lit / Forward` and after applying `GiMode::Solari` in memory; `assets/project.ron` remained configured as `Forward`. | +| Broken project fallback safety | Pass | Selected `new_material_2` as the project fallback, moved that Material to Trash through the reviewed transaction, and confirmed affected primitives and the placed skinned model remained visible with DefaultGrid. Undo restored the Material; the project fallback was then cleared back to the built-in default. | +| Skinned scene-slot override | Pass | The Inspector exposed every imported draw slot and its stable ID. Assigning `new_material_2` to the first slot changed only that scene slot to an explicit project Material while the remaining slots continued to report imported-source fallback. | +| Restart persistence and deterministic refresh | Pass | After a clean close/restart, the registry, runtime catalog, generated static-mesh manifest, and extracted Material retained identical SHA-256 hashes. Registry and manifest each retained nine project slot selections. | +| Editor/headless classification parity | Pass after corrective implementation | `process-assets --check` found that browser sync had collapsed a schema-classified Material Instance back to Material. Browser registry sync now reclassifies the authored file while retaining the unified visible Material family. A steady-state editor restart preserved both document hashes and the following headless check reported zero changes. | +| Reimport and orphan reconciliation | Pass after corrective implementation | Removing source node 8 from the QA glTF and choosing **Reimport** retained eight active `Project(...)` mappings by stable slot ID and exposed the removed mapping as one explicit orphan. **Locate** selected its extracted Material; **Clear Orphan** plus **Apply** published eight active mappings and zero orphans to registry and runtime manifests. The source bundle under `source_assets/` was not modified. | +| Move/rename stable identity | Pass after corrective implementation | A reviewed Cut/Paste moved `assets/Props/Office/` to `assets/Furniture/Office/` while preserving model ID `36c51ff3-29ae-4ab1-aaca-f90f57e27966` and Material ID `647a63d4-64c6-4431-ba46-9efdd515cd8f`. Native QA found stale nested `MaterialRef.source_path` caches on the first attempt; guarded Undo restored the prior bytes, the transaction rewrite was corrected, and the repeated move updated registry, catalog, both model manifests, Material provenance, and texture paths. Reimport at the destination retained all eight mappings. | +| Duplicate identity and internal references | Pass after corrective implementation | Native **Duplicate** assigned fresh IDs to the copied model, Material, and textures; every copied model slot referenced the copied Material and folder, while the original records remained unchanged. Copied models discarded inherited manifest paths and the watcher regenerated static/animation manifests under the copied model ID. | +| Duplicate guarded undo and derived cleanup | Pass after corrective implementation | Native Undo initially exposed orphan generated manifests after removing the copied tree. Trash manifest schema v2 now includes model static/animation artifacts. Rebuilt native Duplicate -> Undo moved the copy plus both generated manifests into one restorable Trash batch, removed copied registry/catalog records, and preserved the original tree and artifacts. | + +## Automated and Packaged Acceptance + +The same local implementation passed the complete workspace/all-feature test suite, strict +all-target/all-feature Clippy with warnings denied, formatting, both project validators, and a +steady-state headless content check over 78 discovered assets. `validate-levels` audited 152 +dependencies with zero blockers; `validate-samples` audited all five samples and 157 dependencies +with zero blockers. Both validators reported the expected eight non-blocking import/platform +findings. The final `process-assets --check` reported zero registry, catalog, model, texture, or +material-artifact changes. The QA package published 125 runtime files (87 written and 38 reused) +with no stale packaged files. + +Focused Content Browser regressions also cover guarded undo for created folders and copied content: +an unchanged created result is targeted as one restorable Trash batch, while any external tree +change blocks the undo and preserves the workspace. Ordinary Move to Trash records its exact batch +for guarded Ctrl/Cmd+Z restoration as well. Model trash/restore additionally verifies byte-exact +static/animation manifest removal and restoration, and copy coverage verifies fresh IDs plus +internal-only reference remapping. + +The final transaction audit adds focused coverage for exact browser/scene status restoration when +a content review is cancelled, stale-drag cleanup, registry/runtime-catalog drift refusal during an +import review, and reviewed-import rollback that removes newly published bytes without deleting an +in-project adopted asset. Destructive reference discovery reports external authored documents, +project defaults, model mappings, and dependency records while excluding references removed in the +same selected tree. Ambiguous out-of-editor fingerprint moves now leave registry/manifests +unchanged and open an explicit identity-repair review in the editor; the user can preserve one +candidate ID or intentionally register the file as new. Headless processing reports both candidate +paths until that choice is published instead of silently allocating a replacement ID. +Focused repair coverage proves preserved-ID continuity through the next shared scan, intentional +new-ID behavior, duplicate-ID rejection, and one commit that publishes the world registry, registry +file, and stripped runtime catalog together. Content shortcuts are also suppressed while a browser +review or popup owns input, and Cut/Paste keeps the requested name so collisions reach review. +The follow-up QoL audit made right-click targeting consistent for files, folders, and embedded +subassets; distinguishes nested selections covered by a selected parent from genuinely unaffected +built-ins/subassets; and clears selection when search/scope/type filters would hide it. Browser +controls are disabled behind reviews. Startup, manual Refresh, and watcher processing now share the +same pipeline, rediscover unresolved move repairs after restart, and selection-only changes no +longer trigger whole-catalog fingerprint or registry work. +A rebuilt native editor then mapped successfully on the live Wayland session with the shared +startup refresh active. The Details drag strip now uses one stable explicit egui ID across layout +passes; a final bounded launch produced no resize-handle ID warning, and the following headless +check again reported zero content changes. + +The architecture audit also moved destination-first import planning/publication, source +fingerprints, static-mesh normalization, animation normalization, and combined model-artifact +publication into `content_pipeline`. The `process-assets` feature's dependency tree no longer +contains the editor crate; the editor retains compatibility re-exports for its UI consumers. + +The extraction correction adds focused coverage for dependent registry edits that can see newly +registered asset IDs, byte-restoring rollback when that dependent edit fails, and source-index +mapping across every draw slot that uses an extracted source material. Re-extraction coverage also +requires an explicit decision for provenance matches, rejects stale external edits, preserves the +existing asset ID on Apply, and restores exact prior bytes if dependent publication fails. + +Property-block coverage verifies owner/slot-local Standard handles, stable handle counts across +repeated application, strongest precedence above an existing Material Instance on the Surface +path, and whole-block rejection for invalid Standard/schema/type/range/texture input. Invalid +blocks leave the resolved base handle visible and emit one deduplicated diagnostic. + +The reviewed promotion transaction has focused coverage for a direct Material and an existing +Material Instance base, exact-slot assignment, one scene-history edit, cancel without mutation, +source/slot/schema/block/target conflicts after review, invalid runtime input, and restoration of +the exact prior file, registry, and runtime-catalog bytes when the scene edit fails. The import +review likewise has focused coverage for non-mutating planning, collision refusal, post-review +source/registry/runtime-catalog changes, complete textual-glTF dependency fingerprints, artifact +processing failure with whole-bundle rollback, adopted-file preservation, and an explicitly pinned +Import To destination that does not change the visible browser location. + +The final native promotion scenario used the editor-only BRP reflection boundary to inject a +two-parameter `MaterialPropertyBlock` into Ground's exact `slot:primitive:surface`. The Inspector +reviewed and published one sparse direct-base Material Instance, assigned it to only that primitive +slot through one history edit, and removed the runtime block only after publication succeeded. +BRP readback proved the exact Material Instance reference and absence of the runtime component; +Undo restored the original Pebble Bricks slot. The temporary instance, registry, catalog, scene, +and Pebble fixture were then restored to their pre-scenario bytes. Runtime blocks remain absent +from Add Component and scene/prefab persistence; no QA-only authoring component was added. + +The final moved/reimported QA fixture hashes were: + +- registry: `e1eb425c2d52be06d7db840df1f14f1d3a96daf2c1876dfc025d861bf0d32b74` +- runtime catalog: `cc296049b656d52e3159cca2e11f52bc4bdef0c922fb0dc00fa5d33f4e3748e7` +- desk static-mesh manifest: `6c69a9f9502fce36cb88e82a7e2e2074e6279ca6da4d49e3e36c1ede35c0577f` +- desk animation manifest: `8a0632bd8b6ea4a5d117214ea168f4020f9399c92bb9da3d7cba1ad371b9e4e8` +- extracted desk Material: `70e498f596d37da5735f5e0d0b1f3834442cd1aefa698232a640fec9d9e422f3` +- skeletal static-mesh manifest: `ee9168b123d89ff57b312a35e54a3a8d5bf5b9dae3ed98e79c7bc24dcb6d6454` +- skeletal animation manifest: `7c14b6ad016db5c09af7f56f50492a05f9bdd89b1bb672e9886bc9a3447e2130` + +The latest 2026-07-14 rerun of `cargo package-project --profile development` wrote zero changed +files and reused 74 unchanged files. The packaged +`assets/content.catalog.ron` was byte-identical to the source runtime catalog with SHA-256 +`cc296049b656d52e3159cca2e11f52bc4bdef0c922fb0dc00fa5d33f4e3748e7`. A bounded native package +launch hydrated the authored scene and visibly rendered the world-space DefaultGrid across UV-less +primitives and the floor. The corrective binary also mapped a live 3426x1384 Hyprland window as +class `bevy-fps-foundation`, title `Bevy FPS Foundation`, before the bounded QA process stopped. + +## Screenshot Captures + +The native PNGs are retained locally pending upload as Gitea issue attachments. Repository image +copies are intentionally not required by the evaluation policy. + +| Capture | Dimensions | SHA-256 | +|---------|------------|---------| +| `blacksite-m2-managed-hidden.png` | 3426x1384 RGB PNG | `97bb710d569039b54218a556865f366cff3bda2ae6ce3afe4a1933db8e58c36b` | +| `blacksite-m2-empty-clears-selection.png` | 3426x1384 RGB PNG | `e162c865202717cf36eec7a37c3f95a4cc4c3c55dcc5d48243b00fe47be0d136` | +| `blacksite-m2-multiselect-fixed-2.png` | 3426x1384 RGB PNG | `729ae5d2b10ca2d8acdd249f19c35f5e6f3a57d9dbb9550f80c371b703336868` | +| `blacksite-m2-multiselect-context.png` | 3426x1384 RGB PNG | `88232360d592a1e4436e86a17fe1356ea10d7766cfbdb98eb6323767cbc16fe6` | +| `blacksite-m2-item-context.png` | 3426x1384 RGB PNG | `6f01f23ea7ad65dffecd0d0e51e57b6a1fcf26cf06cfe6f536f8376557a6649b` | +| `blacksite-m2-details-resized.png` | 3426x1384 RGB PNG | `407ee7779367f83ca2a9c5d6f4a5803584609e319d881265f9544b194fbd0296` | +| `blacksite-m2-office-empty-context.png` | 3426x1384 RGB PNG | `a4004292f70b8a07f6c0d24e8bc47c1716e7de33b4b627a67c4198afe76a00a3` | +| `blacksite-m2-imported-model-details.png` | 3426x1384 RGB PNG | `cf68b41293b823945fdd17e9752d3733f8d38144504f5fdbfd9be7f793ce0205` | +| `blacksite-m2-extraction-review.png` | 3426x1384 RGB PNG | `f4d567d3353536ca1492d48fe59f72ff5b3e4b37c095ef27eaed51347c6a67ec` | +| `blacksite-m2-extraction-transaction.png` | 3426x1384 RGB PNG | `99944392580a88ec14868dbf5a422bacc89ca3b8d8d0750311f429e65250aef6` | +| `blacksite-m2-details-wide-mapped.png` | 3426x1384 RGB PNG | `6aee075b4006909cde1625d5afd42a8be93b9323de93156bd8a55d27ef07e678` | +| `blacksite-m2-defaultgrid-solari.png` | 3426x1384 RGB PNG | `9f23685f6354029ce772878a3f080c7efb045ccc73fce6c19f8fe7802e378ee8` | +| `blacksite-m2-orphan-controls.png` | 3426x1384 RGB PNG | `afe8f07d92c00ac1294b021682a66ea623b3c22158598119d2617f2e0b1dae72` | +| `blacksite-m2-orphan-locate.png` | 3426x1384 RGB PNG | `d7c841747e1a712da80537846699baa8b2f83f91a65ddc298d1d3e665f2e74b7` | +| `blacksite-m2-orphan-applied.png` | 3426x1384 RGB PNG | `c979981fba5b30692c3f858fd349b582bb204b5720702bd684f3721ed5a76350` | +| `blacksite-m2-root-empty-context.png` | 3426x1384 RGB PNG | `960231dc8661f7b012abf7ddf0cc97ce42548e789e911895e12b8b800b29153d` | +| `blacksite-m2-office-move-review-fixed.png` | 3426x1384 RGB PNG | `aaa06af27049858f2c691b9c251197a19a5330919048b59b2c313d06d2bf4471` | +| `blacksite-m2-office-moved-fixed.png` | 3426x1384 RGB PNG | `0cfdd6206d56355583c55e483959c8c154223acf5142015f9f2329da54baf5ca` | +| `blacksite-m2-moved-model-reimported.png` | 3426x1384 RGB PNG | `a6420434c25f72af94f1f4bdb22c8686bd840aad5fe114c192bdefc6db020aec` | +| `blacksite-m2-duplicate-review.png` | 3426x1384 RGB PNG | `f0fae051ca8c807540779de662a5381b3e9f1ac3faaf1cd5412bb7f1cb2835b0` | +| `blacksite-m2-duplicate-committed.png` | 3426x1384 RGB PNG | `3e3b0fd38f0374c47598307d93f5238028d269753742f4b296536f0fe886c1a5` | +| `blacksite-m2-duplicate-undo-clean-editor.png` | 3426x1384 RGB PNG | `45aaa55e2069de66d9eb86f4157fd143d92afa2de07aaefb0bb2cc960958401a` | +| `blacksite-m2-packaged-live-window.png` | 3426x1384 RGB PNG | `de8c19b2dbc2b488e290b5e4d1bd3e1c279388374a81e25a5684dd2454f58ee2` | +| `blacksite-m2-reextract-modal.png` | 1440x3440 RGB PNG | `b7139a3b6da88755be1c53ef9921450449f207a3082248efd8199bd8abdea515` | +| `blacksite-m2-reextract-selected.png` | 1440x3440 RGB PNG | `bd22912ff3d2e4bfdab6469909344a0b0e94f8309665ad876e98e43fe7c80563` | +| `blacksite-m2-reextract-applied.png` | 1440x3440 RGB PNG | `007164ae995c64f048aac638e20664fc173769945691afc3e6a0a6fbf4704380` | +| `blacksite-m2-reextract-undo.png` | 1440x3440 RGB PNG | `3f95eec702d4df6a55d88132c82282311d96d3bca15e2a8ebe11d06ee408461b` | +| `m2-skeletal-import-review.png` | 1440x3440 RGB PNG | `a08dc1d17848d3089d601c8b31c697c5f22b36dda625baf5fa8f52ee7dad2ea2` | +| `m2-skeletal-selected.png` | 1440x3440 RGB PNG | `2867517356b63a1b7627d5d069e7b45150325065ef247ff20a06c00b53c79581` | +| `m2-skeletal-placed.png` | 1440x3440 RGB PNG | `1936dfcd84d9a6e6cf8f293f71d8a4cb89d1761ad9ee982954ad25682cfd999d` | +| `m2-project-default-selected.png` | 1440x3440 RGB PNG | `ee3d5385ccd7af1d099a042fb02400e1e193374ca475a28b3d7f55d483d64547` | +| `m2-project-default-broken-fallback.png` | 1440x3440 RGB PNG | `5efb715a619456afcbee808d13f7b4c2cf24bb975f6b69671401bba1fed07ba0` | +| `m2-inspector-open.png` | 1440x3440 RGB PNG | `7ae9d456d0924ab50012ecbefb8e42847ccb141793ce89487c0fd2fbd2b8307e` | +| `m2-skeletal-scene-override.png` | 1440x3440 RGB PNG | `3c7ec6fce6a09f9e46402aa64dda77c5508703a11149b30297cee80d9e7907af` | +| `m2-import-to-selected.png` | 1440x3440 RGB PNG | `d9cb38de6fca185dab6887324163698b2ac036e8f5eb19f16fb65415172f9605` | +| `m2-import-review.png` | 1440x3440 RGB PNG | `631e1ac1d3c63d72d7c930c3b4789584e15a178f03425fd972df82da51dcfa05` | +| `property-block-promotion-20260717T130300Z.png` | 3426x1384 RGB PNG | `69cd668618206b1cee25142521127882cc785031e8e7cd21684c1eab7c97befa` | + +## Remaining Release Use + +The complete deterministic candidate gate passes on the local candidate tree. After assigning its +exact commit, confirm the clean-tree evidence digest, publish the native/candidate evidence on +Gitea, and finish with issue/milestone readback. The local candidate tree covers static and skeletal +import, edit/reimport/orphan resolution, broken project fallback, scene-slot precedence, reviewed +Import To cancellation, runtime-injected property-block promotion, responsive Penpot material UI, +dirty/save/restart behavior, and packaged runtime behavior. Publication readback—not another +destructive native content-authoring repetition—is the remaining release use of this record. diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/README.md b/docs/editor/evaluations/content-workspace-m2/penpot/README.md new file mode 100644 index 0000000..420add8 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/README.md @@ -0,0 +1,40 @@ +# M2 Penpot Design Exports + +> **Evidence record — not current product guidance.** Use the [documentation index](../../../../README.md) for current behavior and architecture. These exports pin the visual acceptance targets used to close M2 issues #67 and #68. The source document is `Blacksite Editor UI` (`cf1804c7-b801-80c5-8008-57ad3313e5c6`). + +The current Penpot README makes pages 01–30 authoritative, pages 90–91 implementation masters only, and page 99 forbidden as current guidance. The `CODEGEN MAP` block is handoff documentation and never renders in Blacksite. + +## Responsive Inspector targets + +| Export | Penpot page and shape | Required match | +|---|---|---| +| [Materials — wide](materials-wide-620.svg) | Page 01, `ad983554-05bb-80cb-8008-5698dfab667e` | 620 px Inspector reference; 596 px material slot; 569 px parameter body; deterministic wide rows and actions. | +| [Materials — narrow](materials-narrow-420.svg) | Page 01, `ad983554-05bb-80cb-8008-5698e08d425a` | 420 px Inspector floor; 396 px material slot; 369 px parameter body; two-line input rows with no clipping or horizontal scroll. | +| [Static Mesh Renderer — wide](static-mesh-renderer-wide-760.svg) | Page 02, `6cb78075-fbd0-8045-8008-57f5315abf0a` | Full 760 px renderer composition, stable slot ordering, shared component chrome, and repeated material slots. | +| [Static Mesh Renderer — narrow](static-mesh-renderer-narrow-480.svg) | Page 02, `6cb78075-fbd0-8045-8008-57f5419afad2` | Full 480 px renderer composition and bounded narrow reflow. | + +## Shared component targets + +| Export | Penpot page and shape | Required match | +|---|---|---| +| [Foundation components catalog](foundation-components-catalog.svg) | Page 11, `6cb78075-fbd0-8045-8008-5801d6740577` | Authoritative controls, field sizing, selection behavior, asset/drop states, vector layouts, buttons, disclosure, and usage rules shared by Inspector components. | +| [Inspector component header](component-header-50.svg) | Page 12, `83c3baf0-0e37-808a-8008-57cd2388f9b9` | One reusable 50 px component header and action/status geometry. | +| [Array header](array-header-40.svg) | Page 12, `83c3baf0-0e37-808a-8008-57cd23947466` | One reusable 40 px collection header. | +| [Composition rule](component-composition-rule.svg) | Page 12, `83c3baf0-0e37-808a-8008-57cd23a58de0` | Component containment and section ownership rule. | +| [Material components and states](material-components-states.svg) | Page 13, `83c3baf0-0e37-808a-8008-57d8c2a3305d` | Shared slot anatomy and direct, inherited, dirty, processing, failed, read-only, imported-source, and built-in states. | + +## Color-picker targets + +| Export | Penpot page and shape | Required match | +|---|---|---| +| [Wheel](color-picker-wheel.svg) | Page 22, `83c3baf0-0e37-808a-8008-57cd9b7b0667` | Wheel mode layout, current/previous values, alpha, recents, and footer behavior. | +| [Adjusted wheel state](color-picker-adjusted.svg) | Page 22, `83c3baf0-0e37-808a-8008-57cd9bbd9c3b` | Dirty preview state and exact value presentation. | +| [Sliders](color-picker-sliders.svg) | Page 23, `83c3baf0-0e37-808a-8008-57cda8a2c70f` | Sliders mode layout and conversion controls. | +| [Presets](color-picker-presets.svg) | Page 23, `83c3baf0-0e37-808a-8008-57cda8c84257` | Presets mode, recent/user palette presentation, and bounded footer. | + +## Issue ownership + +- **#68** owns exact Inspector/component/material/color-picker geometry and responsive behavior against these exports. +- **#67** owns the live authored-document and save-state behavior represented by the material-state and adjusted-color exports: interaction remains memory-only until explicit save, with distinct unsaved, processing, failed, and conflict state. +- **#65** owns consolidated native comparison evidence across wide, narrow, short-height, multi-slot, overlay, save, restart, and failure scenarios. +- **#59** indexes the design authority and requires the relevant child acceptance targets to be satisfied before epic closure. diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/array-header-40.svg b/docs/editor/evaluations/content-workspace-m2/penpot/array-header-40.svg new file mode 100644 index 0000000..ead7a87 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/array-header-40.svg @@ -0,0 +1,14 @@ +Mesh renderers8Each mesh owns its material slot array+Add renderer diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-adjusted.svg b/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-adjusted.svg new file mode 100644 index 0000000..8d01e4d --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-adjusted.svg @@ -0,0 +1,14 @@ +Base ColorsRGB · RGBAWheelSlidersPresetsDrag ring for hue · square for S/VCURRENTPREVIOUSHEX#53D3E6RGBAR83G211B230A255HSVH187°S64%V90%ALPHARECENTEnter apply · Esc cancelCancelApplyAdvancedPlanned — renderer support pending diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-presets.svg b/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-presets.svg new file mode 100644 index 0000000..6b4f633 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-presets.svg @@ -0,0 +1,14 @@ +Base ColorsRGB · RGBAWheelSlidersPresetsRECENTEnter apply · Esc cancelCancelApplyCURATED MATERIAL COLORSSELECTED#E7D4B4Save preset diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-sliders.svg b/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-sliders.svg new file mode 100644 index 0000000..1320c31 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-sliders.svg @@ -0,0 +1,14 @@ +Base ColorsRGB · RGBAWheelSlidersPresetsRECENTEnter apply · Esc cancelCancelApplyRGBA CHANNELSR231G212B180A255HSV CHANNELSH38°S22%V91%#E7D4B4Drag a channel or edit its numeric field diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-wheel.svg b/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-wheel.svg new file mode 100644 index 0000000..b2c4a7f --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/color-picker-wheel.svg @@ -0,0 +1,14 @@ +Base ColorsRGB · RGBAWheelSlidersPresetsDrag ring for hue · square for S/VCURRENTPREVIOUSHEX#E7D4B4RGBAR231G212B180A255HSVH38°S22%V91%ALPHARECENTEnter apply · Esc cancelCancelApply diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/component-composition-rule.svg b/docs/editor/evaluations/content-workspace-m2/penpot/component-composition-rule.svg new file mode 100644 index 0000000..fa66529 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/component-composition-rule.svg @@ -0,0 +1,14 @@ +Composition ruleInspector-specific pages should compose these shared headers with domain primitives rather than duplicating their internals. diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/component-header-50.svg b/docs/editor/evaluations/content-workspace-m2/penpot/component-header-50.svg new file mode 100644 index 0000000..0601958 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/component-header-50.svg @@ -0,0 +1,14 @@ +Static Mesh Renderer8 renderers · 12 material slotsActive diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/foundation-components-catalog.svg b/docs/editor/evaluations/content-workspace-m2/penpot/foundation-components-catalog.svg new file mode 100644 index 0000000..e2bf924 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/foundation-components-catalog.svg @@ -0,0 +1,14 @@ +Blacksite FoundationsAuthoritative reusable controls organized by interaction semantics. Use these components instead of rebuilding look-alikes inside feature inspectors.SELECTIONExclusive, multi-select, toggle, checkbox, and segmented patterns. Choose by data semantics, not by whichever widget looks convenient.CHECKBOXESVisibleVisibleTOGGLEDouble SidedSEGMENTEDSeparateORMSINGLE SELECTGMULTI SELECT — CLOSEDRGB3 selectedMULTI SELECT — OPENRGB3 selectedRGBASingle Select: exactly one value. Multi Select: zero or more values, summarized in the trigger and edited through a checklist. Reuse for enums, modes, tags, layers, flags, filters, bitmasks, channels, platforms, and feature sets.TEXT & GENERAL FIELDSUser-authored strings, search, general enum fields, and scalar input primitives.SINGLE-LINE TEXTEnter value…SEARCHSearch…MULTILINE TEXTMultiline text…LABELED COMBOSurfaceOpaqueNUMERIC & PARAMETER CONTROLSScalar numbers, units, ranges, booleans, sliders, and color values.NUMERIC0.72WITH UNIT1.00m/sRANGE0.001.00BOOLEANVisibleEnabledSLIDERCOLORVECTOR PARAMETERSSame fixed dimension, two presentation variants. Horizontal for wide inspectors; vertical for narrow layouts. Preserve axis order and colors.VECTOR2 · HORIZONTALX0.00Y0.00VECTOR2 · VERTICALX0.00Y0.00VECTOR3 · HORIZONTALX0.00Y0.00Z0.00VECTOR3 · VERTICALX0.00Y0.00Z0.00VECTOR4 · HORIZONTALX0.00Y0.00Z0.00W0.00VECTOR4 · VERTICALX0.00Y0.00Z0.00W0.00ASSET FIELDS & DROP STATESAssigned fields and drag-target states. Valid targets use cyan focus treatment; invalid targets retain the dark surface with an error border.FULL ASSET FIELDmetal_office_desk / Primitive 0assets/Furniture/Office/metal_office_desk.meshCOMPACT ASSET PICKERT_Wood_ORMDROP VALIDDROP INVALIDDrop to assign assetCompatible asset · release to assignIncompatible assetThis field does not accept that asset typeBUTTONS & DISCLOSURESmall action primitives and collapsible structural controls.ICON BUTTONDISCLOSURE · COLLAPSEDAdvancedPlanned — renderer support pendingDISCLOSURE · EXPANDEDAdvancedPlanned — renderer support pending diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/material-components-states.svg b/docs/editor/evaluations/content-workspace-m2/penpot/material-components-states.svg new file mode 100644 index 0000000..1e35cd2 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/material-components-states.svg @@ -0,0 +1,14 @@ +Materials ComponentsAuthoritative material editor components shared by the Materials inspector and mesh material-slot workflows.MATERIAL SLOT · EXPANDEDReusable inline material editor. This is the source used by both Inspector Materials and Static Mesh Renderer slot editing.M_Wood_Planksmaterials/wood/M_Wood_Planks.matStandard LitCompiledPARAMETERSSurfaceOpaqueSeparateORMDouble SidedInputs6 bindingsBase Color#E7D4B4T_Wood_ORMMetallic0.72GT_Wood_ORMRoughness0.72GT_Wood_ORMOcclusion0.72GT_Wood_ORMNormal0.72GT_Wood_ORMEmissive#E7D4B4T_Wood_ORMUVOffsetX0.00Y0.00TilingX1.00Y1.00AdvancedPlanned — renderer support pendingCODEGEN DOCUMENTATIONReusable implementation notes for mapping visual component composition into Bevy egui.CODEGEN MAPMaterials list repeated collapsible slot framesSlot header is the disclosure target; its body is nested beneath itIndented spine + PARAMETERS body communicate expanded ownershipResponsive rows preserve alignment without redundant column labels diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/materials-narrow-420.svg b/docs/editor/evaluations/content-workspace-m2/penpot/materials-narrow-420.svg new file mode 100644 index 0000000..c5cd57d --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/materials-narrow-420.svg @@ -0,0 +1,14 @@ +MaterialsM_Wood_Planksmaterials/wood/M_Wood_Planks.matStandard LitCompiledPARAMETERSSurfaceOpaqueSeparateORMDouble SidedInputs6 bindingsBase Color#E7D4B4T_Wood_ORMMetallic0.72GT_Wood_ORMRoughness0.72GT_Wood_ORMOcclusion0.72GT_Wood_ORMNormal0.72GT_Wood_ORMEmissive#E7D4B4T_Wood_ORMUVOffsetX0.00Y0.00TilingX1.00Y1.00AdvancedPlanned — renderer support pendingCODEGEN MAPMaterials list repeated collapsible slot framesSlot header is the disclosure target; its body is nested beneath itIndented spine + PARAMETERS body communicate expanded ownershipResponsive rows preserve alignment without redundant column labels diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/materials-wide-620.svg b/docs/editor/evaluations/content-workspace-m2/penpot/materials-wide-620.svg new file mode 100644 index 0000000..dc3d7dd --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/materials-wide-620.svg @@ -0,0 +1,14 @@ +MaterialsM_Wood_Planksmaterials/wood/M_Wood_Planks.matStandard LitCompiledPARAMETERSSurfaceOpaqueSeparateORMDouble SidedInputs6 bindingsBase Color#E7D4B4T_Wood_ORMMetallic0.72GT_Wood_ORMRoughness0.72GT_Wood_ORMOcclusion0.72GT_Wood_ORMNormal0.72GT_Wood_ORMEmissive#E7D4B4T_Wood_ORMUVOffsetX0.00Y0.00TilingX1.00Y1.00AdvancedPlanned — renderer support pendingCODEGEN MAPMaterials list repeated collapsible slot framesSlot header is the disclosure target; its body is nested beneath itIndented spine + PARAMETERS body communicate expanded ownershipResponsive rows preserve alignment without redundant column labels diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/static-mesh-renderer-narrow-480.svg b/docs/editor/evaluations/content-workspace-m2/penpot/static-mesh-renderer-narrow-480.svg new file mode 100644 index 0000000..a47bde3 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/static-mesh-renderer-narrow-480.svg @@ -0,0 +1,14 @@ +Static Mesh Renderer3 renderers · 5 material slotsActiveMesh renderers3Each renderer owns the slots exposed by its mesh+Add rendererRENDERER 0metal_office_desk / Primitive 0draw:scene0:node2:mesh2:primitive03 slotsRenderer propertiesMesh + render flagsNamemetal_office_desk / Primitive 0Meshmetal_office_desk / Primitive 0assets/Furniture/Office/metal_office_desk.meshFlagsVisibleCast shadowsReceive shadowsMaterial slots3 exposed by meshIndex mappedSLOT0M_Wood_Planksmaterials/wood/M_Wood_Planks.matStandard LitCompiledSLOT1M_Painted_Metalmaterials/office/M_Painted_Metal.matCompiledSLOT2No material assignedDrop a material here or choose from the browserChoose materialmetal_office_desk_drawer_06 / Primitive 0Renderer 1 · 1 material slot · Visible · Shadows on1 slotmetal_office_desk_tray_01 / Primitive 0Renderer 2 · 1 material slot · Hidden · Shadows on1 slot diff --git a/docs/editor/evaluations/content-workspace-m2/penpot/static-mesh-renderer-wide-760.svg b/docs/editor/evaluations/content-workspace-m2/penpot/static-mesh-renderer-wide-760.svg new file mode 100644 index 0000000..d9da0a3 --- /dev/null +++ b/docs/editor/evaluations/content-workspace-m2/penpot/static-mesh-renderer-wide-760.svg @@ -0,0 +1,14 @@ +Static Mesh Renderer3 renderers · 5 material slotsActiveMesh renderers3Each renderer owns the slots exposed by its mesh+Add rendererRENDERER 0metal_office_desk / Primitive 0draw:scene0:node2:mesh2:primitive03 slotsRenderer propertiesMesh + render flagsNamemetal_office_desk / Primitive 0Meshmetal_office_desk / Primitive 0assets/Furniture/Office/metal_office_desk.meshFlagsVisibleCast shadowsReceive shadowsMaterial slots3 exposed by meshIndex mappedSLOT0M_Wood_Planksmaterials/wood/M_Wood_Planks.matStandard LitCompiledPARAMETERSSurfaceOpaqueSeparateORMDouble SidedInputs6 bindingsBase Color#E7D4B4T_Wood_ORMMetallic0.72GT_Wood_ORMRoughness0.72GT_Wood_ORMOcclusion0.72GT_Wood_ORMNormal0.72GT_Wood_ORMEmissive#E7D4B4T_Wood_ORMUVOffsetX0.00Y0.00TilingX1.00Y1.00AdvancedPlanned — renderer support pendingSLOT1M_Painted_Metalmaterials/office/M_Painted_Metal.matCompiledSLOT2No material assignedDrop a material here or choose from the browserChoose materialmetal_office_desk_drawer_06 / Primitive 0Renderer 1 · 1 material slot · Visible · Shadows on1 slotmetal_office_desk_tray_01 / Primitive 0Renderer 2 · 1 material slot · Hidden · Shadows on1 slot diff --git a/docs/editor/evaluations/deterministic-asset-fingerprints/README.md b/docs/editor/evaluations/deterministic-asset-fingerprints/README.md index e3a9201..d9c3e64 100644 --- a/docs/editor/evaluations/deterministic-asset-fingerprints/README.md +++ b/docs/editor/evaluations/deterministic-asset-fingerprints/README.md @@ -1,5 +1,7 @@ # Deterministic Imported-Asset Fingerprints Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + **Date:** 2026-07-13 **Issue:** [Gitea #56](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/56) diff --git a/docs/editor/evaluations/fbx-external-texture-dependencies/README.md b/docs/editor/evaluations/fbx-external-texture-dependencies/README.md index a2f3759..c8d0fda 100644 --- a/docs/editor/evaluations/fbx-external-texture-dependencies/README.md +++ b/docs/editor/evaluations/fbx-external-texture-dependencies/README.md @@ -1,5 +1,7 @@ # FBX External Texture Dependency Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + **Date:** 2026-07-13 **Issue:** [Gitea #58](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/58) diff --git a/docs/editor/evaluations/guarded-shutdown-savepoints/README.md b/docs/editor/evaluations/guarded-shutdown-savepoints/README.md index 2e9c1c4..fa163be 100644 --- a/docs/editor/evaluations/guarded-shutdown-savepoints/README.md +++ b/docs/editor/evaluations/guarded-shutdown-savepoints/README.md @@ -1,5 +1,7 @@ # Guarded Shutdown And Clean Savepoints Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + **Date:** 2026-07-13 **Issue:** [Gitea #55](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/55) diff --git a/docs/editor/evaluations/h1-signoff.md b/docs/editor/evaluations/h1-signoff.md index 3c1c543..0803435 100644 --- a/docs/editor/evaluations/h1-signoff.md +++ b/docs/editor/evaluations/h1-signoff.md @@ -1,6 +1,6 @@ # H1 Gate Sign-Off — Game Development Ready -> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/). +> **Historical record — not current implementation guidance.** Current production authority: [production-readiness matrix](production-readiness/README.md). **Date:** 2026-05-30 **Evaluator:** implementation pass diff --git a/docs/editor/evaluations/h2-signoff.md b/docs/editor/evaluations/h2-signoff.md index 0984984..26038a6 100644 --- a/docs/editor/evaluations/h2-signoff.md +++ b/docs/editor/evaluations/h2-signoff.md @@ -1,6 +1,6 @@ # H2 Gate Sign-Off — Content Pipeline Maturity -> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/). +> **Historical record — not current implementation guidance.** Current production authority: [production-readiness matrix](production-readiness/README.md). **Date:** 2026-05-30 **Result:** Pass with waivers diff --git a/docs/editor/evaluations/h3-signoff.md b/docs/editor/evaluations/h3-signoff.md index 8a49722..17a91be 100644 --- a/docs/editor/evaluations/h3-signoff.md +++ b/docs/editor/evaluations/h3-signoff.md @@ -1,6 +1,6 @@ # H3 Gate Sign-Off — Gameplay Authoring -> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/). +> **Historical record — not current implementation guidance.** Current production authority: [production-readiness matrix](production-readiness/README.md). **Date:** 2026-05-30 **Result:** Pass diff --git a/docs/editor/evaluations/h4-signoff.md b/docs/editor/evaluations/h4-signoff.md index 9f9cdae..9ad0446 100644 --- a/docs/editor/evaluations/h4-signoff.md +++ b/docs/editor/evaluations/h4-signoff.md @@ -1,6 +1,6 @@ # H4 Gate Sign-Off — Multiplayer Tooling -> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/). +> **Historical record — not current implementation guidance.** Current production authority: [production-readiness matrix](production-readiness/README.md). **Date:** 2026-05-30 **Result:** Pass with waivers diff --git a/docs/editor/evaluations/h5-signoff.md b/docs/editor/evaluations/h5-signoff.md index ebc027a..a712203 100644 --- a/docs/editor/evaluations/h5-signoff.md +++ b/docs/editor/evaluations/h5-signoff.md @@ -1,6 +1,6 @@ # H5 Gate Sign-Off — Extensibility -> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/). +> **Historical record — not current implementation guidance.** Current production authority: [production-readiness matrix](production-readiness/README.md). **Date:** 2026-05-30 **Result:** Pass diff --git a/docs/editor/evaluations/h6-signoff.md b/docs/editor/evaluations/h6-signoff.md index cb45bf6..fd6a224 100644 --- a/docs/editor/evaluations/h6-signoff.md +++ b/docs/editor/evaluations/h6-signoff.md @@ -1,6 +1,6 @@ # H6 Gate Sign-Off — Production / Framework 1.0 -> Historical baseline only. Current production authority: [production-readiness matrix](production-readiness/). +> **Historical record — not current implementation guidance.** Current production authority: [production-readiness matrix](production-readiness/README.md). **Date:** 2026-05-30 **Result:** Pass with waivers diff --git a/docs/editor/evaluations/material-library-targeted-drop/README.md b/docs/editor/evaluations/material-library-targeted-drop/README.md index e4c67ad..c3b490d 100644 --- a/docs/editor/evaluations/material-library-targeted-drop/README.md +++ b/docs/editor/evaluations/material-library-targeted-drop/README.md @@ -1,5 +1,7 @@ # Material Library And Targeted Drop Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Date: 2026-07-12 Branch: `codex/material-library-targeted-drop` Implementation commit: `02247f0` diff --git a/docs/editor/evaluations/material-renderer-foundation/README.md b/docs/editor/evaluations/material-renderer-foundation/README.md index 7c1a785..ef2752e 100644 --- a/docs/editor/evaluations/material-renderer-foundation/README.md +++ b/docs/editor/evaluations/material-renderer-foundation/README.md @@ -1,5 +1,7 @@ # Renderer, Material, and Component Foundation Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Date: 2026-07-11 Branch: `codex/renderer-material-component-foundation` diff --git a/docs/editor/evaluations/native-dialog-responsiveness/README.md b/docs/editor/evaluations/native-dialog-responsiveness/README.md index ab0f446..f91d0f7 100644 --- a/docs/editor/evaluations/native-dialog-responsiveness/README.md +++ b/docs/editor/evaluations/native-dialog-responsiveness/README.md @@ -1,5 +1,7 @@ # Native Dialog Responsiveness Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Date: 2026-07-12 Branch: `codex/non-blocking-native-dialogs` Implementation commits: `d038cf3` and the closing commit for Gitea #52 diff --git a/docs/editor/evaluations/navigation-authoring/README.md b/docs/editor/evaluations/navigation-authoring/README.md index c066fd3..f04dee2 100644 --- a/docs/editor/evaluations/navigation-authoring/README.md +++ b/docs/editor/evaluations/navigation-authoring/README.md @@ -1,5 +1,7 @@ # Navigation Authoring Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Date: 2026-07-12 Branch: `codex/renderer-material-component-foundation` diff --git a/docs/editor/evaluations/operator-invariants/README.md b/docs/editor/evaluations/operator-invariants/README.md index 1899283..03c6d36 100644 --- a/docs/editor/evaluations/operator-invariants/README.md +++ b/docs/editor/evaluations/operator-invariants/README.md @@ -1,5 +1,7 @@ # Operator Invariants Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Date: 2026-07-12 Gitea issue: diff --git a/docs/editor/evaluations/physics-placement/README.md b/docs/editor/evaluations/physics-placement/README.md index 5f7d1c5..ac84c63 100644 --- a/docs/editor/evaluations/physics-placement/README.md +++ b/docs/editor/evaluations/physics-placement/README.md @@ -1,5 +1,7 @@ # Physics Placement Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Date: 2026-07-12 ![Three selected props settled on the committed placement floor](physics-placement-settled.png) diff --git a/docs/editor/evaluations/production-readiness/README.md b/docs/editor/evaluations/production-readiness/README.md index dac63fa..3854642 100644 --- a/docs/editor/evaluations/production-readiness/README.md +++ b/docs/editor/evaluations/production-readiness/README.md @@ -1,8 +1,10 @@ # Production-Readiness Acceptance Matrix -**Matrix version:** 0.7 +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. -**Last audit:** 2026-07-13 +**Matrix version:** 0.8 + +**Last audit:** 2026-07-14 **Release-candidate commit:** Not nominated @@ -35,15 +37,15 @@ another commit, a dirty worktree, or an older package do not transfer to the can | G3 | Undo/redo/cancel invariants and helper cleanup cover every production mutation path | Partial | Source implementation and focused evidence are complete in [operator regression testing](../../operator-regression-testing.md) and the [operator-invariants evaluation](../operator-invariants/); Gitea `#33` closed at `c55f347`. A clean, exact-candidate rerun is still required for `Pass`. | | G4 | Representative project completes an eight-hour soak without unbounded memory/target growth or unrecoverable failure | Missing | No candidate soak log, resource timeline, failure ledger, or target-growth measurement exists. | | G5 | Cold start, scene open/save, asset refresh, common manipulation, and package-build budgets are documented and measured | Missing | Gitea `#34` is open; no ratified budgets or candidate measurement record exists. | -| G6 | Headless content validation and CI are green from a clean checkout | Missing | [CI configuration](../../../../.github/workflows/ci.yml) hydrates LFS, runs both project/sample content gates, and asserts a pristine checkout. The [#56 feature run](../deterministic-asset-fingerprints/) passed native startup and both validators from a fresh LFS-hydrated worktree at `cbd380a`; [#58](../fbx-external-texture-dependencies/) passed both validators and clean native startup at `3e30c61`. No release candidate is nominated and no candidate CI run is linked. The current Gitea server does not expose an Actions run endpoint for this repository. | +| G6 | Headless content validation and CI are green from a clean checkout | Missing | [CI configuration](../../../../.github/workflows/ci.yml) hydrates LFS, runs both project/sample content gates, and asserts a pristine checkout. The [#56 feature run](../deterministic-asset-fingerprints/) passed native startup and both validators from a fresh LFS-hydrated worktree at `cbd380a`; [#58](../fbx-external-texture-dependencies/) passed both validators and clean native startup at `3e30c61`. The local M2 content-workspace run passed `process-assets --check`, both validators, full all-feature tests, and strict all-feature lint over 48 assets, but its dirty worktree is not candidate evidence. No release candidate is nominated and no candidate CI run is linked. The current Gitea server does not expose an Actions run endpoint for this repository. | | G7 | First-hour UX and recovery QA are signed off by someone other than the implementer | External | No independent sign-off exists. Gitea `#36` remains open; historical H1-H6 implementation-pass notes do not count. | -| G8 | Known limitations have severity/workaround and no P0 blocker remains | Partial | Sample-pack gap `#32`, guarded shutdown/savepoints `#55`, scoped UI action safety `#57`, deterministic imported-asset fingerprints `#56`, and external FBX dependency handling `#58` have complete feature-level acceptance; no known P0 implementation blocker remains. A consolidated candidate limitations ledger and exact-candidate rerun are still missing. Property-block application `#53` remains P1; dynamic deformed Solari geometry `#54` is a documented P2 limitation with Forward/raster fallback. | +| G8 | Known limitations have severity/workaround and no P0 blocker remains | Partial | Sample-pack gap `#32`, guarded shutdown/savepoints `#55`, scoped UI action safety `#57`, deterministic imported-asset fingerprints `#56`, external FBX dependency handling `#58`, and property-block application/promotion `#53` have complete feature-level implementations; no known P0 implementation blocker remains. A consolidated candidate limitations ledger and exact-candidate rerun are still missing. Dynamic deformed Solari geometry `#54` is a documented P2 limitation with Forward/raster fallback. | ## Deliverables | ID | Deliverable | State | Evidence or next action | |----|-------------|-------|-------------------------| -| D1 | Versioned acceptance matrix under `docs/editor/evaluations/` | Pass | This file, version 0.6. | +| D1 | Versioned acceptance matrix under `docs/editor/evaluations/` | Pass | This file, version 0.8. | | D2 | Release-candidate representative project and reproducible validation commands | Partial | The committed [sample regression pack](../sample-regression-pack/), commands, exact-implementation native evidence, and [fresh-checkout fingerprint protocol](../deterministic-asset-fingerprints/) exist. Nominate a release candidate and rerun the complete set from a clean LFS-hydrated checkout. | | D3 | Signed milestone comment linking evidence, limitations, and exact commit | Missing | Post only after G1-G8 pass; no candidate exists yet. | @@ -57,7 +59,7 @@ another commit, a dirty worktree, or an older package do not transfer to the can | Multi-scene composition | Implemented | Not rerun | | Five-area editor sample pack | Implemented with manifest, native menu, typed scene gate, and headless validation | Exact-implementation source/native acceptance passed at `d52cc2e`; not rerun as one release candidate | | Brush blockout/edit/CSG | Implemented foundation; `#37` open | Not signed off | -| Material catalog and assignment | Renderer/material foundation `#51`, Material Library, and exact targeted drops accepted; optional property-block promotion is `#53` | Not rerun as one candidate | +| Material catalog and assignment | Renderer/material foundation `#51`, Material Library, exact targeted drops, and MaterialPropertyBlock application/promotion `#53` are implemented | Not rerun as one candidate | | Rendering volumes and look development | Deterministic visible rendering fixture is in the sample pack | Not rerun as one candidate | | Terrain authoring | `#22`-`#24` source/live acceptance complete; M3 closed | Feature-level live acceptance exists; not rerun as one candidate. Packaged-runtime acceptance owner-deferred. | | Physics placement | `#25` source/live acceptance complete | Feature-level live acceptance exists; not rerun as one candidate. Packaged-runtime acceptance owner-deferred. | @@ -73,6 +75,7 @@ another commit, a dirty worktree, or an older package do not transfer to the can | Scoped UI action safety | Implemented; `#57` source validation, six focused regressions, selection precedence, and native toolbar/Inspector/diagnostics workflows passed at `9e23ae7` | Feature-level acceptance complete; not rerun as one candidate | | Imported asset identity and generated artifacts | Implemented; `#56` uses shared BLAKE3 fingerprints, byte-preserving semantic publication, and normalized registry order | Fresh LFS checkout, native startup, mtime-only drift, validators, and artifact hashes passed at `cbd380a`; not rerun as one candidate | | FBX external texture dependencies | Implemented; `#58` uses one sandboxed resolver, transactional bundle import, labeled loader images, authoritative manifests, and explicit Source Materials/Authoring Override semantics | Sibling/`.fbm`/missing/traversal/symlink tests, both validators, exact-implementation native chair QA, and a controlled broken fixture passed at `3e30c61`; not rerun as one candidate | +| Content workspace and import authoring | Registry v3, shared content pipeline, managed-path hiding, reviewed destination-first Import Here/Import To, file-manager multi-selection/context actions, transactional extract-and-map model defaults, stable-ID move/copy semantics, derived-aware Trash/restore, DefaultGrid, and reviewed exact-slot property-block promotion are implemented locally | [M2 native evaluation](../content-workspace-m2/) records the Poly Haven import/extraction, reimport orphan Locate/Clear, reference-safe folder move, fresh-ID Duplicate, guarded duplicate undo including generated manifests, Forward/Solari fallback, deterministic 48-asset headless processing, and a packaged DefaultGrid launch through 2026-07-14. Focused tests cover Import To/final-path review and transactional property-block promotion. Full all-feature tests/lint and validators pass with zero blockers. Exact committed-candidate rerun, clean-worktree assertion, Gitea attachments, and independent signoff remain pending. | ## Candidate Validation Commands @@ -88,6 +91,7 @@ cargo clippy -p editor -p game --bins --features dev,hot-reload -- -D warnings cargo test --workspace cargo validate-levels --project . cargo validate-samples --project . +cargo process-assets --project . --check --json cargo bake-navigation --project . --check ``` diff --git a/docs/editor/evaluations/sample-regression-pack/README.md b/docs/editor/evaluations/sample-regression-pack/README.md index ac0f9d2..c0ddb90 100644 --- a/docs/editor/evaluations/sample-regression-pack/README.md +++ b/docs/editor/evaluations/sample-regression-pack/README.md @@ -1,5 +1,7 @@ # Sample Regression Pack Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + **Date:** 2026-07-13 **Issue:** [Gitea #32](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/32) diff --git a/docs/editor/evaluations/scoped-ui-actions/README.md b/docs/editor/evaluations/scoped-ui-actions/README.md index 98ddabd..1246f0c 100644 --- a/docs/editor/evaluations/scoped-ui-actions/README.md +++ b/docs/editor/evaluations/scoped-ui-actions/README.md @@ -1,5 +1,7 @@ # Scoped UI Action Safety Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + **Date:** 2026-07-13 **Issue:** [Gitea #57](https://git.spacetrainclubhouse.com/Falling-Metal-Interactive/Blacksite/issues/57) diff --git a/docs/editor/evaluations/terrain-foundation/README.md b/docs/editor/evaluations/terrain-foundation/README.md index 45de66c..562ce23 100644 --- a/docs/editor/evaluations/terrain-foundation/README.md +++ b/docs/editor/evaluations/terrain-foundation/README.md @@ -1,5 +1,7 @@ # Terrain Foundation Evaluation +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Date: 2026-07-12 Branch: `codex/terrain-foundation` Gitea issue: `#22` diff --git a/docs/editor/evaluations/terrain-material-layers/README.md b/docs/editor/evaluations/terrain-material-layers/README.md index 120a45d..c8e2ae3 100644 --- a/docs/editor/evaluations/terrain-material-layers/README.md +++ b/docs/editor/evaluations/terrain-material-layers/README.md @@ -1,5 +1,7 @@ # Terrain Material Layers Acceptance +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + ## Evidence ![Terrain layer paint stroke](terrain-material-paint-stroke.png) diff --git a/docs/editor/evaluations/terrain-sculpt-tools/README.md b/docs/editor/evaluations/terrain-sculpt-tools/README.md index a209d65..1a89bcc 100644 --- a/docs/editor/evaluations/terrain-sculpt-tools/README.md +++ b/docs/editor/evaluations/terrain-sculpt-tools/README.md @@ -1,5 +1,7 @@ # Terrain Sculpt Tools Acceptance +> **Evidence record — not current product guidance.** Use the [documentation index](../../../README.md) for current behavior and architecture. + Issue: Gitea `#23` Scope: native Wayland debug editor; packaged acceptance remains deferred by project-owner direction. diff --git a/docs/editor/material-system.md b/docs/editor/material-system.md index ffa8823..39b6b0b 100644 --- a/docs/editor/material-system.md +++ b/docs/editor/material-system.md @@ -1,28 +1,65 @@ # Material System -Blacksite uses shared project materials and renderer-owned material slots. Static and skinned mesh -renderers expose the same assignment workflow, but remain separate components with separate mesh -and hydration ownership. The permanent contracts are [ADR 0035](../adr/0035-shared-material-assets-and-renderer-slots.md) -and [ADR 0036](../adr/0036-surface-abi-and-solari-parity.md). +Blacksite uses shared project materials and renderable-owned material slots. Primitives, static +meshes, and skinned meshes expose the same assignment workflow, but retain separate geometry and +hydration ownership. The permanent contracts are [ADR 0035](../adr/0035-shared-material-assets-and-renderer-slots.md), +[ADR 0036](../adr/0036-surface-abi-and-solari-parity.md), +[ADR 0046](../adr/0046-schema-driven-material-inputs-and-processed-textures.md), and +[ADR 0047](../adr/0047-editor-authored-asset-documents.md). Material authoring presentation follows +the shared [editor design system](design-system.md) and +[ADR 0049](../adr/0049-penpot-led-editor-visual-system.md). ## Mental model | Concept | Owns | Saved? | |---------|------|--------| -| Material asset | Reusable shader choice, render state, parameters, and textures | Yes, under `assets/materials/` | -| Material instance | Overrides over one direct base material | Yes, under `assets/materials/` | -| Renderer material slot | A stable reference on one static or skinned renderer | Yes, in scenes/prefabs | +| Material asset | Reusable shader choice, render state, parameters, and textures | Yes, anywhere under `assets/` | +| Material instance | Overrides over one direct base material | Yes, anywhere under `assets/` | +| Material slot assignment | Only the actor/prefab override for a stable primitive or renderer slot | Yes, in scenes/prefabs | | Imported source material | Read-only default supplied by model import | Yes, as the slot fallback | -| Material property block | Reserved runtime-only per-renderer/per-slot override schema; application/promotion tracked by Gitea #53 | No | +| Model material selection | Source, project Material/Instance, or Default for one stable imported slot | Yes, in registry import metadata | +| Property block | Per-owner/per-slot runtime parameter and texture overrides | No | +| DefaultGrid | Immutable engine fallback for missing or unassigned surfaces | Engine built-in | -A renderer slot stores a `MaterialRef`, not a copy of the material. The registry UUID and subasset +A material slot assignment stores a `MaterialRef`, not a copy of the material. Model defaults and +imported source selections stay asset-owned in import metadata and runtime manifests instead of +being copied into actor overrides. Every primitive has one stable +`slot:primitive:surface`; mesh renderers use imported stable slot IDs. The registry UUID and subasset ID identify the target; the cached path is only a loading hint. A material instance may reference a material, but may not reference another instance. -`MaterialPropertyBlocks` are excluded from authored persistence, but they are not yet consumed by -renderer binding. Runtime application and the transactional **Promote to Material Instance** -workflow are tracked by Gitea #53. Use an ordinary direct-base Material Instance for reusable -variations until that issue closes. +Resolution is strongest-first: property block, scene/prefab slot, model default, imported source, +project default, then engine DefaultGrid. A broken explicit reference reports a diagnostic and uses +DefaultGrid; it does not silently expose a weaker source assignment. Clearing an assignment is the +explicit way to return to the next layer. + +Property blocks are applied after base resolution and cached per owner/slot for both Standard and +Surface materials, including above any sparse values already present on a selected Material +Instance. They never mutate a shared Material asset and remain excluded from scene/prefab +persistence. Unknown properties, schema/type/range mismatches, duplicate names, and broken texture +references reject the complete block with a diagnostic while the resolved base stays visible. +DefaultGrid cannot be edited, instanced, or used as a promotion base. + +The editor registers this runtime-only component with Bevy reflection so trusted local BRP tooling +can inject a block for debugging, gameplay integration, and promotion acceptance. Reflection does +not make the component an authoring component: it remains absent from Add Component, excluded from +scene/prefab serialization, and is never published by an asset save. + +Surface evaluators specialize forward and deferred material fragments only. Bevy's standard shader +remains authoritative for depth, normal, and motion-vector-only prepasses, so those passes never +try to write a deferred G-buffer attachment that is not present. + +When a selected primitive, static renderer, or skinned renderer has a runtime block, its exact material-slot card shows +the override counts and **Promote to Material Instance**. Promotion requires an explicit project +Material or direct-base Material Instance; imported source and DefaultGrid are intentionally +rejected. **Promote to Material Instance** opens a review showing the selected/direct base, exact +slot, sparse override counts, and collision-safe target path. The editor fingerprints the selected +asset, direct base, schema, runtime block, slot assignment, and absent target while the review is +open. Commit merges an existing instance's sparse values with the runtime block, creates one +direct-base Material Instance in the current Content Browser folder, assigns it to that exact scene +slot through one history transaction, and clears the runtime block only after file, registry, and +assignment publication succeed. Cancel or any conflict leaves the block, registry, scene, and +history unchanged. ## Assign materials @@ -36,32 +73,74 @@ Assign through either exact workflow: 1. Drag a Material or Material Instance from the Material Library or Asset Browser onto the desired viewport surface. A hydrated static/skinned draw targets its exact stable renderer slot, a - primitive targets its actor material, and a brush targets the exact face under the pointer. + primitive targets its stable surface slot, and a brush targets the exact face under the pointer. 2. Check the pointer card and target visual. Green names a valid actor/slot/face; red gives the blocking reason. Release commits one undoable assignment. Move away, leave the viewport, press Escape, or right-click to restore the pre-drag state without history or dirtying the scene. -3. Alternatively, select a static- or skinned-mesh actor and use **Browse** or **Select** on the - named slot in its renderer inspector. **Locate** reveals the current asset in the Asset Browser; - **Clear** removes only the explicit assignment and restores the read-only imported source. +3. Alternatively, select a primitive, static-mesh, or skinned-mesh actor and use its ordered + **Materials** section. Each 82 px expanded or 52 px collapsed slot header is an assignment + target; there is no adjacent drop + box. A valid Material/Instance drag uses the active theme's + selection highlight. A Texture drag + highlights the target as invalid and explains that textures must be authored inside a Material. + **Locate** reveals the current asset; **Clear** removes only the explicit assignment and restores + the inherited model source, project default, or DefaultGrid. -From the Asset Browser, **Apply Material** assigns the selected material to every material slot on -each selected static or skinned renderer. This is the explicit bulk path. A viewport hit never -silently broadens to all slots. +From the Asset Browser, **Apply Material** assigns the selected material to a primitive surface or +every material slot on each selected static/skinned renderer. This is the explicit bulk path. A +viewport hit never silently broadens to all slots. -Texture drops target a primitive's base-color texture or one brush face. Direct Texture drops on a -renderer slot are rejected because a renderer slot stores a Material reference; create or edit a -Material Instance and assign the texture there. +Direct Texture drops on primitive or mesh slots are rejected because slots store Material +references. Brush faces retain their specialized direct texture path. Create or edit a Material or +Material Instance, assign the texture there, then assign that asset to the slot. + +Expand any shared slot to inspect the actual effective material. At the current 620 px wide +reference the slot/body are 596/569 px; at the hard 420 px Inspector floor they are 396/369 px and +six parameter rows reflow to 58 px two-line rows. Project Materials and Instances open the +same asset-keyed editor used by the Content Browser. Valid parameter changes +update `blacksite_surface`'s live document overlay on every interaction frame; its single cache +mutates the shared Standard or Surface handle in place, and there are no Apply/Revert buttons. +The asset-keyed authored document becomes **UNSAVED**, survives selection changes, and performs no +source write, Git refresh, watcher work, thumbnail invalidation, or processing when the pointer is +released. `Ctrl+S` publishes the last edited context; `Ctrl+Shift+S` publishes every dirty editor +document. Scalar, color, label, shader-value, emissive, and render-state saves queue no derived +work; ARM/ORM binding changes queue one coalesced packing job. **Create Instance and Assign** transactionally publishes a +direct-base instance and assigns only the current actor slot for local variation. Imported source +parameters remain read-only; **Extract Editable…** opens extraction for that single source and +assigns the resulting project Material only to the selected actor slot. The project default is +expandable as inherited shared content. DefaultGrid is visible but read-only. + +The final panel shows only Shader, Surface, Inputs, shared UV, and supported Advanced Inputs. +Standard Lit stores seven inputs but reports six visible bindings: Emissive Intensity is a +companion of Emissive color and is edited/restored through the same popup. Offset/Tiling changes affect every texture sampler on the Material in +both Standard and Surface rendering; Material Instances may override them sparsely and Reset +restores the base values. Texture fields open their picker on field click and expose Locate and +Clear without a redundant folder action. Direct actor assignments do not receive an “Explicit” label. Source paths, fingerprints, +stable IDs, orphan state, and provenance are secondary diagnostics in overflow rather than material +parameters. The sphere preview and bounded 229.5 px reference identity live in the 82 px assignment block; preview, +identity, and Browse open the compact current/recent Material menu without making Shader or +action clicks assign anything. No second preview, drop box, or material-slot list is rendered. + +Project textures are loaded from runtime-catalog sampling data rather than Bevy's default sampler. +Repeat, Clamp, and Mirror map to Repeat, Clamp-to-edge, and Mirror-repeat for U/V/W; authored +filtering and anisotropy apply to Standard, Surface/Solari, property-block bases, and project +material previews. Packed AO/roughness/metallic sources must agree on filter, wrap, and anisotropy +because their canonical ARM artifact has one sampler. A mismatch retains the previous valid +material and reports a processing diagnostic. Imported glTF/FBX materials keep their loader-owned +samplers. See the [Material Library and targeted-drop evaluation](evaluations/material-library-targeted-drop/) for the live preview, commit/undo, cancel, and source-verification record. Static draw slots and material slots are separate. Removing a static draw retains its explicit material assignment as an orphan rather than guessing a replacement. Reimport also reconciles -slots by stable ID, never by display name. Resolve an orphan explicitly in the renderer inspector. +slots by stable ID, never by display name. Model Details can **Locate** the preserved project +Material/Instance or **Clear Orphan** before applying the import settings; active project/default +model selections likewise expose **Locate** and **Clear**, with Clear restoring Source. ## Author shared assets -Material files and material-instance files are RON documents under `assets/materials/`. The +Material files and material-instance files are typed RON documents anywhere under `assets/`. The Material Library and Asset Browser identify the document kind, expose the same guarded schema-driven editor and texture bindings, and use stable subasset IDs (`material:source` or `material:instance`). Material Instance thumbnails resolve the direct base plus sparse overrides. @@ -73,6 +152,18 @@ unchecked values continue to inherit. Material instances cannot inherit from oth Material render state exposes Opaque/Cutout, alpha cutoff, and Double Sided in the base Material inspector. +Materials extracted from textual glTF remain ordinary editable project assets. The extraction +review previews and can exclude each source material, shows converted PBR/render-state/texture +coverage, and permits collision-checked project-path edits before one atomic publication. The same +transaction assigns each affected stable model slot to the newly registered project Material; this +is an explicit model default, not a live source link. Their +Details card also shows read-only provenance: source asset path, source material label/stable index, +and a BLAKE3 source fingerprint. A later extraction detects that stable provenance, shows whether +the source revision, shader selection, render state, or converted PBR values differ, and requires +**Apply Reviewed Update** or **Create New Copy**. Apply replaces the file only while its reviewed +fingerprint still matches and rolls back exact prior bytes if the dependent model mapping cannot +publish. Provenance is not a live link and never authorizes an automatic overwrite. + Every standard and shader-schema texture slot uses the project texture picker. **Browse** lists texture assets across the project, including imported model texture subassets, and a texture can be dragged from the Asset Browser directly onto a slot. Non-texture drops are ignored. **Clear** removes @@ -80,6 +171,39 @@ the base Material value; on a Material Instance it removes the sparse override s from its base again. Dropping or browsing a texture onto an unchecked instance slot creates the override automatically. +## Schema-driven inputs and packed maps + +Material schema v2 stores one canonical `MaterialInputSet`. Standard Lit and custom Surface +shaders both describe their controls with `MaterialInputSchema`, so primitive, static-mesh, +skinned-mesh, Content Browser, and Material Library editors render the same responsive rows. The +exported 569 px section uses one fixed label/value/channel line beside its texture field; the 369 px +section stacks the texture field beneath that line. A bounded transient fallback below 369 px moves +Locate/Clear into overflow instead of allowing negative or out-of-clip geometry. Slot IDs, source +paths, fingerprints, and usage counts are diagnostics rather than material parameters. + +Base Color is a multiplier over its albedo texture. Metallic and Roughness are scalar multipliers +over their selected channel; Occlusion is a scalar texture input. The **ARM / glTF ORM** preset uses +R=ambient occlusion, G=roughness, and B=metallic. **Separate Maps** samples each map's R channel, +while the adjacent channel selectors support custom packed layouts. Publication repacks those +choices into one canonical linear R/G/B ARM artifact used by Standard and Surface/Solari paths. + +Select a Texture asset to edit its semantic, color space, mipmaps, compression, maximum size, +filtering, wrapping, anisotropy, and normal convention. Auto treats color/emissive maps as sRGB and +normal/mask/ARM data as Linear. DirectX normals are converted to OpenGL +Y during processing. +Texture property changes use the same **UNSAVED** document state. Saving preserves the source image +and queues a content-addressed UASTC Basis or uncompressed KTX2 artifact below managed +`.import-cache/runtime/` storage. The processor derives the output key from source bytes and +normalized settings before decoding; if that exact artifact already exists, editor refresh, +packaging, and `process-assets --check` reuse it without recompression. + +Loose PBR image sets can be turned into editable Material assets from the Content Browser with +**Create Materials From Folder**. The preview groups filename suffixes, reports confidence, and lets +authors correct roles or edit a target name to merge/split sets before publication. Base-color, +normal, and packed ORM/ARM maps populate the Standard material fields; occlusion and separately +authored roughness, metallic, or height maps are also retained as named Surface texture bindings. +The batch is transactional and never overwrites an existing Material file. See the +[content-workspace guide](content-workspace.md) for the full workflow. + The supported render states are: - **Opaque** — no alpha candidate test. @@ -91,7 +215,10 @@ Editing a shared asset never writes copies into renderer components. The runtime Material, direct base, shader schema, and evaluator dependencies and updates the shared hydrated handle in place. Standard and custom Surface changes therefore propagate to every assigned static or skinned renderer slot without reloading geometry, joints, or the current animation pose. Invalid -Surface edits retain the last-good evaluator generation and emit diagnostics. +Surface edits retain the last-good evaluator generation and emit diagnostics. The neutral +`StandardMaterial` attached during hydration is only a singleton emergency visibility handle. It +is never reused for an assigned asset: the resolver caches one live handle per `MaterialRef`, so +users of the same Material share updates while unrelated Materials cannot overwrite one another. Renderer and terrain material bindings target generated draw entities. Scene switches may remove those entities between binding discovery and deferred command application, so binding replacement @@ -154,8 +281,11 @@ cargo upgrade-project --project . cargo upgrade-project --project . --apply ``` -Apply mode stages the complete rewrite, creates a timestamped backup under -`.blacksite/backups/material-component-v4-*`, and rolls back on failure. Commit or otherwise back up +Repository scenes use schema v6 for actor-only slot ownership. This pre-production project updates +fixtures directly rather than carrying a generalized v5 compatibility migrator. The explicit +upgrade path converts legacy primitive/mesh descriptors and per-slot overrides into generalized saved slots, and deduplicates canonical descriptors into project +Materials under `assets/materials/migrated/`. It stages the complete rewrite, creates a timestamped +backup under `.blacksite/backups/material-slot-v5-*`, and rolls back on failure. Commit or otherwise back up the project before applying, inspect the diff afterward, then run: ```bash diff --git a/docs/editor/prefab-authoring.md b/docs/editor/prefab-authoring.md index 5ea6319..d96a6cb 100644 --- a/docs/editor/prefab-authoring.md +++ b/docs/editor/prefab-authoring.md @@ -35,10 +35,11 @@ builds apply the same data without loading the editor plugin. Select a generated prefab member to edit its override layer. The current inspector exposes: -- **Property overrides** for Transform position, rotation, and scale, plus Material base color, - metallic, and roughness. -- **Component overrides** for adding, replacing, or removing `MaterialDesc`, plus visibility on - direct or nested generated actors. +- **Property overrides** for reflected authoring-component fields, including Transform fields and + brush-only legacy `MaterialDesc` parameters. +- **Component overrides** for adding, replacing, or removing registered authoring components, plus + visibility on direct or nested generated actors. Primitive and mesh material assignments live in + their owning `MaterialSlot` data; `MaterialDesc` is not a general mesh/primitive material path. - **Structural overrides** for removing a source actor or reparenting generated actors within the same instance layer. Hierarchy **Unparent override** writes the same stable structural operation. diff --git a/docs/editor/project-launcher.md b/docs/editor/project-launcher.md index 9e25388..90ec8b8 100644 --- a/docs/editor/project-launcher.md +++ b/docs/editor/project-launcher.md @@ -51,9 +51,11 @@ the browser exits only after a new editor process has been accepted by the user' This keeps renderer, asset server, import registry, and project settings rooted consistently. On the supported Linux workstation, the **Blacksite Editor** desktop entry provides an **Open -Project Browser** action. Its wrapper builds both editor binaries into the shared target directory, -shows the normal startup splash, avoids duplicate browser processes, and preserves the Wayland, -session-bus, graphics, and XDG environment required by the detached process. +Project Browser** action. Its wrapper launches the current managed development binary directly, +shows the normal startup splash, avoids duplicate processes, and preserves the Wayland, session-bus, +graphics, and XDG environment required by the detached process. A desktop click never invokes Cargo. +An explicit `~/.local/bin/blacksite-editor --build-only` rebuild uses the repository's managed Cargo +lane; a missing binary produces an actionable splash error instead of starting an implicit build. The browser's **New Sandbox** workflow requires a missing or empty folder and a non-empty name. Creation failures remain in the browser as status text; a successful scaffold is validated and diff --git a/docs/editor/release-notes.md b/docs/editor/release-notes.md index 4b0cf0c..d9466c1 100644 --- a/docs/editor/release-notes.md +++ b/docs/editor/release-notes.md @@ -1,5 +1,7 @@ # Editor Framework Release Notes (1.0 baseline) +> **Historical release snapshot — not current implementation guidance.** Use the [documentation index](../README.md) for current behavior and architecture. + ## Shipped - Stable asset registry (`assets/.index/registry.ron`) with import settings and content-addressed diff --git a/docs/editor/rendering.md b/docs/editor/rendering.md index 0a28b75..5700de4 100644 --- a/docs/editor/rendering.md +++ b/docs/editor/rendering.md @@ -74,9 +74,11 @@ Material authoring includes emissive color, emissive intensity (nits), and an op |------|---------| | `assets/rendering_profiles/*.ron` | Named override bundles (`RenderingProfileAsset`); Apply / Revert in volume inspector | | `assets/post_fx/*.ron` + `.wgsl` | Fullscreen effects (`PostProcessEffectAsset`); picker in volume inspector | -| `assets/materials/*.ron` | Material presets, including emissive fields for Solari-compatible surfaces | +| Material/Instance documents anywhere under `assets/` | Schema-classified shared materials, including emissive inputs for Solari-compatible surfaces | -Shipped examples: `post_fx/vignette.ron`, `post_fx/chromatic_aberration.ron`, `rendering_profiles/cave_dark.ron`, `rendering_profiles/outdoor_haze.ron`, `materials/emissive_panel.ron`. +Shipped examples use the conventional `post_fx/`, `rendering_profiles/`, and `materials/` folders, +but project Material/Instance location is organizational rather than type authority. See the +[Content Workspace guide](content-workspace.md). ## Game team checklist diff --git a/docs/editor/roadmap.md b/docs/editor/roadmap.md index fb0668b..bf783ad 100644 --- a/docs/editor/roadmap.md +++ b/docs/editor/roadmap.md @@ -4,7 +4,10 @@ Phased work for the in-process editor (`crates/editor`). Status reflects the cur ## Production editor program (P5 cleanup remaining) -**Goal:** Zero-debt authoring loop — hydration modules, mandatory `ActorKind`, actor inspector only, schema v2 migrations. See [ADR 0009–0012](../adr/0009-authoring-vs-hydrated.md) and `.cursor/plans/editor_rendering_and_ux_*.plan.md`. +**Goal:** Zero-debt authoring loop — hydration modules, derived `ActorKind`, a registered actor +inspector, and explicit schema migrations. See [ADR 0009](../adr/0009-authoring-vs-hydrated.md), +[ADR 0034](../adr/0034-registry-driven-authoring-components.md), and the +[documentation authority map](../authority.toml). | Phase | Status | Notes | |-------|--------|-------| @@ -13,7 +16,7 @@ Phased work for the in-process editor (`crates/editor`). Status reflects the cur | P2 Actor inspector | **Done** | `ui/actor_inspector/`; removed `DefaultInspectorConfigPlugin` + ECS dump on Inspector tab | | P3 Hierarchy tree + sibling order | **Done** | `HierarchySiblingIndex`, tree outliner, full-row DnD attach/reorder/root, world-transform preservation, cycle guards, visibility/lock | | P4 Viewport modes | **Done** | Lit / Unlit / Collider toolbar, light gizmo overlays, Tab pick cycle | -| P5 Assets + prefabs | **Partial** | Prefab v2 is production-accepted with stable nested identity, scoped/runtime overrides, committed base/nested/variant fixtures, source Apply/conflict recovery, and local conversion; legacy `fbx_preview` cleanup remains | +| P5 Assets + prefabs | **Done** | Prefab v2 is production-accepted with stable nested identity, scoped/runtime overrides, committed base/nested/variant fixtures, source Apply/conflict recovery, and local conversion; the legacy `fbx_preview` crate/path is absent from the current workspace | | P6 Extensibility + CI | **Done** | `ActorInspectorSection`, palette commands, BRP policy, hydration/scene CI | | P7 Docs + debt audit | **Done** | ADRs 0009–0012, [debt-audit.md](debt-audit.md), CI matrix | @@ -109,7 +112,7 @@ Phased work for the in-process editor (`crates/editor`). Status reflects the cur | Pause in PIE | Done | `PlayPaused` freezes sim while staying in Play (`F6`) | | Dock layout persistence | Done | `ui/layout.rs` + `UserPreferences.dock_layout` | | Hierarchy tree + type icons | Done | Authored + generated/runtime rows, persistent expansion, full-row attach targets, subtree-safe multi-drag, transform-preserving undo | -| Actor inspector (authoring-only) | Done | Transform + `LightDesc`/`MaterialDesc`/…; no bevy_inspector dump | +| Actor inspector (authoring-only) | Done | Transform plus registered authoring components; primitives/static/skinned renderers use stable `MaterialSlot` ownership; no bevy_inspector dump | | Inspector component headers | Done | Header + Transform + component cards + Add Component footer | | Asset browser project/file views | Done | Folder tree, breadcrumb, search/filter/sort, grid/list, details pane, texture + model thumbnails | @@ -121,7 +124,7 @@ Phased work for the in-process editor (`crates/editor`). Status reflects the cur |------|--------|-------| | `asset_db.rs` registry | Done | Stable UUIDs by path/content, deterministic model/texture/audio BLAKE3 fingerprints, normalized publication order, and import settings in details | | Model import formats | Done | glTF/GLB + binary FBX; sandboxed `textures/`/`.fbm/` discovery and transactional referenced-bundle copy | -| Thumbnails | Done | Textures via asset load; glTF albedo fast-path; direct neutral FBX geometry; preflighted source-material dependency state | +| Thumbnails | Done | Typed texture/model/mesh/material cache keys; textures via asset load; all model and mesh cards via offscreen geometry studio; preflighted dependency failures | | Import settings per asset | Done | Scale/collider/LOD in registry + details pane | | Prefab workflow | Done | Shared stable nested property/component/structural overrides, recursive validation, committed variant fixtures, transactional source Apply, conflict recovery, and undoable outer unpack/recursive local conversion passed headless, packaged-runtime, and live editor acceptance in Gitea #43 | | Curated editor regression samples | Done | Versioned five-area manifest, dedicated brush/material labs, strengthened terrain/physics/rendering fixtures, **File > Open Sample**, typed scene coverage, and `validate-samples` release gate in Gitea #32 | diff --git a/docs/editor/session-recovery.md b/docs/editor/session-recovery.md index ced819d..45c4bcd 100644 --- a/docs/editor/session-recovery.md +++ b/docs/editor/session-recovery.md @@ -17,12 +17,20 @@ or credentials. Discard confirmation, the last authored scene and non-destructive UI state are restored. - **Abnormal shutdown:** the editor opens its normal safe scene and displays **Recover Editor Session**. **Resume Last Scene** opens only the previous authored scene. **Continue Safe** keeps - the startup scene. Modal tools and dirty preview state are never restored. + the startup scene. The prompt blocks interaction with the safe scene until either choice is made. + Modal tools and dirty preview state are never restored. - Native window close, **File > Quit**, project switching, and programmatic editor exit use one non-blocking Save All / Discard / Cancel workflow. Cancel and failed saves keep the session open. Direct `AppExit`, process kill, and crashes are not recorded as clean shutdowns. - Dirty scene data remains governed by the independent scene recovery workflow in [ADR 0023](../adr/0023-transactional-scene-persistence-and-recovery.md). +- Dirty Materials, Material Instances, import settings, and project content defaults receive + editor-local recovery snapshots after two seconds of inactivity. Five generations are retained + outside project `assets/`. Startup restoration never overwrites source: a changed fingerprint + restores the document as a conflict. Returning the document exactly to its source value clears + older recovery generations; startup defensively ignores any recovery value that already matches + source. See + [ADR 0047](../adr/0047-editor-authored-asset-documents.md). An unknown newer session schema is ignored safely. Legacy unversioned session documents migrate to v1 after finite camera bookmark validation. diff --git a/docs/mission.md b/docs/mission.md index 7c380c0..48d22f5 100644 --- a/docs/mission.md +++ b/docs/mission.md @@ -15,12 +15,18 @@ An **in-process Bevy editor and game foundation** for a server-authoritative mul 7. **Composable actor model** — Every saved level object carries a derived `ActorKind` display hint, while registered authoring components own behavior, requirements, conflicts, persistence, and hydration ([ADR 0034](adr/0034-registry-driven-authoring-components.md)). +8. **Sustainable extension seams** — Pay architecture debt at the point of change: thin panel + shells dispatch into bounded domain modules and shared services, with an automated no-growth + ratchet for legacy modules ([ADR 0048](adr/0048-modular-editor-composition-and-debt-ratchet.md)). +9. **Authored visual language** — Build editor panels from semantic, responsive design-system + primitives whose native output is accepted against the Penpot source of truth; unsupported mock + controls do not ship ([ADR 0049](adr/0049-penpot-led-editor-visual-system.md)). ## Audience - **Level authors** — Iterate on scenes, tuning, and feel via PIE and project settings. - **Engine extenders** — Reuse or embed `editor` patterns (viewport, history, PIE) in other Bevy projects. -- **Automation / CI** — BRP and headless validation (planned). +- **Automation / CI** — BRP, headless validation, and deterministic asset processing. - **Multiplayer development** — Same editor shell exercises deterministic sim and protocol types. ## Non-goals diff --git a/docs/workflow/build-storage-policy.md b/docs/workflow/build-storage-policy.md new file mode 100644 index 0000000..22c578c --- /dev/null +++ b/docs/workflow/build-storage-policy.md @@ -0,0 +1,32 @@ +# Build Storage Policy + +Blacksite uses one persistent ordinary-development lane and creates exceptional candidate, +hot-reload, full-debug, cross-target, or package lanes only when their distinct signature is needed. +Lane identity includes the canonical workspace, toolchain, target, profile, features, linker and +compiler flags. + +On the current checkout, intermediates live in a canonical-workspace partition beneath +`/.blacksite-build-cache`; this keeps the cache on the workspace volume because +Cargo home does not satisfy the configured free-space floor. Set `BLACKSITE_BUILD_CACHE_ROOT` to an +approved cache volume when the checkout moves. Final ordinary artifacts retain predictable paths +under repository `target/`, while exceptional final artifacts live under `target/lanes/`. + +Use `scripts/codex/build_storage.py` for measurement, dry-run pruning, and policy enforcement. Under +budget or free-space pressure, pre/post enforcement may automatically remove only expired disposable +lanes after printing and flushing their complete byte-counted safety plan. A managed lane must carry +a sentinel identifying its workspace and signature before it is eligible for +deletion. Never run an unscoped `cargo clean` as a troubleshooting reflex, and never delete individual +files from Cargo's `deps`, `.fingerprint`, `build`, or `incremental` layouts by age. Pruning removes +only a complete verified disposable lane. + +Before a heavy gate, enforce the configured total budget and free-space floor; remaining hard-limit +or free-space violations block the gate. Afterward, record lane size and last use. Every automatic or +explicit prune/reset prints and flushes its complete byte-counted, checked plan before deletion starts. +Before removing a candidate lane, copy the nominated binaries or +packages and evidence outside the lane, then run: + +`python scripts/codex/build_storage.py mark-candidate-preserved --evidence --artifact ` + +The generation-bound marker becomes stale if that candidate lane is used again. The persistent +development lane is reset only at a safe slice boundary when signature drift or the hard budget makes +that necessary. diff --git a/docs/workflow/codex-workflow.md b/docs/workflow/codex-workflow.md new file mode 100644 index 0000000..0eac982 --- /dev/null +++ b/docs/workflow/codex-workflow.md @@ -0,0 +1,30 @@ +# Codex Workflow + +Blacksite uses a repository-local workflow to keep implementation fast without weakening acceptance. +The compact operating rules live in `AGENTS.md`; procedural details live in repository Skills and the +policies indexed here. + +## Task lifecycle + +1. Confirm the canonical repository path, branch, HEAD, dirty state, and active processes. +2. Resume `.codex/session/STATE.md` when valid instead of rediscovering the repository. +3. Read `docs/authority.toml`, the smallest relevant current docs, and exact linked tracker items. +4. Define one bounded slice with acceptance criteria, non-goals, and a verification tier. +5. Record material user steering as a scope delta, including which evidence remains valid. +6. Run selective verification, then update canonical docs at the slice boundary. +7. Treat native acceptance and release-candidate gates as separate states from engineering checks. + +Ignored `.codex/session/`, `.codex/logs/`, `.codex/cache/`, and `.codex/evidence/` data is working +state, not documentation. It exists to make reconnects and compaction cheap and must not become a +second source of product truth. + +## Policies + +- [Documentation authority](documentation-policy.md) +- [Selective verification](verification-policy.md) +- [Build storage](build-storage-policy.md) +- [Gitea tracking](gitea-tracking-policy.md) + +The workflow distinguishes Implementing, Engineering-complete, Acceptance-in-progress, +Candidate-ready, and Accepted/closed. “Complete” is reserved for the acceptance state actually +proven; a dirty worktree or source-only check is not closure evidence. diff --git a/docs/workflow/documentation-policy.md b/docs/workflow/documentation-policy.md new file mode 100644 index 0000000..72d074e --- /dev/null +++ b/docs/workflow/documentation-policy.md @@ -0,0 +1,52 @@ +# Documentation Authority Policy + +`docs/authority.toml` classifies every root README, repository documentation page, and Cursor plan +before it may be used as guidance. Run `python scripts/codex/docs_audit.py` after changing behavior, +schemas, commands, component names, workflows, plans, or evidence records. + +## Authority order + +For desired scope and acceptance, use the latest user direction, exact current Gitea scope, and then +an active plan. For implemented behavior, use source and tests, then current native evidence and +canonical current documentation. Accepted ADRs own architecture decisions. Do not merge conflicting +sources silently; report and reconcile the conflict at the smallest owning surface. + +## Classifications + +Each authority rule has a lifecycle classification and a role. Lifecycle controls whether a page +may guide current work; roles distinguish overview, canonical behavior, architecture, active plan, +evidence, historical record, and superseded record. Accepted ADRs use the architecture role and are +authoritative only for their surviving decision scope. + +| Class | Meaning | May define current behavior? | +|-------|---------|------------------------------| +| `current` | Canonical workflow, architecture, intent, or user guidance | Yes, within its stated role | +| `active-plan` | Unaccepted desired scope and acceptance work | No; source and current docs describe what exists | +| `evidence` | Dated automated or native observations | No | +| `historical` | Preserved context from completed work | No | +| `superseded` | Replaced contract retained for provenance | No | + +Historical and superseded documents carry an obvious banner linking current guidance. Evidence +records carry an evidence-only banner. Active plans identify themselves and must become historical +when their acceptance target is complete. + +## One home per fact + +- Root `README.md`: user commands, controls, troubleshooting, and shipped checklist. +- `docs/mission.md`: product intent and non-goals. +- `docs/adr/`: accepted decisions and durable constraints. +- `docs/editor/`: current editor workflows and subsystem contracts. +- `.cursor/plans/`: active or historical implementation roadmaps, never implementation truth. +- `docs/editor/evaluations/`: dated evidence, never product requirements. +- `docs/archive/`: preserved records that no longer belong in a live topic tree. + +Update canonical documentation when behavior stabilizes at a slice boundary. Tiny intermediate edits +do not require repeated narrative churn, but the slice cannot become engineering-complete while its +canonical docs contradict the implementation. + +## Audit contract + +The audit discovers `README.md`, every `docs/**/*.md`, and every `.cursor/plans/**/*.md`. The +highest-priority matching authority rule wins; equal-priority disagreement fails. It also verifies +lifecycle banners and configured replacement links. New documents fail until a deterministic rule +classifies them. diff --git a/docs/workflow/gitea-tracking-policy.md b/docs/workflow/gitea-tracking-policy.md new file mode 100644 index 0000000..176b4b2 --- /dev/null +++ b/docs/workflow/gitea-tracking-policy.md @@ -0,0 +1,17 @@ +# Gitea Tracking Policy + +Read exact issue, epic, and milestone records rather than broad tracker dumps. Current tracker scope +is desired behavior; source and accepted evidence determine implementation state. + +Use these states precisely: Implementing, Engineering-complete, Acceptance-in-progress, +Candidate-ready, and Accepted/closed. Do not check an acceptance criterion without corresponding +code, automated, native, or candidate evidence. A dirty working tree cannot close an issue, and +closure requires the nominated commit plus configured release evidence. + +Post at most one useful status update per completed slice or material scope delta. Keep epic +checklists, child issues, and milestone scope aligned, but do not create, close, reopen, delete, or +rewrite tracker scope without direct authority. Workflow installation and audits produce dry-run +recommendations only. + +Tracker comments summarize outcomes and link durable repository evidence; they do not receive raw +build logs, entire issue listings, or speculative completion claims. diff --git a/docs/workflow/verification-policy.md b/docs/workflow/verification-policy.md new file mode 100644 index 0000000..b31a1f3 --- /dev/null +++ b/docs/workflow/verification-policy.md @@ -0,0 +1,25 @@ +# Selective Verification Policy + +Verification is proportional to the changed dependency surface and is reused while its inputs, +toolchain, features, environment, and command remain unchanged. + +| Tier | Use | Typical scope | +|------|-----|---------------| +| Fast loop | Ordinary implementation edits | Formatting as needed, affected package check, focused tests | +| Slice gate | A bounded behavior slice is stable | Affected package tests and lint plus relevant domain validators | +| Candidate gate | An exact release candidate is nominated | Full workspace/all-feature gates, deterministic content checks, packaging, and named native scenarios | + +Codex Cargo commands run through `scripts/codex/verify.py` or `scripts/codex/cargo_lane.py`; complete +output belongs in `.codex/logs/`. Do not run a candidate gate during ordinary iteration, duplicate a +workspace check immediately before a compiling workspace test without a distinct target reason, or +rerun a valid gate after unrelated documentation changes. + +User steering invalidates only gates whose inputs or acceptance claim changed. Record that boundary +in session state. Automated tests are not native editor acceptance, and screenshots alone do not +prove an interaction. + +When native acceptance is explicitly delegated, `scripts/codex/native_qa.sh plan ` prints +the named steps and assertions before anything launches. The runner snapshots a declared fixture, +records each manual assertion and target-window capture, closes only its recorded PID, and exposes a +hash-checked `restore --dry-run` / `restore --apply` pair. Planning a scenario never launches the +editor, and Codex does not take over user-owned visual QA merely because a scenario exists. diff --git a/scripts/codex/architecture_audit.py b/scripts/codex/architecture_audit.py new file mode 100755 index 0000000..08d0bd1 --- /dev/null +++ b/scripts/codex/architecture_audit.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +"""Enforce Blacksite's module-size debt ratchet.""" + +from __future__ import annotations + +import argparse +import tempfile +import tomllib +from pathlib import Path + + +def nonblank_lines(path: Path) -> int: + return sum(1 for line in path.read_text(encoding="utf-8").splitlines() if line.strip()) + + +def module_limit(relative: str, policy: dict) -> int: + if relative in policy.get("shells", {}): + return int(policy["limits"]["ui_shell"]) + if relative.startswith("crates/editor/src/ui/"): + return int(policy["limits"]["ui_module"]) + return int(policy["limits"]["production_rust_module"]) + + +def validate_exception(entry: dict) -> list[str]: + required = ("path", "issue", "rationale", "maximum", "extraction_target", "expiry_milestone") + missing = [name for name in required if not entry.get(name)] + errors = [f"invalid exception for {entry.get('path', '')}: missing {name}" for name in missing] + if entry.get("issue") and not str(entry["issue"]).startswith("#"): + errors.append(f"invalid exception for {entry['path']}: issue must be a tracker reference") + return errors + + +def audit(root: Path, policy: dict) -> tuple[list[str], list[str]]: + errors: list[str] = [] + notes: list[str] = [] + baselines = {str(path): int(value) for path, value in policy.get("baselines", {}).items()} + exceptions = {entry.get("path"): entry for entry in policy.get("exceptions", [])} + for entry in policy.get("exceptions", []): + errors.extend(validate_exception(entry)) + + for path in sorted((root / "crates").glob("**/*.rs")): + relative = path.relative_to(root).as_posix() + count = nonblank_lines(path) + limit = module_limit(relative, policy) + baseline = baselines.get(relative) + exception = exceptions.get(relative) + + if baseline is not None and count > baseline: + errors.append(f"{relative}: {count} nonblank lines exceeds frozen baseline {baseline}") + continue + if baseline is not None and count < baseline: + notes.append(f"{relative}: shrank from baseline {baseline} to {count}") + if count <= limit: + continue + if baseline is not None: + continue + if exception is not None and count <= int(exception["maximum"]): + notes.append(f"{relative}: temporary {exception['issue']} exception ({count}/{exception['maximum']})") + continue + errors.append(f"{relative}: {count} nonblank lines exceeds module budget {limit}") + return errors, notes + + +def load_policy(path: Path) -> dict: + with path.open("rb") as handle: + policy = tomllib.load(handle) + if policy.get("version") != 1: + raise SystemExit(f"unsupported architecture policy version in {path}") + return policy + + +def self_test() -> int: + with tempfile.TemporaryDirectory(prefix="blacksite-architecture-audit-") as directory: + root = Path(directory) + (root / "crates/editor/src/ui").mkdir(parents=True) + policy = { + "limits": {"ui_shell": 2, "ui_module": 3, "production_rust_module": 4}, + "shells": {"crates/editor/src/ui/shell.rs": 2}, + "baselines": {"crates/editor/src/ui/legacy.rs": 5}, + "exceptions": [], + } + (root / "crates/editor/src/ui/new.rs").write_text("a\nb\nc\nd\n", encoding="utf-8") + errors, _ = audit(root, policy) + assert any("new.rs" in error for error in errors) + (root / "crates/editor/src/ui/new.rs").write_text("a\nb\n", encoding="utf-8") + (root / "crates/editor/src/ui/legacy.rs").write_text("a\nb\nc\nd\ne\nf\n", encoding="utf-8") + errors, _ = audit(root, policy) + assert any("frozen baseline" in error for error in errors) + (root / "crates/editor/src/ui/legacy.rs").write_text("a\nb\nc\nd\n", encoding="utf-8") + errors, notes = audit(root, policy) + assert not errors and any("shrank" in note for note in notes) + policy["exceptions"] = [{ + "path": "crates/editor/src/ui/new.rs", "issue": "#1", "rationale": "test", + "maximum": 4, "extraction_target": "test module", "expiry_milestone": "M2", + }] + (root / "crates/editor/src/ui/new.rs").write_text("a\nb\nc\nd\n", encoding="utf-8") + errors, _ = audit(root, policy) + assert not errors + policy["exceptions"][0]["issue"] = "missing-prefix" + errors, _ = audit(root, policy) + assert any("tracker reference" in error for error in errors) + print("PASS architecture-audit self-test") + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("command", choices=("check", "self-test"), nargs="?", default="check") + parser.add_argument("--root", type=Path, default=Path(__file__).resolve().parents[2]) + arguments = parser.parse_args() + if arguments.command == "self-test": + return self_test() + root = arguments.root.resolve() + policy = load_policy(root / ".codex/architecture.toml") + errors, notes = audit(root, policy) + for note in notes: + print(f"NOTE {note}") + if errors: + for error in errors: + print(f"FAIL {error}") + return 1 + print("PASS architecture-audit") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/codex/build_storage.py b/scripts/codex/build_storage.py new file mode 100755 index 0000000..53c9b2b --- /dev/null +++ b/scripts/codex/build_storage.py @@ -0,0 +1,1745 @@ +#!/usr/bin/env python3 +"""Measure and safely enforce Blacksite's bounded Cargo build storage policy.""" + +from __future__ import annotations + +import argparse +import contextlib +import hashlib +import io +import json +import os +import re +import shutil +import subprocess +import sys +import tempfile +from collections import defaultdict +from dataclasses import asdict, dataclass +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Iterable, Mapping, Sequence + +try: + import tomllib +except ModuleNotFoundError as error: # pragma: no cover - Python < 3.11 + raise SystemExit("build_storage.py requires Python 3.11 or newer") from error + +from cargo_lane import ( + SENTINEL_NAME, + LaneError, + cache_root, + canonical_path, + cargo_home, + load_workflow, + read_sentinel, + sentinel_path, + toolchain_info, + utc_now, + validate_lane_name, + validate_sentinel, + workspace_hash, + workspace_root, +) + + +GIB = 1024**3 +LEDGER_SCHEMA_VERSION = 1 +CANDIDATE_PRESERVATION_SCHEMA_VERSION = 1 +CANDIDATE_PRESERVATION_PATH = Path(".codex/session/candidate-prune-safe.json") +DEFAULT_POLICY: dict[str, Any] = { + "enabled": True, + "soft_total_gib": 55, + "hard_total_gib": 80, + "min_free_gib": 40, + "min_free_percent": 15, + "persistent_lane_max_gib": 40, + "disposable_lane_max_gib": 35, + "candidate_retention_hours": 24, + "hot_reload_retention_hours": 24, + "full_debug_retention_hours": 12, + "failed_lane_retention_hours": 24, + "auto_prune_disposable": True, + "delete_only_marked_lanes": True, +} + + +class StorageError(RuntimeError): + """Storage state cannot be measured or changed safely.""" + + +def _policy(workflow: Mapping[str, Any]) -> dict[str, Any]: + result = dict(DEFAULT_POLICY) + configured = workflow.get("build_storage", {}) + if isinstance(configured, Mapping): + result.update(configured) + return result + + +def human_bytes(value: int) -> str: + amount = float(max(0, value)) + for suffix in ("B", "KiB", "MiB", "GiB", "TiB"): + if amount < 1024 or suffix == "TiB": + return f"{amount:.1f} {suffix}" + amount /= 1024 + return f"{amount:.1f} TiB" + + +def _allocated_bytes(stat_result: os.stat_result) -> int: + blocks = getattr(stat_result, "st_blocks", 0) + return blocks * 512 if blocks else stat_result.st_size + + +@dataclass +class PathUsage: + path: str + allocated_bytes: int = 0 + apparent_bytes: int = 0 + files: int = 0 + directories: int = 0 + symlinks: int = 0 + top_level: dict[str, int] | None = None + error: str | None = None + + +def measure_tree(path: Path) -> PathUsage: + path = canonical_path(path) + usage = PathUsage(path=str(path), top_level={}) + if not path.exists(): + return usage + if path.is_symlink(): + usage.symlinks = 1 + usage.error = "root is a symlink" + return usage + + seen: set[tuple[int, int]] = set() + try: + root_stat = path.lstat() + root_device = root_stat.st_dev + usage.allocated_bytes += _allocated_bytes(root_stat) + usage.apparent_bytes += root_stat.st_size + usage.directories += 1 + seen.add((root_stat.st_dev, root_stat.st_ino)) + except OSError as error: + usage.error = str(error) + return usage + + for directory, names, filenames in os.walk(path, topdown=True, followlinks=False): + current = Path(directory) + relative = current.relative_to(path) + current_bucket = relative.parts[0] if relative.parts else None + + kept_names: list[str] = [] + for name in names: + child = current / name + try: + stat_result = child.lstat() + except OSError: + continue + if child.is_symlink(): + usage.symlinks += 1 + usage.allocated_bytes += _allocated_bytes(stat_result) + usage.apparent_bytes += stat_result.st_size + continue + if stat_result.st_dev != root_device: + continue + kept_names.append(name) + inode = (stat_result.st_dev, stat_result.st_ino) + if inode in seen: + continue + seen.add(inode) + allocated = _allocated_bytes(stat_result) + usage.allocated_bytes += allocated + usage.apparent_bytes += stat_result.st_size + usage.directories += 1 + bucket = current_bucket or name + usage.top_level[bucket] = usage.top_level.get(bucket, 0) + allocated + names[:] = kept_names + + for name in filenames: + child = current / name + try: + stat_result = child.lstat() + except OSError: + continue + if child.is_symlink(): + usage.symlinks += 1 + inode = (stat_result.st_dev, stat_result.st_ino) + if inode in seen: + continue + seen.add(inode) + allocated = _allocated_bytes(stat_result) + usage.allocated_bytes += allocated + usage.apparent_bytes += stat_result.st_size + usage.files += 1 + bucket = current_bucket or name + usage.top_level[bucket] = usage.top_level.get(bucket, 0) + allocated + usage.top_level = dict( + sorted(usage.top_level.items(), key=lambda item: item[1], reverse=True) + ) + return usage + + +def _nearest_existing(path: Path) -> Path: + current = canonical_path(path) + while not current.exists() and current != current.parent: + current = current.parent + return current + + +def _mount_point(path: Path) -> Path: + current = _nearest_existing(path) + while current != current.parent and not os.path.ismount(current): + current = current.parent + return current + + +def _filesystem_status(paths: Iterable[Path], policy: Mapping[str, Any]) -> list[dict[str, Any]]: + by_device: dict[int, dict[str, Any]] = {} + for requested in paths: + probe = _nearest_existing(requested) + try: + device = probe.stat().st_dev + usage = shutil.disk_usage(probe) + except OSError: + continue + if device in by_device: + by_device[device]["paths"].append(str(canonical_path(requested))) + continue + percentage_floor = int(usage.total * float(policy["min_free_percent"]) / 100) + fixed_floor = int(float(policy["min_free_gib"]) * GIB) + floor = max(fixed_floor, percentage_floor) + by_device[device] = { + "device": device, + "mount": str(_mount_point(probe)), + "paths": [str(canonical_path(requested))], + "total_bytes": usage.total, + "used_bytes": usage.used, + "free_bytes": usage.free, + "minimum_free_bytes": floor, + } + return list(by_device.values()) + + +def _path_within(path: Path, parent: Path) -> bool: + try: + canonical_path(path).relative_to(canonical_path(parent)) + return True + except ValueError: + return False + + +def _read_proc_value(path: Path, *, binary: bool = False) -> str: + try: + if binary: + return path.read_bytes().replace(b"\0", b" ").decode(errors="replace").strip() + return path.read_text(encoding="utf-8", errors="replace").strip() + except (OSError, PermissionError): + return "" + + +BUILD_TOOL_NAMES = { + "cargo", + "rustc", + "rustdoc", + "clang", + "clang++", + "cc", + "c++", + "gcc", + "g++", + "ld", + "ld.lld", + "lld", + "mold", +} + + +def active_processes(root: Path, watched_paths: Sequence[Path]) -> list[dict[str, Any]]: + proc = Path("/proc") + if not proc.is_dir(): + return [] + root = canonical_path(root) + watched = [canonical_path(path) for path in watched_paths] + results: list[dict[str, Any]] = [] + own_pid = os.getpid() + + for entry in proc.iterdir(): + if not entry.name.isdigit() or int(entry.name) == own_pid: + continue + pid = int(entry.name) + comm = _read_proc_value(entry / "comm") + command = _read_proc_value(entry / "cmdline", binary=True) + executable = "" + cwd = "" + try: + executable = os.readlink(entry / "exe") + except OSError: + pass + try: + cwd = os.readlink(entry / "cwd") + except OSError: + pass + + command_name = Path(command.split(" ", 1)[0]).name if command else comm + is_build_tool = comm in BUILD_TOOL_NAMES or command_name in BUILD_TOOL_NAMES + is_packager = any( + token in command + for token in ("package-project", "process-assets", "cargo package") + ) + is_editor = comm in {"editor", "project_launcher", "game"} or command_name in { + "editor", + "project_launcher", + "game", + } + + environment = _read_proc_value(entry / "environ", binary=True) + references = " ".join((command, executable, cwd, environment)) + used = [str(path) for path in watched if str(path) in references] + workspace_related = bool(cwd and _path_within(Path(cwd), root)) + + if is_editor and not used: + maps = _read_proc_value(entry / "maps") + used = [str(path) for path in watched if str(path) in maps] + + if not used and not ((is_build_tool or is_packager) and workspace_related): + continue + results.append( + { + "pid": pid, + "comm": comm, + "command": command, + "cwd": cwd, + "exe": executable, + "build_tool": is_build_tool, + "packager": is_packager, + "editor": is_editor, + "workspace_related": workspace_related, + "uses": used, + } + ) + return sorted(results, key=lambda item: item["pid"]) + + +def _sccache_status(root: Path) -> dict[str, Any]: + wrapper = os.environ.get("RUSTC_WRAPPER", "") + config_path = root / ".cargo" / "config.toml" + if not wrapper and config_path.is_file(): + try: + with config_path.open("rb") as handle: + config = tomllib.load(handle) + build = config.get("build", {}) + if isinstance(build, Mapping): + wrapper = str(build.get("rustc-wrapper", "")) + except (OSError, tomllib.TOMLDecodeError): + pass + enabled = Path(wrapper).name == "sccache" if wrapper else False + result: dict[str, Any] = { + "enabled": enabled, + "wrapper": wrapper or None, + "executable": shutil.which("sccache"), + "allocated_bytes": 0, + } + if not enabled: + return result + + configured_dir = os.environ.get("SCCACHE_DIR") + if configured_dir: + usage = measure_tree(Path(configured_dir)) + result["cache_dir"] = usage.path + result["allocated_bytes"] = usage.allocated_bytes + executable = result["executable"] + if executable: + completed = subprocess.run( + [executable, "--show-stats", "--stats-format=json"], + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + if completed.returncode == 0: + try: + result["stats"] = json.loads(completed.stdout) + except json.JSONDecodeError: + result["stats_text"] = completed.stdout.strip() + return result + + +def _marker_record(path: Path, root: Path, role: str) -> dict[str, Any]: + document = read_sentinel(path) + lane = path.name + errors: list[str] = [] + if document is None: + errors.append(f"missing or malformed {SENTINEL_NAME}") + else: + lane = str(document.get("lane", lane)) + errors.extend( + validate_sentinel(path, document, root=root, lane=lane, role=role) + ) + usage = measure_tree(path) + if usage.error: + errors.append(usage.error) + return { + "path": str(canonical_path(path)), + "role": role, + "lane": lane, + "valid_sentinel": not errors, + "sentinel_errors": errors, + "sentinel": document, + "usage": asdict(usage), + } + + +def _discover_lanes(root: Path, workflow: Mapping[str, Any]) -> tuple[list[dict[str, Any]], Path, Path]: + storage = workflow["build_storage"] + external_partition = cache_root(root, workflow) / workspace_hash(root) + exceptional_root = canonical_path( + root / str(storage.get("exceptional_target_root", "target/lanes")) + ) + records: list[dict[str, Any]] = [] + if external_partition.is_dir() and not external_partition.is_symlink(): + for child in sorted(external_partition.iterdir()): + if child.is_dir() and not child.is_symlink(): + records.append(_marker_record(child, root, "build")) + if exceptional_root.is_dir() and not exceptional_root.is_symlink(): + for child in sorted(exceptional_root.iterdir()): + if child.is_dir() and not child.is_symlink(): + records.append(_marker_record(child, root, "target")) + return records, external_partition, exceptional_root + + +def _group_lanes(records: Sequence[dict[str, Any]]) -> list[dict[str, Any]]: + grouped: dict[str, list[dict[str, Any]]] = defaultdict(list) + for record in records: + grouped[str(record["lane"])].append(record) + result: list[dict[str, Any]] = [] + for lane, artifacts in sorted(grouped.items()): + total = sum(item["usage"]["allocated_bytes"] for item in artifacts) + last_use_values = [ + item["sentinel"].get("last_use") + for item in artifacts + if isinstance(item.get("sentinel"), Mapping) + and item["sentinel"].get("last_use") + ] + result.append( + { + "lane": lane, + "allocated_bytes": total, + "last_use": max(last_use_values) if last_use_values else None, + "valid": all(item["valid_sentinel"] for item in artifacts), + "artifacts": artifacts, + } + ) + return result + + +def storage_snapshot(root: Path, workflow: Mapping[str, Any]) -> dict[str, Any]: + root = canonical_path(root) + policy = _policy(workflow) + repository_target = canonical_path( + root / str(policy.get("dev_target_dir", "target")) + ) + target_usage = measure_tree(repository_target) + records, external_partition, exceptional_root = _discover_lanes(root, workflow) + external_usage = measure_tree(external_partition) + lanes = _group_lanes(records) + sccache = _sccache_status(root) + + total = ( + target_usage.allocated_bytes + + external_usage.allocated_bytes + + int(sccache.get("allocated_bytes", 0)) + ) + watched = [repository_target, external_partition, exceptional_root] + filesystems = _filesystem_status( + [repository_target, cache_root(root, workflow)], policy + ) + + debug = repository_target / "debug" + legacy_paths = { + "deps": debug / "deps", + "incremental": debug / "incremental", + "build": debug / "build", + "fingerprint": debug / ".fingerprint", + } + legacy_intermediates = { + name: asdict(measure_tree(path)) + for name, path in legacy_paths.items() + if path.exists() + } + + return { + "schema_version": 1, + "timestamp": utc_now(), + "workspace": str(root), + "workspace_hash": workspace_hash(root), + "toolchain": toolchain_info(), + "policy": policy, + "repository_target": asdict(target_usage), + "external_partition": asdict(external_usage), + "exceptional_target_root": str(exceptional_root), + "lanes": lanes, + "legacy_intermediates": legacy_intermediates, + "sccache": sccache, + "filesystems": filesystems, + "active_processes": active_processes(root, watched), + "total_allocated_bytes": total, + } + + +def _parse_simulated_lanes(values: Sequence[str]) -> dict[str, int]: + result: dict[str, int] = {} + for value in values: + lane, separator, amount = value.partition("=") + if not separator: + raise StorageError("--simulate-lane-gib expects LANE=GIB") + validate_lane_name(lane) + result[lane] = int(float(amount) * GIB) + return result + + +def apply_simulation(snapshot: dict[str, Any], arguments: argparse.Namespace) -> bool: + simulated = False + if arguments.simulate_total_gib is not None: + snapshot["total_allocated_bytes"] = int(arguments.simulate_total_gib * GIB) + simulated = True + if arguments.simulate_free_gib is not None: + for filesystem in snapshot["filesystems"]: + filesystem["free_bytes"] = int(arguments.simulate_free_gib * GIB) + simulated = True + lane_sizes = _parse_simulated_lanes(arguments.simulate_lane_gib or []) + if lane_sizes: + simulated = True + existing = {lane["lane"]: lane for lane in snapshot["lanes"]} + for lane, size in lane_sizes.items(): + if lane in existing: + existing[lane]["allocated_bytes"] = size + else: + snapshot["lanes"].append( + { + "lane": lane, + "allocated_bytes": size, + "last_use": None, + "valid": True, + "artifacts": [], + "simulated": True, + } + ) + snapshot["simulated"] = simulated + return simulated + + +def evaluate_budget(snapshot: Mapping[str, Any]) -> dict[str, list[str]]: + policy = snapshot["policy"] + total = int(snapshot["total_allocated_bytes"]) + warnings: list[str] = [] + violations: list[str] = [] + soft = int(float(policy["soft_total_gib"]) * GIB) + hard = int(float(policy["hard_total_gib"]) * GIB) + if total > hard: + violations.append( + f"total build artifacts {human_bytes(total)} exceed hard budget {human_bytes(hard)}" + ) + elif total > soft: + warnings.append( + f"total build artifacts {human_bytes(total)} exceed soft budget {human_bytes(soft)}" + ) + + persistent = str(policy.get("persistent_lane", "dev")) + for lane in snapshot["lanes"]: + maximum_gib = ( + policy["persistent_lane_max_gib"] + if lane["lane"] == persistent + else policy["disposable_lane_max_gib"] + ) + maximum = int(float(maximum_gib) * GIB) + if int(lane["allocated_bytes"]) > maximum: + warnings.append( + f"lane {lane['lane']} uses {human_bytes(lane['allocated_bytes'])}, " + f"above {human_bytes(maximum)}" + ) + + for filesystem in snapshot["filesystems"]: + free = int(filesystem["free_bytes"]) + floor = int(filesystem["minimum_free_bytes"]) + if free < floor: + violations.append( + f"filesystem {filesystem['mount']} has {human_bytes(free)} free; " + f"minimum is {human_bytes(floor)}" + ) + return {"warnings": warnings, "violations": violations} + + +def _parse_timestamp(value: str | None) -> datetime | None: + if not value: + return None + try: + parsed = datetime.fromisoformat(value) + except ValueError: + return None + if parsed.tzinfo is None: + parsed = parsed.replace(tzinfo=timezone.utc) + return parsed + + +def _retention_hours(lane: str, policy: Mapping[str, Any]) -> float: + if lane == str(policy.get("candidate_lane", "candidate")): + return float(policy["candidate_retention_hours"]) + if lane == str(policy.get("hot_reload_lane", "hot-reload")): + return float(policy["hot_reload_retention_hours"]) + if lane == str(policy.get("full_debug_lane", "full-debug")): + return float(policy["full_debug_retention_hours"]) + return float(policy["failed_lane_retention_hours"]) + + +def prune_plan(snapshot: Mapping[str, Any]) -> list[dict[str, Any]]: + policy = snapshot["policy"] + persistent = str(policy.get("persistent_lane", "dev")) + now = datetime.now(timezone.utc) + plans: list[dict[str, Any]] = [] + for lane in snapshot["lanes"]: + if lane["lane"] == persistent: + continue + last_use = _parse_timestamp(lane.get("last_use")) + age_hours = ( + (now - last_use).total_seconds() / 3600 if last_use is not None else None + ) + retention = _retention_hours(lane["lane"], policy) + eligible = bool(lane["valid"] and age_hours is not None and age_hours >= retention) + plans.append( + { + "lane": lane["lane"], + "allocated_bytes": lane["allocated_bytes"], + "age_hours": age_hours, + "retention_hours": retention, + "eligible": eligible, + "reason": ( + "expired disposable lane" + if eligible + else "invalid sentinel" + if not lane["valid"] + else "missing last-use timestamp" + if age_hours is None + else "retention window active" + ), + "artifacts": [artifact["path"] for artifact in lane["artifacts"]], + } + ) + return plans + + +def _contains_symlink(path: Path) -> bool: + if path.is_symlink(): + return True + for directory, names, filenames in os.walk(path, topdown=True, followlinks=False): + current = Path(directory) + for name in [*names, *filenames]: + try: + if (current / name).is_symlink(): + return True + except OSError: + return True + return False + + +def _tracked_files(root: Path, path: Path) -> list[str]: + if not _path_within(path, root): + return [] + relative = canonical_path(path).relative_to(root) + completed = subprocess.run( + ["git", "ls-files", "--", str(relative)], + cwd=root, + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + text=True, + ) + return [line for line in completed.stdout.splitlines() if line] + + +def _candidate_lane_name(workflow: Mapping[str, Any]) -> str: + verification = workflow.get("verification", {}) + if isinstance(verification, Mapping): + value = verification.get("candidate_lane", "candidate") + if isinstance(value, str) and value: + return value + return "candidate" + + +def _candidate_preservation_path(root: Path) -> Path: + return canonical_path(root) / CANDIDATE_PRESERVATION_PATH + + +def _lane_generation(lane: Mapping[str, Any]) -> str | None: + """Bind preservation evidence to the exact last-used lane generation.""" + + sentinels: list[dict[str, Any]] = [] + artifacts = sorted( + lane.get("artifacts", []), + key=lambda item: (str(item.get("role", "")), str(item.get("path", ""))), + ) + for artifact in artifacts: + marker = read_sentinel(Path(str(artifact["path"]))) + if marker is None: + return None + sentinels.append(marker) + if not sentinels: + return None + encoded = json.dumps( + sentinels, sort_keys=True, separators=(",", ":"), ensure_ascii=True + ).encode("utf-8") + return hashlib.sha256(encoded).hexdigest() + + +def _sha256_file(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + while chunk := handle.read(1024 * 1024): + digest.update(chunk) + return digest.hexdigest() + + +def _preserved_path(root: Path, raw: object) -> Path | None: + if not isinstance(raw, str) or not raw: + return None + path = Path(os.path.expandvars(os.path.expanduser(raw))) + if not path.is_absolute(): + path = root / path + return path + + +def _preserved_record_errors( + record: object, + *, + label: str, + root: Path, + lane_paths: Sequence[Path], +) -> list[str]: + if not isinstance(record, Mapping): + return [f"{label} must be an object with path, bytes, and sha256"] + raw_path = _preserved_path(root, record.get("path")) + if raw_path is None: + return [f"{label} has no valid path"] + if raw_path.is_symlink(): + return [f"{label} is a symlink: {raw_path}"] + path = canonical_path(raw_path) + errors: list[str] = [] + if any(_path_within(path, lane_path) for lane_path in lane_paths): + errors.append(f"{label} remains inside the disposable candidate lane: {path}") + if not path.is_file(): + errors.append(f"{label} is not a preserved file: {path}") + return errors + + expected_bytes = record.get("bytes") + if not isinstance(expected_bytes, int) or expected_bytes < 0: + errors.append(f"{label} has an invalid byte count") + else: + actual_bytes = path.stat().st_size + if actual_bytes != expected_bytes: + errors.append( + f"{label} byte count changed: expected {expected_bytes}, found {actual_bytes}" + ) + + expected_digest = record.get("sha256") + if not isinstance(expected_digest, str) or not re.fullmatch( + r"[0-9a-f]{64}", expected_digest + ): + errors.append(f"{label} has an invalid sha256") + else: + try: + actual_digest = _sha256_file(path) + except OSError as error: + errors.append(f"{label} cannot be hashed: {error}") + else: + if actual_digest != expected_digest: + errors.append(f"{label} sha256 no longer matches: {path}") + return errors + + +def _candidate_preservation_errors( + lane: Mapping[str, Any], *, root: Path, workflow: Mapping[str, Any] +) -> list[str]: + if str(lane.get("lane")) != _candidate_lane_name(workflow): + return [] + + marker_path = _candidate_preservation_path(root) + if marker_path.is_symlink(): + return [f"candidate preservation marker is a symlink: {marker_path}"] + if not marker_path.is_file(): + return [ + "candidate preservation marker is missing; preserve the candidate evidence " + "and artifacts, then run mark-candidate-preserved" + ] + try: + marker = json.loads(marker_path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError) as error: + return [f"candidate preservation marker is unreadable: {error}"] + if not isinstance(marker, Mapping): + return ["candidate preservation marker must be a JSON object"] + + root = canonical_path(root) + generation = _lane_generation(lane) + expected = { + "schema_version": CANDIDATE_PRESERVATION_SCHEMA_VERSION, + "workspace": str(root), + "workspace_hash": workspace_hash(root), + "lane": _candidate_lane_name(workflow), + "lane_generation": generation, + "prune_safe": True, + } + errors: list[str] = [] + for key, value in expected.items(): + if marker.get(key) != value: + errors.append( + f"candidate preservation {key}: expected {value!r}, found {marker.get(key)!r}" + ) + + lane_paths = [canonical_path(Path(str(item["path"]))) for item in lane["artifacts"]] + evidence = marker.get("evidence") + errors.extend( + _preserved_record_errors( + evidence, label="candidate evidence", root=root, lane_paths=lane_paths + ) + ) + artifacts = marker.get("preserved_artifacts") + if not isinstance(artifacts, list) or not artifacts: + errors.append("candidate preservation must name at least one preserved artifact") + else: + for index, record in enumerate(artifacts): + errors.extend( + _preserved_record_errors( + record, + label=f"preserved candidate artifact {index}", + root=root, + lane_paths=lane_paths, + ) + ) + evidence_path = ( + canonical_path(_preserved_path(root, evidence.get("path"))) + if isinstance(evidence, Mapping) + and _preserved_path(root, evidence.get("path")) is not None + else None + ) + artifact_paths = { + canonical_path(path) + for record in artifacts + if isinstance(record, Mapping) + and (path := _preserved_path(root, record.get("path"))) is not None + } + if evidence_path is not None and artifact_paths == {evidence_path}: + errors.append("candidate evidence alone is not a preserved candidate artifact") + return errors + + +def deletion_safety( + artifact: Mapping[str, Any], + *, + root: Path, + workflow: Mapping[str, Any], + processes: Sequence[Mapping[str, Any]], +) -> list[str]: + path = Path(str(artifact["path"])) + lane = str(artifact["lane"]) + role = str(artifact["role"]) + errors: list[str] = [] + if not path.exists(): + return ["path no longer exists"] + if path.is_symlink(): + errors.append("lane root is a symlink") + + path = canonical_path(path) + root = canonical_path(root) + policy = _policy(workflow) + external_parent = canonical_path(cache_root(root, workflow) / workspace_hash(root)) + exceptional_parent = canonical_path( + root / str(policy.get("exceptional_target_root", "target/lanes")) + ) + expected_parent = external_parent if role == "build" else exceptional_parent + if path.parent != expected_parent: + errors.append(f"path is not a direct child of managed {role} root") + + protected = [Path("/"), Path.home(), cargo_home(), root, root / ".git"] + for protected_path in protected: + protected_path = canonical_path(protected_path) + if path == protected_path or _path_within(protected_path, path): + errors.append(f"path is or contains protected path {protected_path}") + + # Never recursively inspect a path that already failed containment or + # protected-root checks. This keeps even a malicious dry run bounded. + if errors: + return errors + + marker = read_sentinel(path) + if marker is None: + errors.append(f"missing or malformed {SENTINEL_NAME}") + else: + errors.extend( + validate_sentinel(path, marker, root=root, lane=lane, role=role) + ) + if _contains_symlink(path): + errors.append("lane contains a symlink") + tracked = _tracked_files(root, path) + if tracked: + errors.append(f"lane contains tracked files: {', '.join(tracked[:5])}") + + for process in processes: + build_activity = bool( + process.get("build_tool") + or process.get("packager") + or process.get("workspace_related") + ) + direct_use = any( + _path_within(Path(used), path) or _path_within(path, Path(used)) + for used in process.get("uses", []) + ) + if direct_use or (build_activity and process.get("workspace_related")): + errors.append( + f"active process {process.get('pid')} ({process.get('comm')}) may use the lane" + ) + return errors + + +def _lane_by_name(snapshot: Mapping[str, Any], lane: str) -> dict[str, Any] | None: + return next((item for item in snapshot["lanes"] if item["lane"] == lane), None) + + +def _delete_lane( + lane: Mapping[str, Any], + *, + root: Path, + workflow: Mapping[str, Any], + apply: bool, +) -> dict[str, Any]: + paths = [Path(item["path"]) for item in lane["artifacts"]] + processes = active_processes(root, paths) + checks: list[dict[str, Any]] = [] + for artifact in lane["artifacts"]: + errors = deletion_safety( + artifact, root=root, workflow=workflow, processes=processes + ) + checks.append({"path": artifact["path"], "errors": errors}) + if str(lane.get("lane")) == _candidate_lane_name(workflow): + checks.append( + { + "path": str(_candidate_preservation_path(root)), + "kind": "candidate-preservation", + "errors": _candidate_preservation_errors( + lane, root=root, workflow=workflow + ), + } + ) + blockers = [error for check in checks for error in check["errors"]] + result = { + "lane": lane["lane"], + "apply": apply, + "allocated_bytes": lane["allocated_bytes"], + "checks": checks, + "deleted": [], + "blocked": blockers, + } + if blockers or not apply: + return result + + # Delete only complete, independently marked lane roots. rmtree does not + # follow directory symlinks, and the preflight above rejects every symlink. + for artifact in sorted(lane["artifacts"], key=lambda item: item["role"] == "build"): + path = Path(artifact["path"]) + shutil.rmtree(path) + result["deleted"].append(str(path)) + return result + + +def _execute_checked_deletions( + lanes: Sequence[Mapping[str, Any]], + *, + root: Path, + workflow: Mapping[str, Any], + action: str, + apply: bool, + output: Any | None = None, +) -> tuple[dict[str, Any], list[dict[str, Any]]]: + """Print the complete checked plan before any requested deletion occurs.""" + + checked = [ + _delete_lane(lane, root=root, workflow=workflow, apply=False) + for lane in lanes + ] + plan = { + "timestamp": utc_now(), + "action": f"{action}-checked-plan", + "apply_requested": apply, + "total_allocated_bytes": sum( + int(result["allocated_bytes"]) for result in checked + ), + "total": human_bytes( + sum(int(result["allocated_bytes"]) for result in checked) + ), + "lanes": checked, + } + if not apply: + return plan, checked + + # `flush=True` is part of the safety contract: the complete byte-counted, + # sentinel/process/candidate-evidence checked plan is externally visible + # before the first recursive deletion can begin. + print( + json.dumps(plan, indent=2, sort_keys=True), + file=output if output is not None else sys.stdout, + flush=True, + ) + results = [ + _delete_lane(lane, root=root, workflow=workflow, apply=True) + for lane in lanes + ] + return plan, results + + +def _ledger_path(root: Path) -> Path: + return root / ".codex" / "session" / "build-storage.json" + + +def _atomic_json(path: Path, document: Mapping[str, Any]) -> None: + if path.is_symlink(): + raise StorageError(f"refusing to replace symlinked JSON state: {path}") + path.parent.mkdir(parents=True, exist_ok=True) + descriptor, temporary = tempfile.mkstemp( + prefix=f".{path.name}.", suffix=".tmp", dir=path.parent + ) + try: + with os.fdopen(descriptor, "w", encoding="utf-8") as handle: + json.dump(document, handle, indent=2, sort_keys=True) + handle.write("\n") + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, path) + finally: + try: + os.unlink(temporary) + except FileNotFoundError: + pass + + +def write_ledger(root: Path, event: Mapping[str, Any]) -> None: + path = _ledger_path(root) + path.parent.mkdir(parents=True, exist_ok=True) + document: dict[str, Any] = {"schema_version": LEDGER_SCHEMA_VERSION, "events": []} + if path.is_file() and not path.is_symlink(): + try: + with path.open("r", encoding="utf-8") as handle: + existing = json.load(handle) + if isinstance(existing, dict) and isinstance(existing.get("events"), list): + document = existing + except (OSError, json.JSONDecodeError): + pass + events = list(document.get("events", []))[-499:] + events.append(dict(event)) + document["schema_version"] = LEDGER_SCHEMA_VERSION + document["events"] = events + document["updated_at"] = utc_now() + + _atomic_json(path, document) + + +def _summary(snapshot: Mapping[str, Any], evaluation: Mapping[str, Any]) -> dict[str, Any]: + return { + "timestamp": snapshot["timestamp"], + "workspace": snapshot["workspace"], + "total_allocated_bytes": snapshot["total_allocated_bytes"], + "total": human_bytes(snapshot["total_allocated_bytes"]), + "repository_target": { + "path": snapshot["repository_target"]["path"], + "allocated_bytes": snapshot["repository_target"]["allocated_bytes"], + "human": human_bytes(snapshot["repository_target"]["allocated_bytes"]), + "largest": [ + {"name": name, "bytes": size, "human": human_bytes(size)} + for name, size in list( + (snapshot["repository_target"].get("top_level") or {}).items() + )[:10] + ], + }, + "external_partition": { + "path": snapshot["external_partition"]["path"], + "allocated_bytes": snapshot["external_partition"]["allocated_bytes"], + "human": human_bytes(snapshot["external_partition"]["allocated_bytes"]), + }, + "lanes": [ + { + "lane": lane["lane"], + "bytes": lane["allocated_bytes"], + "human": human_bytes(lane["allocated_bytes"]), + "last_use": lane["last_use"], + "valid": lane["valid"], + } + for lane in snapshot["lanes"] + ], + "legacy_intermediates": { + name: { + "path": usage["path"], + "bytes": usage["allocated_bytes"], + "human": human_bytes(usage["allocated_bytes"]), + } + for name, usage in snapshot["legacy_intermediates"].items() + }, + "filesystems": [ + { + **filesystem, + "free": human_bytes(filesystem["free_bytes"]), + "minimum_free": human_bytes(filesystem["minimum_free_bytes"]), + } + for filesystem in snapshot["filesystems"] + ], + "active_processes": snapshot["active_processes"], + "sccache": snapshot["sccache"], + "warnings": evaluation["warnings"], + "violations": evaluation["violations"], + "simulated": snapshot.get("simulated", False), + } + + +def _print_human(summary: Mapping[str, Any]) -> None: + print(f"Build artifacts: {summary['total']}") + repository = summary["repository_target"] + print(f"Repository target: {repository['human']} ({repository['path']})") + for item in repository["largest"][:6]: + print(f" {item['name']}: {item['human']}") + external = summary["external_partition"] + print(f"Managed intermediates: {external['human']} ({external['path']})") + if summary["lanes"]: + print("Lanes:") + for lane in summary["lanes"]: + print( + f" {lane['lane']}: {lane['human']} " + f"({'valid' if lane['valid'] else 'INVALID SENTINEL'})" + ) + if summary["legacy_intermediates"]: + print("Legacy intermediates still in repository target:") + for name, usage in summary["legacy_intermediates"].items(): + print(f" {name}: {usage['human']}") + for filesystem in summary["filesystems"]: + print( + f"Free on {filesystem['mount']}: {filesystem['free']} " + f"(floor {filesystem['minimum_free']})" + ) + if summary["active_processes"]: + print("Active build/artifact users:") + for process in summary["active_processes"]: + print(f" PID {process['pid']} {process['comm']}: {process['command']}") + for warning in summary["warnings"]: + print(f"WARNING: {warning}") + for violation in summary["violations"]: + print(f"BLOCK: {violation}") + + +def _snapshot_with_simulation( + root: Path, workflow: Mapping[str, Any], arguments: argparse.Namespace +) -> tuple[dict[str, Any], dict[str, list[str]]]: + snapshot = storage_snapshot(root, workflow) + apply_simulation(snapshot, arguments) + return snapshot, evaluate_budget(snapshot) + + +def _make_preserved_record( + path: Path, *, root: Path, lane_paths: Sequence[Path], label: str +) -> dict[str, Any]: + original = path.expanduser() + if not original.is_absolute(): + original = root / original + if original.is_symlink(): + raise StorageError(f"{label} must not be a symlink: {original}") + resolved = canonical_path(original) + if any(_path_within(resolved, lane_path) for lane_path in lane_paths): + raise StorageError( + f"{label} must be copied outside the disposable candidate lane: {resolved}" + ) + if not resolved.is_file(): + raise StorageError(f"{label} is not a file: {resolved}") + return { + "path": str(resolved), + "bytes": resolved.stat().st_size, + "sha256": _sha256_file(resolved), + } + + +def _mark_candidate_preserved( + root: Path, workflow: Mapping[str, Any], arguments: argparse.Namespace +) -> int: + snapshot = storage_snapshot(root, workflow) + lane_name = _candidate_lane_name(workflow) + lane = _lane_by_name(snapshot, lane_name) + if lane is None: + raise StorageError(f"managed candidate lane does not exist: {lane_name}") + if not lane.get("valid"): + raise StorageError("candidate lane has an invalid sentinel") + generation = _lane_generation(lane) + if generation is None: + raise StorageError("candidate lane generation cannot be established") + lane_paths = [canonical_path(Path(item["path"])) for item in lane["artifacts"]] + evidence = _make_preserved_record( + arguments.evidence, + root=root, + lane_paths=lane_paths, + label="candidate evidence manifest", + ) + artifacts = [ + _make_preserved_record( + path, + root=root, + lane_paths=lane_paths, + label=f"preserved candidate artifact {index}", + ) + for index, path in enumerate(arguments.artifact) + ] + evidence_path = evidence["path"] + if all(record["path"] == evidence_path for record in artifacts): + raise StorageError( + "candidate evidence alone is insufficient; preserve at least one distinct artifact" + ) + + document = { + "schema_version": CANDIDATE_PRESERVATION_SCHEMA_VERSION, + "workspace": str(canonical_path(root)), + "workspace_hash": workspace_hash(root), + "lane": lane_name, + "lane_generation": generation, + "prune_safe": True, + "preserved_at": utc_now(), + "evidence": evidence, + "preserved_artifacts": artifacts, + } + marker_path = _candidate_preservation_path(root) + _atomic_json(marker_path, document) + errors = _candidate_preservation_errors(lane, root=root, workflow=workflow) + if errors: + raise StorageError("candidate preservation marker failed validation: " + "; ".join(errors)) + write_ledger( + root, + { + "timestamp": utc_now(), + "action": "mark-candidate-preserved", + "lane": lane_name, + "lane_generation": generation, + "marker": str(marker_path), + "evidence": evidence, + "preserved_artifacts": artifacts, + }, + ) + print(json.dumps(document, indent=2, sort_keys=True)) + return 0 + + +def _status(root: Path, workflow: Mapping[str, Any], arguments: argparse.Namespace) -> int: + snapshot, evaluation = _snapshot_with_simulation(root, workflow, arguments) + summary = _summary(snapshot, evaluation) + if arguments.json: + print(json.dumps(summary, indent=2, sort_keys=True)) + else: + _print_human(summary) + return 0 + + +def _plan(root: Path, workflow: Mapping[str, Any], arguments: argparse.Namespace) -> int: + snapshot, evaluation = _snapshot_with_simulation(root, workflow, arguments) + document = { + "summary": _summary(snapshot, evaluation), + "prune": prune_plan(snapshot), + "legacy_migration": { + "required": bool(snapshot["legacy_intermediates"]), + "automatic": False, + "reason": ( + "unmanaged repository intermediates require the separately authorized " + "one-time migration; they are never removed by prune" + ), + }, + } + if arguments.json: + print(json.dumps(document, indent=2, sort_keys=True)) + else: + _print_human(document["summary"]) + print("Prune plan:") + for item in document["prune"]: + disposition = "eligible" if item["eligible"] else "keep" + print(f" {item['lane']}: {disposition} ({item['reason']})") + if document["legacy_migration"]["required"]: + print("Legacy target migration is required and will not be auto-pruned.") + return 0 + + +def _prune(root: Path, workflow: Mapping[str, Any], arguments: argparse.Namespace) -> int: + snapshot, evaluation = _snapshot_with_simulation(root, workflow, arguments) + if snapshot.get("simulated") and arguments.apply: + raise StorageError("--apply is forbidden with simulated inputs") + candidates = {item["lane"]: item for item in prune_plan(snapshot) if item["eligible"]} + lanes: list[dict[str, Any]] = [] + for lane_name in sorted(candidates): + lane = _lane_by_name(snapshot, lane_name) + if lane is not None: + lanes.append(lane) + checked_plan, results = _execute_checked_deletions( + lanes, + root=root, + workflow=workflow, + action="prune", + apply=bool(arguments.apply), + ) + event = { + "timestamp": utc_now(), + "action": "prune", + "apply": bool(arguments.apply), + "before_bytes": snapshot["total_allocated_bytes"], + "checked_plan": checked_plan, + "results": results, + "violations": evaluation["violations"], + } + if arguments.apply: + write_ledger(root, event) + print(json.dumps(event, indent=2, sort_keys=True)) + return 2 if any(result["blocked"] for result in results) else 0 + + +def _reset_lane(root: Path, workflow: Mapping[str, Any], arguments: argparse.Namespace) -> int: + lane_name = validate_lane_name(arguments.lane) + snapshot, _ = _snapshot_with_simulation(root, workflow, arguments) + if snapshot.get("simulated") and arguments.apply: + raise StorageError("--apply is forbidden with simulated inputs") + lane = _lane_by_name(snapshot, lane_name) + if lane is None: + raise StorageError(f"managed lane does not exist: {lane_name}") + checked_plan, results = _execute_checked_deletions( + [lane], + root=root, + workflow=workflow, + action="reset-lane", + apply=bool(arguments.apply), + ) + result = results[0] + event = { + "timestamp": utc_now(), + "action": "reset-lane", + "apply": bool(arguments.apply), + "checked_plan": checked_plan, + "result": result, + } + if arguments.apply: + write_ledger(root, event) + print(json.dumps(event, indent=2, sort_keys=True)) + return 2 if result["blocked"] else 0 + + +def _enforce(root: Path, workflow: Mapping[str, Any], arguments: argparse.Namespace) -> int: + snapshot, evaluation = _snapshot_with_simulation(root, workflow, arguments) + before_bytes = int(snapshot["total_allocated_bytes"]) + before_warnings = list(evaluation["warnings"]) + before_violations = list(evaluation["violations"]) + pressure = bool(evaluation["violations"] or evaluation["warnings"]) + eligible = [item for item in prune_plan(snapshot) if item["eligible"]] + checked_plan: dict[str, Any] | None = None + prune_results: list[dict[str, Any]] = [] + policy = _policy(workflow) + auto_prune = bool(policy.get("auto_prune_disposable", True)) + + if pressure and eligible and auto_prune and not snapshot.get("simulated"): + lanes = [ + lane + for item in eligible + if (lane := _lane_by_name(snapshot, str(item["lane"]))) is not None + ] + checked_plan, prune_results = _execute_checked_deletions( + lanes, + root=root, + workflow=workflow, + action=f"enforce-{arguments.phase}", + apply=True, + # Keep --json stdout machine-readable while still making the + # mandatory pre-delete plan visible before recursive deletion. + output=sys.stderr if arguments.json else sys.stdout, + ) + snapshot = storage_snapshot(root, workflow) + evaluation = evaluate_budget(snapshot) + + event = { + "timestamp": utc_now(), + "action": "enforce", + "phase": arguments.phase, + "before_bytes": before_bytes, + "total_allocated_bytes": snapshot["total_allocated_bytes"], + "reclaimed_bytes": max( + 0, before_bytes - int(snapshot["total_allocated_bytes"]) + ), + "warnings_before_prune": before_warnings, + "violations_before_prune": before_violations, + "warnings": evaluation["warnings"], + "violations": evaluation["violations"], + "auto_prune_enabled": auto_prune, + "auto_prune_would_apply": bool( + pressure and eligible and auto_prune and snapshot.get("simulated") + ), + "destructive": any(result["deleted"] for result in prune_results), + "checked_plan": checked_plan, + "prune_results": prune_results, + "eligible_prune_bytes": sum( + int(item["allocated_bytes"]) for item in eligible + ), + "eligible_prune_lanes": [item["lane"] for item in eligible], + "prune_recommended": pressure and bool(eligible), + "simulated": snapshot.get("simulated", False), + } + if not snapshot.get("simulated"): + write_ledger(root, event) + if arguments.json: + print(json.dumps(event, indent=2, sort_keys=True)) + else: + _print_human(_summary(snapshot, evaluation)) + if pressure and eligible: + if auto_prune and snapshot.get("simulated"): + print("Simulation only: expired disposable lanes would be pruned.") + elif not auto_prune: + print( + "Automatic pruning is disabled. Review `build_storage.py prune " + "--dry-run` before any explicit apply." + ) + return 2 if evaluation["violations"] else 0 + + +def _write_test_marker( + path: Path, + root: Path, + lane: str, + role: str, + *, + last_use: str | None = None, +) -> None: + path.mkdir(parents=True, exist_ok=True) + document = { + "schema_version": 1, + "workspace": str(canonical_path(root)), + "workspace_hash": workspace_hash(root), + "lane": lane, + "role": role, + "path": str(canonical_path(path)), + "created_at": utc_now(), + "last_use": last_use or utc_now(), + } + sentinel_path(path).write_text(json.dumps(document), encoding="utf-8") + + +def _self_test() -> dict[str, Any]: + checks: list[str] = [] + fake = { + "policy": dict(DEFAULT_POLICY), + "total_allocated_bytes": 81 * GIB, + "lanes": [], + "filesystems": [ + {"mount": "/test", "free_bytes": 100 * GIB, "minimum_free_bytes": 40 * GIB} + ], + } + assert evaluate_budget(fake)["violations"] + checks.append("simulated-hard-budget-crossing") + fake["total_allocated_bytes"] = 56 * GIB + soft = evaluate_budget(fake) + assert not soft["violations"] and soft["warnings"] + checks.append("simulated-soft-budget-crossing") + fake["total_allocated_bytes"] = 1 * GIB + fake["filesystems"][0]["free_bytes"] = 39 * GIB + assert evaluate_budget(fake)["violations"] + checks.append("simulated-free-space-floor") + + with tempfile.TemporaryDirectory(prefix="blacksite-storage-self-test-") as temporary: + base = Path(temporary) + root = base / "workspace" + (root / ".git").mkdir(parents=True) + (root / "Cargo.toml").write_text("[workspace]\nmembers=[]\n", encoding="utf-8") + cache = base / "cache" + workflow = { + "build_storage": { + **DEFAULT_POLICY, + "cache_root": str(cache), + "workspace_partition": "canonical-path-hash", + "exceptional_target_root": "target/lanes", + } + } + lane_path = cache / workspace_hash(root) / "candidate" + _write_test_marker(lane_path, root, "candidate", "build") + artifact = { + "path": str(lane_path), + "lane": "candidate", + "role": "build", + } + assert not deletion_safety( + artifact, root=root, workflow=workflow, processes=[] + ) + checks.append("valid-sentinel-path-accepted") + + link = lane_path / "escape" + link.symlink_to(root) + errors = deletion_safety( + artifact, root=root, workflow=workflow, processes=[] + ) + assert any("symlink" in error for error in errors) + checks.append("internal-symlink-rejected") + link.unlink() + + errors = deletion_safety( + artifact, + root=root, + workflow=workflow, + processes=[ + { + "pid": 42, + "comm": "cargo", + "uses": [str(lane_path)], + "build_tool": True, + "packager": False, + "workspace_related": True, + } + ], + ) + assert any("active process" in error for error in errors) + checks.append("active-process-rejected") + + unmarked = cache / workspace_hash(root) / "unmarked" + unmarked.mkdir(parents=True) + errors = deletion_safety( + {"path": str(unmarked), "lane": "unmarked", "role": "build"}, + root=root, + workflow=workflow, + processes=[], + ) + assert any("missing or malformed" in error for error in errors) + checks.append("unmarked-lane-rejected") + + for protected_path, label in ( + (root, "workspace-root"), + (root.parent, "workspace-parent"), + (Path.home(), "home"), + (cargo_home(), "cargo-home"), + ): + errors = deletion_safety( + { + "path": str(protected_path), + "lane": "candidate", + "role": "build", + }, + root=root, + workflow=workflow, + processes=[], + ) + assert errors + checks.append(f"{label}-rejected") + + # Candidate deletion requires a generation-bound marker whose evidence + # and preserved artifacts still exist outside the disposable lane. + dev_path = cache / workspace_hash(root) / "dev" + _write_test_marker(dev_path, root, "dev", "build") + evidence = base / "evidence" / "candidate-manifest.json" + evidence.parent.mkdir(parents=True) + evidence.write_text('{"candidate":"test"}\n', encoding="utf-8") + preserved_artifact = base / "preserved" / "editor-package.tar.zst" + preserved_artifact.parent.mkdir(parents=True) + preserved_artifact.write_bytes(b"preserved candidate package") + lane = { + "lane": "candidate", + "allocated_bytes": measure_tree(lane_path).allocated_bytes, + "artifacts": [artifact], + } + + blocked_output = io.StringIO() + _, blocked_results = _execute_checked_deletions( + [lane], + root=root, + workflow=workflow, + action="self-test-candidate", + apply=True, + output=blocked_output, + ) + assert blocked_results[0]["blocked"] and lane_path.exists() + assert any( + "preservation marker is missing" in error + for error in blocked_results[0]["blocked"] + ) + checks.append("candidate-without-preservation-marker-rejected") + + mark_arguments = argparse.Namespace( + evidence=evidence, artifact=[preserved_artifact] + ) + with contextlib.redirect_stdout(io.StringIO()): + assert _mark_candidate_preserved(root, workflow, mark_arguments) == 0 + assert not _candidate_preservation_errors( + lane, root=root, workflow=workflow + ) + checks.append("candidate-preservation-marker-validated") + + class FlushProbe(io.StringIO): + def __init__(self, guarded_path: Path) -> None: + super().__init__() + self.guarded_path = guarded_path + self.flushed_before_delete = False + + def flush(self) -> None: + assert self.guarded_path.exists() + self.flushed_before_delete = True + super().flush() + + output = FlushProbe(lane_path) + checked_plan, results = _execute_checked_deletions( + [lane], + root=root, + workflow=workflow, + action="self-test-candidate", + apply=True, + output=output, + ) + deletion = results[0] + assert output.flushed_before_delete + assert checked_plan["total_allocated_bytes"] == lane["allocated_bytes"] + assert "self-test-candidate-checked-plan" in output.getvalue() + assert not deletion["blocked"] and deletion["deleted"] + assert not lane_path.exists() + assert dev_path.exists() and evidence.is_file() and preserved_artifact.is_file() + checks.append("checked-plan-flushed-before-candidate-prune") + checks.append("candidate-pruned-artifact-evidence-and-dev-preserved") + + # Recreating the candidate lane invalidates the old generation-bound + # marker, so a stale preservation decision cannot authorize deletion. + _write_test_marker( + lane_path, + root, + "candidate", + "build", + last_use="2099-01-01T00:00:00+00:00", + ) + lane["allocated_bytes"] = measure_tree(lane_path).allocated_bytes + stale = _delete_lane(lane, root=root, workflow=workflow, apply=False) + assert any("lane_generation" in error for error in stale["blocked"]) + checks.append("stale-candidate-preservation-marker-rejected") + + # Enforcement reports pressure and eligible lanes but never performs a + # deletion. Auto-prune must emit its complete checked plan first. + hot_path = cache / workspace_hash(root) / "hot-reload" + _write_test_marker( + hot_path, + root, + "hot-reload", + "build", + last_use="2000-01-01T00:00:00+00:00", + ) + workflow["build_storage"].update( + { + "soft_total_gib": 0, + "hard_total_gib": 100000, + "min_free_gib": 0, + "min_free_percent": 0, + "hot_reload_retention_hours": 0, + "auto_prune_disposable": True, + } + ) + enforce_arguments = argparse.Namespace( + phase="pre", + json=True, + simulate_total_gib=None, + simulate_free_gib=None, + simulate_lane_gib=[], + ) + enforce_output = io.StringIO() + enforce_plan_output = io.StringIO() + with contextlib.redirect_stdout(enforce_output), contextlib.redirect_stderr( + enforce_plan_output + ): + assert _enforce(root, workflow, enforce_arguments) == 0 + enforce_event = json.loads(enforce_output.getvalue()) + enforce_plan = json.loads(enforce_plan_output.getvalue()) + assert enforce_plan["action"] == "enforce-pre-checked-plan" + assert enforce_plan["total_allocated_bytes"] > 0 + assert enforce_event["destructive"] is True + assert "hot-reload" in enforce_event["eligible_prune_lanes"] + assert not hot_path.exists() + checks.append("enforce-pressure-prunes-after-checked-plan") + + return {"ok": True, "checks": checks} + + +def _add_simulation_options(parser: argparse.ArgumentParser) -> None: + parser.add_argument("--simulate-total-gib", type=float) + parser.add_argument("--simulate-free-gib", type=float) + parser.add_argument( + "--simulate-lane-gib", + action="append", + default=[], + metavar="LANE=GIB", + ) + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--workspace", type=Path, help="workspace root override") + subparsers = parser.add_subparsers(dest="action", required=True) + + for name in ("status", "plan"): + command = subparsers.add_parser(name) + command.add_argument("--json", action="store_true") + _add_simulation_options(command) + + enforce = subparsers.add_parser("enforce") + enforce.add_argument("--phase", choices=("pre", "post"), required=True) + enforce.add_argument("--json", action="store_true") + _add_simulation_options(enforce) + + prune = subparsers.add_parser("prune") + mode = prune.add_mutually_exclusive_group(required=True) + mode.add_argument("--dry-run", action="store_true") + mode.add_argument("--apply", action="store_true") + _add_simulation_options(prune) + + reset = subparsers.add_parser("reset-lane") + reset.add_argument("lane") + mode = reset.add_mutually_exclusive_group(required=True) + mode.add_argument("--dry-run", action="store_true") + mode.add_argument("--apply", action="store_true") + _add_simulation_options(reset) + + preserved = subparsers.add_parser("mark-candidate-preserved") + preserved.add_argument( + "--evidence", + type=Path, + required=True, + help="preserved candidate evidence manifest outside the disposable lane", + ) + preserved.add_argument( + "--artifact", + type=Path, + action="append", + required=True, + help="preserved candidate binary/package file; repeat for multiple artifacts", + ) + + subparsers.add_parser("self-test") + return parser + + +def main(argv: Sequence[str] | None = None) -> int: + arguments = build_parser().parse_args(argv) + if arguments.action == "self-test": + print(json.dumps(_self_test(), indent=2, sort_keys=True)) + return 0 + try: + root = workspace_root(arguments.workspace) + workflow = load_workflow(root) + if arguments.action == "status": + return _status(root, workflow, arguments) + if arguments.action == "plan": + return _plan(root, workflow, arguments) + if arguments.action == "enforce": + return _enforce(root, workflow, arguments) + if arguments.action == "prune": + return _prune(root, workflow, arguments) + if arguments.action == "reset-lane": + return _reset_lane(root, workflow, arguments) + if arguments.action == "mark-candidate-preserved": + return _mark_candidate_preserved(root, workflow, arguments) + except (LaneError, StorageError, OSError, ValueError) as error: + print(f"build-storage: {error}", file=sys.stderr) + return 2 + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/codex/cargo_lane.py b/scripts/codex/cargo_lane.py new file mode 100755 index 0000000..ac43e3e --- /dev/null +++ b/scripts/codex/cargo_lane.py @@ -0,0 +1,848 @@ +#!/usr/bin/env python3 +"""Resolve and execute Cargo commands in bounded, signature-stable build lanes. + +This module intentionally uses only the Python standard library. It is also +imported by build_storage.py, so lane identity and sentinel validation have one +implementation. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import re +import shlex +import shutil +import subprocess +import sys +import tempfile +from dataclasses import asdict, dataclass +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Iterable, Mapping, Sequence + +try: + import tomllib +except ModuleNotFoundError as error: # pragma: no cover - Python < 3.11 + raise SystemExit("cargo_lane.py requires Python 3.11 or newer") from error + + +SCHEMA_VERSION = 1 +SENTINEL_NAME = ".blacksite-cargo-lane.json" +LANE_RE = re.compile(r"^[a-z0-9][a-z0-9-]{0,63}$") +SEPARATE_BUILD_DIR_MINIMUM = (1, 91, 0) + +DEFAULT_BUILD_STORAGE: dict[str, Any] = { + "cache_root": "cargo-cache-home", + "workspace_partition": "canonical-path-hash", + "dev_target_dir": "target", + "exceptional_target_root": "target/lanes", + "persistent_lane": "dev", + "candidate_lane": "candidate", + "hot_reload_lane": "hot-reload", + "full_debug_lane": "full-debug", + "package_lane": "package", +} + + +class LaneError(RuntimeError): + """A lane cannot be resolved or safely reused.""" + + +def utc_now() -> str: + return datetime.now(timezone.utc).isoformat(timespec="seconds") + + +def canonical_path(path: Path | str) -> Path: + return Path(path).expanduser().resolve(strict=False) + + +def workspace_root(start: Path | None = None) -> Path: + override = os.environ.get("BLACKSITE_WORKSPACE_ROOT") + if override: + candidate = canonical_path(override) + elif start is not None: + candidate = canonical_path(start) + else: + candidate = canonical_path(Path(__file__).parents[2]) + + for current in (candidate, *candidate.parents): + if (current / "Cargo.toml").is_file() and (current / ".git").exists(): + return current + raise LaneError(f"could not locate a Cargo workspace from {candidate}") + + +def workspace_hash(root: Path) -> str: + return hashlib.sha256(os.fsencode(str(canonical_path(root)))).hexdigest()[:20] + + +def cargo_home() -> Path: + return canonical_path(os.environ.get("CARGO_HOME", Path.home() / ".cargo")) + + +def load_workflow(root: Path) -> dict[str, Any]: + path = root / ".codex" / "workflow.toml" + document: dict[str, Any] = {} + if path.is_file(): + with path.open("rb") as handle: + loaded = tomllib.load(handle) + if not isinstance(loaded, dict): + raise LaneError(f"workflow config is not a TOML table: {path}") + document = loaded + + storage = dict(DEFAULT_BUILD_STORAGE) + configured = document.get("build_storage", {}) + if configured: + if not isinstance(configured, dict): + raise LaneError("[build_storage] must be a TOML table") + storage.update(configured) + + verification = document.get("verification", {}) + if isinstance(verification, dict): + for source, destination in ( + ("persistent_lane", "persistent_lane"), + ("candidate_lane", "candidate_lane"), + ("hot_reload_lane", "hot_reload_lane"), + ("full_debug_lane", "full_debug_lane"), + ("package_lane", "package_lane"), + ): + if source in verification: + storage[destination] = verification[source] + + document["build_storage"] = storage + return document + + +def _configured_path(root: Path, value: str, *, base: Path | None = None) -> Path: + expanded = Path(os.path.expandvars(os.path.expanduser(value))) + if expanded.is_absolute(): + return canonical_path(expanded) + return canonical_path((base or root) / expanded) + + +def cache_root(root: Path, workflow: Mapping[str, Any]) -> Path: + override = os.environ.get("BLACKSITE_BUILD_CACHE_ROOT") + if override: + return canonical_path(override) + + storage = workflow["build_storage"] + configured = str(storage.get("cache_root", "cargo-cache-home")) + if configured == "cargo-cache-home": + return cargo_home() / "blacksite-build" + if configured == "workspace-parent-cache": + return canonical_path(root.parent / ".blacksite-build-cache") + return _configured_path(root, configured) + + +def parse_version(text: str) -> tuple[int, int, int]: + match = re.search(r"\b(\d+)\.(\d+)\.(\d+)", text) + if not match: + return (0, 0, 0) + return tuple(int(part) for part in match.groups()) # type: ignore[return-value] + + +def _capture(command: Sequence[str]) -> str: + try: + completed = subprocess.run( + command, + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + except OSError as error: + return f"unavailable: {error}" + return completed.stdout.strip() + + +def toolchain_info() -> dict[str, Any]: + cargo_text = _capture(["cargo", "-Vv"]) + rustc_text = _capture(["rustc", "-Vv"]) + host = "unknown" + for line in rustc_text.splitlines(): + if line.startswith("host:"): + host = line.partition(":")[2].strip() + break + version = parse_version(cargo_text) + return { + "cargo": cargo_text.splitlines()[0] if cargo_text else "unavailable", + "cargo_version": ".".join(str(part) for part in version), + "rustc": rustc_text.splitlines()[0] if rustc_text else "unavailable", + "host": host, + "separate_build_dir": version >= SEPARATE_BUILD_DIR_MINIMUM, + } + + +def _repo_target_config(root: Path, target: str) -> dict[str, Any]: + path = root / ".cargo" / "config.toml" + result: dict[str, Any] = {"linker": None, "rustflags": []} + if path.is_file(): + with path.open("rb") as handle: + config = tomllib.load(handle) + target_table = config.get("target", {}) + if isinstance(target_table, dict): + values = target_table.get(target, {}) + if isinstance(values, dict): + result["linker"] = values.get("linker") + flags = values.get("rustflags", []) + if isinstance(flags, list): + result["rustflags"] = [str(flag) for flag in flags] + encoded_flags = os.environ.get("CARGO_ENCODED_RUSTFLAGS") + if encoded_flags: + result["rustflags"] = [flag for flag in encoded_flags.split("\x1f") if flag] + result["rustflags_source"] = "CARGO_ENCODED_RUSTFLAGS" + elif os.environ.get("RUSTFLAGS"): + result["rustflags"] = shlex.split(os.environ["RUSTFLAGS"]) + result["rustflags_source"] = "environment" + else: + result["rustflags_source"] = str(path) if path.is_file() else "cargo-default" + result["rustc_wrapper"] = os.environ.get("RUSTC_WRAPPER") + linker_variable = "CARGO_TARGET_" + target.upper().replace("-", "_") + "_LINKER" + if os.environ.get(linker_variable): + result["linker"] = os.environ[linker_variable] + return result + + +def validate_lane_name(lane: str) -> str: + if not LANE_RE.fullmatch(lane): + raise LaneError( + f"invalid lane {lane!r}; use lowercase letters, digits, and hyphens" + ) + return lane + + +def profile_directory(profile: str) -> str: + if profile in {"dev", "test"}: + return "debug" + if profile in {"release", "bench"}: + return "release" + return profile + + +@dataclass(frozen=True) +class CommandContext: + profile: str + profile_dir: str + feature_signature: str + cargo_subcommand: str | None + target_triple: str | None + + +PROJECT_ALIAS_SUBCOMMANDS = { + "bake-navigation", + "package-project", + "process-assets", + "upgrade-project", + "validate-levels", + "validate-samples", +} + + +def command_context(command: Sequence[str], lane: str) -> CommandContext: + args = list(command) + cargo_index: int | None = None + for index, value in enumerate(args[:2]): + if Path(value).name == "cargo": + cargo_index = index + break + + cargo_args = args[cargo_index + 1 :] if cargo_index is not None else [] + subcommand = next((arg for arg in cargo_args if not arg.startswith("-")), None) + # Arguments following Blacksite's Cargo aliases are forwarded to the xtask + # binary by the alias's trailing `--`. They are not Cargo options. In + # particular, `cargo package-project --profile package-qa` selects the + # package manifest profile and must not repartition the Cargo build lane. + cargo_options = ( + cargo_args[: cargo_args.index(subcommand) + 1] + if subcommand in PROJECT_ALIAS_SUBCOMMANDS + else cargo_args + ) + if "--release" in cargo_options: + profile = "release" + else: + profile = "test" if subcommand == "test" else "dev" + for index, value in enumerate(cargo_options): + if value.startswith("--profile="): + profile = value.partition("=")[2] + elif value == "--profile" and index + 1 < len(cargo_options): + profile = cargo_options[index + 1] + + features: set[str] = set() + all_features = "--all-features" in cargo_options + no_default = "--no-default-features" in cargo_options + for index, value in enumerate(cargo_options): + raw: str | None = None + if value.startswith("--features="): + raw = value.partition("=")[2] + elif value.startswith("-F") and value != "-F": + raw = value[2:] + elif value in {"--features", "-F"} and index + 1 < len(cargo_options): + raw = cargo_options[index + 1] + if raw: + features.update(part for part in re.split(r"[ ,]+", raw) if part) + + target_triple: str | None = None + for index, value in enumerate(cargo_options): + if value.startswith("--target="): + target_triple = value.partition("=")[2] + elif value == "--target" and index + 1 < len(cargo_options): + target_triple = cargo_options[index + 1] + + if all_features: + feature_signature = "all-features" + else: + parts = ["no-default" if no_default else "default"] + if features: + parts.append("features=" + ",".join(sorted(features))) + feature_signature = ";".join(parts) + + # These disposable lanes intentionally contain a bounded family of + # package-specific feature sets. Hot reload needs the editor's + # `dev,hot-reload` build and `game_hot`'s `dylib` build in one isolated + # runtime lane; package aliases likewise expand to different internal + # features. They must never spill into the persistent default-feature lane. + if lane == "hot-reload": + if all_features: + raise LaneError("all-features belongs in the candidate lane") + feature_signature = "hot-reload-family" + elif lane == "package": + feature_signature = "package-family" + + if lane == "dev" and (all_features or "hot-reload" in features): + raise LaneError( + "the persistent dev lane cannot be used for all-features or hot-reload" + ) + if lane == "candidate" and subcommand is not None and not all_features: + raise LaneError("the candidate lane requires --all-features") + + return CommandContext( + profile=profile, + profile_dir=profile_directory(profile), + feature_signature=feature_signature, + cargo_subcommand=subcommand, + target_triple=target_triple, + ) + + +@dataclass(frozen=True) +class LaneLayout: + workspace: str + workspace_hash: str + lane: str + mode: str + cache_root: str + lane_root: str + target_dir: str + build_dir: str + profile: str + profile_dir: str + runtime_deps: str + feature_signature: str + toolchain: dict[str, Any] + linker: str | None + rustflags: list[str] + rustflags_source: str + rustc_wrapper: str | None + target_triple: str + + +def lane_layout( + root: Path, + lane: str, + workflow: Mapping[str, Any], + command: Sequence[str] = (), + *, + toolchain: Mapping[str, Any] | None = None, +) -> LaneLayout: + lane = validate_lane_name(lane) + root = canonical_path(root) + info = dict(toolchain or toolchain_info()) + context = command_context(command, lane) + storage = workflow["build_storage"] + cache = canonical_path(cache_root(root, workflow)) + partition = cache / workspace_hash(root) + lane_root = partition / lane + separate = bool(info.get("separate_build_dir")) + effective_target = context.target_triple or str(info.get("host", "unknown")) + if ( + context.target_triple + and context.target_triple != info.get("host") + and not lane.startswith("cross-") + ): + raise LaneError("cross-target Cargo commands require a cross-* disposable lane") + + persistent = str(storage.get("persistent_lane", "dev")) + if separate: + if lane == persistent: + target = _configured_path( + root, str(storage.get("dev_target_dir", "target")) + ) + else: + exceptional = _configured_path( + root, str(storage.get("exceptional_target_root", "target/lanes")) + ) + target = exceptional / lane + build = lane_root + mode = "separate-build-dir" + else: + target = lane_root / "target" + build = target + mode = "external-target-dir-fallback" + + target_config = _repo_target_config(root, effective_target) + profile_path = Path(context.profile_dir) + if context.target_triple: + profile_path = Path(context.target_triple) / profile_path + return LaneLayout( + workspace=str(root), + workspace_hash=workspace_hash(root), + lane=lane, + mode=mode, + cache_root=str(cache), + lane_root=str(lane_root), + target_dir=str(target), + build_dir=str(build), + profile=context.profile, + profile_dir=context.profile_dir, + runtime_deps=str(build / profile_path / "deps"), + feature_signature=context.feature_signature, + toolchain=info, + linker=target_config.get("linker"), + rustflags=list(target_config.get("rustflags", [])), + rustflags_source=str(target_config.get("rustflags_source")), + rustc_wrapper=target_config.get("rustc_wrapper"), + target_triple=effective_target, + ) + + +def lane_environment(layout: LaneLayout) -> dict[str, str]: + environment = { + "CARGO_TARGET_DIR": layout.target_dir, + "BLACKSITE_CARGO_LANE": layout.lane, + "BLACKSITE_WORKSPACE_HASH": layout.workspace_hash, + } + if layout.mode == "separate-build-dir": + environment["CARGO_BUILD_BUILD_DIR"] = layout.build_dir + if layout.lane in {"candidate", "package", "full-debug"}: + environment["CARGO_INCREMENTAL"] = "0" + if layout.lane == "full-debug": + environment["CARGO_PROFILE_DEV_DEBUG"] = "full" + environment["CARGO_PROFILE_TEST_DEBUG"] = "full" + return environment + + +def sentinel_path(path: Path) -> Path: + return path / SENTINEL_NAME + + +def read_sentinel(path: Path) -> dict[str, Any] | None: + marker = sentinel_path(path) + if not marker.is_file() or marker.is_symlink(): + return None + try: + with marker.open("r", encoding="utf-8") as handle: + value = json.load(handle) + except (OSError, json.JSONDecodeError): + return None + return value if isinstance(value, dict) else None + + +def validate_sentinel( + path: Path, + document: Mapping[str, Any], + *, + root: Path, + lane: str, + role: str, +) -> list[str]: + errors: list[str] = [] + expected = { + "schema_version": SCHEMA_VERSION, + "workspace": str(canonical_path(root)), + "workspace_hash": workspace_hash(root), + "lane": lane, + "role": role, + "path": str(canonical_path(path)), + } + for key, value in expected.items(): + if document.get(key) != value: + errors.append(f"{key}: expected {value!r}, found {document.get(key)!r}") + return errors + + +def _signature(layout: LaneLayout) -> dict[str, Any]: + # The persistent development and candidate lanes intentionally serve both + # Cargo's `dev` and `test` profiles. Cargo fingerprints those profiles + # independently, while keeping them in one bounded ordinary/candidate lane + # avoids multiplying the Bevy dependency graph into permanent caches. + profile_signature = "dev-test" if layout.profile in {"dev", "test"} else layout.profile + return { + "toolchain": layout.toolchain, + "target_triple": layout.target_triple, + "linker": layout.linker, + "rustflags": layout.rustflags, + "rustc_wrapper": layout.rustc_wrapper, + "feature_signature": layout.feature_signature, + "profile_signature": profile_signature, + "mode": layout.mode, + "lane_environment": lane_environment(layout), + } + + +def _signature_compatible(existing: object, requested: Mapping[str, Any]) -> bool: + if existing == requested: + return True + if not isinstance(existing, Mapping): + return False + previous = dict(existing) + current = dict(requested) + previous_profile = previous.pop("profile_signature", None) + current_profile = current.pop("profile_signature", None) + return ( + previous == current + and previous_profile in {"dev", "test"} + and current_profile == "dev-test" + ) + + +def _atomic_json(path: Path, document: Mapping[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + descriptor, temporary = tempfile.mkstemp( + prefix=f".{path.name}.", suffix=".tmp", dir=path.parent + ) + try: + with os.fdopen(descriptor, "w", encoding="utf-8") as handle: + json.dump(document, handle, indent=2, sort_keys=True) + handle.write("\n") + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, path) + finally: + try: + os.unlink(temporary) + except FileNotFoundError: + pass + + +def _prepare_marker( + path: Path, layout: LaneLayout, role: str, *, allow_create: bool +) -> dict[str, Any]: + if path.is_symlink(): + raise LaneError(f"refusing symlinked lane path: {path}") + if allow_create: + path.mkdir(parents=True, exist_ok=True) + if not path.is_dir(): + raise LaneError(f"lane path does not exist: {path}") + + existing = read_sentinel(path) + now = utc_now() + signature = _signature(layout) + if existing is not None: + errors = validate_sentinel( + path, existing, root=Path(layout.workspace), lane=layout.lane, role=role + ) + if errors: + raise LaneError( + f"invalid lane sentinel at {path}: " + "; ".join(errors) + ) + if not _signature_compatible(existing.get("signature"), signature): + raise LaneError( + "lane signature changed; select the correct exceptional lane or reset " + f"the whole lane after a dry run: {layout.lane}" + ) + document = dict(existing) + document["signature"] = signature + document["last_use"] = now + document["last_profile"] = layout.profile + else: + document = { + "schema_version": SCHEMA_VERSION, + "workspace": layout.workspace, + "workspace_hash": layout.workspace_hash, + "lane": layout.lane, + "role": role, + "path": str(canonical_path(path)), + "target_dir": layout.target_dir, + "build_dir": layout.build_dir, + "signature": signature, + "created_at": now, + "last_use": now, + "last_profile": layout.profile, + } + _atomic_json(sentinel_path(path), document) + return document + + +def prepare_lane(layout: LaneLayout) -> None: + lane_root = Path(layout.lane_root) + _prepare_marker(lane_root, layout, "build", allow_create=True) + + target = Path(layout.target_dir) + workspace_target = Path(layout.workspace) / "target" + if target != workspace_target and target != Path(layout.build_dir): + _prepare_marker(target, layout, "target", allow_create=True) + + +def require_prepared_lane(layout: LaneLayout) -> None: + lane_root = Path(layout.lane_root) + marker = read_sentinel(lane_root) + if marker is None: + raise LaneError( + f"lane {layout.lane!r} has not been built through cargo_lane.py" + ) + errors = validate_sentinel( + lane_root, + marker, + root=Path(layout.workspace), + lane=layout.lane, + role="build", + ) + if errors: + raise LaneError("invalid prepared lane: " + "; ".join(errors)) + + +def layout_document(layout: LaneLayout) -> dict[str, Any]: + document = asdict(layout) + document["environment"] = lane_environment(layout) + document["sentinel"] = str(sentinel_path(Path(layout.lane_root))) + return document + + +def _shell_environment(values: Mapping[str, str]) -> str: + return "\n".join( + f"export {name}={shlex.quote(value)}" for name, value in sorted(values.items()) + ) + + +def _run_command(layout: LaneLayout, command: Sequence[str], *, dry_run: bool) -> int: + if not command: + raise LaneError("missing command after --") + if dry_run: + print( + json.dumps( + {"layout": layout_document(layout), "command": list(command)}, + indent=2, + sort_keys=True, + ) + ) + return 0 + prepare_lane(layout) + environment = os.environ.copy() + environment.update(lane_environment(layout)) + return subprocess.run(command, cwd=layout.workspace, env=environment).returncode + + +def _resolve_runtime_command(layout: LaneLayout, command: Sequence[str]) -> list[str]: + if not command: + raise LaneError("missing runtime command after --") + resolved = list(command) + executable = Path(resolved[0]) + if not executable.is_absolute(): + parts = executable.parts + if parts and parts[0] == "target": + executable = Path(layout.target_dir).joinpath(*parts[1:]) + elif "/" in resolved[0]: + executable = Path(layout.workspace) / executable + resolved[0] = str(canonical_path(executable)) if "/" in str(executable) else str(executable) + return resolved + + +def _run_runtime(layout: LaneLayout, command: Sequence[str], *, dry_run: bool) -> int: + require_prepared_lane(layout) + resolved = _resolve_runtime_command(layout, command) + environment = os.environ.copy() + dependencies = layout.runtime_deps + existing = environment.get("LD_LIBRARY_PATH") + environment["LD_LIBRARY_PATH"] = ( + dependencies if not existing else dependencies + os.pathsep + existing + ) + environment.update(lane_environment(layout)) + if dry_run: + print( + json.dumps( + { + "layout": layout_document(layout), + "command": resolved, + "LD_LIBRARY_PATH": environment["LD_LIBRARY_PATH"], + }, + indent=2, + sort_keys=True, + ) + ) + return 0 + os.chdir(layout.workspace) + os.execvpe(resolved[0], resolved, environment) + raise AssertionError("os.execvpe unexpectedly returned") # pragma: no cover + + +def _self_test() -> dict[str, Any]: + checks: list[str] = [] + assert parse_version("cargo 1.97.0 (abc)") == (1, 97, 0) + checks.append("cargo-version-parsing") + assert profile_directory("test") == "debug" + assert profile_directory("package-qa") == "package-qa" + checks.append("profile-directory-mapping") + try: + validate_lane_name("../escape") + except LaneError: + checks.append("lane-name-traversal-rejected") + else: # pragma: no cover + raise AssertionError("unsafe lane name accepted") + + with tempfile.TemporaryDirectory(prefix="blacksite-lane-self-test-") as temporary: + root = Path(temporary) / "workspace" + (root / ".git").mkdir(parents=True) + (root / "Cargo.toml").write_text("[workspace]\nmembers = []\n", encoding="utf-8") + workflow = {"build_storage": dict(DEFAULT_BUILD_STORAGE)} + workflow["build_storage"]["cache_root"] = str(Path(temporary) / "cache") + fake_toolchain = { + "cargo": "cargo 1.97.0", + "cargo_version": "1.97.0", + "rustc": "rustc 1.97.0", + "host": "x86_64-unknown-linux-gnu", + "separate_build_dir": True, + } + layout = lane_layout(root, "dev", workflow, ["cargo", "check"], toolchain=fake_toolchain) + prepare_lane(layout) + marker = read_sentinel(Path(layout.lane_root)) + assert marker is not None + assert not validate_sentinel( + Path(layout.lane_root), marker, root=root, lane="dev", role="build" + ) + checks.append("sentinel-round-trip") + assert Path(layout.target_dir) == root / "target" + assert Path(layout.build_dir) != Path(layout.target_dir) + checks.append("separate-build-dir-layout") + test_layout = lane_layout( + root, "dev", workflow, ["cargo", "test"], toolchain=fake_toolchain + ) + prepare_lane(test_layout) + assert read_sentinel(Path(layout.lane_root))["signature"]["profile_signature"] == "dev-test" + checks.append("dev-and-test-share-persistent-lane") + hot_editor = lane_layout( + root, + "hot-reload", + workflow, + ["cargo", "build", "-p", "editor", "--features", "dev,hot-reload"], + toolchain=fake_toolchain, + ) + hot_game = lane_layout( + root, + "hot-reload", + workflow, + ["cargo", "build", "-p", "game_hot", "--features", "dylib"], + toolchain=fake_toolchain, + ) + assert hot_editor.feature_signature == hot_game.feature_signature == "hot-reload-family" + checks.append("hot-reload-feature-family-isolated") + package = lane_layout( + root, + "package", + workflow, + ["cargo", "package-project", "--project", ".", "--profile", "package-qa"], + toolchain=fake_toolchain, + ) + assert package.profile == "dev" + assert package.feature_signature == "package-family" + checks.append("project-alias-options-not-cargo-options") + + fallback_toolchain = dict(fake_toolchain) + fallback_toolchain["cargo_version"] = "1.90.0" + fallback_toolchain["separate_build_dir"] = False + fallback = lane_layout( + root, + "candidate", + workflow, + ["cargo", "test", "--all-features"], + toolchain=fallback_toolchain, + ) + assert fallback.mode == "external-target-dir-fallback" + assert Path(fallback.target_dir) == Path(fallback.lane_root) / "target" + assert fallback.build_dir == fallback.target_dir + checks.append("external-target-dir-fallback") + + cross = lane_layout( + root, + "cross-wasm", + workflow, + ["cargo", "check", "--target", "wasm32-unknown-unknown"], + toolchain=fake_toolchain, + ) + assert cross.target_triple == "wasm32-unknown-unknown" + assert "wasm32-unknown-unknown" in cross.runtime_deps + checks.append("cross-target-partition") + + return {"ok": True, "checks": checks} + + +def _command_tail(values: Iterable[str]) -> list[str]: + result = list(values) + if result and result[0] == "--": + result.pop(0) + return result + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--workspace", type=Path, help="workspace root override") + subparsers = parser.add_subparsers(dest="action", required=True) + + env_parser = subparsers.add_parser("env", help="describe a lane environment") + env_parser.add_argument("lane") + env_parser.add_argument("--json", action="store_true") + + exec_parser = subparsers.add_parser("exec", help="execute a command in a lane") + exec_parser.add_argument("lane") + exec_parser.add_argument("--dry-run", action="store_true") + exec_parser.add_argument("command", nargs=argparse.REMAINDER) + + run_parser = subparsers.add_parser("run", help="run an existing lane artifact") + run_parser.add_argument("lane") + run_parser.add_argument("--dry-run", action="store_true") + run_parser.add_argument("command", nargs=argparse.REMAINDER) + + subparsers.add_parser("self-test", help="run temp-directory safety checks") + return parser + + +def main(argv: Sequence[str] | None = None) -> int: + arguments = build_parser().parse_args(argv) + if arguments.action == "self-test": + print(json.dumps(_self_test(), indent=2, sort_keys=True)) + return 0 + + try: + root = workspace_root(arguments.workspace) + workflow = load_workflow(root) + raw_command = list(getattr(arguments, "command", [])) + # argparse.REMAINDER intentionally preserves arbitrary child-command + # flags. Accept our one wrapper flag after the lane as well as before it. + if arguments.action in {"exec", "run"} and "--dry-run" in raw_command: + separator = raw_command.index("--") if "--" in raw_command else len(raw_command) + if raw_command.index("--dry-run") < separator: + arguments.dry_run = True + raw_command.remove("--dry-run") + command = _command_tail(raw_command) + layout = lane_layout(root, arguments.lane, workflow, command) + + if arguments.action == "env": + document = layout_document(layout) + if arguments.json: + print(json.dumps(document, indent=2, sort_keys=True)) + else: + print(_shell_environment(document["environment"])) + return 0 + if arguments.action == "exec": + return _run_command(layout, command, dry_run=arguments.dry_run) + if arguments.action == "run": + return _run_runtime(layout, command, dry_run=arguments.dry_run) + except LaneError as error: + print(f"cargo-lane: {error}", file=sys.stderr) + return 2 + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/codex/docs_audit.py b/scripts/codex/docs_audit.py new file mode 100755 index 0000000..e518b66 --- /dev/null +++ b/scripts/codex/docs_audit.py @@ -0,0 +1,315 @@ +#!/usr/bin/env python3 +"""Validate Blacksite documentation authority coverage and lifecycle banners.""" + +from __future__ import annotations + +import argparse +import fnmatch +import json +import re +import subprocess +import sys +import tomllib +from collections import Counter +from dataclasses import dataclass +from pathlib import Path +from typing import Any + + +AUTHORITY_PATH = Path("docs/authority.toml") +BANNER_MARKERS = { + "active-plan": "**active plan", + "evidence": "**evidence record", + "historical": "**historical", + "superseded": "**superseded", +} +LINK_RE = re.compile(r"\[[^\]]+\]\(([^)]+)\)") + + +@dataclass(frozen=True) +class Rule: + id: str + classification: str + priority: int + path: str | None = None + prefix: str | None = None + role: str | None = None + replacement: str | None = None + topics: tuple[str, ...] = () + + def matches(self, candidate: str) -> bool: + if self.path is not None: + return candidate == self.path + if self.prefix is not None: + return candidate.startswith(self.prefix) + return False + + +def repository_root() -> Path: + current = Path(__file__).resolve() + for parent in current.parents: + if (parent / AUTHORITY_PATH).is_file(): + return parent + raise RuntimeError(f"cannot locate repository root containing {AUTHORITY_PATH}") + + +def load_authority(root: Path) -> tuple[dict[str, Any], list[Rule]]: + raw = tomllib.loads((root / AUTHORITY_PATH).read_text(encoding="utf-8")) + rules: list[Rule] = [] + for item in raw.get("rules", []): + selectors = [name for name in ("path", "prefix") if item.get(name) is not None] + if len(selectors) != 1: + raise ValueError(f"rule {item.get('id', '')} must set exactly one path or prefix") + rules.append( + Rule( + id=item["id"], + classification=item["classification"], + priority=int(item.get("priority", 0)), + path=item.get("path"), + prefix=item.get("prefix"), + role=item.get("role"), + replacement=item.get("replacement"), + topics=tuple(item.get("topics", [])), + ) + ) + return raw, rules + + +def discover_documents(root: Path, authority: dict[str, Any]) -> list[str]: + discovery = authority.get("discovery", {}) + found: set[str] = set() + for relative in discovery.get("paths", []): + path = root / relative + if path.is_file() and path.suffix == ".md": + found.add(path.relative_to(root).as_posix()) + for relative in discovery.get("trees", []): + tree = root / relative + if tree.is_dir(): + found.update(path.relative_to(root).as_posix() for path in tree.rglob("*.md")) + return sorted(found) + + +def resolve_rule(path: str, rules: list[Rule]) -> tuple[Rule | None, str | None]: + matches = [rule for rule in rules if rule.matches(path)] + if not matches: + return None, None + highest = max(rule.priority for rule in matches) + winners = [rule for rule in matches if rule.priority == highest] + classifications = {rule.classification for rule in winners} + if len(classifications) != 1: + names = ", ".join(rule.id for rule in winners) + return None, f"equal-priority rules disagree: {names}" + winners.sort(key=lambda rule: (rule.path is not None, len(rule.path or rule.prefix or "")), reverse=True) + return winners[0], None + + +def normalized_link_target(root: Path, document: Path, raw_target: str) -> str | None: + target = raw_target.split("#", 1)[0].strip().strip("<>") + if not target or "://" in target or target.startswith("mailto:"): + return None + resolved = (document.parent / target).resolve() + try: + return resolved.relative_to(root.resolve()).as_posix() + except ValueError: + return None + + +def path_matches(path: str, pattern: str) -> bool: + if pattern.endswith("/**"): + return path.startswith(pattern[:-2]) + return fnmatch.fnmatchcase(path, pattern) + + +def validate_links(root: Path, relative: str) -> list[str]: + path = root / relative + text = path.read_text(encoding="utf-8") + errors: list[str] = [] + for raw_target in LINK_RE.findall(text): + target = raw_target.split("#", 1)[0].strip().strip("<>") + if not target or "://" in target or target.startswith(("mailto:", "#")): + continue + normalized = normalized_link_target(root, path, raw_target) + if normalized is None: + errors.append(f"link escapes the repository: {raw_target}") + continue + if not (root / normalized).exists(): + errors.append(f"broken relative link: {raw_target}") + return errors + + +def changed_documents(root: Path) -> set[str]: + changed: set[str] = set() + commands = [ + ["git", "diff", "--name-only", "--relative", "HEAD"], + ["git", "ls-files", "--others", "--exclude-standard"], + ] + for command in commands: + result = subprocess.run(command, cwd=root, check=False, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError(f"failed to query changed files: {' '.join(command)}") + changed.update(line.strip() for line in result.stdout.splitlines() if line.strip()) + return changed + + +def validate_banner(root: Path, relative: str, rule: Rule) -> list[str]: + if rule.classification == "current": + return [] + path = root / relative + text = path.read_text(encoding="utf-8") + head = "\n".join(text.splitlines()[:180]) + lowered = head.lower() + marker = BANNER_MARKERS[rule.classification] + if marker not in lowered: + # ADR 0019 predates Markdown heading style but has an explicit first-line status. + if not (rule.classification == "superseded" and lowered.startswith("status: superseded")): + return [f"missing {rule.classification} banner near the start of the document"] + + if rule.classification not in {"evidence", "historical", "superseded"}: + return [] + links = { + normalized + for target in LINK_RE.findall(head) + if (normalized := normalized_link_target(root, path, target)) is not None + } + if not links: + return ["lifecycle banner must link to current canonical guidance"] + if rule.replacement and rule.replacement not in links: + return [f"lifecycle banner must link to configured replacement {rule.replacement}"] + return [] + + +def audit(root: Path, *, changed_only: bool = False, topic: str | None = None) -> dict[str, Any]: + authority, rules = load_authority(root) + allowed = set(authority.get("classifications", [])) + allowed_roles = set(authority.get("roles", [])) + errors: list[str] = [] + warnings: list[str] = [] + + if authority.get("version") != 1: + errors.append("docs/authority.toml: unsupported or missing version") + if allowed != {"current", "active-plan", "evidence", "historical", "superseded"}: + errors.append("docs/authority.toml: classifications must be the five workflow classes") + + for rule in rules: + if rule.classification not in allowed: + errors.append(f"rule {rule.id}: unknown classification {rule.classification}") + if not rule.role or rule.role not in allowed_roles: + errors.append(f"rule {rule.id}: unknown or missing role {rule.role}") + if rule.path and not (root / rule.path).is_file(): + errors.append(f"rule {rule.id}: exact path does not exist: {rule.path}") + if rule.replacement and not (root / rule.replacement).is_file(): + errors.append(f"rule {rule.id}: replacement does not exist: {rule.replacement}") + + counts: Counter[str] = Counter() + documents: list[dict[str, str]] = [] + resolved: list[tuple[str, Rule]] = [] + for relative in discover_documents(root, authority): + rule, conflict = resolve_rule(relative, rules) + if conflict: + errors.append(f"{relative}: {conflict}") + continue + if rule is None: + errors.append(f"{relative}: unclassified") + continue + resolved.append((relative, rule)) + counts[rule.classification] += 1 + documents.append( + { + "path": relative, + "classification": rule.classification, + "rule": rule.id, + "role": rule.role or "", + "topics": ",".join(rule.topics), + } + ) + + canonical_owners: dict[str, list[str]] = {} + for relative, rule in resolved: + if rule.role == "canonical" and rule.classification == "current": + for owned_topic in rule.topics: + canonical_owners.setdefault(owned_topic, []).append(relative) + for owned_topic, owners in sorted(canonical_owners.items()): + if len(owners) > 1: + errors.append(f"topic {owned_topic}: multiple canonical owners: {', '.join(owners)}") + + selected = resolved + if changed_only: + changed = changed_documents(root) + if AUTHORITY_PATH.as_posix() not in changed: + selected = [(path, rule) for path, rule in selected if path in changed] + if topic: + selected = [(path, rule) for path, rule in selected if topic in rule.topics] + if not selected: + errors.append(f"topic {topic}: no classified documents") + + stale_terms = authority.get("stale_terms", []) + for relative, rule in selected: + for error in validate_banner(root, relative, rule): + errors.append(f"{relative}: {error}") + for error in validate_links(root, relative): + errors.append(f"{relative}: {error}") + + if rule.classification != "current": + continue + text = (root / relative).read_text(encoding="utf-8") + lowered = text.lower() + for stale in stale_terms: + if any(path_matches(relative, allowed_path) for allowed_path in stale.get("allowed_paths", [])): + continue + pattern = stale["pattern"] + if pattern.lower() in lowered: + errors.append( + f"{relative}: stale term {pattern!r}; use {stale.get('replacement', 'current terminology')}" + ) + if rule.role == "canonical": + if re.search(r"(?im)^\s*- \[ \]", text): + warnings.append(f"{relative}: unchecked checklist in canonical documentation; review status semantics") + if re.search(r"(?i)\bnot implemented\b|\((?:still\s+)?planned\)", text): + warnings.append(f"{relative}: possible future-status language in canonical documentation; review semantically") + + return { + "ok": not errors, + "authority": AUTHORITY_PATH.as_posix(), + "documents": documents, + "counts": dict(sorted(counts.items())), + "errors": errors, + "warnings": warnings, + "selected": len(selected), + } + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--json", action="store_true", help="emit the complete machine-readable report") + parser.add_argument("--list", action="store_true", help="list every classified document") + parser.add_argument("--changed", action="store_true", help="check lifecycle, links, and terms only in changed documents") + parser.add_argument("--topic", help="check lifecycle, links, and terms only for one configured topic") + args = parser.parse_args() + + try: + result = audit(repository_root(), changed_only=args.changed, topic=args.topic) + except (OSError, RuntimeError, ValueError, tomllib.TOMLDecodeError) as error: + print(f"FAIL docs-authority — {error}", file=sys.stderr) + return 1 + + if args.json: + print(json.dumps(result, indent=2, sort_keys=True)) + else: + status = "PASS" if result["ok"] else "FAIL" + counts = ", ".join(f"{name}={count}" for name, count in result["counts"].items()) + print( + f"{status} docs-authority — {len(result['documents'])} classified, " + f"{result['selected']} checked — {counts}" + ) + if args.list: + for document in result["documents"]: + print(f"{document['classification']:11} {document['path']} ({document['rule']})") + for error in result["errors"]: + print(f"ERROR {error}", file=sys.stderr) + for warning in result["warnings"]: + print(f"WARN {warning}", file=sys.stderr) + return 0 if result["ok"] else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/codex/native_qa.sh b/scripts/codex/native_qa.sh new file mode 100755 index 0000000..c802406 --- /dev/null +++ b/scripts/codex/native_qa.sh @@ -0,0 +1,348 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd -P)" +SCENARIO_ROOT="$ROOT/.agents/skills/blacksite-native-qa/references/scenarios" +STATE_ROOT="$ROOT/.codex/session" +EVIDENCE_ROOT="$ROOT/.codex/evidence" + +usage() { + echo "usage: $0 plan|launch|attach|capture|record|status|restore|close [arguments]" >&2 + exit 2 +} + +[[ $# -ge 2 ]] || usage +ACTION="$1" +NAME="$2" +SCENARIO="$SCENARIO_ROOT/$NAME.yaml" +[[ -f "$SCENARIO" ]] || { echo "native-qa: unknown scenario $NAME" >&2; exit 2; } + +field() { + local key="$1" + sed -n "s/^${key}:[[:space:]]*//p" "$SCENARIO" | head -n 1 +} + +LANE="$(field build_lane)" +[[ -n "$LANE" ]] || LANE="dev" +FIXTURE="$(field fixture)" +mkdir -p "$STATE_ROOT" "$EVIDENCE_ROOT" + +lane_json() { + python "$ROOT/scripts/codex/cargo_lane.py" env "$LANE" --json +} + +list_section() { + local section="$1" + awk -v section="$section" ' + $0 == section ":" { active = 1; next } + active && /^[^[:space:]]/ { exit } + active && /^[[:space:]]+-[[:space:]]+/ { + sub(/^[[:space:]]+-[[:space:]]+/, "") + print + } + ' "$SCENARIO" +} + +snapshot_fixture() { + local record="$STATE_ROOT/native-$NAME.json" + local snapshot="$STATE_ROOT/native-$NAME.fixture.snapshot" + python - "$ROOT" "$FIXTURE" "$record" "$snapshot" "$LANE" "$SCENARIO" <<'PY' +import hashlib, json, os, pathlib, shutil, sys, time + +root = pathlib.Path(sys.argv[1]).resolve() +fixture_text, record_text, snapshot_text, lane, scenario = sys.argv[2:] +record = pathlib.Path(record_text) +snapshot = pathlib.Path(snapshot_text) +if record.is_file(): + previous = json.loads(record.read_text(encoding="utf-8")) + pid = previous.get("pid") + if pid: + try: + os.kill(int(pid), 0) + except ProcessLookupError: + pass + except PermissionError: + raise SystemExit(f"native-qa: cannot verify existing runner PID {pid}; refusing launch") + else: + raise SystemExit(f"native-qa: existing runner PID {pid} is still active") + old_fixture = previous.get("fixture") + if old_fixture and not old_fixture.get("restored"): + raise SystemExit("native-qa: restore the previous fixture before launching this scenario again") + record.unlink() + snapshot.unlink(missing_ok=True) +data = { + "pid": None, + "lane": lane, + "scenario": scenario, + "spawned_by_runner": False, + "prepared_at": time.time(), + "assertions": {}, + "evidence": [], +} +if fixture_text: + fixture = (root / fixture_text).resolve() + if fixture != root and root not in fixture.parents: + raise SystemExit(f"fixture escapes workspace: {fixture}") + if fixture.exists() and not fixture.is_file(): + raise SystemExit(f"fixture is not a regular file: {fixture}") + existed = fixture.is_file() + baseline = hashlib.sha256(fixture.read_bytes()).hexdigest() if existed else None + if existed: + shutil.copy2(fixture, snapshot) + data["fixture"] = { + "path": str(fixture), + "existed": existed, + "baseline_sha256": baseline, + "snapshot": str(snapshot) if existed else None, + "restored": False, + } +record.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") +PY +} + +case "$ACTION" in + plan) + LANE_JSON="$(lane_json)" python - "$SCENARIO" "$FIXTURE" <<'PY' +import json, os, pathlib, sys +layout = json.loads(os.environ["LANE_JSON"]) +scenario = pathlib.Path(sys.argv[1]) +fixture = sys.argv[2] +binary = pathlib.Path(layout["target_dir"]) / layout["profile_dir"] / "editor" +print(f"PASS native-qa-plan — {scenario.stem}") +print(f"Lane: {layout['lane']} ({layout['mode']})") +print(f"Binary: {binary}") +print(f"Runtime deps: {layout['runtime_deps']}") +print(f"Fixture: {fixture or 'scenario-defined'}") +print("Visual interaction remains manual/user-controlled until explicitly delegated.") +PY + echo "Purpose: $(field purpose)" + echo "Preconditions: $(field preconditions)" + echo "Steps:" + list_section steps | nl -w2 -s'. ' + echo "Assertions:" + list_section assertions | nl -w2 -s'. ' + echo "Evidence: $(field evidence)" + echo "Cleanup: $(field cleanup)" + ;; + launch) + snapshot_fixture + python "$ROOT/scripts/codex/build_storage.py" enforce --phase pre + python "$ROOT/scripts/codex/summarize_command.py" \ + --gate "native-$NAME-build" \ + --log "$ROOT/.codex/logs/native-$NAME-build.log" \ + --json-result "$ROOT/.codex/logs/native-$NAME-build.json" \ + -- python "$ROOT/scripts/codex/cargo_lane.py" exec "$LANE" -- cargo build -p editor --bin editor + python "$ROOT/scripts/codex/build_storage.py" enforce --phase post + nohup python "$ROOT/scripts/codex/cargo_lane.py" run "$LANE" -- \ + target/debug/editor --project "$ROOT" \ + >"$ROOT/.codex/logs/native-$NAME-launch.log" 2>&1 & + PID=$! + python - "$STATE_ROOT/native-$NAME.json" "$PID" <<'PY' +import json, pathlib, sys, time +path = pathlib.Path(sys.argv[1]) +data = json.loads(path.read_text(encoding="utf-8")) +data.update({"pid": int(sys.argv[2]), "spawned_at": time.time(), "spawned_by_runner": True}) +path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") +PY + echo "PASS native-qa-launch — $NAME — PID $PID" + ;; + attach) + [[ $# -eq 3 ]] || usage + PID="$3" + kill -0 "$PID" 2>/dev/null || { echo "native-qa: PID $PID is not running" >&2; exit 2; } + CMDLINE="$(tr '\0' ' ' <"/proc/$PID/cmdline")" + [[ "$CMDLINE" == *"editor"* ]] || { echo "native-qa: refusing unexpected process: $CMDLINE" >&2; exit 2; } + snapshot_fixture + python - "$STATE_ROOT/native-$NAME.json" "$PID" <<'PY' +import json, pathlib, sys, time +path = pathlib.Path(sys.argv[1]) +data = json.loads(path.read_text(encoding="utf-8")) +data.update({"pid": int(sys.argv[2]), "attached_at": time.time(), "spawned_by_runner": False}) +path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") +PY + echo "PASS native-qa-attach — $NAME — PID $PID" + ;; + capture) + [[ $# -eq 3 ]] || usage + PID="$3" + kill -0 "$PID" 2>/dev/null || { echo "native-qa: PID $PID is not running" >&2; exit 2; } + CLIENTS="$(hyprctl clients -j)" + GEOMETRY="$(CLIENTS_JSON="$CLIENTS" python - "$PID" <<'PY' +import json, os, sys +pid = int(sys.argv[1]) +matches = [c for c in json.loads(os.environ["CLIENTS_JSON"]) if c.get("pid") == pid] +if len(matches) != 1: + raise SystemExit(f"expected one Hyprland window for PID {pid}, found {len(matches)}") +client = matches[0] +x, y = client["at"] +w, h = client["size"] +if w <= 0 or h <= 0: + raise SystemExit("target window has invalid geometry") +print(f"{x},{y} {w}x{h}") +PY +)" + STAMP="$(date -u +%Y%m%dT%H%M%SZ)" + IMAGE="$EVIDENCE_ROOT/$NAME-$STAMP.png" + grim -g "$GEOMETRY" "$IMAGE" + HASH="$(sha256sum "$IMAGE" | awk '{print $1}')" + python - "$STATE_ROOT/native-$NAME-evidence.json" "$PID" "$IMAGE" "$HASH" "$GEOMETRY" <<'PY' +import json, pathlib, sys, time +path = pathlib.Path(sys.argv[1]) +path.write_text(json.dumps({ + "pid": int(sys.argv[2]), "image": sys.argv[3], "sha256": sys.argv[4], + "geometry": sys.argv[5], "captured_at": time.time(), +}, indent=2) + "\n", encoding="utf-8") +PY + python - "$STATE_ROOT/native-$NAME.json" "$IMAGE" "$HASH" "$GEOMETRY" <<'PY' +import json, pathlib, sys, time +path = pathlib.Path(sys.argv[1]) +if not path.is_file(): + raise SystemExit("native-qa: missing runner record") +data = json.loads(path.read_text(encoding="utf-8")) +data.setdefault("evidence", []).append({ + "image": sys.argv[2], "sha256": sys.argv[3], "geometry": sys.argv[4], + "captured_at": time.time(), +}) +path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") +PY + echo "PASS native-qa-capture — $NAME — $IMAGE — $HASH" + ;; + record) + [[ $# -ge 4 && $# -le 5 ]] || usage + INDEX="$3" + RESULT="$4" + NOTE="${5:-}" + [[ "$INDEX" =~ ^[1-9][0-9]*$ ]] || { echo "native-qa: assertion index must be positive" >&2; exit 2; } + [[ "$RESULT" = "pass" || "$RESULT" = "fail" ]] || { echo "native-qa: result must be pass or fail" >&2; exit 2; } + ASSERTION_COUNT="$(list_section assertions | wc -l)" + (( INDEX <= ASSERTION_COUNT )) || { echo "native-qa: assertion $INDEX exceeds count $ASSERTION_COUNT" >&2; exit 2; } + ASSERTION_TEXT="$(list_section assertions | sed -n "${INDEX}p")" + python - "$STATE_ROOT/native-$NAME.json" "$INDEX" "$RESULT" "$NOTE" "$ASSERTION_TEXT" <<'PY' +import json, pathlib, sys, time +path = pathlib.Path(sys.argv[1]) +if not path.is_file(): + raise SystemExit("native-qa: missing runner record") +data = json.loads(path.read_text(encoding="utf-8")) +data.setdefault("assertions", {})[sys.argv[2]] = { + "result": sys.argv[3], "note": sys.argv[4], "text": sys.argv[5], + "recorded_at": time.time(), +} +path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") +PY + echo "PASS native-qa-record — $NAME — assertion $INDEX = $RESULT" + ;; + status) + [[ $# -eq 2 ]] || usage + RECORD="$STATE_ROOT/native-$NAME.json" + [[ -f "$RECORD" ]] || { echo "native-qa: no runner record for $NAME" >&2; exit 2; } + ASSERTION_COUNT="$(list_section assertions | wc -l)" + python - "$RECORD" "$ASSERTION_COUNT" <<'PY' +import json, pathlib, sys, time +path = pathlib.Path(sys.argv[1]) +data = json.loads(path.read_text(encoding="utf-8")) +expected = int(sys.argv[2]) +results = data.get("assertions", {}) +passed = sum(item.get("result") == "pass" for item in results.values()) +failed = sum(item.get("result") == "fail" for item in results.values()) +print(f"native-qa-status — assertions {passed} pass, {failed} fail, {expected - len(results)} unrecorded") +print(f"evidence: {len(data.get('evidence', []))} capture(s)") +fixture = data.get("fixture") +if fixture: + print(f"fixture restored: {bool(fixture.get('restored'))}") +complete = not failed and len(results) == expected and bool(data.get("evidence")) +data["scenario_result"] = {"result": "PASS" if complete else "FAIL", "recorded_at": time.time()} +path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") +if not complete: + raise SystemExit(1) +PY + ;; + restore) + [[ $# -eq 3 ]] || usage + MODE="$3" + [[ "$MODE" = "--dry-run" || "$MODE" = "--apply" ]] || usage + RECORD="$STATE_ROOT/native-$NAME.json" + [[ -f "$RECORD" ]] || { echo "native-qa: no runner record for $NAME" >&2; exit 2; } + python - "$RECORD" "$MODE" "$ROOT" <<'PY' +import hashlib, json, os, pathlib, shutil, sys, tempfile, time + +record = pathlib.Path(sys.argv[1]) +apply = sys.argv[2] == "--apply" +root = pathlib.Path(sys.argv[3]).resolve() +data = json.loads(record.read_text(encoding="utf-8")) +fixture = data.get("fixture") +if not fixture: + print("PASS native-qa-restore — scenario has no fixture") + raise SystemExit(0) +path = pathlib.Path(fixture["path"]).resolve() +if path != root and root not in path.parents: + raise SystemExit(f"native-qa: fixture escapes workspace: {path}") +pid = data.get("pid") +if apply and pid: + try: + os.kill(int(pid), 0) + except ProcessLookupError: + pass + except PermissionError: + raise SystemExit(f"native-qa: cannot verify runner PID {pid}; refusing fixture restore") + else: + raise SystemExit(f"native-qa: close runner PID {pid} before restoring the fixture") +current = hashlib.sha256(path.read_bytes()).hexdigest() if path.is_file() else None +baseline = fixture.get("baseline_sha256") +action = "restore snapshot" if fixture.get("existed") else "remove scenario-created fixture" +print(f"native-qa-restore-plan — {action}") +print(f"fixture: {path}") +print(f"baseline sha256: {baseline or '(absent)'}") +print(f"current sha256: {current or '(absent)'}") +sys.stdout.flush() +if not apply: + raise SystemExit(0) +if fixture.get("existed"): + snapshot = pathlib.Path(fixture["snapshot"]) + if not snapshot.is_file(): + raise SystemExit(f"native-qa: missing fixture snapshot: {snapshot}") + snapshot_hash = hashlib.sha256(snapshot.read_bytes()).hexdigest() + if snapshot_hash != baseline: + raise SystemExit("native-qa: fixture snapshot hash does not match recorded baseline") + path.parent.mkdir(parents=True, exist_ok=True) + with tempfile.NamedTemporaryFile(dir=path.parent, prefix=f".{path.name}.", delete=False) as handle: + temp = pathlib.Path(handle.name) + handle.write(snapshot.read_bytes()) + os.replace(temp, path) +else: + if path.exists() and not path.is_file(): + raise SystemExit(f"native-qa: refusing to remove non-file fixture path: {path}") + path.unlink(missing_ok=True) +fixture["restored"] = True +fixture["restored_at"] = time.time() +record.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") +print("PASS native-qa-restore") +PY + ;; + close) + [[ $# -eq 3 ]] || usage + PID="$3" + RECORD="$STATE_ROOT/native-$NAME.json" + [[ -f "$RECORD" ]] || { echo "native-qa: no runner record for $NAME" >&2; exit 2; } + RECORDED="$(python -c 'import json,sys; print(json.load(open(sys.argv[1]))["pid"])' "$RECORD")" + [[ "$RECORDED" = "$PID" ]] || { echo "native-qa: PID does not match runner record" >&2; exit 2; } + SPAWNED="$(python -c 'import json,sys; print(str(bool(json.load(open(sys.argv[1])).get("spawned_by_runner"))).lower())' "$RECORD")" + if [[ "$SPAWNED" = "true" ]] && kill -0 "$PID" 2>/dev/null; then + CMDLINE="$(tr '\0' ' ' <"/proc/$PID/cmdline")" + [[ "$CMDLINE" == *"editor"* ]] || { echo "native-qa: refusing to stop unexpected process: $CMDLINE" >&2; exit 2; } + kill -TERM "$PID" + fi + python - "$RECORD" <<'PY' +import json, pathlib, time, sys +path = pathlib.Path(sys.argv[1]) +data = json.loads(path.read_text(encoding="utf-8")) +data["closed_at"] = time.time() +data["detached_only"] = not bool(data.get("spawned_by_runner")) +if data["detached_only"]: + data["detached_pid"] = data.get("pid") + data["pid"] = None +path.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") +PY + echo "PASS native-qa-close — $NAME — PID $PID" + ;; + *) usage ;; +esac diff --git a/scripts/codex/state.py b/scripts/codex/state.py new file mode 100755 index 0000000..a805e97 --- /dev/null +++ b/scripts/codex/state.py @@ -0,0 +1,995 @@ +#!/usr/bin/env python3 +"""Maintain Blacksite's compact, resumable Codex session state. + +The state is intentionally Markdown rather than an opaque database so a resumed +agent can read it cheaply. This module uses only the Python standard library. +""" + +from __future__ import annotations + +import argparse +import contextlib +import copy +import hashlib +import io +import os +import subprocess +import sys +import tempfile +import tomllib +from dataclasses import dataclass, field +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Iterable, Sequence + + +TITLE = "# Codex session state" +WORKFLOW_PATH = Path(".codex/workflow.toml") +VALID_STATES = ( + "Implementing", + "Engineering-complete", + "Acceptance-in-progress", + "Candidate-ready", +) +CLASSIFICATIONS = { + "active-slice-refinement": "active-slice refinement", + "active-slice refinement": "active-slice refinement", + "newly-discovered-blocker": "newly discovered blocker", + "newly discovered blocker": "newly discovered blocker", + "discovered-blocker": "newly discovered blocker", + "added-acceptance-criterion": "added acceptance criterion", + "added acceptance criterion": "added acceptance criterion", + "separate-follow-up": "separate follow-up", + "separate follow-up": "separate follow-up", +} + + +class StateError(RuntimeError): + """The state operation cannot be completed safely.""" + + +def clean_text(value: str | None, default: str = "None.") -> str: + """Keep state entries single-line and compact.""" + + if value is None: + return default + compact = " ".join(value.split()) + return compact or default + + +def utc_now() -> str: + return datetime.now(timezone.utc).isoformat(timespec="seconds") + + +def find_repository(start: Path | None = None) -> Path: + """Locate the nearest repository containing the workflow configuration.""" + + override = os.environ.get("BLACKSITE_WORKSPACE_ROOT") + configured = None + config_path = (start or Path.cwd()) / ".codex/config.toml" + if not override and config_path.is_file(): + with config_path.open("rb") as handle: + configured = tomllib.load(handle).get("workspace_root") + candidates = [Path(override or configured)] if (override or configured) else [start or Path.cwd()] + if start is None and not override: + candidates.append(Path(__file__).parent) + + visited: set[Path] = set() + for candidate in candidates: + candidate = candidate.expanduser().absolute() + for current in (candidate, *candidate.parents): + canonical = current.resolve(strict=False) + if canonical in visited: + continue + visited.add(canonical) + if (current / WORKFLOW_PATH).is_file(): + return current + searched = ", ".join(str(path) for path in candidates) + raise StateError(f"could not locate {WORKFLOW_PATH} from {searched}") + + +def load_workflow(root: Path) -> dict[str, Any]: + path = root / WORKFLOW_PATH + try: + with path.open("rb") as handle: + workflow = tomllib.load(handle) + except OSError as error: + raise StateError(f"cannot read workflow configuration {path}: {error}") from error + except tomllib.TOMLDecodeError as error: + raise StateError(f"invalid workflow configuration {path}: {error}") from error + if workflow.get("version") != 1: + raise StateError(f"unsupported or missing workflow version in {path}") + return workflow + + +def configured_path(root: Path, raw: str, *, label: str) -> Path: + candidate = Path(os.path.expandvars(os.path.expanduser(raw))) + if not candidate.is_absolute(): + candidate = root / candidate + candidate = candidate.absolute() + try: + candidate.resolve(strict=False).relative_to(root.resolve(strict=False)) + except ValueError as error: + raise StateError(f"configured {label} must remain inside the repository: {candidate}") from error + return candidate + + +def state_path(root: Path, workflow: dict[str, Any]) -> Path: + session = workflow.get("session", {}) + if not isinstance(session, dict): + raise StateError("[session] must be a TOML table") + raw = session.get("state_file", ".codex/session/STATE.md") + if not isinstance(raw, str) or not raw: + raise StateError("session.state_file must be a non-empty path string") + return configured_path(root, raw, label="session.state_file") + + +def max_state_lines(workflow: dict[str, Any]) -> int: + session = workflow.get("session", {}) + value = session.get("max_state_lines", 180) if isinstance(session, dict) else 180 + if not isinstance(value, int) or value < 48: + raise StateError("session.max_state_lines must be an integer of at least 48") + return value + + +def run_git(root: Path, *arguments: str, check: bool = True) -> subprocess.CompletedProcess[str]: + try: + result = subprocess.run( + ["git", "-C", str(root), *arguments], + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + except OSError as error: + raise StateError(f"cannot execute git: {error}") from error + if check and result.returncode != 0: + detail = clean_text(result.stderr or result.stdout, "git command failed") + raise StateError(detail) + return result + + +def worktree_summary(root: Path) -> str: + lines = run_git(root, "status", "--porcelain=v1", "--untracked-files=normal").stdout.splitlines() + if not lines: + return "clean" + + staged = modified = deleted = untracked = conflicts = 0 + conflict_codes = {"DD", "AU", "UD", "UA", "DU", "AA", "UU"} + for line in lines: + if len(line) < 2: + continue + code = line[:2] + if code == "??": + untracked += 1 + continue + if code in conflict_codes: + conflicts += 1 + if code[0] not in {" ", "?"}: + staged += 1 + if code[1] not in {" ", "?"}: + modified += 1 + if "D" in code: + deleted += 1 + return ( + "dirty " + f"(staged={staged}, modified={modified}, deleted={deleted}, " + f"untracked={untracked}, conflicts={conflicts})" + ) + + +@dataclass +class RepositoryState: + root: str + real_path: str + branch: str + head: str + worktree: str + active_processes: str = "None recorded." + + +def repository_snapshot(root: Path, active_processes: str = "None recorded.") -> RepositoryState: + git_root = Path(run_git(root, "rev-parse", "--show-toplevel").stdout.strip()) + real_path = git_root.resolve(strict=False) + branch_result = run_git(root, "symbolic-ref", "--quiet", "--short", "HEAD", check=False) + branch = branch_result.stdout.strip() if branch_result.returncode == 0 else "(detached)" + head = run_git(root, "rev-parse", "HEAD").stdout.strip() + return RepositoryState( + root=str(git_root), + real_path=str(real_path), + branch=branch, + head=head, + worktree=worktree_summary(root), + active_processes=clean_text(active_processes, "None recorded."), + ) + + +@dataclass +class AcceptanceCriterion: + text: str + checked: bool = False + + +@dataclass +class ScopeDelta: + title: str + source: str + classification: str + requirement: str + evidence_valid: str + invalidated_gates: str + tracker_sync: str + + +@dataclass +class IntentionalFile: + path: str + reason: str + + +@dataclass +class GateRecord: + gate: str + status: str + digest: str + command: str + date: str + + +@dataclass +class SessionState: + repository: RepositoryState + goal: str + current_state: str = "Implementing" + issues: str = "None." + milestone: str = "None." + active_slice: str = "None." + non_goals: str = "None." + acceptance: list[AcceptanceCriterion] = field(default_factory=list) + deltas: list[ScopeDelta] = field(default_factory=list) + files: list[IntentionalFile] = field(default_factory=list) + gates: list[GateRecord] = field(default_factory=list) + native_evidence: list[str] = field(default_factory=list) + decisions: list[str] = field(default_factory=list) + remote_actions: list[str] = field(default_factory=list) + next_action: str = "Define the next action." + + +def section_map(text: str) -> dict[str, list[str]]: + sections: dict[str, list[str]] = {} + current: str | None = None + for line in text.splitlines(): + if line.startswith("## "): + current = line[3:].strip() + sections[current] = [] + elif current is not None: + sections[current].append(line) + return sections + + +def field_value(lines: Iterable[str], name: str, default: str = "None.") -> str: + prefix = f"- {name}:" + for line in lines: + if line.startswith(prefix): + return clean_text(line[len(prefix) :], default) + return default + + +def bullet_values(lines: Iterable[str]) -> list[str]: + values: list[str] = [] + for line in lines: + if line.startswith("- ") and not line.startswith("- ["): + value = clean_text(line[2:]) + if value != "None.": + values.append(value) + return values + + +def parse_deltas(lines: list[str]) -> list[ScopeDelta]: + chunks: list[tuple[str, list[str]]] = [] + title: str | None = None + body: list[str] = [] + for line in lines: + if line.startswith("### Delta "): + if title is not None: + chunks.append((title, body)) + heading = line.partition("—")[2].strip() + title = heading or "Untitled scope delta" + body = [] + elif title is not None: + body.append(line) + if title is not None: + chunks.append((title, body)) + + return [ + ScopeDelta( + title=clean_text(title), + source=field_value(body, "Source"), + classification=field_value(body, "Classification"), + requirement=field_value(body, "Added/changed requirement"), + evidence_valid=field_value(body, "Prior evidence still valid"), + invalidated_gates=field_value(body, "Invalidated gates"), + tracker_sync=field_value(body, "Tracker sync required", "no"), + ) + for title, body in chunks + ] + + +def parse_state(text: str) -> SessionState: + if not text.startswith(TITLE): + raise StateError(f"state file must begin with {TITLE!r}") + sections = section_map(text) + repository_lines = sections.get("Repository", []) + task_lines = sections.get("Active task", []) + repository = RepositoryState( + root=field_value(repository_lines, "Root"), + real_path=field_value(repository_lines, "Real path"), + branch=field_value(repository_lines, "Branch"), + head=field_value(repository_lines, "HEAD"), + worktree=field_value(repository_lines, "Worktree status summary"), + active_processes=field_value(repository_lines, "Active processes/windows", "None recorded."), + ) + + acceptance: list[AcceptanceCriterion] = [] + for line in sections.get("Acceptance target", []): + stripped = line.strip() + if stripped.startswith("- [ ] "): + acceptance.append(AcceptanceCriterion(clean_text(stripped[6:]))) + elif stripped.lower().startswith("- [x] "): + acceptance.append(AcceptanceCriterion(clean_text(stripped[6:]), checked=True)) + + files: list[IntentionalFile] = [] + for value in bullet_values(sections.get("Files intentionally changed", [])): + path, separator, reason = value.partition(" — ") + files.append(IntentionalFile(path, reason if separator else "Reason not recorded.")) + + gates: list[GateRecord] = [] + for value in bullet_values(sections.get("Verification ledger summary", [])): + parts = value.split(" — ", 4) + if len(parts) == 5: + gates.append(GateRecord(*parts)) + + next_values = bullet_values(sections.get("Exact next action", [])) + return SessionState( + repository=repository, + goal=field_value(task_lines, "Goal"), + current_state=field_value(task_lines, "Current state", "Implementing"), + issues=field_value(task_lines, "Gitea issue(s)"), + milestone=field_value(task_lines, "Gitea milestone"), + active_slice=field_value(task_lines, "Active slice"), + non_goals=field_value(task_lines, "Non-goals"), + acceptance=acceptance, + deltas=parse_deltas(sections.get("Scope deltas", [])), + files=files, + gates=gates, + native_evidence=bullet_values(sections.get("Native evidence", [])), + decisions=bullet_values(sections.get("Decisions", [])), + remote_actions=bullet_values(sections.get("Remote actions already performed", [])), + next_action=next_values[0] if next_values else "Define the next action.", + ) + + +def render_lines(state: SessionState) -> list[str]: + lines = [ + TITLE, + "", + "## Repository", + f"- Root: {clean_text(state.repository.root)}", + f"- Real path: {clean_text(state.repository.real_path)}", + f"- Branch: {clean_text(state.repository.branch)}", + f"- HEAD: {clean_text(state.repository.head)}", + f"- Worktree status summary: {clean_text(state.repository.worktree)}", + f"- Active processes/windows: {clean_text(state.repository.active_processes, 'None recorded.')}", + "", + "## Active task", + f"- Goal: {clean_text(state.goal)}", + f"- Current state: {clean_text(state.current_state, 'Implementing')}", + f"- Gitea issue(s): {clean_text(state.issues)}", + f"- Gitea milestone: {clean_text(state.milestone)}", + f"- Active slice: {clean_text(state.active_slice)}", + f"- Non-goals: {clean_text(state.non_goals)}", + "", + "## Acceptance target", + ] + lines.extend( + f"- [{'x' if criterion.checked else ' '}] {clean_text(criterion.text)}" + for criterion in state.acceptance + ) + lines.extend(["", "## Scope deltas"]) + for index, delta in enumerate(state.deltas, start=1): + lines.extend( + [ + f"### Delta {index} — {clean_text(delta.title)}", + f"- Source: {clean_text(delta.source)}", + f"- Classification: {clean_text(delta.classification)}", + f"- Added/changed requirement: {clean_text(delta.requirement)}", + f"- Prior evidence still valid: {clean_text(delta.evidence_valid)}", + f"- Invalidated gates: {clean_text(delta.invalidated_gates)}", + f"- Tracker sync required: {clean_text(delta.tracker_sync, 'no')}", + "", + ] + ) + lines.extend(["## Files intentionally changed"]) + lines.extend(f"- {clean_text(item.path)} — {clean_text(item.reason)}" for item in state.files) + lines.extend(["", "## Verification ledger summary"]) + lines.extend( + f"- {clean_text(item.gate)} — {clean_text(item.status)} — {clean_text(item.digest)} — " + f"{clean_text(item.command)} — {clean_text(item.date)}" + for item in state.gates + ) + lines.extend(["", "## Native evidence"]) + lines.extend(f"- {clean_text(item)}" for item in state.native_evidence) + lines.extend(["", "## Decisions"]) + lines.extend(f"- {clean_text(item)}" for item in state.decisions) + lines.extend(["", "## Remote actions already performed"]) + lines.extend(f"- {clean_text(item)}" for item in state.remote_actions) + lines.extend( + [ + "", + "## Exact next action", + f"- {clean_text(state.next_action, 'Define the next action.')}", + ] + ) + return lines + + +def compact_state(state: SessionState, limit: int) -> SessionState: + """Discard oldest ledger detail until the state fits its configured budget.""" + + compacted = copy.deepcopy(state) + collections: list[tuple[list[Any], int]] = [ + (compacted.gates, 1), + (compacted.native_evidence, 0), + (compacted.remote_actions, 0), + (compacted.decisions, 1), + (compacted.deltas, 1), + (compacted.files, 1), + (compacted.acceptance, 1), + ] + while len(render_lines(compacted)) > limit: + for values, keep in collections: + if len(values) > keep: + values.pop(0) + break + else: + raise StateError( + f"required state structure exceeds session.max_state_lines={limit}" + ) + return compacted + + +def ensure_state_is_ignored(root: Path, path: Path) -> None: + relative = path.resolve(strict=False).relative_to(root.resolve(strict=False)).as_posix() + result = run_git(root, "check-ignore", "--quiet", "--", relative, check=False) + if result.returncode != 0: + raise StateError( + f"refusing to write tracked session state; add /{relative} or its directory to .gitignore" + ) + + +def write_state(root: Path, workflow: dict[str, Any], state: SessionState) -> Path: + path = state_path(root, workflow) + ensure_state_is_ignored(root, path) + state = compact_state(state, max_state_lines(workflow)) + text = "\n".join(render_lines(state)) + "\n" + path.parent.mkdir(parents=True, exist_ok=True) + temporary: Path | None = None + try: + with tempfile.NamedTemporaryFile( + "w", + encoding="utf-8", + dir=path.parent, + prefix=f".{path.name}.", + suffix=".tmp", + delete=False, + ) as handle: + handle.write(text) + handle.flush() + os.fsync(handle.fileno()) + temporary = Path(handle.name) + os.replace(temporary, path) + finally: + if temporary is not None and temporary.exists(): + temporary.unlink() + return path + + +def read_state(root: Path, workflow: dict[str, Any]) -> SessionState: + path = state_path(root, workflow) + try: + return parse_state(path.read_text(encoding="utf-8")) + except FileNotFoundError as error: + raise StateError(f"no session state exists at {path}; run state.py init") from error + except OSError as error: + raise StateError(f"cannot read session state {path}: {error}") from error + + +def refresh_repository(root: Path, state: SessionState) -> list[str]: + previous = state.repository + current = repository_snapshot(root, previous.active_processes) + changes: list[str] = [] + for label, before, after in ( + ("real path", previous.real_path, current.real_path), + ("branch", previous.branch, current.branch), + ("HEAD", previous.head, current.head), + ): + if before not in {"None.", after}: + changes.append(f"{label}: {before} -> {after}") + state.repository = current + return changes + + +def normalize_repo_file(root: Path, raw: str) -> str: + candidate = Path(raw).expanduser() + if not candidate.is_absolute(): + candidate = root / candidate + candidate = candidate.resolve(strict=False) + repository = root.resolve(strict=False) + try: + return candidate.relative_to(repository).as_posix() + except ValueError as error: + raise StateError(f"intentional file must be inside the repository: {candidate}") from error + + +def replace_or_append_file(state: SessionState, path: str, reason: str) -> None: + state.files = [item for item in state.files if item.path != path] + state.files.append(IntentionalFile(path, clean_text(reason, "Reason not recorded."))) + + +def replace_or_append_gate(state: SessionState, record: GateRecord) -> None: + state.gates = [item for item in state.gates if item.gate != record.gate] + state.gates.append(record) + + +def candidate_commit(root: Path, revision: str) -> str: + result = run_git(root, "rev-parse", "--verify", f"{revision}^{{commit}}", check=False) + if result.returncode != 0: + raise StateError(f"candidate revision is not a commit: {revision}") + return result.stdout.strip() + + +def git_bytes(root: Path, *arguments: str) -> bytes: + try: + result = subprocess.run( + ["git", "-C", str(root), *arguments], + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + except OSError as error: + raise StateError(f"cannot execute git: {error}") from error + if result.returncode != 0: + detail = clean_text(result.stderr.decode("utf-8", "replace"), "git command failed") + raise StateError(detail) + return result.stdout + + +def _dirty_tree_digest_once(root: Path) -> str: + status_arguments = ("status", "--porcelain=v1", "-z", "--untracked-files=all") + status_before = git_bytes(root, *status_arguments) + if not status_before: + raise StateError("--dirty-tree requires a dirty worktree") + + digest = hashlib.sha256() + digest.update(b"blacksite-dirty-tree-v1\0") + digest.update(git_bytes(root, "rev-parse", "HEAD")) + digest.update(b"\0status\0") + digest.update(status_before) + digest.update(b"\0tracked-diff\0") + digest.update( + git_bytes( + root, + "diff", + "--binary", + "--no-ext-diff", + "--submodule=diff", + "HEAD", + "--", + ) + ) + + untracked = git_bytes(root, "ls-files", "--others", "--exclude-standard", "-z") + repository = root.resolve(strict=False) + for encoded in sorted(path for path in untracked.split(b"\0") if path): + relative = os.fsdecode(encoded) + relative_path = Path(relative) + if relative_path.is_absolute() or ".." in relative_path.parts: + raise StateError(f"untracked candidate path escapes the repository: {relative}") + path = repository / relative_path + digest.update(b"\0untracked\0") + digest.update(encoded) + if path.is_symlink(): + digest.update(b"\0symlink\0") + digest.update(os.fsencode(os.readlink(path))) + elif path.is_file(): + digest.update(b"\0file\0") + digest.update(str(path.stat().st_mode & 0o777).encode("ascii")) + with path.open("rb") as handle: + while chunk := handle.read(1024 * 1024): + digest.update(chunk) + else: + digest.update(b"\0special\0") + + if git_bytes(root, *status_arguments) != status_before: + raise StateError("worktree changed while computing the candidate digest; nominate again") + return digest.hexdigest() + + +def dirty_tree_digest(root: Path) -> str: + """Hash an exact stable base commit, tracked diff, and untracked source set.""" + + first = _dirty_tree_digest_once(root) + second = _dirty_tree_digest_once(root) + if first != second: + raise StateError("worktree changed while computing the candidate digest; nominate again") + return first + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + subparsers = parser.add_subparsers(dest="operation", required=True) + + init = subparsers.add_parser("init", help="create a new compact session state") + init.add_argument("--goal", required=True) + init.add_argument("--accept", action="append", required=True, help="acceptance criterion; repeat as needed") + init.add_argument("--slice", dest="active_slice", required=True) + init.add_argument("--next", dest="next_action", required=True) + init.add_argument("--non-goals", default="None.") + init.add_argument("--issues", default="None.") + init.add_argument("--milestone", default="None.") + init.add_argument("--active-processes", default="None recorded.") + init.add_argument("--force", action="store_true", help="replace an existing state") + + show = subparsers.add_parser("show", help="print the current state") + show.add_argument("--path", action="store_true", help="print only the state path") + + subparsers.add_parser("resume", help="refresh repository identity and show the exact next action") + + update = subparsers.add_parser("set", help="update active task fields") + update.add_argument("--goal") + update.add_argument("--state", choices=VALID_STATES) + update.add_argument("--issues") + update.add_argument("--milestone") + update.add_argument("--slice", dest="active_slice") + update.add_argument("--non-goals") + update.add_argument("--next", dest="next_action") + update.add_argument("--active-processes") + update.add_argument("--accept", action="append", help="replace acceptance criteria; repeat as needed") + update.add_argument("--decision", action="append", help="append a concise decision") + + delta = subparsers.add_parser("scope-delta", help="record authoritative user steering") + delta.add_argument("--title", required=True) + delta.add_argument("--source", required=True) + delta.add_argument("--classification", required=True) + delta.add_argument("--requirement", required=True) + delta.add_argument("--evidence-valid", required=True) + delta.add_argument("--invalidated-gates", required=True) + delta.add_argument("--tracker-sync", choices=("yes", "no"), required=True) + delta.add_argument("--next", dest="next_action") + + record_file = subparsers.add_parser("record-file", help="record an intentionally changed file") + record_file.add_argument("path") + record_file.add_argument("--reason", required=True) + + record_gate = subparsers.add_parser("record-gate", help="record one compact verification result") + record_gate.add_argument("--gate", required=True) + record_gate.add_argument("--status", type=str.upper, choices=("PASS", "FAIL"), required=True) + record_gate.add_argument("--digest", required=True) + record_gate.add_argument("--command", required=True) + record_gate.add_argument("--date", default=None) + record_gate.add_argument("--next", dest="next_action") + + nominate = subparsers.add_parser("nominate", help="nominate an exact candidate commit or tree digest") + candidate = nominate.add_mutually_exclusive_group() + candidate.add_argument("--commit", default="HEAD") + candidate.add_argument( + "--dirty-tree", + action="store_true", + help="explicitly nominate the current dirty tree by a reproducible digest", + ) + nominate.add_argument("--next", dest="next_action") + return parser + + +def perform_operation(root: Path, workflow: dict[str, Any], args: argparse.Namespace) -> int: + path = state_path(root, workflow) + if args.operation == "init": + if path.exists() and not args.force: + raise StateError(f"session state already exists at {path}; use init --force to replace it") + state = SessionState( + repository=repository_snapshot(root, args.active_processes), + goal=clean_text(args.goal), + issues=clean_text(args.issues), + milestone=clean_text(args.milestone), + active_slice=clean_text(args.active_slice), + non_goals=clean_text(args.non_goals), + acceptance=[AcceptanceCriterion(clean_text(value)) for value in args.accept], + next_action=clean_text(args.next_action), + ) + write_state(root, workflow, state) + print(f"PASS state-init — {path.relative_to(root.resolve(strict=False))}") + print(f"NEXT {state.next_action}") + return 0 + + if args.operation == "show": + # Loading the file validates that it remains template-compatible. + read_state(root, workflow) + if args.path: + print(path) + else: + print(path.read_text(encoding="utf-8"), end="") + return 0 + + state = read_state(root, workflow) + repository_changes = refresh_repository(root, state) + + if args.operation == "resume": + write_state(root, workflow, state) + print( + f"RESUME {state.current_state} — {state.repository.branch}@{state.repository.head[:12]} — " + f"{state.goal}" + ) + for change in repository_changes: + print(f"REPOSITORY CHANGED {change}") + print(f"NEXT {state.next_action}") + return 0 + + if args.operation == "set": + changed = False + for argument, attribute in ( + ("goal", "goal"), + ("state", "current_state"), + ("issues", "issues"), + ("milestone", "milestone"), + ("active_slice", "active_slice"), + ("non_goals", "non_goals"), + ("next_action", "next_action"), + ): + value = getattr(args, argument) + if value is not None: + setattr(state, attribute, clean_text(value)) + changed = True + if args.active_processes is not None: + state.repository.active_processes = clean_text(args.active_processes, "None recorded.") + changed = True + if args.accept is not None: + state.acceptance = [AcceptanceCriterion(clean_text(value)) for value in args.accept] + changed = True + if args.decision: + state.decisions.extend(clean_text(value) for value in args.decision) + changed = True + if not changed: + raise StateError("state.py set requires at least one field to update") + + elif args.operation == "scope-delta": + classification_key = clean_text(args.classification).lower() + classification = CLASSIFICATIONS.get(classification_key) + if classification is None: + allowed = ", ".join(sorted(key for key in CLASSIFICATIONS if "-" in key)) + raise StateError(f"unknown scope-delta classification; use one of: {allowed}") + state.deltas.append( + ScopeDelta( + title=clean_text(args.title), + source=clean_text(args.source), + classification=classification, + requirement=clean_text(args.requirement), + evidence_valid=clean_text(args.evidence_valid), + invalidated_gates=clean_text(args.invalidated_gates), + tracker_sync=args.tracker_sync, + ) + ) + if classification == "added acceptance criterion": + state.acceptance.append(AcceptanceCriterion(clean_text(args.requirement))) + if args.next_action: + state.next_action = clean_text(args.next_action) + + elif args.operation == "record-file": + relative = normalize_repo_file(root, args.path) + replace_or_append_file(state, relative, args.reason) + + elif args.operation == "record-gate": + replace_or_append_gate( + state, + GateRecord( + gate=clean_text(args.gate), + status=args.status, + digest=clean_text(args.digest), + command=clean_text(args.command), + date=clean_text(args.date or utc_now()), + ), + ) + if args.next_action: + state.next_action = clean_text(args.next_action) + + elif args.operation == "nominate": + if args.dirty_tree: + digest = dirty_tree_digest(root) + candidate_label = f"dirty-tree sha256:{digest} based on {state.repository.head}" + else: + if state.repository.worktree != "clean": + raise StateError( + "candidate nomination requires a clean worktree; use --dirty-tree to nominate an exact dirty-tree digest" + ) + commit = candidate_commit(root, args.commit) + candidate_label = f"commit {commit}" + state.current_state = "Candidate-ready" + state.decisions = [ + item for item in state.decisions if not item.startswith("Candidate nominated:") + ] + state.decisions.append(f"Candidate nominated: {candidate_label} at {utc_now()}.") + state.next_action = clean_text( + args.next_action, + f"Run candidate verification for {candidate_label}.", + ) + else: # pragma: no cover - argparse prevents this + raise StateError(f"unknown operation: {args.operation}") + + write_state(root, workflow, state) + relative = path.resolve(strict=False).relative_to(root.resolve(strict=False)) + print(f"PASS state-{args.operation} — {relative}") + print(f"NEXT {state.next_action}") + return 0 + + +def _git_fixture(root: Path) -> None: + (root / ".codex").mkdir(parents=True) + (root / ".codex/workflow.toml").write_text( + """version = 1 +[session] +state_file = ".codex/session/STATE.md" +max_state_lines = 70 +""", + encoding="utf-8", + ) + (root / ".gitignore").write_text("/.codex/session/\n", encoding="utf-8") + (root / "tracked.txt").write_text("fixture\n", encoding="utf-8") + env = dict(os.environ) + env.update( + { + "GIT_AUTHOR_NAME": "Blacksite self-test", + "GIT_AUTHOR_EMAIL": "self-test@example.invalid", + "GIT_COMMITTER_NAME": "Blacksite self-test", + "GIT_COMMITTER_EMAIL": "self-test@example.invalid", + } + ) + for command in ( + ["git", "init", "--quiet", str(root)], + ["git", "-C", str(root), "add", "."], + ["git", "-C", str(root), "commit", "--quiet", "-m", "fixture"], + ): + subprocess.run(command, check=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + +def self_test() -> int: + with tempfile.TemporaryDirectory(prefix="blacksite-state-self-test-") as temporary: + root = Path(temporary) + _git_fixture(root) + found = find_repository(root / "nested") + if found.resolve() != root.resolve(): + raise AssertionError("repository locator did not find the temporary workflow") + workflow = load_workflow(found) + parser = build_parser() + + operations = [ + [ + "init", + "--goal", + "Exercise resumable state", + "--accept", + "State stays concise", + "--slice", + "Workflow helpers", + "--next", + "Update the fixture state.", + ], + ["set", "--state", "Engineering-complete", "--next", "Record steering."], + [ + "scope-delta", + "--title", + "Self-test steering", + "--source", + "self-test", + "--classification", + "active-slice-refinement", + "--requirement", + "Keep the newest exact action", + "--evidence-valid", + "Earlier fixture setup remains valid", + "--invalidated-gates", + "None", + "--tracker-sync", + "no", + "--next", + "Record the intentional file.", + ], + [ + "record-file", + "scripts/codex/state.py", + "--reason", + "exercise file recording", + ], + [ + "record-gate", + "--gate", + "state-fixture", + "--status", + "PASS", + "--digest", + "digest-fixture", + "--command", + "python state.py --self-test", + "--next", + "Resume the fixture.", + ], + ["resume"], + ["nominate", "--next", "Run the candidate fixture gate."], + ] + for operation in operations: + with contextlib.redirect_stdout(io.StringIO()): + result = perform_operation(root, workflow, parser.parse_args(operation)) + if result != 0: + raise AssertionError(f"state operation failed: {operation[0]}") + + state = read_state(root, workflow) + if state.current_state != "Candidate-ready": + raise AssertionError("nominate did not enter Candidate-ready state") + for index in range(12): + state.gates.append( + GateRecord( + gate=f"gate-{index}", + status="PASS", + digest=f"digest-{index}", + command=f"fixture {index}", + date=utc_now(), + ) + ) + state.next_action = "Nominate the fixture commit." + path = write_state(root, workflow, state) + lines = path.read_text(encoding="utf-8").splitlines() + if len(lines) > max_state_lines(workflow): + raise AssertionError("state exceeded configured line budget") + resumed = read_state(root, workflow) + if resumed.next_action != "Nominate the fixture commit.": + raise AssertionError("state round-trip lost the exact next action") + if resumed.repository.real_path != str(root.resolve()): + raise AssertionError("state did not record the canonical repository path") + commit = candidate_commit(root, "HEAD") + if len(commit) != 40: + raise AssertionError("candidate nomination did not resolve a commit") + tracked = root / "tracked.txt" + tracked.write_text("changed\n", encoding="utf-8") + dirty_digest = dirty_tree_digest(root) + if dirty_digest != dirty_tree_digest(root): + raise AssertionError("dirty candidate digest is not deterministic") + tracked.write_text("changed again\n", encoding="utf-8") + if dirty_digest == dirty_tree_digest(root): + raise AssertionError("dirty candidate digest ignored changed source bytes") + tracked.write_text("fixture\n", encoding="utf-8") + if worktree_summary(root) != "clean": + raise AssertionError("ignored state unexpectedly dirtied the fixture repository") + print("PASS state-self-test — temp repository lifecycle and line budget") + return 0 + + +def main(argv: Sequence[str] | None = None) -> int: + arguments = list(sys.argv[1:] if argv is None else argv) + if arguments in (["--self-test"], ["self-test"]): + try: + return self_test() + except (AssertionError, OSError, StateError, subprocess.SubprocessError) as error: + print(f"FAIL state-self-test — {error}", file=sys.stderr) + return 1 + + parser = build_parser() + args = parser.parse_args(arguments) + try: + root = find_repository() + workflow = load_workflow(root) + return perform_operation(root, workflow, args) + except StateError as error: + print(f"FAIL state-{args.operation} — {error}", file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/codex/summarize_command.py b/scripts/codex/summarize_command.py new file mode 100755 index 0000000..48ff0a2 --- /dev/null +++ b/scripts/codex/summarize_command.py @@ -0,0 +1,469 @@ +#!/usr/bin/env python3 +"""Run one command, retain its complete log, and print only a bounded result.""" + +from __future__ import annotations + +import argparse +import contextlib +import io +import json +import os +import re +import shlex +import subprocess +import sys +import tempfile +import time +import tomllib +from collections import deque +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Iterable, Sequence + + +WORKFLOW_PATH = Path(".codex/workflow.toml") +ANSI_RE = re.compile(r"\x1b\[[0-?]*[ -/]*[@-~]") +ACTIONABLE_PATTERNS = ( + re.compile(r"^\s*error(?:\[[A-Z0-9]+\])?:", re.IGNORECASE), + re.compile(r"^\s*error\b", re.IGNORECASE), + re.compile(r"\bpanicked at\b", re.IGNORECASE), + re.compile(r"^\s*thread .+ panicked", re.IGNORECASE), + re.compile(r"^\s*Traceback \(most recent call last\):"), + re.compile(r"^\s*(?:AssertionError|RuntimeError|ValueError|TypeError):"), + re.compile(r"^\s*failures:\s*$", re.IGNORECASE), + re.compile(r"^\s*test result: FAILED", re.IGNORECASE), + re.compile(r"^\s*FAILED(?:\s|$)", re.IGNORECASE), + re.compile(r"^\s*FAIL(?:\s|$)", re.IGNORECASE), + re.compile(r"^\s*Caused by:\s*\S", re.IGNORECASE), +) +TEST_RESULT_RE = re.compile( + r"test result: ok\.\s*(\d+) passed;\s*(\d+) failed;\s*(\d+) ignored", + re.IGNORECASE, +) +SAFE_NAME_RE = re.compile(r"[^a-zA-Z0-9_.-]+") + + +class SummaryError(RuntimeError): + """The wrapper cannot locate its configuration or output paths.""" + + +def find_repository(start: Path | None = None) -> Path: + override = os.environ.get("BLACKSITE_WORKSPACE_ROOT") + configured = None + config_path = (start or Path.cwd()) / ".codex/config.toml" + if not override and config_path.is_file(): + with config_path.open("rb") as handle: + configured = tomllib.load(handle).get("workspace_root") + candidates = [Path(override or configured)] if (override or configured) else [start or Path.cwd()] + if start is None and not override: + candidates.append(Path(__file__).parent) + visited: set[Path] = set() + for candidate in candidates: + candidate = candidate.expanduser().absolute() + for current in (candidate, *candidate.parents): + canonical = current.resolve(strict=False) + if canonical in visited: + continue + visited.add(canonical) + if (current / WORKFLOW_PATH).is_file(): + return current + searched = ", ".join(str(path) for path in candidates) + raise SummaryError(f"could not locate {WORKFLOW_PATH} from {searched}") + + +def load_workflow(root: Path) -> dict[str, Any]: + path = root / WORKFLOW_PATH + try: + with path.open("rb") as handle: + workflow = tomllib.load(handle) + except OSError as error: + raise SummaryError(f"cannot read workflow configuration {path}: {error}") from error + except tomllib.TOMLDecodeError as error: + raise SummaryError(f"invalid workflow configuration {path}: {error}") from error + if workflow.get("version") != 1: + raise SummaryError(f"unsupported or missing workflow version in {path}") + return workflow + + +def output_settings(workflow: dict[str, Any]) -> tuple[str, int]: + output = workflow.get("output", {}) + if not isinstance(output, dict): + raise SummaryError("[output] must be a TOML table") + log_dir = output.get("log_dir", ".codex/logs") + max_lines = output.get("max_failure_lines", 120) + if not isinstance(log_dir, str) or not log_dir: + raise SummaryError("output.log_dir must be a non-empty path string") + if not isinstance(max_lines, int) or not 1 <= max_lines <= 1000: + raise SummaryError("output.max_failure_lines must be an integer from 1 to 1000") + return log_dir, max_lines + + +def resolve_path(root: Path, raw: str) -> Path: + path = Path(os.path.expandvars(os.path.expanduser(raw))) + if not path.is_absolute(): + path = root / path + return path.absolute() + + +def relative_display(root: Path, path: Path) -> str: + try: + return path.relative_to(root.resolve(strict=False)).as_posix() + except ValueError: + return str(path) + + +def safe_name(value: str) -> str: + cleaned = SAFE_NAME_RE.sub("-", value.strip()).strip("-._") + return cleaned[:80] or "command" + + +def default_log_path(root: Path, log_dir: str, gate: str) -> Path: + timestamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S.%fZ") + return resolve_path(root, str(Path(log_dir) / f"{timestamp}-{safe_name(gate)}.log")) + + +def strip_ansi(value: str) -> str: + return ANSI_RE.sub("", value).rstrip("\r\n") + + +def duration_text(seconds: float) -> str: + if seconds < 10: + return f"{seconds:.2f}s" + if seconds < 60: + return f"{seconds:.1f}s" + minutes, remainder = divmod(seconds, 60) + return f"{int(minutes)}m {remainder:.0f}s" + + +def is_actionable(line: str) -> bool: + plain = strip_ansi(line) + return any(pattern.search(plain) for pattern in ACTIONABLE_PATTERNS) + + +def failure_excerpt(path: Path, limit: int) -> tuple[list[str], str | None]: + """Return bounded context around the first actionable failure. + + The log is streamed rather than loaded wholesale, keeping the wrapper useful + for very large compiler output. + """ + + before_count = min(12, max(0, limit // 4)) + before: deque[str] = deque(maxlen=before_count) + excerpt: list[str] = [] + first_actionable: str | None = None + matched = False + + with path.open("r", encoding="utf-8", errors="replace") as handle: + for raw_line in handle: + line = strip_ansi(raw_line) + if not matched: + if is_actionable(line): + matched = True + first_actionable = line.strip() or None + excerpt.extend(before) + excerpt.append(line) + else: + before.append(line) + elif len(excerpt) < limit: + excerpt.append(line) + else: + break + + if not matched: + # With no recognizable error, the command's tail is normally the most + # useful bounded evidence (signal termination, tool-specific errors). + tail: deque[str] = deque(maxlen=limit) + with path.open("r", encoding="utf-8", errors="replace") as handle: + for raw_line in handle: + tail.append(strip_ansi(raw_line)) + excerpt = list(tail) + first_actionable = next((line.strip() for line in excerpt if line.strip()), None) + + while excerpt and not excerpt[0].strip(): + excerpt.pop(0) + while excerpt and not excerpt[-1].strip(): + excerpt.pop() + return excerpt[:limit], first_actionable + + +def success_summary(path: Path) -> str: + last_nonempty = "" + test_result: tuple[str, str, str] | None = None + explicit_pass = "" + with path.open("r", encoding="utf-8", errors="replace") as handle: + for raw_line in handle: + line = strip_ansi(raw_line).strip() + if not line: + continue + last_nonempty = line + match = TEST_RESULT_RE.search(line) + if match: + test_result = match.groups() + if line.startswith("PASS "): + explicit_pass = line + if test_result is not None: + passed, failed, ignored = test_result + return f"{passed} passed, {failed} failed, {ignored} ignored" + if explicit_pass: + return explicit_pass[:240] + if last_nonempty.startswith("Finished "): + return last_nonempty[:240] + return "exit 0" + + +def write_result(path: Path, result: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + temporary: Path | None = None + try: + with tempfile.NamedTemporaryFile( + "w", + encoding="utf-8", + dir=path.parent, + prefix=f".{path.name}.", + suffix=".tmp", + delete=False, + ) as handle: + json.dump(result, handle, indent=2, sort_keys=True) + handle.write("\n") + handle.flush() + os.fsync(handle.fileno()) + temporary = Path(handle.name) + os.replace(temporary, path) + finally: + if temporary is not None and temporary.exists(): + temporary.unlink() + + +def normalized_exit_code(returncode: int) -> int: + return 128 + abs(returncode) if returncode < 0 else returncode + + +def execute( + *, + root: Path, + workflow: dict[str, Any], + gate: str, + command: Sequence[str], + log: Path | None = None, + json_result: Path | None = None, + cwd: Path | None = None, +) -> int: + if not command: + raise SummaryError("a command is required after --") + configured_log_dir, max_lines = output_settings(workflow) + log_path = log or default_log_path(root, configured_log_dir, gate) + result_path = json_result or log_path.with_suffix(log_path.suffix + ".json") + if result_path == log_path: + raise SummaryError("the JSON result path must differ from the full log path") + command_cwd = cwd or Path.cwd() + if not command_cwd.is_dir(): + raise SummaryError(f"command working directory does not exist: {command_cwd}") + log_path.parent.mkdir(parents=True, exist_ok=True) + + started_wall = datetime.now(timezone.utc) + started = time.monotonic() + returncode = 127 + launch_error: str | None = None + interrupted = False + with log_path.open("wb") as log_handle: + try: + process = subprocess.Popen( + list(command), + cwd=command_cwd, + stdout=log_handle, + stderr=subprocess.STDOUT, + shell=False, + ) + except OSError as error: + launch_error = f"error: unable to execute {command[0]!r}: {error}" + log_handle.write((launch_error + "\n").encode("utf-8", errors="replace")) + else: + try: + returncode = normalized_exit_code(process.wait()) + except KeyboardInterrupt: + interrupted = True + process.terminate() + try: + process.wait(timeout=5) + except subprocess.TimeoutExpired: + process.kill() + process.wait() + returncode = 130 + log_handle.write(b"\nerror: command interrupted by user\n") + + duration = time.monotonic() - started + status = "PASS" if returncode == 0 else "FAIL" + summary = success_summary(log_path) if returncode == 0 else "command failed" + excerpt: list[str] = [] + actionable: str | None = launch_error + if returncode != 0: + excerpt, detected = failure_excerpt(log_path, max_lines) + actionable = actionable or detected + + result = { + "schema_version": 1, + "gate": gate, + "status": status, + "exit_code": returncode, + "duration_seconds": round(duration, 6), + "log": relative_display(root, log_path), + "result": relative_display(root, result_path), + "command": list(command), + "command_display": shlex.join(command), + "cwd": str(command_cwd.resolve(strict=False)), + "started_at": started_wall.isoformat(timespec="seconds"), + "finished_at": datetime.now(timezone.utc).isoformat(timespec="seconds"), + "summary": summary, + "first_actionable_failure": actionable, + "interrupted": interrupted, + } + write_result(result_path, result) + + if returncode == 0: + print(f"PASS {gate} — {duration_text(duration)} — {summary}") + else: + print(f"FAIL {gate} — {duration_text(duration)}") + for line in excerpt: + print(line) + print(f"Full log: {relative_display(root, log_path)}") + return returncode + + +def parse_arguments(argv: Sequence[str]) -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--gate", required=True, help="short verification gate name") + parser.add_argument("--json-result", help="machine-readable result path") + parser.add_argument("--log", help="complete combined-output log path") + parser.add_argument("--cwd", help="command working directory; defaults to the invocation directory") + parser.add_argument("command", nargs=argparse.REMAINDER) + args = parser.parse_args(argv) + if args.command and args.command[0] == "--": + args.command = args.command[1:] + if not args.command: + parser.error("a command is required after --") + return args + + +def self_test() -> int: + with tempfile.TemporaryDirectory(prefix="blacksite-summary-self-test-") as temporary: + root = Path(temporary) + (root / ".codex").mkdir() + (root / ".codex/workflow.toml").write_text( + """version = 1 +[output] +log_dir = ".codex/logs" +max_failure_lines = 4 +""", + encoding="utf-8", + ) + nested = root / "nested" + nested.mkdir() + found = find_repository(nested) + workflow = load_workflow(found) + parsed = parse_arguments( + [ + "--gate", + "parser-fixture", + "--json-result", + ".codex/logs/parser.json", + "--", + sys.executable, + "--version", + ] + ) + if parsed.command != [sys.executable, "--version"]: + raise AssertionError("command arguments after -- were not preserved") + + success_log = root / ".codex/logs/success.log" + success_json = root / ".codex/logs/success.json" + captured = io.StringIO() + with contextlib.redirect_stdout(captured): + success = execute( + root=root, + workflow=workflow, + gate="self-test-pass", + command=[ + sys.executable, + "-c", + "print('test result: ok. 3 passed; 0 failed; 1 ignored')", + ], + log=success_log, + json_result=success_json, + cwd=root, + ) + if success != 0: + raise AssertionError("successful fixture returned a failure") + if not captured.getvalue().startswith("PASS self-test-pass"): + raise AssertionError("successful fixture did not emit a compact PASS summary") + success_data = json.loads(success_json.read_text(encoding="utf-8")) + for key in ("status", "exit_code", "duration_seconds", "log"): + if key not in success_data: + raise AssertionError(f"result JSON omitted required key {key}") + if success_data["status"] != "PASS" or success_data["exit_code"] != 0: + raise AssertionError("successful result JSON is incorrect") + + failure_log = root / ".codex/logs/failure.log" + failure_json = root / ".codex/logs/failure.json" + captured = io.StringIO() + with contextlib.redirect_stdout(captured): + failure = execute( + root=root, + workflow=workflow, + gate="self-test-fail", + command=[ + sys.executable, + "-c", + "print('noise'); print('error[E0001]: actionable'); print('detail'); raise SystemExit(7)", + ], + log=failure_log, + json_result=failure_json, + cwd=root, + ) + if failure != 7: + raise AssertionError("failing fixture did not preserve exit code 7") + visible_lines = captured.getvalue().splitlines() + if not visible_lines or not visible_lines[0].startswith("FAIL self-test-fail"): + raise AssertionError("failing fixture did not emit a compact FAIL summary") + if len(visible_lines[1:-1]) > 4: + raise AssertionError("failure excerpt exceeded output.max_failure_lines") + failure_data = json.loads(failure_json.read_text(encoding="utf-8")) + if failure_data["status"] != "FAIL" or failure_data["exit_code"] != 7: + raise AssertionError("failure result JSON is incorrect") + if "error[E0001]" not in failure_log.read_text(encoding="utf-8"): + raise AssertionError("full failure output was not captured") + print("PASS summarize-command-self-test — logs, bounded failure, JSON, exit preservation") + return 0 + + +def main(argv: Sequence[str] | None = None) -> int: + arguments = list(sys.argv[1:] if argv is None else argv) + if arguments in (["--self-test"], ["self-test"]): + try: + return self_test() + except (AssertionError, OSError, SummaryError, subprocess.SubprocessError, json.JSONDecodeError) as error: + print(f"FAIL summarize-command-self-test — {error}", file=sys.stderr) + return 1 + + try: + args = parse_arguments(arguments) + root = find_repository() + workflow = load_workflow(root) + log = resolve_path(root, args.log) if args.log else None + result = resolve_path(root, args.json_result) if args.json_result else None + cwd = resolve_path(root, args.cwd) if args.cwd else Path.cwd() + return execute( + root=root, + workflow=workflow, + gate=args.gate, + command=args.command, + log=log, + json_result=result, + cwd=cwd, + ) + except (OSError, SummaryError) as error: + print(f"FAIL summarize-command — {error}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/codex/verify.py b/scripts/codex/verify.py new file mode 100755 index 0000000..efa85db --- /dev/null +++ b/scripts/codex/verify.py @@ -0,0 +1,1167 @@ +#!/usr/bin/env python3 +"""Select and run the smallest valid Blacksite verification gates.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import subprocess +import sys +import tempfile +import time +from dataclasses import asdict, dataclass +from datetime import datetime, timezone +from pathlib import Path +from typing import Any, Iterable, Sequence + +try: + import tomllib +except ModuleNotFoundError as error: # pragma: no cover + raise SystemExit("verify.py requires Python 3.11 or newer") from error + + +@dataclass(frozen=True) +class Gate: + name: str + command: tuple[str, ...] + reason: str + lane: str | None = None + compile_gate: bool = False + native_required: bool = False + + +@dataclass(frozen=True) +class LocalPackage: + name: str + root: str + dependencies: frozenset[str] + + +DIGEST_SCHEMA_VERSION = 2 +RUST_GATE_CONFIG_INPUTS = ( + "Cargo.toml", + "Cargo.lock", + ".cargo/config.toml", + ".codex/workflow.toml", + "rust-toolchain", + "rust-toolchain.toml", + ".rustfmt.toml", + "rustfmt.toml", + "clippy.toml", + "scripts/codex/cargo_lane.py", +) +RUST_GATE_ENVIRONMENT = ( + "CARGO_BUILD_RUSTC_WRAPPER", + "CARGO_BUILD_TARGET", + "CARGO_ENCODED_RUSTFLAGS", + "CARGO_HOME", + "CC", + "CFLAGS", + "CXX", + "CXXFLAGS", + "HOST", + "LD", + "RUSTC", + "RUSTC_WRAPPER", + "RUSTDOCFLAGS", + "RUSTFLAGS", + "RUSTUP_TOOLCHAIN", + "TARGET", +) +IGNORED_SCOPE_DIRECTORIES = { + ".git", + ".import-cache", + ".codex", + "node_modules", + "target", +} + + +def utc_now() -> str: + return datetime.now(timezone.utc).isoformat(timespec="seconds") + + +def repository_root() -> Path: + override = os.environ.get("BLACKSITE_WORKSPACE_ROOT") + configured = None + config_path = Path.cwd() / ".codex/config.toml" + if not override and config_path.is_file(): + with config_path.open("rb") as handle: + configured = tomllib.load(handle).get("workspace_root") + candidate = Path(override or configured).expanduser() if (override or configured) else Path(__file__).parents[2] + candidate = candidate.absolute() + for current in (candidate, *candidate.parents): + if (current / "Cargo.toml").is_file() and (current / ".git").exists(): + return current + raise SystemExit(f"could not locate Blacksite repository from {candidate}") + + +def load_workflow(root: Path) -> dict[str, Any]: + path = root / ".codex" / "workflow.toml" + if not path.is_file(): + raise SystemExit(f"missing workflow configuration: {path}") + with path.open("rb") as handle: + document = tomllib.load(handle) + if document.get("version") != 1: + raise SystemExit(f"unsupported workflow version in {path}") + return document + + +def run_text(root: Path, command: Sequence[str]) -> str: + completed = subprocess.run( + command, + cwd=root, + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + if completed.returncode: + raise SystemExit( + f"command failed ({completed.returncode}): {' '.join(command)}\n" + + completed.stdout[-4000:] + ) + return completed.stdout + + +def changed_paths(root: Path) -> list[str]: + output = subprocess.run( + ["git", "status", "--porcelain=v1", "-z", "--untracked-files=all"], + cwd=root, + check=True, + stdout=subprocess.PIPE, + ).stdout + fields = output.split(b"\0") + paths: list[str] = [] + index = 0 + while index < len(fields): + field = fields[index] + index += 1 + if not field: + continue + text = field.decode("utf-8", "surrogateescape") + status = text[:2] + path = text[3:] + if status[:1] in {"R", "C"} and index < len(fields): + target = fields[index].decode("utf-8", "surrogateescape") + index += 1 + paths.extend((path, target)) + else: + paths.append(path) + return sorted(set(paths)) + + +def normalize_paths(values: Iterable[str]) -> list[str]: + return sorted({value.replace("\\", "/").removeprefix("./") for value in values}) + + +def classify(paths: Sequence[str]) -> set[str]: + areas: set[str] = set() + for path in paths: + if ( + path == "AGENTS.md" + or path.endswith("/AGENTS.md") + or path.startswith((".agents/", ".codex/", "scripts/codex/", ".cursor/rules/")) + or path in {".gitignore", ".cargo/config.toml"} + ): + areas.add("workflow") + if path == "README.md" or path.endswith(".md") or path.startswith("docs/"): + areas.add("docs") + if path.startswith("crates/content_pipeline/"): + areas.add("content_pipeline") + if path.startswith("crates/shared/"): + areas.add("shared") + if path.startswith("crates/editor/"): + areas.add("editor") + if path.startswith("crates/editor/src/ui/"): + areas.add("editor_ui") + if path.startswith("crates/blacksite_surface/") or path.endswith((".wgsl", ".shader.ron")): + areas.add("surface") + if path.startswith("xtask/"): + areas.add("xtask") + if path.startswith("crates/scene/"): + areas.update(("scene", "migration")) + if path.startswith("crates/settings/"): + areas.add("settings") + if path.startswith("crates/game/"): + areas.add("game") + if path.startswith("assets/"): + areas.add("assets") + if any(token in path for token in ("migrat", "upgrade", "schema")) and not path.endswith(".md"): + areas.add("migration") + if path.endswith(".rs") or path in {"Cargo.toml", "Cargo.lock", ".cargo/config.toml"}: + areas.add("rust") + return areas + + +def cargo_gate(name: str, lane: str, reason: str, *cargo_args: str) -> Gate: + return Gate( + name=name, + command=("cargo", *cargo_args), + lane=lane, + reason=reason, + compile_gate=any( + item in cargo_args + for item in ("check", "test", "clippy", "build", "run") + ), + ) + + +def command_gate(name: str, reason: str, *command: str) -> Gate: + return Gate(name=name, command=tuple(command), reason=reason) + + +def add_unique(gates: list[Gate], gate: Gate) -> None: + if not any(existing.name == gate.name for existing in gates): + gates.append(gate) + + +def select_gates(tier: str, areas: set[str], root: Path) -> tuple[list[Gate], list[str]]: + gates: list[Gate] = [] + skipped: list[str] = [] + python = sys.executable + + if not areas: + return [], ["No changed inputs; all gates skipped."] + + if "workflow" in areas: + for script in ( + "state.py", + "summarize_command.py", + "cargo_lane.py", + "build_storage.py", + "architecture_audit.py", + ): + if (root / "scripts" / "codex" / script).is_file(): + add_unique( + gates, + command_gate( + f"workflow-{script.removesuffix('.py')}", + "Workflow implementation changed.", + python, + f"scripts/codex/{script}", + "self-test", + ), + ) + add_unique( + gates, + command_gate( + "workflow-verify-plan", + "Verification selection must remain deterministic.", + python, + "scripts/codex/verify.py", + "plan", + "--paths", + "docs/README.md", + ), + ) + + if "docs" in areas or "workflow" in areas: + add_unique( + gates, + command_gate( + "docs-audit-changed", + "Documentation or workflow authority changed.", + python, + "scripts/codex/docs_audit.py", + "--changed", + ), + ) + + rust_areas = areas.intersection( + {"content_pipeline", "shared", "editor", "surface", "xtask", "scene", "settings", "game"} + ) + if rust_areas or "workflow" in areas: + add_unique( + gates, + command_gate( + "architecture-audit", + "Production architecture inputs changed.", + python, + "scripts/codex/architecture_audit.py", + "check", + ), + ) + if rust_areas: + add_unique( + gates, + cargo_gate("rustfmt", "dev", "Rust source changed.", "fmt", "--all", "--", "--check"), + ) + + package_specs = { + "content_pipeline": ("content_pipeline", "lib"), + "shared": ("shared", "lib"), + "editor": ("editor", "lib"), + "surface": ("blacksite_surface", "lib"), + "scene": ("scene", "lib"), + "settings": ("settings", "lib"), + "game": ("game", "lib"), + "xtask": ("xtask", "bins"), + } + for area, (package, target_kind) in package_specs.items(): + if area not in areas: + continue + target_flag = "--bins" if target_kind == "bins" else "--lib" + add_unique( + gates, + cargo_gate( + f"check-{package}", + "dev", + f"{area} owns changed Rust inputs.", + "check", + "-p", + package, + target_flag, + ), + ) + if area not in {"editor", "xtask"}: + add_unique( + gates, + cargo_gate( + f"test-{package}", + "dev", + f"Focused {area} invariants are lightweight enough for this tier.", + "test", + "-p", + package, + target_flag, + ), + ) + elif tier == "fast": + skipped.append(f"Skipped heavy {package} test binary in the fast loop.") + + if tier == "slice": + for area, (package, target_kind) in package_specs.items(): + if area not in areas: + continue + target_flag = "--bins" if target_kind == "bins" else "--lib" + add_unique( + gates, + cargo_gate( + f"clippy-{package}", + "dev", + f"Stable {area} slice requires strict affected-package lint.", + "clippy", + "-p", + package, + target_flag, + "--", + "-D", + "warnings", + ), + ) + if "editor_ui" in areas: + gates.append( + Gate( + name="native-editor-ui", + command=("bash", "scripts/codex/native_qa.sh", "plan", "material-slot-live-edit"), + reason="Editor UI changed; native interaction is a slice requirement.", + native_required=True, + ) + ) + if "assets" in areas or "content_pipeline" in areas: + add_unique( + gates, + cargo_gate( + "process-assets-check", + "package", + "Asset processing behavior changed.", + "process-assets", + "--project", + ".", + "--check", + ), + ) + if "migration" in areas: + skipped.append("Migration dry-run is required at slice review and needs an explicit fixture/project.") + + if tier == "candidate": + gates = [ + command_gate( + "candidate-architecture", + "Candidate modules must satisfy the architecture debt ratchet.", + python, + "scripts/codex/architecture_audit.py", + "check", + ), + cargo_gate( + "candidate-tests", + "candidate", + "Nominated candidate requires full all-feature tests once.", + "test", + "--workspace", + "--all-features", + ), + cargo_gate( + "candidate-clippy", + "candidate", + "Nominated candidate requires distinct strict lint evidence.", + "clippy", + "--workspace", + "--all-features", + "--all-targets", + "--", + "-D", + "warnings", + ), + cargo_gate( + "candidate-process-assets", + "package", + "Candidate content catalog must validate deterministically.", + "process-assets", + "--project", + ".", + "--check", + ), + cargo_gate( + "candidate-levels", + "package", + "Candidate levels require headless validation.", + "validate-levels", + ), + cargo_gate( + "candidate-samples", + "package", + "Candidate samples require headless validation.", + "validate-samples", + ), + cargo_gate( + "candidate-package", + "package", + "Candidate package output must be generated and validated.", + "package-project", + "--project", + ".", + "--profile", + "qa", + ), + command_gate( + "candidate-docs", + "Candidate documentation authority must be coherent.", + python, + "scripts/codex/docs_audit.py", + ), + ] + skipped.append("No redundant workspace check precedes candidate workspace tests.") + + return gates, skipped + + +def state_is_candidate_ready(root: Path, workflow: dict[str, Any]) -> bool: + state_path = root / workflow["session"]["state_file"] + if not state_path.is_file(): + return False + return "Current state: Candidate-ready" in state_path.read_text(encoding="utf-8") + + +def ledger_path(root: Path, workflow: dict[str, Any]) -> Path: + return root / workflow["session"]["verification_file"] + + +def read_ledger(path: Path) -> dict[str, Any]: + if not path.is_file(): + return {"version": 1, "gates": {}, "invalidations": []} + try: + document = json.loads(path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError): + return {"version": 1, "gates": {}, "invalidations": []} + return document if isinstance(document, dict) else {"version": 1, "gates": {}} + + +def atomic_json(path: Path, document: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + descriptor, temporary = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent) + try: + with os.fdopen(descriptor, "w", encoding="utf-8") as handle: + json.dump(document, handle, indent=2, sort_keys=True) + handle.write("\n") + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, path) + finally: + try: + os.unlink(temporary) + except FileNotFoundError: + pass + + +def _dependency_tables(document: dict[str, Any]) -> Iterable[dict[str, Any]]: + for key in ("dependencies", "dev-dependencies", "build-dependencies"): + table = document.get(key) + if isinstance(table, dict): + yield table + targets = document.get("target") + if isinstance(targets, dict): + for target in targets.values(): + if not isinstance(target, dict): + continue + for key in ("dependencies", "dev-dependencies", "build-dependencies"): + table = target.get(key) + if isinstance(table, dict): + yield table + + +def workspace_packages(root: Path) -> dict[str, LocalPackage]: + workspace_manifest = root / "Cargo.toml" + if not workspace_manifest.is_file(): + return {} + try: + with workspace_manifest.open("rb") as handle: + workspace = tomllib.load(handle) + except (OSError, tomllib.TOMLDecodeError): + return {} + + members = workspace.get("workspace", {}).get("members", []) + package_documents: list[tuple[str, str, dict[str, Any]]] = [] + for member in members if isinstance(members, list) else []: + if not isinstance(member, str): + continue + for candidate in sorted(root.glob(member)): + manifest = candidate / "Cargo.toml" if candidate.is_dir() else candidate + if not manifest.is_file(): + continue + try: + with manifest.open("rb") as handle: + document = tomllib.load(handle) + except (OSError, tomllib.TOMLDecodeError): + continue + package = document.get("package") + if not isinstance(package, dict) or not isinstance(package.get("name"), str): + continue + package_documents.append( + ( + package["name"], + manifest.parent.relative_to(root).as_posix(), + document, + ) + ) + + local_names = {name for name, _, _ in package_documents} + packages: dict[str, LocalPackage] = {} + for name, relative_root, document in package_documents: + dependencies: set[str] = set() + for table in _dependency_tables(document): + for dependency_name, specification in table.items(): + resolved_name = dependency_name + if isinstance(specification, dict) and isinstance(specification.get("package"), str): + resolved_name = specification["package"] + if resolved_name in local_names: + dependencies.add(resolved_name) + packages[name] = LocalPackage(name, relative_root, frozenset(dependencies)) + return packages + + +def local_dependency_closure(packages: dict[str, LocalPackage], names: Iterable[str]) -> set[str]: + closure: set[str] = set() + pending = list(names) + while pending: + name = pending.pop() + if name in closure or name not in packages: + continue + closure.add(name) + pending.extend(packages[name].dependencies) + return closure + + +def cargo_scope(root: Path, gate: Gate) -> tuple[set[str], set[str], bool]: + """Return local package names, extra roots, and whether only Rust source matters.""" + + packages = workspace_packages(root) + arguments = list(gate.command[1:]) if gate.command[:1] == ("cargo",) else list(gate.command) + package_name: str | None = None + for index, argument in enumerate(arguments): + if argument in {"-p", "--package"} and index + 1 < len(arguments): + package_name = arguments[index + 1] + break + if argument.startswith("--package="): + package_name = argument.partition("=")[2] + break + + subcommand = arguments[0] if arguments else "" + rust_only = subcommand == "fmt" + if package_name is not None: + selected = local_dependency_closure(packages, (package_name,)) + elif subcommand in {"process-assets", "validate-levels", "validate-samples", "package-project"}: + selected = local_dependency_closure(packages, ("xtask",)) + else: + selected = set(packages) + + extra_roots: set[str] = set() + if subcommand in {"process-assets", "validate-levels", "validate-samples", "package-project"}: + extra_roots.add("assets") + return selected, extra_roots, rust_only + + +def _under_scope(relative: str, roots: Iterable[str]) -> bool: + return any( + root in {"", "."} or relative == root or relative.startswith(f"{root}/") + for root in roots + ) + + +def _is_documentation(relative: str) -> bool: + path = relative.lower() + return path == "readme.md" or path == "agents.md" or path.endswith(".md") or path.startswith("docs/") + + +def _walk_files(root: Path, roots: Iterable[str]) -> set[str]: + found: set[str] = set() + for relative_root in roots: + start = root if relative_root in {"", "."} else root / relative_root + if start.is_file(): + found.add(start.relative_to(root).as_posix()) + continue + if not start.is_dir(): + continue + for directory, directory_names, file_names in os.walk(start): + directory_names[:] = [ + name for name in directory_names if name not in IGNORED_SCOPE_DIRECTORIES + ] + base = Path(directory) + for file_name in file_names: + found.add((base / file_name).relative_to(root).as_posix()) + return found + + +def _tracked_scope_files(root: Path, roots: Iterable[str]) -> set[str]: + normalized_roots = sorted(set(roots)) + if not normalized_roots: + return set() + if (root / ".git").exists(): + completed = subprocess.run( + ["git", "ls-files", "-z", "--", *normalized_roots], + cwd=root, + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + ) + if completed.returncode == 0: + return { + item.decode("utf-8", "surrogateescape") + for item in completed.stdout.split(b"\0") + if item + } + return _walk_files(root, normalized_roots) + + +def gate_static_inputs(root: Path, gate: Gate) -> set[str]: + inputs: set[str] = set() + if gate.lane is not None: + inputs.update(RUST_GATE_CONFIG_INPUTS) + packages = workspace_packages(root) + selected, _, _ = cargo_scope(root, gate) + inputs.update(f"{packages[name].root}/Cargo.toml" for name in selected if name in packages) + return inputs + + for argument in gate.command: + normalized = argument.replace("\\", "/").removeprefix("./") + if ( + normalized + and not normalized.startswith("-") + and not Path(normalized).is_absolute() + and (root / normalized).is_file() + ): + inputs.add(normalized) + if gate.name.startswith("workflow-"): + inputs.add(".codex/workflow.toml") + if gate.name.startswith("docs-") or gate.name == "candidate-docs": + inputs.add("docs/authority.toml") + if gate.native_required and gate.command: + scenario = gate.command[-1] + inputs.add( + f".agents/skills/blacksite-native-qa/references/scenarios/{scenario}.yaml" + ) + return inputs + + +def gate_input_paths(root: Path, gate: Gate, changed: Sequence[str]) -> list[str]: + inputs = gate_static_inputs(root, gate) + normalized_changes = normalize_paths(changed) + + if gate.lane is not None: + packages = workspace_packages(root) + selected, extra_roots, rust_only = cargo_scope(root, gate) + roots = {packages[name].root for name in selected if name in packages} | extra_roots + scoped = _tracked_scope_files(root, roots) + + def relevant(relative: str) -> bool: + if relative in inputs: + return True + if not _under_scope(relative, roots) or _is_documentation(relative): + return False + return relative.endswith(".rs") if rust_only else True + + inputs.update(relative for relative in scoped if relevant(relative)) + # Add relevant untracked and deleted paths supplied by Git status or --paths. + inputs.update(relative for relative in normalized_changes if relevant(relative)) + elif gate.name == "candidate-docs": + inputs.update( + relative + for relative in _tracked_scope_files(root, ("docs",)) + if _is_documentation(relative) + ) + inputs.update(relative for relative in normalized_changes if _is_documentation(relative)) + elif gate.name.startswith("docs-"): + inputs.update(relative for relative in normalized_changes if _is_documentation(relative)) + elif gate.name.startswith("workflow-"): + inputs.update( + relative + for relative in normalized_changes + if relative in inputs or relative == ".codex/workflow.toml" + ) + elif gate.native_required: + inputs.update( + relative + for relative in normalized_changes + if "editor_ui" in classify((relative,)) + ) + else: + inputs.update(normalized_changes) + return sorted(inputs) + + +def _version_output(root: Path, command: Sequence[str]) -> str: + completed = subprocess.run( + command, + cwd=root, + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + ) + if completed.returncode: + return f"unavailable(exit={completed.returncode})" + return completed.stdout.strip() + + +def gate_tool_versions(root: Path, gate: Gate) -> dict[str, str]: + if gate.lane is not None: + versions = { + "cargo": _version_output(root, ("cargo", "--version", "--verbose")), + "rustc": _version_output(root, ("rustc", "--version", "--verbose")), + } + if gate.command[1:2] == ("fmt",): + versions["rustfmt"] = _version_output(root, ("rustfmt", "--version")) + if gate.command[1:2] == ("clippy",): + versions["clippy-driver"] = _version_output(root, ("clippy-driver", "--version")) + return versions + executable = Path(gate.command[0]).name if gate.command else "" + if executable.startswith("python") or any(argument.endswith(".py") for argument in gate.command): + return {"python": f"{sys.executable}\n{sys.version}"} + if executable == "bash": + return {"bash": _version_output(root, ("bash", "--version")).splitlines()[0]} + return {"executable": executable} + + +def gate_environment(gate: Gate) -> dict[str, str | None]: + if gate.lane is None: + return {} + return {name: os.environ.get(name) for name in RUST_GATE_ENVIRONMENT} + + +def gate_digest_details( + root: Path, + gate: Gate, + paths: Sequence[str], + *, + tool_versions: dict[str, str] | None = None, + environment: dict[str, str | None] | None = None, +) -> tuple[str, list[str], dict[str, str], dict[str, str | None]]: + inputs = gate_input_paths(root, gate, paths) + versions = tool_versions if tool_versions is not None else gate_tool_versions(root, gate) + environment_values = environment if environment is not None else gate_environment(gate) + digest = hashlib.sha256() + digest.update( + json.dumps( + { + "schema": DIGEST_SCHEMA_VERSION, + "gate": asdict(gate), + "tool_versions": versions, + "environment": environment_values, + }, + sort_keys=True, + separators=(",", ":"), + ).encode() + ) + for relative in inputs: + digest.update(b"\0path\0") + digest.update(relative.encode("utf-8", "surrogateescape")) + candidate = root / relative + if not candidate.is_file(): + digest.update(b"\0missing") + continue + digest.update(b"\0file\0") + digest.update(candidate.read_bytes()) + return digest.hexdigest(), inputs, versions, environment_values + + +def gate_digest( + root: Path, + gate: Gate, + paths: Sequence[str], + *, + tool_versions: dict[str, str] | None = None, + environment: dict[str, str | None] | None = None, +) -> str: + return gate_digest_details( + root, + gate, + paths, + tool_versions=tool_versions, + environment=environment, + )[0] + + +def gate_command(root: Path, gate: Gate) -> list[str]: + if gate.lane is None: + return list(gate.command) + return [ + sys.executable, + "scripts/codex/cargo_lane.py", + "exec", + gate.lane, + "--", + *gate.command, + ] + + +def run_storage(root: Path, phase: str) -> int: + script = root / "scripts" / "codex" / "build_storage.py" + if not script.is_file(): + return 0 + return subprocess.run( + [sys.executable, str(script), "enforce", "--phase", phase], cwd=root + ).returncode + + +def execute_gate( + root: Path, + workflow: dict[str, Any], + gate: Gate, + digest: str, +) -> dict[str, Any]: + log_dir = root / workflow["output"]["log_dir"] + log_dir.mkdir(parents=True, exist_ok=True) + result_path = log_dir / f"{gate.name}-{digest[:12]}.json" + log_path = log_dir / f"{gate.name}-{digest[:12]}.log" + command = gate_command(root, gate) + if gate.native_required: + return { + "status": "NOT_RUN", + "exit_code": 0, + "duration_seconds": 0.0, + "log": None, + "note": "Native QA remains user-controlled until explicitly delegated.", + } + if gate.compile_gate and run_storage(root, "pre") != 0: + return { + "status": "BLOCKED", + "exit_code": 2, + "duration_seconds": 0.0, + "log": None, + "note": "Build-storage preflight blocked this compile gate.", + } + summarizer = [ + sys.executable, + "scripts/codex/summarize_command.py", + "--gate", + gate.name, + "--log", + str(log_path), + "--json-result", + str(result_path), + "--", + *command, + ] + started = time.monotonic() + exit_code = subprocess.run(summarizer, cwd=root).returncode + duration = time.monotonic() - started + if gate.compile_gate: + post = run_storage(root, "post") + if exit_code == 0 and post != 0: + exit_code = post + if result_path.is_file(): + result = json.loads(result_path.read_text(encoding="utf-8")) + else: + result = { + "status": "PASS" if exit_code == 0 else "FAIL", + "exit_code": exit_code, + "duration_seconds": duration, + "log": str(log_path.relative_to(root)), + } + result["exit_code"] = exit_code + return result + + +def print_plan(tier: str, paths: Sequence[str], areas: set[str], gates: Sequence[Gate], skipped: Sequence[str]) -> None: + print(f"Verification tier: {tier}") + print("Changed areas: " + (", ".join(sorted(areas)) if areas else "none")) + for gate in gates: + lane = f" [{gate.lane}]" if gate.lane else "" + print(f"SELECT {gate.name}{lane} — {gate.reason}") + for reason in skipped: + print(f"SKIP — {reason}") + if paths: + print(f"Inputs: {len(paths)} changed path(s)") + + +def diagnose_build(root: Path) -> int: + commands = [ + [sys.executable, "scripts/codex/cargo_lane.py", "env", "dev", "--json"], + [sys.executable, "scripts/codex/build_storage.py", "status", "--json"], + ] + for command in commands: + completed = subprocess.run(command, cwd=root) + if completed.returncode: + return completed.returncode + return 0 + + +def parser() -> argparse.ArgumentParser: + result = argparse.ArgumentParser(description=__doc__) + result.add_argument("action", choices=("plan", "fast", "slice", "candidate", "status", "invalidate", "diagnose-build", "self-test")) + result.add_argument("--paths", nargs="*", help="override Git changes for planning/self-tests") + result.add_argument( + "--tier", + choices=("fast", "slice", "candidate"), + default="fast", + help="tier to preview with `plan` (default: fast)", + ) + result.add_argument("--reason", help="invalidation reason") + return result + + +def self_test(root: Path) -> int: + cases = { + "docs-only": (["docs/editor/material-system.md"], {"docs"}), + "pipeline": (["crates/content_pipeline/src/lib.rs"], {"content_pipeline", "rust"}), + "editor-ui": (["crates/editor/src/ui/inspector.rs"], {"editor", "editor_ui", "rust"}), + } + for name, (paths, expected) in cases.items(): + found = classify(paths) + if not expected.issubset(found): + raise AssertionError(f"{name}: expected {expected}, found {found}") + gates, _ = select_gates("fast", found, root) + names = {gate.name for gate in gates} + if name == "docs-only" and any(gate.lane for gate in gates): + raise AssertionError("docs-only plan selected a Cargo lane") + if name == "pipeline" and "check-content_pipeline" not in names: + raise AssertionError("pipeline plan missed focused check") + if name == "editor-ui" and "check-editor" not in names: + raise AssertionError("editor UI plan missed editor library check") + if any(gate.name.startswith("candidate-") for gate in gates): + raise AssertionError(f"{name}: fast plan selected candidate gate") + + candidate_gates, _ = select_gates("candidate", {"rust"}, root) + candidate_package = next( + gate for gate in candidate_gates if gate.name == "candidate-package" + ) + if candidate_package.command[-2:] != ("--profile", "qa"): + raise AssertionError("candidate package gate must select assets/build_profiles/qa.ron") + + with tempfile.TemporaryDirectory(prefix="blacksite-verify-digest-") as temporary: + fixture = Path(temporary) + + def write(relative: str, content: str) -> None: + path = fixture / relative + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(content, encoding="utf-8") + + write( + "Cargo.toml", + '[workspace]\nmembers = ["crates/content_pipeline", "crates/shared", "crates/editor"]\n', + ) + write("Cargo.lock", "version = 4\n") + write(".cargo/config.toml", "[build]\nincremental = true\n") + write(".codex/workflow.toml", "version = 1\n") + write("scripts/codex/cargo_lane.py", "# fixture lane wrapper\n") + write( + "crates/content_pipeline/Cargo.toml", + '[package]\nname = "content_pipeline"\nversion = "0.0.0"\n' + '[dependencies]\nshared = { path = "../shared" }\n', + ) + write("crates/content_pipeline/src/lib.rs", "pub fn pipeline() {}\n") + write("crates/content_pipeline/README.md", "pipeline notes\n") + write( + "crates/shared/Cargo.toml", + '[package]\nname = "shared"\nversion = "0.0.0"\n', + ) + write("crates/shared/src/lib.rs", "pub struct Shared;\n") + write( + "crates/editor/Cargo.toml", + '[package]\nname = "editor"\nversion = "0.0.0"\n', + ) + write("crates/editor/src/lib.rs", "pub fn editor() {}\n") + write("docs/note.md", "first docs revision\n") + + pipeline_gate = cargo_gate( + "check-content_pipeline", + "dev", + "digest fixture", + "check", + "-p", + "content_pipeline", + "--lib", + ) + fake_tools = {"cargo": "cargo fixture", "rustc": "rustc fixture"} + empty_environment: dict[str, str | None] = {} + changed = ["crates/content_pipeline/src/lib.rs"] + baseline, scoped_inputs, _, _ = gate_digest_details( + fixture, + pipeline_gate, + changed, + tool_versions=fake_tools, + environment=empty_environment, + ) + if "crates/shared/src/lib.rs" not in scoped_inputs: + raise AssertionError("package digest omitted a local dependency input") + if "docs/note.md" in scoped_inputs or "crates/content_pipeline/README.md" in scoped_inputs: + raise AssertionError("package digest included documentation") + if "crates/editor/src/lib.rs" in scoped_inputs: + raise AssertionError("package digest included an unrelated package") + + write("docs/note.md", "second docs revision\n") + write("crates/content_pipeline/README.md", "updated pipeline notes\n") + docs_changed = gate_digest( + fixture, + pipeline_gate, + [*changed, "docs/note.md", "crates/content_pipeline/README.md"], + tool_versions=fake_tools, + environment=empty_environment, + ) + if docs_changed != baseline: + raise AssertionError("unrelated documentation invalidated Rust evidence") + + write("crates/editor/src/lib.rs", "pub fn unrelated_editor_change() {}\n") + unrelated_package_changed = gate_digest( + fixture, + pipeline_gate, + [*changed, "crates/editor/src/lib.rs"], + tool_versions=fake_tools, + environment=empty_environment, + ) + if unrelated_package_changed != baseline: + raise AssertionError("unrelated package input invalidated a focused Rust gate") + + write("crates/shared/src/lib.rs", "pub struct ChangedShared;\n") + dependency_changed = gate_digest( + fixture, + pipeline_gate, + [*changed, "crates/shared/src/lib.rs"], + tool_versions=fake_tools, + environment=empty_environment, + ) + if dependency_changed == baseline: + raise AssertionError("local dependency change did not invalidate Rust evidence") + + write("crates/shared/src/lib.rs", "pub struct Shared;\n") + write(".cargo/config.toml", "[build]\nincremental = false\n") + config_changed = gate_digest( + fixture, + pipeline_gate, + changed, + tool_versions=fake_tools, + environment=empty_environment, + ) + if config_changed == baseline: + raise AssertionError("relevant Cargo configuration did not invalidate Rust evidence") + + write(".cargo/config.toml", "[build]\nincremental = true\n") + tool_changed = gate_digest( + fixture, + pipeline_gate, + changed, + tool_versions={"cargo": "cargo fixture", "rustc": "rustc changed"}, + environment=empty_environment, + ) + if tool_changed == baseline: + raise AssertionError("toolchain change did not invalidate Rust evidence") + + print( + "PASS verify-self-test — selection and gate digests are scoped; " + "unrelated docs/packages reuse evidence and relevant dependency/config/tool changes invalidate it" + ) + return 0 + + +def main(argv: Sequence[str] | None = None) -> int: + args = parser().parse_args(argv) + root = repository_root() + workflow = load_workflow(root) + ledger_file = ledger_path(root, workflow) + ledger = read_ledger(ledger_file) + + if args.action == "self-test": + return self_test(root) + if args.action == "status": + gates = ledger.get("gates", {}) + if not gates: + print("Verification ledger is empty.") + return 0 + for name, record in sorted(gates.items()): + print(f"{record.get('status', 'UNKNOWN')} {name} — {record.get('checked_at', 'unknown')} — {str(record.get('digest', ''))[:12]}") + return 0 + if args.action == "invalidate": + if not args.reason: + raise SystemExit("invalidate requires --reason") + for record in ledger.setdefault("gates", {}).values(): + record["valid"] = False + ledger.setdefault("invalidations", []).append({"at": utc_now(), "reason": args.reason}) + atomic_json(ledger_file, ledger) + print(f"Invalidated verification evidence: {args.reason}") + return 0 + if args.action == "diagnose-build": + return diagnose_build(root) + + paths = normalize_paths(args.paths if args.paths is not None else changed_paths(root)) + areas = classify(paths) + tier = args.tier if args.action == "plan" else args.action + gates, skipped = select_gates(tier, areas, root) + print_plan(tier, paths, areas, gates, skipped) + if args.action == "plan": + return 0 + if args.action == "candidate" and workflow["verification"].get("candidate_requires_explicit_state", True): + if not state_is_candidate_ready(root, workflow): + print("candidate gate refused: session state is not Candidate-ready", file=sys.stderr) + return 2 + + failed = False + for gate in gates: + digest, input_paths, tool_versions, environment = gate_digest_details( + root, gate, paths + ) + previous = ledger.setdefault("gates", {}).get(gate.name, {}) + if ( + workflow["verification"].get("reuse_by_input_digest", True) + and previous.get("valid", True) + and previous.get("status") == "PASS" + and previous.get("digest") == digest + and previous.get("command") == gate_command(root, gate) + ): + print(f"PASS {gate.name} — reused {digest[:12]}") + continue + result = execute_gate(root, workflow, gate, digest) + record = { + **result, + "valid": result.get("status") == "PASS", + "digest": digest, + "digest_schema": DIGEST_SCHEMA_VERSION, + "input_paths": input_paths, + "tool_versions": tool_versions, + "environment": environment, + "command": gate_command(root, gate), + "lane": gate.lane, + "checked_at": utc_now(), + } + ledger["gates"][gate.name] = record + atomic_json(ledger_file, ledger) + if result.get("status") not in {"PASS", "NOT_RUN"}: + failed = True + break + return 1 if failed else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/editor/blacksite-editor b/scripts/editor/blacksite-editor new file mode 100755 index 0000000..914383e --- /dev/null +++ b/scripts/editor/blacksite-editor @@ -0,0 +1,184 @@ +#!/usr/bin/env bash + +set -u + +readonly REPO="/home/Rbanh/Documents/Bevy" +readonly TARGET_DIR="$REPO/target" +readonly EDITOR_BINARY="$TARGET_DIR/debug/editor" +readonly LAUNCHER_BINARY="$TARGET_DIR/debug/project_launcher" +readonly STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/blacksite-editor" +readonly LOG_FILE="$STATE_DIR/launch.log" +readonly STATUS_FILE="$STATE_DIR/splash.status" +readonly SPLASH="$REPO/scripts/editor/splash.py" +readonly CARGO_LANE="$REPO/scripts/codex/cargo_lane.py" + +build_only=false +project_browser=false +gpu_validation=0 +sdr_fallback=false +splash_pid="" +keep_splash=false + +case "${1:-}" in + --build-only) build_only=true ;; + --launcher) project_browser=true ;; + --gpu-validation) gpu_validation=1 ;; + --sdr) sdr_fallback=true ;; + "") ;; + *) + printf 'Unknown option: %s\n' "$1" >&2 + exit 2 + ;; +esac + +if $project_browser; then + binary="$LAUNCHER_BINARY" + process_name="project_launcher" + service_description="Blacksite Project Browser" +else + binary="$EDITOR_BINARY" + process_name="editor" + service_description="Blacksite Editor" +fi + +if ! $build_only && [[ "${BLACKSITE_EDITOR_SERVICE:-0}" != 1 ]]; then + service_environment=(--setenv=BLACKSITE_EDITOR_SERVICE=1 --setenv=PATH) + for variable in \ + WAYLAND_DISPLAY DISPLAY XAUTHORITY XDG_RUNTIME_DIR \ + HYPRLAND_INSTANCE_SIGNATURE DBUS_SESSION_BUS_ADDRESS \ + XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP XDG_SESSION_TYPE \ + XDG_DATA_HOME XDG_CONFIG_HOME XDG_STATE_HOME GDK_BACKEND; do + if [[ -v "$variable" ]]; then + service_environment+=(--setenv="$variable") + fi + done + launcher_arguments=() + [[ $# -gt 0 ]] && launcher_arguments+=("$1") + exec systemd-run --user --collect --quiet --service-type=exec \ + --description="$service_description" \ + "${service_environment[@]}" \ + "$0" "${launcher_arguments[@]}" +fi + +write_status() { + local phase="$1" + local detail="$2" + local progress="$3" + local state="${4:-running}" + local crate_count="${5:-}" + printf '%s\n%s\n%s\n%s\n%s\n' \ + "$phase" "$detail" "$progress" "$state" "$crate_count" >"$STATUS_FILE.tmp" + mv "$STATUS_FILE.tmp" "$STATUS_FILE" +} + +close_splash() { + if [[ -n "$splash_pid" ]] && ! $keep_splash; then + write_status "Editor ready" "Opening workspace" 100 close + fi +} +trap close_splash EXIT + +focus_existing() { + local pid executable + while read -r pid; do + [[ -n "$pid" ]] || continue + executable="$(readlink -f "/proc/$pid/exe" 2>/dev/null || true)" + if [[ "$executable" == "$binary" ]]; then + if command -v hyprctl >/dev/null 2>&1; then + hyprctl dispatch focuswindow "pid:$pid" >/dev/null 2>&1 || true + fi + return 0 + fi + done < <(pgrep -x "$process_name" 2>/dev/null || true) + return 1 +} + +if ! $build_only && focus_existing; then + exit 0 +fi + +mkdir -p "$STATE_DIR" +exec 9>"$STATE_DIR/launch.lock" +if ! flock -n 9; then + exit 0 +fi + +: >"$LOG_FILE" +write_status "Preparing workspace" "Reading project configuration" 5 + +if ! $build_only; then + GSK_RENDERER=gl python3 "$SPLASH" "$STATUS_FILE" "$LOG_FILE" & + splash_pid=$! +fi + +if ! cd "$REPO"; then + write_status "Project unavailable" "$REPO could not be opened" 100 error + keep_splash=true + exit 1 +fi + +if $build_only; then + exec python3 "$CARGO_LANE" exec dev -- cargo build -p editor --bin editor +fi + +if [[ ! -x "$binary" ]]; then + write_status "Editor build unavailable" \ + "Run blacksite-editor --build-only from a terminal" 100 error + keep_splash=true + exit 1 +fi + +export RUST_BACKTRACE=1 +export WGPU_VALIDATION="$gpu_validation" +if $sdr_fallback; then + export BEVY_FPS_HDR=0 +fi + +export LD_LIBRARY_PATH="$TARGET_DIR/debug/deps${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" +write_status "Starting editor" "Opening the current development build" 82 + +watch_editor_window() { + local editor_pid="$1" + trap - EXIT + if command -v hyprctl >/dev/null 2>&1 && command -v jq >/dev/null 2>&1; then + for ((attempt = 0; attempt < 300; attempt++)); do + if ! kill -0 "$editor_pid" 2>/dev/null; then + write_status "Editor stopped during startup" \ + "Open the launch log for runtime details" 100 error + return + fi + if hyprctl clients -j 2>/dev/null | jq -e --argjson pid "$editor_pid" \ + 'any(.[]; .pid == $pid and .mapped == true)' >/dev/null; then + write_status "Editor ready" "Opening workspace" 100 + sleep 0.4 + write_status "Editor ready" "Opening workspace" 100 close + return + fi + if ((attempt == 10)); then + write_status "Initializing renderer" "Connecting to the graphics device" 88 + elif ((attempt == 35)); then + write_status "Loading editor scene" "Preparing the workspace" 94 + fi + sleep 0.1 + done + else + write_status "Loading editor scene" "Preparing the workspace" 94 + sleep 5 + if kill -0 "$editor_pid" 2>/dev/null; then + write_status "Editor ready" "Opening workspace" 100 + sleep 0.4 + write_status "Editor ready" "Opening workspace" 100 close + return + fi + fi + write_status "Editor is taking longer than expected" \ + "The process is still running; check the launch log" 100 error +} + +watch_editor_window "$$" & +exec "$binary" >>"$LOG_FILE" 2>&1 + +write_status "Editor could not be started" \ + "Open the launch log for runtime details" 100 error +keep_splash=true +exit 1 diff --git a/scripts/editor/build_progress.py b/scripts/editor/build_progress.py new file mode 100755 index 0000000..5b63786 --- /dev/null +++ b/scripts/editor/build_progress.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 +"""Build the Blacksite editor while publishing exact crate progress.""" + +from __future__ import annotations + +import argparse +import json +import os +from pathlib import Path +import subprocess +from typing import Iterable + + +def write_status( + path: Path, + phase: str, + detail: str, + progress: int, + state: str = "running", + crate_count: str = "", +) -> None: + temporary = path.with_suffix(path.suffix + ".tmp") + temporary.write_text( + f"{phase}\n{detail}\n{progress}\n{state}\n{crate_count}\n", + encoding="utf-8", + ) + os.replace(temporary, path) + + +def unique_crates(tree_output: str) -> set[str]: + return {line.strip() for line in tree_output.splitlines() if line.strip()} + + +def completed_crate( + message: object, completed_package_ids: set[str] +) -> tuple[bool, str]: + if not isinstance(message, dict) or message.get("reason") != "compiler-artifact": + return False, "" + package_id = message.get("package_id") + if not isinstance(package_id, str) or package_id in completed_package_ids: + return False, "" + completed_package_ids.add(package_id) + target = message.get("target") + if isinstance(target, dict) and isinstance(target.get("name"), str): + return True, target["name"] + return True, package_id.rsplit("#", 1)[-1] + + +def cargo_tree(cargo: str) -> list[str]: + return [ + cargo, + "tree", + "-p", + "editor", + "--features", + "dev", + "--edges", + "normal,build", + "--prefix", + "none", + "--format", + "{p}", + "--no-dedupe", + "--color", + "never", + ] + + +def cargo_build(cargo: str) -> list[str]: + return [ + cargo, + "build", + "-p", + "editor", + "--bins", + "--features", + "dev", + "--message-format=json-render-diagnostics", + "--color", + "never", + ] + + +def rendered_lines(message: object, raw_line: str) -> Iterable[str]: + if not isinstance(message, dict): + yield raw_line + return + if message.get("reason") == "compiler-message": + diagnostic = message.get("message") + if isinstance(diagnostic, dict): + rendered = diagnostic.get("rendered") + if isinstance(rendered, str) and rendered: + yield rendered.rstrip("\n") + + +def run(status_path: Path, log_path: Path, cargo: str) -> int: + write_status( + status_path, + "Preparing build", + "Resolving editor crate graph", + 8, + ) + tree = subprocess.run( + cargo_tree(cargo), + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=False, + ) + crates = unique_crates(tree.stdout) if tree.returncode == 0 else set() + if not crates: + with log_path.open("a", encoding="utf-8") as log: + log.write(tree.stdout) + log.write(tree.stderr) + write_status( + status_path, + "Build graph failed", + "Open the launch log for Cargo details", + 8, + "error", + ) + return tree.returncode or 1 + + total = len(crates) + write_status( + status_path, + "Compiling project", + "Preparing editor crates", + 12, + crate_count=f"0/{total}", + ) + + process = subprocess.Popen( + cargo_build(cargo), + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + bufsize=1, + ) + assert process.stdout is not None + completed_package_ids: set[str] = set() + with log_path.open("a", encoding="utf-8") as log: + for raw_line in process.stdout: + stripped = raw_line.rstrip("\n") + try: + message: object = json.loads(stripped) + except json.JSONDecodeError: + message = stripped + + for rendered in rendered_lines(message, stripped): + log.write(rendered + "\n") + log.flush() + + changed, crate_name = completed_crate(message, completed_package_ids) + if not changed: + continue + completed = min(len(completed_package_ids), total) + progress = min(78, 12 + (66 * completed // total)) + write_status( + status_path, + "Compiling project", + f"{crate_name} ready", + progress, + crate_count=f"{completed}/{total}", + ) + + return_code = process.wait() + completed = min(len(completed_package_ids), total) + if return_code != 0: + write_status( + status_path, + "Build failed", + "Open the launch log for compiler details", + max(12, min(78, 12 + (66 * completed // total))), + "error", + f"{completed}/{total}", + ) + return return_code + + write_status( + status_path, + "Build complete", + "Preparing engine process", + 78, + crate_count=f"{total}/{total}", + ) + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("status_path", type=Path) + parser.add_argument("log_path", type=Path) + parser.add_argument("--cargo", default="/usr/bin/cargo") + arguments = parser.parse_args() + return run(arguments.status_path, arguments.log_path, arguments.cargo) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/editor/splash.py b/scripts/editor/splash.py new file mode 100755 index 0000000..f042924 --- /dev/null +++ b/scripts/editor/splash.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python3 + +import pathlib +import subprocess +import sys + +import gi + +gi.require_version("Gtk", "4.0") +gi.require_version("Gdk", "4.0") +from gi.repository import Gdk, GLib, Gtk # noqa: E402 + + +CSS = """ +window#blacksite-splash { + background: #111418; + color: #edf0f2; + border: 1px solid #4b535c; +} + +.top-rule { background: #d7a83c; min-height: 4px; } +.eyebrow { color: #d7a83c; font-family: monospace; font-size: 11px; font-weight: 700; } +.brand { color: #f4f5f6; font-family: sans-serif; font-size: 48px; font-weight: 800; } +.edition { color: #9da6ae; font-family: monospace; font-size: 12px; } +.monogram { color: #313840; font-family: monospace; font-size: 88px; font-weight: 800; } +.build-chip { + background: #242a30; color: #c7cdd2; border: 1px solid #3e464e; + border-radius: 2px; font-family: monospace; font-size: 10px; padding: 5px 9px; +} +.footer { background: #1a1f24; border-top: 1px solid #353d45; } +.phase { color: #f0f2f4; font-size: 14px; font-weight: 700; } +.detail { color: #9da6ae; font-family: monospace; font-size: 11px; } +.crate-count { + color: #c7cdd2; font-family: monospace; font-size: 12px; font-weight: 700; + min-width: 74px; +} +.percentage { color: #d7a83c; font-family: monospace; font-size: 12px; font-weight: 700; } +progressbar trough { background: #30373e; border: 0; border-radius: 0; min-height: 5px; } +progressbar progress { background: #d7a83c; border: 0; border-radius: 0; min-height: 5px; } +progressbar.error progress { background: #d55b55; } +.error-text { color: #ef8b84; } +button { + background: #293038; color: #eef0f2; border: 1px solid #4a535c; + border-radius: 3px; padding: 6px 14px; font-weight: 600; +} +button:hover { background: #343d45; } +button.suggested-action { background: #b98b2f; color: #101317; border-color: #d7a83c; } +""" + + +class BlacksiteSplash(Gtk.Application): + def __init__(self, status_path: pathlib.Path, log_path: pathlib.Path) -> None: + super().__init__(application_id="com.fallingmetal.BlacksiteSplash") + self.status_path = status_path + self.log_path = log_path + self.last_status = None + + def do_activate(self) -> None: + provider = Gtk.CssProvider() + provider.load_from_data(CSS.encode("utf-8")) + Gtk.StyleContext.add_provider_for_display( + Gdk.Display.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ) + self.window = Gtk.ApplicationWindow(application=self) + self.window.set_name("blacksite-splash") + self.window.set_title("Blacksite Editor") + self.window.set_decorated(False) + self.window.set_resizable(False) + self.window.set_default_size(760, 410) + + root = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + self.window.set_child(root) + top_rule = Gtk.Box() + top_rule.add_css_class("top-rule") + root.append(top_rule) + + content = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) + content.set_margin_top(34) + content.set_margin_start(44) + content.set_margin_end(44) + content.set_vexpand(True) + root.append(content) + + header = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) + content.append(header) + brand_stack = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=7) + brand_stack.set_hexpand(True) + header.append(brand_stack) + eyebrow = Gtk.Label(label="FALLING METAL INTERACTIVE") + eyebrow.set_halign(Gtk.Align.START) + eyebrow.add_css_class("eyebrow") + brand_stack.append(eyebrow) + brand = Gtk.Label() + brand.set_markup("BLACKSITE") + brand.set_halign(Gtk.Align.START) + brand.add_css_class("brand") + brand_stack.append(brand) + edition = Gtk.Label(label="PROJECT EDITOR / DEVELOPMENT BUILD") + edition.set_halign(Gtk.Align.START) + edition.add_css_class("edition") + brand_stack.append(edition) + monogram = Gtk.Label(label="B/S") + monogram.set_halign(Gtk.Align.END) + monogram.add_css_class("monogram") + header.append(monogram) + spacer = Gtk.Box() + spacer.set_vexpand(True) + content.append(spacer) + chip = Gtk.Label(label="BEVY ENGINE / EDITOR RUNTIME") + chip.set_halign(Gtk.Align.START) + chip.add_css_class("build-chip") + content.append(chip) + + footer = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=9) + footer.set_margin_top(25) + footer.set_margin_bottom(26) + footer.set_margin_start(44) + footer.set_margin_end(44) + footer.add_css_class("footer") + root.append(footer) + status_row = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=12) + status_row.set_margin_top(20) + footer.append(status_row) + labels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=3) + labels.set_hexpand(True) + status_row.append(labels) + self.phase = Gtk.Label(label="Preparing workspace") + self.phase.set_halign(Gtk.Align.START) + self.phase.add_css_class("phase") + labels.append(self.phase) + self.detail = Gtk.Label(label="Reading project configuration") + self.detail.set_halign(Gtk.Align.START) + self.detail.set_ellipsize(3) + self.detail.add_css_class("detail") + labels.append(self.detail) + + self.crate_count = Gtk.Label(label="") + self.crate_count.set_valign(Gtk.Align.CENTER) + self.crate_count.add_css_class("crate-count") + self.crate_count.set_visible(False) + status_row.append(self.crate_count) + self.percentage = Gtk.Label(label="05%") + self.percentage.set_valign(Gtk.Align.CENTER) + self.percentage.add_css_class("percentage") + status_row.append(self.percentage) + self.actions = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=8) + self.actions.set_visible(False) + status_row.append(self.actions) + open_log = Gtk.Button(label="Open Log") + open_log.connect("clicked", self.open_log) + self.actions.append(open_log) + close = Gtk.Button(label="Close") + close.add_css_class("suggested-action") + close.connect("clicked", lambda _button: self.quit()) + self.actions.append(close) + self.progress = Gtk.ProgressBar() + self.progress.set_fraction(0.05) + footer.append(self.progress) + GLib.timeout_add(100, self.poll_status) + self.window.present() + + def open_log(self, _button: Gtk.Button) -> None: + if not self.log_path.exists(): + return + try: + subprocess.Popen( + ["xdg-open", str(self.log_path)], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + except OSError: + pass + + def poll_status(self) -> bool: + try: + raw_status = self.status_path.read_text(encoding="utf-8") + except OSError: + return GLib.SOURCE_CONTINUE + if raw_status == self.last_status: + return GLib.SOURCE_CONTINUE + self.last_status = raw_status + lines = raw_status.splitlines() + if len(lines) < 4: + return GLib.SOURCE_CONTINUE + phase, detail, progress_text, state = lines[:4] + crate_count = lines[4] if len(lines) >= 5 else "" + try: + progress = max(0, min(100, int(progress_text))) + except ValueError: + progress = 0 + if state == "close": + self.quit() + return GLib.SOURCE_REMOVE + self.phase.set_label(phase) + self.detail.set_label(detail) + self.progress.set_fraction(progress / 100.0) + self.percentage.set_label(f"{progress:02d}%") + self.crate_count.set_label(f"({crate_count})" if crate_count else "") + self.crate_count.set_visible(bool(crate_count)) + if state == "error": + self.phase.add_css_class("error-text") + self.progress.add_css_class("error") + self.percentage.set_visible(False) + self.actions.set_visible(True) + return GLib.SOURCE_CONTINUE + + +def main() -> int: + if len(sys.argv) != 3: + print("usage: splash.py STATUS_FILE LOG_FILE", file=sys.stderr) + return 2 + app = BlacksiteSplash(pathlib.Path(sys.argv[1]), pathlib.Path(sys.argv[2])) + return app.run([sys.argv[0]]) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/editor/test_build_progress.py b/scripts/editor/test_build_progress.py new file mode 100755 index 0000000..7e60286 --- /dev/null +++ b/scripts/editor/test_build_progress.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 + +import importlib.util +from pathlib import Path +import unittest + + +MODULE_PATH = Path(__file__).with_name("build_progress.py") +SPEC = importlib.util.spec_from_file_location("build_progress", MODULE_PATH) +assert SPEC is not None and SPEC.loader is not None +BUILD_PROGRESS = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(BUILD_PROGRESS) + + +class BuildProgressTests(unittest.TestCase): + def test_unique_crates_deduplicates_repeated_tree_entries(self) -> None: + output = "editor v0.1.0\nserde v1.0.0\nserde v1.0.0\n" + self.assertEqual( + BUILD_PROGRESS.unique_crates(output), + {"editor v0.1.0", "serde v1.0.0"}, + ) + + def test_completed_crate_counts_each_package_once(self) -> None: + completed: set[str] = set() + message = { + "reason": "compiler-artifact", + "package_id": "path+file:///workspace#editor@0.1.0", + "target": {"name": "editor"}, + } + self.assertEqual( + BUILD_PROGRESS.completed_crate(message, completed), (True, "editor") + ) + self.assertEqual( + BUILD_PROGRESS.completed_crate(message, completed), (False, "") + ) + + def test_non_artifact_does_not_advance_progress(self) -> None: + completed: set[str] = set() + self.assertEqual( + BUILD_PROGRESS.completed_crate({"reason": "build-script-executed"}, completed), + (False, ""), + ) + self.assertFalse(completed) + + +if __name__ == "__main__": + unittest.main() diff --git a/source_assets/Models/metal_office_desk.bin b/source_assets/Models/metal_office_desk.bin new file mode 100644 index 0000000000000000000000000000000000000000..980289970a7587c50476a502a7f412317565e575 GIT binary patch literal 229700 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
9>@<}57JKKD1N%WDSm3x^+VS) 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 literal 0 HcmV?d00001 diff --git a/source_assets/Models/metal_office_desk_2k.gltf b/source_assets/Models/metal_office_desk_2k.gltf new file mode 100644 index 0000000..3fc15c9 --- /dev/null +++ b/source_assets/Models/metal_office_desk_2k.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4323f2e6cae9abb82146449b45445ee9446068c5a9b2ca23e018503b3b0af035 +size 13510 diff --git a/source_assets/Models/textures/metal_office_desk_arm_2k.jpg b/source_assets/Models/textures/metal_office_desk_arm_2k.jpg new file mode 100644 index 0000000..7986b9c --- /dev/null +++ b/source_assets/Models/textures/metal_office_desk_arm_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23c94b99aec8c9b105ff4d843ac41f229b0effb97abe921f0f8b506ccfd76952 +size 2724325 diff --git a/source_assets/Models/textures/metal_office_desk_diff_2k.jpg b/source_assets/Models/textures/metal_office_desk_diff_2k.jpg new file mode 100644 index 0000000..fe6aafc --- /dev/null +++ b/source_assets/Models/textures/metal_office_desk_diff_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f5854edc8a7979ed4576b914c184bda64d7e6ee9969357738703be49118da30 +size 1787420 diff --git a/source_assets/Models/textures/metal_office_desk_nor_gl_2k.jpg b/source_assets/Models/textures/metal_office_desk_nor_gl_2k.jpg new file mode 100644 index 0000000..093cd80 --- /dev/null +++ b/source_assets/Models/textures/metal_office_desk_nor_gl_2k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25392e7682c43ca07abbbbe717388b9e6d40bbca663836916204f99ac0378d34 +size 490814 diff --git a/source_assets/textures/pebble_bricks_4k.gltf/pebble_bricks.bin b/source_assets/textures/pebble_bricks_4k.gltf/pebble_bricks.bin new file mode 100644 index 0000000000000000000000000000000000000000..f533a269a9cc2a765ef2bd7ca9d3250ee10cff8e GIT binary patch literal 2370260 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

UUuSVAEuj| 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 z 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%0DAT%0=}14V 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


wb| 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

jS7J8Hpi2^L^s+b`Pm&r$RqYUBO)W=eDR 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

2E79jWbvlA-vb8nz=A9awN72J?Dr zu($6HSgmT$XH&Oh;a6==42i*!ahjZFy94FJwOI0YE9ORY;JR^JQ7=5u%5fVOPHxYA zaWUvLu05COZ$q=4^w!CFQ`xD>f>zP6+^RwUgedHtCfsjuw5)4uQME1#p-Z(m?^zTS zD%*3-mne9osZz-~8k^oKGgMyph+Zf5#TN7%CR`?IGbVmeV?Lwcq^(A`eVZ{OScRjS zBQffCJN6qB0afu+S(!&-@+(z_?1_NF8Wpznh(PKTWxgJ@Np#lgOxzs~eepxtMQ_C3 zKh&t-5RQ5B{!E)qnAV`m`w8JF?4`oGYa6iJL7m3^H(<_#wzTfN9@|9EQ|Yq-lg6vk z`c@cHj;b)aa<|Oir8{=wP8b=fu~W%zBv+|&LWf=Wa94#B8g?Q~{6D##yI|x#wvk3TUwqb9%uJs=&v3}b|-09hx`foPj>#$br9u$GS9TjMi8IC=7+puNv2FzR_ zI;vmm|L0?wJvtnUO0Brae8c~^Pu-F*D7Y(gnpPN!#)wWwyrXS|lj$8_k6HhS4{2=} zbXT^beo`#vEmoq%xSeoV(}r(f@BE+M$ZYaX=#NsQ!nj?Sut9u1Lu2tGyaf;XY)8Ps zHdGoG0~_H{HIhC0(7QDa*Y3bC7ey|W>wLYl0`LBaL8b7r5r1q$yj~mDe2bC(F45`y z+KOlW6nK8>R#bW`F}7qYHZM|?PW7$$-lG+3wici^p(k}kොspI_p`%Mr<`1vJ zu9X3t)Nmg*6#*Rb<`%pc_mqCMJ9v7jCnGlAg+o{%J$~N9o8P^tVRZ{jR|PQtWI5ht z1u)w1E^-2T@nZ9JtZEm)7`T>25;-NNL>y*NtNS%+2iVs*|<=r#xN zM&1+nngsC5OUZ70-;=`!JjaB-J=rGs6>?Yfq@q?GuG<8#>W>#lwCTkYH(x`&e=kPu zdWUo8dogg^JJjg+qQ|DkXmg?`bIhJ$oqW&QqUVU19mtb>jeZjX*?q38l>QyajHfkl z59-BvsgE#gcL1k9cm{9fAf`pvW7zjV`b9oQn0lRxad};px)A9q^F84hSFX~AnbMYrhzvyc5%jFpLp@tbgYcQ0NY_X`K&dvQ~7GiF?nKJTCJ zu}rTQzs~szNk`!a>0rMk-&--b1vX|u+%@k5Zm$pG{pp{evm=Py@$Al(vd*L(;>*7`pT(v%KKxvfieW?jI9lZ_ zmfCmcpo|n$_U+D~bEi=K#D^sgCs5zho38(*VTyGRS}UG|?jAor|8fpt!qy!zLA9>P08PXtysHSEpc&rS$C@r9mQ|*x&N3^u+eysc)jXr+d*5?wm zU;D7#{cPln>`nvWS0AQJ=X^pQ1|ILhPyb%S_-wF9wFuc+;6lkK+tjlMI~}?RqbYv$ z_Q}G;C_l!}&OrZ;-5ETg5RvudBI`UE=aA#w3Q)6++&KR-j&%Y%Zp?#Jm=Vh_;X+^! z_U&>7qn`I*Q@?!lz2wgavOcWU?ZMJr8R&Wt95yl& zQBMARopo9CQT_~$mhF}MM?v5P(E&-fj7kP}X!_IpdN%&@@u$)CODHuZBZ3~`&@DgS zajd{7ML%wDz6DD;Z#j4F!O05rp7jv9!QkFqw=qz`kH+bhXw2xrkN3rIbfgD;<8H#` zRCjKleHXrW{dnc=T?81A>!(*^s0rDvpXgSt!QcTENK6E`JKVt_;jqJ;N-=I#5028g zi$({3X4&6^VrPH0zIGp_cK&=TJkw?km_4Hm0df9po_!Nb&yf4WOYo+@Kh@5e|;j|MgF|n?m5f;rb`QwxTi<29k23ykz~x{5ydpWwA)j1$>xlHx`MA-4-!55C zbd&YFIA~lEuGnW6a(}omz<4*-^mFGxpY2fn?M9z(s0o$j$ z^8C-EX!+$zz2M`rF7Cm-jVJK!n+Na7I_r+5!j*lGV&7MHj>$^E=9O-&J8=-RawW5W z_I@mQ>%zzoS@)0e;>20U@b^AXwk~oDrtgWz2;tDKJrAH}qC5Lc+z0Cz zHx~9tz-lw$qWuyPo70V>DkR@}qZivm#$!NtPx{Nc^$7X+UW<7 z@<8;SY5PTYZqFg6`%vg&&#K_v=qugu+k49VV~^-=|J#RmE2NuA@^rjOB7jKdN1V`T3wFTd-9C>Tf7UZ@O{iVrPq%L;i^LBE) zFFMlZdm^Sy5nZG3QVr2{_I)HbeH+p9dLF~TSZDDo9frvlC(g|}Bqg>^?3H;4r5#;3 zxBCGo#>n=xtj40VU4-APLg_&Z=3b6LvaSVpY3;j|H0?w*Y%=IOLyb@h6E-`rpl{yWN#%)HlH`$&$(1 z8}Udum+OHI&^_3hAC^nLtFsMt6(X_7Tl94%n-I0XEBEO|;L|cI?zs|COu^=2@?`Q1dgQ@7#5GvD=U% z|5}57ft~sA!a5A`G?(s_HBfO8Uuc)Lh`49MoU5VmK4{GS+ty;~Z1EYJug1AIhOF!u zisjvf7N{$Bk&0vju|+%s5Ks;g;fSU7)@h*8i^;6TVS5(uj|*MxgI@ zLylRo8LCm{{Maf2alK8cxoacBdmGbt*+wKgoAal31VRRzGpJ1@o+g-6zpdmm&lVlq z$#6VeVaA>FHX_~0l!J}KvA@iS_xv`Z%%d|+hHgNx9KX%FVHocwobBX%{2U=Z$tANT z(_e??hd0UmT6~vVHeksF;amGRA>>U*dOX>PI`NOzSA-*Ogbt?!Zp0k%`K_o}k7q;m zSf4E$z1CwxtB$O23B$a$x~zT>hB;wzqs>J`#g_k23aF1F{JJ~OdI{CNX2rlWGICT*go!S6)}4*oF}Gfu1X zU~)JzMW;34-wl{7Ix6og8?ZsXH?Pxr+-T4cp1WQ$q18G6bQpTQ*5W7W)0kqY!e3u&`o7#PML?V1(HJ(@GrItck=AI0PlvVa`mHsVO^`t9aCpv(DJt2 z|86#n{Z%>e;T+_zQsFVRnKI94#~m}K!>zF`FKbT6A<5-gF8O)q#9!C(@DzlJ-)+R$ zNqF&FmA?l}M#(=al4BzM9-rFK;h(jLN^VETvM|XvR^yWs(nTL7{=mWOU~a0$uLIX% za$8k?k>`}Ze2>!Y)iO?P%Xr(hI9{pB_{7z?<|Li!(Q?1mlANMbt8i?EI-hDT!*naj z?>V^&Q@g0qaNaWf6mGS@%W|9)ZguDMDm1)Qq4K-s_#wKs89$cc&o%1Y7PJH-m$u`z z$%_%XMV*E@OK?><&|<@7IC(~q;m?*}^Bo0hNJi(uX-Yi#@ZbOGn3iZRzzN||FUCq= z>x4F3*KH13rYO;&_dFO17aHArE=E3({FKM@@N7{lYV?sjw?yfC^O^~VqSmZen1(67 zt+@N_G@R+Kz{)wZQPtFfK`Uoq*v&SQhd&MZ;%~baH5tF&i=S=!1jP1`yq5Y&xGMUv zL)L4t{%RX$7Ous&YDHH3CD)Ozaxa6sH*sUGN=Ei5((q|y+_q;$WAZf z4rJ`R516y=4}K{6Dd%q>J1*aYGs1y}o;`~P=X!Gc#B(T^*^682Ph$0mo=kXi7HRH* zOs`AAh*<$l3lv@R-d*MHc^=)}0_guJ z50Bdf)An!aJ6zU_4{#CRN&`8^OmxmFf!y#k1-&i>@Tll$CY|Wb-ghq{&Mug5y5++4 zcrcf=T)_CiV7eKchu_{n7UySTU%L?M8swm6b#Ll_7r*4(5Zb4mhxNf=It;snr>}$g z@kI(Y=?78!>v_!B+na~FNZ<4A-fWnC2HWQb6U(yXIoX#T#D}aB+J{P3;+OaCLyLqI zU_)s2bDKB+HtqHo~Ns}OF>x{bvh`_S949E#ch)Zxv~5XRfpV9~k|F5mV9e;|Z< zvtDD2e7{BhJ=|RzOuy>;NL<^S(Qz+ub6amd{whB9DSbG|rWV?LLRd5F1x}gw;Tj|1 zz%hN8|N9=AEkf8YO`T=$F zxtqU6fPzRP-5~5alyrBu zh>G3V*j=bt*x221+ub*IcX#KF@AW=^`C*-%8J3;d{hjN3&cSo(Sk>Lui2MstbTxgC zi1kry*!B^1o1^&6^9yE0NAq5j@30#Y&A;A%VCfLeGfjTO`C$xCDE+~q+!*mOG$Qv+ z410NgM4Dj?XI+1bR~uva-^g$9>K4mn)oIwg%AYfDPRF^^{`@m;G9m^CaDJ~T*zn4q zA<@%?_YUBdsgrT}V0)(cjK}SCe}?N%!sq5e#EFRr*KNl5)_FHm^daoBYzfOT^x zAXs!>v)UD~8WPB+*B7C`QUIOW2?v`K$iOa(@%c!5-n=s(bE*UA;JE;)lAqqc*K*1F zRPbHsB22p;C>^DXVLL03)thROH9mmZnl)&A5x}L=U3zOh7_)gH3PcaR5w`$AD}y+{ zeh$`L5`J{UY*aiB;8)c}(#O@FMZ=|M<%&Ol9&9=fcUvgfGjA>& zb_H_DwOM!{7byPJnb>?XKzxjg@W3gUDPeQbW-54JX+C0pDfoH)Z1huzemS8A{d)(o z%eLtlJ-5!xzx{iE!AFR|I3Z_S+g;=l@F_B&X~1T_(RNs;~_7eJuSM&drxlt zIu%yI9xO1OjUfwsx#XW|*#6OrJIm$qDo@(2nvB&Y9$XhxgEu~Y>>D~0?k|0KN#CSh3zFWzmK0xNiNRQCx`@fUqFY!WUs_vCoaz}jbi{Mm6THe35~ z-RMb3x#z>m@p7Hb5pHq*6xiALi2r^9JnnjOk;){j5YF{L$P`QyT`tFY9130w2iq_P zE2fG5SvC$8ue|u=%_Mkj6E3lMJS_G6I4pi53dZ;{iWtrKq7Z#tH! zN{AK<;3IS!lELIzPqg)Q;vv^=Xb}GI_okkh z815)p;}tMcYA4_CJENVq_|&I#h4B<;nd4UAV5k!(e=L!%K}Uw9PK1G*i|9b(P)TPd z=8wVbj!vBEA>B zm~=|~-`XS4-=Q5B$$Isy@JU)Nt1&RakrpS%p#5MsR<|1gqa-J4}#Egey3hoPJJr&|{cMw_wi=q>NVq;qa;9Xb>dwXXan zKilsRJ@3#U91`8JXWUS{SR&kChknri;w0Q&Ka_VDUhw`vOkd~5{jKD9#jdn@FaT@g zU8pj(7c{M$>9e9YOxiechlc1FPegA^>5a?K>2bS}(nBRXB6Un!g`ZVdoq1^?n(E zy`nF;RLQzd{HAXvRAH<5O@|p*iC@l!N6z#|UZm)7Wxdg$WyL4xk9XVb7>~YqGF>>i zaOwQIWy7Ccd%*aM6$`TZAWeL(_0KBts?m~9#`Qz%Ar9Oq`o+K+d)_(RAIb~undaF8 z@ndXRxw00w#Xct)QY0E!lvQ9~Mpv}%oRL-+!?zZmOT42Y!ExN!r-j<{9b;2Ow z&IWbp2(Nu@xuSVj+>-70IF#d)@M4MmI^m$`VlOkw5hOW=Sr3X}A0fJ5LOE_H*wCOw z8E$N_W}`<58s4_$h)Ly8t`<(Ot{86;?CIF20@Z8nxyh^;+b7wvzfv)>&Waybtq^I? z#JAin52qel@vd_zK2NphpJ#c{cwtN3pnPa;wc#P>3=ELG$BARIVIcb7>aZLnI$QC~ zgi){^B zk`Lw*@jlZ-1jTX9sk zOa$wQfBbI-yqa4IkCQ6Bg>BeAB?UH;ANNZ;Ub+^|c|<=I=Oj0;+$;$T#J9Oeqdy8W zEU7-BAKXRP%1ZBzC0qV~zul#etQAM>>iIuDukdGYG=8z9l}8VROJ1Dk;NEcBE&EUH zDxIpWx$SOuJPi~dYVQhs5FIb{dnH~tSkiL7=qRl$__Cyv__57dx3VK1mbT%TH=XcO zbhs5RWzZKsZ$w=Qb`3M(J`3>{j8o|eL0ndMS9 z&qdZvL#|q!2Pg4QT4iTrUN;lIK9z|b{~A;GZ<_emTJXb{OdKmW;>GD{&@wk-{ksf! zk29st!!(3O2){Ks3DYIVuA_At?maPO)WBq1gfUybjYnykUU5 z^1ZAa-6dyi|C16dO%m=essu-F>ocoQ2@)hnt2(a;r5l^``-Wl^ROoWJTQMT+b*QGB zhn}LJwLV#Z=8gLN)}{alH;A9HNiOVG=`z478&%2r-1|KfDWXfAZOp>=zRhWRG#xIY z+YMCC#Lu10xGFIN&2Aeo=xH)OztCfWbvhpP(Bty+DYzv0UEyofVfwEw>t7||q;PP< zmLy|)qXEaBNkP&YeP&EbLaw?le_u(&*VcNB2u^_4A4yN15sM}2hV=D`$6)b~M*WJF z`~>0Q&O}2`{F@1DqY$`RpG*7`q4!6)r9p{M8KS{kz2b1Iz8P&!#-rbVTD-hHPO|$o zSf?C=DH_5$#DvehWlGBM!3m-XJ~L=VFXHBYV-A#Fw~1ban71B zn6}rV``d6lsMBEgLt&UWL7n5?mqIsJn@|7C$JUmbEbUSZ-5na-T~L7U4Wh4g$%F0K zW^A^l5cj@mb7@HdYV$;=V-Difw7DZC8x^wOjF~x-htyQ^Saa}Yp$4N;v+$y`HWmM+ zqUrXgjD4AoJ%2U0I3x`Y^X2>t6HsfS&B2)o=q5Q=^=lKc_qO=NoY(=89h$K4R4@(=m3*gtMM#&t;T01Kpf3B5JW&WM(Zk+E<^yL` zn6p&=KU9gQib~-q`;U5_Cw#v;PZniEQ_kaD|GfY4T$>i;;N4~wuD_WL2Qy_p-;sx! zCdzc)k_o-`P1rsw3kP1S@bSw`Bo+O|pRZ{Mzog7T#;MpI@fYj*FUG|4vHbON85DzK zd1A^kxT?o~(``#JLPW$BF+<3Nay$e}k@tl;f4kMe#Ngl)&{LYEvxWC&lerX(Ms%^mf zJ8`t{x(Ofa;`!$Kc5F6C;K`DDd>;`@<@c*$ExMXT;x4Q>mPps~4ajLo;GT_Jq1Qcu z$J6SOr4>)-CTlVBXB_KqY?5_uB4b8wMcmCq=1czH+q@*sPFaJ$K?#!Ewi&sh$^0pL zNq_%jc3H3%-RC4yUv#JAX$fp9`F}Hi$I*KC8FbZ)XI&r3EqW6#{QdzvlJ)D(ilg}P zK9=LAUPP80Z{w81P`V!{;KC`SHO6zzm-A@%Um`ykobfmTowb0n|i^0g%PHIV!)-mxj%P;nBI)6$rhxDQrWQuvF<;CMb&)-O-t{w$HFLa(AgJAqxp zZ(+yQ1b!SVJepCWbQ|A-u6F{LoxX|S?TP%Q{}|~fn3>CO9a z-I~nbcm~bk$t+)Y8R`d;c>B+DwECPvbIVKUQj{#b$8{`7P3B&o+pw9C%&o~!@n%&D zj~~8@_zfvcGq{P(4^sH|+#NXWOX2e&50UXVg;ys3i|!4{oSrHLFrCt*R?L=m5{DpHj z5@|5M5sLdsyf)?|TIMA4P@k`OHz1i4Dt{v)BAK1)-eP+|G8YegiR6~@c&j%UX_`Wn z(%+~WltSaGMjZJsS$z0!aU(F5X6hgD>{beAmVAX~RVr&bHo{Opl~=;Pz-m?sS1oA7 z+y!aU6Z;XG4r%;T_X1;U(pcRn&mWS;4-KDCZJEyM{$JtHC5;unavn)(bQ$*s^Pi`4 z^o;MArIW!3W$}9^X7E;eBYN3n&}RKtT)&e+%imRS9~2^a9V6i{+~oi3;5$YCJd`#R zizbEgUCnIxCxo&hx)$E+!fEq)4(1t$GRJEstb9V~YB>x2{)X{;)O6_x79IE9Y%Crg z#Wh3k#LGVPE5uH>oA^vH61JFgfT045^k&uVY9=tu%uT6Z`_}XccNo< z{WVj#fDSwrHx1*jhH{%Kxgzpw=&hTZG&BJ}QDq4<=%mYX^2On1njff2YZM zbGmSfO+*J7EBfb@^hp>~6~Qj*GCxo5Ko^Ip(A0@w*6gvc`5nf4O~*rdTsZqpuEw|N zpw5EYIwtbVr`I&wd^%btyG1yOvPUyB(=F`O`IJ_bg`a7o%sbkB|A0rMHq42)ro z#vD}I$8bw#EuuVQ+57S?jDj8SjKtQzfvlfC0=Krc=cVsMpfoptw?~gf&M(r$ zu^OXqiP3VamCJHv}>V~mv z0y*q{4-79BF1EHmR`&_!pWr@dR1W4u!|urWSHUG)yFlk~5Y123Ao_GL<4( z5Iz$9D7|Gc9ovt`B+&u;3ZJrHxa8zt`FJzjov}Z1G4O~7*JozIrj0urwr67EFc0QD zO+}uzJFh=TksNXlhDT;1 zPW6%8P?92qj6rJaN7U2K^NO z^5?!Ni16XD)0Kz{@#3_GE_m+dL6_p57`Mfj!<72K^|Nqrwv{L^@}}pJj(8+_ko^+7 zpwh;Zdp*n0dy_krM)rn9XFpCHEbCJ7!~R;^4Xc0qa86DI(oT4Dr*;=CqYn+OD$r5I zn;j>YqRCGWc5PjRmn}UwI;Sg|i7r@nupB?m`S7@TDV#2Qb6Qp*Hkx^{)7c_4OY&sU z>yH2Pbsu|C3WwglZ0}hi$Md7PK_Nc86(9K4d{mowv!z)P9t(f?dQTQKUwiUMheGuJ z3Q!yXfI;il}vUO#i-qUX;jpG*u~;Y&P9!Gy0qoZyv%6_LKw7(Eh4kNffJ z0MT>e{pr_iC|+5K?l?9aGe3%d_umkl5nXI{kplC59ohG3N93J$;WqOM)Ec`mHKz=P zEu7hCTq1KPCtlDml%BKtD$}Zt9x}ebMnQ?oC0~ zb0=zujx^!0^ofta=|<7x7KPzStrOF}bi?Q=ZnAEx#D4+qqVrS=zazTbjtcAxaFz8} zC%L}dxZ+bO&Wr9gaCQpj|7y!)4^uG9QFJ%!B>a?ozB!f&a5QVn>lTR^lyA#rhKcYN zJ?`JtF=%_TEl(ecmDkUf#*-speaV^=d}9!7Y|R75BXGjiimQTR&`NZ%lg*=1CA?V9 z=5UM>f9B-K2>7oR-|MX~tWc325UpT*YHP*IiQ!m#(Tf6?W8G;|*i+rM4Z`9)m4ysCwEP8Mmx>#48s$uk88!RURxR+H>UK z9N3JvW0x+Oh}&nwk5AH3J3H)rAqPo#Zn&3EfuVf?BUmyJ(Gy`3dD zn8o2|eQPQw#^CNKGrq8jMLWw@yww;hzR5NW`y7ul@hkqG90gy=D>I3XgR=A{^e~A; zeXQ_riYS!4F{4UBIMn6u_p~G&F-Of=wJRJs3(e>r*8zEZ+px=(P`tWlL4Usx*rrGi z$m1aBpAwELF$|kGTJmc<1ro-z;m>gj@nc9oN9RB|sJ7<7GN3@soVQK~Vc)JW;i} z4J&m#&{_1p%79>443Rvsd!cw{*@6$UEg`7gBmCFXNaVbi<6IBLpf{_Sqba6|)T( zoE(nnUG+IBEey|n^;qZ^hR`*-T>nn47ai%5yBUn0Ep_;yFc=HU^muQt0;l4dGvhl@ zK0ufIh6bQ|njxPK3&aq~v3m6@Kt5;mIr&`>_O{hywp>REuDYB#+!yx3M>YB73vMu! z`I8@3i*6R4=Y>Z;%{k_iH%>_|m&HLJBz@LrN9m2PQIh@N^+Z;CL+`Fv<&1_p1Ex=RLg#ctx>dS}ZXo&cbDR)ZeH!v3?l0*I>kuK#bZgzQKPL zX!@`zXL&1d{=O!ATnNCV*k&B&5QN6j&3N)&AWoKO^W8^Z{OG5}o@D`8Eu2%t9)HYv zpw8=Oyy1JS8OwM2;LloZwvF+{j5STUcYvSpBpN)R@WeW04Hkd(z&j6ZcCK@W?H?^> zzVLvx z;Wahs``rr1DY;q`Y{g%v$<3N=(O>e>mn^V>xsf{i9+vA*^q%4eflzNDzC3GUNt_zv z^yTw$xiWjq6${KHC7II&LhYsKQBm#DXQV1ut`Gbl-xO0A_&RxfiTOe+u5^i9Wu{JoC!~mW%&l>T8$(ok#z# zZkV}KjjGc<5pJZ)zu&#ETUCX3GhHO7Q}V*oT%i9+jUPHVW387eyKA}OdameL{aj_P zq|6ihoMHC-FY4%oIay6OE!Q41Bh@(XnH_AdDRKY$<@oPfCOzX$V9BgZPR!qn*eRLZ zq;nYEx@Iz4OY&4NXYYzA#R zjD>x2*}T(cA4y z>{4(Qk!jhSwCyUUmgaKi``dUhDwn_N?qkx9Tq^#Y#Tus^{z#L2>fl@kO}K{sKXW99 z<+Stw<+A?IIZ!p12DfgZ<(Pavwz`Ls(tMs>dJ?O0b7?gFEN1HD@mI|?w6@4+oX1O? z>5|C-^&eoIkwu@BZz$QE$!7O{q3`%i#y$LtolCNK?$HbQX=l@9;xB|x%VO5p=LqhS z%|EJdaO6)mJ6?N_fs^I;s`!ke<=Nc!_Zy%A&k~-?-q!E2BqWzMmp>tQKrWZ|{SJr4x$HagF;q_GGVSIk ze5=jlwpP-S=AFkb-9I6uTRv0k{z{KcJ|l&1>2)fP>)t*@%7%Qt(s~Bxx%q7KIxiIMEJH@ihJ;Jn5i#PLCUm{`+DX zI&(O7MbKz0p|Y=~vPLoKE^NtC?KdDv8)K$E?7_-|k$n}3^*mkVOKEM4@D z?ZVylU5Nf$68W!24PO2iFa2F}aIheO8;?zwoPap4Ts#362g!PP>=Z0p9ZQ|0S<i4QwFo+b`6u*@QXj)N!T>_2g=tgL}baWZdy zpNn9pWL`0!j$=cTsMNFu9iAoeXWnE??2y2r!ufZ(8^_siCZMo$JZBx84O8_Lu5UdF zJ69z#YT8%~txw>g%5hNn6i*w~naIA7LX(E+SY?>P#17(DNl9Wv$LV+wmCSyPqwvEn zf$t5cz*Y3dAs=VKrfnLN$B)OKmC5|RNBs7)lUe;~Di+U3;W)EVSnrs`X)D*FbC+c9 zShEEm!&2zmxK#4?68WfeJ>rcL+2z41%(ms0q;Typx3rbs{FV!Ti!^ZuWu=)NeK4V@ODPeC$^hOB|r z`ZU_5F2}t)sl0q*C7QlZ;nmS=G4*dMxBprXd({m3wvas3VQFmHbQKyi(ztQ^9)moD6Cv)xm0R8a)m!$FsNTjM+37kH4kx`mp&pE$21x z#%ioVCeM7Tm3(^9BahBSxoH{|hvy^0B!efrE=Kor>2ydqh+k!Ce0**jtk$ORzl@!j zd?l4V()VNaRt9Oz>n(oOd+AhM*^AK?88jKS31NFhAI#W_a~wyk( z{@)jogD_}AC=-YDMBJ7TR(n#|Z4`tvu5~$VZwQa+CmgWoecfA@W6GZnG?~>4 z8!RK}aHkv#e~7-;FovCqLZwQwe-r6aW_gk@=&Sh_ZpJw4Nqwl|bZmnGqK*HC_2T!>%SqBwa` zA&yOoq&K6#B%y_tTkKvC?qopSxigkyFq384{ zb`>sU!srP0+&55o#0Z9;8iKpR-~H2dAV#W3(`!&Q?pO#H*r5+zY>Q;*PtkFNZ@g33 z7roP?xj4NSVuwUYo>(8eMhqv{cg32P(X2`DgeAi5b(zo+CIQjZ?>-eK`Y{~0A_ysx z7k6`jCqmB#aL+MMXutJm&yZr2J1JNlQi{25L39`Hps#Rtx1VQY$%gb zdVUd3FC`%rcdP^1V{8_b=LB)HthZLx3jb!BfM;(4SP_?kQptU+nJepEy8w!y%R2Mr#Xx2{c7T%P zGg@4i@713JIB7{Ns(+9NWG?-_Aeb()F1H;_<}d<1KZ7anBXO={FfERSBDg2mSVWx3 z5niuf09=2y=cmQp@ggah8@KnxebW#=zR?4(#P@q?W=9;m430Tb30;>E?uzY*^+Uuz z-M%x*#eZuxx)7g!E2uHF1ojodtX`1^6HQX_tr*wZhOj0zADXwxydK%YB?VJG)gD9c zi0<_x0S&jjId)eZPJHuZU}iL~6nb& z7bc3IamqvwOj9_saJm<|&35MA?rtzh5nt#hXIuytKWRr#91u=yPLwOmI=is3#0g_7 z#s3-ag8dn8RNCzbgJ;e(@U_QMRVSV@cf^-9j-*-}BnLaPrguBEYwpe_wT|dB!d2!x z4w9$t#%rDJ&~cOt)%VGym#e<@9sG9!Hs4cZJ@QfEyI<~rAOC_X+PQm zO{K@-No%aRXUz{*X5tI7V*EQ(v{SL-&Cw>Px@JSW%`KsK&YJyC8e{(_D^9Lzfz`4f zJE!*8FZqJ+pZehCY{~oT?S+oFZ5dx)`egTnw8Oh4 zHsX_aM)OC)osDzBl4tfjkkt+|O6^%Vqa9jHj@Q2dGA-nT{fo2}Td$_k^!pQ+y43XLI_EE?AqFV~y%b+k2(e>dlkn%1}={!G(( zmS~XNE$`|!7%chxyMI|AXr=}2oh`6B$ec^2wL;xr(WjK;eUsFdapA48^Jp7-wJ^c@ zO%_x#GR5uVt+`&kCDKN;=I}-ntUc6Cl2J4H@S@f=v&C#;616-RV!BYmjvwXs%orN$Z^ zY@2Jy{*886;AF~~%N_B@&P4iC?BJGe%)EX!2s1U~OWGnu^6qQTx5fGB7WC_9jc4&j zyf(uME3O-I_)05uJ>Qbs7PY~Dm8R_8!vc1nS}?J$HJ%4cj@PU<>Sm4VpV@}I!1!Li#x+b*3Hx?2PH`oB zs+vs8e8vvl7@5 z_s9wZv-CKxLmPyC)#pS#E3A{}DHN7?J5`sb7g^#=FCEDfZ6$LTJ-WG?Bce{1f5)|g z<`v<8(oHaWy#YfGnPJXN={?+K3Y&60?%!yN3`)*^gE8u&4EWW#1%3*@_2Z{GG&8g~ zqG=l}5k2X^oK}*1s6n-!CRi9K+|;lZc=KC})i8#0n&hK*Z~4FNtm2HZR&=F3?M$$3 zf%x;(4dK5~oA*cP@joAS#XP0=N!r_fUaSB7e^;(#{JwA0|4k=D2*`qadGR=64I| zmJ2799$=0TjixN_)C$>iC8z$WB{U5s_i2VD)+|wBbdn{ykNS&_=PYpLP!rzFXa%E- zs;qC;8sSf*&%ML~eM6K*Z*7G!CZa>Z1ihCu;TyS+B&jyxXbn@8*+@_Ol9uQ`OPTI% zTA*BAji)M%F|&^fQ*P>G`c2`gR_bBZN>#qdH^6;$71nwh;FI|CW_cRHDN~6w*F%t& zI-8x+#AkVYp^q+HyZwb{Q!Q9+R^z2*P0{b88Y?xLqS8*4p2sz@NK1utrf6aP{J)YF zsfBi;qgBmP#jD3^ymGM#D(0A^U6|=r6qkb~*gCY%W~FGui6KLd*!y zrscZXG7rn*kq5Q-UX#Vpnk0$5L$Esa<>^)1k{ju5nr)D~;X5}y~Y7R^-MIS1!MZffXTECKf zfrMO+T|8C#xAU3iJrj@CK9?Gu zH{)W5JYL{R7zO0=6i$(QCOw?I~VJ7+P9=iipk;M#MumVaYg`8o#5RaDUvw6!Ea5gI7 zi^O%v7*fbEmv#7)T+Hd2n_;`9SbB}?kaebzss)$O)-#{ubWbD7IG?Q#-N4{a1@yfy zeL(LEc`Wl1zD5+#&iE>xTNJXq>?jhH^J#GAEF!%NIaBn&cF~3W`1c564;Qd9`4npI z7VtysQ+OR;#74aa{2Ne2>xA=|Dqr?PdtXKVv|^@izm31v#k@S>2wu!9mbvsvbSW<8 zi|VtmEib0)a_LXfE8*%Vx3FYb2{#2C#%sr7P91k0^~Xzj=Ee>TSXjbYt~KAQ0Bc3MLg#E2;POoJl*p-;=31f z-R;+~om|X?Tcjs!doelnHQtyNb7;~}>`Ex+Wa%xOA5%iRfG=p@y^PhNzfgR$lo!l@ zVWw{>xAb|67Y|Dryzni`^~%`$_$^G0DC4#bPw-%I8P(Na$~?0pLkBkE%<+!Asgi&b zCxtgmjzY0ZobVBC9p zPg{ylzE3=TwK~DOHkLEC4nm4n5+D8B1GW^*V{N|%e?UL zwm6Qk%@uAYg&8NZFr{}g{nut7_ev7KxJ99^G@gSpW8i)~kvC$3kv%nmGb5&At6v&} zl*Ym0bP5;W7=m^e5;@aiA{=|C5vtShZB;r$^G4(BVbRZykAR-&b6e{t;r8QnPMkOf zW80+Brgb&+@1{tf^Z-L%&3B`aC=R@_s6~R zH14PzjJoPHhF|UlU*Y?9i$CAyQ7WA=3>%X&_@{R-yw6Evx$Zy|Sfum7oq?G0D4lA% zOK{Ceo;Rct2k)lwlt-ELb7wGkW-oMDo54FS1(>utjrm`C;LW#mJ`I_L|1>hVTxkKa zMrJa{eGOC(HvSCjodhZSAopCYfnEH5xH;ZOg z{}en?i>1fODDY$y%Zoc;_=-pt^bUbVPy}c0X%7qc4vgLzfl*qqYA-SpBjC-CccfxipeL zO8ij}6~WIx0MDN>{B*zQYtKK$=J3=D;Jr^4*c_nX?NP1Z z5FA9u6D{$re|wJKY=UzZ0bJ;Biurk<%=Qt}Pr*?^Cirp6F z6kiv$$AKL|>~ts)EgnklU4<{Yw-4g8mVub36ioZs3e;WamJGC&PPI?%Asbl1D>A`r?1RH02a!N;4{PWaZ`m7wGk>bnWr!6r+`Z$hT z+v9r^e~#E>i%x5N_-t%jSYDF6vDuawINFPU|5zg9kS`y6mGxMi5C5$;$CbX)m+RX` z_Up$E5v_13(U*sYnPSfwZ|+rUjj64@nYYsfO0DGm*2NUp-}+KVVT`!uK6Jj-66Zch z??*uk3<#6$ju^sKSNxJ&3~(b<^dk=)Ec5WAnV&L3&pFVz={LplBaWP>YmRH8hm;qa z$hxc@D-&De_c1p6aTFLiEwP%9U$|H$#hk&Q#vg98H90T1Y))hDzV+d>z!zb>#Ga zbg;(Al~IXJaeZAodfd>&d4(h0HZ(=`2si$X(3GAxSGwtGNPd#?k__CAC@zpT$ zA4k^xR>Ss3ZXB7ZjMfEiROqRqXQ2!KdNh$rFBf{ZRL1+sl8<&y2@4Hex!v=x!ch7T zuB~i=Bo)bH*D}C~n>KV-w7|mv8&+HDqi=I74w-8xea%+v($)a&v+cQaq&}*I-}&9X zIi`nL^B)5pe0Oo+rB+Rm)Xkp3pLI|*&W>x(XyMXaTRx&Tesr~wzD*50J7Y}^BTaN~ zZO=)Unqu`ocD&@SiIcXrd~B(S+u|$qxFhQc0TX-oP(z-f1FQC^LaD1A&7P~`^$h9x ze4q-eRW|h8tAY(%tavHwui}il^cU->;Cre)jTK5b)M&%~KmI5*{j9m-);ERg+qN`O z`A=axrY#+kzbQ_Pmi(=0KNSbB+j9BP&x&!*HZ(K)p-{E3;WC}iim)A4Y+n0Ou~Pae zpXYp6;6HmtM7>cs*4uLA$9D?#12()r`kA7!u`P!mYk}wA?72eLYs+Ve-|?rcQ$_cg zHO>%u*$!M9{X>yrYsO=bKPgPdv|{4aPl~>>-krB2-?rO;T+miL(8rZwgf)_2-k@H0KrPXR!_{5BUS5#4K zWyy8jRnfXga`cT=V3#DpoHJG6*}>g`M$AeE4Z^uXu zmB~YeeS#6o8lNk;$B6!>4;3}yr}NzMK(W(III4s96a{`QXz8GZSY=b5OlgXNa@^cS zs<_nIgd@)WQS^Rn$`>I`u={dzcJx=q_ym1cN2|iKr#@@fD`D?D$)i$M!4VZ5D(U~H za1Jx%{$|QJ>T1Y3yGBLh&*s!K|D{l0qD$qIN+?~V!+^+diiKYKOj!O!(L?g1YLh=J zcB&ZCcJ3R6X9oisJbI(35+9q_*Eb5Ae{^});-kWOuMP(;c&*6mufyGmZxsV2rzywi zg+l44Av3Q%Rb+f@&H=8s6*=OoOX+w^k(;W^GX^<3!uv@22-8G*S10^SGzt(q!a!@l?o_Mb~HbtAS z;(sWLwl(F>NuLyl`f9SS=CNWw$mit)#k9<3 z>|6ds@xnoyH5>0KPU=Vw``lZK%}$bU?tVpaxlEhmmtIwDc5f=VF;^93&fy{Fjet}1-xHN|?j zzc};n8AWSDb(u3>R5T7&%m?XT6>A}u;F(8M`O~)2R z7WW_REV=5rJRFmUKfSa0xmhu^-Tz;INyh4&OpfSSgcByY{PMIC?j!OzK0h6Q{>|oy zJ6TA4m&4(O!vF2hWSiq9xE+$uF)tI5x=^^F^)Wa;Je&24<1p(_4qelPHy)lv=VOUD zT9D72SLu?Umd7UB^Tl%DkcWZO`Pp>FEd638Qy}@WHQ%j?s;mESgW!~RvL|ZJSS9wPC2Zm&^EF)#wqO$3m46 zcTTh zdP_|FI0POmrpd)VXdY0=QNOA&z_W;>Dth3X@J+|xjKa~%VyZ5YdH>1+uAJKouFH%0 z==NYNjx6D|p&jvYZ6PO4DMVb?0v^~u1hunD+3-;2{Bk~13RdD_elczCufh8V#XO`k z7yAMW`6Fc&)U%7Yb;2g`ca?J2=|!;ZT}-p=C5VYDVMUi({F_`Pd6e~dc&?PIbc6>A zDHi@?9=gmemi+H!SUR?pS5oRQZ+I#1Oxh?t-DT`oIun^oi&=GH77lzap;^&`#MZqP)4bI<2> zUa#j%d>)aEpJP{vvz^l5#`Ezrr72jvVu?uJo{Ao)XNZxk2Q3}8NSvCH2HW&?V)BDD z-0C@1JmU43;mf@QPg2qNWT9xcZxF28tq}E!biC#H{+I!&2%ULITsoTqr$JTX>dF+* z!b{>zW-6Y1yCYWHrNM9h5%FhiDlYUrFRW|_A!hweG3H$=%4%7MOHaXzVQ0mw*fezh zcA53>G|u_w(Y%XC9wi6Xkc)G3e`7(Q0rSbRO>$ zuX^)(`&NlDXVbBN&S}wMV>5$BtRo~xdTaT5n&N%2QfdtnfI?r0Dn z+NYr;@SRY0PlN8%uOjnd8qQVy7V9piVX5Y0@qTF8+GDa ziwvx~^HLmGl7Z^kjUxDF23ic4i*WS_beQNP_WcY)f_Fz@v$6-K`ud7Dh0ImE*qQU8 z5s2OACWm;dtq4L zU@5dWhvSZpG5dO$SLNM8%v;(6(kGsGjEKUgQcK}@AQDGS&4fi4_H|vbV7)5>znl5> z9ohetX(k4|j6`@xLy^Y*D_vt1alk(ufs1s+_<}GT{2U`XOo&Cw(VpVw%V<2|-1DsV zQBX@`|9-2Uh-wietTwa$6&xW3Ys6xeQ=r(+x{t|r68TM0m{95`mJ~%o^`pPY^XrK& zrQHP;_JY^U&SLWMNG#LrF6M>CVL@pZVI3HY^|u4Xn%r0@ca)21S~0k()mg;5MWLUb zyLhkD6KV4xrd{uathmmi2m7tWQcq!ZD;ocDy~HDfSbVd0=AK{9U+Q>^TID!gEo(32 z?EhME&ssDZM4^73o2b4LhrV~5L=)#fOLXi-4eMRDb2^A`nsFFwZ6!Xek3|*VpL;tb z2HmN(sO}TZ^ShoR_Fpf2s7w@@?5n(5q9pnb;2dML3Qzmxn+O*sEC`_IbXO*ODx?JiWYKZ(XzNZQp^64mt{8u zkN-(|sv-FG^eY{06A0BlA1QZ70BrJ{gk|S$a4~H!UaSj2uS4xclON~Jf7^s;`4xR=s(F;#2o8}b>l2Ws8%=hy=W>58`;0~*jza9>w2&b zFg>O_^5fOS$wNKxVP8FM8O-^@(pvgQ+{@~Jg|6N8!*7SPWE$&-oWG``ZJj`uR)*pe z_dyK1smVEZ&gGeEiOK4I_-k(m`+6`s# zVz?h%2B?X-oab9@`jdtp^MiaZ&xdC#@YdlE6%_zWw6jm^V~hm|9u|V7Wa#?tGMs=>krbo;f}&de<{48GwwY6Neh_A<<~3|Yv+1lY4H!b$^M&) zZ@;O+*%Ot1->8Ayp%nU$db195xyx_5vCtd#wO{CXm?vr#@2O7B1NS$5pjZR;Jw<<| zf8TsiaqvC4clCzHzIRm0I?JLPAF1?uXPkXoN4j^s&^z)i1;%>8>(f&@tm}bSN}MqA z=!6W{CuErJ3A@j=G^*Ychoc^o<3x8fct54hL%eb5z!kb_0dvyO$Cp__aKr@+- zKR)snO<(JU#--P3F6%lzwD>wq^Ro+%5z5MOL{`%Wddo$;aY70qHF&zpdk z)WOCDE(z~wQG*jKnxE5QcPA{+eNMARIOELZ`=s@yBV=12Q+B!w>N!wR9LYVHi*Av1 zviOJX)^Qcm(?AjIv+>;FgQ&!w{}2?S~Zonb;Vz&eRTRi-%!|J3S_>!b<`gUN_NHL ztVWs?)DaHKUr1le4Z2~U$)~v^wivvo^Xw10+v63jIpT&tMX#u8C-bB(KP7Ya8yR1^ zN$+pD;r;4|l>ddfSF;~biJBY6>)xOacU&=b%?0YM?}h=x57N@Cw&-fRo6ah15mx?z z(w;b=@4*)oa>AbP*S)3>-tBO4%5$>2-5ytU>!>)rJxt%!(JN;M*yz>KoFF?iU9YA6 zF}83Q59n$?_T{A9AgkzhxaoV1idbjq`s+U3WxkZ#pR1(Or9GqjK-?)>w$K)BsxMGexGnr2 zouIeehuE#{84B3#fH485NM>e_Ie)9@go5*U)|K>$b8A6K2WV@K1H845k!^48OT1G_ zf24M3Gq92hzqdu^*Ml@5t^+DUc2lLU1DFHy_zyO>+%Rr&btfeUnc6 zSmEuiT1vRWzMX?N$n$J#>U1@&Y+w$O<8hku(+aa+pP*RgqUVk~PMNu_al2m?WnO3n*X-l;?vf>T z96dmJk1a86(_Xs#z?ywwyJ=3e6*k!)q+85is`#^;_NKH#$?OWMcd$m0{x|$)7G}q$NrW$qj8aH94+AY;|kq>X^!Y8=cqEu43Ab{piwa`@J#1CJ>mRVnAKS_XMO0Q zR7I<%o5RZZIL*FhhH?6*D4KismU&lF)eipq^#kr> z&Vu!(zB}o{MGJINT~A+_FMjRKb~^R81?C^vPOoB25s|!#sy~?{_4y{ssxU*%nN6g- zsRfQ2ZlG)#^Q6-5)AudLXc@)(Cv&x@#ay8!HHN^DD->U>k8$%ZP$K8K%nqNU+WW=` zJA9sEhZ#XEJ58tm<7;<3N3u_P2AO610yRvYCZ$vC^O?Ap4s15U^ieyg?|nn&H|!>@ z^#)MxT|r?X%o}&yPVPa>3)k98k7|rjYQCBJjWxi%5o^dH+z_TJ>#0|F)`41Xr_DPw zaaVsmxhOR7^5O<6W`1`;%sN_eMjM*dD=6Al6Y&;TNa3RkLx0?UCvVJALb6- zJV#^LFJp4{G^w`N#^lbY=xwzIW{o{c8Ob`BbnXysWgks&QZ+fP(?Z(VLsUCO12ZEI z(n+C%#=R9Zk(c*M{QyZT)bTNA7sYMSK$nIsw69VJIk(o(itnsDY3`@|zG|o+bATdO zsbIdvGEchzfE>S^B(RC^x%z3cS zmud3CX3>4bS#n>iir;=m=|BI?r8xdP#xksZag^@wS3}b0L;u%>Ob;BULOW&5tXnK( zZ!%zWbdGR09*jfG(^T4!ftwD)MZQNSZY*FvV#8p(jV~2#7iPg>)C^&zmyP4IQbmX7 z8GN0dEkaURxAC4VqK{dFJ7=7 z^nKG7k#CiWipjghZ0k&Td_5zIDznf~a!6E2+02)^AU3CDW61I~BKz53yx4S5+*+0e zx7pjorc+sX*m8&XmynIE@#jTA$PnBe%6W|*S-AdWy_m_m&%W~I;#_1FY_F^keT%aZ zzjK2KT$h9C{|<`Spd7R*V-9psE<7GD7Ke1Qp*&`jxSTWu&t_GKu!}=+tah3(4;X@v zr*=$(z6 zAuq(@E7_1c+!WW3WFxxgPvN_A2>YzBi?7p%V9tc6Vov)URL|lbDchlVHML$`v>1we z@k*FHKL;munVVBR6s^}h5*`j(moX^U`{lO$L4H(ubwsq(N6< zY&`%wzAIQSNXA;jZbIuq3eJs56pMcjLXvG4(cLW-!9h{XA0C8;<=#A>Nk+GZFtJTa zL+*^u;u`ywmOW62gbnY&aP15o0xvSW|Cju$=OQ}>7-_&1`S z&Oc|aS;%$L+S3D8HAm>=#W0+#Izsu`r>8R z2)Gt2iQ?5g;5kiQxH8|$rHzXCyOMcX$No{KEF9MNwZ-y1(dg8_nXcJKq2=vH8WN8ujWPJtPbQu*w@Wtb8!f&bi8QAdbip(n75~0dgIWw!?cPvyL=;x$ zyrwpl(Kz_#1+DOnsN~c9#Tj4+jMwbPbWiT(3oCN zOE|Z8^8Q`AmK%lcn{U%;)rRr7t$Zy|Nb+fo5WQGW&jJT8N(^F;L<8wJYmB z>ov_HdRL@Li^%Q< zzb^MHJ-*MrnD~#B$J{8#i?7MhJP3P|8c6ZFD~w-%qxJ2&Y~w zaMvE_kx)&~^txea^D&y*B?N)tRrG0BC~k`r6tOpu_k*JpxT`x`RVwKp`-)yit|Ple zLAdmHCspzLUJcn#?^us)wP_1YDr1g($QmlO3Bf+wGql0eA5KG#lc|p%bSECCKaKv_ zkh6~}KKkMF$L$nR>WgodJ7|@OADVnB$R$LM&aqo5EyN$eH&@Zw8abpJt0`Vb&etVt zXtRnx{M44wY-c&l<}aX+#{O86y@*bE`Qe{c83hlJkbGt?Ma8kt$6_vJ$o-JkFpEAW z`a-;|p%H@=C@y$Hr)|4He&zvPej?D``Zhhxb-LY7feR;j{>}ZJ?X}L6KKp;B zCY_^CSqfa)dzLg=hxyldlB}Wxx?Vg;+)s0oZLl<~m>m7e=aBdik!?A}W`&OW&LY#W*E^TL=v+v!-e2b5cE zq|~SE=b62cPJi}+BD9<=zj&h5w}L!+cw+CTa`GR&iP~)$~}Hdm(i`a-1n!LL;4M#7+|=Na=v&#b>VcHxWot1r)SVw)|JYi715V1 z-gtd@28DL|kLNUl)MEDc1?Va+gtUwj+-0TSj-7GvxWZ zl*So3;eL7|I5>Qrf}w&rnl{_1kon*PewWkH-yIP8 zX(L6QaKO!h>uBJB_IT2B4OMlsXMRvQ-EnNk9JGZb**M_E+7)!b#15ClBKpm~nU_rq zNPS>?zTRC(?`GL!_ML?k+Lk%p%S%busRP!Wn@%3QoRr0r>E}oXRFzDn(~S;@I+{e{ zQG3K~8A2`#9ALaDw7AME_h*LEWt3Ubc!P=0i90{$10Pb(ANoD6GVi z`y1C$>|z`2tXoX?=33+4?ggY!*ue7ld|Ljm4N9AqQ@*S<&Wu?|PI0Z!)}VwU@7kb! zcqvU{e)QFwQ|a0PE7+CIqi6S-*CS?;eoOUqM^j=(8+hoAqH6Zy`X^B@^Y;9Wzy-S zHdtbxM%!*%BiT5KvQ?~*z9)hHX|;x)M;cA_Xa$|3ayoLkB|N&Xptx!?YG z-+m2ki!?=C&*#lKpOiO;D*v$0Wx+gp|HKTlRA-aDnJE+* z6Ul>hj6Maksb?hTm2MPM4)?ZI{hQ3kiy4mpoJ{kbTCg9fm>zJB%BOA|X-~62S?MS` zJ;n^S=SPzA15>O=DtULX#O8)v+OggoZF>))<{S$+9qU7D+A$w!b|fXT{!*zMMb}xU zskfg`jY|4hQoVqjId?S4We&xw8{kj#G-|Qc0Bx;i(N#@-$lPYq;v>57QJq9y!}M|W z%s5(ipL?XjPs> z)`bShToFqd&-IZxEs@UV=%d6bk?eT+7DkInq0TuZujTaAfb&(#OQl`xHF~-dK(`fENLrl+`No6ffa5r}v4LW0joYaY=&YbI| z%K0=T*BHT9d(ll76YLnbg!V-1qRf98g-+FmU*i&TF;K^=ltuJwwHC?}=26ccnn>)q zfbw-&7bz{F*d%R;MYHJqZY@;5D5dNATAYKOMo9)bsK}Z|W0=pg^+yTG1Jt3AMp9I< zF2W;K;M<&RLMD~?C3bkIiZEtcM{0Ih_S4MN ziKp!A%9z#8Nlafn7;TDeMWn@G_BR`dsxFzB-r+kv*qDLvg7@@98jO*7RdkVck3T5` zL`~~#=9qX3>lTB#Cp%G?nq;BGI!4?dmyLIWlEnPsLtq&1D+ad8#GkvqBGEM)6@>xZ zU!RS-@P1-J>!J8}+nMLjS@^NjN$CG$y=5!&f`W#inCEM+d*#5)ntkV8GhuTejJZ@p z(HtPe>zW+YC;N)X`k`2srYFvv$wI$66VcEz8~{qs|*)gCJcqne(t?Hn+qQ*6;YY_FdML1 z^qZHD>Vg5H>}oFZ4^I`xzYoJGheg81pa6$AlnN88;n@5-T+E)Dhfj7nqI6R}Qdg%4 z?*qfo@Af!RGp_*qB6^CRhQlz?D@v@)Ex_7mJ;X@GaOR|s5T^o1z@^bj#4O3j)K@;j z#kc^;X{W@pJ^9ehzbAfP$wzjh46UPvA>-v|QGUDtR=*yJvirl}W&Ba(ITfJ$k`tl_ z6+rXvMbUA80jkzM6(<%JKs9+Ea~X!gUH`I}*rfo9R~tl5MFBiM91x*n3-Gh~k+}4I zIJTW@68$tsU~cXKQT%N19K*KS6-&S!+eI#U~uZgBJ^zM z&~1<22w5|m7RwV6pOH|pvTnzPhV`@^n+SXO~&f3_2e1bAGi5B-^Pml zHZAYbnY?~@mUV+v)+D2`-8GtWxxF;X@y2AY_%`a);=llsozGM&-Ozv@52=QD+QX;TH5k-Am_z) zP}hwqkbPQ8z9#+Q)nz+5=q4j~-W)2Nkc^BT6XJoRK00aWu;>}JXyCu=U8W;0r}l!jM1YiQosaCqvKlXce~7!~9oiU0zDXlX`Oh-WIBD6NyJ7chdP~u}B(MP9qmZW9qiGB(I1> z8~W~KXFKYJcZ~$ z9K^vAvSS~{u9~H!k{T|@%%pj zd;z(HGH2Q~oenV9=2}_;6|s&{(ItUYHw9wJ*q*e1PFHx;C}^`oFb@9pAuqkII6T;u zdOi-qpZ@Jg(bNSEM;&PQ+yD$JZ%4b50x@p*2J(8=4JF=-sGCIy24&15&DPy<`&=m% za89XW{9-aI3`Jf;30*uAip!ca==Yuw%*RBMGK1moR!r-;XYcjK5wvq!H`J9*B%RVw zWON!xzB@vINByV--7)w>B0c&Liin6HvOXPx4iCE0xDnm(I@E`pO1q=}nmx6z;r_aZ zUbLP<5aU0I)H#QfJ{P5^`Kgx}l@G_$ZUG$KnU|ImV-1lQ1W&)Lt^~35BVSJvIaOze7wOQbc z9lPDBY#DQKwtADok$dD$+fzWG9~vE;C|QT|NH3Ks_=GQxrD&05Il-z)mu9I*xB*jI z@rQjH7uCsOh94HI&ZMqK6?}hl4kZi+dR?DNZ0$nl(^F~kOv0b(MYOU=f#p{x)8sK- z;N>uh9IJu%6-8v4Akb%L3@zhO+n$YSq|RLB?`x7N`640ZWi$o41B+rJX;L*|`V9pw z<9yG#WeR#}s(}A=U*c#A{v^55BIY$zX8^Dz2nF_}A4ciq;3zm7KTX`gz zDS2aUQ3!n*L-ig|7YUjPGMKXw^b5EJ;kG{!iWD=P-cIf9i;g z5m~g#!5L4jQt4+qN7SE=qPCTen7S*T5;EQ3WEDlv?Oj=iiJ~Ws&WOqCLfv*dV}_)l zD$c#U+ey?lxg#Fz@uh)w?BD3?Kn`;{!t<^zb1qd847&PN+8pDG zgo$sZ)?;0eoUcp;qZ|>xERiV20cv$gbkoBQapQW?s}x%}+z6(MTnEfJ6iuo#>@bxA zY3X)5EL-DEAI`MHqy1gTINKJF8hvQW83$-D_oh)iZ{By*i%##e!`m!ZI;YBgRBnzG z!Snxu!|iGK3kSRz*P6WZ?O{5rBl$4rS5w29D*Cj;f^F?-(!zGg&bJ^Z&Z}(OsZE7` z_UJUyj2dTf@BK+rS~RgehUObn8|J5Mu6-hDvOdtS_Pf+v-WHo9nk6rHTPz+~D_t{c zkHL|@q`!p@czN}`RA0%y54}1mAlVM7_q&m;dk56M@uTzX`>-G5N7236Cz0HZuIpIA z-ztI<+_=X|uN!60u|cVO2zf+Wqx?}QwTx(u9T!1!7TBQi6OqdnE5t4JrLsY-alWND z4XwmVF8R`1vPR*!A0$BB!>2>JBg365k3fn%fdtT0@vxQiDSq z{5WV#mw7(!p<_xm?2icUVoK9CStGqrla@QTL7*w`e>{)RPSPaP6RZb({3NyQz&7!gQwo|vH4)r%CZO)+Pz z136DLh4PeERNA2hwtK3Q-WIQim{bY80kcHbwO zXKTrNL^qn5*b+vQdeLo73v@{Ir(3G#FnivG)?PBlX?bT#f7k*~$2!v4rj{6!<4Cu8|vHL0zWgI$UB++6W?0V8Wl6VY;QP>&=}3{9BAKMBjl<(lUkJ_QtuEoxf-k z<#3Lruc;Pos4;@w4hu>hq7V7vmUL962mj}4q&|vyCX+Ntep3%xQ6Htc9)_5=Rz}B! zKK>@WliKildG5U{nKc?i>sYOHfc+NrZedgxtpn3N0krw0HvH#xrxoloaGe@PR<+#E zbSjWKEN33aR3BRWK?k0v1(oD#!akz|U1t5^+HhC;c0n5h)x7AoxjOn4o6}jIUoTnX zPD9peVwtiNOJg?qBOfrc;%WbHS3vDXT;2RGa_jR0a%dM+W6eNcm<$mP#scnxgmr`S#x9=Kr6c zkN9Flk^H_>i%seCa#eUOcq#qI59!r-;pJif%<2EYqmxbFydsErT3^=pT(U^C` z5ca4->KmQ|ua;M&+wXG`Hb zp}x^c+AfB1&z4N_-&mM?U;apYDAo^=DXe%52=5?%9xOmvy|I|^A`d%1g^93?k+9hI zn8NSnQ7%tNDWw1%9PLGO{}K3i|0g~BHw@daU!hFh;h5?DjuiifBhg7y z{5UrPXXWN%vV0U)eJH2ab|Yaup@jCfE5J4VJyOi20&G7nQv}~HfbaEiGQBYz9cs>! za^Pq<*bk$hFGoT$R#F5>qfnNkMSbE5;Nmw?B;6T_)68|bk}(QnbT5dOt4HCc+dJ|0 z{b+1mGF!~I9gW{j-1Fi!1_k5yi?PGUqUPHr?spjn*S$@`(smq@Y|O<5`_Y)NGe~@@ z9F2X0xCf%sIHX*%6HQuUQKelh9CXLya?&<>VL1jaiAsv7+R+GVd`*j+#zC`QS>a46G z#KUB+CmCD!!`m=*Dm~fPIHwPE)!Rqm_tSxlG|3l!&9h=18Zv_Qu_oo25qy z2{=~sRW9QCVF+Z3BP04@&o>=ue^4JR^_M9w4DN%2r>4s%%&F;BX=fnOgk zQ}}mC#i@43q=b!wu=!%Kbnfo}Ob?PNCTtski)mNnx)J@cDL|%3r~c5)SR(&2Jq20s zn{l!v1^x5q${V&NDlFfh}0aNW+(Hani*78Soz_Q`CLRKxrpGso`uI#`lsb z&K*s|hO|xc3msVxh-}7aeSSV|mweRBbX?)jL9^0vsoI`eEf2@jd^K9Z{b$*?|4Qmv z5g4)cr}XJsIBwK!k=}7$WncgE((9rK_%DAV`Ll1~(9cy;sZ9iIdo7W6oC$;26)P?6 z!H-{$l5X2XqIzOKDQI^XETdJVB%YVIcaZd6~+J!5a%k;{olIDN3B#tob&sWGLDZ_$|2^jnhmj)mUK>5kI7+2R*Ub@1+!eCZ%FEMqw!|PG0DrKC;p~w zmrUH^@Yr;rbk2l(yll2hcFa-f)5}M?zdatWhGa^S(Y^38d#SWJG#2Abhf5yJKOU{; zEa}%XKgLa_nDweBHYA*sdoPc}>CQ66@56C;V*Obj!g_<7yG-#fH43q(jimt*%q{LD zQ+Qa#;Kie8x$*5@*ySKo{5M7=g~}82VqwOQNATG8dw{&2^^nTCX8bqi^p@n7&OLEO zTc-GLZ2eM&lxGDYAhH#m-PaX2o~zK!*321kR-v$-!EibEOzOEL0O3!+NbhHN!HAtd zq*lF|D=Vv!-o*vs;f;IJr0_s=45*hpu60GM)eh;fOAuyiTUCI^QGNp-SA;zhBS6g z2re!Plh&zqJ+4fuBCs9CuolH_}J zTsJWnuycO_|MYYFweuE~=k{E--GD1XO%5v8hTWS9zkIif4i z`zeRop=LaNBFBj`ZTY%c{QU!ijFOzef8Wz~e6bE_&>1C$!>17HO&1lBRdE7f?{Y47!^2F)ISEYsd9^8j{ zSE~2-!u*z(rB?Nwm|t;NivGg7#P=nV%^gp4kd{bF{X3z=s6?u>_P~#qQzhRdFDzCm zlE%IEK!H_jX~K9<%r3K*UTJw?^dob**JV$9KirIN_dT(0U6nkbjR&76WQtPene-X9 zUcQStxht$?if12~gCcMCAIQFn&}Yr?9_4`}w;xJ-ZP>TcutOT);f;Ow_DRRwePH2# zT^hBnGcx%3FZX>gMti5UPlI)dV{IkZr9SNU|muZQkR=KsD?mk(<4LH>ce`)tMe7op3g2=aQBq7YPl0eJXkHcwQEeX z!cge~b53?WQJ3VbSL|A6AuXE1`IZiEu#pe;o0rjZAUbzzHgm z|NQT}yI~cte^j$8#%6@dgVLO_<$5!eW;)}n_iuk?dv~PqcK>e-H$Ej*8`$CF$ZBa= zlr6r#J0d-Q&>q)oj!6?r9N^BMv+punXvyh_R=1WVHiAN2p4g zZQ3DYcz0=`zb#IjHI`KMIXmAV4D6P)0=Vbr z#d7Hi^I((mrbw4HY;ZiQREnL?`HWWzsZ`z?C%(;)Uf*ej!{1V+xlftv5fCE8i)A*j{3BQs{3>QrA}?}-bAMO zZ~QR%iT|nBZLpQEx3YMQS^miXDzC?5J|A7@@$Q;aQtu2iDB^ZW`P0mB(tV#aXND=R zA0H#t7qr0LiCv_?nP%M2_(-nO!W_1|oSK_v@V?Vo^7l7Im#>ffgL;|b1s^wu7Mr4a zhmL$Zb5qxv%M`JxCYbu~vUGcr1qKIQknG%BLVf9SNj=m8jd!!9*X)1rz1dxgwP^{P z;Tz>M{aT_2zkdSrJ7)F&Bp>cU#ozQ$V9DpRt$OSyJ}J+7VT8lF zedNt^46%xzkIXT|mQ{EBw{q@d@TF#)?qrCPRk!`+Hw@5*f2Y+a8sNL^lJqxF2a4r; zBu5o(R0LH@`x7)#7h5i657NMz$AwbFZynxWr%KP*hhUXnD&1|Vg;4_sOI3@RSFv@F zWTVXgKhaJK4b_F}!46W!18uDT?kz<&YhdF0h4S<4A84wpm3y#mvhl|T`R4^X=)>z* zwowNw({<$b7TO5q$J5)ezTz=Wu570XKYqNpOcTdC-ts@o|8IG<8Nnu;Cz*Z2{~zZ) zJoxYbjfK_wr4C_g(0_YMie)b9$()r^Y>hJX-jzwK*eCF`e2Y}u^`EdlyiEFdM+FV@ zrbya0O1STmF1;SFhHs~POJChpu;+BR6r`h!x}$nh%?=qpl_$!Fx8}ZTUe5U@WxjsU zlq<2{U|?-Cl#5lN9Nj~{^`jEZ`0tCpD?u0>lOIlL7R68a_qUS_UD`}MSn#u1>4~pOI>?aWO>_Gimp5kGuO1O>_-x0psb~ zNGLMpzF1AX;pJC3>L6>CF-(GVu_N6C8!MEM9B+vAZpv6%!M#z*tO-3fz}MmY8TT0= zVUi5fdh6lJFBMpi(uZj@cPF(oKyA8KrnB! zToV*`S7YzFF&g95+52gXg^kQSVZV&;NL6Nd86$=@q}9BijvA!`S92rO{8Gi}jYhEV z!X6e4BjiP^p(U@^sq5-UD$|GYIo>BX>EY)>9y{wIWULlGb>QQwwFX9YHpWChOMUFw{B`s1jH1*|WcnCl|)g#mUg*G1QA1MK^z zh15cQJW0?&U7kK-F6&~?2Ysk5)WN3&Jxn;M0oPt8%mvYeWq~n_>UDAVq!Iil>ml`; zF)mu`;w>L%9c23GYNLJF!+lt_2b6KdMF&#K<^lT=Z;UlTfwYMAb>1+Q3U z3HQ{*$Qw#%-lT!3zABjTKpnNs+-bFvd$uO1!jAW`Wha?UoUMzoHEMWOsLQ?N>hN*V zhB32q8v1FW1#6!7c4}huV-2*P#(A(dTKKY6o%^~p;Jj1^y}oH8>5wi04)AtdtAma) zniyE2h3gU8IQ~l;-R|-BZq&w!1})e^6Gv}rFu$2K;z0>4*q(1iMX(D=^ArA9-Dn!*75qmUogTHIdE}D2XzyRvJehsUQ zkbF@cC2s5yTcFOl2xB<&Xa13C0xZ)-EPL=wp6NhkD{JJn+6ZhgK?f}z{@vm4dl-LD zD@|ZJk@IuqeC%*P+ujwXIMz-Zue!HDxuGT|6t}>eRCVT9C_%DPhZ<+ne0j7U#~t-N zPES#SvQWdg`6@7)tct=*%myk~g|9FFkG&e={g?^;PX%H2%5dbKvT$Zex99PLv--jwE)l-IXtvD++M+GgH%TQFL zibmFjoANaNKUVuFBZ`mtWm>A-E!QkIEmy~sSQ!cnHU7W8cgAVqXlr$Nj?_dGbEkig z(uOi~s7n{JX3po`(@S~3*r@{FshSA&-FX$`7D;phHgAB8q_2Fx)hT4_vS$v~{fqXtV zbV(V8ynmdmP-gzVKFazk;izQD9d1fUYT#p+w}a6;1N^7Yd)+rcXiGIXR2rdAcU4So zV~p51H54o{!DjZ+b>hsZF@JvLE{3p+R>65y6FBkrQxj*5=d1rm(pkq@UA9ep+3xP{ zj$^=aNQ0DsfOL0vmvlD>h=7!Iw@7!12!eD8i15zC``3QZ-E)3<-`6!W*NiC# zPPlQ<%8WL_t~|}JK;6!6U(WjvtwlwpCM;a*s!UlE&P{XU)EGVYm)tPXoMCKL_bhL!(tP&~ z?U%8=BI(lJiuKB~`0j=^FZ+fNqj!1TZ(;0kwqZ<87>oAXVkJJcpSRXNo#*=JwiKKR zp~g9DLhdNHqN)v(o`iF=tu41-g)<&|3Ok3>JIH}?e}^&Xv1+-V;fnvTXOD9jXR112 z)iac9$}9|f5J{`&S_`A1$o*u4wfqv3`q{C*e}ly9$q(9Nue6Qi#7zgxUqtYC zV>@NkMPSj!PV0O)jkMnNJQU8Uo!YzApIH3q$XNL?u72*sq+Vg%JmpCBVC8biqwQ{) z&a;{u-orw;tG$2cs0d6gG~+9NIdh;gEW3nDXXeTk>9V`(-v`%(;{UzYnZx3dyNgTe zpxjY=)l|);e{Nx>dPKPu=gg_RLv!fAT5_s^AAg3KVff%n{_zTY{bvCGwh|Zgw{+Q? zEu=9Epr(~M**pE&9V*Ugi$BBk&ae6C$AxJoWR4DIL=UYsXM%}+V}`M25TmtT`Be?V z|Cl9hp9k@%vk4A{Kvyr z>GRCD*so!cH3Grjqe>Tzv`cip@b)G^RvFcxz4hp1F{AB!COW&g@ZtIiZFNZ`S$K z{j6#lPk-Y7acA;({`www{Hyt4RE@XB%a7a5T(I66jMZExUWNtJdXzFp8wW9>K)unH zAgWYx3j~_qi_`_}WcfEpH`p%nmErYo|%bPux zLF`e6M|x2ZTMqilV^GK6+?QneZr1qLkMtFO6e}C0%NT!#4hrByit>Jk2Qc2=k2se= zCiN8Gzsdyb(>|QpZ^~ageWMJj7 zlXstZc7N?5M*@7A{n&zGnLc#Ue;?+eoZI!*94hc;!VPJ^A9+!*&Xy$oJTT9W?v=f; z|IwCb_dK}v(4M&+JXxf5p~X-SI$_5*8`UqXc3ZvHjd1l$H}v^imfA5h)0eb`_Eego zeBA%6nEY7&3V}9!qkP^9z3q5B*IT}E%EEQ?pp=;X=~<1;dgF4mk-3t4eqSl>PdK0H*Bg(cd^Lz z%Xv&Mc45z4AJw>;O_=1(wLEuHfAiw{RX0BM@TFD-4>kw~I8)Pu?mc~!Z>eiM(u2Vk zo@B>LC(+H5E7Efe8t=uv;cgVCd$FfTzMv`InD}~etffhU)@dQ(^T$9IS?^LzVJ$x+$aQ+*ga$B(l!yxCjk zN3%&jT2K9$C!dS=npyd-sXLzx!l2f8F||nmPbPZOS>CWCuj|-u`14?dxBQZ{rUiIY zt{Ivky}YRQNo(6)PpT@zs82T!3azEtx#pofhalotx-+w42V#xdCp}oa0KA_Qb6o?i^j<$}QDLptVhP_Qpw0+RZ%(zokCd z*Mm@JH#+FvxwdoRfzgXDe$M3Ux!BOciOQ;<&JA~B{s1rBW7W6*?#U>lBVmr-%qw){ z`6_RDqdW4)ub%Ag>_F%m4;JroW$sB&?y1&)lkd%%8gAGt`)I;x7Z&XBrXa_aS;1Z` z7^3sC^^xY#MYx)@KRVw>smkbCWx!)+9`4i()1US<+2cp0lP>J~L3^@3cV;htj_h%w z$6x;J9V9(XQ~>Ag^)8hL(rc76)1w10==!{K2qJEk6CDNy;NHuTONW9e@8?Kst3WP| zao~w&t!foG&}d8$TTi?4lSv?p)GKxL3ub_DfVtj5Om}smd5vHueR5`fLB6ybp&Z)bLb7WZkFp)O78OR|3}>1y z4dtlTgh7+#In+#gqE_Lo*KypN6voz$ZZuJi(Y-b|@yOOZ5MZ_{kC`PGNVhiquy-IqZvZ1^Pa;+$H-%XazV*TkB` z&3(S~#T~TAJ8!j=4qmm{1uJSb@nf5*6%{M_QBP}o-!y;D*H`a!!k1SUY?Lb)z@2T@ zT+sWzt)ey0HwExszAPW*O_Va#lBquhaP_byOJ)f(R^M97A&{NRmGAw*U)kt7uDb!^ zBJB9-Kp>}nw8QJ$0G#&P&~{@WuRGZ2-3ruqTN8XLh+P}4*i{zD|MHj0o~icH&p+yG z?|*5}RAJpSgg5kS9z=Kf1AAD65W38c&`!Y&EwEuiuMmz&x0N(1gxS(d4L%h@Jz)%O zTtbLAD7@l)h&W>%mpsd#KD5HjDwHmbglmXX2!3xzfH;Q)_1C#~L-Af9oN`+zZ)aH( zuq=!|an?-iAI`-amc)J)MyPOv_%q?`NK$PU7S6^<^?WH2w0LF1%5Gr{(7e`!77@hC zC%Cp>B!?&1D_<^>$JOoWEibAZ^|W2qN7CbnEoY8K((|A-&6Nqa;~SlKfDftaKb!sM ziOpnldUe%0G02?jA=>MoniKp+ShM=Pf7(jhchr<2?Y%j6%9MT$d~q48zIUk)ck5K3 z;UusB@Argd-`J#n`k6PCu6$PJul7pywO1$mu)^LP|60CZ`n_j2R9n5aV78SX5C1i1 zrqPegax)r?^<$s@-d1(Yn0*$Ee(p!rLJI~y7UsWCb6j8hQ_0&D532y0311D@eKngR z{~J9o%^Rq{Rqfbyl!@lnbidX2XD##RRH})5M*_KQX2PW%LF_wgL6f*Z?yWFq*PdX0 z5eAhiZsDnVM_Xg?m%g)kV`a>pH)Zv+VCt!F9xrX@|L}!>rYbuxP`b7@p%|TPSywzh1w2IGfv<)5t1<^&`xvc`A&iI?u01g?+&l%2vt~UdPckF`PF#zf^h8 zhcEk_|IQ!GKw7&D^TlV)R+Fc%U~1CZX`2mU5PiAwW8SBO;bN>fr z)elX^Fvx`1pA8J_ZA$WS15J9GvGAFJV_nUeaNWRpy$j>Sb2iyy!ndwQ4u_b^>oNt8 z$!6r}=e3a*?Aw<@cwH+T^gS=)Oo?`se*3OD*B%%d_r#K$FN}<`GpCA+k?QTFVeDn# z^=BI#zBjOKs67WJCzB(uDaWsp+4M+w^CkmFgsb%FX27k66Y)_7K9yQCuCiB-y_h_*?t>6Z2%cz4u^mx`BaHDqxuyqdWpLZcUfpUSo6aH;7^B z8EG@KV)$>735Pz%F|2(B{_ZcIJx4QTiN`VN4>Niu#1WWm!LAB%Oo+5pCSM$-g;rd8 z7t6pi=JI@uAtlU`BfDb=d}P9zE(z-OD=^_!JlDI*V@h+})2o@2yDpvubuBdW5|7Ie zE6V4@bETOntsg6&w5GD`{Nh@bAE1~$Rs;UR>USU z=%5wZ=Ms3mqyjl4aA}Gq>%$W`WNxa=q$Fl^G^5?^BpSamXN-Lk&xQLfbTiOf9_w>2 zCJ`4PUSO%i|N6@Wh(Cn>F9Q+K$v#3B26zK$`MPw>@*D#mac9jiZ;J8%F}qCh`3uTk4l5;i?*F&@1Js zR&ZwDo@ffIx+rT)a{;fMxKUAa`FC7-ksHGqe|H)UiRP@MGk-pe(>v$1DbeXX%>r33-u)BF&uGLmg4;cQuMh4swZgv#f^;i@thmvL85r>3!UA` zxfsh+ahr{|#9(jdLS<9=C5~{#u}UKK&ZuwjPGHV-Ph$5eHzd-H(OF6Sm+HaDdx@C; z=+4$g2^^32!0G!0;tq=o{WpR6(rQnx6VK`D?pSwBVpftD!-glZxT`eT6BDsiA5rjM zG$DPx81g=r#87W;*~HRCoaP?qXqs;KCUbur{Z@Npni|J|dA@8P7K`zLHy!S3USezj z>1U#GcJt*!rx?Dk>qqW~XzIT3B7b)R?w7oIVw%7+^$=68#qn@3 zGz?;Yg8VR}y{Y#!k?*yySuaWCSIww5`Z|&OAG~=yTRFK?{McTeK+Ex}Tc*S-UnY>g zUE`RzSG~QSvtrHAo66TR*iV_H(k+a*9Ky0K(RB8;;9Z+&jB~9xS}&UE^~L!di{g-K z>Vl4uT;1bH?CJ>CI;hV)97*_jaX;fC<$vl*@!bf{2v1KN5kV#4pnXP$vrxV2hIQfm z{MmyK!{k@+m$DK%sdj88Z@}L}=_#DE<15t`{amQ>Dhek%H_j7-y3g057&6q0Y#m3at*0=Ra60bw=Jb+K7BA9u z?H9sduhmm!gs^nHaMvHScMKNyTpWQ-7jI^F52x{;o^-kv#+`Is*CWcUE%srgaMOAz zzH|=@BU9XcrDpPjaP`7lI)#VY=f^ybkgic$f6akhc;m-(pK$5H{iyJdaN2+XPBaK( z`$c(67KgI(4{uzpqq$b>P2jpn4*uxFKKWlZSFgWfb|h`1{CM|kBzG68E|4+p)4%h*17|C5%Qn!M{`w;>UszE(Qi_mNQ(v zt@iI@%GGTc%)-6WcMK86_c?^zMS)B?8bRN>!MMK(XQm-U8FXQqa}VMEn^4v`h0xwQ zlr0fqUg7(aX;M%A(i zKFQyrUtSOc8b;GYeZ-yhQEb~Bin;tGCg?k++>2nmSvW^6B9!kF&i&J2yzCdo*fUX# z2vpq|s(F=+aP~OKze0V4NniPz?g{7g-U#-q&hxq%imACgE|NlV|0#mo7U8(-Zw`$Q zXW#57D(nqob8C57goknDPhrv?VOVyJ;q@P()L0$G%=IB$T^-F`J$I8kDMQv6LUY|G zdyilS-x7xRC;$^-av$0R5i1Psv}&sMnt?f|o^0;YKswg+W6Cc<^bn4^MFVEZDNYE=Um;U2^!C*iYS>v}Br z=c4+mLBewbEW)@}Tc0Nkcichs@(ID}r-Hc=6C&^XAm(UB=>B|vvKxkx+uNV#os@-> zE&Sg-lmoAWXf`2~^bvu)Z6D6HVSy}n2_tM+05*d{`S(CD6}yHLm#kxH8%|WMAU@U) zr~d6=-bID;>qOy@dS{2$^;7O<1U=RT;4(CVR=fP^W*W(%(SD?Eh-5>YAD>P|uwhFe zNBTrE-Z7B+jiQLJA$;_F6qkkHp1%?)jjbOEk|XiPpmhS#KMHSjNW^x!FP$$1NrU98 zobnL*m?|f^Vko(uKD-guzpa(l{2xNGFH+9&<}iMj?}yL5Fzj+Xnfi4YABEFYnjKEa zUG=n8BQ$3(+@?+hE4m67`6-N*uY73YtiHLE^fc~z)@OLpw@Uk-LP%_|MciY8b7sp0*i>AuUI*eX#>wD;xpYprcVozSRYnIgz;6knUh_6#b-+c(o=PYjFkJ z=S1p5 zh4tQup&_p7IMOU{o@Xa_E5@#BiqVHS!+Q6s>j-(`M##W!-Nm+S6 z|Lsae^*Wu$3#VF|O#9!QDZiF19LR~0k5Wh(;7Im2%G~SkK$Qi`AX_WFl4H~t&BKaH z(ZnCO<3K;HCkt$NdQLTrG$}p3W7z!Mn!q;*WJ79@zMl3t0*fGjI7F*#yk*YP%i$iSvG?sA>q_ub*%YESCK|I5%+c4^I z0z*HFn~zTTf+sETOJvTE_FVfbfxywW9Br&xZ?83iIkkT)8HF$4vvRezqp`&lH9& zwP*ILWNuv-2XCLknQ!dKo}gaP+Lm3NlbJW&n#W%!bEmEFsTV2AF16&%A4VdC>r`51 zWS8)v7Sj9%H??8=#}r!5lcpfj$n!LDz*CI;CtNF`qiTVL;#mA+h>kbs<%nov#8tO$ z9nITb>go2!P_oS&SFIDKhfH-pHSNs2tyV^j_Gz)jy;cCE6_(#5r0b70luKP(u2shdO zcM>bdno{PT^yTkUQ`GYd?|8n`z}Na*%OYVB56sv8T-yi{w)jc ze>Af9Z!;#>Or?Ro@8uFB$JFN$oH06&@SxnbG^OTR_Up=k4UoVR!`NTY& zlFj6P<{W99&8NdAxJu`4YOv%t>FW1fw`Q5ObnwCh(iUYAJhuYdmMULiks0n!a@0@i z7%%6j7t*|-a9GY7&YHK!kbWQ$!l*=zw%qcI-!+*Uc16=dyE?(PTITp2A zTM-_m|G(Olhb!b0P;Noxy7}zyWyKNid;&BJ*S$l~Q92Oc|R zf6-P|()mF< ziMd?!v}gCS9BgJfGGamwAqHpOj>w^J9c!lC$;HCdj{7_FxZKGB`w@A}eoN%yMjtvOn<-{)gshP7iCgMr2}|E{>^3CdtR#XzrQIx8lfde#{of>dBrV+1wu{4(@3dmDdZOUXaC#&8k&z zW%4dkGpL*7b13{{^R+b2Ei_}MrF;OswcwZLY1FQ1O^?V_;)HVzJDN__m3qgnrDH$H zf?CRFI8smE;QDuNKT85frqN-$6??O;DclmT8ksoibF$=jII_11yDnuA zZ?q+^b1MIKv&W}@Dl?kdvHPKs1JCSfq-XGswUe@yltZC4)za69~!zq5jG=MoA~|*gu_3AEi5LmBx=rntjgK`Sft%($iGt7TEH%JcC57^=FQx6F1(T zu&3#SjSwg0oldWB9ppif#=aZ29JJ8&NEg=ZohhD0`Vm7WZ%v)3av(#!iuU>?@_iiX z%y{1n>W+41X+I;6r0W>>t&!R%T{(1FIT|fox$|2xUuS#LYnc2Y#06WsXb&?87k($a z?2!v?h4YPg;l{7=nnzeJ&as&h=P(au4o+d^_g=h;O`&~(D~pwr@pPdZ<{oKu)%}d0 zqg)N~7*pRXA7qL*kJ=a+Sm4DA8zWw8+?c5QvC-3mu8-5$*g!mJXc{+seHbYPiXg`=__^W`u3$&<&vnXLU&9(JJ_yx8W$j_?f1 z&U*9NIfdcZe5h`dO!`(oh6#tfW8q7mRVf^L=8xU3WY$^;zrJl?QVnGeoHJ5aT9x42 zM$ISqv1X~(po#&s)1ELrM>G6gQ>gxR5TS<*ypZziArRbCi+LHkDC_ zf-yTFKMiRPUjLOrN_GJD%hKsC96b2DbPiRO7Gi?FcSbr_W^ zrSMDda144L${Iyb_oaayk&$fPZXoM<2>V*3^5(5HTU(6u_#uo@*+y}bp-i_kG9xX5 zRbx}Qr_XiFNg?a62JI%y0)BCSxrR4%LyBg#9KPr|`7bF@a6hjXx&k^XK` z(r~A+dU!Ogv`3_$@uo?+fk#b!xw<8ZU(MCu#wD>!{PkJkmXX2!RP3I}JMl(Ax$!iT zc4LK00=qBzvvze7ms$jn*C3H!;)0ksDv>=EgSdG`Pea0TFxLAsTLoU7{d1A zI4Y_SnlvtkI@V#dzNB1T@i)=J@iwG}5NMu&ZJkh@Rr^fc62`mII2yK4|2Z+1mcn4> zJH#@4fIKRbW9aftFyHk{qJE`NmKZc2(^a|9#u6xVg$TdqfQ=}9#Io{SQD702vZ(aO$@W$H!sv+HBn-ZYl=pVY$!#&F3c9_?DViG&@b&l4jFaY;vJE7wW~xJ4dmpQxqG7hds56rb6ck`W=a(pFZb!tg?VM2^(>g zXYHm?Jgwq!{1BoX0)1Z1Xgc}DQhX?itM!DDn?_MwNnWx;bsUdlF&!fgux1=}g*mKF zisj*2_1@wlvhPVJnWB1prnn~6cQq?&?n(DPvEmT_<|ir2zYdq)eeY8;PuL^L-- z6Qr?qD7%E~0JtQAMrIEkDd!U_&1i^C3K#&h+nL!&tNIEe=0 zHs}9l;48ZbZgoheLRmN+78#hE7sfNq)Xf&wx)Fx?-BgUBVGJ7)$Bm#6%p&8t872H?ax5lA z!BqGojy1mo5^+NB)}=u5*Q)MTZqC8?iJa8D(l~hrKR)ZLdEi8nvxB(4PyJ5kKw>Qo zShowL*J5UxE-V6m6xw<;%5o*@qV zLy~6lg81N{%I2 zwUHCT0QW31(xE{R=hme1VWGJF5ot_um7mYhH1?)RpV%su2}}Ki!KATL+JQsmnt|LO z$ky9woZl{8WE1UO8~qsSl|hk?ySz<0j@mO5`lYe(WB`lpGuWp+`RioOMoLGxzGWt@ zr8k=$mOwo~s7lt-X6+ z7PftSxn4Jku*RZSob)@Y-VPOE$vdMkzb!lj)47DsC9 zLEr60Vmi9h;*e%fx4ChAqY*#lPS?|OS|I(^3Tt^*{pvyE?rBt(mgsO?8u{P);<_xA z;W<8xxNqcv^kr*RV=NN4KUOtg58-k1>ZUQ<*^{$d)0h?~ec17IroD4xagB6-)bBsp zoz512FPb${#+jvRus0dJ6zAEkAcL>|@#dLTCYjQjWv|eEXyk=l-FPW2Ns|ZidJphm z{L4%{gg-T&nMvDx)l&Y-;EVNUjCmIS1JUx~{$IW#idH zoJEReqL0ZRcy=~Jq*E-HSN#9Z_ei@Oc`Qgn{xO+qgI(n#U}Q~!3x%deTy34@$6;i+ zw5X@=ihC~7ti)0ySE{(lzb2J^lU(tCp28pU#jQO*m4n~Aa8d7XSRZHZT~1}iOzF1@ z(rCEXk?Ub;oRE&_cF$BAwb0+kq!Xk$oPN{N*d?y6YjiqqoL%@RPx30So#^V6PR}il z)LEI%qK^*T)bsT}-A?28={VPOB~ZWL<&q0~V>7rbT&k#J2EVR!qM82vRDMNyx{fx! z%4>R;!8`RzKG!lhcFvWNH#4{*ozQoCGnlu+nTScc?vow4*fxtl8#-`lb0*hkx>D(f zEJj96eWVn#0YNSAz@o7jo%& z-kF5ixpZqRALWgCxZiQavadYzRydG5J(Zj4Wlnpga!t63)i0@Rt7*%s=u{G8ZD<^v z#_1|He6~*KPyOEV3U16oU0nWM{7H( zz0mazwq?7X*Jc*hBu>j<+I1_I_RSCnU`fA|87vllw8=aZi^_J?>72!+qjuPI&g4up z&1ik2jJ<;vG`7tmWwte5dj7nYOJnVp&Ejd+-1{dRL!uSOuVu4jq&+p`vpIdzmh}^| zDbk#fe|avG)<~mmq36=Wj*Nl1*mSd{NtQAjM_W_+K9>fItyukQ4kyLof1I30-YHxD zOwLn(FC1%C8kH8C6QK9-fAcTVJ=6GVyD8;P0eV23Q6s+-9_EsI6MNv`$E;(vZiw?1co z!Gqop&*st{bEXO#xbus8=Ym|W>^GAxU%j{Tu7a#{vGp}Yil;As7ipUN<@0A>QP#pQ z7Oa0QuK-62VQYB=3^WtxlgF*sCVV(Aj9`@oZ`bAFQy_iPKg!hHYpOa>83(5-V74s( z%jc|}P=Tw>3fVVL*k5oVH|1TGJyL!T!4*hMD8~Mc3BmS7{M*TlVXul{vZZ*HB5dB8 z;s0GBQI498iYnwziwanOS39~DUR&=y@a4!j+6(N z^75P$;WbO>pxNP9?~9dN=O$1263q|W6Lh+a%o0a7^(mvT-px0u`TT4ty-aoi{q-(=<555tYiq_fDj;^6DYYiTZ_<&s93yI|qCK%w z^D&X0orzLjYimzeeDiaecUxF>qDoz9AkXcGf!YhE z9@gKL+R~+@fPsCSsN11{*3r&hH$_-k>PZsbd(4AFYd2HUQy{>kyd<8u@c07kFkG&W-TKOkOy=nAwHnpOq7apF^ zk9HpPPRiq0xb&U(aygafjqj&iW{QvhuC4qzKKXLKq42gI9^AQ@Px%8+2G+}G>Pl(y z59XVe?)xZnJsd6ZO&Ykgr*Y(X|TH+sPZT zNde2njk*^V;@rYd-d0&u_(j=~Hrf1iUGocdgx}c&k^5^VU3Uf1pi?H%Zh^wUvWZL! z#62pT$D1^Jb2^Lj3xe?yjyio*2(45@L_GAvP_8v1z@MdOb2O(d-KU+dhlTj(f3xLt z7|N%&S*)@ZZ=aH-{OkiFIz~zwzf6HEt2j+^=%@t41W%CuQSc5~EqsY|d^yqij%Gqr?QKKk z{o$L-hh6db=j34ajr#P2Y?|nPz0ltCX{LIQZkfyyzO#3%{6{KDi;yW_UDGfQZB8dT zPgx@Gw8smln3*R0vS$RLeNzdk7{#ftQh6^OLyZN>iIH|}{+tv>e3tjAaG?PAa83-) z;Ps;jPS+AHtK<84F^zkFMe&0njlKh8r1>>+?Wktp(sZ8ZA_%XXN!Zc|qFZLrZiIBz z$I=RWoUTRO1cl9;1xxR1WpfaR?V&{XCigs|;><#}c7EH$&&? z^g%ho>gS_X3l~_$3CGM(Zg(s{r6=PrO<%HYGI!rd6PO`A~B%U;HaZSRQ z_Wf&M=-XI)RiiJ|e_vU}NE7ib-6pAL+LFLu(p@f()dOz_!J<@5{RQ&M@9als$3oKGOcQlz=eU03nkb+xK3dVs6;-Xcf%oJwU zDg)a;)W`pmMzxm7c#lt`pt1U+7pa_$QTDTo&L`Z+uofvS(lwlXI74}t1}02P=UGV# zjgO?UbCr>H#p*E~Qh8iWdC*5w=&ByKS!3}w^Th?J-rqdMK>a@Q4jz!gfhlPOUo}wD zB$fHa$?V>pN^|x8yXFdG-YETN+YAn5C(F-D--UFH!{UX58%UG4Zp)X6tot#ZBjSV$ zos;P9o~YTxM6BycmvmDk&a9du9C zT)a5%scAG_mcW>~>FVc|-#kU{^v|)>YH#G9uMMnASN(o7Ni|tIkHx{x_Q>EuZ|O$g zX3|LS%%SV)?5&YR@h=&y@|8YR&qTx8;)?HO5_~0|#?`V(k&lnzTe9N*zNM#v8$KMx4~R2n_GVrTJ*aV{I1S zUeQd_IGsm!6!ufZF^m#sI7iv-(suWLp?+daIB#2JGhf=VZ^d0LE)S!3+Z@`?lfUqY zEKatHX4k_k+DRicrgb*y(gZafoWt7Mk!*L$A);9X2OM*W7Dn8me=dt3hv2#>hibK= z2w#*-?#Kvkl;pDHn{XPm%VTUzxN4<5%{6L$!?{Jtj3b6WS2%eq=?5`kfT6>3n=OSf#AN>^5Wc@7P?`V(l9 zqx0~iUyWRvE|H$6c{b121@kIH_g6C?r+Vh{<79s({VlF^V=xm}YrOUc{FI%46%B8NBLu_4d?Rz;q8sSCViaDfd*5cEX zT(T3T_sPy>vT&25A9DE0;E8Xvyy;D(OFEm&u7BMr4OT5#;?DG!c}yB0UuKg$isyL} z^iVaYG^bm~=5xHE8%?L@5&i4`^iz5AAMvJhpL_<6){N}1e0E85y0taTkd|~rrvd^z zJu%HG;Nob_%c;is)>hh8)#$w{yYt6JW#TNdnf98nRig)><^ zEo67BFCTT?9D_BZqTXY<=3U+Q6f>u%bX~5+G|=ZAwkT%y&)&HFQcR>Yu5W56b3yZw z4J=CupXes+OB}m!o-@tGnGbSh(JB4Aie^X0<}p}0oj!H)nR(NJZB_G`*wqP-hERS{ zzANpZbG!q)zSI4#=E{h(`Ao8Q#YFe}L`xUy#TD?MwKMhYR7*$5dtq=Pf&WNDY^L{R zp@VdV1$bua_ti5D3wLItcOl1GJ7D;)kV0Pv<*gS`KE##0yG3j+b|bz;k$hC7@t&qk zOL>I+ajA%5I=(+g6!CbD=HQ}Au+{gj%qXUwW+mU0_5qNEa)bA5|}*S&rShE;;$~z%f^^_Q{6H?V(j2`IF=paK_P^ zVWSHe8)u1WPys6=?YK8jKOb20F|rWHHrCvFR`6v`>t0MD)uqQ7)w+nKns?jerSlB4 zBW7J-h#xs~uzzjrvbgmvpQt3RuR(oA~-g#la;UUi!i))(3G-||w<^s%P%8vWGyuUe&E zS~$+os-o0$z#gMe`LkRniUx!ot4w# zeExfA&gXKlIU)R~Be;*LpcRMONoHXUOe(tGXfgk?l z%e+qG*@a*9D(klve!)eCT`i<&zlHJ=i?|eI#;KEqWnO#M&hnqLqW($0+bcl7*757V@ru!edj)azWLnS2X+ zCYFA|f#$a?{c;@ZYv}#4wRp;JX3ua!g&ZB=UNjzSS#`SHbrL4~6suh@9 zxty8(%_;6$&Zgy-wA)lJElUOJT&ux?<(lyuUY$u9cJy9Uj^k`QhRm!kdfTK0UMUY*?Qj@+tIowUg=j0~u*THlop z+p6Iy{NmA_s-znqfVv>NHIBpxNVURC(aRS83I`V&=`~YE^MD z_%h3>8s|Sse_x?G>l+E<*7x`A6~KVnRq{dH+_sK2pZc*OKnhKhis7mWKW(Xi%{19K2 z2b!C*9$J;^8|`Vcw<7t)(s{U)v1F(l{;6f8-ge=)trc0Fp&8&2WxSO~*x(~&$~Ths z@_Z#0H<8bgVtLaIhAy z`BAz~ez7wHc~-rQ)zv)d@}e?THFtaM ziE?^>^XA)=mHAKp4JX_x6JVqH>YkPGx*)Cal1e=PT^W%M`aF3>G`v`mc4fZGN~+Ag zj{3eTm1#Ch*%3D?@j1YcljExpuu>ThF}knU{8@Ls3j6v7k=&*VZ^fxC$}Hy6kzgFO z7rb5@O3VI*{H&RS0<&U%uN}dqnuY8w)V%Wz2yEjJAvvo235<)mJr;K5XLuqkO_~1U(&_9>p zSRAdrx|p|ng88iL+2e%fS|?Y;WPb$DrBcH!0z`Lns|nsz~1*MsTId>=PG!zFj3&21&nKwIUXpU%0nIf45e6 zz|lhamBkX+wvZDAv6u^I98))r#d$?UhKR?$seGGNv5Yj7@NjP|qjnT?qNjSRWyR7( z#j~hpF*|=vpu>kEdif_Y?sg&9ZpYv(y!5g(OrZniQ+!03s3F32jncyxl*pe=eficB zt)Gc>5)M16fix`(iYVVG-Lz|w>Xj5yyB0EWQZO&I=LKF@%{``obE_hFvsE}xNE89z zz%XeR%4_6HDnz{7)Zg8qoEGy?gp|lM17N~Z0N}$!t zTq=E1FIHbUL(+2(T$jU!e$mWsrkZJ23{4vm{2{7*T1Cjw?`f~x`0os&9G<4h z^IAH@L+NDBG2;0)jpnJsXT-O;{3VQ`ZzlGsDVWU6pzUMbL*1Jq*JP}|$)a$YH0}1% zR0@k}A-;azF>(7kwzk3~mbJ;iSkcI|r|J{eX)d?6?zObnKH}pqZWDH(>o(~Rar)w` z?o^iE(KL%IkEM$|oJEu{l5D>m;-&4l?j~>QGX@42h0%%g+bHb#!@yLoe4m5&AR}EX zWz(;f5z}evr|+dGcPf{*MJar(>wG}@P~(J6pBkRd74enMCaKhpQ2*Cc7>h9XE;mwW zXrCj$n>2RB=Q3k-8X2nl`vs&DZIMrN;Z$Gm$;PxvCX4kh4s^?)SeX01&f?NvI{LXWjrp;K ztgV=;9O**r#vA!0F6=jHR^Ikdzoh%L=2Q_5*2#>^E@5hxfo4xK>7sWx&>N{+<`j2AzM1@TgjY^C@VTfahQN+}It@CY`s1 z@Uew;3OM*zjP#Ou3|S~G(5F0}==`4U&u7mkX^VP`a|nnh@?ilVLgQGPUc`Ri7<>Z? zu!~EiPF-c6eTrw=FNHij63?U!Mg0CwdO3$8w(Jyc^cH%3NR%&EAs>Xb9#UU*M6*sI z<;66!6`p2OgzKzC=83DyFzEYyOX!`Oz*i$mICLuxFI~4At#n_0F6L()Pquq0>AD`# z;?}0@(Q!N}VfprGY+sh}+lyF|Rjafc9K+cAr4;_CoUgv6th*$i>f>dsw-?@~T4Ru~ z=bR9f9T-hbANA9rRLR-4V&in?}@6gR6V&Q~*(s$HEfgwn8iMV@8}qrY8IbD)tdE33pU`DT}Ose+A3 zsC0xyoOvW)uqxsd`v>vQR&kbLffR_7e0@tA*~aSUn)zd@zCWW}TudwVy_y+K+*!ih zf&S!mRX^h)|FUDny#FeMtVty}57E3~+W&EM-tjfwe-t+pF@g+<2oWI&5{bx=@y_1! z=4RaNy{Nsn7F9*ns@l7XqN=e~?V@V0s#059MQPRiou9w*%D6YrbD#A+=W~XRlXAvp zpNJqe(}`9?B6&Qv4V{Gp%Lcb5X+|V9OO;a=u9@y8X>;wPXrC&*P*bf@lu2_bC5jh5 zZTO)@G>)d$Ob>{r)VwVZhDS5Dsrth=N0Z{_%(K!M-j^S-*Uo7A1hitjQw&XBJ97Ku z7*YmH*VQcst7C02_0<~jSu08kVo5pYz}H$s-;?%q(B4><>~Ug$?Kn0&I&sTCmM`0@ zuWYy0*yCGi-5kd-@km2D#`AD)8@^A8qn`Mz^{eB_+0j}&a=h|b99ioY&oFC8_L(Jc z>wyE=T3eUnK-IDc>?);u8maCDt*yPzMX%u-43r zM(8{!v*X+P>R2$?Vrmt`;-S{GY!}1E)(-3oj-k4`B}ZRJGjNbSJMTm@PM-8x>YB7# z+=5_-SU!@Ds=Fyx8gm=@O=DRpUTi^lEZLLnsq7caSSLGnOo-!m2U{ASjOUw|R{YQ` zj^j-nXj2o%ojrEciHv82{D$_w#M5k#H9v>OlkDvvo;V(>vX*pqO`vxNWxm~xm!@91 zUnAqOIc3Xkw*>zA%ZA|r3E0^JXJN_*!dP>a*Ig1#zpYIeuC@0BKWiH5bKx6hhzT1WlP>6>TMX0vluZ>8 zL)|h<%GSrwRXk1UmKZv9vm#O0WsvkapUjEjh_VOz43EV|{MP4Zg(>3Y@5>T)8K!L7 zk~nci;-$t5V<~s&lp&5f>*dAJ`S8)OW^6efFWldhU&q9g-BJDNN8>Q=YR*VuTE`j9 zIhU5e6eXpoSi_uG;5yNCldKtGXe_|DUEE(mYa!m z*7m+%l*B^qPwKykG%_gD%`yq!B~7`Y{kLA;m|H`lxjR67lXEoVds=9{FKigmKxAw* zD=DayVbr82G0ahh??!R>oe7M7DS<*XL#eYwlZ6vpRt# z%NlUWlt{-JX1Lr*WWno(IRBNTENcr2EEBmdeynC>BF*Fz@b!u&P&W@*WVI5vwi+{&YB{(L~ zcB=A!>=Nh@A-$7z0&SwjXNlvn-6?-s<3yZh)uqLdT zxs=HJX6k|eDT$eX$T#;U5m)J^rZr2V(E?=&XD9L7(puQ1Bw;vFpM$TG-sSBaEmlX7 zOC8N8l8N0~iw)Lwc~FvqWd~`HtW&U&kIMCzWcCC$WNYUXCUk5hjz5{M`)gryG*voV zbNX~oW%M2kCe}@rm$IIGzNu`;Qx^U9RDyMGuJlQz>nmjubx)(hvp&Pl85lp@oLc`G zn037&hff=L?@Db-w;I^#Y{B$427>R`W3GkWo`8^(&y7gbUd9duB{F|zDuWMhw`@{rz=y+oCkF?upQlmU1!vH z>>^J3^CaBDn=2njeM~c((`RoIjrZ8_dEF$&Wk`o&lf*h@sx|USA=|==IQ17lylqX; z&1AeiTky^4Bv$lResE4If95I&CoYxzEq2uYBALB?q#3j^aCM3`ev4AMWY&UlzNzE} z*>O2GmEF3x=FUi=dulU&KW3n$wR~RDX^fg?&G^d(<#XBMS1(N(K}$BTH!%N!E#CG9 ztPbfO-6ECO3!3m>uu;17ro!V!rt04DTMHv!e<=OXD+9YbHRn&#Sy5t5_ADd+ov@`m z)rgz7B|Abgl;zWu+4s{~n5$flf6~b?w`0oZMj~!F&?wv}?YS~a`zO-GpnT2g2@LP- z#D#P5WUjQwIV=hL+YZ!K`rz1GS z(9kXLN*i2TrKqP^s_4!@K ziK^uW&dFc0At9BRkJ~dgDV2kM$_Q{t!+d{xzNnkP(A~;LzMeovW=Bd_#?$ebE5mB3 zx4TUzezZ)$|4e6g7R1wVMhBX7NMg~vPFQwIWS+SjJ%3DK?(8ng1<|z}?#l5i+TYHd zxs;HE#~N40|CLDWUGW&Pi7eHOw!$Wn$#c3ge`5kke|BTthw%(b(i-pAWU?-IpiKK` zKUm%qKlO@h23goUmD*$6=o*~N+HT$C+esp2n+Nj);<>uto$2CD7l@a!E{f-eW8L}E zS=+r^9X?wVFiLm+iPkbvwOm+#HjdmMl#|gkj+TG9vRb^_rtr=fH-j5LoG zKcj3L{r$vmP|+T2tww05-d-fzk520f~;)^!_HQbJZR{J-}MOTe0%UzJY3XT`EGaV*>=r? zG11Y=8I_)(ca-v0=aUp+>iv-n;IjnMN3EF8Z=|rTDwqe%NRR_Ci?ti@oA4&HY*U zaX2RN4Ccea>HU#EuS>$X)u5Z!yO!q-)(7fHP2nPUHsY25C#tR=S>H3 zteJi!^$BLXc(ggGnzwE0#giRjls5Ipuu zOrLpL088ycsPi29-q(EhTi7QY>)T2?%_-sB_6_Fx5NTSI)rbCDxcHMmY4Rha)eWN0 z2azo8tYatqU63Ws_O}rvSom{rlW@j%Ukn8?j9lo)pw3bJS0di6e>6>7^pcMqcJA|K z>C|9WxA$RVTnN@b`k>_+4)Ub@sqH@P?#HtuAryM_WL@tt7l{liO!_ z)7URkx$5s=^Dms7R7}`_V`E z?Da+I^Y%yMeor2p1u^vhPxqS8So&UUhM6fz<5jj{_6z3ljmmpzDQO`XJqp-N}QwzanfLCt52+YRur$& zyRttqnmlETxM*g!%0;<(@9Q2L;?60v7{30$t6)kD4PGdRPq@49bI; z__~EMVA{sL*wz5hBC=Fft4RCi$r*FbflYdRuY)jQyNX%cq)~zw*I4d;-r^~ z+m*mm@nYFVJ)`e*WtDp(k4Cv+<&(g(aUS?h(z8<87-OF%Qof-JCqt5`Dd~)*e-aMK z?&RoMy!P|1r1VcFp~{Wy7s*&ybS5M%h7H-$g*nG?qe%Wh?Z><`t|Y9E<+ga1bNk{L zE+5@|&9KTgD~C-prrmqAM$mC7QPxq+jyO7tPr5f+IMDO|TFZD2OBeOTGoG)+XNA0s z=U@H(v44bj_q!^eI1%sajx5&p?MatsbbmZg1}f`RxaibZ;(^8_@N0njg z{=3qasjMEYY*ei^Z-qPK-aLgque6<`lgZ6<#a6#BzphLot=Wg}RIfnORQ8)Xa`fL6 zW?G83`YRPL@mmcW7+71U14}QZlDxr%Z<-qL(ChyF)xh38&ip(o^qvz z97&+@V@IZ3(fR4=$f+d>IL9mJ$yPY!vNFiLlc+q{n$OP&pF}A;O>4wn9hK{CuTIn# zPK4>WEi82+dv_u;FSOD8hEjxXahU-U8e781DJqKD#c1Xidy#zC6rBSDo10zgEhCWih)9nO3Ka~Z%H<1qv z_LyBvWW#%QobI6+_%0jus3$Q#v!(o^$vB4Daco^OUw>yy=YV96M%ysuNV3+i;!S32 zO?*L_)b&${`%4*hAEmIPNlQFFO`%|s9kBybdDX>%p`od`ORuy0s}$uS+cGgfh2_E+ zy>_LN9@&C}%?)(fZOzUNshZ{6;eOwMsf`0~8>Mk-v~)hH1_s=)<8b>lN)IdRdWeC2 zmA3Tin})y9hT0Q^IkwwT|6ZDW7Sg=06DF7>55*`WU%hO}+rdUWl`YYrbvo50%DWf# zxOUQ(O>fh2zHdXjp-EiaW5tWgWMyG1|3~<;jd+ZGYjm9YtA9#s{;Xe{@snE$gG1$` zib&!5G5!8t3Vr3XYBnI1ppTkUAS~HwP*Xa8k*ba#OFDll45|0II7wJjn8tNMD)Xd6 zy4l)5+s*1qNHOsDHf3_`G-w@S$>}u)77eoEd2pJZS4}A#lg9p6maILK#u~j(&BQd? zcw2KUz{t!y&6utI3#+!`>s{%bb5~b~nYwG`KU*eD)TUPxHrz=k%fpIppJZ_UN;5)+ zrgI@m9S*}X2v@hvR^JR9^}f+s!;iVykfG)&nzKrOBdmF4i@9b}DO7YdXVD+Y-2S&Q zPU}**Ck$&pOV}pG0vlatQQOT4&q&eS+?*Ox*>gy|O?_c(Vd#hM)(R{lT(b$lCfe20NAeWdF-DD2tL9J`k~j?yDd{xOa4)eWW5NMn|A znx9vtvG%?>U#&{RC(?|xZ-fm!8gbx&k%{{K1J88aKW;$NPmJ`RZ_c1m>2$qp#>&sr zIU${o_vm!KJZ8bo{0thNFqhvwgNSC0luw<>PM>kc?~`Y>`6(|=+JjpBq4R!G_M70D z#YV1%*2jNS8qs@{F{A5uS+Ck0{L{#cWA(V_Yb4>HI_$eEzq%gDGv5TC7?H^@ zrQ(FX&g9aC`h2<~lU3iF^RGUmJ&%-$l%2_-RB5^@viR(qMr=Kw$9nUaK_= zubX)G(u!@L#_NF6%y1 zo=92_rH_i$ueK1(sN$FjZpsIoZtou1{7GimmbvJo$t z=pXAs{{<$BXDF|{k%>BImDym(WZMFDaqiC+Z{9(?n+dCf9myDCqNbzr3NB|+TC1Bh zq?t50(HMdN5cmOa(;GU@Q-@74eB8Ol>z7AHaxM(;OVi}44aXT z%__~H*67+_<-&|bMzZWX(Cj^3D+}e9(Y@lyOK0-hX3+h9TjDpR)4WYbzR^8@j-?ZY zQJG|Pb79e|^miEy=l)7(rPel+Y}1v=+Y#?x89Y4QNjWSjJnye;3h`E1GrO=z&p^jf z?%dF`VgCtb#)$998Scu0Lk7*rI@6_g8n4E5QT}Qw(L>y+<()!Uw0t#bMy989p|<|6 z?`Q5D4ofBS{qB6;D;0bBC3ZbZ#;dzBY#*d?@e}bUzPiUr5Awre1J^X$HoL8RZbvt= zZl}|tZdanUpQWzuyclVGm%FuF&x{i%J(Uw`;J^lXATm=~^=DV=KTl_pm#4fNY5cp( zi@sKAbf2h9kXjl1&{;nAc}B)ndC~5D^|Ei4zM_quF%vvU8=z;xOXV!+?_3}BP?x$< zYi@s5T-H6;yaz?%XPU?Nq~u^cZKWGX9EJ?ZtfctM8ESb!Liu2)*dNEt&PtG{5&u;`)EmU+8?BdAgT){Zy^df@mwg z^x;ckS*`UNejC8)QSs911o5%B?pxByP81ecA&WqmnK6^7Sek2@wzjwU6kp8q6Pva8Zi&5e6cy041xL=HLd@t-5iQm!O{otBtrY;X8 zMYE%;xj{Us6-Bdf>G+3;=LkZ177_AUN>{r&j8+@u?-h6NHZxGUd@(G{f?k@{9SRL) z%A^Q(N(Y`lDUNUbf*A8_jIzSzNh{UtPMR0*hMK`jSK!$$5bY@e9YUcPtG*2xqhY{&&kTa>SS2lGipuv#FudmquhnGwo~?4w=G8 z+U89eam*HuZ8tZTXXCXG(ld@|8^*jA(rM*sKD}T5UE%+j#7J&Rv-LDF%@wcH^X)b&3TnIZ4i%au}WKmz?YyB>HQ#2)e!x*pmw2Szt zq6&Rh^`j_vmxk?agnFu?`1_1}syQ)qI2p<#N9lP@k#rj&E^KTBWx}s-)500}K^&h; z%e}QKiiP5XavwzVscRIgX2x=TP$XTxiNzQxt?(#)Mw(G)9g1habb5>PVi>L2_VL;= z)cPixvy)@#UMNlMinw@kCth8Exm8%L#bOLl7$7Dyoi_laiG9>_c$!}A+K zoO=;XTWJU?^#4~Z3Fe$@EEDzqJHCsf;U6J*HHpS@p1cBWh5Ls}mv%Us6aIlj>fD%E zFNjnf^IqNoOxqqSeVz1D592s|C4eot!uqtvAD~YyOLs$}?ME^D7qPnK&eg~WOB-3zT5N5)MJ&s8Gl5F5q%K&NjQYh@= zr#>s)<7fHtagJsPpG)5p6UVyiejL?)hA3a{y;JeZ@Aakdn*<`AeXtvxz}}3WJm?`j z-^!QQ%agcv!iV2nh1Xk%ZxNSXGfRF(@f&ZgEL^!P7>H}8uF+LwvLQg;$=WO8tBH=gaz zWasv-bob1{e?b?{+{$8dA2+Ud%2KyzXPzIea{~F-4l$oD9xM2bJWM$?@H;STxE~SB~*=?jU3zONXZQ&4X>#K=~_B}cNG89ErSYwM`|xmr;dgC92;jSKe7#heKORi z+=kTS87wMSw*BG^#vO3v2mef+f9fIpER&-RTFEDo$?%s>+;qrdrQW~3brxI17hMv@ z>a#=J(K3s_cC=C7U>27aE6@9R7L~EB`R>;&2KQ8N=7B6Cge@YkXK|%NTe7vk4$H&` z)y>xYLmg|vC|hT@CZcHC^63a$HBkTJ9bt~Z)|?)ltKJMpR%YfBxy*q8`*g-?W*M^~LwZd+Wff!) z_Mdb>%QNsuQa;nmbaikj*V-|YHr;I*^;0I3|FluoVFuq?*{Dw}i_zlElBZ|VMS0$S zKV&knLY;H>GKgxX{GnD^JfF~l+cmQkAPe2Y|dVnr=Wf|$<5W9HzOP0i`IP9CYxqsT9Q61o5`ouLAx`X zKVn<(QE85Pa&38Rl}mqT2R5$A!K1JxzgOmP-)PUnFLNmzrS8erxfnlJpWy6VrhjTj z%NhE9qjHR%=Cb>>HIYj*xH{X4z2`EBRj&4hwV8AfztVS1Cfiq7v2#tPvR#|2gEy0o zDa}}1oWq1gya z3OnY$+padpa`_>>86F#R`Ex{5x`*TvINy?UQ}QrLXOvu($FSFy^q!H&iiygl*7a6; zNj>48W)k41PG+6IdzF{7sCSmMzUm<}H>tN?9k*^KDxxhg-ZxRI@B8b%)KIy~%fn5q z6VKDP#Kf}y)HCgo&2I08d}^0X$;$?8^VIPeZLZ$O9Ink)|5kAh(~BChK0JrX11xBN zRoic4&YKN6%Cpz&$L5my+Je@-a+PDOe4m54oSWB}t?_yIo)E8dCzk_@)O+?`9?zDU zQR{x*J09rD#C$etJIo98wL-n#R{1_;bpP5@R+kn7vRH9Z zJhe?I@BWht1N7$)#s1tS<26=%Lm6z$^|haN!Y&hXgwU#Oqfa6a^jqc zw$ioS{n3QqvD#S0n7BAfT9j5f@ANj&={fK8G-2y=$R1LkUuNcT^_RMuujKG`w)(ns zd@`@7le~sCu05 zRD`8XZO*MI;>JvQ-X<4O%e@KnQVZo(XsZ19A_9xlcbi(wefvfo%0FRN)L&kT*9|LW_~&!uygh;1 zx7M9oF}G13?o(Rhc0HG*UFujYD_~ZEJwNrxC+`FGcZKB9VUjJ5f96Y7 z%)F7!x_0uZe6MR@vGTk>G;#E{o~dRz@`5PWBQb~m%6uG^nMX`L=@o+V*nF`ghq80o zX4Qp3lXK+HQI5l(*>s<+>{0JLW_;-(T}uuX(iNPnoukYO7pl_>Xn)d`^R@+;?9?|f zJCCNm9ck0BP+kW&M)(wv`>~t)-|{(7?9RXuc~t+d{7`Eh$MNch%F%Ha5Ao;6dAz>n zsqE-H<~8lY@1Ga4`@J5_3&>YyoCo*!XJS?1NrN4FmMhP();JR{*GPk}dv;ufH~+56 zqFz@YwjRyI<%%bMwe`#~^q}ydiF?bGUE9koqus|EhwxDL!%QIr*8_nRqcbh_z2L)h8CLd@S)*?`yU_HD>BWzJP|(gB=Rt_)`OpnW02vr!qVw zgps|B*oa3MeMW2PBl7=#ZQ#zNaGnfLl`lwHMz6)?+A3ovKAo`Jq4bol%r!fL8CsKX z3=L6laXRyam0i4yyv>hd#ykTdGs5u>%HYEzQOcjo;Q2i1aTAOjJQ&9QaY?js3MVHj zk%%J^$_`GTqkIQW+r?@B8NusiNo)v@RKG+5saL`o`ZO7LQ#3<0%WDuDP2XVoILFHy zxJlZ`OEJ;`N;@il=u(RmR*Dl?@>?<+Dy4JXCY@1fEJHiU7x|kwgr5@ls=e^zXYy&f z$Ej~yn&!Qcyl<}=fp?773c`kF(%~93BfJ?;czS|*AYwSEnOAW_jPk9;qn#5Tou<$I zt+*m#gww*0US|`T{bwR~gA$cP6vsU2@ItOcQ}>}}Fn!{9?UAbakLGe|(pnCQr*A*a zp!Os%?B`^@k|s%pEj|;D>vbTW_va-MQy5Rn50W{*SDMb^RLytd)vu6>r+lkzHwZ^+ z#@ne=jJzvxM0ASd?V@PD&yQ#I|GABZ30U5Zp#L9<%x@=6eCs4Ooe5*hr*UkkAIsc1 z@r>LTO;&6?P2J)c&@n-4{21P7+kf2_%`$OUjz8)%>6yY_>4QeJNnulgj;*+-!}|Rk z&41sll#lI`6h6EpK4Vz|m!uW%t!*3bC``R7nfGVJkUBY)#TGGqS~rD(nw@9pTPm(#Q8F1+i;e)QR>S~o{(jiX$dIpR-w!aQCVEbMiBl{VtsvApwm60Z= zqnWr{>wIbWV=pEVwNe_8pOP81G>j_u6w3O9(tNk@muon~oYPq76-M?^agu)ey8?sq z4I-%Zn*rCZ;nL2hktO|2M3j*q#rIfWG?J1Ojzda1WvO8l#2LwG9?3J|M%O(Nv^kN< zjXGg0k2dmcpD3)$G`I1K!d&=b^D=20=49Y!7r}o^Gr7DkjNlF_ypsOrFL8f)=|QX- zYTyg$R(9&^kY@6?iQ}6i3BWMT)5d29uqIvSSi2DAk{jr%%z{bV(rBQ}jH7o9Sf}ar z7t?qaAbw+SI*Y_Z9M-ybX2$>q)EL>PjD%IL>GA~ykyR|*=POOjZy9VK1s;Pls2m;4 zBHTX?aBgN6Egs7kI6jL_?d22fnnlL) zApEafFBdijaCL>&X>;YZYL>11SbyFx zHSyK#K=qTDFgFI!U3lQ&@A860WaB(v`?Dv9vF3qvbj#(u^gm~V(s@zsqipC*V(!W( zwkMr_MnAUS&EWDqA7vI~(50TdV;^Ob6xM@*S{KLe^5x^GEV}pYiC0(_^FQ}y%GfO3 zkLA+}&LS+_7h7%T-Y!1O*lnV&y*KMlYyBDH%{QYoOLEiuxSAL{$d~WOn%G?G!}j;I zoj>_9r#PE4gL*QzM(bbqp46|(p)|mo7S*|o>Y%Ji=UkrnYP%ZbG39+fQohT>^^7mO zwH|!=nKDyTvv_gClMU0d*wD5+dmftbY46F1-?Qa;^kA4~BfpjQV8Y*eR!4eL@NW*u z@{W!XKG6!j_t!(PN?#8&wCLCLLp?>E0<5gN z(ra8k-O}9|rSDyuDw8^)P`;5ayx3cSL0MT3EeaVPq-^SI1-!hXKFM~4?7!TJ3a=vR z`8u=zd*PjD>OOs*O?fNz{58oTVwfu}_T}<%yH2b*l}o{U9a+#OkKh%ZIHKb-Y_2oE zUd+MIzXQi@bNOtNi{{U{WZQ@jDbjJ7sJ_2;d2IZ+Jr1+-=>3oKy|o`1xNvotz8;ZJ zYe7EqrB}K3V?LI*+EH^ipYeZmRBl{8?+@rmbxHx*pSkLF`8*14PyFbDcN$%*5rtd` zRj1W21wy2Sbv5!R|b<8~D?Kx@XY zb`|md9%buaFJgGM`oh-iI`C=aPTdMm(YhWvTTMB&h8RO}|@2m2e zH$)xCjS5(>wgpS-7t*_XOOCBCAfdlKpWZBBh5Sdq3CqOSw4}6a0r&2z!~L^-#y+&> z>aGIurkVxE=yms$7d)?!snWTG953X_RvSKeP{=U7zTV+N%)hn6e`yi6Mq8c?Dk9;o zH7Cy$(d|cjdNkJY3ASUEutKlDYzaJ7%&a*!@`@L;{<*r>AD58+(w^$Sit%!@V@s_P zM*S!KN_Ht}djDp9O2vEGGt0SDUMzK?>?pze8yhxvFC}}ma-N0%Qmn1060SWrP(A8q z`D{|oOaGtqiP>w#S78N|8JdeHDxgh^rpiCl@k?vM>f%Cn9I?V+Ux=$sbIPj`lDC(O)h%cxEmJWM!kY1;eTg#cl#M!B$1%f_drwN3rk}s(Rm$%jn$X3u zj46&*JbEC^xS=^qua~m%h$VZU~WLiL52 z@r7q0*%QndqWwCmyq3jB3vpZCkm{X*mW6HvOl*sP?54JvU?hMq%6U%?O)PrZs*eE|iv0`PPCtc4hq0 z)q;#erDQxZr+j1qHBR!mT+Ao(Q9ax)=X2++da+Lx;E+?B@__~Kc!G=N1#Fjoq+evw zyI!On1w~j$?-8=UP&&{$Y+O+E4*&m=Ud+B;W=#IOi2Bm6_}nR?CbJ%I7Z!0frncr4 zrPS8X7uGG|%)fPs?p?x%dfymfUjo#nQ@50>b?Q(xwB#L6;p4HIbM8-_ ze|PGVsPppw`7b{lC}WZMiNSxDz2hhBhL*7|RXM;TY7^;GMWf#J@N8d2b{A_7|5M5P zVyBL5{G)NxVEQCx&AJUd|0Wx zLU})btm5$mamk)lOzdw)VfS)%LW=`(D`!Jl10L)s&ofzq7mmm zE@$vrOZxUNXSg`UQGVrgdDBGwqUB7#U`zj>$~ga(G*8tPl-zH|wucq!LTb*E*ZO^> zIoGLT?{f=IBvf*4e`6+fsAOF&TgI=eQ2vs=a{nuN(@6KIXQgxr@4(vw#nRHXV5(2K zGRzzt!**QWUqaQ`_S`sB!h;tb8UA$%MHAIy<6n;3KdpJ}QjTM-cD(j2qiru~ zA-9(DN$buWeO5x+3kTLtuE4Q(TX{vxsb1WH#|z3hxz3HB>XfmjTs@{MDtP~GJKCKu zC#QicZ?&Jh{JW5yTh0k-O(&eFWM-b8&4(+P_(q+-=PHO)hsOQiitroPl`kvx43HMK z(Un3LEmeMGPdyXA>Y;3x0+z_j-tGVQq{Cgv>|M<6A3QlVtca*iUAbGXdxU0DOYavk zadJ<(w=AOjq;8niE0q_dJ6^hX42|o-?+w;p#xV2bM5!qBnCoSFq()Ft0u+q0Uhs?uoBzHYgCwLpk`bQy$ib z*)(~sSy_C6x;*^()2x6GmF2Kyxz<1*Xy#cjPZs;la$(s_KOYKjk#dp%@ za3DmSZvj*HM{w6CA4loplk4VjQTce=oQs$hAwT%70~*UwRAOJM<{9HbXMpU?HEQ2A&~*uM!=AG?Y6ei4NK zm#O()1YKuJC-g@YgDzz9rcXEt`?7iJ7)=Y`Y<_l+A$Ey$Vd4+0A7!bhHJ+_LnRMS2 ziPzK|w*RUuCUfb?TEw#3CWrB5aqPb-PFWtIOK~QGl z@04vcU%Zp%rc*m)(^h)w*g_Lo1<4%xG>dijg`Ypp#OsMXOL{h*sG~XcmRz#FN+95~ z95za4Jw1^sf7G6v?X?+*T zAJRQd=^(xNLnFn_V`-OcWc+~`zVytX$DugJHI&wFMc21UfgjB5d2&c_A;IiMKzIX8{-x&B#TI<(~)8y+-)XYR) zw|U}l+N3ctOMb=S={%4od8$n+RoCF=`(6^Tll$7A}xdiD?gK0wRa}%o=dNF%fx{B$rOr^_DO2=N#$glQhH3rM)!X zGsfi+s{eC5F`Xk*;+VX_h>!efmqOC<{4j>UuV+wPE1Jm_nZojMIDePH;|npg5#DZn zB8CAjCiS7qlRh|`Oa5`hx5-x?P8|2Gvj|NWf229dkX7N-xMUM(8^)q^6RSo>u~+jv zx1Et(7x%elvvep1;}~Tc=Q41dG$)2!%-%%u zop3^G>oCfa^4YmmnGeNz{F5$?&KLRWLyhFNwbs)w!a4ta0rvfrVW|1T`RrIWp4U1} z_nKK*1q`_!Nv-CE>X42g`c|QQgUSZfJ@ER6^2~QG(waJg)51LuUWT*niS9`)mGS6T z!nf{WL^RByr@TX}^747IAOuU{AH1N&E)i#*%7Se`x3BtN}F6-^Yf9M*IUZpM# z;qR}1@nfQIp0W{xxFFm!_?Wy+Re9X-3g+&o`LypFsM$b1r6+oc3o79A^Zx26&Rtot#t`jaw1Z=Z5gP@Xh3p1DWu;Se*@i?EXp5&NMv(f{S@k1NHg| z&#e!pub%OFiM=@RLop5o+V5{m2y7-R%cc@S*9MU>x|A800*Egz<7ia?BUhF2nR74d zd6l!m%b&kSm(W%`&@SPLC0CSjtNk16?Z>^mLhkKU=Sy(`PaVXEj1}%a>8<{oLQd@V zBKyli>a0~~P)H$J;x{aH99_j*9Lm+YdaJyQI||h`(w#Qjis-0Li)Grs|CI5RbhQYF zD0SZqEata(%>X_wrtcDUv&=2#sJ*8;s*1T1=tJ88J!4w*#6GPQ$7bG`^o+h5-h&m> zOQ}dyw@zg#cebdL=Y9!c(%%H=`$IdGD?Pi6x_?LykS^uX`7#`(37p@#oPKFOO!~Tj6is|&9#6v;d0LG{ZbDjO*?I;&V~+OABrETMF^2fH?u zFzZ`)b;g#`ZCp1hCzsM@lLv#d%A|pmzv)UTmtMHD`rlHvG?kY0b{Uy}sB?IBxjZl3 z`ATc82K%J@aH(YcLGeOAR?xYv2f@ORwHCTD=96MZ2XyA;wPJ!7s1sbc>Y!6sUQR4w zY)Kd5W|eX{){THYrMh>hH?FXhYH3D8mX-3PM;GpUYArZYy<%}?^c^Md>yR?`>wVAM zEyJa}Gojted1&8FojB$E5TpJ2u$(8EU9?^*C-pn&Wil(6F`ye?yHv3IM|A}MRKbFu z)s<~k!J02S6Ij2J=%by8h^@rxcdgl4S99sC)|`#1=wVbxv_pw9$<$>(xR{13UAf>S zT)(FSKI4SD{%uF@$`WNg#zD6C-XlJ=z6R7h*x zju@?3&uNBcJ-CuOlf}zit>8|ux(It!(q6u*h^hMdC>KsdR`L577yhoPV#+FKR#sN2 z(@tI4hpVK6??~~lRot24O3q(ZEdEiN>3^%JE#7Bu&uab{(vE@kOV~2Xnc%sl6#USd zst#p5Z0n5MCpuoEoUrdxMyiVwd;clJyGR`bVdb>{$%$#7R`AjBwiLTn&@8PjrG=H; zY46Nro%dtkI1r`te9kQKBHx$MzpfJ>{ZK}oaq1yETSj%q*7ULvRI++3p?-^2MD(veO9@wS}R_iN;bd4EJ13tqHjQqwZF%x=lg)jA)2S~C9IGJ<^V*l?(f(w}W< zuIuEV|7`eI7$sj?`(&MuTg{}^&n#zPCw0NzF2`)X9eEwfNxN!C!NqbsN3@{(!E$;X zQm*mLa?Z4~Wr%eJ!@DY1*rEbcpO&m@TtTf>_QbWV)csfaGD|8*t82@wT@}ooV9kdI zD=8h(68p}ToVjPu*{>>D<8H^eCY22NMOy!YN+$hf%|4wMRgMnoK&T?dUAmz2 zF?(CdlbJU3IasCMXywQBs3ya`B`tA1*NnQXl& zmmcQHpxzWqXJYW|&Cw$*lsnN|z7}h$Gs-A2HskPxGJ4HZj`5f>8CaWes!2KX|@2}PL-M^C|BlGN^?tr@2mRPlb2CDZOz zkv`mt-@L0hx~CZ%uT^Qr-V}F3HShf)UCFF!e({MZQ>0RE}`TKvrj-Rl$;~NXUKd1Y6thqX^D=@54m+|@v#*DEbYhDHa99JgCZxzg+ z)qs2bDwy)rj6;^Xf95vier_dIC(QVuW0kn>#%vZB(D$=OoS9NZo#Pe^O|Ih0x#r4$ zt!6?+Bc8OXX2gsJOt-DZ&tR_kWi^Mj9X~krrettK_9peAa(yGFZK=k)djrBARrBo* z3kEgm{f-xEdAB!XOD*`!vkwpVNyjp=oDc8T=d$ikCsNcC-c#3oqq;N|S8(D?9iHpH zKQp-&+c%Um`k^|B@08=-t2T31Rgf~fKI=ab1`n@Cog)>vO{v4WdzI7^&(pn5m1gjD z8M(Fc9q)4I+sb!*Ps1fuoE2B$s?Y!bex;v%t7w>Ao9((TSFhIpbE$sE%hc|m?;~ol zcVjiJpVYA@&&jC|O)l4A#ZrCEtBr+YpLg%S%dLwlABx2#FY@lg@ekBX^r|nm z&1}g_?Tf{R26Ua?Pu?>N8a3`mkNPdym)@7xKey(vWna#ZX-KSjf5PYLb-(tbxUn^- zoA#$zUcklc`|%*96&t?kN2>?*S?AoJKDzcMjqgu>Pjxq5=tteLjp;XQAknc_d}JKJ zt^C$}yskgd^Ue5s;{cxeI&fj%0FE~4jP3dU%wXhzYFV|S1~uE z9XIav=JqZZ8jkHl@XbyPc+i^{bbyDwSwGH`17_9iJ?f$iioT@G>&oV)eYg>!EI)lt zc~8}2_Lcapsoo6j+K0xG${1|d2M1s2Fns&6cB3cb2E0e>GVvdq`(ZHeK>5~wY@e(C z_w;_euRMgp@84sjbPr>E`fy>F7srS7W9@r^xG#8*j1+G?BC2q*>BYw1E1CT=hnKs5Q8ru_K#? z@>_=rWp;*QZCTE^dCJ>+Q%-id{Ok3_vlUCPE*{Ak5lc~-_>{$o%9_?Syj+;?as~S@ zDBm!vM0uu>92r)OTPNwsmlfc*B8~%ViwHO$h1p#yyMD$edrwgV;2l zuPCvi92(oGce*mUpf_wbb>z4;?}ZMe53O?d^}B=8ae8>$)KLz^Mki(n0}Iu zD@p)A?2F>g5R*TD*?=!5j z0RPY|9?9?a@PRyMr8(4=mL^5~+0qx8Ty}63+qqm5zcN^QLJRS750Y|( z{iLUQp2KHr@)&wmUbT=S+ScULW20t2!bL5mv)Zls&s6a(y@Y#D%#;=`Ad880viM|b z7O~ZtgalRUI&C;7pOUTDZdXquo_+}_?=+eP_dhLmaBf{T5q~haRz|3~3EYbFSByX{g=D(wE zB$K4i^^Uyu!J7a5r@Wz?yNZb4CtZs0t?`z$`3DNPc{Yg`FAEvxt@qzjM8@f4T(yo~ z_E!SS6H4i$*YB)XOz40#hFmG8#R~&Zx|LuIk%v64RGt=j(>0H%wJVWf(&}~lJC)ga zC3KZXxmdWdP+F0BN6KhuoyfiQ!jsBVI(Vy;)qM>dUaFt(N@nUAt*09#aVV#P35ycc z(^gLCJ%c)!E7WpJJUu5-Bkyy%g)-a;4Y7n@*Z$$v!?Z0uqy#!3B6;hA+bRF@tZ;Q_Xq>eD4~9fLyk zIJZe~w%=TSG~U3OWx{8SFz1+p+3YTOAwPRIM=je()fS?)p}&D{q58~Uzk!OvG0yPV zNGtVuT;8yOqh?4yRJx4clsWA2b|aUB>e7C+IhCXisYk;`?))lsI5`_7za@N!#N{4p zbGTgaTB_7A=^fg{4M#;&V)Z7@oIj7J9Oaz05?vbM{=?1ZF!k{E%D^rBKFol_B;MXIQeS-VEcmz7X5EtWJblt!?i_8& zbJGpD^^zsq+|lRj!xkJ~CH-8FEP3gm9#tn=^T=CWhJ;(wr==ce53;70+}~n9Yw-!0 z%QFVn9Ct{1t=??pay#)NQIYYCnZ*fmoonvs$o!T#>Y#XP+}y$!t92L^F1d%e+0<3D z$7azbTk>0P$g1K^eB62l zTe@xGL~W@z$=$^NIf-7in@Ph7TlmQURQtMx zgD=dWXU-NDoSIHI6H7*|mEJQsy9~-iUwNb@Z%&#neT-Xp@h|aW`D4YSM)LQtW_ihU zM#!s<^-KoFS+TV@X>-MjIe%t|#=N!kOOiu|*l}kLxN5mA_kGdkdrKQe=xVcVybVpJ z%;aA#w!-C;XP*l04iazH{T9q=&|=PZ3%)8Af4b9_oFUrGOa550ZQrRpwabzPd$p*) z%ZfV6(m(XriiSUh9}1N3>#HSt?$&HSY#P%GZRo2nUYfM!vh(8A`qh@I2c|QummO8_ zNblb_JMKCpdOmBm@L=!B(kEs?m(iM1*J#0R^%H1eZXx~U<9Y6kg=pl6-g9?LIu?um z@iPnNAC^8HJxiXDT*>8;R*a7r$2>(#uI#8K9=eu{GZP;$Gb=`&5&lF^aHqxu)^4|A zb<7l+%(CLL=E>}2X+@P_O|Dn4rd{Sl9^YY2&13R+1~$AmOT4)=t-1D-c(=~Bp-Nlv zW>vDK%Ti6w(6{9@(WKgS#fI1ViYM_%JBE2qN4AFV%Ye&!A5u7PM zAF>n8^QRKCZW~F{33eRzV>stW*|FYQgXXX8_+08K%k_B2^H zf+t+KVhKNxIMKt6 zK5or}o%(Z>%r~=^{h71chHCfvO23s28;tr$9kwlZ^%=zY>iqN-b3#rMz+|r)fs(m@;j6HQfieAe?2kF5S zJz75pTHYSWsP;}Qu^hndeH_JGzCUyI95|)EAKUbE)!M`YR@{2Ud-$1z_jnZslUR38Uw|XLd$_Bdc9~p zR(@{NgK^s(d1Fd%4ykvdTTm}*Uv=b_^F74p$$_QwdT`G~N4AddM*jpy{w;MPS*@Ko zAWfAOmz>zfPkf>V*ihqvGT+HK1bcO6)(0D^3%<_OwH2L~ZdB@H%WYj$*q~|4IRCDU z5{xlX@clQz6v2HubN5m^jvd{NrDyE8e!7a}ZESgUuQD4i*>T5J;UE67>zty4e84FM)v$^Ci=9y9O!ebE2nLAAks*9ZHrPGOl z4{dn#TSwL?+H$Fn61T~|JJ_tF)B?%={!e>;u(#!c6Ky$ou`S)tx1m{s9Ww;a*IL@~ zZf!eWooB~eca(UtmpxB*k@}J>J9?}VZBKVQ*1T`SJzMOhwoZu$hB)xR^p33iW6xv4 zGt4WrXN9NeqV#rPie?ASige(QoOWER=E&gwO3Vy!WZ%BRQ%rE;o~ZV`KE;V0J=^i? z-}3*BZFu9bBbV1GagT+Q_{+8BQhO(wS_|JG=hN-qinNh+v28^w!TPpRizoQ}tnGjJ z+eogrrQrJfWZAcz6{%uu$2V<6`?S!OsTM8Rlx+VWA7JWh&-%|Txao;K4{lQ6`h@tQ+v-fysLql@bfISV;nnVc@ozg9`tKXb1XUM) zcJ9T)F>X||9Lggr+!!o9Ko+L%oIP?h8!BB{uxEl?t1GWQ>c9pK5AGT?oZd6sxpvJ| z(R+6j-y~&jJ>ITkTS!JEvxAv0a`6uNC0vvqIS@7swPO)+1sDXNXzR8I(X^Yw6 zyR0Fv=^S>{m9>&n8gIer+I+W=dV<9) zY$qJwO8I};d&7*3_`h#fvQCUxDx8tpaM2kOF3B-+F;Bm-ruu6m#!s=O?eXP&nry`p zBUZAqy_NK0te}H}4Sx$p?c!xcer#QrG+CknGu+s|Al(Q$_N+zhq9PwU@re z?e_d%TN4_cvtz&bHKJ*3!}jHZdtQiL$wxh}94OFqS5r5ld(tl^c z+B2&pXD*!VPRTn8rxzB!k#-RloDe8H*-$5?6EjKeUVm(bI*50AMfr(P1sNF;A1P^av-_PbOsoY3Csg2Q+_wD*= zPQU3=+m<5y-t;XT)oBYC6-f=4JZoq9TcuJP@m!bsBFQgb`*%IPu9>lT&|2E%ZJ_lZ zQ>y+lqv5U%)Y&fe!1e2>9KC^2T+7d5K9l^!O!)l`w69ply=%?cL-2crQMm{)UP0tZAv?ojHx%S8;ydP3*Z-dg-2soe7=3ZWh19RV@CoiF=AxGGwegzqhNIkg@Z7uO%r9`e!fCv)SN{vlOFroR`mOOvGiM5 z@pOuCR+nug_bv4WpDg&$)R^OL+3?T^(LVcW%_hGk4E7X$d8PCfnOn0*+#pk=ESH;%lN=t&M$B2*-&wonzAKq9`4MsT|_r$xHZ!@&F6-t)||L(0bOODxE2|T zmcI>`ubs~qp>{lu*HS11LyPFCL7LOq)*k|g1ctTWwh|s3epebXJ*HlQg5J;WlPQY zIkdQK%Mq1&qBU*L@_+Q0;$Y8PE2Sn$xaU$+@q_v;e=nMePuJVCAWNSs&oX>aK z5|`A8Mx?JJ=Ny>FXMZ{WSEmqN;LL`_1{^A{ZCB{C^>b(L=_?wPcU-u=Tr@a`x^lMJ zJdTa9Vb(!iJ{%$VNLe&KN89nj6Y=@FXvfs!I`mPu7hjDzG?(kxaZHEj1P5i$nnknu zGG5Aa_(kU7`#-bUtnbJZcC&?7cH*I|EehUn0)aN>@%sr+%>NqDlUyt-dvlup{bwa`U8g2a<|ma}M#OMOQR7amCz{gZYs zZ2Vh`4Zq}!-9Mcn7Vg|vAs#sg-PqVPP4scxM5BEw&9}QrZgvU>1Uqnv?PMx@*fSto zlZUT6vc-C-pOELGF>Dge(`5Y{XtDzxdFuW|+Rm5t;w61A9i4bW`aUlHA7Tll25-VqFpV#D08&?iEJB7VWT{)=zWd5>nWks$gBh_8GciTj|FLUFp zPMW;p;Lem_(Ky=X!MLT981CxM)WMq6KIq7KKgQ9ipA(my8BcpzpRcZtqot2CjXO?Y zR(ls37>?)N^Uh*KBc59_9zV8B5FH6uPPjgvMp168+bDG%er~)k{DHc$8zW-Jv2Lk5 z7tff$3;jG8Xe9a~&mFl_X$;$^I&jpyQG!hz`F+b6UU}n4&6rV~Gv0~ymqzmLTPOB< zAU@8qPCREXKGNTv_*p#BgNaU}zbE;A z*%w_r2eFmhui4QdRLz$0->c42*%$k-87%cfG7dJ z9Lnn(Wjs8GFkq+~r$_w7qZ{4Wsb~UVc{_|o74H1uC$Vyo#K4z^h)03D)YA`UqOk{$zWs|jXFS+m-gm-4aN@CntlsRz zLBIO5+R2I26Z%U3t23Xpk~#%NXEyCo6F)>}4%jz<_a*l1*xa9f7S1$l*N>+?oy8li z57#xiaA@TKdbM(8RJZ=@=tEx$e?~)t~uQ9@LWW*)hiC+Gq)0 zHge&2>Fdz&bQP_!KJ<2X7H`>}v?-B&Te}xe$GeJVgy83^vi`z)vg0=y_pBbGyX(em z!Qnm3U0H11otu-hXd`i)edGZ+@OD{Wf%^ zwxTQZ?{(&Z3^z{k?IfCF?o2XNVMc;rsyz-*N(fJouziH9qa#b=Boap z4LR4DC+wBjR?U@VLp$)yiDhb4@!=?BU89$&>4*$$6CBQG7Jq zm{1_P4fbxVF;rsTer_E4PdjRcx$%=?8_|Yv=e1ECrSH+5nU~u!;D|dnRXHU^6 zZO3Uc&qw*Rl^m`IW1^L~$ljBWcyCeJImeyR{ z(}mBrDl&1Bi;QIp@u+ZRkcA?Xw##~a*owy2<$7IP(r=*ae>x1CcerqDkpjoOcIDw~ z(yx&!^FN{mE23O!tEwQHHgf$Tiaem?{$IYmB+ZQ`-CAUp@V~u&*U`9sO8j??SBs zzC3H~LX|~6Z2IcU&t4u>$ur`?rSi=B8*yWbi_|QLUeQu#re7BgPg6(U^jO8-8wB6C zl0FtMIRhltj|y>Ro$3a9UT~r2uT9K=3(cf1VpD)KPmbKgEI9H0yj84daHnzUIw}lw z-1dd)8Ctwr(AgBu{886%RO0c=I>v&EZQxvi)?rb<~*qHz@EBN7bP*# z|K12@ZnkEg@H6?Q4s;oAM}wob+%Z&Y4=fznZ@42bKeA{3L2G8^*wIPO{i}9@eRfM6 zw^lgSv5s_jXw5J6&fGlTRy@j`Stq~ul5^)?Hyi0Qb*Eam#K76E%oEP8yPhxOUpR7D zu`ByJ*>jG+8z)Y(qpp%aQ$EPO+WWFN%$9}s{HR-R&7vQ+?0&(LHfh2~3hwQ^MtH;{ zRvdIrxC|Z1Wysi=HCr&TyB7;;Bxe%t!OWKyOkL_nCv{7~mI3S{yg+!Jk!klf3#aPB$-y!P*PNNNKyqB8T)1=cX7=3XM(g@5QWxMR=A)9| zALYet$qgwucybV>cIUJwH~zhe*UNmEEj5|xFa224el!0Jw&T798`=G`J?B4K&(JYW z;-R&k8J-TpBdueor9DqfkeXtt(a4kvvRe-=0~+jA}32Rd`*cr)7G5RT>K zdd~jp#-6XudDzpPo>?2kf5@G~i#Bk~Xcx(GuH}?z?(FQamL2!Fb4s2W6=Yp@pSzx2 zV!b)WQtSQLMaqP2M-t$%na%%|#c=mnU1UF*I#_GHgaOVAH%IT(9+1Cvjsn&og}>9tkqQc>crh`1n)Mod-ANRDWf#Jxw!u-ns)G}mh?J5e(y_Td0+8u zA6|Sb9EY7Z9~zl3&d7%wH>_ZwP5?(zG?m8qiPxC)koNHB6R9&WO!jBz-K$vDH-KUL zSFj|>S$uJqb5N`^N9ZnNUv-J&LYLA`*5m`pOWUk|!X-&KF=Wb(KRJ(GI^xkK; z^`Ob(_QEi4Nzg-oLt}R~d zwqz-lR(SF6zm|w+yce6>F6X_AvWGP+W-GbBx=zyT;pWZKyV9Hg#fN5ZMDKKv50##Y z?&?HeWS~1$2GtCT{+scPIQmdl8%Ab+Sg4d_`iI%`Zi93A7`%LsK z>U~B3Lv&TW{du>mc+$Oe<*}vn8LH*RSDAXeZYkp(B)Xo1JvgFBpMxZBx-2~>7Bc_a z%31LBg9m#TiB^Z97pwFPMC!tex=)2`oF>mJYaVOH`LOHM`7}Q3%^|<$ak7_}Xq?Su zv7Zl}%k-(E>B~P8^qJG_OQadF%TPa_d@p!;sXyn)`{uR^ph}fK=k@kyPONwu{ubPD zbgtBty0Oii+3YN5Ld3wi^pbJh6QC>kZ4U+yo6WTgJ*6gUmgup0a&Ww8mW=b1n%p@| zZ1$kS@7Xk$aqc5{wc68@+2cju)YOY+v*&VugBO=g6(8$UUi@=TJRT3q^=61xXp|Qf zX3yftr`~j_n!`)!KHTXm{@A5H{H->d@!fqn)kri(clyw3$SfxI_v2QlxuQGhM@{k8 z$Tan1_mjG`oZv@4z1jTc@5kB2vv?xipN7riA=%{5=e0VVR^`r;hM80g_TX8;%d6%} zyc9vcUL^P;N;Fk33diguUZ!$xFDWPU{Ja?I3wCee%}Z@&Qe~$vzbu(a*RH-y{Vly; zvX4(3CjA)M{+#fU>~8JPJsrTM61Qh6iDs*d2M14|&JQ2m`TONmsdMt+@`5Ss_Q-=l zYiCeTo{#Yt=}oKiq~@||yej8(@z$v{>Fp`?ZlYV6;>`of;^n&1OEmtcGs(b<#!|Bt zu-TiYYEq+B;4SrI+8p=6Td?1Bc9MD7ba1Nl^ZN4jYSFA2EY~SqbSQjzutMFl|OKwt|E(!iDd@K0b&!4&;Q>nDl zlS7|Qp`VT?Z@5hszTA^Rlf+xOmlqdz)ntyEH&^zY!X_s#_S`;+Yj1gR;#*DbIpfWw zb)wIZ>CNOjHC&?+8dwGh- z?|42tC-F~)_?iBS(M;7-@WvRacky8Hmr=CU@MMQxqZr`m$(6H5a-oCl z-(JJnI^C10y~G>*vKOoKM0cUUi|hQx5b<83dpU{~^7AO!sn?4jkxt}Ti7kDY5IBaX z?s#*9;%G*sdh?Cc;}5zi=hn?pyfM&MG`2=k?Yysem<^}OG1>omkKv|MzHBpYH1q%U zl^J`bmUpdUZ2k$V2S{?w})!@nN*Q(@I;rpxnN>@`Z_YJcg2 z5l!%a{8`>0J}JBXIj&CpL)<+1D{mNAAN8WcWDS}+`m+5D4b~6yj=Yqe)IpQx;>o4*CP!UB>l43)g|G%p7A8YFd{UUZF+y!R#ut~dYp zxIg!Kcyr&zzH*-V@JHi7nso8uJ1fDvZG6QCx-YdHd>Pnf5G@RSxiqjp-#ziA+72}a z6#3HXzyO9E_ND2ve&Si^$6pnF`A-LbnTO&la>ifkEBkZBWj`*o?Z-%G`Tcj%R~#9@ zlOqPPd0YU`*NA_tk=K8{#X)VoxaQwp%2Js;?bMps5V_^@PyGP_6m@_$Ra@csv19$2Z&gj!#wz3RlfaejQD zugtn>{)`#ZnWv7)zO124gU9~-Ecx&rN?r{4)K2=XJh^8>Tkaj^#pSKq&``;n3%uHK zeHU-8`yzgy3EuzZhwT-8X!@)@pY-yff_od@+3L$x7do(wiZ4Chw`ar*Uyd2qhNC4O zn=HNJit_yp|LY)g*q>&N?WiI5UH7pq4~+AtkLVtpDDh|ab{+Vz$d89dwc&see=6Q- z%?HV{uUfQbx|z(gxq?skc(K<~MViXFxz?x^%jy09@n^g@V_PUN?VJ4F_ST#b?akDr zRy<+s!*8uxQoq8NVOol8d%%~Ti7mNL*H`pWT2P~-#7z#rFi&uvicxFvUh(@+FW{xT zuIbrI>Y)6XwpW3F%YLu4T~Yi9Bwjk)f@i|~X-Wn0h|R;o!r$2ODi<*|KQZD_9#nO{ zqw>!SwBOzg&AHjwozaXr1zFHj`i|v;a*_1%J07*jLus3D@V}9bl1*PRd-QAU)@ekS zv~1`))T8I$x#&0H3r<$OLBNe)IQO~){dPBF`S^19J^GE61@EA|?-#}xmEqjhpZMOh z0ul24?nmEY=KLQh4J*U)2j8%3QW^Tx*5ldxavV$if~z+RVY=)$lmZKoKD`-LpWfh- z+jmUO&qs~T52Rcx!YRY=SlYD!CIOA8-u(uZ!Hrn*s0eW{zhFbyYfSs!7tB9ef&=n- zYaUhN*sI^LIP?Kwb-%GY`XlZf{*6SvI+%|A1M`e37%uyTh@dZUc-aia-ZhAl>r7Jr z1dF(zh)$`-a^oh3^{B-+J_zk`0HVPw2ZY2U^2FVUkWh3^sm*+Rj%Pe6t3% zYx0me`6J%D=D_8AHTJ5MV%^?)lyoY`i9K~V`k@TbJ3nEUX+Fx;>d|6qF^c7NUFjRB zU;Yf0&{EX*|BTRq1yJ&@ zK`-_V#$BpFpUof9xqCg#OFp6eb{&c{>)?b>@LN}j)c<{k!G{{;OsPX3j|xn4_=LK> zpHLkB3Ek&>fWw=QP*MMkIM6^4N$-M zK|1ihAuzidBQ$?u@?X{1Gvfy~Kd!>2oquHRR>AnqH!Sg}!rrQ%F!89wC;#6t8&HK4 zT^mqoP>Cgf|ANlwO6=|b2Nyb2BC=fr)Gkz@$B%F5c<3D>PJD-zX$4M}}JF0}yNhgZPDs1R!+t1wru5DngyNZ*)`$-k-*wd^(A zYHAVMme+qn@0UX;gxd4Mt(udthZ>>_B)h~%g}y)BW&K3pyTl$ z2)q6kO76eV(6e1n+g@7O!51f%wUMUG7g?rr~qU6%4JD!(H2bP>M%{Dw<* z#n{-;jHaz}-M8vddA9(TB@IY8m5&Gc&9Do}htY^Xs17K^WUcRTXjy;@Kfl6n#cQaB z{)Cmuw&ua)W;L4L{(e90A`L|AfHpvh~kC!;G*~yt34h- ztEnER1MlI~t}jqo5{`9g_0Tzf8|!2*cec5MxXHh;xXo=OsWl_BYbZ3-zr*(OZIsJ7 zlD*~*6pw$!iO+Z76JL*U4(T{C`!|+HKZZufUkKEAf|lh!pcniE&7;0Uwf+fI^%@bE z{TKmn8_+#B4QkK7;Lf!qT=@7426_pw$oheyg~=Fm_y_XVJVwjeKk-j+B9wi;!*Xj1 z#vJ{ISvwM8m@Mbxo&^Ya5Zd zAr1!9zT)qqSVS9s!RC@j$d~(ge*O`33+mCYG!s3aHv^R!uoxn7#qM;3KKlvRlNl(! z-h|@V7g)US8yc@>pf5m5FWMh~9i&Xp$g zj!(zBm~Uv^oQ}a?8nEwGGzN#);@|lZ2zv7w8gUV@GX4aYm63R+S%b#$(I{#65f@@3 zaqeRkO8$zH@u|eE$q!+1vI3V*he12x6FQeXK*;)9th^S6sQooKxbp!T5xpxtD{Uc7d3PsPgHTXU!6mjxB-8&K6W(F}v2c{neTR9aPhjZ!8Rbf;h{^v1g#pP(&;N*t#i_{JU5W4SQgN6iH47wB##rq$Sqmv9PiHZD;Qm|xnH3GIJLPxG^v`!*^1XRFhObWDQpM7y67A0Fg zqyO1>Xcv7%Tdha1llK|x#NbDCHClznLA$96!HB^)dHUCo5o&^mbBeufkIwJ5KCjxlmJ`ln^W{KN;GkI91B@M@&}%0YMiO7#5l0;UHm z@JH5qz`qsPFf12?!z$2ABMk;JJ`t_bacFKW-VMq?ikz1oNzY*LwHk}=ro+Ov64}FE zAYWpqP5-`-eX|l8=QE&vpaQ%t^IGDCzm`2k`Nm2N&3%e-a-U0jN5Cn+6fGSivDdi- zcUnhbK*Sp)=s(0@uOeVd7=kXA;qdVXh_frf!UGX7xLbsz{SOc{yb#m+Mxeby0W?D+ z(fxQn%*-N@bS@7)UL_&SuN-k6DcHNB6ydubV{x~)=pU90lSgmxPjxEv4!wa19%JvA zA{gv@f~3GgoYIO%d)cpNok~RNj$>(MZgeOk994nF5z<3Q(FSQx)XyLr(Fm6*EoK^d3u5-gGDTwYU(gBmY!0_7O+ z>;=*nmLlX$CgLuX;C|Ul^qW(Hb-6DQS6hhGD>=wsksQqJA~FB;bSPXbK(x;jm@Ujlgn`TxId9tZ%0TI-TAVjPRigIaA7>g@~RS5pM_cKHb1SqSZtw}@I>fH7qSXtK&j>ECY&J8E%7xppX4CrX%V*lm51kx-eK>Md~|oO#DURyDASBW zwn8rM9(|0)h8*1ZEbHlhE-uVVMEkl|$laKXX}z)$(E2F?k7vQeJq2E!UZ6DN5%T0( zBR)MsN1GgUjE_b0rB~<_8;^zo*=TH$j1fza7fB)-7KrwK^Y$i()b zB&g2-6gnG|Fzu%7nftO}^)v@>d%ncrBd-u!k&PgyY@9ZECVNv3qFpkPawHcH zb(zT0dxfd`&oFmkHXaz|Ky6tT`bK8LA^8Q?P0WUd!3(T8pN$$T*%Q9yBGc;`GbB4EwCXt;MnA`dTQ6|ID+86=USWCb z475G_61ojfpxgfy7EVh=f^I4%mpw;aMjD#NK1YbcGg*tzklNuXlC0Bl@LD>oyfdIQ zIup10KSkfZ>Chhh6#aLn!tls5JXT1>x;be$qVWbTD|1m)RDwRuIT$tXEflJ=acEl^ zPGn`{!iiiIP8N*qU4UzTIjH3uDC+0H<5w=!S zN6qO%v~^9xBAZ+&%zKKzGX$@<%|*Os73x~#qTtYb7#L?`x?lzso0rgc_<&HEFUnUw zVW_H%XYOa{guE22_#R%iSvcRW3i&@@ASk02ql{jl+uYA+Y4t+Za1E-HGO;}3GdvDG z!}w0`P`%(8_RSW|W{`;sQSWg`?qh^toOP{beD;5mc;q>5L@20E;+ zL*UGGxQ2Xy^0}ulp7;SVhtpt@`3V46fUOU zV6`?4!M2HL8uSEnLy}>!E)|H+#*NmGam(ceEY3>IRG)=I-;;3IGY!QZ($Mu)1};gA zb-*M|=GkLd4NZr+UMlwQm3gO>g4mHSuwhX$X8)am&Fzx0a>8?@>`y|6j7(^}iid{F zON^>WfY#k?m`sU*kNsl=?N7#vtxr(7JrQ?SKSQBH5;m;LfU0sL_O+0E`xS>nKhj|s z7mF!{&(ZN=40hRPp?S_D^gNP}YL6#4aiw!Mcs5xU)0` z-+$)9MXs|?*L+kSlNjJxk;IWnFr8lj19@#ds}v=5iKw(K#Jl3smigZpjf@9*u!xLCnatzXV8s(0_pL_TwW;_sxehlrr6OulC2StbS^Q586hBI= z^x`x0MyBAx@LEJ`$j>7x&@tmNJj1F`xhWYXD(_HuIuZKY-Xrr$B6eP`!sPx5&{wK~ zN$*6ssMf(kUf;!jK*f`I%z5<@=6&K}(dIJ-Pm9Nw19fnVjK#Z~71(?|7Gn-cjAI{* z>fjpGw3qv9s6*WIN0^XMfuPPYu)0$vcrhB2y#L( z{cGc~qoE#}?yP?QH3zKNIY329L2CmgzTzD$B*~%2s*6;L&NfP6RM8m@#P)$0Qko`vCh;3pVI-b43>N+_h>g?V!|W)|MXiHgri z=y(q*hP4>H<1VhpHOOZ_#JY7&h)aHmYd>Yb`4xq>+rOf6Zxj;y{6XB>C@AgtfoJ<8 z@yEIzX`91w=b_;C?cwn2)QJ3%;ZW55g;9qhp!V(u8hsyNy529;tbQQt{|`J;?&JKU zX6R*y;j`v9%v=|W^xz*@`7RWD?*GCFt$SEw_61o}?m#{BJ5IRWLH7YIXs3D?arb}X z*qqxqc2a?*XKy2gf!NjS4{T!sMFGAUX6*wpVCWB|?+$`Z!WX>w`xKPRexdunClM_? z>BYp8827FThQ@)gnIv3f@kvw)ZcD8@jc2=sQ`~tHf!luL(7faDGXIUilTV;}lVI>m zCxut}ifeanAjLy?==d8r*Z3VO1~*{d_zfmqZX)hnBaW5cfac(OEK$0O+D74m_FjX+ zHsLOeufnvv5jV!(fQfx0f>vHdN#`%{TYDV=f)_X455Y{~q?G+G3+59JYJUhqg=f{f zdIi-l8ll}a7{|^vAh#wM+L!C`Y0d?h&Harb11|l?ueK|{^dGMOGwcFF4*f)K>}Bjq z{fY7=7m?u8gaLUM@#A3wDpsAto-55*^6)G?N`K(Y+w-WKEjWD3IfTjgJsWZkn%>{A zbNvOJ>+lU<&Ca35?JHX9T|h}fJsP{*#*NEOPnG&)3WCDw8XRsq ziESh5acanE+*tJ)UZc-o)SSjcyaK4D$JN$f8Dgz2d#5#0L&%wkSL$KpK>FF!5&+k3nYI)%yighyL<6L$`M zgkStM7%0|ZbodS2I93N0uj>fSuR`F18^WDdBV@;Q>}g+#yb(9ib5jNOlm){l<0G5~ zUPZ^BAMkPF6)b644V97*C^-lR|NaKDUCMFf;zc}rT8A%7gAp?RGt%uYp-J%SkL#CU zIIJ42i!NcZT)(j(%8pMe(3E%%F@rwC`}TPxjj6^!{Yy};_<#YC=P^zGE@0jT7@w&? z@Z+-x67F@$^K%Glu7TsnAj~wY#xC=-P!@b`ap@M02_LH$a2p|lKSvhb#GwZ@aFaRz zfB4$j!qbB$7D55I*8!WA!-`BxHCfDU_uks4oyMUEkeJ6?{moU7R3`4)=FS8(J~0d(T8 z!eMznDhjXS(5BZ2HN1#hk~^u?xQHy_&O5ta#x%*P#9D-)^v)YBx4DGIzHcyM-eoLq zUxYndWgf>D;X`9Ef?np~;L>xbTvm?iOXqOw+gnTsKaXQsML6E=5>kx|FnQ)Btb37% z>66c(`{goBSRMq`UnQuBJ_iN&5)55@7IFKEaPHd$q#t^X&)v_0@Mk6qUh*gY3h14A(GOAfr=UPbqsY+TL13d0{Spe5bZ7RI?4H8vO< z&b@@^)DS34%ZBsyE9mEwg@0I>! zLRUDdS2>qpT9<)tzc0gOk8n$F7m<|l6eeSZ$Fmn4&?ge+17BiwN;sk$v(Tzn6rv2C zqVB38}B)r7!ihF4JI12`??n7&GCZ4!FK+2Bi*mE`l3H8rls1^?G+6+88 z8iB#rGmxPYfyx7ESaIzZM(oeU7T3Gjw>cNHeuZN0*=*S6-@&f0Stzi-i;_#3n4cGl z^3$2HYIzThX@U>Bgkf`FI&56;3wQSvOD5igvTinVj^02(s9-SfTWF5Y#L=U-(Y;o< z0KL1&8~qf=!>(i8mTXLZeH}_Sp5vqOO*x~V!tkH#P`7@D0R3pp)Xl=?3DHo@%amvN z2#aSt$EyvoNY#CYZgO_t$d4ngD7VSP3lT7gfIV;usAg-QLYzTJoEl_dDPhr|3q0`lkGMbP#X%N*tHK89B5O{Dio zM*BOrVGx;&{6)7BusjiE+QRQWPQdDbJGfvTkKqf$5HT?x!>sS&_s>UI)OZy!iyvd0 z&JE;6CqTPg#`9GyMks`0Z&)k}8$yucCUJGaRk(DF$FpOyPLkrVufsL`I3S#z?QJNj z$KY`JO`LcXjUMU3D?WRONt!XRv3`Q$fpIvnBNd~TC8B2NW2nR?qx!tW!O4lpUz!BJ z;mIgGkpREn$R05 z>DfdK%Z)>hsa#)L0t!{)5p*jFCFf%C+dl;*IgeoZCJKs0iO@@x*UWfa2$FGDjEAXi zoLpNBv@8>`>q!h2b&G(xJeT-YQ8@QJ778bXcmMGSdz51^cxEhyZ3xHU=0`}diG-eg zG|bcG-_~e2JbDZViOZcIr%CK2@$KYPw0{|g^Qvi3mw5K|Z>Lp*8~9^!OuB0`;` z&?Y1XcAgKR{xKfoPDNna$3%%6!x1Aq%NQ$yn^Ug>2z&1_wUGAj3@T-V})qfmsrVL}H(w@Gz6Y5&BZ{0#l-qko*Ltl@DQ5 zpN5q)BC%UA{octE*Y?W9hM)Igyeb=QGs569@g??lyN6)&6ttfiiNyF6G;WN5!_+jS z^?Cq<#ZNJ_%YB^tDR}yR7_w#WiY^Glk^9e(CTnNt%`6m3ZlueMWa#yOAaU?xbms%? zHBE!xRoM%xgl8Om7qdQO$bNYn5mPg9>u+M$-N#UnoJ@J)W8oCa~lhdl4PH`g#hIo99boEbU`lCo$q6TS}_9UdwsIsVDQ^8 zDCp-S|6mw?R7)OG;&aPV;S+=JVe*F}1kJw(Ut5VOp5BF#RUVcv2*dy5=*;74PTx0f zOk*&ip}`o8F_sv+knJs7LI@#bOACjMDZ$>(E4 zYrMr|j9j0xc*j2T<^YK-{eQVadFzZLgo$N0t*&1JvVbtzmdc~V zVv7Bf*fIVRR#OwvcyNXE=?T<{9$3FTjwdsopmXpj$qJ9?IQJ;FBdam)oz9HUHMBEM zW8StWxUWb>zt4RX?xs@s@($XQ(wJr-{bo@LvGvs`9802d(QQ0cWDm}GK#^w(Q~!QQ zL*HZ!MFZBgPvlba6RdkDF>IcAvegMhj;kTMA%XE@9<)qd0nXxy@~b zI6Qy8hiXtPyX&i{nG;22S6QzG(Hy;eSM3`2~vJNjQ7FW_?i-F1~M33`=BCbuH0j61lRt9@7sA ztSD$;kW)N`1urSfjwdGOH71|p2+w*e3{WiX{(ePtN({a&;(bkz=1bdC%%{fk$@2+g zq?a0H`V9Sz(Ud)Wj$LaMy~Uex-x7`4fu~e%iYDMnBhh|Q?A-U3=7Xv1s%XK)NUmGB znEnb!MKAn;{;+g;-Y1ZGK3GozVT<5QU#@)5JXDXi-9L-wQ; zRu28Z#OWzK%l*vCPsu2id_(h6GBv8A%XlWyUOeJ*&qVrrOV4JRh)GT>20te$M2NhiY4W`=rzZrcM%_b;F4JUFa5y(Q4~d~ zA5oC|U|rV6h+C0_X+31j-Uu{m9^pSS5{-V%q|S<9Wp*v)|3(t~t%+AT;Y?gDx<+X@ zLv3nNA05i6Pr{}=4wGKu74i9@oD^m!ReHQv8FjLzL(u&FIa#Me*gohby*~zXt>y!E zt0G9z_(rUCIOYNEX7ubE!NVo zT)8&~-Ki9wYTHD2Uj5oi$tib&h2Kiocfr*9E64k|V0iWu?}J^a9QcuTPmiG6O?>7Q zXAF)tqqx{fe0t&B{GDid{}qcnj%W&B6&~os%J4R>20Ej0q?NidN0ehkLmTUazr6mM zF7|vDR$<*x2mCERvipDopM`0t@8l=E&u4s;0#UgnEY#uv3e`Td`$-U)mMxTK1<1ZF z8nLl23fbbn|KmsArZ!f$_n|qe6~!VyvR1Z`Q|684q_4Pd^`Vc#C#+JvLong7d{^KphEiewX;14R(Z|lDQ;*DY35jj8>$6w$O?9)f8W=ncXnsacBVxH{Pfb%U2o)bgY5M+2Xy`=B)SxtxdIRIO;DZ=5Io;y3SV^5DVn z20DH6j77?MB5I(=Rl1 zuV)0%ZcQz@pMuEfP(#<>f|zoknu3`@WNofun0%+ky}r-rcR?gOSK^f7i?_T#n?e5K zS=G>SbRZ_u&%ZqFN3)zAl_z}V9^R$rRxdWT)uONBLzUwT&0ijrZ|sb4Ov{L(~J@Xsfx$ zfbZd`KD$rV3m1k+U+Vwt2rX@Q81&Hv1?j8bmIo6(=`R1S4MFvz^w|eOX&rf+qeuN2 zP$b@-dk{HmZnNy)U@S|dMqC-fZSjoVANtd_?H2ipfmA;!r{3G2K0|IWA}5f@SvSZu z4@Plr8Oyu_DO!A;gTDu}OMI>2i@kA|{(syAKfFJcqY>bbi}aIrw*#bJEo0#XfAPGp zQ*t1PzALY?qo*f{O~NGp>%m)LS1Z znC4ZEe~>5T;v3m_^TgQiI@)U9l+2a)Vdc%$;%oRcxTCILj(gS-8Z>X9Jl>6#Z{jWf z>yG>8Qq0T4&@8x1+K>na{d=3}2~m8GsNl`UsQ>wPb>AWx(_D(vAJOC=Ev2k3TKwp1 z^gb9thZ*AUeGH{V`h2TT5yI%n`)CYjiuBXh_RC%@%*z|~P_#~8#WN-ZlZ~ZxOAnyy zu@VlZ1hR3Y_&UG(q47;vf&;Qn#P^sW>!>287?a{4f`7iiB1gv~>VtgR?`gr5^eG|h=TLIoE|P2(j80uK_xFUN z?s|@prf}MCEM&mBFbw7YuWSuwV3#6x^_H{sc>&SOLMhpGhK~0G$ucZt)KBvGy0iSa zpM*)&IX+)ZX5*%_WUor2vEVEl`peIC&JZxp50})_6m=6F+V?bXCneHudOlSX5^(5w z3e&7;jD%G?GcK0)>iHOj#o{7;h?~?LcVlu@E`!vZBk(7x45^NGlwdEBwYtf4Kn%!`3`aPZOo!kHw2Y2XK3#gg4$pCC`k=cIsYW1&V}wK;;}VJ9$d3`22aj%YtocvojL zpi3kzqBSk-5Jmj=O#Yc3g__PW;tvLpu{EE>>A@H*J%!9RGb`M4!yW_7|D(EZ5hPk%5a_J~j<$M2qk9U*d6W(oQgb#WD0#a`_&R z&26I`hLDQ+#eDQni7uOTiq`9*|K*+}VQe~W>+&!jmPWdh^o{bK9BOmuzBC=3YdQQj zK124pEYi(IH`|&`9$8!(oW;VdW7Iy#BqTcXfBo6yzp^NkzUf|lBE?HiGG{?5R`EGh zPfnwFViwb`r;E>UTo~u0=!u5*$}XP8Cr>c(Y!a3aYI@xYcG)&dHr#JCsWdP zocDjGN{^h0`mI#da-+qEr*+PF0Gl|^^zk--hoyXqU$`Ft#m*2(GY zJDEZFk5mS1&7|skGUIhcS6h6PMZxI|>X$+^$LMOBgu1+^@iK|t$HdsFOqS%mCT;0={%5YO_`rb%iTEK#cye8mrhORBtCCQmA*fL+}IQ*e@bA4 zc`}1vC1Vwo#HcIs*!)Bc6w>IuKb~U&X{_8F%dDR=u>38SSi?B9-lWjwS~QtnDHM4{ zwNOk()b1ib%F#i>gSH~%P|Fq_$|jlh z>xxj1N~Y>o0XDCb#0xE?tgF=b;z_zJOT+ABE^P@Z^!c8LkyjGB1!wpioIqN7HY)aM zIEikno1aYC#(XmB6BzhBUwDH!2G2N$iE9jVc4iSO+W+$GV+2VgCQe>9JTibb;I@+RElKh8J#Z0&+p(Oz zDB7=eEbm4OFJu$TJcX-N{=WyKQO3BxqWLZN0&~{IV_97Y^8YPgQigl)C`!&2Q}8&N z;dO;5)JD;_(tasLjWIB&r_Wj#t+e~lkWwR_x=hN zIr2V=3eYK(_qV)A_`zT_FN?ksA4K=Qm(W-ez`2M*vOWe)ze_y2Ud{ZEcbogZFCYs ziC8bX)q+s`-R?sF5Ee>00n*rT}Sih^1hL`|GZ?2~Nx*xUT(Ud+2z;VMZnuiBc7hcJzJAOneRS{j|!_gFB zgqnT%G4BqoPJWy)zK2zj53f!>pyaq0L&Ag;F7T%7*IVc`dh_?8+jI{1Wd6SoWgqrr z_xtO7Pxqvq#VxLm_rxQ&24CY)K36u7x*!Bk(MQy#1`+qXp2bfBNfE~ORdo;*Yb6uX z5+F6lD=OUrQ55fQ!ON*L^VWyGO-+sZXqC#20Ti z{Pc{Hi#~L$7v5@wH>P?|At~_^4D#2aQ4B@{2S>FK6D+~ z!mB19(p`i{@b@NJ`v+HL-Ax<%Uh)Ip7>2cBcFK$JGoR7>!xMAob~EaeJSp3M1+^|7 z#E!io`6Unb?H0ZAjc5SkeYOvf8v5Zal8?9%=5!C=BsXT=l5E2PHx_=qLHHPVZX}D& zyTYBuyh>~?xiC5Urf@v2Oq1&?{pgHy56N?7d&piPdR9jd)PKC7rPQ4TJY&sEH|qat zLgkYi>CzLmn=8-j{hUF|-SAC$iIKJ|uI{xs6uaTFPWY5mS9bZ;VLU*3=ttG4+8x2V z`U$n79XuT@8I;W~_?AB7?dJd29GbA3Q<^|xpFx9i}3ia+}0J{Yo{Bhg-`-95yjDiH+s&A3&HPnvh|!R* zv~=Gto?aUn-L_-y{t>q;MyT1nXIP{G{;R$+QfUiSa!(sJ>+^MDD>e4EEcov$w)5pr z-!|bFY;oBkn$>Pwyo;L|b-<$W-zM!Yv2a{OIr@3sw#ZvMI7mP6b{E9Eb3~+I5Lc`2}OwoyY zWf(E1TO-r|Ghn0e5F4!QsagI8y_WxaS+Yd*b22{&*<>r zAR0Yh;a+En&a3AH8Sh19$y3@LF_j$46V!tCu;!-Z&kmSS{EIMsF+0#&`V`N-CJb0r z!>j{4DH49csMj8fR@}$s->uYE)?t#rm4R4{ z(&R17uC+NX>cUn0E#ITIdo-Lk#ai_tKO32dzjqInUyX5ay3O|&j@10Pg?{!C^1~{) zIot)^#pU$Tb^M?HQnSL5+#bR+batZQn$%`vMX$P5hQ}ml(T7UW*kX_Vmb=v7v8PtJ z-R9l)yuDOL>l^vG+BH4|9^%Z|TcqXNV%X&tzxdb+i(k$i`TRBK+>jpF4wrwf(e}iF zL94Fvd6zZ8zuo0}&>?CIZqTR3h6RtVGf~xo@?pYTm{_93ZBDBkWM$e-8ve6DX_;`% zEr-aOEPBQ8gXFin&b%q6+`UwR(jYT@MHgC zc8xb$yE(Jv7KZ0`(uP#*_s#gp9-ZOgQz62=$UVjw?P3XsqFU@@ojWiJ$6B)Q=*4wfaT zxF4caYGCglhl&16YGYk_{@g;Gb{@e0@D;`=9VGYUMOLplO!+StSa|;+pUuxxqhKR^ zmiXB2w!~i&?snK-7Wcfu5HoX%eJ^uxrYS?bi!qF{plm}iZK7Gu1^6&-mU!!TE>JPH^-&I7ISXUS`GMp?LqZS^ixsGTQmm=i_i z#dNN9M5(rr!F8gOi$1Zk?-AM*&fzv$zCR%al!V(e{LyK0FWHbc_A~)Y58?FeG+DzB zGv`zu{d~QtsXxu6aX!-1=aHT%HO9zXmh=*xC_9H4#a?81Ungxl~Sfr>!}MxGkPko;!~F0&me{ zkMU0K!x~`#w!S&S*Z=ZpC)elhm5bwjSJtbF?$FzV=sz-ftm()It$aM2o#}cxhhr@+ zo=2H^E0C1~ zB}?QS#Dn}CM%@j@czZTZ)d7@OWZ|__c)#AqFzDe=NYh)b*lCjQ8U1iKFCib;E3mFq8{DCC`!Qng* zpR{*SsAM69X}b`P%flFSm-*AUAw_a=!IJq%B+Mm{LDv$Pyjb+|+&Dgd@IkvvI&}&@ zj51FV@6VsqpObMGU!lV+(HLiiFuZFV+S^56-V(#!W>1W=(+Hj5M`3FMdyfR*yE}#} z?Sj!h9>rx}Pm(_*(ZS49&K_Y6NBS}-HjXpyqJut;VgK9!Dvm}Hq2WQp`xu^l@Fe|w z42{v^JNyxY=_p?or$yot5liYOVa2A$OGYi8ukxC;-D2tRB~J9ISh{71H~c)BUQS6^ zDMv9zBb6x!BeC)k-Sf93@iAjju@NTHGltC1F=S1NlXV`ApFAh@?|4j&B2g}hrpuuy zjE6^Y@F&sZ?V>mqI4*P`Tb%Um>t34zhn8{Eu6vy@l@uA zad}%3iqgLYjSi>TGLplh-$j;$)8-OKTTTd_yySU~0g??&CPyuhFA1rVZ}ua3Q5Y&Z z;pk6`7CkqVj%T9ScrBO{H)E)<3#8_YXgZ=**IWprRxOO4uOm<&8_42zNpwCTeXHnU z9d$i<=oiA>C85mP8%p)ZAb#&E>#|1>m2X8)SM}#(|5$cy@#R2NG!BZsdDS-@me41HRz6?KpiUIq57$!PW&iN3AL>(1wJrKJW$MJq38oX}? z6Q#c|T`RidZa@0z<>D~Oj}Xg~m|gL~K-Q-6Y1sopj#2rqKk6rrGi#L(ng6fF#(OdS z-YGg>_2k^7qYRQhtMBq`6h?UA@;VuVKYZxEPIS(WJ}hv{WX@*~sR>hwedfVGqs~dz z!kd^n$#>Ry;8`IW@h5NMFPx>emluDkM$FyF zdd7N6&y|f*dk;KLWwE`l8z)tA@cu3yT3Rl7K1XoBag@5@Zdgn@hUbVQOk9#p^C4&a zcAj8VkrN(cld(1wkFq9F_7_(MS)>xF>B`za(&^g8g&LO>4BedBy;~TXASWDd9>W9& zx?exRgB1=G2y=E<%@ZHxd>Ssh^YNMRRLUM4J0_a{Y&ZUN5I${{8wb)$D1Ph0`|-l$ zb#mpujiQ6BaN&2+S4y;<+4i-Bw^B=W$~#5lEmzL0DIiZ@&V=@7nfA^FbDi_V|LTIW zcniHxJJIe-5e1*5#tgcI!!Soi4$osmoC^c`ohG{8iJ#LXm#pQ4fqx+#`Z=ID`I6K- z_B3l=V33C$4zndkn&`;dZRdy{WJjQaFmioti5*-h*)JQ~4&-7!#0jHcPLp10#}%b~ z1{B)}uXT~=K8I+1c0y`wJ94d0(Q?z4?9~P6%GqjPQi#Rh2WekijPAh$oatXigUJyR zt;#9xbOdkrs~Bu?;en>`L#vNaJ>?euVa~jdt0XhtiLZx+Q<~(+H}SA??3@UfjFjg9 zCsL=~Ci!Vmk+Nw^m|x*?}6bhnQ}0VCaYYY}{&3{qw6V+vX(eN_4F0j%c61 z!sfdRsCk2`_Zhh7j!vbUz#tW?XXY z%MUWj{RT=mMx>nb_Ng8i%rzJbD+131mC#AMSx&OR4Cv(}u>@5*RrVv2wG zeac_$VY_6)qIa89-|HIbGt4L+d>MSvB`%oBQ_HAU%46;*>wrSE)(!mrW;^?XUVrYXx~8_?~)lb-*+ zMAdoc|GfM1sNL*x7XHfCnDwHAsn;4~_e(umy>?RA>p4or+bQhRgvG~g`1{mRx_c|v z21_32@m74hH(=np8JE~kv`LSqDBO@96l+gnX3`81FWvcBsrW>S_XqK1g=eggG+frQB*4IekCj(y)VT1HUrj;x_aO zWX4c;L$*$NL!R{bZS|5PI<*6p;Vo1h-b!(-aCKkw3HNuH;6{-)YhG>qjZP(FjtbP3j^N#;+eADd6AXEW9l=FwaDl$PEa zSk9FBP7d?XTO$AN{9N=OzGwL3S;DD(r_6p9p7%eIRXUgLGM}N}jJZ?{X{PGTCXAcD zP`zps#mS$zsJI^A*B^-f*MRu6W)3V|hsoUU_#9u$nP25vU&-I^eL}r)jp!!LDC?|a zU}ZCNm+3NO|5wz4S5lw-foJ!YqWHa)25oK5Y#_iC(KlM+7Qmc(w2#eZ zf$KZ={V|IS*ttna**{=YY%uDOa1 z*Pheo$_j!zHj)~(6m{JOre0W%iQO|?6BbIY{V5LB^U(Eqf|cGp(uL#5doY(*y44KN zo{Ne>6^j3Dp}#z@{fI4mPm?|7)n?S<9%Fpjkjf7-+p5=grl?iYvDXIboFpgzR-ZNR z9`SwQCRUz(i0eO_QR(&oy@^}UPQJ&`kkw?$|Ff+|Pv#KG>jvxMo$`c(qxDdTe8RhA zJ(O2hW0bCkl3o>E=B>m@s}|jXx+wo#!}-IjQI*I0rL9C~PZfdPS2JeeLkgy>BmTDJ z=y$GS#NhklS1cvDi+qP!LAcptdN(a4f9(HrFDtm(Qb|*-Hm`&PSRS}Yve=L5b6^=I z?hi?CU4nQ1eVK8!fI;7Chz-(``B_!i$mbgWH9s>nyyjN8zF#BR!h_t`Oc@ z55vAU*fn51u78(tV%H`d#2a#5vx+qXC9D2uwaikvg{s~P3})X#fLdmXQ&?Yaa0-MNX za-Ikq-MRv;VUj!lO_NdI?+Q1+fUouy%o)BI;? zdzW!W&RqSmOVKvF#Fm}QvFvbxafvG!*yjRczplVI;2fS|%dx6DOQPyd77PDzJbNz& zPcKpMejmA_zr5*mfKuIaeAs8fAUBz{^3y@?J~>Txw;hz+F5%X?ofH>cVuA8b%6Al_ ze$PZSw<2B@?G>)-90$X;VqjLnuO?e%zq%w0)ebT{77>1A2fa(>@hoGk^$M82VIR?# zPowE>DE((K9=O8w0kwLgP_+YLyZDS6cC`nccDWlZB19A=&%ZQBltI%Y|qWr)6~ z@bi0j;oX#h;*)h`%sowv-X;pu^O${QEr~;giqPMP=adsHo3e!|()-xS_qD*_IL)H( zx~~z=W62ttb@FL@r$?DjE@eNjVcDk~zTIAj?xt+C53Q$0GfQ$Q8)Z(*QPx@6qW)cS zx1z(TtjfVj-9~uLECx-nyvC~8Fp0kU_07RNau{E0}4?o zbiN|~!z9sDggZ?Z9b$p#xZVSVg_`Y5S*G;B-w(@Nnp7-Ae{GtX!agS(@hOvNx6Kj7 zf;cuVut%>UmYh`4GZkYQbkhN?T;aWYTaddWoiT?+kDi{+qp$l3+?|YT$sy6#Qh2Ut zL%4Q4{vnR&32UV}e;@kmQV3pn2;~lma>iMbWfH^GwYKEfMRVwy9hv_|A-_Ejo%e}+ zd$6BZM-%vV!GdXxvDp7EzCcArBc`0TNa4Bbn$ zaM}lpM30S$qhPr!bt7Z>&C5;ZP(@Mx!V|Nn5g6qkp|f2y@AkNm7#2-h@BDz7>4L*#RB8=TeAFdt@qpPDIRo6qPcJxI( zE|A=h0kYo*F=#>{V>ttJ$Gv&R%w&Q!DFFWTua5vP4Uws`h z{?{8DYtiXG1<*cA^52Et!qWs%Xy!{mP#_Ay-V7KOOuDTnh6%njiPo$2)QhiaqD4!u zzHy`{3&(gcDA1i>Ke*HJf-7I1i#M9@%H47|I*PWNd?SLKRUX*u#L!bdlMN$7N!;ei zILS^dOK~FBGk{`a54@L$lH9{XGUCCg^>fG1D3lS`-Pjc*ypy3T+h0WSz{!PA8Zj)B zzW24ZA6G|tqP{ecDWWHQIU6eZZP7qog3$c`{yIJkwf9a$1VnPz#tAD~+u9u+s8aXC z_@)~fJ$#4`bR#+2kG}m}DfJW1cg7Jmx(2eV#fc9?LNIa`t@v8F_+<9@+DBn^#E!kk zBCzOcOHbiVO;@|~HroqD(b`vx_T$xkCoT^Qrb5vXtMOr2S=!M{bn(huCvxrmY5%hm zzyIdPng1McJ0FO5h`sa_LDFN{Qq@0{IpX20KOQQ0jx}p*Jt>S6&3TR&1$~^b@8?7R zwGQ~+@Fv>aj>-ALBCN2%FEf}y`>lC!C>ATZ?l1?*t$Mn!Cs^{bt6aGJr{r$OIZ0+9 z9o@r@>^^#w7HfO%R%8yt$uFr*hlJo}s0}h#iva zpDS6T3R@OQ7AMiv78M6!;AYs!+(FUuS05(!pG=t_Va0giw%X$C$#YDiA=j4vokX8J zVasr{bQEK(=^B;F+s}tM*(X-MgSK?-6HlW&&p`Gr72m@gEKWpK_K=T$N2!XpWbe>u z>W0{ocpwgSc|5pZwAAF*+|P+e)!Y)*Tf&!4ILOSV9A25)Q2XKpCdSqT7M@~`&mkt? zJwr~Gcw8Msi{E2K|B)y0-fKzav20-mE%`b#jO32ySUU(W_w)bv+o^0^A$_L3En4eBZ>4OVbr=i=~6ph#EWQzCq^O_ip-XGxZsCer3NWXkR-v6Dwbk|O% z^w=IQ4NWF^{ciI1#-N-huV)uW-e*(peM~`R%1+UUQc3>4jfj6EXn1YLx8d>h4mROn zeJlzKwv(eGx$`x~+}$Jj{F9rp(Jx@Y?EUPpzCiJry$qgwn(&VM=;b2wrJT+18+{I& z?tAc+n#_IwZtjlDrgZs!F8!H{MUW}CUgn8EWro+2v(f|Xq)JoR%T?01hZdsKWhVz@ ze%+bieJJy+$BfjTI&i;-Gbuwc^ch)YMQ6t`t`*v!?W72Nj zg6*G2$s29Vxo^i&dAEaqEwj;@u!Grk;=znH#B7GUE)IYMW5__ng!$n@Ep7 zN1lNme`aT*S+kY5-Lfe$Fr;PcF-ih9Qzx@M)LJ&7+9jXf)*J9Sb5ydj`pnJB!uY`^ zwha+(ukShxTXL|vpvUZYrx-IwkB8>D*!(MhkC%LDgDy{>UqfxV2`y_X2w$|FnU$63 zPT5Mi=|#$WnV|gs5_x|bGuNh+A|Al~F41GfKs3FQHXT>M++2)XNXxyMy( z)~;vPkaCR9u4UiHn^?SDM}ySha~w8tN>^sotXR*!8KRTUTT9OMGCF3gAazj%4VPBZ zY27tczO5i*+eOqgba^xRGSOMf`6%;@#w=PU^O(hJ)LY5!v?AeDR!VkIvebS{*{O0> zIMQVl_K@D=i#B>~51F>ukfyJ~Z}r{GD!W>$sy9<~T;@u(+k~QXBjv(u=*$*9@!@7r zd`P0LARieAHdUinYwgYTt~Rh zYPxQgd0X*oS=J`=WlUFbW_mrU)0VTr{sraUI?V2HPq@LA-1_Gs#*0_s^qls&@-! zOV?rT|A~@O>oJ%lJXo$CbGo;Yd2TI=`(@s1sPs<8qKQQ4k~OallOwCh8rg0}a=vH< z&7wPvSjKs~H>jRniHXlk$_upVZrhB-&&z3X{)keSWhfa7PdR@Pp3&tDIIm4s{1uYh zYl{ycUixS)etJ-cx8YKL`SUI=eYIH`_l%m1MZ}uP%#8bsWCrsKN_%Tjp#PAKj#~6C zdd%BBT1*(&fS%m~8Vu{u`E?$d3-3^FEn3R<`!c6alRh&a<1libXz|Z6`+2TpM?TQ@ zX$dX&+s&xDwFIj_g=3RmbyTj*$^N#Gl0Uzo5TeB%gLX4=dTH^ssgW_J3&J= zzWIm_c4Dr~J$@(iST%_5_EBbz&t>Y_FBnaq$G5sycx%q%X`Re1Hl9mC%O}d~XEMTc zs?=s*FzBRCf#_hpP1Gfm-b(xSGbA_C!Z?Gek}dsCPVr=vQa_Q@ZYo+@A6fBf3a>;L z%j`A*wFxq3^|>lz)_-B8qALEv85QY_Bl^O7JXJ@@{M&D=|7{F~uf9-JJc8!;Z8*#w zgR#8#hxQ|6?${TWzZpUDAFV9S8-c3ZdvbmZ#cK9VbsM z_(uEpLnzn#Ox&`8n9ux(tM?FL@ITN+e=y0N-_x_bI^z^YZ+oLoOSd<4$eKw{;b~L? z)oGHoo2)wrlYi<^T04~oKfR^19NEkCo9O&{I=R&^nXqRnS;a3HJPWF14)W~MN%WU| zm;T9#GMA+Zm;CXP^slm`q{9r>jCjZoi|M#D3tM_&qGaWs zpnOdYo6b*I`E4TMFRH1ERQ;bmH_mVzcu790WE^To9-^~(5*brvp5~!3xZHn2%Eu9G zSE^yf+_9`_tY%=|DBAoVaV%&Ax}%=5=9l4ERMl|l-3aE`N_N|AuyCTnLmmB>U9%oz zI!OgB(f_UwRUxa}LlhqThebgp$JWha;-@=ER7U1O$$a81)2TQo^N*9E_ZpdP`0G^R zO7GBBe=@BF75vDbN^EmE)vu>8=zJMY))TSGyTiqfleqnlu(gU~NVd3#%~e%8_)G3; zz<55VRN(w-qRbe&!6y|}`a4}GS927eI(Inm&sgE=ZeqTEG+L22h)^F(=s&{$d>k$7 z>?%twRnQk^(<^-#;i(nE%l}9BALTUk8iD5OQhIHii;d?kio4FE&$DvwXKCVYbpwC9 znS_5UXU&aSsF&WL&VDXAr^;BlSd(@qt`h!SoifeqjGQ6YapxMAQ`AtC`4ZoIO(6b8 z33kuN(&5uZrn!wm`)`@!_}3yj{4A_;_azin7jsi{F_*+6Y-B<;;qS9ygSdPa`Y7jB+O>S zU&W+fF{i%l!Ll1lwMs+f(@*1{M?IKM^xIyA2YU ze90DT%k`b)Ubls0?mJEQ{qwQgoF~82KpS(5JeixnkO9|o89i4E-5klWJe|kNOOh>E zFc0_XIfV9DK*hH#+)8KCJ6Yx>tecC5RW5fs%%{a$vK!&k_?mc%zmBS7nk%y{Z06A6 z-f=qann&BPW3-r0Chw0ke4jOglBQhZhE1bYNwOpLV+gO3`DB@@WF8gn$7}+32jp=p za-8G_#ml@jmG6efsS<0XIs6zy{8q_Xe~P1HR!H6~m#^Wg$-9a%!EJXTQ#^a+ba_0kFo zL((Z}(M7i+h1^bSF&>{J9Oot~B!iVJXLr0yI(=U2Fvl}hzW*yFZqXJ;=Y=eAN`w6xRGX%; ze(NHcPn*JGsnyzbk3v^*KK%!zVEM;Fsp%5A`fwpCH{wt+T1@4)7)I|~LVec={;-_I zlu4=F*rZ9`fANe_(8O3RmL=~rP`Vh2_B*HZYKGd5c$rC z7xmFR9VU6gt&)EUC0@-?=79v0Y`GPahybqYoAWl#ha??i+B*ri{zSaUo?a}PzE+J! zU%LD*dh%9p8kKEG{^mo!FLs>C_u^xcBQBAibos@GA+x+Vt9KCdxt{X-227YDnQ`wc z8&DqN$z>NqHcs*&s?30n>8>&-!ie|?R}>el=j|9bypL={{kV(pcyhl_ICCM(Sy)(i zK4%KkuINT{o|DXUa;5B>GuwAKv+JEJHY0?ih_{uzh#MOM?Wvl1gfkr-$=u|Erf3oh zQypa!22aLt+jCOEL`j_4J&4w&3_?R)V0oq!e$!NBwSkIncs_aPLA*^?egY-u> ztXa1grvewWz8;|EU(rV@_tV?X4(08KF%q`h)7MVsfm>2!vKPab_Snxc5ntH>yAW%< zYlU52xs`T{9bwpB6kgaeDbf<7>O%~8?M7LyBdZ%d_?&7_jz$1V$p=_a93=U5OQy!k z+IV6{w^5QESYc0knmgNVY-tGaq}s`r+Q;6M3nTnWGB(lw9K_+CXi^8Pg}w8juZIQI zCeFk<2qz&rsLO=IG;VSw^P(jt$&PG1zn_ZThtZZbT2}6j(ZT(^XbYme)D*>EgBbA9 z1e+s%nEhnV%r3qtTbXh0kca5BW=ym8WsZ0ST^;;{x7tpp>#m~5nNu;!1Cu3t81uuM zLF^{Dk1r0!TZkWjgy^?sY%O!aXqSo11NNlj@f{p`;zi!mt+eka@5kO0T?J>nl}t!` z=thI_4pgH&gs(9q*WC-HP8%`wu#*`Fd(asw9O2v@+!S3hT+tB2`N9}^OP|+0oZdb5 zFy$x7=Y^XP;}Ai+g53=LQ)ZpKHYRjo0yf=@Xi!h4V^>3_Pfw+0_$Ky@4I^*QE`C*r zWYCZ8OdJ%>fZA;`S1F2)`G#O6d!DKxpA#6q>tvays7Hn9ep;`$6Xhn1-p(y_ z-4so6!X{x9Vnu)7gvs#))CRBNx`(h@;yIcdhGF7oDEm(^z1_CZaY;Dp+w@WY63rO{ z@iscgqp(ef4J9Fb?Vyi}UMQOP*K%i53>){Ylo_V+Bp+DCy;k8AcWfeJdjQ_2bmey& z$sElB9V#XV(C}6d?LEP?ZCOdLvQUEO=}@;MiahP5bdqdO^x)MT|Llp%EnR}&2BW%V zDZVP{j5w%|^Ri1)FP73Vz&(=Zdozz4w-a%nu@udZX}mI8B)@+r3#~)*$q<$| zueT;ocjYo5dlrh4{ZvuVVwucB3U`_(XV`JnLg&hCz--i&HTXZ0&O9u~_WSy&B$Y&i zB&j4xDkM#NNkSAdCrJ@PNRl2xlBAMKk|ZGsNs=TA}_2=ULhZK09oQvTC?0XY8 z0eI%&6u1CotqG_eG8ZZQKDMd@H`m>Vyq*zuH?c0WzzUlZirAxUg?H~tkj{JIBGcD! z310wp-ZNVJTA}=59;~nM>{sSF(ybO@j1u$7vKK<+bup|}=HV^tE$(Xdf0cS7#33c zm~@Ksm)DK(^iVF$6KA2V^99;kW@30+I?9*Mf?o7fv|QFhQ}-jJ?$Jfe#^>l;t%K&{ zg-9sULH5o%_FpZ4-|{z*UuA~76S+TW(|p+6ZDD=O4C;B6XgD?(_g>fWT*H)ggAa(E zX@=324a`#q?8be8`4404Gv_>Ci7|$q=KNudF;>ccL~Jdek(mJ!l3|D!A*_?!GsMx^ z<*?pjg2u*5I4?9pykrdoLiO>zzmYwT`mn$75&p`0m@%AL_k;Q<6=eNQQ=eG_b=T)W8G)q`&Yun+omvdGXrbJ%lDmzj;T8Mt`i4xy(idg0J3b9I(N%C> zI|XX3wP<-h8C&`qpsTIHy3=Qf-q2v4Ko9Hqd?r5i7m*F7*tGaN>?Y2I!dLFn5HZCH zwcoICn1j=jKR6d*1fk-eh+ATe#Tz+aw#)p7kV*!cAi z^Vtj`ru~`crnAuD{T%|wW?|!@K6uyY;q33f&{(90(&!&hbefJUN`K%`tpo9m-w-aZ zjl_@KG19FK+l9a2`E(i{Ck(=Mn>PLlwnOx@2D8t*;83r@KHpzZQ_|pj+#h65n}q0t z{~*vi8Qa9T6D(vB*4QdTN}IdKTvV{iasU;+%6P$gkK?lm@Y>D(p$CdEy6^`T6UMWT zlKn=fl#t=vi9ss`=qe9l-1M=`&t(oz(HQs~`HgQEWN=mL7Ys9{A;Uajt-{gpV0|ch zmK2itJ@NiLiu)G2(WNvJrEP-{8!d(UHJu24Cyq@y127H{L-vzC)HDu5-tJyFZWBY6 zU=Pd&hQT`HH%2QBXC0R_dd^CmOKpdl(|BlK|AzK^3J@vo;QfmN`WAkLvy=i-j9Z}+ zD#vH}c6_Ojg?{H3RPPuIqst%Bb$AqWEjwWGPX@^WZAg7Q8tJUlI7`aF{O)Jw=}IEf z{X1?&NWo{-7ewWbf|dU#OxYlT(p%qPDJj8Ov@e+0B!;W4pK#;mP$;N$qW{q_D6<}v zIcgXT3ce%sjtH!3S~0d|7#7%m#QGRzKJzgD_M0m7H+@I7{Y2*EeT8j~GS3UXpj1-@ z!s@MvnW&10mXC;5QiehAC*0Olgd6Kb$(D+^mDPgX!gBCl*MgH$vdkZ-$KrXC$Y7nu zB~cRk2blpsNfuhaKA`m2NVHbgV%TyCcxiq>ki!U+DO6+T2{HEjwBX20F_a%}!jIpg z@TjVTyOsnN3)Z93S^}}>YuIb6!h4KH7cmU~svbGjsB+%{F0M>{z@x^8xR>`$3ZsH!UZZYhxt-#mclaa)lspM{T7)<2s zv%wSu+%3a5+yPnmrja2$9s*4`{Q7z!~E1K@~~Y~$&9+OkXp(- z*y{>#*;j_sbH`zD$}7%JkAc-Vj`K~^r=W5iv-e!4AbmM^gS1aY#1+ml8L48`*q1nPeiCf$^YK?| zBF|u+Ge=k*8Q+=zAEAM`=R8wT<+bAX6Bs_{*LkY|vd@*Vr~<2= zC$QnqJ8T@!s#3;7K>G!ZE5;!%k^2BT#_$=q5dBs1DEN|(FiXDvcI08W?ik4L$>ogS zIEd_IpOM8VnDfug%NhljlmgCg^7m7cx%m;&@cxvCA~9L$uF1i?S8~|8_X$!(rJ%R= z8D0pEg2neI*!x$9=SSIyU8Vzb(JXXpslmDLF-&V@IUknExiUrMZOy>VKME+9d5BZ1 zG65}>>Fmu{;eBB$lMkz$DM6L_lpkmD`rDC$Lz=uUOC)2) zX;q{;Cqac@_g~%Yp)Mm)(ZL25odY+=6S;Ea-dRWG1~n>i;qW$U_^k zOYcClLkHoPZsSYdbi~|en!(>=QFbi5{9AtEEqkWMgR{Xqy*hFO{ z&t}%jgo%j!k9|1Nd|k$K?&pLu1jLvpGHEV6*`L$C-wf6H*YIrCJj7{T!63gLWu15^ z%{PJ4{%d&eWq{aKS0QnMKi^B2(SM1sdysXJUHT}yz)Yf5I#5)(%J2CM?m3CYgL_kO zWcg*(U!KGsqf0osWifN`FJb54JmynJBl-Gbp35?CA;b#NBQKyd%oI}P(aZudhko}3 zXvxk)=E6wK6JU&2MTDd;teMxlfbQX4P8%}EF4(>ZgrXePdX4MQu> z9}=th@#Y#L)+!iZS5ASOx#A(hB1iAqrk_FtP}ZQaMecE3lG8Q zy%YCvdEsi&7I+`p503^LC{Fgm=&Y59+xEcQbiF z)Xfe3KJ3d{wg*{$d)P0zAGiLwpmksmT6!E2y~qukQ@295bT<;&$LKG<6P1r#xlfk= zR+%l|6ZfN6WF7h>cEdEu0og}gU{|>X0y0~fiNiW=?S3eYU&p!7z2Hv}^6z#c;fg(C zUAAGzvCU9^?uZv6OAvI0Gr1X-kQv3Ewec%Zt>TK&vuxm+#=6BOdl*c0#CT2iA@**7 z=!H$F`>-CfIK$$a;Ed!<_S_ikfSkBLOvgLos!sq!T{mFM>eI}hU5^8S>_3#;h334Y zke|*TO7`5Cf8T&sEZ9k9dRXdl##wSz%Bb1QGzK-KvGdr7w<+Rh8*R*ty-*b~kNHsZa9H?L=FATjAA ztMq=j9)`6#pJaA<<_cZum2!X7vJ0HVA>M zzZDkNat6_M0cv?oEVG!0rMFo3ELwu8zs?|pXI9I?!{NM{vlOgddk-^(r0jX58=LUF z?=y04wBpEhq zjj(lg3Szg+Mwn6p2CHUaYRX;ieAI(6`-cjO=U{Cv&nmteF{|M^l;`TR4s-{J6K5dh zzl*Tp=U3-{1=Ys-cpt-kAnMu}oqYlF;(QKepPQ-lOf(y^E>6eHc1SpMWwep$$@j=%Q&H=875+`V?hK+K4++i1hHuSY>jbIazw}PIv&l&)Vp(e#X6N8vHmf(0x`N1H#PRI;4$F zlH6M`zQi1vXS4h;;fPK^lm|vR6KI!k+=$I zRgc3p>31y2DnLNJ1-|xUA)v^e3`q*?ZRK9WUE{E+y%Ywr3haTcV6AN|&!68z>)B}d z2DU)=pbT!DD?<71F`RKIL+m|iobP0IXTWHj4dfi2T5FZ>BXSk zNGysLm}7lL9EmpEwYpgxW4xFnq#}+m_EIFDk-!o5%gEdj!^q7)kx(Fpj^*r6sv8E8 zKOGPV6NOxzAmZG9GsjX0(HEIXT_u2Woxhx&8iIkTeHbqw2p6p`Z0zZw@>7G@Jg=9Q zvd&U)q?=sb`cN06US`JEQy%rh^K%R7%k)EJ1`Y8lxeuclC5Q<;6a;MEdG7acJOOXIn@ePij1=u^%f;{O#>M;I} zhVVbskoXygn!8Abbq>YC4*H+(MccZUqQcr>SJy*Xp4=Cn^pk?bxi2W>E7@AKBXZ+6 z^40_H%d6%jO!DBk~MqZ1l4~~i&Z`LANWBL&uby?(nD#9oOjCjKsE5H{fu7Bk6Ol%c$i&>E|$GesT-74&ffy=WogMT?0P8 zs-&!*5AYAIBBfEaIO<$W)(QMP`$UoX?k&1+3Br731%^Exis<-ql;sP-_Zs)WL=NE| zz)A$q>7&KZ-aysyA7#ieYi;)*ir-NJ*&Xea_^6z-T7M{ReHo0;eWk?Lub|l8O&K>| zq4a7uC5$S9dii%!TT_CB8O;>#PzA@)pJ?&WH+b*%h2F6yZa}q^Fz}YwgC=41I1|1_3T^wD!S{YRH1oJ4 zS5*`)I?wp|ibA+G3*sFkm}B<@iv0HqKE6bn;!x%z7QoJTD14rApW|F%q%O_DqIJJ1 z%9cAwFaMz!UW>cF{3HA2&$zc&kQs$fG54r2@4Yf1^6MALv;I->N`SctS$KWFo8Rg4c6Q&HP9TW3wUo zV>AQ;ALHO*DcJpc#B1ef^!Yu6$3_{L2Bjfno-A?$@8hwT1ao;G<8`_?Y?w`Ox=Rvb zN7FFk^+;$uWX|j1(P&diLEYdmME-t+(ozX#s;8o`YBh)s4AS4Q6!cFOg#E+2*nPW|ByXhQAb)QxuHD7zY5ml~x`A|UJGlmCAdbIh!b8*0 z@83yz3saFYqK7oOPs3n}ETrb##lcBqU|Y_6pVnazOS^;WU7h6q;eVY(f2ohTCqByZ z=<7;Avz8*dk6y#$v#PLVu1DJbQAqsX&-=;3Chayxsmh`I(oIPE$upNc9&T&oQJjAj z_Fm&SHxdi)fl)|Ry^USFWT16C9@}onp?oNJ&*icXbc%B`)nieY9D}t2l5nqP*6jQd zSi`JY!^0yu^T`YjdnxE{h=*LVBtHG`ad(Y`TM2i_Ma%HsI2P0?3ZsL!Q5`%S;SO=A zd@>TkhL>RfO$bYeB=Yqm#98G8C>#`lY3p^!2#B-yB^Cpw!e~1fhmYfj!M2_ICUy#; zyCMed0e@&P=LRI(|IpXp*Kv^FZ^b3C$T^~fyelzCdZLV=lhMf0Q(!LuGe^ECLSZ11 zzt=Kw7L38-NvvQ0x`^v9WFfOL63<-4uplG`Q};^4$~Ou|u@W$izKGtjBcUr71@TK# z_{w_4rmI7dwkaAz9EY>F>pW(ui*q02IrijFg0@W*{v9az5w!A`K`$K8t6btYi6v;&=l89A_QsPK;%4-Z>oIIf400%%l-k zN0jIp*q6vaX&LJd_f@dwRS1N>jO7_(D84*bMCLf=MJCB{|8)pTQzdb0R|w8d5kqo) z7;_1D9jrRTnFSqm{|v&Zl{5MK5`>1sYA~5|8oxuQA?-pST=(ce_xmZ>>PWN=J}X9G)fL(^l%l( zY(5T`tt#*c_Qqx@P40y{2(xqrSXFyt&T3^8KR5_))^+msx+BLP%y-_;Jy?XY4|^bZ za2EQ~JYYW4fcfd}sC~`=-|xZfFJh7+M@ zzaN5=l_4>P^9+&d@H*rQw=(v>I=MhAa{{yI_h7c{WZpaO#8YEUtg_e!|H<0u7~_N$ z!b=gv{(>Tr74Q{hR^efD80=wv6o&fP43LV#)DE7#zI`p6?c+*xHuaL@N*?Y=ag_&i5W$4Ha?XGa_da zRp&x^mLqq=o55m}9X@eh{(tlTda^*d>MCTl%tE5&CgubiK`YAvdW#J?kFg$(A5A$I zz7845iy$Mu943x>2$9%;b+e68AiEX;O>-b+u?DKk%@BEbIqJOm`eWa_Vy+(4q;24w ztj*96Lea zE}z5qyKp~_5mt9Ehp_ijIHWCw|1(Q8SJ-ezju~E*Z9vFQQ~2pSA!Mu(W~^Au_W>(p zSXsib`OrJl~U3&PL#5&zYGwc{--<}jfYzq4V7aKv`aRc1n z>qEh1180);V02>+8kR3aR=owR;^!h*eFYNDjc}2(7O848VJ_ms`3NIqrLv~De-@<2 z1o3@B2jd@}L4mvuc2^&QV*ea?zB-I#SDx=Oi^bv1EZkAz{9edR{EYVJv#vH~n+5Xw zro}zC`?=TK2xINoKlXAaRJxAC{Duy)@&eJII0gRZ`ysGo7WbtbhPUT5_RIQkf9Mqa z#~v$#HlAhe*a^?OGvFuTf#_6i&b=Rk`2roR3p$CoJ1S7qbYrfS2D0yZFfUC5ixUq) zG*pfII@tdcseB&>AjxswXw z@3Jq3*YaiZQE<{!hq3J?NVF+)Z&4`sLup{08|yBOlc2Pd*~3>;q*aW?zDQfD*3q zJzHb50upv#g+;hLavRw9lQ9xJ=fLTZ;HbBUsPRw#>x%a`Fg zQU<4lLXluKj`hk2c!x-%&WqVrUQ+1#kGXWb<_5iIMsMS2?pi#K$YJB~cGxL+2`J#U z3+FdWM!@k7v!U*ap>2#e4Ccw9N0u2#*W?hmCJ3I(rQtS?eN%Q4_|Cqqmg~cjx%>t+ z+!PSwk_7p!WBHoA#cYHzc%zjJMFD9PS2B;>e>7Ge%Yyt|DMTr7f3Cg^E@s|`h2JQo zJ;+3Bl{iX<+~9ndG^FJ2vM+Z8v^G3|_girs61fSBWg`(`%sN4u7}RDa!P!a-Bc7x| zRC5@gksl&)k`NSmuV9eG=hZOw%1#o4?8g+yga{!r{xZCOh+zwRUqzdQ5VC^Vc-I8* zRwg1DK-z2_>z zNU^Sf^J775Zf9Rhtst7$y@JJC0c5JxBi2v=PiwMaqsM!pjqL0AJ3u2wJV9~E5ZtuL zhsJ|$3O--V9bf~rbV?a?Cw0<^*h++)>>Zk9s7yy**u3-Knu-#Sc$U4Mrzl4g~*}?GMn=m4I0AG z68#Bhb0KD2F%KqM5HX+ruue1tWZnn~TS3g*$UcoT0%+I#j6Q{aT4}?+kN3Uw!gP?Y zzh1ibc*q>7`d)fM+zZv#L)#L2k^QWTgi=1k-{l8oK6ww%W8E~GGcDQUzSHWSA#=(y z+Gwo$C&Z?HAg#A@yuf$xP+)@e}`4j-A-C;xd(TPKR9qB%%C^ zd(*CvM?n|#MT)3w=pXj4z9v^w?olo&A`i&{&hfmU|K*0x3>1-xD`%1R6p-55ZrE-s zq{a6;*;AH92ImJ*K9EgbQ<+Z_oJrQ{Ke1=qeNueag=uGRQ}L+|Of9@gt3I^zec&c3 zsI)P|^a`b2`;PpL*D0X;E6Mi@rs;>f8jpzBJ%z3 z8-#!7lU`Q~q&uEdruI*0)@PIb0CRBGKclTLzhREvb81-fg?$)#&=B_pKY&s~)-lNKVGEuLE z=7Tgc_uwuu<;QeHu$E_CIi&xo29I9fp@_>3*!lD!SzmvTCaDKx_Ph%H-x4WnUNiJU zlBrX>4gqKGP^DNc%&TtG|9CQ*x;M#bZ4K{nuaVWQ7Bn5XMruG57FV7n9(-GVVJqpcmDpn7W{ZoNtsMqWA?J+|7Q0i&>PM{uYg^ zbIDBW737@r$Ud+H5;GoC#)?X;(|$-D!};eICs9F5Id&YpPi~Eztvq*+6c4@PbABQv zvhLEYnn+RcZ{e{fi6UR|weA^9ksVbKZ@osX!j-&7zD@{!jg>3nNNf5lOj(pbQVWY= zo>oI@11|x`O0w3@$CnAUq_~>dbJ>Mt{`Un|*Sw+N_FQc6c}||cxW8svF}eTEW_{}= z8Ch_rYFRd!2jw#(+-81^QWtUR7WFF%FKEts?7bBh$;7vNd#EgI})jrG%QiqXr%UaJK1;x2-A znM6{r=1lFeceExk7c*QwQmSnxwp!HCyVxw~1ihieb5Ah)`9reE&cubX&$L_M5oWR; zA^3}XMJKnC^XXK4%l=00jrR~I^?|e;9;1K#D+*rl2pX5(lSalv<^zA=>+nAI+I*xV zkGN;FlS!{{Qju}0n%d5#pfbLOa#!AkQfWB}2&Qq4v4qN)8}dW?HD!t1!zSq(vQkNc z&FBKMKKvM=O)trQeL9Zi=TY&DG^APQlgI01*cQB^j%7)_cX~_`*^e+@EQiwl(lN&1 zCFvI4NB_jlN#MpE#ML&EQrT@d z*0hq5`z^RHX{8q18%WjrM3qAEPzd-yk$E?<&Z3G|e7J#go;6f_;yN>vil~tN5)B^< zDL3~fMqPbL0pi?&z9fU( z>zG%nlSKmSuVOLZE8NsLKcfGe4xZ%MN^>u1x?RQjxIq%U9LxOLKNPtp2I^ry$?RGj zPW5?GO4J z$(#@QUeY@kjsq9_sh)cu8oz#|_~d9j$o)ue)1z?X$QM$6eGZn!b!7kV627W_pp4_u zSoflVG@T+@r}{yWqnO*doqsPc7}B|wlu>mN)7{_Fz?t*-eyWNxPM?Fj#s^CJ%>4+T z8%bF(3?FXhlh=)Ch+nU!!K||glPDx%&SjiDTtin6haybBoZft5ma$|GS?!F$Sdjv{ zb%psPzjG-;BNFC&3(4lJwqKZA}}B4}F_iiHaVA^J50 zM~@C=?pH8G^aY@7a0UmbcatvnDEP*SA-ymNIhR?N7(9h>P9vbd<|IDX%0O|~38a%O z%oh3}X0jXxoV}sRI*|KUW_K8lK+B=ynARzV!Tm?EXSguTPn<%`fni9NW*&r(82gue zaG-vWqAP;%v+56J@8H?z*?*K?dlDme4uQc7&TiZnM*4ovUtAvoN#;gWHvFKgy@B|u z(MFmVxt}4Vod%==aQ0mfsqH_BwFZCqb^0M=ejk}KS261EKYF*#8)-U12zq`PPkr0z zRu}ge@b_P|gIVTxzmmM3FGgzgQrco4lw9Z|Q9kp?AAe7)S_4p%-AG0|P65L{P+Nx| zf@Zpu~VNY_4i?X*v|T1^!u;=g~%2@wZmh!~2h!LDuILy7P!;mR`2or3Ez}ou&&kf`;xN<)%@5;l# zpYs=@kfzK3TUWt#rqj!QINC~&2Gv_uW~}E z1p67+ZN%#w83^d^!GZ^4P<&)NIujJ2cYw1+L2`%{bV5%MKfaa&){hv$*`~b+*u;Bu z+nsoDWfc6&cHsDON%muH!R@?Z@UGnlS9dum>N>FJM~b;G>#^4H4`tTv!MjXh#3t`V z*~Q_AUb+RjW5tm@WF!1yyC`|%KF$jafz+feaC05b^K(Z`@%u}PXLca^`T+Iu8GG_c z_K`ZS=iX%vINWta&E%;(U$ukLVl6}#GW$(?G9sU@!Pt-5D44q(0?>D|D?EE)&`DSq#@C?0y}xnAFIPYgDXOaUAz*P zRfnNZZ#nx`Oi(t9=jO+Bp;l*wlRTT2nrn%)%dE$gS>g9lU8J)oM*Ef~k`K?vQHcrY zKCm2z@9Q%6eJ)I6$04ZQ3R0(ehN`^?3nNt_bHof;<24bzA2>Qp0m_k!vHPGRyqe50 zylDdLHgiUMi4^D1Em6;UulZzV3ciwsf!;jaoUgzf%em+?nZSLvM)2&DK+uwfcsPxp z|JM1ehmS$GwJH94Ap-|DV;D&&AY_3d3`#8!Io%k!v#i)(Zh&N;<Eh!EkPOlnGzoMrgI1#hK@Y%%h&hp6jKY zE7yb}&;Em&^zoa=Y7XtwP^hyQ?opGmv|W?;Mn>p!;=KErndt7eD)qtW%|g4<1ZX(u!tufsSU=UqVSCog z`)1&Nh!UdbO@m3bI##i_?dIQU5E!QphrQYe@liqWO=svGRN+jX9Xtiqaet862KnkJ zQFnxYk1~R1GcPYl1zz>moT*gC`bcx;O-?}Nz#>#@tDrp%5D-yCo8=Dly_z zC<0#&q99BGPb+q#falC}2L6N1IvKuCZ-&4q1#~an2U7=WgoUr;p679xb94h@_p(=f z|895-vleZ-1fDGlNUvGJJdQEUV_`jO|7d*cHAC!2_Hs+vBRyLTvpm6!<8ip@y%^?O zrD4B$5pzK$QOn;=-RTmb>H1LqFcuWRdZX!RxZk!!%WPg_7qgd3P#R+D5$J9a#+Xyw z#~~t#qgL*G9+g0){}GgFiXq@I>pq`{z;3)h`j+sTyokMFg+p*uDFg-@|469Sld}>- z@%TG)pl%M(jp0X-eB%$Td32opR^8OLWFPYeg}5upiF>Su;!)%tNb#Dv;WWP=W83M$ zQXjak`A*mNtz?d^5OZ+X!!uY2TV^p^WMn^$YvT8#;yc-%_lARIGo`4;KzWn^syI(2 z)%lA?IwV2kbT>5&PlomV@6=nwK9wrIM{SOP|M))gdv+DsQ9nuh^#x>0bW-r;I}lKA zrbjl+f3oPMu4OmSx4W4Pudx3nu7~E_i-y48W?FSUj#;R+B*IL5f2H?S;1`61Z9O#e zSQzUyAL-iISo8@rkoA{%SYLiaic>gCxcxKjYz^i0tBKAXnkBxn#cJ0xs=hIu4{3Xoc~^x@dM7vHk0?Q6!w2L(p&XX zcv`(C)84lbcvnJ0B{`q8vx*iaWx?TEIo(gmW1XUuBA8JZyO;O+|6>ilFQu;+3L&-o z8OiCE!$0{MDe>O6L*f-FCTFs5?FAJzm%#t#Bihk$7uh{|WHu>-S&iAWy7&e6;5;I` zWe<2AdPMump2A^Q21TddK=PNzv_+cpTRM+u;C>@>!OE%nLn~U9-%|1EZiLjoCaGV7 zb4=%!lacQ~G}IT;gFWxyY*|cOKC`dD;}vNZw{p(9gfiWGnAiT2W;%UhzHK(Wx&H?Z z^PZ9aT<$b!&!Ra0Z|GR}h-S?D1=kagXt0_65{Dj9-MMNwC#BKfEcVxwBvEogBhuqi zD519lQnT+Ckecv$L={)6LOY2E=9CzDmo~IzI7T8%_A_vZ06i3F;SO0pbeLP1^ zUurQ*Aex*dYY}+lEZO}2zajOPEvSWB)?w1Ntl|BgFSVOgGb?cmW$voQT5&saO{zkL+9h(z;oe=d3lur05^)#8 zX=^9vFovHckxyl;m0e&-?G?Ia$B?p8G3ul*lDu6Z_7#SbVnP-E)}5u!9_}^1bC&94 zU*YnFAQHG<0`EuR6g;;W5##)52lFr%vTLoe11LPV|39-kANMTVqH1;2*-OFBM_9Xs14{dmXiWQRKhm1>WAjLS|=ku{Q4-C6CQQVEjdTqxc*Xe??Q~*{A5238ewI z0_@!#LjK;*&_6GdOtQ1FV{0_!&3wXhywjA_R)AvDPzwH@2kq%6DAOqi5y3~u%b*ZH zMSZBf@df;w{K@(IGiHnUlj4&s);$7ghfEf;FppDtB=^^J9pW{DGmsiyWO^YJH|w{M z)ql_VT)LY?&GYczg9Eh6BnP|Sx{=Zw7Ly5=#8R{N8jJM&229V6k?M<@(9N(Eue&*(fr?uif3 zD(gyif78)&`Ub_FNXO6oE7UhW4Z6>x9Vl;&vi^WFE2nvpm#|(o&GVe`9 zj_WCE+IJJbgU(XQuxrp=?@!7BS5au}OD!R{VOixz<*T^6BhHWfH^*V%=NXELWsaw< zA6e6746|?}Ddum)xpq2OE5Sp4NS<;8QCvD7na_{Vtxi)VD}VK9!G-6VJU7#y5@ zk9G)$GcP2K{I-YUsBaP_bp}Jt_ZpdtUc}O?S1C>*g4x0;)Y%+{+;s`$u{Q)2c@Y$w z69xN4=O~jo5Eo0Yk{$a6CL9T+>=PG|>v)mE8p8SPcaCKEzhSc?DQe9b;`Fx`9gJXBKzJBA#n8- zax*-}v$Z&?mN^W8HxZO}-xn&6{V74-2dj5QP|$QQ*q=N{79TvhANM0Ut=|tX<=2#X z#sfmj-;(QreOSY~zm(2?C|-U@5}&x!PdbOBrny3Y&u!`ubHkxm52)h;cNQK>Ae)B= zpqi3Eu8RB7sK)ERss~~;ZcvBo7C8B|kmm#!oR@39-@k!9p0 z>H@#qGLo3KgZVqnlu+aV>yhPTYQGtq&eV~`O*?F|dqW{V*1+m~9VvUP#$%6KDwA4{ zZz_2da+v)J1_jj8ycHkkJ|^X&P53aogj~nkqqMt-T(&Id9N;~2_t}a^T6vV5ydI-- za;Wd=S|pDvBA#+0G%txX-tNF#B$Ja7a|FfG$&)z)F-D0b)o+j5ardYtW(^LBB~k3Z z<;(`|q{wz_j1756)o#o#@_0@KR#q@kzfWZXOHg7fiH=)ypk6PD#3n`yL>;L`EW}CkMv62tMyGZunRBjO zTJa6VYMCNEy_HO3XCZ@qpBnF&Ep_l2g}hvVJHkaIe2dTIVpU|#x$)gWZ%OONbaXjp zlF8CVSiLll%9oiU-aU^@KAXVfN-;UjoQ1V7YDlAXDzY|?fkuxW3^z`IiGl{w+9x6X z=0rRdkm6niJ6%VIPb`vR?7 zLNH=KQ^9|-xOh>8IjIsjdqWkT|B1os*bL6!2r>Ik2d05N)jbx%{M{-UHy*wfL$SkbJgVOfQr4@Hut^w>A1g;g zo`exmIF>oQLb%EveqGkWTa|>6y+xdTaT3g59-t)$q>;=X>h6WCAw24#_k+w=S}cfn zwJVY7E&y#4W~r?DKr>eThmNK?>e;;xA#GiBx7-1-GR+jPW6HjcKP1S$66LMk;ub;J&|(uadnxev6Nh8^R4 z@{HHCe!+Nz4Es(qMovV*-6|4(Yrr#;QWD)hk8@`Qw8C}~ykBQg-d*;iG?kG0ZoYSX zctwXeXX703oNSI>WTss%olNHbKY=$?Khm51k$leO?3-zNJ_XeaJjb`S2yE2fo0PD9=|g9^90LU(F5dA9i>z3d@Hz2IJv{AYA>*$yOUKcZS2 z8zi59L}fyZaErI0z@8}3q`Ea#ts9?;ZiA5^Q}qQ0M;)8Tu`wYw*w zJmD%CDjk7?(^c{mJBoy9G1NV2BXjug&=pnIKhDO|7s+@yoO?(iOCP|&@h-_aGxOgz zktR&!IX&<7M7pD(yf~R`^>3p?FM-nj^11(XJXMB1z7|uup(F&hr zbQ}n$#uLn)6%U{b3G8c0iK4ZWZlh1pm$WWEM6#X_bxl44jUT~OgFCP=@}?6rFCsS6 zhgxo5Lz&Yt3hI8yUDkW(LPaU8m&DR5-zKELK2J$&+L5dtNkdl%%<(J^p|J^t%mt01 z7{f~LONyklc|DNH(MhA)TA4UgjNQE$qo!x*GyHOX-e)B{c;7#tH*VN;mw4 z7q<+^`uK1Bmuf_tF8)HMCHOqWEYb`5BqsP5D<;e$`|3fg2%JWd>@Qf>t4q2Qda$H% zEG?G(3)B5-q}q2g-$nC^@tpYG$JJKTgErWnCr-z8y$f^V7ui&}Z0Z7Ml!A{?5!! zbIL7lhGnM}X`E~1zDZLG-`s$*a&ubDbNK5cR@0i^8Z2sDNbbHh*dk#_y?^R4I)I<= zusZn6SEq8f7I;sXLh7p;ppi0_&z<#npEj8?X4fGO6G(YY4c;}4CI8X}e4Q;r2OU46 zB}JUn+?yf0v&-aQa05o)5F`1z4=@vxq%6TY_;n8<|I@W_(*A1_{-YUpl*>$J#ML3( zqrfEV(I-^6Hk;(SG$D3po=Jj6J>L2?nmAOxgXg39+#>f&W2WnBi9`R3%*UxAn?knr<2`1I76nwW3->zpBZ zpD)6c%ta))tr%sQ`jnbbfms_2N&Z<0Zp>36TzQL!k2I;3H9zwesx;VAgu(G+Nw@12 z_Z1DNujk*ucDxX&eJq35d?7NhXa45HpC$vhUm~aXtBE&zdJN~iHQBxGEiyzaO%C2I zf%;l&%8p=mj?ywxm3#)PZFXe-lNr}(78Jx>g5ulrDSc7_g1N%EE#?`z63wZ_CI{*n z3#p+g3)_b+B@x3cOuVB*VdD7^6;~yn6$J>en@GwUFW~TAk206!Li30g*-l}ug7|1E zZGH)hbQ!w3@foCkE0Mv59F%KMB1BaCjsjM>%F?mzT_P+;+9zLD4{*R<9kIONAzi<1h(!ObzBuSF=KKHpo2qA_n zV~DX!6B=twLrnINon%W=Bq0e+q9m0>NvI?tq>_;OUGx3@b${M^-uKz=?K;=F&e@cT zKLWan?10O-qhKby@-JfdCKE9`^cw13YKek>FQIYIS80=1I%;YRg~Q1!*s|w^6A-0$ND)PFrHvO|{Lds3Rl^;Q(uKpx!HjfhP|2T)gKSKniorOolXfd7rQx~in zCTcjYKbAID1iU|uEn$AIA%PmWmCM5mR0)`F%Ts z~fL;0Vq-tB8~>N0Gdxi?})AFx13)QSs&=JfhZ!oQD0d zc)3C-XRv>U`zkSE;vPV8gGkxI`ieKgglyO@91B?`vU~2pKBYiWp0pp~ra>abcP}FE z&JZ`(?qIKrkz(qi{Wy^rAQHm%;77~^5%fJ825a0zp3_0}wDuN}m$?q1p2wAO3@kqk z7Ab?HG3AD>aCF^;0sZwwlH(pk#yg0d5$sWXSXX>MvkzY)G(_l3_FTQ%F0~j&qjT0q z5ficA;H3GWx|C89r7%-+knor>SZ z$WdD`%RE$M_GB%_{(fS<+71NP{U$8O{(~o$)A>C_V%-!u^EbBPkGaEz{<`i zj^Bh?-+GJ0t*l@0)jk@b(p?z#E8jYrk0HxK~Y%hs;<{lT19wHKQ)^J?!Alim+ zU@b}qakuDibSm46sGM+|YmkX`&o>}vp@E3n6oG{|?L=|q3Vix)tB^&qCzSSfG2!(e z7|6IqL+`~{v|^V?Pg;ZM|Rn0VWTh$217iBXLntD)>s&`p>gSd4XLJw?pc`SANyQ%K!^$NZo}LcM+thBd~D;+i0gkB$|Ve@;V{ z_CeuSFbO^j4~Uq8iHP{IO*CGchxu_^#LDC#EcncL(bwtB%i1CQ){Mu^s*NJ7Xc}uY z{>}KsY=mw6LpXV|_g>cD!j$Xxt%FyKgs}neT`)-;kOv`Gb(Yu`IvJ}E&k_m4#^a=g zhtSUb4OThBMEQd$I5AF$tgF93Yo5OdoiQFa23UxOeCFnVh!e`eV=%Smw8-h^2h9c1 zjPv+of%_)WKF$v>9U?@7%TOfNP88)o$Dn0Pkgzcug({stgolnF>>tb&4rd2p;`2em z@AhykF}Nh!XAEO4#;d}H2MqR)*(B52BRES<*qZMUKD4LdCIe1YW=CxzaU{?IyqQb@zxkgt>?(q+Bz zQ)iDT4;X}h4{s9zaRbrZ?U1Ni*$?SWNg}kgCx+N;5HjOIT>rjN92hP*=lG9k9MB)i z)w@ObNH^TMyo2W<=C`YG|Ni8Pfre3{;9hSy_Sz|YTkJ74jOXjegaq@+qV%OVlw(H< zmjq9I+B#iK{@D+=xBn()@9x7o3Cl#VwJV&zEfS~vdt%>^K_dOkAk_UbN<>shQ1r_e zQInnUz&=xCn)YDdtNX&R!v^PTE(=p*TWo1QCK~Kn3u#A^aGPU?VLuNsPSyjOZ%^{P zV$0rsi$p|_JuH%{gv}Xqn7;TZ44-yoZ_sJM+(~n7^H3xkp6)-3_Pb92F})4Dlgnzli=t4^Q642yGK> zm?is*f);Dmk)JNwqs$!Olzz> zQXrE2d$51_zanV7D<*Hr5Y;7WsOS80^GJOZ7Zr&wajb*(^R~!MwZh7?>B7|Ty@=RZ zE_&ZmMd*@3v1+&yiof0!gSQ)^xIIJ6N`5Weo<0y|&F_Uz>}7G{Ci8K0& zT?`A;LP|@L_@$Qu*STC0X@hb_Q1Dr?`++Y4-1$70Isea}+pbOE_%}|xdGid<{g5_@-VLe477^F&QGfG?$ub>y{EgCGD-+$U$ zsN7*c>yKU{_(=iuuFJ(ZM~=s*_7gM4q{3&$K(X3cfo#mXiEiOB>}O*mhW>p6L2K8qlwiw>Q`i>qoQeehb$nJF&1zpagD(7@5m_%(}#atJNpB^kJv4#PhdU9V~eC1lY0CU zH9^vrf5PVS5a~d~JGd;YkY|{G1o?SMo)vFVGE_zSFW(+`TuCa=e2b*=qw)fsI&AjY zDX;(IGhF!k{?j)&G4`W(<@~pp$e-I5zJ+5K5BcuV_4t)P7o#3`#+P`{Vx5F3_dBWL z`8(_x_{iIDejVoV|Nm=?2joh-li26NFjZ=qTZUQPk|e(owfOaIoMbMlSj+Cb)KK~q z!700>mRYY5uNooU?fn!pht86=eX2sCriE1Uuoj2SCQ30eFL_MJrIyxb2v-;+g`6)( z(7F;|7cW zG?%CO*I*NWPUxtHe{!j}m2DN05;`f|vI<*kOTFj&zeLj8PSQL70I z?OXU1K6i>G<$5Jwt9a>%`6H}fGFU38c#Og)>m@hYL#Ul{mjbdMV)uPj zDb)W7#=k3)Pg`2bH8V1w|9m#;yxP1wtV`f%A@j*JD?vy1GVi*7S!3mSC!HEshThZ4 zy}|kU{ZBjTzjkWWVd-O40Wz~DOCFrpUw(GE)G)gM$AaWiq|pPse)CA~&v-z-LYsF0 z|3A2{lm2VFDE=zX;=KN?hEA#+`v9G`Epo>btos=F$h)ELK34Mi%WLk#StUhk@4Sf~ z^RGxHPi|oCy{po&S)9K&$d=r+bJ37`N{V`Z8`(GGCF$KQjGenj+82|H70n@%Wm_H` zR+~sZ%WgxiJ74nj$;R=pFsc5pTR0nQDAoU&i_jl^q^RJVc=P*F`P@mjaQEJ6d8PF| z_83?!k5bHrv8Bu>T9%DVQy0qDrQOAKzOIqWa$(u?rFZz#94JrgB;Sj-nWOj8`)=TE zSU&5dr0i_`)UNTC?YjlV{7#y^>)OZ)Ortok4d;hgw#(9#T&2`rBd?FQdzCPII zU+GBdC3Hq-OLzZB!KG1Gq`aytxL0>f3J$mqgJZE${+M(;x%iLd&-#PdbX-dR;{rZ3 zL`aFz8JHcqOe+0x1=oHYmX!ZVg>KmIlHOY8=l^CYd9_}Llcle;rIhEoe>3HS7hhq$ zS37C$zErgC)|R$?IL~>q{_-e|O!j8)q)?~p7&_vU{KS)V9OLUX{x<`LpM&HJAE&{( zo6IMSTlrrXjj=@OFuo%FPdB&e*fk zq5iCQI7CQsp+}*1f4yXC%=!PMOLDgh`?-|WUS zZ)J2$Wu#eB7)Dd$71c zT|T(yc6>9F`8fJ)N7%(?Db8{`Y&Iwg{|erV%zq^v2-u9Xj|-%h^Q`^#>AvK#bR%j? z@}=p8>sb>oRVr26%D&xuqyv{W!g|OODWLmSl>1MWe78iwTee=>m$3m3znV!-`?n&} zPUbV6+c~8V$Y_+3df}GGM@mYaAe*w6)D@6VWUHt$_lY0U z?3YV%ZLh9KPg{V1HHxD09p`>BpGXDCf545hCEt{V&~CpkRprgbt9v^ohi;2e-Tfaa z;^7jQ)u~BY6WL$EQRY(>5r#mGo>Ep*2z+&wrGVi1Nd0+S?k8CLj;|wHeFfHZI!lws zFGW#lgM8btMW_l&lB+XM-`a`ig;?HW%FX2yES5ql>ZHls?pTVFD*PQ${Qdu0%~DO_rog-at8OA|_f&Y@F&6dh0q86@6O(5I z;&4^F6!dl?_TGFhDZ7owh}U(J>7%L84b7Bfzy8YF&e77e_!)Rj$dY2XjtKoQGHy6*LU{1 zQc)D)NyG4u%LhrXW(?XdF}`dy6jYolCCCCWw@0$%Hr*c|9EM4uH;1#Qq?L5)*HLhs zxlmeJ;)^#m`{e5N{z!0<`7{n2g&W6JrKn>=AY5fWN#lp0{g|CFO<^56yPo2Rx;y6H zkwoO|-dI`bBHCv5z)n>|(ca>N@EmjDJ5OM0PcxA+u|MWNE0eM&4MM>p1u_43IjC7* z_9FsT-h&<}Rt}IRjF7|5@`Yq$;fV#?UP?|`uK4ATC6d?tL70~rB^{XP16*LNsL}ZaZ>(OZo-z%JNpJE}>G_;_UStgY$ znPb=7L`i**4f@q*N|D{H5b-)iN@EQY!>7+BX|5)sEyJbak<6=i8!63RYK)z7-XB~y zz?NU{$!+>;qa8eNIB8+w@{b@9!@aDKFoO*Gr~w9;8}ic`XnD ztDlK=jy@vKWW-0xy5{|vyB2{WAz~h(xQjqFb;WAw2 zBiq#?hP=ElHLfZZM<4wo1>LC;S+n2C5BL|00l&z6yq*<_WmZx0bRmPTFV8RBb{g!H zX9d3znxlA~<+g3gA-P*dmDqNX$K~Uf!rPg1x~m_HwYs~6+nXGQ|;xDQ`7l_WGLq*>6n_~Ma2jSG^ng|S37JeHFMXY0<6tL(9^XTtM zjsIK`rwa1rUe@^{&RFK7cRW{2(!3{6S;)19zsYt z-zb7Uof31Taatn#ABvCL- zSIT-6C#(WwK0e;ZMW9N)sLDAmjOAq_B4V$Yq}4347Hko7G~bK3s0|`mw_UjPju5)K zT9Cyr7M6$3iU6zQV*aT+B5r1+(ASC;DQ^yosY)Bg%CXTRH)RLc4s2!))(a7kH&?u< z9WU~}9}|}QR|vhPBSL%i2H`Vvtr)y&vuIp7PkbK2&uRA_pW>7KJdru|`#-E=?3wUgO2wo~rDT z?Ij*Fzs2T;snD5Vi>euFqOaQ%#_{CBSRqNs&bo_>>pqCM3EjmaO$%ftf0Q;f9}*Gs zA$rDT3%wX4@iG0blr=>XgYNMD@0ui}-i*&%wMg~D!lbO%eTDf$zTURJ!uCXep;x9Q z4%Kk~Tx={lPOTF*s`*k{FDEIQaf(Tc+NtW=II$*gy%fDqQH&4cbmJrnR`-Y#TrDI=SlhI%-0xvPx>D6FKl!!N;+FR;gfMf z^0>u#ka~=i{Ja)b7Q3ZU8)m>}%{6IN;4#RQ7fBBn-GxuvY^iK5;}^>VC7;e8A}IHv zwAf`5`&S*7ni%&9iinhS4o8VBj|8cujo*)5qGU2i(I-nDEJcR?6cHEKNK?3GQueV) zes`KZMTF}}6V7SCC$g&)s-oV1cHB^;(wy&j^;Ct@8-8HK3K=!9W~Jsi z1?m|6o&BekD2MqC6F#fZgulPRZ=Q^vy!nEHHbpYt@CDvBDpYLVil+t&)G)t=IX6mV zY151eGt|gX^C!AmYtVGoe|+qxMFkf-U{s_|hK#2~4$!1Vvv$n2)%f3ebyc(|Df9>E zlsc6(+5dUHQI_8Faq zinOg~BcQBAp^mH; zgBtML6a^~j^A2~Slt?q?E#|S$uilG#tanhRw1@0-(ymOF4(}kzRY{ik9$g|7D1A;n zzE&$z+R=JUEKs5H)Oz%gl*z&H4dyTBdLGudShrA-EV<2it3vDhy~glXRjRN449y&E zN_pLgT_e=#O6wAHA-vwfZyWO>0|u|+&!jE(af(IsHjHM z`hP&zr+i#{0}>Z@p;q?~c=4|q#TmXw&QcB95%nI))>^cb`7?{SpCl!`L&d)ul>PTx z3{z2~eMxor?Jf7mS9Pr0p-Icb-(cZe5@;|UQo-R45et<PkU; zy(gUX=zEuXY&zD39Qircj?<;_H|n6d#(<(MJ|R0ppQNYnam?C~qMxzvjHf>NG4ANu zWI#zj-ms2gSJL6{sZB5-x7a$YC^DjtHci;M$%vfxf5Q4xhE&XTL}OnYQh3;V%snQf z;DTC&Z&9S>KWg#zqylMAc!hieB~s^h+azUj=GJP7DmfNcVbkQGXl&8>R2 zGL?L(;yP3n3SwMx;9u+)ZT}J{OqFQI{g*h%^V#5MFLBgYktTm+u9=lG1#NlGy4$Mc z)awQMUs52;yU+0Yy&^RzJj4776>>RWiH!L&@|neaCSMhrTm2N!RHMN&Dv<4|L=!%g zW8Vj5N?cNoz2Rz9S6hp&htx^4uom~@G|1JU7Jt~PlQ~{tkE%9JXCL85&$a1$OfByI zqe;@<8pvwZsDQ8ETh9H2+p59ZlyI>cq^nL&mM`(hRf7r@tI#CVrpj}CAIG&xcBl## zFSx&~eU98LO-g8aj>0|ar?RDTBv>QN|`Teke#JNQ?;rQbWE4DCsrZxUp?|4TgBeZx>VWp9QI3eD3+h= zWnM?DZj>SEvLbnja{OVgNSW^ZIe?#kOc_=`SD^A8rI_Zb#PjWA-0M^(+5S?f#;Q@o z#3$$*BBK|q`}%RYGFja!!PW(eBz=2`@_&?Qd0+`tH>gm;qY^yoqe_{ok6^;xw&nRa*OE$mvYv8sH>&F0h7Wfw=|oiv{5`Fx^uZS>rdZId*d}D& z=td#;nlU7pzgOK1t4r2YT*Nh%$u<<3)PdPcZODPw)4Ud||E))Xzgv@odn?zm*w9C= z-5mAGnszY%&^*nCoH(!HTWL#{XyTo*|Fz?5ZE2}vJ6ayu{cqiz9BW4@ z&%VKPrXAf({)!>-c2u*b6`J2{X*cIxMlW`t_>1j0df%Rgo%@dY4;?5n_8ZcD94M97 zS#=`^s%1Xpwn#gQZ*0ccI(zzlxCICJdp;jpP`JN4x#qT`*EC0(JLD(YV+u=t zk1=T`^=M2eR{1SPDHxM4&wIKuBQj<`D~D^wbmCGSTGh>|^m`*LC3DJI_5pOu zlw?=l!}6plWwH;}GJSJOU+|W3Qj`B3|F@?ZIrDrO&|pr3Z#1xOp*gwn=kReBNK5G{%ww_`0Te zSjY{-Z2FR+U($<*KBR)#G(@#my) zdrI&5nb#=?YBz4eon`hk`_V`2;Pbol@6T9kPuiIc*req^>6038*VLZ&(L2n0XGc!| z)T5HRQ%gq!nn!e}m3$ppV;pFjH*42>bf?|t>QUEZN3C4<8oa}S^u6EUWKa)sHT(?2 zE{@bVq7hMZdyvbxkGT1^J2lAPL$2vaZ4Ga*%&C%-d*S|!OqCPe8eBGy~0WD;IvR*6nsd4fP=H2Sitf|j1THaQui21VKE7mK0~4yRtHmjq8TtM38dYw_ zlyjj5Rs|-MwyGM+_9hf$z`kVDj44jxCHtNmQ5|1z+3oH^~zdHJ6g%lLG`08jX(7Y>-XDI1^>>~F*ao0 zuMz{7*pi1u6*dmAqWY3bBp$LM$Cb}9=&Uu3fAx6Y$;CnDKtzRD2&hdYoR^0JgR~53VXtRUUx0*DW~WK_KxHE zvR^Hx-r)K2YYhT-b*GPpthY9*JGDJ}fxyGv$*=4g`lUKhV|*n%F4@zzvE>*VsYVSw zA7SqwGKz42h@PPe6n3r%NKm4n4aMl!tV{)+T%WvHM)NrjdGWC-700k%+HPL2hZf-W zH(tlJAK-nZ5*3@Uj`~$)s?0BdLb3`K{49VGuiH`T_c1g_fgH2*(W_ID=3cswnzdcX z?Rpt@jnXE=W2KmwuR)1^rLfWNLSCAW@RUEBhdjjGlbUqm^FwU9phY1UA0lZg@87H0 z>-35`4Zc-`j6gN&NGimKhZ^MFScE=yT6|p(aoWENwX;6^l5BNK-BJj}QCie$U4*jk z>Xb6)0lIzCpy-nO@G91#(y#(pp3tVo$^x`=yy)tj&)Uj56lzh3k%Khp`|NyJX>}p< zjjZbytw#~@WzhfLh0^bq;@v=w_d40H@0Bj?Fn)rDD1CZoTZYAWIQch3_5*zd>j=d#Dh3k^1tQbGTyV9W}MNrwGOFo>}O|8|V z$Rh;^+pSL-iG?^VbZB)BYfaj4+&A$)nsoFibP4BstqjRudWgTf8PRmpLiUdDN^_kb zz;LZ0&9{F5x8q$YX2E@QY~{Fc?|lr;DXv^_p z_GdDoyt%B?Kih~r`99T7nowNAeN^(iqI0tdA9#Gf&@W#^PtZpNi-AwYeL$RXoJ_E0)x8 zwwQUb*5p-HhT={ej$g~Lfyd#>w8u!OvZj@?Qk?H;O^sU~V#;(Y-ftH|DT3GG@CTUd z*o{hE3ebGYj`H|Edj{K)@6N|?{bEao(jzpKTT|515>yVbrGVSTaL%%!6a1VyG^{8j z^8p$HZOH5I2beR#itz{TkE0Z*;LJU&(^sZ)t$f@ctx7HVc{sFNMuwbce{)}f>e6$u z&`gEeF0%KCT#52en=_8=J=~Q0(9=gmYX|-f@flEmWz&Gz&AAa9lqB zCX!neXhQE>h&NZFm1AyUk&`k_v%ZDscM3H5WhNRslt}UD4UA>HCz7>Da;iA~ak+=| z5t=lsZywruX;aSkySSOxg_d`@2h-m*C`8=Fi`SZz6L1&9M`}>ijvRb@%<+j{4mK|1 zc+2cI(s&%N*i_YKs7axCUQG9Y1zU=HmRg3;bXt+ALoMt_N?wTZP&cc|DYLpRl z3!a@kzFlu(`)h4VTznJW5jqt0@D|L?G$=IZ2IdB8lIfvLtP0U4#k89!ovg#->;}wv ze6_Q_fpvmD#TVW~jx&$L+FZ-{YE|OBxb1^PzC!ne7USkHmr9LU#3gJ z_cCEWtSd#Yxd|ObBXal7LWQXTWiv0smhqc_i8tZ5#fYMPZlYm^F{#eEhl4G~bfD}W zwy!dxDCA+5f*H94@q4i|CBGrLm>kV`V$59}`d~z@y>DaM9t%?E`wi)8M)^6p2r}b+ zY?oYYFf^g6yLT{2m{CmlZ7lg@Lcx8q;W&@y7yT?O*Xu@+#_T~oz=C%B-o}BRmeiP# zgV^n6)HLj0yxwX?`rO}67I0kTk&CdckM*Erq}VS5BeyG2;n56~?^2<({nv5D zLXmcqWZ>wpYE-&115tHKw9eovCeL7;X<0gom&pkCuHbT(Dkc1K70-%zT=`yx=R;+h zKjJdN=O|IY-b)bGs+4G)hKnsSnq8BMBdRL2^3o-Y?yp21hf~pWqcR;Bm5PNtUR=~J z!2n9+Fzy2GIIEE7^$U=vNOJjAjX$USR48H zGHu#ca1s6OG-&qZ3)uIUE}8bfhF)*QTXn3?x<< z(1fekn8Rp9r&hD(&__M;^Spv1A^PN@pAM-)hqCmp;Nk{j@<_jqF;Px5zWO_k`#4cT zpD&24?n(do{CFq!B+sescyX~OH9q}@N3A`{sroCzR5{yzO@wRyk9GXDgardr?eC6DEx7O$RRjgkzNpoeKMjUA`_9X#Ne6 zV_c{#9lk>Ooh!Mf zwBhSHSBke_t)Y>PoY{+j0G6AG+J}gZ)AJ{O|h*9`f&6x3PX+ zA6jnv1qbW;kakEjey?)-Uz{91$&Ct2Ieu+%qt>_|@XGH?ts~m;@qAx8P~L|7DSatt z=~qlwcBdMC4pkZMq&K!5O{d%`%<3Dg&bd?RjW38bai@0|nh~GiP9d?)tT*3}(yn!2 z!*CBuXB_ukVn3>n`HmgaJV-m?2a>(|k$KZMM1Sc=^T#y7JpZd-wH$hb5K~v$R`r?Z zkKUB=`UCa__NKx}#)0R#kPpYTaf5nO@whiwl-h^dHh)I@UwtS{f&HCq`cUbC4>+Rk zN+XRv;Nv`3YCQKI`PX|>IqMrg*y{Sfc)gceZ<=-SH9rSe$~*fSh2d_L#5ix7LSM?T z|A77KZnU1C%WcIz6tM3tc5m!Mn>fAyBe7XV?-Blgb~kr&y7LyziG4}+;v4*V)SXtdhuXAB9;C@WQ{7JX zqqx`aF?*9cxjlT3VgCIn(Uy6kQSSe{URjYl#iTNxUEYJDI1ZTX=1A{GzQWne9;9r{ zdP>V3=>^9t^Nu-^W%&z)40I$nuD6`8+npMplySXQPjZ-83-?9*{?^vOuD288iPiXa zk>9WCOQ`4YI5e$dogycS|Lp}7xt$PEiT;~jldpTUyovD#) zZC7N z`ngc%@@mu+IMd+kFA><@i-M27^4>H?{v07a`;ZRD zm2UjIY3C~8I>D8O-L1fmRyR7NTMM6qeMsN28b)8;sAhW=#%*^a-@ji#bp?NKTqOdz zJyKVJV_jV75bHAi?n`rPpTnH@iO$1{;9_D&#y=jQb%He&#NWrYKwC=cGIdIt@2- zpwf2*7}=*g>HnFJ{1zuly7PoN*UpqV;0cB&4vr*lO!cq5bo5w8NRA*4;-@7as3Fp5OxaqqH%Ppvv=qd_gH5v^kUi+=o~- z(S_7cmmvF0FG{y5Lhig?^0cWl_H|*-C(UebBgJD6SsbJ zBR7Q{%sp&DVaIP`=Uz(+QoaE_b6ZNW=Xh*wH=1pl3*$enNn-x(rimPfq~;;#s}1GN z%!RfA_m75L)UC6o%*pIQXlO&eKW<~!QY(sElZA(8yHV!NoA|cdj=baY5IM=7%vEzC zt+u5D)9>J2FMFzO&S70|YwDPn%^t$G-(jRt z)ZmwcWF4M&R^CD8WG8Y`ya$~tPV{16K5}^8+wsR;v`=xQ4#(RV=E3V3*A3s=$^G#V zKPR1@66Zv%qi#VnpgZLa z%|v!CkIQA5Xj{{Z99ieQgZt@|4cS;#>P!wZ|7E=>XA1ms3p)<=rs*T^0WmHVz@7~* zi&bfic?wj&DbeIX$xtlPp~1nIAdA$ZE$tUs+f<#@75V=WUFZbwKRc%D(6HSpSiVe? zJoL_^V~iHZCtM2=%kfo@BxEl%q$cJkugEqcuYay$!bv?!AIkgOKz-64aS6LQt_Yu+ zhD&4gs3jnkJx2{`CD&0`_3cXIBU9k>!+?$iUPQxtT{5@3z4@ugHu z;QeFtt`tNzb|v@F3s~uHz_`zO{8MR2zK_qtG1rK;e7*p~O~$liX9_Y5Ovz_%2JEdE z=Qg>{b-u==U677O#>bUaGZD_Xx}oAVsF|8kPWn|S*_e~x`>PmIWkR#euCR8oF_lb9 z!%eavC#wuh)$B&KG1p*GXF<}otN1I!gs!BsZ~YC%Daun>AIglbFe9K-m5-Z{j*f-q zG}ZnxmS;1*cO?yXj+s+jAJ)X&YeBwSn16l4jNERgU|)aBbLnYEiJ#M8TVzE#Etl|)=ZC2cX(&6-IQw0$srhJ4F(Q@c zIU72Vn+nA=#`9UX-uF{?%9wo(1DAHEX+i05?qN&A-e1D!=k{dkdKr^~7_TtBgup_^ z`5i8y_OlJ`8+{SeuUV7w^Ya+*XUqG(3m7<@^DG>11f@7o`Jq%ejI$$`Wfu{w<3LWX z{9O9k&?$rScss(DzK5Mhma+qd?7slte;jG#HI5^A+}PD#M?1$01&-Hov$zMHa=iu* zy&lwHoQ}zAj=Y{<#`;(V^8J|v*?bkMnVXFBQ2h z<@@>X*Jb21BLOGdIA8qoEEZ|0lH0tq$RDFlc6y1h<=<;qlYmr?-;_@!uum!T3f?E+ zL4OqrS2&Bl+f>M=G9JHOmXR#>G!7*(?s@Gr5^k%}`up)%`A~t{Q%~dGF2+TxPeS8^ zD%EA5W{(_2D*1U5+3_kAJ?kW@e3(Cwd=hH6WE48;1o9RsQF(M6RwO8sufYkJ{;Nv! zwNF52Ci5F|kKz7NHByX>McxK=>bM_=D-Md3vn>`ZpiU7R&tXG~7Cl+c9=U}&lrl3J z-kY^Z=6wz^b2Mp;Q6jEC(V^mAi3nb!P2Noj_@=;lUiSH$Xr;k%{b>|BX;SdCGnk;M zO>Vc&;0ni&**{nh;NLEkB|C%A9a_}reH!Wm)oJ|Ylh6*Bz!U2%5qCh*fdu+0lh=jy;Kz@wzlY`#2(PIbJP~ zMQwx@`B@)D&ac|k`Xm;UbNIZ>iMmp!M+c&k;mh-p;=?2~tm;a68RsyplJgy3lhI2s zPVxL4bVhUDU}qBMJL*wsej@8b8IaAMbMU{ZM~NBQT<7Q~39k5oNqP zgI|2n_F1e{C^C_dvP^Nb8hv*;A^d+CwkspA;Y zvnvH$I?le+jF+UG!fbUDQm#G8I&p@yaMp2{?>C~_>=PI=N{cy%UCA@~81_6d zrghv;9F`bT{JvwjHqw~fLgJt?(3I45l2F*ooKF3nghjuYP^42L#xssmmw)bm>wG~? zGNx>_AeUQb5i!S-G-oBkBF&Um+a=)a8Z&C|dltnxCKNT0>n%2#Q^iyEsM=#i;~$*E zn-$$?@DuilIB7;sd(U9gNpnhwJ%g(Arqr6nI*Zj7)VenT@A!NLWvtf_U_smZp2n4* zjPKk%3I9+ts^aS(Y++5Il#GI*wp1%ihHAPEsb4q;j|bMYWlSQxNtw>~iN$wcRodhq zi@|eM=zGo)j9RTqwWE)qz)+ov{g2}MX$8tVdrqt9 z*QC;YhjD`YYxwOWaEa6=pBINQRnlSp3%3_FDZ2MTL^BU8W#l1T4eCl58;hAQ^vGez z5$Fsxq{&XPybt!ED{UQ^-rk?oA9uj~N`JedC zBRy#FH`eX-96&LyojB6&$@_qIT=n&&9ZSCBApboe`wR0YJgM$K93lfB6A4fDyG2GFU3Z>SjLMTOVDz_iYbBG_BW>zfx1Gi*lY?*l2gf_Vdfa69%p z>o3a5zme-0>jzTWVAd7N^`;2NZ}|26K&tQFf|51fl=Jip65S;lwyy(TZF0JMyB$k> zKjs~fS}q8z4862oq0e8ogOs%%_odD@*t}n z%m-`oApH{!copkGwa)Ljrn4Ve9e;yUy8URb!)th~@t_HF>o91iCpFIfj0k5>dUy9D z=FaO+t{gYd5A~$^%m)i8>HoiYxpe0Ms$jm~(h~z{+rOV+6W~Q2%8fYpyC?ZBe}`Wp zyvXpA7lozOA!yG)3gdip(g^;Y zF0YX@b0GOue`LJMo2*8C<~*)9c`JOv&=cNN#W;tRmp6^)eD<&^eqIrcSPIAnK8}A^vD%G{Ij-;C(wCx#JjL|y{U{~2mOa(_QH;$iT%F`jQ~OpyGV4dDG+)9* zVjQ8R66wnQXw&s)tVifh<2x%@`>;PHeXqs31^sDLcnv0JdQj`HFR}ecKZ-A5Jiy6= zB2AuQ{VR7;u6l|c-X7$)`YDc>^e4BU&rwz7L4oTk+4HeKDF;+wwc!9Nu&9CVU@uyi zUxUQap5&!lg+Jd9;C)pU^8XpY`=yuv$I+R`)zrRSJaY(1NRlKZNt#q@t>*DaB}tNy z9hRh-Jd;Q+O`n1oq&))aG_qo5fh?1e#eT*<~5ioe@{#OdRZ&Eo;0grJ=~fVgC+lYk2SOO z>#!hO&X3n)Xn7B1obZ&C5^Jiyk$Uo@p;V230^K$?Y(M=O3@_R6#giwJn{UJFM~_hE zJe2AuAHr46Yp&GmoAj_@?Z|tmYhuDg;R1ESgQ`WpG{|)@^}gQ1`JN{98Z5q03Ln~d z3-><^qEgN^yow#ft3Ch4!5_j4?JJ~TGvkXU zqQ^?JV2!MsS0$O#;?XUP>}M|5VFjk{Gh>0(4g9b-XPDF}8x&>?I40j`v;`GAWPgjz znc{E*Nr4tDTYUoxb#qodyaJ1#maLXKS*z_sShn;IK8>~Hf|++v>pO(;LAUYrsLXG2 zoZ_Dj;kn-x_!KjQKmNInE0=~a#9r!{^DP*8^k2-D`7Qg&ZRk2!Q%n4||6H@=#UHoP z_J9>9S6)TOIda`g{qS6=HPftbW306m3zBc(VWTx|4ppFSlr=wfyN(^jmMn?53a?vo zKBwJ<{)V9}$*9DaW`<0CZLQoNistV$*L^Dpj1q%HL+p zmwMZhY%^+VmLo9Vg4t4c($6vHRuw?Xr%lO+w#!o{Tvfo-T)TRu{U1fYNmpb8R3znQYgA=>V z*{F2}%ift&{pm>JT{-iI17(i=jrH`VO+LFbL|fXn-_ZldUp%nC8{V}DjP zoWQHj!V@o_K+mTA89A~9?f>?b``{5gTqwMA#1Y9q>r2ZW2QgS#pP`lqkvGYJF^c0j zZDT-#&=Od?>N7>wS?AXDXJ&jczJ~W_g_YEigu_=E9}r!AKRWy@LgrILeo{Y)ZpQ{N zRD8fAtp>8*z66=q4OqSD2Tp+6x1?BK$DofAy!C>jBi<>d%*-_hHg{;iopm zxVp=bOWqWtXwCrs7K-1) z5Uf3zemoAd@kX3J=8&i9>>N6XUw0fvv8IgA1I4&?S?U@)Prxi~ zFn{G8!HdCz_@e1S{C#Fbm=~e8(UdCfPl%4(l*+A-VUwN-mmDdi_s>ljG~fW5uQFzik*v20Wd0q#A9anQKQP=5htMvJ`Mw2PRYWIu zG!Od9J$Pl@E^Hj2&G`7;2$Fi`In|w*K33Mt!Mia1mln0Ma$w}4$sk!DTyobU9&bnV zCei<4D^3WntKOF*zCBHPoZkwI);;(#DI4CYJ!zPq1I@ENm|K($^Hbf~^xYQpG1g&n zV>Vvs^<-_&ZFrra%h!YVqC<2qUd-KtBNKJ`;_n{3IibUYr)1qz){AbHyAUS2q4duM zn9;m13m)x5l5mB*m3v{TqQeNyU2quFiw`4mVKk)=uMRK3r;UB7XHC}a9Gy;_jhB!Z#|a!Qy~njog92?7l3m*a3UHzO4P2gB^OksHoox-7S5nIJ_M@@Au^k z^&AvVmAb@c=^Z1wzBQWJuzAprRWaM~+OQv!)UzeOLZ8VkvvF6cKfMoUOW!AbcF`)t zbg5@FEGmHYto{rgQGk2%2GDNUK7{KShz>O$Rpt8BI<*InqWe?r_HJ0_8`8M_KCIg_ zkXe5UU^is|P1fzf`&dI}1m?plMW3qLyYMy4fc5=$A@H?6kNn*M7klB+PWy1(N;vi6 zz3|^Skda&VKqY(tt#9taec{kS=DXq0$AG#2?!ckP2DF@?i(F@!k2dYVk6(j${KH-- zH5v)m&Bxa9m(?w)n6Uu|^I9=!P#SbxnltX) zI%ui4qV)?cv3~sv?yCYh#0Bcce zsLaV8Yp{1=2fp4W>$jmQ)Elu0`-?@V(LO`^a%OGV$l9T=Po%oJ`gIZApscM(ppGZXDB#h=k`6Ey!-W6j}BxELa@H<0!0 zmrhi5&%od^4SJ+)hPtQlkp7!sAiO|pb_V+1mU+ZE1Ane|q_J%}c0KFNgP+rpt=frE zqc))5fiCp6-H41y^7q^Z9MRBVqVyNIJgKATxl)lcuM^FBrr~jzn(*gTEEv$4HU;bP zjlvn;tcTzDj?90s7VXZdu~>2s6+6|1Bc(uhMmL6UNyCKeqLaRwf`7Yc@W{utP_EG6 z3)^)tO6^R&vup4ywi|Qbt-(&w%X`0Ejm1lZN4(5}$|6nXY|6sTSKSzJcQZO~(c*R4 zo*=rDi%OYjdQWtqM>FAGBf6>)TXD`>hfCgP;pN%x{Izm3HoxgX8>h`M9U}FQEt?T) ztHq?Zo6u6xgKn=jVQaeRQ-U(^?v6G+CT$YkktRQ>WZ=yf;T>5UaqWUOHB>j^?_w?H z)}^D{cA2m4Wg@x1%&*Nekme!tu6jBg)@gF`^Yys(Mw8)FQ=##p2b))>p?#JP{j4`& z<~o^Q6VkCwUvw=C*F$53=t!F-YY`^8{stLuO`7&( z;GDI1F7-cywp$To)te8mZ-rHIFZxfF0X!q~Rt+80k?*ITJNfw^2=&<1w^9 zOI~k*W^2*S$8ScXPd|n%-Hi0k`fPq{Gwzi1VYK5WXmya^BNsEVxlWg=Eu>%NqCR}B zu@R5!b)^oLhD!xad9J_ofoLy0GixV zbh5Xsnh1 zrQRykxs-s7rc&2=o&b-59hl!W5lZD!*Xg?)4XN!I(|x)0trTq(YZF07lo z5(eW%Pp-QH?-Dw(NGkzGYcyGFmW;0jT8ule8a}PbKYjj6?>MsN+)qfn3=1n7F`)*$ zKI<#?SCRF?ul~q({q=v4v)zshM*TtN3_I3~uS0D*X?^K48avx@=8ezNo6eq7_5R`? zeS6lf|A|G@>{+_!8>U^gBX)nn>q>jpjS-F|9n0%}iO(g*frb^|uz7?d!zTPed@Co` zod1o?9gcjr>nF6vII-;Ecjzy2^NN7vYy(P_V+ zJk6Q$x5c;m(^2&CU(o)56DO!kKX6B9R^Afd&P8X&eg27zbQe~i`il0`U6^0`8x9v- zSSo&4y~QpJNflq^D;FxIH(=E|7he4-{kR-KzqpUM^AT(s@eY^mK!a0nv7kAbQuq>8 zO>Eh8!Ao?hv8DC#7f|bA$6wkX;Uvc`UGyRI1IU1-FL1-do~l3ILb1V)hF9MpWs*I& z%H!b|<#^qG1$#NJNt<4x#Rp0~`UOT^vuFOOk7yre&uGh+xJ!FZ_mZ5hXa|1UD*lfN z4%FTF0!||wXqWUB@n0RN9P$Q%6CIhG@li6-9a!t~9#=h`=ydZf=IwQ4#FAH7xx|q_ zRGz~_-I@CRKBD(nXBLY-=3-lCzKpBKsq4=4TUrm3q0YR%>J5&}a$@-i*{>mTeBTO( zyX(wQ=_~fS+=Wi(-y-9zi}2kyIOXm_-G{G`a@Ur|qVE`S(UxY{YA|7i4JXfffaAHg z{2)4b-37L+PP>Oi(o$=Q;u%gxf%?}TWBWERZNLNRjc6xzWyud~Wlw$4mF${ADo=WX z5s`MH&wGLs-gflxc!brmeaV{pnA_i;6_rnL^_3kPL?=@-)1Fb{PnbH%j`2J0VZ|Oh zt`VNoJkWvjjy;7(HwUUVt3^YuJ#~ujLKp9fb9x7~9K z(P=}ecm0O+rL?B*uzyjZX2X*6*I;#KC{wOq!KXkQzTEUL-W|8$8u8yXXoJZ;tC8(& zOOFnBkeqG9#16OdKEpGK)$HPd&?Av%e-;VEu8y&s^MnA2rtL-Nt=Wd!8)2iH%q7Ss=au$6a>JSaBUr!|dpH^$J=BJ5opZkkJ$edQYf; zQJ^DDM%qyM6z_+*da@}3Sk7M?{9xJ-~jdC4`{@ZY&6HC6`M&?o{#*Da$lGcv= zHTD|1ua|iv{3^oBoM_SY4(y&=(mU)D?B-h&qC3bxZ^^jgGEAKw;6Dn#Y$|=vG~_%cm*ctc+$#}|Ker4sqis2%qv#p7+3>0ISs0rQrT&c5aQ{A(hHXzFYlSUq-<(HTOIrr~ zcM@r_wzL~^1_yP((#fS*AzVK)R6b|9Ei)P~V%q?)c27CvrwSu0F9OHG$v$NmHId9d za0wEJCw|IH7&t-h6UFBdec6r$i^>pt7K{+x?`TH{&Xj!m`a(Nuzqu$pNY1D9s}E~q z#~9&S2II(GS!WOzOom6Fz=~FmEO>SaI@cZe%i$t=+_UEd;XO88?5HR>gJZ277$$m; zABJ`evpx-^TS$(;3Ak)DXRccb9K6hFCi>rgrlxGLJ%q|YGnRio04pVPUcYe&rhSAH z6c^!EtqJpd3gJ;^&X`q4@cyRo>LrJ9?z%ar+8>0`e)(VR5X$-sPjxCp|C{E_GAP39 zuNDm6Qv^>d`Mi<)q1kf?mzWm9e7W#w{e8$-A?LmSacmVn*%(!Vgd@T&+nvOfomMh$ z9>=VCmZIA&f%_v%CLTC~dq$S58eR;i?bf{B>=>+Nd}Q4%hQkg^Dz5BD-?c+&BRc5w zr9)}_=O`kTq#hG|1O^?f*_d+*|@_tIedk!$>Xwjiw*L?aQ{Tl-FzCwxQ;&gU}yO zD(sKpVmg?feh3*3wk-DDk4JL+D-ItQU8NB%4R)i$0@2Og%f;atgE(Q>F08E*{hwbp zl5ZO@G+`^63V*zkunSQu2Qm9>F5*>i$}tj z{uoIe_L1l?Gqxja(_q%8yCRB9K z#;$#k4Z^h)Jq}YTdnfXxdI+$0d?S}Sl zsbAeFz|Tdd+^R2i_#Wo`Fk-K8922(rDLg>+EJ)KQY{ z^YC@B38yaKfouN4wP)-_yp|d5Uhcw5(e=80--#0e!n@pa(Hxd+le|}Sd&1Le_rOTT zv45{T@jXd>X2?!>>X`D}(i|LZX33XUc_=EBc}IN@9zU?4oBwXX(9#mhp7Ki4DE~Ujf)C7u8bi^90D$}LeCgBKo`!j6ZW<+K5W2CIJpU&>j z0_RMOTB66S`gC+%E}W+!9X>;aJH1Q8@f>|>S7%^Jm2e-g3 z&g#)`#d<6gJzM68R6H5lm)YK_XuYU6=Y_7t^(;La&RC0~qIboi;nE}Ceia4GIN!zpN0GS-P(xAjiP_n&w_<;()I(gP;VmjhYK0fS9$pgWL{}cP74t>s7;Yl#zkwz+RAeDA&WO5Y=|~nXdh%cf(v1wMGcOHM z3k_+cScj=|2GjS4WF1$D9;48rsmOKsdOgNm6dq=f0?#+5Y-+Vhd@?4~UB3aU z5ymteo{FZ)CN#Q}ih?NN(dSdKNUm46yX%lF^^U+XDflAwleF*@6xPW6>>@dhR>FOI zWFf4(8K>{bl)fP5bl8xI)9Z&Y;Luh~IA%`8(kz(x$oxE7`bT)S;KRjnxU{JiLw3ZX z%}H68_Kn4a@Rp)4iAC-1){OWVi-8+t`?P30-7dKXR*T^l+MK1EmLNv*AU*}eh(1sJ zOg8d&N=sJnjK=;aqT|~Xjmd0I4ZSF|@2Skl#)Y`nJ>lT1>(=p zj=_?O4y?3WjARXU7HpOb=t%KhZeA>U2~}GDTrAl|k|)t@A&zwI$hE))My^W}IU+$<*~ z4tA!ZpE(taqP%WwP+f-QPyXk_kAd@D@jd;w1oOVBvpy{vEk<->=7w10*lRNMMhxOK zh0{kaLYH(6PL`frF+ttw)jSrV??kV7c_B9XXs{uE5$5jhMsKA>sL2-pQN|)9miC}Y z_tiKh94fqjGO`PLGRI;y)NglZ?&T!-#cDIld=;>?CsU8FLiRZE52mj~-v9J{&lAOG zr%ki8m3a4CxQrrM`fl{1#>$mAd_jw8+g3<_n4a`YT8V`NdNO(W3JeGlu9LkA>(}Zs zymO-TACY;k-wL$(BKpAUc&JtN;_1ID&{=X3esoJj-hM64T(Jxhi+i!Sb~!%1)#Bum zrKoi6P2+v>u#o+-TOf}c=@O&jaWtui)OBLzKGc(0ak232EcLG2%kg+sFHSIzMT6`| zUAGtvwb7wc+*0&k*pv0Ci_pGpUlx}wL)XQ+EM6Lm(^B=y(U ztDyIzFN23j-sj4G^goe+{Iz|VICce`dI~QuN}URWYer$-3xx+Z74A9@&!DDmooi`w=M0K%z%pc z%!)owlH62fHg5R``?|Gd>Gdg+*WH9K%_m{sRPm?Phv9wy*7AEk4Df8mB9)2KFSiX< zbmyR4bi<`tbMg0&D!uciAE{i=I?;2{?x1k%!{IpmS^U*Wvk@vfJ)1@0xVS)-%F-h* zQFw5iIuyr`IobJ2IdvPfiN*Cru%#!L{6uv5aAvtTqWGg14b48o_=qb_&b)_Nq$?u>-(cnf zSL%4Yl=10GjiWD+x!zrJQ9j_)0ynNue-BkXH)=e7i!&$PglGJR=dayp^YRTYu5+i! z_;%81<3wC66x};Yn+G+-$CbuOGb=J-vdBr(cO*YZzzRzd*}r!+3w9 zaJb-^S zVlPJZe~s)xUW~l<9Pz7M*zm9pWks$GXel}Fny&mcvIc+ub7A!Jdr+%$=GH^iDD`n; zj%yw2Zo4wW;i>f5mho}&F1|av^SJ1Hj*OS%u;M9#54(#`<_WUKxbfu8$5^B8Cb>zE zF#eP~qr7Tx;GH`&B)=i}zAN*d+{5hF?nKxF{2b)LA0wWj`7bvftiFe`Mi0Il^bF&5 zJ*7_n1ZF!u_)ECbRU0{OsWn)*(SvsB4^S28!3jUAap1itu>#gXkz1CW{`YJYIOG?M-xT z>%v0O`y__A@vB!A#(Z|AO|#o_-*jQ#%o|8K>`MQJ3asqoO1-!8zILws@bnti%y(z> zo+^0Ab(m3l7nR9wG|R8VgMn_eIDZ{+sxqFvB)>l0m6q-QgISX_d2-Fm3ixdCps~_b==SoULyvz^JWIj) zpep=G@ua~?$r~{8WWhJdRhTr4iP}}@{9MMT@Sbzo3PxmCqRATty%o1m=Bi+{Q3d9P zDCm`Y4S~-+`Ly*_d`lG$^z{NJ)i|)}oO4(_%Yo(YXK+TiROGl*cvtU4{k%(vi+5sp zy9-#V;l$jVXR)xiBa6R^-=w({vuw`*%U!6gxcvX;LDA(rsyYZ)?s5?ms~p)h?i8X1 zxYAhsEp78%*z|rG-1fRKb<66dpBNnxq!sw?hI19g!awdx%F-t>T2BRwCp^5W!`<7T8iZf9z5<*j$WJH zX&iJ0b>%Ytr7vJmkO!Y0zW|q9Plm3%fbx?byb>gwCc=Z>#%Hlg&w~rzNW!9)9gANc z#j`-tLwpSX<3)B>hmp1q^w?hnZQ1TN;vlL=+p;Xb0Pp|W(X#sym5 z9KtK%=L*rclnPJRo?C?e!fk7t96;0Q_Vhk;5ci_&*u`N#YPSg||1Cb5c8*k^Bi!Sh z9h;szfd?V>TvB}uEmt@YqGL&UX3xA1CCIjQWck+P7;fZ98b`+24r~J|)OYaAeNg!>G@3qS9~iubg(IOS59kZ|TTNzk^t) z=S-I#C0MY+iI(?;$H@C_?R5yt#0>*o8Ag!K%##P#r}!oDv^^I#@F!AFmZsN7}L%D%WhNmarR5MQ_~Z z%nnQ!p4;%Z00SeWK5{)DC&!XgU*^H38zjF(^e$3Q&`jM4vo$s}e4hjDkzi%@4vb%J z!zCWuV0hP_uUqdEU$q@qi0)m*Q+VO@JZPAb3o>^8fBh=ea~FKi*)sggb{GoRI`>Qb z5U)VhxEy@;w58VEt?2y0mW30x!Sa{`uYb;mS*&p5N4wEut{sC8iQZy3dG+Xa$>p%4 z+2I`Q_ai3@=Tg^@dQW{eT)sQ9s!)3U&T-)6v|aG~Vn=J$9E8YuPuY@(uyKy`cHWJy z$_{jCkpmYEdo~CkbMENO>502BwbY4M@8sh7O5xhaa}d?SiDvWnq5C^0+Qsa}-hEE2 zt=xkt`&{^X%s%wH>P$E1z4*36=7aWo;qcvA{A+vUeq+XlcImjj#*{8&)6m7yoN?7@ zxHoh#U1Z&DA-cWd7O8mWZN{sX>yd72O4aFW@i$*|?w?Ze113Bv_5Hhd&8R**1#S(Z zuggk--vo1pU=5}(7e17-25TN$(qdZ{PM29QXW3??#9PqIHWMj>%_V15xW#x2rgq9e zp}cSN1L=6&&5}BIvM}|)5E`Xr;?ob&efG@2^5^E9K5qjawh-ND*K{0gHwXY>OV`CpWY~XR!dsGO2eQ8*^epfA?+a;uC^J2K8ikmcqV?$v*Cvs zn^8B%nxXA7klD?elRY;eoz`^Okd97f)--&u9^D;9mwY)DU2H6=AC!tS{cPzZpJVXR znqNnzL;b&@T(Ep2M)a|zm%8+uTqB&{YaNabwq*E`HRxV%%TI2baO#hZ9H)&q*F`vc zQ5qCSY#1>t4au!+IQ^gXm?B)w+d35=_Y9?(ehT_Fvu4TewLmIM-O^NuoK1N778rE`&#lSAyMA_ztQNh%9l0KwZHBEqsq$?T`i9$ay4z-y zca!?aOVOF+I#54J{5ev8H9R65L{sXmCpKf?I#PZ3MpRVTF+Vf|-W&P|Z;rvL4&pym zT>w|(-c))XgGy2Ii_39vR6ZZ{?tTB5UR zdMy@PpBnI;^D_MDD|vo4OHdqTBzaTIkr67qcWNAt=IL|tz9rZ#{^Q8+3*o$I5Nlh; zW8P&$7Rq|IMZWlXH!nd#o&mi-EQJ4^LA03>i{x-4P8bjaeaRUJxDk!E?+3AH*kZ}k z94I>Cxo~JPh{oF%VygJJ)n_h&$_N?vW9MQ2fI)1ymyCJB#Z;VEOMT6VA@`C{@^dgF zYh``;b`TQ-lQ6N935%VR#NS}T30ISmu-1%yZzbb-l?fw6AJ9~;FKyo>oDqJlu{#lS zB_}|;Z#;abTQK)~5>AR=qQPe+#w<3a!Y>i4w#nz~C7@FL>AHPlk-gfKG5ePzXTT8Z z=_VsOSKe=F0;V-JrJ+YWR6dJOB`Y5Hw-4qmuQ*)XY|3Qm^<^h@h2oZanp>I!X^9$TC&UN)u=ADV*P|Q=a`D?5kB6Oi zdm0;$#k`=7R8}2};J<3L)DOnG5_N{29E+OA?OE;+h)?2&D>@bklf!MOA3G9jUa8R1 zb0i`^bf8m?Kdy;Cx4hUNTEgWrECNv6Qv7>oyfGuAJ+<2SAVu_A#`KlkpDqmO<%>s$ zG+7)q6Cn%Ksk3j2_y9Gir92Cb?y??_pN_GcwZyLx4zx>Ji8 zded>*yEBz@L$S4?I|Fp4;NT_k@%}RjS)ykO-8LP=BfE(%A`Cm6yRxLoM4UU+on=kK zFxE(e#bd|8(5NTNFN8r)OZeOT@tCdIomc%r@JRf!#!o^~+f#H^4?<*psLk>X<1ty@ zC;G}5XlHBCyC@JI4qaGcISOSDG@0TRgoHN2uXc=uVpCV@kMu{ChU5_@jzn3t7GEA7 z4ZW2;sjfE$iXP$vuJD29G;J=3_s6ON9j3Gxg+W)k(azo*5wSg(SLTaWeS6Yr%3M4< zqC=hMkr=6`%gLCFTMM)qvu76Gr1xg&w7K}ux;Mjx^L+WD!x;aWaEa>8Aj5E|OWmQ` zZ!Q|u`Z7&r4rYwkp@w1_%947E4|baPta`Dr!(=o@2w(d#3lm1_^JPRhS`O($OP}e` zR2F~#%1LNr*o$SoL*W)Lxus51vHNZx>YSU57i~nJws$;MI_py9)p$66?ZeXNlQ2r^ z3{L0&!AZ&S%Q!d@TSce!VZa2Gz0~K2FQIrfMVA=~!J@O&qtfgUd{;;vqayhKIhftR z@pw5!bYb0sP}!spoifH^_$hrVe~Q5L&Y~mNi$t1mw~Vd}5g$2-jA8-o+iJ)CI3P{5&=~M8L}@NmEvy*Unj?7=Rnpzo`w*+0nB|f37MkD`taTh#a%?d zb=wo@)Pfo7J(2LV6$9dip=q^T$3|`#bhIrkKY1dkM2X%iPEeCvGS%g-I2hED<l)~;}roMeq7uF#ddvjw^Gyl~-J9o(Q1+LR%B4w$^EHEmoS(b&Bm^&7oVBDr|Q z!9F;6zC8`oJ#l@%aP%3&(6hDV@=Z}dvzI!vWdB0dyGR|-8>W(PcQQ{6YaYkFiu5?QthJWU3uO*hI zCmQ|TM}BWM;7hJAixrJ9vmL==;arpIeQ7fJGwS30sC?rW#ylOtz88O>w4}Y?+H<5h*h*8vg zAzf0u{aKpv8RsqzXVjqgI5~YdQ>$O2+2`S`uX}|LyM{ADIM5d1R*~OcNMCtxW@Ueb z%K{%B5q(h56>sW$NUo5+H$TmKfeFWbm{Isq`ttbl^{0B28TqhmqWq|C?#n=VpEKq@ z%wG2bbRNOxQ6I7Rn6Gfh_jsr^f)nKNhDu-FS9^iZ74p5U{zK1ABUlji7G_Q(s51XG zip>0|*!CI=IFgM@@;S>#@`F5HSLMfr zcB>!DMK9zv%}?qEHQ0G;1l86(K-#>KtQz+W|HO>s>z|LYaD|+I`5sj_{D{(fu>RuD zq~tn0eLa%DWdp-@?3R!+9&S0yV9@`0mAZ443V{UWpFL-kSkox3Io? zI4fG+M2l6!sg!jcftQ9;asMiw%0dZKub|H!Z<_gBgNlhan=btq4QJ)JTHe5`e|?y& z|1XTTdds|h7au-(vn>1$vXf-HVNIbP5c=7whEIA zNAQ+mCH(Y8(4eXURx*APzg~s$6JIX*eGM&kj9`A04TXNJHot~QOF!zBT|t_?f)zt9qf$7i(dvu1_|cPLEze`t z?*H+-v#`7C$*JAWK=qFYU!1I-|1`31443hH25G^*?CUT2fct#J=Y0|9WL&C-oI*;A5!6y#!i;evqz-uz zPsjUGrF$6`>dW=)dKM2m`0`598C*Rl*KJ#6 zAAm`X2dzcdGJT+M+t=dP`qz_wR+57!d^-6|5nk#l=pS|fMX~bw=KB$HT0zUT#YmVZ zT>8yH?0Pbc79)yKxI%dB=R)y04`b20LU=FrWKL7b8(gYj+9>JQn4{n?t&?anM8R^& z6+C0E;Qf*KL%d)p+?+Mj7;!hd{r^h#`sXr>;N>zc{8oqJ}h7AO`ThX zur~E&e5~kkmN~ORe;3r^on^ha18Smgi+;NuMFX5zH*y>FEkw_GI~z^hTp4se8Jho3KZ!W+N~h_& z;bG>=2+^HdDl9_rajt zgK8mrvBb-RiNo?Rz(}}b_g#n{=gBDlop7^oXWi``aJnL|7tT`gz@2Uza)q;6k%u zOv>K_m$3@|5#LnT!*U(g?nZJ`1z+sn0pDZ7HKVs8D?d5Nre6K+n!`P)m4qn75Xk51qzr2R=SHEl&eHzZ_p?h)c0vXh6J#s|P zJ1;v;j)%0Sd$Shq3+$OGK8m&a!l#PYAnt-4T_y=v5pM6+c?+&~cBJ0#%`iJ5+__UG zmJ0`pk{km!;g)V&H)32zd){BL0g0nTzvwFY2F6aD{Awevv=!bdzKxEz?P7t(u%1?o{)Z=38voPP!l~rn+khR#2A?2C)y2OPAThejkjp(TL(lE4(3$J*r$LpU? z{879PBc3|(MbH{-cqZrXOD3|G2#@v`9Z9IX-{6h7Jl~DYYc`j?nX_>B*9v=?FjQ&iHNX(f+=>kafW81SKqF;-{%eyjv2uJJsad)VIRV1`yDgUbr#-XZ#bA`^qHD_%p?T1W zVXYHkc~Q9e*A=k;>qu?Qc*#+AVt{;}ucJNd$3@|wa93s3C5TdWWgCk%!k=7ZdouJ^ zxH3998SV#Mc=2Ttme#pYNBBgjKH>u!jnQfSc(rg0vZT*I`CnfI7s$Hm&KU92_o0o;C{*0(M=c|NShz|4>3n|_ zX!WCN#BfylNWQ7s7_>-|^8>QkUD=L z7li$T8BUV#@ZT&<%M<_Y^Qlm_H5MQKKd}8GzF(*Du()L;b^l4&a%3QtcaO!5_NHvq zpN2IxMv|i_{KCY9Rgc9e;bf|70-%#19PPFbEI(MV{_l9yUo)jf z&M4tHCM@VQ65S42P<=`uUJ9o@Sr?2ek_Yl({oqm{u?VV)*tmonVaN$?qXTxKSnfRn;Nj|>t;vuu8KaS+9sLYkVyw*&K zn1{RDtm(I7Hck%~ed41T@R(}Dm`w{&KFW&56|)e#a0tU|ra>pif)x#6nD}ZamBQy@ z@p((uHcrJKLus*IF&8;uQqTAvj;o)A%T5&?#l4{n*gFkJ3#_D1&_7U5uwi&*sOTlF zsJd)Cay3Pldwo2tFDbEciI_q(TS)GKJ%*iYDZi`j;W?>=AjB zZDgI&iYXs~1s7X0#AqnSg{d%nF_18_DdWp5Q82cZ)TyoUOwpF*^Q}=nyeW%znZwLd zbY(;3Z(~a?s4>Ix*229mn89dsTZTlL<6HM8oE|(7zF#E=*?ACx)TMuwu`z1DN)C>J z3I3bWlo|B{P#fHuFK-(myt9hvE(S?HXLE+n?T=+Q=BpWh2;s3_|I8`8MaQ?zh8KkrUOodbf(S>drY6FMx}?gSaMX>?}>Ks zKdH*eZHJ;&2g#4~BD%McT&FiyIKQ>C=nbrKUGkKb_nRSIN%Sy-EU~Sn293R~(cVt} z4>rTtCTfz)Xokr0PV{bKfe$xDhjPUVTkE>8Xn_d^+h|bzfH~q03ctH!1milc_%9O{D?-#XBEKwnIJE7H<9Ok5}tP06hG%muHIyGG;1Y!ln1P^yjYh?r9+|8 zs7)ISbBtN9Be~^fcp*8E5527L>}_|JPclNMo4RbU_L4ppdQ8b4Cc2$IR6gy6#($(v zVBm>iDx#+~P)I(uJ}WjWFi)!w)!RBFsI`IQpL*i!2}2fL_P`p&K&n1bps>0x!>gTf z|Ajs?lw9Gz(tr&CE-;eZ1WQL({P-q$zhgXLAb!e{2EcK==!S;?8d;JDn&yh!siLR- zYloM!CC72QH4cxEI)bSeZh8$CorMny93&UkO(D7|f0{&n#j*>dxTgLy3@bmIr;=jYIW(-mF6_X0a(0gVB zW}gjWwe4T{ZV2MZJ&mwhJeGmcKe4UXSY9{(2E9pRX|d-E)C|XR#mkRqt{Tj&BY&i? zP%!l)rJq%Y0P6aFMDf^BtW$Z1RLxN=6TT9WHj42(|3iIl0F_+dBGWX0FC1S>KF27g zi2p3`T>#_nyhKqm*?*-Mu-ZME#oEuIkvW=%l53pQZ!~p=y~S(K(TtoRKDU*lnRx3z zsS5?tWAR%AH3rfvUviu-2eMZ3r^5%1p~3f$&^jJSr&Dhv7bB1_em$4Go-zEY^b)`7 z$FS(gN9>Lop$YJ#eOb+7f#5b6JCy3#fU*Yz@W9e7)9P2)erH<@JC--1l z?s3MA>;{KuMMD?@S%Ex(TsO|gf=S! z818^%yMT>Adx1ktTUHBP=CLzBX1_`OiZNAp@t{~E*(kY+2vI6Zk|ZP{Bq0eQBq4+lLdgDJ@AFq5nd+W1=RPy%dw$CuSUs@g zp0!(0F1DwaK22yEWlsrS+}o09Pb%jdvFoor?TEY%!##GS-H$nxt|J*8xQk;vKU6O@ z;t7wB{Pdg1^Ku}mi}iSO(vce3KNhd(NWbhFa5~$WiYl8ByugW!!fs(*k0VKD-ayY+ zN6JyZ4hd5yexJGqM@=hAzkC55rz}ZVx|-jBt*Bi49DbQw^L>0CX?*=s^;PiAX6~bW z5ofns)9I{B2%Th2?^j+x<{cX<2)v5Y<2F>f^D-KvY^ZBZExNsJDEsGm)PJ$1+pSj+ z6=z3PKQCimfh~1gaz4#98#+Dv0y37_Q>E2aI5^vr+3GqZ)Y*|P>wMDJ*i$2Oq3V5n zpXt^>veS|Y*NemTt_ldJC9r^2ZC!A9FJL0+UC>H`D;N^rj@w3$b#DBDo{Dd zf}$RAekgNldDe>z`)b8{YtDJ`v!=9zXV7M6Me5S0Fu>G`K5ef+uYWAbcw;#}+A^=~ zIR-CNOG8e3D7A@hnrE2`w2S%02KIwMb_&qHg{IdlSt zf^4WWp&U-i)}(#+DAKQ5QI!4>v>vgcJkG0C8f3%1GuHLw*iwYJ5+8kSNyNUSuYK&u zZ*Mu|pW9Nw;A1$>>z2gEBWUJvZ+^x4n)`M%=5jfr_~+a=l|m)co-(*+L2H^l?aMj} zwU>6Jp>YHQvuvs6%V|i?wI}(4Gnlf?o@OMR#$Y1{s@!u5pR0M?T2I0znYo!R@AKQ2 z@i|Q)_e3t`{>{BmNi?PEJvmsD&z!8S5YsBmNcUR-`+k;D+01>=vo)g`r}ChjYfc({ z^N}>toGNv5QM#RZ__jQ38*NFaAMS@znFVQH*awvrmXtJzxx*g|65r3o6`pq@qg*^Q zwxQxTIS>a~(9-%6B$k-d)`f>)8p2$(x(Ku5Ea}JgLkM_kNdcqTZ27{147L|z&0Y)Y z)+|E%I&03EJBU;lYid_J0Nq~vx>W3k&A&F}v+^+aZQ0P^Cx zcs?fy-HN%omb~6)vN*|{riiv<0(1QLDccdv=N8=!%q^yvllt@w6v~)U3j0+K{KMxb ztG2+y+nVH_XG3*0-)Db!l=4No$t4@=geo+Eh(1$Mpc#;RNRYmDda4ubonN{ zykbQ%7j|NutraPAK1Ir9K5vmoM@)q!$r)}%Yl$IA98AQf9wQ2QnuJ33X=i+mN77IO zk{uBTb&~~TTpbIoU?WmL6%Q3d=7lY*0WBkv>Rf|*JLZMARzUTdF-e;yLVRH%iEhPX z-mZnDY88h#6GO^8zJl}Q7E;gkNEBAGUb%S%)czWCU)V~dPFYMnyH_D(hzT{lW#7v# zV^W-whR)LqDOr0xjB*y!)&psXt6xN`f3R*s(U|1i*5L)~F7^6uM7GxwYF@elCl@ZJ z4zFYsTbYtR=Q7+pZ$jcr8}Med2{k`l&nDp|)V*;X7CN#{`a?W&?H1GE?}@N+U&iOl z?CW6t?3|HCK1*57E{vX1dP&JMhf1k_;JUSO5{`U z`Kt;050Vh6YC=`x67W0Kgx+t8!(d-CQcPg~$UrmtwSPSZFI`6ZOV^>$gLSx;YcYj& zrpg8hQ0TRk3g^UQBXip7QE8av!{D zX$6LrSWv7K`%1RVrtT~o6e-W4?B6ypFwmk7Kjs9bvq-Jg0z1NWNR(-T0?D}~ebfg1 zSVx)tISeZ#h-5$cqjkPO**AQk-=xdD)fvj0nG+odfUh?Dc3nNeaj<0KB}O;vA$6Yl zp=!S#>FK*6gni;o%FgIyUFC!dPYisnPZ@i>P%BGR@W~CI^#zJpZG%rA<}uIrML7HM z6~?&Z`j`3qx!ns!4V-^q;*7AD%sZ9su`!JI$A`^PI>3;sE5ztvU2Arvs`IMn<%el}CC}W5NB6AJ6 z@6icSeT_ILNyMLjI2YiyIbJpyPzviN`i|%Pfz6KC`eFg4e=^4~OU_An5Q6dixa=uW z_>Kj~YHye@3t_Wx|FEtJdMakg> zl)cU$$2tEXcBnsmS$8|ZITTyBE+QT6NTjwiFYgM0v6B(S%nO8a7T+NMcW%7&lT(sbG8r3eGPii6}SJ=PabkUyhvr+MAmGDB}h9mRHUlhniv;a+)*_vda{x z>(L}U^HC(xsmVB?I)Y5@PsFuTgQ;hyGQwQ`q4ZfQoYT#{kM7FoG35Q}VHK=4n?Q}l zGoi3^H197pG5d@%HSU-S4=L75{4*1CIlnupRtw#KRj8y!17-Q6DdYSke5jv9zfv`z zGl%sTThyRctwIH_)zIZXfqmxc{CSA?ech8V^|C6}t(}Cw#$!n0zA~P2f1*r~3f>Q& zOa)15=rxP|PM61`DT;H%#;Rbq|0JqgKMwnLPGO(>I4JaJP-UwjUYD?Lp==&PZ)#AR zppUEb)JTW-vz^-}lgxKrw6GsjQ)Mm`eorNSIg#9p{f0y4p@jQjs(0wZ((zNkLPvxGYdJP=drOv+m$vCJqlOh`DU{V_E$U0`=+-h}-Iii6CCk<+~)I{er4ep1V zilgi|R%n@t&BL^)JV}drx+WF0PDTCqDdZDA36Y#TtTRI!y+_WVbg5}D^5@*m$r^Yp zrAbOWPF2ha1Fopz?^A6OnP_0U)pY8y=hyoa`$*fBvEr&0HMTCnTl-m5oo)u%Yn&h3 zdkJc{X;YozGK@FpJViru)O1fLvmPVvZ)JaUx)BU4w8-p<5u}#sQ2O&Fkg8;#ai7Jo zT*3LH`ty*H&w0bkP2jG|xwZzTc+C7w4GTG6g|9bn9^8M-BoPU?J!CF5vkt>W&?V)g zMmWBK^C|odId_Hg4?^dm>hdfyYtzNd^x6D5o}kD11j>sEFRcX*b)8&>4ZQwz$C_Yk2j_UyFT>z|eJO75Sa|m7Lr%X(LD1|?0Y?-u zU%o&4%tv9~RrYJ8jKcbO?(zCL3eVrOj;vxNyqcvbkHwf~tC)xN`~!zOy(n$Va7Yj6 zN78?WLwU{s>T#6AtqC%uw@VKFc1TmUiY(Ha*w;B}IJ%#5ul0EuynQ7_ZB{a`O^!20-Pu4CO@*g!LKD6^O&(HmzAZoJ@QE4 zT*As*itIxeL5;^0Fl>e_rK}o;rT3YWy&8t#8t#jmFdQk|uR0-K0U?niscxHy~0W6AU9 zSp2XUN0r)2I2$sFEE#V(n+&6nndp zY|B@a*SS)S?Jp#3cco99XVmMXE9(WrYL$+`Nhv@?Bhi$$N!-Ht0&caenC-#3$<8vVQUIspTb)ddb!f- z_zqlLB_g{a?~&Riq9*1h-Pt16_jaJ+yc;Qu`vmR7ZlucGL(Sfe&)eQX`?H8%I={s! zJ9nyKosLVqJEbbVLr1kc>twi>>xesbC%=VXg&UcOUg6aj4~og{!bWos${zX#lYa2? zDSZXatDgLR{{{zcc~B|y6S*2sQnvbpAWbhC9Wfsxc3!N_Wl;64dCZt_5kkZcwB$BV|BHN z$~iB(KEaJDs~&TIyomHTS7(s4J1L!bhUNk{D&)Q?iEw^BEh#7Zu-bo*^6$vRU|=uK$Mb*9Gr>#&Y;A)mdC2z}#B zZ*Eu%CTRJQOo>%ZM7xgT>Ie;$|5H*wzH zon{o>N5xHk{b$@oMw>hR(!P!K5_cNraFcsU-6<~nI%cQ4aW8p2=f--l{^%awjPoF! z2iGuYrzaV--9d9aGRLtli;BPZ$%V4kwdi891zF?}-6*Q9#fUd){F&lS#FaiP^WFW^my zGhg3%>^$sD31`p3bG|F*pv0?5cS$h%l z7P!+N&f#&7_Mqm)moZ|uJH;f|pf25=)cE%`_IS{n+4Y<& zKd}rqn5Ps4ltSF$L=LS-&|=FxvgR~W3LNRNeFc)vFkjkt2IqO490EB%N6LxD&?&e# zIFVZ3Nz^WKA_ey6bSpT~SNjtf{D{* zoSq~2(#Twn^JArA?fLz?7|*}hQQL?jR5jR9MqL5MH`{TaYaSkyFfU$|i$Fu>B}a?! zI*s|3OCb!D?8%2Y#;dswR6e}`m##WeP+|#mS{%u#<{)1GaG-<%2jGzHNPngmA*jWH z?oHi?tn>ENwj>u0-*}$wKZNmF&ZO^p7>jcpsqSha)*N*tm%#<-=+9hhWgg;qJY$;o z;Tg}TtqY2=DV6!}ZSJiIaHbf|0tCEsA}Q?U90x}dPs@e2HuKT?T+I66LK*i) zjnOYevy(ID59Gn>6p!b+Vwl>wQp3dqxNPG}!#)>4?C3(`YwWu@?Lrox^0737M`c(s zwife!eR)4TcpZMWARiw$xKj4Xy^#OrLh1K%@J!l`s=^MVkDe{P`Mw9*%*V3X_wvTa znkv?3V9ID~Dk#~CjA|>|H*5=(ncw7n+l;^6wj}j53mXD#Nnd|AGCOT3C4VQ3CNgi7 z&wyWz4fls_$39D28g_FBRwgsAeZCowU)j-R_RrXCw4;PeJF#M-9i@kEN5T^R_x7!5 zH?Sjvr>x^}wWHIVKeE8chOCxshJLU;-J7-x-g$QPW@IENa}MVIbGKkXrX#h~@4)+G4s?5eI{rjCP|M~`uw(A%vt}E#lbxyX zYl;aH=z>?nRsrIo6zROUL2rk7d*}b~*a9zEhv`6Z&koqSf0{ko=i-Z)S;b zXYQF=nS>9_VSezw-fg2L)o}iTS%nSn+mf*}(u$n)6Cl0If*Pb(JJK{y*@WaZUdkHqch38k-n`A_U@wrdKdJLQGNR<=Pu-J|{VdgsIpRuE~nQQT# z&#(Fhu)bxK1BF;7!6ny-8gpzQj$TMwPwX)3nIY-CG>4?@BJN+X#sKC@di|}SrOCWd z%K}S3m~wwW6!)7m_mT34rT=2ir4Yl_oBiH%M5tgNu$Y!OQC=Bz4>Y&$5@1ngRP! z9xSEW-%e0fWBp&M4LonMjxtM(8IvtIU)&9WA6fsZ<%+v*{CmwUaYELdBqlgPDaV2u zt({Tv+>Clo+oD^Fb>piou&Tg{)Uw^t!+bX;#tvyQtb=v6z!-Z=QV6s`g|-T82ia0xRUrEL z^ZxM7WXxToNup26XzQF#jb~IakoyJdG*xl0P>W1lCt>ov+2qMP#=HqyByn#X*3V&` zhPNvIoyfj8(IiNka=zWFanKLsJiF@?Q7PzC>jr%U*ntdD9T$0Jx!n$jN5yN(S*h+l}|3*VORI)POwq%tFBg)=hvMSgZJD*}JRnf!TNSXKTGb`CQ zzUN=mM$V&-$Kxao+{&TS;2ss$|j(Jxov0t61;0Rpz5Aw z_|wk%Dm5dVf5=?d)D#DPvTl$0*`m?RcjJw)p8fol%8Rk@F6*4`EP?q%1AZUZhx`Kr zYE{)|eVifd*$p|zViD=Zo1wy#^A-R$Rp}K){0VL+)59?)>#~R|v{$&)idLgQIv2N0QKHPInD7&}7If#q6H(Cpm|1PH5 z6kT*Uvz}VX9KsIfx;bVT@NpU0Ej58ki5V5~dHq?-UZnh43U77{V86K(JdO;ekYjxj z;?jrm{{9x^y7~K0d*Sw4_K)1}jdA;AN#;{;j7*Z`yfaDeVUi|^Q{M!?tAnVq;+vqN z#(BT*{|c*aNKvER7h$~JQ0nUbBJ4HmNBZiY1eIL_D06$4VElIo^Rkb^^tqe^_5PV) zq`^Ly9nXb;5rfF=ce{{gHiR0#z7__)WMA3Y7Gd9K-lwl_7n)+Y|Gnvvu$1$LW1OD| zr#>oB+4_O_`e`)j#12MD@o?@t?t>1DCUxcj9n(2)dhI|M+?J=FU($GdOo38d`k`d6 z9Dly-g?;Ao)cLg+tY;~3j!bXP7f~eT%HCM}&uG>GNufMt9A(!_;_*I3N|);e$-$f> zlqSi(V0r3r_$nxtFdx+K5uE;xrmpxuf?^_Hk6gD8P=y*jz6-vq<*0h) zJK<3b=e(SGAsnbu;Cz$kLf%&;DocAMXfNXZ_n-Gd+jj1sPkScBe40RJ58n!MGt}6R zF%p(n|0PlOC`9(2NSYpUh?itNoP#`khN`o!RssD=xZiiiC=BygC7&p@p6f$iPw7091g#2Jw_Te63z2W%jqe?|>1E8ln zg=CusK=gDx#d!BawJY~uU+E9UA?*L$H4wKwCsIMS6#5=y9p5%7Sax#X_sl_P4pt@4 zPDzA*noMbhQutA?PPNzj;lqd-q!T9t&o0jQ7fGU}&s6%=CW(984;|wzg=W64F8eQn z3H!vPC;kz_IhSxkgcQt<@VdxD~S1Mw8_#BEkJ)C>zv`EuS1{|?T)$5fwpHrap<0D|jeJrA=f$%iu{L087oIlCu z2mMAN_OTb$Cj3TJs~4Zkf8)G(FEZQ9`O0_1p|HhvR&;G>M8n6HKBNG$72yeItyxxl%IFA|2#gt?F8k^R6 zQEAN!w0skjY`+iC*(fG6zfOFaFQx$2#~i;brrrE?*GO-wNcxD~x!zRQ`~kn5ys447 zjb@DxO<+#5yxg18k~(qB(}ylMzr~gdKJ0to9(8b4BTe}}@mex%<2E$#;Slg_Kx*f%49`%61exXqtt z@bxs*`_uehAJMwcpVHpH#pW;m|8b;ellZzhKgZQu%sll8B3^h>h3Z4@=klU9&JC_` z5|j8{JCyp1N%Gty7$5UuUkLYKjqv8zy&XB$-lW9*<(RZLb)I~L&TC>SHGhcxD|{$I zXvgRW-sHaJ8ETICP{NZZnC$IC%8MQ&;iNYWoBI%^5#A&UY{8QXZ|abIfN~ulve@_l z=d^rDNu>oZvV5rX{Cy;r`;v}K8{V(+rF6+wczyAu=02^+4)ddP3EX3L!;kk#&ycOp z(#msrp+h9>4aYfUdhxdFM&B_in>!z9-pj zy8+Kzo}@GI2KEYK&TqJf6~n}2x498ApS-9=?Iv=!@%+eWKz~Cok~&w9`=7+rwEQmG zGrcKKwF&(;^L!tF8!N5Fba~}Ba*MOs*6p~+y7B>%mU#UUQ z2@g`cQjI2S=6=<*#wvL+$TPea+7z)5VAV^k-2#(38&rufpx8CvD<MW|n zuviZ|omY zpEwPZf0&PcJpqd}FRFN1j$w|TRM1?C-#5Lexw;ZsT3(cCbrgqM#gsDe45Hq8kxzRC z?)B#T11GVfQ%pDRAH$q1G07h;hf;!=s*TE!_?YjjtW$_M>P@;sD{v*;hvYX_V898! zzdFicFxiLi|5DuM^;03M3V(fh{d{){;TL_#sGt%-&wbc$eH0Ju{OGaE8JJf1QcB<{ z$n$+>@T>v~&HrCdk3;2%h;`Nnu;r+TtcLG}#2I(eI8=!HW8BH_Y615PxKXTPE|e~~ zk+w`8Y@WJPMSeasc>FT|-HW+eo}~9TAFI~$IQr(HXD##9H_UHTcpT05AV6JA=kDx7 ziG-MYA@XpM?~4qL0w^8yrtH={)>*s#*Nd87=0@qk2XS&QbKfh)2-)jF1%LKq{A&-| zDwLo_!;>Zy7op*y7X|(1{8>pa&M7N~IK`8B&3^pdE~XvXCD8BkqIRu=sN;1!r}zLC z{D1vE$@#i`pKtxjxwlc?)HIy)e}j15^(n%%Y+ipn4#A?{hr+mz_02S2I(GB`EN*$z zufzg0bUKr?(H4wTW&ZPJE3)pplHH%poZloOch4<|V4mAFnteTXZj@258H<_QX6kN& z!f+9VSnWYdsVg;p-;Msm-D&Zx987H#QSId{^kc5KkNZt5#xeiBz7wg7`TS!04rC{~ zQH@D9&hj~f{@dLcr{P9_-t9yP^ClCO47_pj;9kyb?!9p*X_K9(`sGG5R>PuXD18 zbMU;>gO+~co|#FWByW|0@^9|+ULk{hL>{EIYzxB9c~QwT*3*pjqG#MUqPK+anBCu`t?sLl8%X};P_hZt#hR)heTXBE+V;0iBLMnoYpN4lf@qNOL-HH z-r(2GeFGk^W*&QaJvQ@v?>V^+leW9jjm#u$;@4B|Mgokkh^Q(c4zc>4R5EcRT90~A zgk&miOL$UebP5_5cIfr*7K>_gM%x`IKmC;71o?j z;fQv78!~gYL63zMS!tPLOn*D->~_TRE?esKwu66*HMRM$p4!r$KYu!6E$j30dYMB; zk-4&y6&AjApyntim@rQk^|C{eu08AMEufd>K$jcm;ZmWGj$v_ zL&O9-ij4??aGdp)MPl?@;z$7oQFuGYo@A^;@lnHp&-=rmW?)a5#eoPvXGc1MA0%S< zyyAWcr2ciF3B7$F&pbLqEdVyGTkh`bjrXB;RN&@@glkUR>ktS9ExwMOZjcUirH)6D zINr*7+?ojPU1!cOCB~;d&Xo6$A0|v>J?=9R4$l*@pD`5f+Rl`eLF1uFyI@9)&YUISB7N|^=~_6KWXF7)rP zp2>)PFE^G^JNp6LHZ7&N`P0$zka^fXb=(NCrq=QLNVs4@(qCqw$B6yN-!!m^{rcH! z=0ee%b(2{d2=ri188{t^C)k%iauSv-upr|}8fc4TJ?SGN zno;%1NocU;bBc3(9J%@b^K%v=Gps1jQ4K3iET~C#9HK7q`NlXcR1nY0k~zQ=8}5gn z25%SE3ojavilLU2(rkkBTR4}YH_yX(bMg!{!rl-YQlD=M?RZPp*%%|m)SBXsFGiBO z73oVFp^bHtjj2X(leQRMeP ztmob~pDmTbh&gg3dUjGcuksI-jXWuQy{<%Ud!Grhoyue!@{3B%GcL_jf5!`taMr&n`vIPq`3Nk2A>f`Yp3z& zlheYXll-_ll|o<)=d=$#DOil1NmBWeIN8j)8jml+;x*H$Yv2!IY1bqYt?U#6dTWzf z|K3nrp-FACx`hQjlc~+AU0At?`%o9R3(YQ^n^gT($PUvcebp~Qw5$%r*?tp}U3uTX z>$wodIpuj5I|UmP)+r5W5neRUp}57}g3%=QyJfZuxtDZF^!JTm@Qrg=M%)zk&6&Zv zy8D9DzjLXBo(oGjcU|Xsqwtsgs%2q!1vOJWvO9fS$hBrY;Gb8*rg7YB(RxRaj$)tO z!ka?gZz3JE370dblcxOzVR0&`^V@LPUSXf>odJ;TC9vK@25sC|9x%8cikYX@tsH?~ z%qyEchT}&4T++Eb0J`mSNcnYN%-pU+m9dgIwil%NY!F`Y@3-nDgE9^7ojBJUMjN@O z;;SSq^!V>E*V=w@9w~*%;0gBw8E6kf7Wa9?iu<93cPbeAFP{QBeCJNCbh>=vx_x&KJ>xA5;f z?s>Y|8>X?GCu}JNY33C^CEtYb>Uk7X_F3qqYe;EVdZCJQTpPUmAVr_~F7u8p#}}}k zXbkiZ8c;}rA}%HH&#xVg)1T&Z9=8IX%5i@WbCNw@7P78O0co5E(blAdou)=)HB^ps zuosiosgZcu&ir$~GT5z63avx&w#tP2BNRDLbtz@mDB{AjWt5RH7N1Wnq1N}qQ6I2~ z+RO)`S8sFv+&dN;tRqeNH5{G19+&+Yihc4HzSQ?55$y$CCuvv z;_-?Bq&cr#u!xYQ=7}eS!M!*~Yjv^k`c!|a9$g}Y)ic+ec2Fq%B~N+2#e!nvNa|@h zEOdJGraI+ZA;Ok9sM=n^V6hB!1?LFSv12LaVyQ6Z@^~uCJtjmK2mF^SGwx6T)v>SX zjYR;3tosJDCjm6<`giQs3ZRs$-I(7KK$0&%qxxguf1JhnULd7%j<%WArk}XK`o331Pqf7ku>!rLEFmk@lYdefBdZ6^D|n{9n8=45d=>4`iJSBdz)0a8fS(zw21H zDvYYP{D$w$a6bS10fQA`^oP08uODIDqx2bZ_X9{`_DifX3#6JMpHP$*K&cwiF)j|K6-Qn}>z@$nJG28W9--Wu^a&P!LpX=L1HR`%$S?jS_m+fF$jSF; zHxHv7ecqt*O(>sNbzxt880A^KfI@ANHoOLxeH9;gZw+(e`14-MB`?eMblJ5HlP#whAZ_|P;TY{-%;X{iRchYIr0cDcA=Cb(TeR_VN|uM1(QdHurJ~{R#pU4%+ofo z@|QZ-KE{sTVWgM(9ILx{eD}7YC?|{xEuO*rL;#fxxyN~d%w@LR#1Oea?lZp+?I4~v zagC7G3#5W^H=(vAfc%zU$H<5P%6MIm(>sGm|NC7;cLkEwwL2KIB8Ywax8dg)L=8J` zpj11Elrp(5X?rkuVcP(Lan-Hr&IzzoDeZImByfLg^Fti+@u0C;fF-F*e7a zCb-mao}fQPd^v}cMgH{Z9qUf?1ITB>Ww?X{a1Z@OWHs^ib1(LqJN~rE|12V#`1uXF zij=W|q?CUN!!HN09`Y>eR|iql%PUyVUqw?c;(cHcb+K+G=vg3T?&n;Y*Fhw=gg?mW z@i-5!$5yFe%J@ImXb&d2v2|Ed6HKy)YVpf2nC!mPpypKw=ZTz!L{lj9!K*OJ4k1td zORx$Iq2`<#EaiFD?p=)yPeW;kTP?0;`qAn~ z`u>#j`2=p5_>=t8qsV;4oK4~gmhwD`<6K(t$^cSi?jTQY(Y$*WA+>Y7j!wPb<;W9!i~@`zs#AU-c_7^JfV6Q&(VxMJP!OK7rQj zK2)N%52^4Y?KQbrcZA2~C+Bz!_M?K!C3qa=OL^Q^obb(`bWx17R6lyQun1dXnaA!v zh~pW)toO^uCg#!g68q5JFMuqv4`9zVKh~udz{$#=sz&a|BclL1y<-Ivg zUob6Y-_hl3JYG`|p^?|4!3PVmyEKGMa`JJ0z7O};u}{U3dC1+}Xsh(50Mni5F!3hk zo^80SA|~A0gx|)#q`qel#w}rPy&xNfifJ4<=;cRkoHLuN5uCOQ@gIlAi&p~bueo&qc3y4r^y)I%bQ+WF{d~!CZ*hX7|s?`^`x*A-oDU%R{3HzU@}rG`wUUnWVN6>-hefvUvj*Ob8^O zovF}o@aOSekE6!|s5p2dTorg-+_VA9p9GQAp!Fzt#N4H~1=RzIal{waH>Tx;Ve4m4YV`<&??w+&DiuRMne~xIZt#7{+$-4w3K?!xu*4NEAKj=k z%Nm-j4{X$TgiM&2@`PZXA6`^uCPw3K52`#S!i`YYPii>f?j|ovH?qU;D0i~+=Ii)} zd14p)Z=}SeGu#J_%y&a9MUcp3{o#Fcw3soU-5rR9R(u{*Er#}S=4$suDC5^l>ZTJ$ zZ)dLd+Z;P$y~yOA6%IZ3;&T-ngiP|K21h@{jrO55@<3)9|NJ&5T<;c>al8#Ie0W~( z_d^V?-%Y*6NSp6VZOV>N;dM&cLInAtKFsya-~fNBGd42! z)xT$pzRZg?KU)F)#GKy|fuAqE$)r09S3ZlWb8#r=R`Tob8ICa*`2PGFftL4voZ}UO zo6r4u{}PIagB+-F-7M@C#$loTw>r9F`inP-pB!yh~%9==iBvJD&Bkm!@G4>mu`%rr?{pEAwt;=vcdR&%6eH zPZN<({6xsGPW0D%RkXx=P{_ZNQ7rFCT1%%QCrd;b8^^&y#hoSXqv8|z}f66?gjEWw7OE_`lm46ANuYTmAoZ$&Po|F0h8x|rv6o5CVlL=gc%3}>+Iax$;)8?S?F!SVy19!e=464trBX-8^*iylj-zMZK<= zr0unFXfmIJJ)Vi>NBH{zQ&BOK&$(VK!;_ufoCj^n=V-pv6S4$z;->RDQX#zS!#)n3 z8-igSQJef7!K7J>-&ZaQ%lm;+if;;mm*$cF;ASCzIOn^(J|#ToeQa6g1;JT`^Y$eg zg#>L~N)N9T_FZKk}%n9J?G)~d=~aaEaJz15p+0LT~_az@b6g8o4VI2ymsaumE3M& zR5Ry_9sD9Jn8CUfrN6?8yZm>0o(X-IFCl5e*Mh`CBkoteC)nh24@?R-P^v7Vyx<3d z5%ViexgKHgHd9iNd?rlY&$)Y&p9HmX6KdPiDBOK%Mm}%agcB0XNw;?kwalGFZ(a!{ ztg~ybcqb$+VSnW82I1Ei)~&s`CtM%FIvA7d!i0&oR2ld}=+Ak5Wfz+S?XkAh`09c1 zDU|*0KNL~Id5Rr{a*$;mWYwLa=y}P$MZ*E?Td<{&(~9`G)SCCJ!(f(SPGz(BoS$`r zo^JA({Erode3U`V`lZxuA;~>b%n8dSvDS`teJ_V&84P17Yigd; z2l4lrA2$wQUmxdQNDoI(i38`D$-(#n>x_~y?EU) zk;ITTdy*ddS-7Rcb$9`m<2Jq3(d z;6j=oMq=1r5v8*Z#Yoeg&$-87)N)r!XCI7$E1%!=SHSKD1&Vu}CoJ6DhpJDf3nC6r ziP^kMxb;Pe^4fBQU+;MT+><6$D9P&8d z$Hhum`BI6hT_c3YODB-*?L$K6DK*kpED=`JagNLReL`Uz=c;Th6r4m_eBPfg*j!Md zYOP%1l{)+JB=Uqi`_-uWe2#GYk~$fi?H5EZXHedYQsH_2IBL|)5aJ$iFTm16f^#JMXwQiS+4O{%-MK{)V@bET4Y3L&GX zkn){Gq1}*uV$K_ck`T^qnz2(TWZz!fl~`f9ktSu{h!;*Yu^;Z^I>9Xsl$WwaNc_Zn zZS*N2k@MP=KO7Z$#psdQ*#p9g1mq@ThrpuVm3l0fW4zix~!!cnu=aE&HY!gb%!l_N=HwSik=pej6j` ztJ5F;Tom!2{-pVJ#DBd~!E+*5ulXJSp5n)y$Lj5my#NVSzs|{BaC5 z4(frm>~d1v^c&q)%b5p$#^L+n6yp2=vyHA4zBfBwEk+5KorVJ@QaGMeUp z`+%5xF_iK69rV&;=-l+@IJasA)oy-=zMGa)66;i^eF)>;PR>PX2q%X{&GU=AVH6zH0b9hZU!^vmJQ?wOF(AL#0_~9JMxf|^e--!4x_e5fM1O@&31OxIT zD4AHtViZN{U!P&Hc@+JSeu5i2A}QeEBdEGZkdyB&w9T=a%>dmHa^1JsObOe z_^_rrnkKNmMbbKkbUEkcVQw`0u^yt-FPai&J%Gg87b!hf~6e29$q|Acgo_2nvs&$E+)vJwJlV?q5TFRRoEJdq}t%Ne#yL z@Nq;W8T0Qm*%wLGJ8wf27ey0R-h|$qNJ1bS$wEc59-kk^fHInHX|#YJ%i9e!d%S;JhKv!_;fY{vAVlFE|JIYYf?N zzHa|1(G>FXE^=qZ(28$&A^9_g^qK33Qo|@|BKHcFGIwjd2t^@`r1h#%!_TkWur6>w< zynvF7X!_)R6@xRPs64fn_ghhw9K38UNG7vsp+XL9QRmR<=Vo3cFIJISw;TnQ{Fj3!(= z$hoh~S27Av$K3Hv?|dXM2a~GJ!`ZLQCEpZbs|CM);Rg|+7ES?s4{#4j7`3(LvmQQ- z{Ql2R`1fIa9;C}6C|3Ru-+vJ#Q&Wh?T|B>M=HungaMDc5f#0x5Qn*@#(%w9ex$js< zF_LuNb5AkfpWSiADCFl|cZPKr-}(QCGcQ>eO@*q5(Qq)D$}XM`(ZIu{4N*E+(KwT_f81^G7tN+6+6!b)4nt5*bo>-VeOoo z8p}L+%6630g>rA~R-D+wyl}{7*wygs=CB)bi^Iq!I|DbP!l~@=7W^y>qgLf~3~!Af zmHwQAIx(EN(hd|22_x~zjrgn-Gdq&x6*psDzbMMwy&b3JA}Jwx z3vN|MQPiSLc)p0Fl*8%h_KBgc1>5n4=WUViHq>iJQ+noRNKh#4d$0$in1d&b%fi@< zFp}-&d=md~(tDnTi7nxjd_5bAo>63>kb}W1c|BO3g^=(l%HSTG5<|Yvk7dF6M>NIA z^Wz5x)2D~YxUC;dwa=2U)G&xLwj^Nab>?%HtGG{;xpi2ge&8$s#Pt56*oNu9$I@vl!b>1ZXP)F_&oId5a>-AFR9UV|%^p)^J}4VCjlsD8@^ z3_Kk|akLI?%>84F*JI-2FuLc<5VzvEvy3{RYleT^vrS zpE&1KI*N*HH$r?qf`%!qN9>XaD$(IS*3&#rSsS3t_wOgybqI0e`)z9)z~eQegY!mv zB1x-xEt={ADDH_P{zuYx$JN~b?`M-FMOsLbkYuIxeqBw{QlzOpq`jnF$hgVgZnEOG zWo6!R874U^zhC=#J+J3=8NZ>|@?a(|ARN!sixm?7 zx??o?GhB+tu}E)LA&!H|*yXHc9^vNJ!R)|O$`8bOumLTEUxY7Xf!c{UwjrGHCMV)v zaR6(~NW!Lf5lpEdnS72ynF341j$Ci%vN##}_dVH?yks1>=+BNUOvQoiAxv^Q6??Lm zvuV1t-t~sE6&|Y)T(ykN$)Ixwe+e5%xVYJr4ARMqqjO|3(>$7h){Iqb8;@`m-58d< zfpGohiR@=a0)|Rr2>+ox#j^|+M*VuYC5c^kNJdFy8oSV#1S6FsR??V^Ju}GX;RUVd z_ad420F86vS-7(l)HWotU^*|P|4L+mw0`f0yJ z&4qY=+omxy!ha5IG-R>Q2xkbK$Py|3G}G2+n!1z+h%sQ7=f*+*iXl@Zyh5W;myM31 z_H>=do)9i+@=2H7-;{*I*9=%uQWO$LIk0L;6cpmj*uqbQYxP>N#=oNAb8;q=5iiq> zbRUKG(HN*>#m@OhlYi43=HtJT{GetqB_GP;++E17RT7@@#D=N4QT}J3B{TGjMeI;h z=2;O9>oQ|z&ZB<4Xv2KB#6mJ-Hj8pgK-92>EVh8~?lx1*C7Kn|_BoltOhrC+~0t9K}_C8o3}BF9@`%xh|^rDmnd~vn8I^rs^M@0r3=W z9j@laQhc^!?pyBL6XM$he&#k%J#YSB4cxd>{^axhiaR@$cvdMNxYK5Sc<}x)=Ry3H zN=A9_TY;$WsNxK~iRW_iEjOL&D=YuhauTXrGjYGmF*D*XjeW)4)ej?l^%LjzI|#SN z+~L+}gi?LQL++c=3aa;f%RR3RgT~;yT$foS@|Qg0YJU>1^!`gON*D!|mQUQ`%TcH= zujY&gN0V;zE6(K33Uo%?;f(JF!^Chn6Lb>K?$ZFu2LwS-BjOx#{K=QFn=_S#QXP>J z+u#+7Gb%DJDU0fMuXb|7jffYwc{n3v1;MO8Tlt)LSWQD%F4cotck{TT-BiCkyqU9Y zCVWPJIP*l(Zq7g;)9w!NZ zEr=P!8bgR5Z7StP(R03v_{H5B5eu_{16XNIG{xh5ZX@CBW_y2dJLb?jqB4ZJZ>4cp zz~cr_N`O@p<=fli;WO+9H-UI!Ix0G>Z(;;0i*;Ef)yKOisj)$W2nX7$%~o$&fqdyW z_NXZW$BZ;tr7g|Ze^l8aSK_6nk7P&liFe+l$qscAAKyuhbr#3sXR0=Ynmnk>GQ^1HW3v9+DF-jRNT2IW1ohmRvaFv?pUQ)T5janO(}GSQwSl*DQ=-;0!| zQBh|@T@xV4P+~5#hLX;d9k;AW6~~UbbLE-i$WJ+dqeLCW!4aI(ssVV=z;W(W-($VR zf*TYv9uHcax!o>bej76~OB(BO`5xNcvT+>2b1p5x- zZud>cvA@+gaj^x(^^-ZL+oPe-*kN_^15mPlJZF+WAII$1a>0i!k$9tkb6jeSV`o=z zWN(LC?Q6K*rz{b?%av<6O1i>BL%3)54)BR8;O0%6OFHTnoca^0x2R9!-0l+Z>d^+S zHj#9Ss~oti3l^dCYBJ~ENPeC^`P}fWezU z5AhdBw}mUMAl)oOAMR2c)mPn!=3acF`oeR$+#upXB+6~LXe$TkCYo~Uq)(=>VKFBO zUqU_-!JMgJ85BxZa{o|0Wr@25w~PFCU%fucnN-sHP_)p``b59QtFM->^X&m#!fxAb!c_Vz#Tz`yPPP&Ji3Quz% ze=R5e(K${dig;7gw{c7SX&pJVpHp!1huOEI+_`RAha_vb*J-OR~}CJ6yNjQA>t|5U%JX2@uGbw>?T+IJp|mF6L;kjFL{XHk7`2g@(a#O&VR%<)eqvMFBf{GAD%?k*PW zOxHDQW%hAdurF_6qrYWAqpFQ{T+Jq)@^5y>B?lLt{-S#B9OR$uViP{(pg@o6QB-nq z+Tu66+L;5D;mzy>-B04$PWJ6_E~4MIvNwu(FzP11orFB3Qrum7G!H)%I@sBLdH6_p zK>v~XsGRwmy?UL6$IBYX4}$JT?JG<8oq>D1KQrG6S>P*vXC;p_QJnUPxr?$$SC@1< z?qrcK))%%TC=03uAD9bWe;UQl#rD~x@AQ$m-p(O^%m!wanS<-wzA+_n4y>NnGVI7f zHTl>4yp@An-XGcWk$D)O`;&Osc~BTp&t{FzqjTsdws%h+_^RJ1-$1y>`nSw>ZwB^^ zu4bY$nFxGY!;WZWkxtVqHnSj;=4mxcY|lXYr|0Y>-QPfu8devcML2O4^EsFeQ;M%u zCT7Ea>~r>@EC*T&6kqeRQPWO-!nHX#;a|mEZs($I+biZsucOsou+ZIkaO1yb&tBzW z34K3oNIuSx&gdq?Yn!suEa7{%v0 zK^ds*tz;1=GH|`>5wnZTKr`k0|Jj#;k1b{FbZ91`oSw4r!c06ESjklGXX5(4ayHvN z6DAiPu{SB1|HltV{)?XL?tS*vI*a^ODGoNtLeyW6SQ_=)tutk;?NK&r=TxxEx9R@6 zA2YYSY~oQpWRdAP2vmB;wk^rQ0qqCOq9zCG+sl}1a}Mc)R|G ztoM8_^w*ZLf}MF7>iCo`G|ET0Qw965JrBVb9IobGVbB*1k@p5?lUAFX}Y|_&%W%lc{ zkvgD+r3|F`FzXH*za$s!K~zt1BL_M!uQInYxmdgT4#V+WTsVG>l^xE5F@1k*YaU+Q zzRmJ@G%xA%yq7dD-d$%S&e6PxzsfQ@Xx>siL^r4Q*;&wh^WBV4Hd>S-pW ze%v>f^e=8_;PkL!=Cm*awNH<+MNeq{l5XcR-%O}fonbDr3{)RE$~J{%p}y!miyV{% zzqcouN?8_k7oKIH@mTQf6gyy^jmP9C+gV5J&4Z(?YHto|V=pr4g=}2Vy1-s$W}|h} z8MggY4%&~OV;$>raVM92a~*T=>i1FBbRZX2Sr=H~kz911JI%H>r8f_{|D9s{*5%>xm=o;HnmimUDq=oL8JK-~Kik)sjtkFrvP(|;{Y|(}+JR7u~?V)wjefeG%eu?IP`EKT%oC^z`eQZMNzKW((@mplg)R`gIeYQk}ul zyfSd?;99nQ8qLezd=?Rqj>@1+wuw*UIU$`jJjg__b}pMIqji7DT6SBW1)UXZSfF|~ z4C(tj$L8P#`BuzyqINy8miam6;*#bXCjOp_s4bby)ixJ~WjRc5Y(7d7ve~NGbS(e; z7t?p8@kMn6Ul(QKOdI9JS7#tLatk}*m;pz}P3-Ddnire?qB@rhydAocRasL%jVNH& zv<_IE+RSpzv&heVBU?uMN9mb%HzV_F`3BpX=13eD?{TbbRKd=$|A>`lzWfqMmPfBR}2Uh2z4gd?0u@?h4l374R{ zfS*GN=W`2W!zf1%>nC@&M%n%>N! zCxh@zPi8S78|jk*+29PC$GoMavyuZ7M;~VYG>7sU9xPld7dnf=*84?JT&Qk7ds)s9$$QF_RZrIOCDRj<(Z$r0@Hk$ie8~WVVUs zpW)It7N3xd%8qE(?Vm@!l&Q?gl-9A;QS7x^J`A&x*qyLEcv{7?XNviV$_ZyHN2Z{1 z9M$m$q+*k~F0)*iPC6obY`jt?BubOmni|@VHtMpJYpLWzYQbvProb?E3KP5}+_}!4 z8JZF9HO7+7-nAMUEntbm)3C#92Gj6aMfwhg6lW5yx7D0=XlLL-)jZZgxM*|LEH*AR z9r%!|R#YQ)|lxeW2&>;aH$8?IT}ISn~A@WAH7oUaBza81%YqN290e${j4$OAh zGtKTC{CrG0elE05Z(qceZxGHxy!dsa2sc>%kvniH7Ao=O+=UXtIo`kJW}b_qb?*W9 zFrV-%^=eK%XcbKItGU*MROn88!@c;Dgv1?pxab|LVBPkZbC9p1e9tW|!)7(2v|n=e zt7)APRdZL{(vkS8jH@_9=bDhaoO4SS)q|CD5~p0eva9AstxLcI4*}P#l|sJ9LzwMH z!bc`bIhQrW$0A;K0xucCkDIyZ(MdQnnBv39|HHAqaK%c552p5KR`&@9n8f2+UnRq5 zW&>v@C;WXpk5i<4N9C+Wu2qrl+q0JQ8$s>H2C(W2)J~`Rvt{FH{c>vH!U>*eMnm=&y{`nYP(VuxW zQ9q88aq91=A6GYX>xbq;<-~W+hHy9C9Br0rN%wm|l~oFpVRBM~X_+LEuHtZZ$t49t zKP$0+3Ex(6QDe7SSCcM=7E{ik_4TYS^BI$d0!vL6Ww#22d_`6Sny;oR>>pK{r;Eq4 zl#q0!Zyv)I+NZb4maUtK=HsgD{s-Fk4~}HYCE2LFKa8nM zbBGrD@ZfX3)uMTBP#6$y zmE3HH{1_vv)V~OS;rUtVtW6`{=Q*oWZ`Z*3_cJR$`dtOxR*P*(=}_>lvwRUndNC6$ zxduI79J6!bEVL+p{$?4c?LqZ}Ma#MJZNytxKbiZ{=L`ilj(ZnIp9`?yj+3s?vF#?@ zsqio;)LC*Jrr~&y=*_)%_eA}kf!wCW0dzi?%XR+~h0Z7L-04J$gPgTEN2(*&^`Flj zBD~FA%Z3YWNW+5wU#@Z;)g88USWP3mT;=#o&Qh95^<~c7c?-h9HF zr+HJP&7GK(jr`~HxmWY(JQl6P#dJ{}utO2|Uq9lLY~9XzTp<3?Yl;Wsq7ap^mMd3{ zMQ8S2&SlUF!rdY{$>4Y>%*p4>N5`T>YZLdRDIWQYws5;Fh%c&pgo`y!g<;8BZUE&q z6n<~zWRzEXb>%pxXGHV3DUrK6F9Y?Pj&ZW5w9ZXi&*^@m{iiL0`;W#=Vtq1KNb5$4 z>spSVwTALL8@c#-G|n~mb63mgoW%KX=fBZ?$j@>s2FBy#lG7YNjpp0n5^m4q1X!QD z$sK-`4Z+4s-2AS5n21ksi*zznIp&cSzBaY{ZE-_B!6ZY64 zz;nHo@Ej||*e@&Lt0q8WbPUon`FQp^3N15wF)bzWM{>CcPJbst$6r7^nPj;2iZCcFfwb}kQ2&|$vuGZg zDc9xOCqze3EP{>*iT@FYybl80_a$y)j*$FeW6@FFhvS1{@nbWe^iqf;Iim}k%#vuW z<)O@+uCvm+V$il5*F>>bvn*XbRl@TcN*w6^zdR0{`u5{P@yJI-sd|w7LP|x6{!6rVSeBQ_yDF z3`2T9fcuH!4XaS$^#}6hDY$rk8+dJb$eC4X_2*J1{OP$g7i2;@UxfMNbMW~?FCPAv zi~c8hsMg6st5O>_Kcv`X@e}gz$;JEUEf{x#a^G>Es4h7hgB0rVjn1qVTPyMWU=BW9 zYQmZSt>I6j6dZK$p8ts0RebQ zv?mseVE!%&Mf-$w&k+dRAi#x>#PLiNU@LvU@eCg#!qRV^>O+ky)zshU#eI(z*wrC} z(IhwAtB}D=-4&`MzYMGQSNbsY?1(}N_h?Tmcpid0dP8aM}72_j$b|$P6w;-Rcx#J4C3M2kJ}Zlnb3?~oVlKVp0xu@rH7A|#P_ z#|eKCoew=R@UjT~?*Gq=Lxi>8mmp!R7;PJ=#;Z_-!5xcnahVvVt?t-8N`yP5OL5Ob zj0JJt81}aiOGyjz(tJ6Z3LT&^T#jpN7QjlAo_m2EwvUp-v&V*N9c3`+w#P}j?+(5L zl;+DYV7NU(b7Z8mXh&W>GJIcTOX6ozER-#v8eSSUSocK){av;+e&x_Eb3}klMm`cw z(6*9c@~}nt&r=4a_lr<7T8_qwg>d>QMdc4C1hh&K@O2^7`b$wb(+Td~5~!v+<42bS zXUJpL&|HGCgGnp@qZr@PoUxkb?^yc$W16Smt~)}MC&uHtMc9}l!j8Y4@Qmi=`w&Nr zG#4Xm;X=6GlB0~g5bjYsJK8bqYNYY8lS8(e9HZ7*(wSS1pD)Z&sVPG$d3g>#DZ`<8 zmXL0fk$#mq#vGBseX==mV5L}~&oH~c3`@eTNHb813*#*jqa}snZA%zaKX~L?V9o(4 z>fFrfEF;D5Iu1IwCDxJJhU-J5nEn%}PM2VMtTjg0(K^$^ zuv{$0A)Ym2==%Mnq_IxdJ?3YPyg6Vta!4NO0@;W8Z z+b|EBHWKLD&&S3j3AVCkjA7izE0sW|8+gJZS{ zz7)$)ZEg(NYFe+1Ny98jhLru&@u-UaziTR#YiM4i8{=@a6j~uhaM>p%-(u1*bC*Kz z#7z8LDTQ*BF{Iv7G_dJd@mhk@k7gojrG(ZXW4PH#;8J0Pu)7kxiI|Qty%I#unTpbG zG3p1IkjAD2Hdm&j(Mf_F%V~H+_rFQQ5R!{67TX>gz^g?L>$?WfFQ<8%rH|=ua{Tf& z#6=xBT2@X$(Mma-59(v{JsA?L4Kd`Z49S@Wxb|8`aj8CetH_}2H3>ui(BD;h7)Q_H z6FCLtsZx|G8$#?Z!zazjFzt{c^S~rrl}WL)ZXz@-rI?Xz0F}*BjNGFKt6~Yxy_*c( zPZE?a)W_8YQi|L4U>Hv8*Rm;4r1dOgr2&p6NGQLpM;vzQx7Sk;`j;Hl*K{#(qa62d z>cFOr+Es5NlKaWwzIi!w-FgqR0ji&oH*F_+Ws}l#up?`sl zVgPNt*($~2I9(hWBEzqw@uM=72j^-DuJg6wxm^O&Pr5Ls z`wpF{OUtzc1$EpZg<bEUKM`9a{O>qLD~^Ij~XlED^CW~Whw~iqd4f@2$;U4^O}+><+f$m z#*IQO?H{k=R1p7LhQSz#)m1y-wqP`Y6)ak|0Vp64mr~=vHOo+SXW%9yT0Df5|a$)NpjJl_Qux z40Z8x>@pgHCF5UP%-uJLGzaDAUor^xA##+w9uB7zIeN{8V^63Y?QKJmd0K{+^TY9k z_KTNq6|tZCWA?>i_*x{xG?O71`CW>AyN2QmwV%#oMKlbTL6$ZINt>jktEz}6YEpO) z7=m+j-n;i@II;?*@QoOT9$JT5zA9k=?T@c|htac2uqAXT-aVHiad$t=4wIvw>mcaU z^{$x>#7g>mx%vRCr`H#S3MdxIpz1LQ11n`%{ir`2PslLeydN6HQfREB=h`4cO`?=( z)zN*nB=#S2$Qgoa3L+uX<45FwO-I&I| z#{j(gLj6teKYJ@dyRrfb&v)U*t09s$lOFMX=#J! zTdJ{q*^W2AiK`ITig$;phRm!L?YVJqY5Ic;R70&ppZ5%ngI+;1+RhQDC*UW%jwImn z{Z=Fx$6!NDGlW!=Hg-%a`Nl-!zmPvz@*)~N#!XO_$KYMhFPMbK!Tn4VmPwbeG=6|`u#%kx)}H` z|BCCys}NJuf@tDm_GOW4{KO^o6etXCK$cA^)=0l%!HHD-()opr zf+X~(xH6eIfkm(0L$rywh~fsMQoBWJeTUaz;+nbEA!=3%`d)p(@9!x%`|}ebi97C@ z@g3u96EG~H4y*noVo~!K3`ii3?ER033`oXN({~88B`zQR{-5UwusL3bFKr2!6Z8?+ z{vpms%s2GL#^cx0 zFQ34EDskK$J|Q@D6;ADa4<2#yG(OefonIPhh?Sv2fjHzBo1J-D<2PE>zy+O7s&F z_t^9`7ON3wJM0;_pd?)PsD$RnBq%=U!=CZPQJ5t_;1gdIz3s!a5@{M z)9XQdwLfh3_2SJV@(dl?gU|o?;*47luD$U?lz$KQeD=odKRwX;;)8uFy7Ae|AALn# zuqUncH{D%m8{!Xx)NUk@*0$}OE(FEciaJqY5{735-BjmE-XF_);8a2$w0fNo$bu2k(Sb{$A$Yd28+R1x z{njp|7m(-0mNq!t2*u7To#@jDLeJbT^d<)2?Da0pqIOD`x8m)>5S$3@K%7GmmhWsw zq-!vaZRte=)f(?f@4+34d!4LE)5vbnPhHOM4ZE7pRCP$(2-*!w*A+MHoZMa$%4s)GWq=iykt@j6M z5i1Zds0CL;qcB{t4Zi<|Vc?ZktUDEf`I}o{K{cPJ5`W{fcO;CKw_=!gI96T%gKKnO z4>=(O6#qsLK2e(OO5VaE(t&cu%O^t8BX_}VT_K%SozX#Yec@a;xE>SWT!jmK=JGNB zstc@A`!Hp_GpwKTu)*6Erw0+}1w53xQw`WuA^9PA!mCLDpXubmN%-A;ia(dd z2+6Ny2{cv<@%ipzT&L>|t#*g{!9GM#Tv~It4=y`BQ5Ge@gBa2TZxoOpnmg8v7GhPx zVjSJphth9LP@UI@%m@#R<@F)8*8|(E1PIl3N9qGU&gpnz5si-%;hs=S<72=f;taX; zA$SgXNh;Ggi*m;S5g+YdixDR0!QE>qa)nttn^(1 z%lkai@mP%UaXf6gfY-dQjN41P(KM zP{etn`Ed{4kw;^vtOx5nJTQgEaSv%mmu~DuC}~uwJQZLN-wS>|^!u7#@bcwh&<1bt z#`IuO`!Xcf_8_8!;&#F-o&F}T=NBT(o?u7kHX#~GQ#*13;W|?t@TgfxI<)o(COqff z6&vu^3Q<0YxLo6eNNsRH*%Bd~GHsFdM}STL+M}RC02?dP7#|`)@dtaHIwHXSHX9t; z(+AxU2lTe|!FrD!-YE!hTZ1%jeiIIS#{m^aefaqwz37s0HW`XkZdCSxSu2T-4#%~E(E*ZhaT}F%%}UXk8y(5 za>8FXlc(eUKB{k7h{#etrnNi5>mnb*riFOAp2kNudEbrUqcPEma^-wfI4#2EiG0jW zT!`s+dr?~Gi1G=1Y@WCPIyPdA=UI?PjtI3EI8@N{IIp+F^UorDJYfz6KM~YRtsws) zM3$iyJ~Rrk&BFp)dI--dHbeJDA!09?qqHCO!)W@xkr2N~BR+nS5PzyH@LpSpGb=1G z)=5b9cl0>}A^QHNcsgAG!yGHP9S~sXO-uNA2=Fo99Nnw?pdDic<&*UHTnqBb?!)Ok zGt~Xz<5hws90ek%%(Q_Y2dHRdInurpP{x?fUDWo z=xw0i@wJBHuk)kM5fT zr*&d1i=GWfEiodiOwh>0C^empv@LW$S#!`Yh5CQ(Y2{#qY#ypxIdqgHEu@d8I-+cTEA)M;tJj}iz z!m~5;;rB#@q8p@Dl_x^b!1*vP7Q(-H9?okJZreN;+cSie*CLIne}q`SZ7%K=2+%&o z3`QV4cjR+ZM$urPHh#c`ulw6|m7dHddLnyyvZbaH0Lb%a& z)(#S3;Erk7VJt*~qcQRy(7d9!`-MzE^T!CAp9>H@a5@Tm1n6B%UWL;Ic<((Es)GeE zYM6nc;gk=WV}y2EpC49DMcFV3s!7v4e3}Hm>nFjJ@U>oDJvbdg#>;j6B(lQE}Pi1v)h z7_20M=Olfcs}|zp0s|NX3Q<}*8CzEhah~G#@!M!0u_LcFkpKtoOopwd5ETpb(WNHD z?$r~aPxyZ4ohi6&AcontDL4{N<4}1DX(kCVa-1Q~Kcvs6Oo8hg0gy0-G&qECJYWEu zw*nlLOre;c)*A-{>?#rC`nd^+OC>xpSsOP#h;dnYJe&uLvGK(OsIC+v?fN+4zEJ;7 z8ixxz#B>JM#*{`8Y8Fl;>_LR74dcm!PlOM5wIB=?5nEy+&eC)LQW*zbYY_s2bkLvX z>66X6@T(NUZa2l}_k_43)IuKN;tTps#M)CrOn5&IUe_s4H$(?72$w%nJOPugIvNf!|ldm%`YKt*Jz?*7WLwb@#l8P+7s2auf2{f{LX?IAsyaou^v@vF()yZvX8=Nfig4=|#p^|s z2TLD_bIU|fUDY4)OGL2mQNTTA5f-i(gts&v47Lx%OIok|R`tW>ks?IuD`4L$I#)Ig zgoU#Zy5|R=n%3i*HT|*vj1bcvDPXEeBQ}bn5dHN#CQ}YxO7Y}}t{60~t3!oWEZ$ZA zgssv_xb^=I#S2kbw66|_+oB<)&)J)kX8rd%*!^A!$B$oe`Xt5e@t@ItE*e1=pYe1$ zX>b4c9^L;Y;8y7?%;%C|Jf#j-kHw*B*cUX0#e=W=2_9Yva6kPD%qx-3Otr8W8i#FH z-(qea)z-wkhUlLJbm-L5S{zHb`DesaKHBTsM>NF8!6W+}S`6cf^H&3-|8Z%wJ|fUH z7Uq)I=(!b#VXHsTIV%QrGv6VBI0d0I-yr3C3>M#dg#fDI+86NwKN_MjMEf;7`J^GV zu?nv0u`o>fh@+$ExmUfzj18oXt@Va@TjU`y{XOosL}5_KTdXx$iCr15@HQ=)V!JAQ zUL8X?Llw4`Ct+^XWAu+E&9g1{Fr4Dc&B+h(>39Bx$ zXV{|>4{hZ~D7+SjPX7vYKZ`@U+XLdW$3yjd1qR)XMcSIj&?fDi=7tBzAT78N8=hhF zqgXuN^$dEyV(^Xfz*)y)@v5(au+A9#UeSe`kv^ym?m)GPKWr~{p!}yVavyf0{kk_s zPwvFDT5rgHchLFA7rQREW1XrWb~mT_ofrfk`5)X^<`2<_ zW<+%cAoNEIc5m^A+u#;x(RHpb{sZ?{eux(|!<6#P+NT?#JU$4w%v!MAk2Gy2wjjRF z57zufoO!SuwOvgZzr!DT=YFH;Hfd9QY{s^yeh?06hFSOu!n6P2;Mp+j`S=?#3nQ>q zzZJRUEjoOA6Re%cqe1iwJIOPlJm5E`ZVE%jq()o{AdM*BMl4StuLkLF49Fmj^gTaO zqf6YHdyRNj5{9DH&8T(?0Y)`rZbm4AN*eLuGu2LQXh3cyY4IyJVYF!od8svE>x(ej z(|*B-yhPoqen}`O8%*9F_1IAs2EBgY zkxVs3`pX*7Bn-k|TYrLEwE}Y-eju)61(rwsz$MbKauL*Ha?A=SSJvYW6s;BvB?aJI$J=XH~>fEzw4bmD~OQnYz=!LHaHiqpF>pW@aR z&E2HC>4KsYop`*`1ETyc1nyppjmF)$aLWaEK6PSy&0Qo4Y6< z;)xgYy3k#`49{{pU>)Lx+83RuI_!zTBRkO4;YHdeop2oOiMZkp*oS#SMDx#Tq!-56 zwV^-N^eDNsL2|E7*7*Y`w2VjG;sl9$}}R)o*@#JNo3(L7y->3VGlzDruno;>my zazM;Q9{k@E=k0GEoW9!Qehv=>PPVu{jYoPH*5HeK(D~2~O<#KP?*%(F_V(iNMH}P} z?E$Afai z0+{aY#aiZsVas|UO^bIzbiTAKpvyrxWyxndGk(`>~lg5_4}amumZ=W`&8X_K=d@V7ojYoCD78vZv zLsz2(been7J=uaZuy|;JIqF+`VRXn0cN}}6BQe8T^Io)WGbiti9_-7tz{V%tcr(!g z*Iar~?_-7y#CMvw!kW01JPfV@983s5JkFszl85Um3^E!AgOxe-rtxrOp%unV;bF!B z$}2zWfvkx%S_qfq-?B#7_8w&Rawv-GMX?PByO16%84k>SPOn8)xLw#w{9#Kh{Mv)M zB1>G85&r0Ajl)IVsJaJuKJ0?+Hfzd_cEfxt2Zih1C{MSOF!i1bqbwd&%*;qTnvee$ znL?j%+}XPGP_c`Tn{Q_0UMUaT6y_t4@VV}5b6{dee7mvp!K`^uAdcyzMTB=n%z-UE zx1ri>xUBDmUGIFXE$v0t8dLnD@%)N62SM3ANLe+X@C(9c>G$Ss?gj7NTrAe?#h&SN zp}D*lUsGp8pK!6n=j1U(?X|CU9!hAQTv#y|vZ@}~sLvtJPcLC{v#@!T09AJ>4kof@zg}c)63;nL8h;6yH9Z z(}(<`$%wwgN4S>(0vR7?E>A{(8gFZrCu6jX2Uax+7l>Ecc-8>_jp898eF}_e-P9}8 zN6R1{OlKQnXlE~OKAnt0;&&QbR3HX@M2Qhyf9_IFe|3iyv z1^AfZJs$U+`e3+F2U7a{_Y`f)*YdDgri-D3PYsx-3jyJft!Cp;k;%h}5M8LzbGal= zzyTdTmQsA)$mikdP8~=HCtgsdjrnUo;aiDR1 zY!vE>`>>7T=dm06aOsvB^j`MiEXCj7%=#dhr;04XFAL79;Nf{bT)(U0;eNttb4Fnr zJ@=VH6&!lShtJfJc&|pUcU92!g@@Cb$^hXzTka^LnBwzSmxiI&kZ|Ojp*TnJabV04 zXb^t-kn+z5o4a14+0zA4oggkWxSk^ii=cf?fcSQ-7gm3R9560ca(YRaXI{?=S zr+Rm?A4G&pI&JQUt3Ug&GeQCLZ3SqH8HD#50&Lqm5Yiug@TBD-qtm z9J%!|c-{Mud@V^Uy!j~x_m82q{QJ9z|o<=|}iX zaqq*T2QVegg78gGaq)c==&|U`xD=`5w@kiaCp~*zY@HmV$g)|sy^t+YJ{CTd52&9fx!>RlbG`0xw(`- zobi)#UB0*!^b;*TJ_xOAfRc$HY{b8?Wr;U=Nc@5Z#hZQA-^sVs57n1{ASvG$VaeZ7 zzQz}WTN@y`?Txi@^|-vsm$+NsF=7*GlurImzIomdeXd7hnGdwLe8cZh;tS{ggz@ws z>~H;!H>+PaPW)--o{yM1I|K%2 z-{T_Xv9o@>LFmg+toZc_uRX}C=ivveoErk?(6@*S4#BjKpU`O=1cR#|$*(I2PI@2l z&?Xp{m%pRFAdS?%8eB|@B2GEsKr|m_C%q$GT>*dY1uof;mT${zsw;|sYV0f0=a0n9+i##n@&6v>m*A*ICg;Wr z=#d8TFQw;jTpEejr8W3+j=a2HS7FSX2sA{!z-4{}mfd{~-zw62yLK3e1@Q! z2t?0%N!T>CANQPi$l=&`yao!7L(y3I6mM^nhIdFgt%>9b*YFrWt5%@I?;)tyO{W&?U*EX!5IH` zG)#9R?71B;tz2+pdmEyAT=3{jD|V{6p^m<1Me%+2f0UOePocq2|G+2TjcO48kl)c_ z{Fl;-7s{@INri3tUII;^AOY zgFobqXMXfM=gAvs-ESx^AWtKMKQQxlMvYGkaRMnnTG5PkXWS5+{TttYxghOxGgPLy zV)}>Q7`=~hi25cxN+-{cv%lfI#TnOhe`C*4@s8#b{O69iO5L_nlLMBoObQxHKBuxqR_#~QoGv1@D{bsTG~u@jX> zk?xK|9on(yd*}E4!F8^~IXlkUd#}CMy`JZJ(H>WY!LA_GHdIqn8%Qs$8p3)9im#=L z>!L@G`9Xn7-(XUMD_N~Oo?mxVvi+sh{>~I`HYR|%mnz8YAT@^GDEK}wh)?UKpF9yn z<^u(NZUpjmMg@@(L0rBhziUDOUE5T#V(3`zCMg(W6~M^?>2FU4VmP1@M}x6UvoFJG zY7omy%K2MUYS~*>FeN;IgwqOMO1tYsmoc^~kd#g3OtcQbcv1xhasEVRR&aNMpUiJp z5aHv`U+c<+dw+wAGoNJL?IHbVB=+lF#8@l;_m(&klFS*VfS^%N3JN_4Lt_8r0L})xw3l!dD*5 zk#V<29j#>i@71=R(PNzn4z0s!;~0v**7ElrPbOt58L`1bYSGtWTj@gfrCK7YJUHG) ziScH4-u6`T&rmle+)@%7?26+OC0f6@;GUr*F~yl}r|bA@wG*BxHC%e)&XF#)^8Dw< z?etpWhPYx_U(5QpGT)zBD~xgsZ5(S^H`tXnsWnWw;YwI-4KZiN5Y$h}gm7nE;;Sj> z<&IB%HKpU+`1-VlWYN>#_)^1%;m(qQQB9+>8-W+Ad9c-$M3WjeJ{ZH3%xXs5cgD42 zEgG6m%=ke`yMta*lew06W4tgJB08Fv9<)xYMrVlB3Ja>@{1z`t1FHGwHxE|Mt785p zPlkS}!e)g#3(i(yzTJaa!Zlte*f8O_=!|yQNG4wciU>!hTxnog4@eJcq$19NM}IZo zbIP8N&Z4u49*wp5uI{|EBcWr1_<&%E=z2__I57NT1G{bQur+Fw=Wts(+SHRSv@7nWvxLP*3Cj(Hvh^kK;C5 z;#SpRU<~GcgrhvLL+fB2GgE9OE4H2+L8C;YR?nFuHmnjp{Pd!u)ZSF0{uT_LDJi_* zAT_P(IJMoL${kA4?%88MrVfvecEYLZ_&IBo%*iWpUg03Mu9WOFwr9h~S}wJ*Lq9>u zfVVazC(8Q)_M91_q|a}nGYC-f(?BoL(?oCPN*HsCeJjKS9R zoSiw6_v`9$(6wgnnR-fATL>Ex9u;U#vVH>{!%ca%;y+$xE!hM0v|V9|*V8)g*;}%W zdUB%837Jq&=o2%duhf(BgDI1|>iGWMio&IJ?2NX=Qn+Z4j|G~0>c}-T=dN}=RY9hV zxK_tcZEZN|QYUP6B(1kA`LNlByW5(mdMWeky_?bV9f8HZCf>vir+HB`i{cE}bhQc9 z*&|R@GzmwMY~ha0M91k<-m8gm%SSMOcoTC1jrhr>iTPuP^Lc&~4O+)d0NuMo)%qZxd<TbmGiu-K4o%V&gd|V^@D}0ei@2EO(Puxhl+N$39a$E%xu*p z`tKoJKGuYanGRj1HFESXeHKJY`yU_5>DHpx+BBGm_R_vDr3SpOTsH|rC7ZSp!!<)N z+}6mi;X3R%*ubyPgtrL)&zPu-$A<=HKNw8bsd~u^9Y*c#dKpXTab<1;A0O&c?9;%A z6GPZCrh#=z9U6uEANVqu$Xwyk?X}51(@c=)3S6fPulj2MiK4IU{zQvZ;ipUAXtKtp znf7(s#1%BNd-(v~>9t_zriojbaMiP#=p7c_qOUeBBSdF;U?5k7JBN;y^-L7**IJ8A z(Tn*OcV-}Amz$WDHh}rUr~Cb?$<)V9l!_kVOh6N#HVtHcc_Rwl z0nBLI#F@cb{JOn~JaCnO%v!*)BX@wOEbd;AYWjs7cmJGwz{% zS-G#7*`kZM70}Gv!~HSo*(~Q|fA)3|exKQo5vt9^XZ9t|uvzrXy;-rNiERhOS0JzL z&Z-kPr-`d;`=Ks;e_Y$X%+GIP?7H6AzLownvp@M48)PLdS-@mvod-llvZenjP2sb-qBl~lv1yj*O9Q(CJ zeqRsfzG)H7L^t#%3um2XY!p1c* z>0MV6&dL0kx%e%T8ZnaX_IcU(zu%!Dzw2vuCw#($&+2#N;kFijtWzPTa|>pH9S9Mg z8g-*9n(8fVnB9c|M_RbLsx!U&Nc$Y_NWj5nQe(UF!)v*Y;yYmw-b}xfU3mOQGj|Sm zppEn=6DD-UQqBvFNu6okAp0pkiRH#}{v@d2kkLe&)txYs?={DFpyhrOJDOEECH>C8 z@ACg2<^HMLf%j1|PaylzA*E63ly{+5NTX=9REQGpbw_*~3927hm(hkpuUhzUyETSs z&Ft%`!jzB}v>V$J(MEXZ#Wrm0C7jHq6@8C4OKw(s;VCUNiN2%19G9<`+M+zsOqbBs zG>0}5Abe;1GWp)xcG%1N|MVXlq`x%U(FX5iIZg*LoSZ;eY^5(8AnaTYO!XIoI`Q0&LZ1%A|Lx^p`kaCc6vE7{te;Ln=I)YL(mhwN9>}BC@Rvq*?S_z zzhvV6Gz1OhdkkL-S6P(C^vWqr`JB$(QIn;gO(p#2$=v*w%s+Rh;8~T)(L>?H%a&SHBtw=bW|ChT#)S6C)ZCa%h%ya5^KjwJ zsq{?^=YEik>pM+m?Dh73d(5!GpFob4h$`nPHFJTg&q9Vrxw4#VMAGJ}gkQS5)us&kEJShhZ_>P5H_7J*J3%jOEOxgCb27GD(wp1N`F38o;}|(X2>)e7shi`xXk)J z?|I!;YQIM(NL`qz{P8jtk2%x0^W`0x9#gRYGlna{Qk(orBE{PzTQw_QaweuSe0UP) z_eG#_Rkm|RYH445%NgNXA2-LdXU1e^B*luxcrseWF(}-n9iPN8=vxG5j>^NkeK@x+ zC2~SfYI=tyuy|MmRTpAKrx_v7ZV3bq4M*1`iVwo2l3qq)DLROC5pUSAVLEk}pYyk5 zy4u{0qQPk@yJ}uhDY}N#SufDNDt?2_FIi+WmHcN>%(IsLdiaXrSyLDz{PX%)c^@6k zPsI`J+7(5x?C1N~*L>YInS_E!{;TzVQ?`3~T?E&2UQsURmrEA~9Ws4Lu~y(Y)`#PL z70ebcu+F=jW%1tpt5?c{uQHBLEn|_4<8@Y-i?+|7rA}p%7cS%T1*Mb^4wOveQuLzy zSz=O-^0OZ+jY`;cI*{X|ONr_oAT@nUNbv|@tgPo@DK*ry$y@7xJlXFbQvpL~j~I$BhNdxicP( zCq-<37|7Dmg{%@?!xiD8YkNp0j$0nJpT=`HGoNMS##7^7$kEb3?j0?}^q&Cno#ivX za2)5B6fjqR9Nk=U3EelIi?R9mz6xY+uRI)tvm}QW(ofoRqh$dbRt4aHvVe4b;US-L zcs5)3iCP{JiGd8#%%`|rAYtmc{P24)&AYQPniR~QRatbJAB^+lY-|$7GxT$nJe#-@ zHNTpXnl20y&h^3BiM)+fOipqUuSykly<9~fS|#~@W9WCTii?w+iJDQxi1IPyRaP=+ zg>aAr8RuI#QEgPoqeJ57zgUUUM`wnAs^swpC+gQJ_`J@A2A@higfF;>j%m*`XZrkF z$+KBbYWp1+Gh+q?S+xPmVeBxK#yfbDdc>U%1gDCoW8q<*dDM zdt1pdJr5pwR#9c-&Y_9oZ`1MOdRPUk6THZ+QBW*3kP3BVyQkf8G^!H6p&Pkol~OOj z4bxc_=va8kTvvt6Cwua)v4XvAJ!myXfmf!RWVV;1*Vl`WXC${}sTW_{m2>8S2Z|mQ z!lB)XSft=uyeoaama^oW7hXroC9hii|B7<oh8bWdhp=rYgQv>R!|oWCnE z-#eOH6RSv*<$jXmb>Nf@hb<~a|2`UJj+{5be;WL2__MzwkFM6>|1)?{L#CEw9eY$W z%-a!t@joUk1>?)r%uzw~235oaJ4)tsH9uH5plei(${>4|XH|+O)PZpKN)DSzet@0q zcPj^i&nt-Q>&W4GmDpM!ys46}bM0~2Qc2&VcBu7HFwEbPQN1fDyf1!;Zx!6um8tKm za$aq;XT=fmZSA+B;Ioq2hr&Oim6Y09($u$(^}{T9eyUEM;Y_jAQeyPZlI(6udfk)! z0Sl%05zVP7R+72Lj167u@C_4x`&cD43ekfIms``{6qV_49>*lxA$Tt6}Uub1oRvVE@IGuXn2PjyEMfx)vSfNWP9yvaZRRM;(+r z_O<5snWES77>UMqIqp*}>3F(^W#dP3(?)W6k?0mXS&ffr*ltMk7f6 zUFHRh4ViCWi_J?Det9W8?YI%i)=Jv!7|u}@B|4K0m=#sSt7XPyEve=0>Je;iTTA#M%jU%4)Fjk$Lt#i8@&ASAOD@8c8m4VDAwhWTYV{EuE2&|!@R|adcc@vSFYLO8 z!_mgrPOM?+lM$?PuEEYw)+g7sM-L;a4rM-Hd*F!m4 z+HclSRwU%rAw`FwiRVM zl+KaQ2kY~@Ssiy44-@@&9Y;3|m3w9#=Uv68ky0l)Upmb6Rg(Q-7->(0KgR0O|E~C` zCl6y!rIOdVx_Ft?vFD;>o-1ofy*QL*qAz@XUza1I`)hk}2pq^WY>a*oe4L5}AOui{xF-MCdPaEiTOoJw)2K1XW zMbq5CCE*G`@2;otHw`uj*L_(vi1pR=EE+J7#{u;W>_3*=(2An|2&s2v}O*B2#L5472`RyggML3H~|+F{!O)ZObCa$AdY zZ$!6TsL7zDI+{Cb^8KUCEA1ah;nX@FNv7YhHPU`%8sv6WGCNT8Kr57NNE}3n%rAIm zYI1gsQs(G2sjaESqkbTrq(2DnFn~}`C2dtSWIr32Q!2U?;Yukj>V%07(7LUciXbqTBQAhxG#CPR;#Lu5aMXhu%0X7p^)$1ML=RmlDyr{9Df);U!8t z(P>WYhpma|NYC|Uj72@p7yGkpp77SIY8(l!$KYc>N|WnJ*x8q9e@L#`i9URk^Cc!) zom(05yW{&}ysM7sf2s-J6Mnj&54Jzmp;gz9x&C!5Yu$$#(od>r_9L!A+D-Ojc~~70 zmKt=|s-ydv{#-e&B+6YKwRTDtEfn9#Y9(hEtI;}2&L?F3gGINP-IIQO8nOA(1C4c! z%qs0pXn6yf#dKK%Cua0uRYtvJr*z}7 zaOBQ0y;$E#IHi{GhR5|pUG7PrOZ8lARK;1hfw2p^qpn|%rfF}^{3f6GRb|6id0pEb zw}Lv}E$hVt^LmOJd(c_*x}|@2C#Iy1c7ENMbES^YlVyEl>UgrW2iJeAV?e(iqARH* zL%7Q{rSw<7_7dKpWTJ4AAHFFGb?(mI9*x8bA1D+~nLMg9^}=;x4tCxa|BsJo zHP!Ptq@Cy!>&f+KO^Cey_q_+_#jh>f$@@#r2jL^ya@`yFw!!?rd4oaXi@9A#zx8dI zqNqcCQfn+9*8Oj};(2wr*0{a62k%}v8-<@S4Gcp?o=`nC*(CFg<&fv z@WZS3yx%*KT`oy{$`n6;c7eOKr@bV_7;%^7wLPeFsCaXcfy5*?*IY zD0-w%r2Ecz93M@f*Ap2ZUkkx=U_7_7LTIdrrTecT+@BF6&-KziGG5=mPINA7-_U~zo0fhf_lR!uBnH!tt^t=D&Z`j`G)U%!pOWL z|6eUNHVa;{t7{m4OpnC5Zy3(SFG#cqlg!R2yarCfE%Oz&J43~j_l8BgLzy1+oJWzN zgb#?Mq$U)7&zH2w?>O8-fZ$*e|}E^Fb4cy!3|d1H_*qaVWjtA#%cTT=Myckq=biZ4&*xz|UTUz;%%-ky0A(w4Sn-=b z&yMHHJgy&~bMw&s*N4L?S;Lx8Qc^d)!MoYJpUO_ zPwNae=ms;mDvkMGA%rz%k+>v?xPe*BUJ*pGO*SQ4#-Y(A4UewDRM}+EcX1H^Y)!{H zO2+p;WD#5!Na*EE{11#{((w#lJsKz1VJ2U>EJl}j1u-S@}xbvpXVW4Yv+Mn5&lP3V?Nt91c{SfsO3 z;ZN6)RFWgda(r(FwiSNtyqzK%sbI-NOs4xk!R)@4EOn*E(_!m-?9#^b?qw23{tD(u zVxstZL%5of#J9rnd<}djzGQN0r+{+MJ=#|aO4m&BTsK*o2L z&j$rDA?H0WF9kAqRRV4P9*^xGaoleejQ!bY+8BtR>uEWj;ZCAaE+JHO8g4I2x%S1C z)V`&>mYjh0iKT3ebHQ*clnGV+q;ZE zu1mf_UYX4GIPqnFG0)n%6P8oL^!~0K3lp8*a#zN8EG2h|3vWtGIP&8d8okOe+v~(w z%VI3G-55K&m?Z|TC}qEF3dfLaT1schAKVaD#6crh77s3FQ;-XPtCq0$g)`yni)i24 zh0fcH8Jp}(fkrV${&D8Fm}2gE$?v;Ri0v#FE_W#s52ffY+7#j{xrZKq7V&nC6JZ5K z3?Jad3x^U8)k>{tzhd#Md$4SOA#p3bX!~4rf8`$h<6p#xXYTy5sgTC|9yGit;^{Ks z9OAF+KFbTE?FF3i_2P+nA(#JkBm7Vy@vGg?U7m-+$&0r$@9a-KF1aBRP@>h6pzsBei^X=CV)r=lkeNxlfKlNAyn*57^MsL&1YV zHh6WeV95g*UsS=OtM&w~Rxl)TG=4J9PagiC?xURSI!AO~mvi6;2mXpG$LD8z^nMrp z&>GQ2aeq z?CCzYl$&Eli*Kof)1pIBJ6VRKs`x|-N-)kJExNi==EsgAe{vaJY8;vPYbmR@IO5p3 zl;4j#Qa`SQvCEuL-6{IjwvIe$C;UnB88=)hrhKoXct=Z^-5o~Xmh)L|CAYmwBs<6f zpPt3sDs?1pe-Y#V75-9IjCs23&+cM!uh_9ry_yB7qW>6LDXeQG>OYIWu=_~rS5?tb z%ZeS6leM|O=r`_FF?ydF9}ZWt#mS1L!tth`u)zO&CAS}%2~V!#)m~Fdo+!8?`jpE$ z3h^CTOCF8nW!YKLXKW=k8kThZQ*>yTtqBos=sn1qE7ukD5FRrwTtQt&E1U}yY6yPpD0C0DVW-9tuVDaSp(wH5EOD$r0! zt?A$jypk+%ll6AGZHh9loVG2Nm`4jg-(*3L0~M(CGsDfRg8ia1xj3O*GO)}rvMwjq z--3gW$}!Y7rD;V4pZ1TWXHGfyo{VIlQ#teFBsWs6jB7J(INkO?pR_eIjLQhPZ;f_L z8T+iPMfX!i_qUdmcveeY2FY!hQH{kFW0@bX#wTP1<0Vh5-x<+&2w#}ET5=Y1sxinj zWX7@@;$|8WFu8`;$@(~m&vfw_1Eveddos|3vs*=%b#6Gyz2b8fA5N0+9jmMQWDDQz zztDs>+o~AnXw1%1$sI}_P7gVbH+zmCzoe3Zn#Sm?s3JROINpg>yi_qHbXk?;gc>rZ ztV-(s>SHd)KRRawDUT}ovF!*d%PQsGY{)k8y+(zK&!$zCX!%8d@~?uRBSs{YD2QHf zNOiH~o{bvL}X>DszcOA;JG2&Ye)nn)=xvn-0q1Cf0uJ#!wnRit@2-L%9eib6DJKpi6PS8~-tc+$Wsrra6!KYi$gMN-qQsuGv*q2kk*|4-IM=U^quXkC0n zr?)Oy2MymU)Jz9+^O*t<@gJS8Qn2Qo<;@6RO zefF0YKi#Nh`7lk4me$~Csm+NwHR#z7;`3bLkmUnJ!zDiM-!(}aBRby28f?}QJ{&q2 zhilbz@YBX?Z4Glg2k^UmKWK)Q)XJ!0cDgn@>?CK;auA>7de|^cxQzI}=Y$WC+HN)U zxvRyNPQtx~|LiZS#!y8QwO7?FpRP#4JgO9j@Y0suopARsZ8aw|}gX>}*Z`(yfv#Vhz?^mHCijZGK6u#8SA_ z^!36WzluJ^K#6IK8r|H5Ki=p^n2(aLoBA?-TP3cN_rquHDz<%r%eyB4`1J!HdJMY<_!WY78@2D|R zyOwPwlEW$OI7X!pTSV7seX~D`H8mL4s$nC1dE1hHoRaoxSK61B^U^*IeK;=d8uPF> zhT?a>)u|8qKUNbKs3G3lYM!h0=VWO$OT?$NVNo@+I;pXwwpubj``~C(O|EdBPru51 zf>mE`?v{SXOap(HYTmV1r}lLfTYB^-UD_{bx*DcB)#x?!<)7u||Yt?0?SGgCNhr(NCnLE3p~bWhQeuq%J-MbtFm>7t(*FXz>1weB3bD0*7S?_9T3N#x1S z%(79^aa~usqvUF<&Wx4MKP*(?c5ba`N4n5wz0C7G>`c0x4>No_(qH)gkY%0dCET@F zpAKj@)UbYQS4=c(iI?x!d>8(_zBBDR)w1wOM{?C`sa@NFpI1n~)Ts;a&(&~6I8BxC z<|}TU#3xz9xlby*72ZGOb_aU)l=&p_R~5CdVM%TmR>xG~`FmHcE|&S30bNiwOKzrT zXI`(WW~W6bx=FjJOzy~>=xXlH??C5wGJi6yJ>!J$^;y{t9XXEw=~7N^6HYHWl9VmV z|K~H4l(;msq00p2|M<@L49U|AQo*9MRbq=LR-Ez@G!F-zVLzS@?ia>;#&Yt6YEHFOaUwCB$ny4SR& z^99i_uW3amxlcwEwC96c4H5m@(q&K$n@+crniP^VkTE9@Rr zV>GlCKeo^0#b{sD9J6R#=S{$$ZW6XG~HmAO7}}Oo(JWANb>`mO<1#A4ce;xciFrB!xQJe3 zQhosL_updg7eJ%rn!J_y?2{4i@pclxkI zHJ12}!T2qW=JDI{SWb(=O8f>-x+bvaW)OX{V)z7x7K7A4TD8Qm z>ro*0gJUEga~!vO!=kaSmOP0`vHU39 zX4~T^X3F`uMDYgOQDX_48_$wmei+K{30dsVAmNV2MSd*Nj3sNNKdIm2m@v(k`TB80 zKJdkM=o>C{4rcw6S6uN4=FW-d%sL%Hlih1Nwhm_B*+?{Ah+pH*OCDVtPs-uvsHg@L z**l6qibO|o_6@mqL6UR*iXpE=k74_gZ1HbQ7!}DhIqwwjpR;LW5H*utv#DSl-wj^z z_2oEvK7B*W+Ca8AyvDCGkgjWAu_ro^i+3X7VjzJ>Ut%KML3Py&^sWY?k@SWG#sL&7 zU!!s}fIs`aX14Gbjj1n)hzp>g@U{4{1BhSzink{M$T<xw^i(_W&rW-P@EUZ5iFXgaWvUh|yLI$VJ7Bqydf=QBa{4!RR_ z8EY%Gou=jSw~VhN#BVotkOyY7^BA4shO2r$#u2Vu8eD*LFePR$WE;)dxsmX=JUvt@eLvkp;96PcGo z+8bxOs^zfo_!v?~=J4-3XUsiw3Db3A(c2vUE_Gt_`7HK-AH(Z8+2jh}ICd?Y1UqL; zj%V>)+nHC}}p8O)b%(dAQt=df5 zi(W&yBAW}--SBnJ!nDAR*IlxS|HYNyv+1aapQXpt3@q-s^DI4+J?q@KUz{PjTz3X< z&Em{ZSEf8mW1Dc5&hr0)ELX<0&md;A8+&ED6OX%!e>zKQW4K86SsIplZj_21&-8>F z)iLReeIs=-+%uV!;KGbyS#n=;=E>$X*6;8Vk3cE|le|!9rQj1NocBm7ajm@QSDqqI z1YQhGP3F6Y7sn60=j~u`+RaYG;;9FYlTvXx2n-M8o5}nC~ zRqw?E?M3QU;ezYjIoi2|UgC3cSWrUY5y`*QD8Xu;E&FUs2|H)QgBilJ7|j)fV)8EA za`>lWc9htVgQ%Kqn$o{2>O=0i&(K${5vxWcxmH^hj8z-gO0ci zFJc*z$FaST2*kn?JGY*|x?;}%<5Ugfc?zXO}Z$GTqfKpKY^ z(DAYzUFCbFwxju3c>JE%wj`V{6#writg;JuQ!$E5!s)j8*burfUvkVwGgH5SX_>Yh zuq!}Ya!>B|$iv&fjmTdu zmSV<8zj8L@m@-E=h4QjFezVG`PcUOjWEp*~nX)de6uVgAInPR&qiTjuhVZQ!ro8S} z%Ds=Ks7)+oX`wZtqecIB*$UHX!rjU(2|HB6fvl0tmd|HRw8Eyol*Uj?{=HU=?PMF) zE-Inl1#9Z3mk<0STEWR!I-m(%-=vuP4rC92u zSTWx~wqGo{B|RipeTX@i?db-^5c(KnhHo3XHeq0F;e;T>McDe*fUT3CesDhtN7D#Glk1*OJCXmzsS z%}4Ql&oE<~To(yxrl_|Qz2I;g?9Ub88aEQPP72H$4XHX-L4ukg4@AFqV~sHngkM&K z8R7e}jF8VJQX9P-Q}N$?5Kh(LHv&)Lh+Xx>pR++YWQ`%~H229&pA|50YE)Omdt|&P#@_kD?BZAJ9@?qj|Li|c_ zo?yh{ykflCjo^pPCB!xvvP+J8hNS`3XNt*6HKAd8F*~(P@Yqs}PuU2r_4_X`Yy|Iw z8`EBozfCI%UZ*2@@|Db;I+$z1g>D*(kLp7OJ95Rh(^)vus-cu_6z)_d9oJm>{IL$_ z2ML${s6+NG1@*6_euqT`lhpP3AUeSd5A-D0S9FV`^l(30LC|Q?yL45MT|StBm&>J= z$1oE9E$2}iJ*k%`Tu?aC-f!io?b79p9H*7-hhWjWf`8^nUW{2e?fZ!ir>qRUg+oM7 zUdGJcI$RK5yv1uUFSN^8t*1jrge#8MXM^M+xcxg!G7!t9?zrTi9xCI@X?@afmvNC{ zbgwI8v7sJu_GKil)g#uVlufhsStauz!G8>6Ly*)3crCohLDo~Mi|dbN9B8eJ<(^W` zZj{_rg+s8_-(EjGOoKBS>Z=;KQ4^fX8rP|3-mnk*77 zXgPAw|G2Mn?Es1!r9EB^B209dJ+BSmFE0h{H3n1Wp^!PCL4@xY-v3dPEhj37iPx6w zYT>g_2I4tI^p~F`FI8PZ$_o(+4j0{KjRtSrD(L=~Hkw7{D2zmRBkgyndLVbTD$rXn zfOSvBH+@i(7Yiy-e$rs>&*c=UYxC#!a_(Lo$Yja6yOt*YD6Cb$5qjq zC>*PZ{?MO1y(+8+_2-ND!sE00a(P#!WK{L%?0ezhJ=8e#LfYw}8Y_z{`KM!Fg8K-M zy4ITm(tf3bG#Ff?p!B*r>4@)JxQ)~HN;0nZlYAiIqFeitd|M&egBmx3UwUi{GP7WmzO#foLDS8%BO;BE&WhQFK6$s zYLe|H=e6j69Hl>M`i@36?=ud7~5BqR-uZ`6XBg6 zsu-zMb5OWWwq`Y2!gZAEtElkr%|_9G{t(m?GGFnxDw|#^u%FqRUWp3H8|%f* zdy*fry{F9ADEL=i&stS7P!5DBJWF|B8Z{8+tJRwSq3@-Kn`R=U2O) zs7rpxuIoK$E&WJ-TsLOis`%e>f7r_T__!Arr5)Wb_QY~Y1tmt^`Q?2Tku$rn*rb{+ z2_4W7-g_~w6EFU#BJ;5Lo1RvQ?@fhSA(9VpvlBbz{8@Oc1H1ND@^o8Qsn1X;{7Uj{ z!YcpAaaPnkUKvf5s7p%n0qYLG2EBU2c7tV!La%5pg-b;TsZ>Ng*4JAkA zO;?U?QsBF|3+dk#lDX4~8Nz{=RgeN*tuCkvUmx+f69){X z-CB1PwpBs=eaYduT|sT1E+{UE4!Wch%E}7#&vqcpPQg{P4%ix33p;PeCxy%xoN3Ev zInGbC+TiO|%~h?|7&Zz=-PVqesiIRq(+Z<{;jX3sI?PS3WR|-MMKb@eFRmRPW>w@m zwP(sA(V+*o;e)2kLwsn%1o^+$;@0Sou40CMYyMtP#obf?I-JT7J^0hM+~`>)=U^-T zT~)~r`*u8)d8K_VlC!h9l9Iix_^`E-`r9 z-n5w-&%Qg}?9_?j$VkaSm>$LFKtC35izQsom&~UzOmFceVO}(sj{EX)Y7A>dKeFP> z8<`99;qCS~dYu+sMRqKU!zK0DDTeQV_z>qC&7>nf^offhWR^E}G0{vJ?ot&RNuLLPlH2}*<2I6$5&8nnSYHO2yb;f_@Dy#y zj};!}s}?EV9B&qyzhsYar+x{qS^ujKi?_Vy-A-?GpT5FnsWOrlJlIq8p78VTwEOWrE7!P7O|MkK7P`^HDun|}-Ov|( zS>}4FM|kTUv5oF5ERr0VDp%ndDb(+D;oHq5nd5ciSk8MKY+R}Q@h$V0OWniX?`aHj z6(7hudfj!!t9LRX-CTJ3CW+F;E^<#w!9{0`WNajhHfIbsMpPOS2^WYK-N+Cp85_Kp`E@5A?Rigvs}sK8l9*-X z#Pe(KIM+qmbHO`${^>>RxOeENc+qB4B1;a-`y_d9>B;2Ccy#A^5vC#>Yo!++&hMC> z?m_jYw``C1#NmD-tr9(?kYEB`TYF&`l1P0gPZB33;8*7%o`iTV&GaNw8Ans9_&j8} z~_I!@x<$e#!j>qxyS2r$4Byuysm04~H{H%0i z$;f!g%$GV6!xK=6aAWG}L_DNjM%{^*T1TSi_!P_Sb8hV4{FYOCE~2f87eA~kCoAJb z-|C8~V;lj)q;BQh1WdJDIFgirx#&aoddGsD7pqoDJ=|?xOtXz)>tat%Ux}t&CojG| zi(>v>$;(&}%jQ{<4=UWOS>SlKi9?6sYv*<6Lif>72%Oml5_O}&3$%=dyitZzHbuOnDjOIXK zp8Up9l2?|;7JbR@Sd>dt>rq(#mc#EuN8vgz3oCOc{#}#JSVyt&iGMTru!B4UNsd#5 zBjcoBQ1_IY=e}7eHj7lwG+XNQIpBC(bZE03SavlBpMUH~*34mTiao2YOODlt(Nt^a za_@sJ_B(_FEtJR25m`K2;J_ur2DU7A%3?;D9bIl^V<`OL z^{p%(7}}9EG@HN+qv&=!gB8vWR9j|ppjMXql);)=_C$!DtSWsp+Fi5pd}qsvz%0f{ zd#p1Nj`yeJlx)dnf0J+)r%Y;|j%Mfi3=SR}&5uK~_|3&u>O7>A8(_zAgG|O|k0Rwk z1|Nho?0=Ana`-4r<#%t<8%6NY3=;0!Qu=EK&mWKCZn$u(D>gD#$fWo;M=nWz)zM{+ z#O==@SblHuw=`i>j_lD(lk9LO&L2&ul_wZ!h_3FcgXD^*(MR}0SZ%7*3wLDa@KlmE zI&xX`c0nWMG9E4S4rjo*QySVQ9fE^(-Z7F^7&%xk6U|Dx9ODP_o}lc_80wXlEwRlA_O)Jk~>h7Vy!)Ozy!2 z4DdE%dVM~u5{{6TPvIYCr2JICD$#)yw&Y7zy$PC|^2NJjifLrNzy*CRixV2ceQ(#U@Sq?kS zk7S5rj*Lx5@{>-kXnn2m+amdCW>##vna7T`7VOK-B}A6H)HfgXi_%`Yd90pc!Evp8 zCS5nfab6zDcINbIozIN|Qw&dMOV*z?8;<7ivB8RylCwXtgXFX*bFo@0`M8O>Oz&vH z_R+ay47QNk)Uw?TW>~uAVB}y$=HqP9Rte9!oWor4Rk;bzu0JaEX?~L5bxm?$?&M(U zZh>J?u6XLqg8zR#5BmbtvnGG&VJ<1M=_IlU>H?PiuFM&!^-bUj_ZWHZImf)$eU z=2mTnfo$jSR=K{cvRR^GgM&e~^p%pQ`ze$3^}?AtX5o8mBz7v9j54;Nt7aBUPl`@Q zB^&*T)^x7U;;(0x+;}XUG;26-FO_g^uK_oQln7roV68>5ENjG}jiQ$lU(g%TP4&Ma z`7B?HFpn}Ia!N6C67=b`xrmp`4LEvV_>b_J+qp$N`6BtW+ERyoyRqm(ia5*&rcEhg zTb&`QTMBvSZo=+J;YzPY@cVB?{QZj&#dAehoHm@1Ed^M%G9gK|kdNlZERpXQ-ZtXg zBjJ~WjrepWFMM=5SBF8k@75@y~l)qj@N$n6#vg6oLg-g*fzYQu;zLO z%nl{~yE-1+4P)o|I)0L#>e{Ay?6w3m|Dc`|g`HUbZ!O2CcH*>nf^AL--|?x#wL3$}j+GImW1&$M0le_EJv)rZFE&3t(=h%Y;|FyLVT-z2nsokYp)WIk zY$Efya%Ga5XxAFZT;beXj|cE=dNX~4{aNbSqHIlHP7Q8iQ=0N_QkvLP6o8L(oW(N& zsEX6}(mf@fkZ$^r4_}>Yl%ISM-F=(5d?rA?OpVO>Fp$T)o49pH{=)`M%BAvW-Y-pf zHTqJg-(Az-!`nWMj6EN~lO>IGFbH7JtI{`*^Cho?bjjs@yfLVelQVp|ai@{omwZ|O zK_mCS4y1Hj0}W4tup7}xdTF5 zy*T&HB_3_|Wb#kKk;JRnDBSpiEH`jY&t?i#Za3kVGD?_Z^xG27&*==|3^%s8oz8jv}ZhsFqRvSs*eZ`IK zAB*q!k{i#rv~a7f4{mm?{O0RT-LV#o6TI+V+Cpfs^jia(`Sw%cJ1#BUZ1LjDZ`6%25! zJKhVEz-DelyR+oD`W-#o`Stf^;hk;C=O6TdaeHM!(2e+~67qFi~$ z__BOUU3gXaX=z7i77f45YU!qK3h(p1*PfV8m$8p;Pjm7m&Po?GcHt!^xw|s-Z~2V2 zbs?cnII4dKY7#H8Bfq_Jn=kX}d`HX-g#TH(5;N)&rZpY#pCLcf@b>(1qlLpBu3X;M zO4#epc%EBOYT9d^Dc{smNB)eygq?Ix`wXS?AL}CBiE=*0>j}#c?{r@W z2FL4qKXGJ;aK5jF9|bzMP?O-wn0H&Kb#viyXe&*Ro%mx}3kwD*Z&&l*nF-?kShccs zo&(kGbX~+(+L+i(n?PqibZ-$h-hnTL+g=zi{hIEhoASX)e60n?o(_DN*G!^tC9`wQ zOmFW>`wyBKfGe-xQ$NSvg;dR_+odn75YD#gD_gpmUSaVO8%A9gFL#7Bm3J-^BAn*- zvCGs9upw7CU&A7MJ_)~!@dyWs11@v^fE^?5%fH}52L=wkg!ftDF&)LfJ!s2SpUVs% zYE6}J)K>9yoX=k3sE0N6T`$Y)O!}yGm-zcLTW*_NV#Ra)U%20q*OU`1zXQkD9XS3+ zEBhntiL7qrjQo)E4zv=o&W8P=!f&5j^7q149-Opfr}(@_V(q#5q=g*q&%SqBnJeB< z_O=%Fm~2&7iqCFoOZ5chWcXRLI!V0WU+wAZDqjUp8~G^+7Z0%Eq@FudAKCMv=A~H! z?D_S2v-B!<{JX1#zkjh}q{|ick}TQib%ot=77Y313J?35k-t>9REqGXx3BP#bYV`L zgj)t$GP=hV?o2l)Qn+ZdwJFmtT;`=t?btH=GJF0MuB36hW2Y&-@-=P;nBe1bnf3mr z>~W9}#5X3a^Of&JUvr#1E;Gd0jMjZRKk4RtUwMhBKTUa1aEbDaw%m1^r%WrC@*srQ+%DT4Ks9`QUE-$&$$Y7JiPmAiHym_?s4NU)@5#E@td}&?0@S z{DKasZ=vHi556LQueQofy@Hu=8}n(xZLS+JS@>PDpCOiOh1(sM-b}cC;4elD(73bM zW=Q++E3^uyDw`tw{){mbR$j(yqY-T;i7))UfwFlnEC0L=?lza%-sO2hpzeR)HOAyx zTqdBO5u42}BT za&K>%59de+(wA*tWD{7|m!ef!JRi`H5o!5+zPS&p#^v(aPkji!mCd_Red(JlecGqJ zF-pm0NkMPrjAv8&RUbx2=Hfl1H(r}^@VL_(&(E`2I<7bCKhI+HiQatkFpZq>0jNX9 zv{?iApgB`L+Wz#|lEF5w{uFn}5GK)2ct<)-!g)UZE|XC=`x4Nc!F&Dsaj$a*w=ee< zzfSe^{l4P;W^wsaAA&4}bEWi=pIsV`Yy0rNec$P#U;ZQIo8Vu{m%VzjwYHd9KdOIztc2>F@yvH9BW!vPdfJrI ze@YKLx~twY?5^C~GP(}$u6{}}GoJLIkDL5^x^yE@e6mSV>f^hW5cPL=9t|mFwP$y_ zG?p=aW*k#og>(JTjYYzL+Fa|-u|6e?zR``+s$%N@?na-xMbv%YotYn$va=+P#3d#4 zFNh;jyfWV=`9=IuO#8cWlF1U@=cM6Y7y zcpNK0@^EII$mhxdShKQ_O*K7P_--NZE=iC#Oc7(hkH@KBKCi?;>DdDQbWC8ttU@+N z_GJ0e0@7E+vpcwehwt~Kajtk^yL!?reUtb1Jvcw4Nd3@w8u}EHK02OpbL6+YrYF}Q z<&if=_3Li=D$S9vhNsR;eRp}uv~k>BAAD)Nx7=I#pAHc$?fu^30`EastBxv#I$2 z+!tkH+oP9qpmS*!Zeo_4#g{)PP<}={z9;b<>z%`AO+EQ|bT-jfd(t*Ci|7dnRBQXo z58~Cw$zeo6ymH2~d3#Gw>OHdLN79pdQ?l`#7|--mxzYgi;JHOME1t!3wkd}tb9>-F zC5QQmJviAm3;QVLsLsgcyIb9{79Y*Lu@|vEnQW`=MYBT&13UI+erg8g(|h6Vl1}Ht zy*MAN+_LY5UyjYBaiel!3WTpMgWubw@ov9fjO!|YrrXL-ot4HN@h8eZO2v4a#!Esb zOFJcCzb^yFRSAR?D_5GFsd$PAhI#i9*GaJ+Rx>HZp zqG=4*INjWo!dl1PEQv{BU!iha2PSegNcc*13fFW#m+nf!J6QYsW+GoK*ZZdO$!|s; z!YQop37wxOvHwm2Pok4(y9B1cm!y271de^1C|?*|uR+zACr1-sU5!J}DBj;!&2r%t zpLvQm)h!xF)z4ntJ9DeCh6z0)@$FvCxvAn!2)8OX?5rM56`cn}F-G50tGe3gxbpON zE2m{j6{&wIf2Cg~!5d=vGOUV|d%7^Otco3`G0eR#-Qv+L_v#?_ZoG)=fccscdXU8oPQWSg~oWz8$7 z*ejf1eg#8>8*KZzl7U`POuJu!rT8od63h70w+sJhUY#XeX!JeJpNY{J?-IXuZ4_Uq zZ}3HIG}&FsxjG`61#hU|a6J<5;T8D)+L@bGl{gJmPHt5N3&eYI8dt`h_!y4%7cO=^ zin(d!bbYro`L5+8dq!ayRw15bB<^8lj1rDBWnDS$`rP0@%GjIJSvg3`Cu}QS(Ff{N zNC)-5cT4$PemXh-&F@}um|p)+hZ)BVyE0z?B9^~`O37`F<-o{N#;0{5+r5lWx=MF- zqL|}>UHSdxVrA-dWi%zsy&KEWA4~YyG?sAjg&S|i$Pc}U^Y3?M+s$HDeiO@;`^q=G z8Y^Et&EIpoU?^SbroUn^n_j}nmt*LDu9OKnKTe4y_@>J@xU3Z8tSAx!i*XW8ReZXb z!dWrYXuoF7iAD^(-YL|)FQ1}wh4KODO6ipX+)b2wY_9%*_%16h z6iWLUOY)C(@&gH_puU!Owsd6DxjMFP4dL|NT5R@&FfFc*Bc>sIw7XX0yCb`nOE(xA zO3&Lhc<%|OQF#Dg%!uHP;#wZI565Rg4JKTGtmf5MJF$Jcc#Ol8znfZ3_kH0wMOTx0Pka=!T3X);Biz51xtlwZ zC7rbCfG}R3Qq6^1VSE@@!_D87zq`Gf58mrY@7fyn9uK8l{(_@@I>`^Vij4`K7?M$? z49IZI7gsU;N;uw0RUGwHE^kPURy?8PiT}8!CYXpuQ?R*Gx-_ZVAhEQi*N#@l~Or2ec|BeWHYrARd zBQTy=$@Vef^0KL5-I7j3M3%ErJfN}STV5Q|i8l6?j4je}X}qpE7|ECO$}zqb!JDrO zhZYZK&FjLOdqrTsRXojA%5f5o{mDOJ@(HV;G*h~^V-3nLQofRJ15Pc0%5N5~x+V~# zu?_6pEIj5&1MX>l?CV`G9$63u!e9T`5tnm{HQ-g9`*cW=gX`8Yk7ZY5S8QQ zbGbEu*)P@6J=u?+{q%b$efjl@@UEYQH)W^~aXyfKVYTAH`VlKW@Uj&?^2e-EhOa+2 z=Lq-o@#Cd$rPputmiI{wBOdy&?s_!`diZkot!j=R4dVT-HTcdFPe}OftEu}jkPTO>xpB{*>Z&UFVFh7!N4oTJ!5GaIA2%_8f=yM-5y<7~d1$XSeV}@r1exr!4I0 zNyu*vjN0u^SWqL$C*1hDww~=hJXt@v0hIqVQ{!avdRJ;1ltZ%4o&LhXJ*T*ew^~nK zH+RfiG%kKpuJf6Ct|odjR6OWspLp?A|9U_Vb?UQt^YYkwen08K!|uYp*1Pkl zu9hL<`Iws3GkCEl^EEy`5YF`T4vmj$4+gcZWy|N@?E9@&Yei3%=gB|elzvY>2p>m# z&}W(YR@dC;i7t(hOcb|gmlp~A4q6fbd6hVrVGH?j41XXT0rr#k4!TH%6&ytNx~IJAZ%iaeF$^Q`gOPy6~e>jU2ru-{k-LCJBxV znxa0+K^O7E8z@e4VTrEKl)27adAWgw!5w(zmj-N>IMF#<=QY=b3A#?9;VyhyUeEn^ zoP|}(_d?rka%s@MJF(=Q296(TPy97q_hs@yI^Dn(SLI^)*HgdLm5rwAYfNy)K2$lt z@Yt@O{G1J%;^+Ypt)tcap0zsO#9M{mlul zV|YUcRy?Ssd8RWao9no?LOMF>qHhQfnsTri%N5ql5e|0kv=z?N#A~j%WxGu?9kJs| zmuBXs%LnM+CdwaJlbq1Z@V~9dLOjncc33TK!s#O$toJu5UsIotZsO+a*7PiG;(3gN z@|VPee&1d`tGYhYl`Z|Yk!Ak291stB(?J`~m&g}jgbiDtiMQ-(#UMlJ{e5j1^QHby zwc?rX6VqY#nCLonO6t0Q-H-{o2}|6)D>lkhFu4Z?Z$HxpuMg7wWN%7o*@FKgo0Jaf*QHFGzy z9aH6>aPW``G2+wit+L=+w$A7O%=sZ*ew}U2D1Nhv``Rx5d86{H%*Fj_VrYh`aAlHNUz0TQFSbdFC@S&2f$Fy<$qj(nhkrG~tn7 z1C=_y@j5R<|1_7kjrxJHX3X+`~`#Y6hlra zNH^i%5916NqT^0UYRiSunpc*#Wx%>7UOHk#`lzNC?{_-U#1Es|@c!&3`RN;rbI~MU zMPu#`RbOhcArZNajMn##u4!braIE{qjg0SWz^h}F$1A+d%Dj=6VvGs0Xrw5|kmt`E z^Rwaj?HQk7REt?HJyR*+ems#TJKN3!ra;!UX z&obqGt31-SIgD!84a+U!b0l}8@|_%ZHpj8_&n(=3j3cv47GE@K{ke2U5|zOn)%Qa@({WFZ zlV^G=?S}}rIj&r^y>a4ANZ&LpL3ww{T=Lf6g-N`Z-jfTJiP-i_(AxYW^M36~)qxb8 z)mMKuG8v0udcQ0QQ{#B$jwfMV98aV{A{Fw(4B3^!_WM0JY>6k?_-_cc5j%lX|o^?o9m#ohVoX%gYml^hYTWch|} ze19ZGKG5CxdT0^@*L7o8M{OS$$EnBK&Q|!xr$x*d)J3>yF>_VtO~@_Aa%VIhOvO7& zjV9%~bc7pXa9tyx>p1c2N0ue7kdGcl^Wk^Jbo()iA9okA{DOQO z9u*U67sVf5#SAiuBIRhYa`8GdB(qQ+F41gxuZWu8I`h`rLe`FsqSLivW_}vUNNxYk zF8Onw70&WbB)@Dcq~@;jT=x|aIK3;zALeuQ&sh0m(TvN<=RIfD+h=p>`b!KEUGkappYLX( zc!CeaYdBiKlnqf#-;>YM=TYo3Eo9LW_1FLVoR{@JNa%u4F%<5NiIZz&{XK@ah;c@H~UUdG= z|8y2P92nb`d4qHL`S&g?O3Y!LZ!C95Ws9HGmDcN-Y@ZOvFX=g~+!@Q?##wkClK;i( zY^GKVCn(KgXNGhmhjQpGzYX`dv-sqE7x^V-^F%%#k1EB7QhmSoLMHc{V}$+Wu+b?7 z+w)m`6dl8+T{+76j;8&BZ1Gs5$*t6OTcVZ4o=e9us{b>x3EdgRcePpEvyI~7h8#AC zcM$(>CM!oPH+O0lM_Zz3@ysE?ud{khSv2nKOmqJn7W9r}+v6<8Sac@xiwv&F&*R~q zbiNTUAbnAqG9SA#y;G`uJL52xMPf}?kpOU86 zGMITQnq}S6aa|b0qzh?0zb;-#VyeKb7ir0>7*0f0vZP-KmQyO3qPnALi|WUTA&mZ9I=J_w`^YUNXJsdjo|n!pKb&O8GAi<= z7ZJYmK|vVSAD46I-;VOKDyK3%l-qg2xo?KB^0iW~UhKrDGlXOJjo_D$%NVmL4D+Tk zuFveqEcxuae-=vjx#fg)55cU1@Sn3`IJ{rV%_U*1ZZ2j1jgAByF6B{BM>gIlVYzr6 zh2zT@_)aL3(#l9bA41aAQWhK&uR(avT$2#o`juk8E|i-WOUM}*N}*L5w=3n>s=U9b zd%^O*DdE<~A;P|kDgQf|XM0Q7S=EVPlM<5ebdr~TF^{r3u~<5Br>PNyHWbU>D}sHS zN~D7d$M1BBo*&_O?h)Vef8rCJFJ|APa2%=%8TwlUQMpCpg+=i51mQg&Meuk{5!dd9 zbG)TkT9q*ViZ72r_bW zq{oiH@NT~R`obBwQT$NxVh&grNJAXPd|%-!dzGX7LnRk&gRn8G!pkfc8#)%q^|J{&^s`$5-G#E{M@XDtPd6Aa58d z@8O_7vsx<|zTS`Hrd0$Q_|l=IO1P&F({@(SJ3K)AhYAK<@uPaU{O4Ztdr^ zmT;Dn9=<#^5U+2z^g8#;@lEh0%BNB}13v6JUyg%=A3nk}tF40BrM}Skx$@a<5H6V- zsElXv<-Q2w(+#@+zLtN?sxo3#|M#jXXHHlE%>&En`8WXYK>5zi^^=dE_|7weS^cAU z$*%@u=&4+YzCpa#vy_NsLBy!9v?ecr#k))Km(FN)dKs&3%eUC6jG>1EDDf|6#7=)K z$Ccw)>&xX4<#e|6Wky;F)_Vhq4=d4F34+#AUXBZ3xML|bU&QGaN%=}f^7D`Pl;=nd!{*ATCZv`g1C(PuSN@HKt{i&3nr=OXH>?&O zv(Qa`ZQ`k|c9Y&!I%DA&L#|g5CLK~qQ6*2Dd?=q<#TR$InErMp2gZ97@v-~|W4$=q zri$owo=jY+aXH9CoQ5j$qum(wWrg?>J}g)*TwKSuO?=QVP33nptCILtp0xW(INvr8 zx^JxFhO;|Yk5*#Z`w3Tp8V_g2d%s(!G~+qQaA)aTV&Td16^rF5R?p#2=Qc#`KUkTqP%*G-czYTOsQa#MKykKf2Q=)-buJaOlJ=W>4iP&rmM6&zdcN}CjoOCKM0 zYg{~g&6|=ZWsJ4<ecB7E*A zCq~5x$1zeKlcR9w`wl!jrT)n*7Xrg;*(to@_@Y|s$9CZH;#$5;Xixu7G!DWX@x3m7 zaFKA8DDe%2*Ti|%a&?CjRx6dy@Tx1JVKt1r-hsC#i-%d{M49?EFE=?6Z(76C0qxl@ zJp1ufM;p&GV`lgGou40?^WYCsXe_v5Kb%}P{6$^-jLpG*qkc52`6!CsABbF2OP#} z9$W0h1iLDJ9_Pqk-&HYrj|(jal(S|P~*CP~-TR6&{eMv+F9M7-)E z59%tdL!9L|P|1vT&iuH)63^`&_(M43BAv&G&f+HtdKGwmsE5#4ml-fwj#wSZ3QPZ>yFS zZ`l&4{=(CR(yz6v<;;F-qMp?7+e|BFF4bT87PV$7hj^qt(d}yJFP=`;j2b=>@2BUc z8h-r3hHI8Jv|h6za%6)jj|)(qnZlsU(fSZ>UY|*Q+V;>kE|&C zvxJ<#C&DP%8Du)yV{W2r02?h8?OJ?pX+CX;k+ugX}etY4`TH@ukETN^sqg3 z|EpxY^n9~M*3;QhKGj==kDnBu$6fg+t4!IwNO{mZh10yRzK;Bfia)L6g0BS&o1|<1 z&79aqc0Q!Ot7bH4jge-F0f z%ic9?8`utuSyi-(Z#34vnl1(wy#GTr$urH^T~x)nSaZfauEN*c4C~A)o(hMW@qHC1 zy0pW3M7^F7ZIy|w{=$s5EEN9f+RK=;|7u)cG-T-GIvkwaVzoki@K22h^Qy-$!-!so z>Z!TkhE;m~pYM^QLH!F{B&1Uv2MtVk-n)*vMq~C4s$<(BBW6sm!!6bjJL7sRTn+ha zN!<%vXQ+77)x~YGJgGj~t474$sO2Z&LetOIa#!CwU9bPcXNE~{5mjx(TPtg^Pc)GK zdab-wjIroY%L8o}{cR0#gWK}Khw=lSU@UF4`VAgN9NVqj?bARzAdB6)Q8?_%-mE{wzld9YhTuEk_aEK#klGt%8lGT4FGW}X4H3bFq36?K_aFT6jf{B|_z@nxQe8dmgHzt_b z?F+ac6C(aZuCk#c*s&y+R6F?xoXI2kWA!yH@<`YnrmXt{0ycHjx-XAUE_US5jC>AE z45jSf95Rx_`LTa4R_agIo>W~wFbuoATy7bM2@e(S@O?*)E|YG{y(1n6rIX4G#cYsx zD5@7MmrGw|u6&M1`FM)YeJvnQeT5KdiE??A7Q!`u`3w1m^1t_UxVt=r#iw$Zcqy21 zt=T+^iNq`>n?qAN(fPG31~^2rEKb|6i%_2~o0C@~NIa88?al}sUdiO^=gMgf$id)` za9&!J&A#`;8Tw|Hv@;QmHPd*wsn_yp`n91WW?Ql-863v0qnR8Y5YF3i@=-DkW8Lfw zMt&WJ>8F{}c!#kyO}wQJeRej}GlLl|{IQqnpP*A29R5C(ZdTch|2&xff!eQsg4w$^gIaUd zm0t37`d9vzUuV#*cPB}w(>d4NNp)B{^?ydt_kU^9Fn3bjlA$~S@%Yc_{lO6|9G^<_ z=uWBu)5t3cSMG8u#aANOWt>XO9r5~4rsI$h&i4grWT|gE`n@#HejCP}_fv%-gmF1H zousuLsqQSi@pMOuYEy)ThcU%Y-DvkP@={Vb(bAFOzov22prbO4QdNVg{@$qjLUmu8 z+o>9-p=>NnVZQp^`>NBZUJ}As;T^}ULwWo`8s|<2<64!<#g#$4JUo?+clG*E3U8k7 zM4zM5iM4hjBs!TcKXqcs$t3xDDv!1#k##*(CnqH0*RGR%ZBy`$i;ylMna9i2$B)(h z&=f(pUz3HzPe8zcjUdXDVR_0$dxRuhwKVri*U`@D!Q`*ehJLqd#x>ypceaW4e$DEGa=ZE#2d}*|O zcycG3*9ZCGRiDd=Z++j~WP*G^5;GazHJDDCZ`$+<;uXzX z?H&e_(JPa@D}h{ioIzDboky2!_Ad$Ks=aX6O@ZPHZH+_l$K?)X11>~ZPW2OuW`F2onZ|@xaXxP*GvAv>(Y2KBuMMYRLWb$$B^&Z z8Q~Gz4yI$fDv(1*g`4gQ#4I(LO5b39NR)rvr@?#~ta)OZ@Ql5QluC~?sz)Lo%Yu2g zu#7!Z-8p)^oWP&maGzK%pI2ALZI*BTQ&(c2l=AF7Z|*gh@UDe?aE0St_4DSVS*jPi zd9f#{6q7hF;(L_Pr&d0;x^K5Hkl)LDr5t&~i|~Ll7C!P|-RV*e*?ZE|VLz6+l05zaC2xd+b%$cNF)li^oN*%Br{**~Sz4shqe ztP+~9yYW!?L|~*F_g9yym*C2J;SdkqyeaHa%%m~$A?aC6+mAijs=mjhgC4AOC}DcM zJEO(JvdwTO{kr&FcimYzriA!l>1ke4|6{xx|F#j%GSig-k-|C3#3Sij#OJ5I)mtcJ zd3Vh>PKA`c?#+eSh5TvYjoHh>_hx%C;aVZ_QC^%^AL2%l7anE#%INXNe|-VXZ+Q`{ zJb_P^d+Jkq(_PITvazaqAclFmoD0k@{P;-+=UcjG*ndR6_8EuI{nBi@(t zuGiZZGCjmYn*0Kq=6jI(P&i^Ycl!KPz$-eA2`?3LZ?hYrnkULHh*vT)pN%uTSTFwV zv!@=cke=M-fpW6n%g1}4JF%Av;Hew8pX8Br#fyF7>+UJ^X4CXsZg0|cugT@Oj-%nt zJcfjMF?>ZiGv0UM+(_|{5}nviC+)nlUj!p6hcG%f1B2x#=B+G z#488-yE6Xj?nKa(GCbO}Cr&)7t7BD9-BoVP5eLnG%71<0OhHiz!49tEJQjXD#f3J) zxkrni(4(%Do^Lr3@t~CL^6#~fAHi>ps>?NQH~6>^@wk}#6I__LpoFKH+Wv3}>km7T zFkjoxZ;zoe?yvl(UjfEKBcA>Ca5$j`J=ytt;--I)~ zeX{`b@hv zZvR^0b6Sye?<$1Rf`KQ{jd`U5zp4m{T{)KUwwX!)ipXvPP zN>5v_`gv1XrPk8s%1Ragx73VC;Y_~cq{k5+)oYvlj6aqiN3kh`w^VYchba#aSJF7G z9mxx;*xu1ZIX;z)+GI(5N9o`rEcj|X?;umqt{gLZlvlDV zu=!ZNGk=yd`;a9wgo}Hte!mb=!K-IX#o?=<)2D6asUy7cRZIT8UB(sF{b%J9ay7-A zSLM6g>}yV=o*yX_#3PXdQ?bx0mACafZ6IZ|K@?bm|5+KY%xbIr zK0QA!nXvc^`TFWOKD3fALtpiv{XiP3BNCqPxPu1`ku64x}Gm1_nR>{yM&cb zO`(IHYr+|fYxEphVZu|L-)BL_v{j#Dtm@|w;X%7p=l5Jw#lMklI3e8F%E?52AXP8? zk@p%_Vg89R@#;q$ood9y>`M0kV!)+KmEwN4VPdfGo_EE6`LU93T8wxk{O2uw?~_Tw zi!Qg}e`dn*q(A!6wDLvX*0_7ht@*_WcbCc+c*TJW6?E}5;f$_B#$)N79#pXR3qxY( zRJ_=~-J>el6JW@Q1;Po1FPxiR@d6)6)%@CBpKE+i^YlYw4(=0Qbcpbh;&K{*>2$vlz@HK6EH>6U) z$IGvzvcJNQ_}_)EOcuYkcN+gT`|{JoRQ&6F={GAyo|t|#*rfCGGGDgM(|Ru4hZW1y zw07{}``=R7^RExii&Am^*a!b_lH~6$-SOASyuMlM_+-7#3*?8$6at>AjxbE-bN@gl ztG?SjIFNbW6B%;SU-Nh}--@sLzd`cpb&yVaQxg56{8?X^$VGqUQJzR<)Kp*Q9#3M_ zQ(p$ui3g*);_28V(sn5ib7&%VI=?IRJX?^`+l=;Cd=gSv1l? z|CG)DMtaffXg16Cd-A$;ac{rn!3gtQypD=LsygA{0(a(h%276&2i_xdIb)_=1^GiI zf9T5IYuU=&_2A1Pxyk@_@h+x}J^A9QB2cXS1`j8?Kv$M{E#Z*E>tuvEH0J ztabY-Z}k(kUO(YQ-=YjoedD7%y9}On@L}9{8B8?tCUS`Us53orU6jR+nqlOGx^iU6Wi$-j2`XDihnbyy`%M?k92k4c+loZ zhP**NxDb|wi`KOk6Ekt_=T56*CeAyg_jb(2b+DUo>@1c!yOG{j`*Yl#IPFjTbT<~c zWRNsPeYLN%Fg&OA``ejB`nxi?DuV_4l?&P?o$|lD+0k2d#V&6?w-G*2;7#7U>6|_5 z#iIvl3`v&`{6-3P9lY`VA(iaWUS#~1&IAij-bqMjkFh7)r)oSu@+5Ib8b2KJB>7}2 zbNhJWbT@@n4?Q?qo5~J*5AF_1r%kP!vK`Wh*Lu76hvH+Y&$Z;V_*|dqy#JL#yA$qA zdz4CWw)%d;1=o4H@y3M|dVT0deOVfY{ax8LH3h5D$^-o%nXqhc23<(vm80IuY))cl zr8kB{!p_Q0uaK z<%;$#;CBc0rA`!(wyXme|1PBCOHM?7R4BZvJtsHk^K_@y(H-+S*x*cNT0ZuZoO!-0 zpTp|64Z2&P-b;J>#0j^Y)1GmA3%SzMkzIQVXkFvTarsxJI5>*;na}N=T5q@JF?>jS zIz;EQXO<()5AvD+ivy0II1Ic zm%|ooXR6N&SMA;bpP{+5(fYsTKRlpkd!F6N<>V+w#!Sn`H_C-X=NvpIOP4<}}( zD7cfujC)SX!^)+or|O2PY`o+Pu;@Y#vr8R0VkNzs`hLf@i}gZ!_KJ z4UWA2YBn<(9JqNy_5Me$e4d?!zxrzx!b^*Fd>=|zS868zfnPJ(xxqz!+bkMhaVBbN zCLg}*BAhpai=M80cQO6N_Va~D{<6WD`|oD(m7NQ|?J_8GccF7!7R!4%)0&rwL1(SE zmuAq>$(gw)vv_w^2cqA~WSL_JymcQBJ1*Y#<4h*qZ_kkLG#|Vzf5-z_%JFPZ%7b*S ze6IH|$PcTV6VpG);FlHcSt>s)fAt{;mSo_c;>f*Evj`4#)cPh9tCfMPes(sEhufU-_*%H8>a$*kspMRCrqfsQiGS*h z@lWYIc%`D(%5R{OvCY1@z|U-SELc}S_f*MrQ&p|1Aos-r*Wwh>u09Q zn?wD~uTuF^<9Pn*6lUo-Z+xH5H62&Xnlye>ePr}Y3R{P^XX3Y-cXm6{udn`p&`}v@ z>HKuef#84Ah--EbcAi3Ri3|O7pH8=RC1hL@uK6x>7jN?Fc^7u?PUa5-7v)onhuPf) z8}}4OM=M8VQW8gNI?%jH{HkF2G$bY}!>fb%a`NkX*NOC_NzB~rMDLzS1pg)9hX(P4 zUU$Gtb=6Jv4_n=fqMIp z6CA8Cxln|0cN@y2yY2JDnhsxxXVl$_(>Vp4l`rP>sf9cbvghTL0%qK?BT+u&{~Kh> z;>U%I>TJ!56ZwodXU{+V3Yay?4vS8O%*eN8;3oxi>tRd%4dIioTQe`TkO}cte7q@- zz6^(PM%@NQ=tmZawMaG^DGTk`3yx?^OY zeDiSk5TQ*zslR>_G{H(~Y*Z1AlakyOFj$ z7G70*!k#Sg9nZ8^9rjTUx98cja=r3S7uqq`HJ63jk8#^_DL7)o%)L2Wd1AwG-M3Dv zyAG7)Vm`{6m6}(o23iwnl8bA+HSK%kF;2gKV|y+xW333@o=xHd`I?$%llp@_KX1w= zc#Itp-r0QD$(DV>BMUyW;oiP%hIg}3c2o{QuGUP`=eA^8F+Vz&h;Ej=wn#Y`bF2vK zmCe8?Yc2+4Ve9F@=VP)+?O~6Ga8Z;Sg|($Ai-69%Hbg|5%@Hd&ni+nSN$7d|q#<;le?-oLND@$oFWRax>^-x4;d zj*5GuggNQvS{oH}xLAG9zcqedGgDSU32WB3SvyJCI~v{2uz zh)*Ayv9+{__Ai^#S9!TzzmngnaIVYMCKUf!$aU3cn}lm0d}_hh!9_%<-#et8bmFn% z_1`VT-N}qCJ&PFgy(v$vG(ICt7-d?-&-dHWFIo4&SraN&6w0T}0%z&2w@xwRw|L=N z|5z~Ve1UqQmfY)Dfb(5T#!M_A_pk+fHNIM&D`%%`A)oa!W4*@ds-wzB{#$tVEfZ!q z6cDYtw0KZHo3>eEd?%l^)0DsSX+9JFQNFWFK3#{I6Y@p@7gm_z{A)h$r_8WO$!Gj= zQ(A|pf2ZSJRF%&^s@ul;iLa*bHIN_SvNtTS_Rk~hkcG4{dAw3#CT+fWxi6WrX=fe> zOWWZozOeWIOj#-&{gV@_@aI@BT_@%C z7FAlX>ufGhyO=XKNYAaA$^*J6zUzCxi9M7Q?7X!pEM!< zjco4gdOVXp+o;Kc)%Nl$J*)cumH+x+7KE6UW zbZ8r{nw4<;ep?PGesLjvY3pVp!3OdNKHN(Th59`TIrkV=$zX zd<6ch7h^gIk5#?7Uw#Jv=@R}hF5=W8Bh|r0H2-eE9~*>Ujx%7~_(IN%Y)jF&LhMzC z?pRVtnCj5m;+;o17;>XfIjb#gIjTNwi}v4lVF7otjQHH8@Wthqp$=+#L)bfY#bvXO6Ry6VlFdCEm-tLIA|!+N(ReqKK3 z5{;N9KKU~zLsrYz^1tJW)p&Y$v;lQl`OI3`M!X#H)??a``H`0Ka3vxJnP5)n? z3pb59C;k7{#l{@by371)W7a>;d2yUcUDWr;HDuxO9Go)@g{9|GuipvJ$a!&`ZW>=- zWVhkM$GLQ`e4cP_zxp-${T+2F+)j1C^r3jiUQSF~pnCD!_KfgI;m1{uFZzk|Lma8= zpNRD#N3Nbt##`%#D|$X!-f&>#Pl?Pj)jH}trCaufvQ~l76=rUnYg64fcGyIGt^~HUFwkzOLu=!|Pgqd}7CL zlXT|kxpI7ia&@jN=l<1nj1So`Fd&t<=i)v6DWA)67AF*d&mqa~d9r&R~GKq`rxg9N@xc-KVmoUIp`m=E< zTsSRW)LY5QHn*ej3)SO2?6@4A$eVj?-y}UxpJA%LVV2hBrtBJ)Mc3}_IO&(ky!jTG3OAWMO3(Fo zGWayfg5>_`#0f_nV3NtOg=Y8~OAnyu)VZ%R*mc7cj~~(*zuk=BVVRuWXo_n`y+7Mj zIiQ)0dv3zKqZ!h0YJTjH$=XdO*e%JBw~BaD&FQ#!n5yR`AJ~N^%8E73t$dZoje;QAnl^ZuI^~H7zD^m#lPQKyIX_&fMFfAyJ3wlm%?3_yY zax>P3>;0bQWEpE+J;Z8XvTzlsrc#my{4oSr2UUoT|H3ztT#VV9s9Z&$Fly< z(OJhumA-8p5iC@&uoV?iu@DjIFC_vJf(U}7C?a4h=DO4jGsDmgiYOM?-5qP|y0)%e zYp-kPd%wTG<}=LUoaa1s&VAk2eO)q-YQ>Ep^2Gn16V8W^F{MF6R&_l_$-RcWRUBn& zVnaTcNnD)P02irSdbX&k@W~IeJgF&H1*b8Reth2V5NDPeaPrU*iUXVQqsI|;%xS{J zyu)m7B|7Ej4l%!~F{x({inl@&Hhe$A*#V8o4?Kd;N71#aJ3{72slQu#nD0J~&^J6p zN&G(h4D>lC<7wAjpYwxGVvr^KV1&GP&8pAzz7n4;)#aA_(-%(#3~JW9pC?xWy-a@{E*;!EE`cyK5Gz~rC$ zH0t+<=n9IC(-Gl^oY5uhw?8NdugB2;1gDVW`#+L6q)P)1zL9-{27G;UoG_`=+vX_s zCbEyOkhn_KtUhxkjw$)QK9^n#KC)AnHF6!x!Sy(yI8MTXde|Qpos?_Rp2xyFiPV9E zNB@V@PIfqs`%XP7?T?8Ls2*J;e(Bv)pTMx=>=&H$^y#Dj!)0|k9cR@vT{^iPlf6Lj zI$hhv%l^V|DGUw{iUBp~h$aB~B@R9$0E|mTA|NH&duA~3!mw;TEk27>6 zb~#2-xae~E9z_$RL$d=%{?{J8R)_!hSzL4o2f6Qk6OM4TMvnuh4%0G2j}w~@iH@M? zwl5Z4rl0lcUjNAdcxtO#9{yi@iW>dDZ&-cS} zuAtGd1?1Y56XLr7gY8+3)U&85vx%`~7oD**Icy@jltv}6W z%YQ5AY&KW;s7ol=oy^3Qsko%f;DCO3v`n^G>6!vS?n2w@#`2P1)a>k|08lJ+P zvNTewlQ{iaAzs4MXm~!I`Q4I4>L8OS)l`B?l{j^nLWP$So8gn$e_g@#mPs7XR$@>u zi9Z@-;nIB?8{9NpoH-Sn5h@HEk~s8VHd%SoSzE28`-Z7JQfi3vpTfRR+1!-l?LKDn z`1KSv^vDv8!6Y2EX*eC7i0!gGe(ael-Y?m-ZIMLUf>gebNu+gXDvwPk(Z*cC&GJc< z)n;;WbRt(eW)ga464%;f(sX$|{=GGPdq0V<9%}CGiDyvZP=AkxDGeu~=$y*% z({Zw&rt#;_cz*6kqwS#yG;+*fYma!@zccXZ5hpmcl9ZnDB%e|e+hL;Q&lU8XJ%N&I zDh6DP<4LlL;FS}^KS{%ORXhiRvM`%BQF5&sZ2QJB*d+z$HsdfUOu^nDf)hj1I9U|S zF#9w%e~xC0X*#P`MPcod#=eV@T+L6X-l!P#=BD%bP%OQgC@@$N!@0C{62C-Zr&35h zB$gfN3gKhNFuS2bYC9w8*d$Z@0%EZ@R}z*RL+|!#I{L?=nw&{&j~J|MGVw2s;@9y^ zoR38kem0e@W@C9jD~0%=FvhG;rCa?7E?1{gs~1M`wN!4l9z%3an#`LBY7Ns_<`YJ= zZ5sJQLfP>%odTT*EM=ZtIxrR|w{)W0j-_8lI-3$h>FSZr(HS93-m7DZCKEfXPZuybdPxl-yrlFfS*i zh{jhi4$D#)njVC8{ZxWvhlv}IO2D`P-1?<5?W{j@TBWgOU@(2wrg69;P-+ZQv2zJz zkWL!q4@YvPIt`seqlui7Mul$>|13+Bn(6?KCd&8)`s4F5o!t*cld>xv-QR;aVwAxF z%Tf4jO&4$WK)Jtk;o1aH^dX)1e~#qoj&z(a_zT}pA$|^lM4ng55nr9 zLVPbqiI%7IS7iY0{!|ds!JlT0m2AH>l1E`F;sNJJx5N}$4)7&xY%14(`BK;*4fn}@ z*nUivoU0EHWV{O;MvyA={fMV8F-2))mx`}vdb-q3iSMe6kA9sWs_W?(obV<3WIBx< zefTWvtftae-k%gw_a^=t+Y}s0_aQ7z!Q5#hFp=wf-1C-qq7*`VcvAiPchcGnN7E&h zx-s5TyOfIK`QaFPq|xN7Cy&0Taq*xx9Ui1HnD|1*`G7m8{z>7# zI`OM8Nu~QzS1u)_^7@-Ij!L=z5O>lxrm@r0gY)lG8QRuEGWKa~c;H4m>ok7uabf-W zG!{AxW1%XYe-d5AOE{ew(}&S0CY^`?cdllq6MW8%(I?Ug&v7A0`fX{9hrFj`V4)Dd z$yXVY^KfIFUIuk$ZunR#*cI(A`Kku)rV51*VA4FWkGGN|!7r ztPIi!YUn~yhcwDc;g2=ao-fXr*T{EcDIqCOr&eEl0DER&e8rh|GJoPtL|0yuLDdk^ zty?Vpbl3^qf)svhTA3nx{I+DgOeM0n17{;sDc@+%xsp^y z`Pk9%k5sBEMF)R$DnCVM|4C9BJI0Fc{L@qheG#321!?pg=pcIkX|(#sj-&Buc+Iwz z8vS%y8aoN+R`!9V4x&GsM&2!{i+`Ucn75s1>84}X$`19bG{WxN5T%vldOAuUrqdun z^a5nR``+1>(W5fN|ItzOCNroEu;)P245pZi55li>sz2H=_xBV!O}C<0Hx<9iAu=|p zEEc`?C$ev)d5SKY>|=NSv}S8aDm7b&pm0rNL9`VGQEB4kBlXy~(-_}osQ5OeF?fJA zUrwYE^3965wz3XBi~g2ZI(^kcsOgZw*JeYp4ai{M2`gsi%DSFtMd!a#FrRF}`#UMT z?P~MlzrmZzy0Va>vYWu@uB-8jqB6; z@L8TiSAzOdDDMq-Ob4RBGac8E0i1s$<8L5*aQhT02K1(*jOSc0(do*Sbt=5kJC!M% z|7j}qCn38zD+&NSlLbHWvwY|OHFp2l)NGqkdP1Gk&vQD6EuPx96OrBPpasdh5H4xf8c zC+ogMj?e#*CK^G#$i0{*UM|8*wMl2rjqap1NM~eZch1XtFKpI}5tGunTxLqNjK`D5 zJ*X~Ak$0v}+zUxzP`6I}koS;_Upg?oT`I@dnegVyeG;CUR!M7@n9KFum>?Gsxz9aQzz4=Ifb5Cv>4~$Ki zA>*;Y#e^{v)5Y6F^pTp&zASZ()q^tdlsx5>wdu@`>MR<8vJWin$bp6_3_EO0XhsT8 zC2yzmO7=sYw(LBX%KN*LH;I=0IJYfFQ&X9pXNZ}{qVIF3$Z&Pik3Wq*#n-k!L_ zY24Nt6VyW9N0zo@a^G}nE*tY~-S32-ZcPK3pJQgVLOU##x0hOp{&Fh8lFvE)TKXln zjrg<4{GQ#K>#-@!jSwHRgcM5OH^cNu3W<+f(7RzdA^aYo$el+L-{hN5GfPG`CPnaC6xFEC)|uoSG@ zHNh$~Me520*R_&ytZm4f;uKB_j<9Wa3Tep(Jh+pBMcW4QelPpaEy0B+r!wMKL+W{@ z;^ogKZP(lU10Co}iRcK$v#hZ%tz z(OW!+PHk85?)+?glpAqblZ;i!ItB+MON_Y-Ki_2b4yvPQ$t;v5d)YT=Hn%5kVZp;$ z*lb(NpKoR|ZQ4%$*)oeYlQ*%#XBG{A?q!DGEOP2^CCz1))b{Qq{oG6p$8IC<)ePD? zZl+Da3^H!k62EK)1-4aGub4&m!{yXlJ4`YJcLGFh#?emg9M~DVwX$CNkV3o2qsb(TtZk zZSw>=F3aM|f3fU)lg%Q7IP#xp`S~%Hf8@Ns=EYIlGZ)*(6NH1AgW0KA9^WmH8mo97 zd@c~q@>bPS25nYBi^OR*e1qhg_VjCjwh(Qgl~(rTSf;+yaIb3&BN}Q+ z`z?n2Z&@Tyh~mcKEFyMBl667D3(p9C9?h0@6pQx{Eh87l;1HZmvP%rjc4{el9gV|0 zt$5N!;S`$1ip$|lZJH;3LgOfN&S7Ig47;;)(2j`~J^pM47)0?~pqBit;V5GT2MCK1 zJ*yl}L`8|mUAENuMbK|b4j!E%P*&vg*nAv)OY-oX9z##L|Bs1L?EaC%^~;esrsfk@ z8%8;7PA{6DBr8e zj33Ll8yfMv8B57-4QF?Saz~?~Y~L6*Jjr70#Idx!l7*dl7;!T0E!Tz+{z1#=sPeFE6sSk0k%e)RvU!EBX8s+AgYXN;ncewKJ_ zjbyywV_nwyvrOjMdx z+_^yUxzduS8i~d|i!{9e;*Muw9OBP&qb&A%`LRUe>(=?cT#e1-*Z2|C_^EiTBR+~g zDy|(ILAX}U+4DZ+&CxI*V+33N)X?s^4?_ki(M$BA^ss`BO7U$wCpd*#{NlDN=`+`x zUMrNmIPOWfUM6#Qcu=@kNyxV0qP3mL5mQe-j?CnEjTg!kxn3)8&h}Rk`G=>>)l7DY z4`6+Tn%~mBSz@5Z#NLaduPU;Zcw!o-BF52!!&lVkboL^8t*p~E!@2ZB&E_8-B$&$l z+%=2>iL%tZEe&>SCe@aT`yNiaE0#{Rs2bU??UFO1&HJO|oI*hko znbhCz%Gm{(7$0;KZEL|>7P>ITM#jC(Fj_8Fas8bub$wM#b9cq3o0@r1!}ww*>*SOh zbvbIunYrL5*Z&ye!m?@w2}hmjcvQh2b7x*jdz$Ask@-wP+;&Io&nXF>?9AC>!P~lk zNsdzL!CD4Dz9wuYXDR8j zP<-Q`$fwF4U-@pl+>YIclq^ZM<=)?!Oq=h3^XN=2EV1Xa+@G7V=%Y1NiKd7hzh=n& z{yUV19xD7_*^6y%CWqhH3f`<@<8B+wZ4~@kG?YG@1i$EPO^x76;YK#H4i%UU8p6Gs z8JyKv;g+Jn^tZtz$@p3&SaW@?^mC2)p1o6YW2H46epAx1o;7+7O5V-4V%I7qv$|Q) z%U>zAdxHs^lgTKvp?py)8SvSPMPoC?@63uob*9uxi{E*c%+DN4R*sYY+cK0rMk=mu zwC3iQOmc2mVR0yv)`tg^|CbzJIf!%K8Tg+V#OSUH?n}Fpi=-T}U=P5a0A-Y4-uPf*EBYlDNtLRd1Dp5+EMjx8=&7|?);?MqBNnn!!@*bJVyN>;t z8kR|fWnb>e{(4~LK+H-r`81{<7jiQgQr3&t#{_quB);4SWq&zn#;PhMC!2|Kv8|H* z2EBOqUWw~p;=e8HwJNa}`yZqW_uou>;?ns~_~7err{ga5qs>ed%sDS{W3Avc6;iL* zRKcQFJyDit(07z6V+<5LbLfHBh72-=k9};40;66%33gDRDeJ*PFNM6c-t(vw4iTYAswj)~mw&Do|5tyRi9q||H5J~N}ADNFn_X?U+Y1EqZf z?sa9-d%?Y8J2K^h#Bq0o2WumEPTOvr9ht$S{H~PPX0TY|$IdkwjJ+ayyIV6vr@1q4 z1ox?Q>PUozdolHBpJ^|S4~6#T1kg_T^Vpya9N3OPmGfB%`xFwl#;mvx-e{{Qgkgk(K1Z# zb6!Ut49H~sr>;a@m2tQw^?ThivF_c0yQZjHK(1xAC3OaldKX79i?>_CAeJ_I_sy2)f9Mn3d zE%Od3u&)ZO`K}rFefBOKw4) zH=?)F$wbN7XRX9*U7q)i+HqZ@=|)UHp2394 z%?TW=AYbB6D&ypui*K@4;VCF!GwW^m?tPWC;9vqdeZMLgg+?w_|G6ChW=78 z<*N}jt)-t288UZ->{oK0=%$(c=hc$qvhLC!7)eehlSV%bsg~#M03$ z=_tlGX3Wxb?0*Wc$V2c-y(WBrlFqfzM%?+9&W4u_C=1LWsf__`_hra<8nE_R2B$X* z?@7i;)SwCMS9!-+xs>IV%8!Act-h^%+<#{|!cx~h4`4D5ks8D%Nc+!|8dH%YtZ7kXu zN*>LW{J*R#^Ga#AT5zZS`uH3Zym(@L#<{1{rI#*&Rf4D62%jlQ){VrqrLtfAfBv`g ziVWUW>ak*J2JPz!4{3kK|BjpcD+4DBeJVRD(66b7(Jlq;Uh1(*_T75{dYH@eIJ#DR zth40#mQjyf*`JI0=`ioC0-Ic2l4Sm!cq4T`EtOQe>d=0Q%)5oc<5{RAdqzD<>UN=> zFoRPwwqg2WI*}dMv-i$4cC|Wy&7${sz-6aln-6_x2DU$cv zhJVgvep+v#-u%g;^RXMFGm`}a+0V>kjiMt-RNdKv+oUA=eci{`XqeG@dGXs#SOnmb~K28s7O$W}5j*+9xEj;QVr_;Y%d(`#MI?o=kAXTK+pV znI|t+GodDl{l0ayNlFra!DKdKNIN|ww9tl5-F=& z!@PeI=r?ygZzd#Sy|I={rU~d>TE+NZ@$8$nj@vyFP#s&$^@|C77*$FBwMm59EMrjj zBrY#nD*2>Dp2aTaS4})ytCr$sogkWrODMb-PqgWB(S=VC?aZZIyd2N@w#&uSWfDo3 zs_8yFUcB~J&_a&;{nK)W?~aFFWwgnkNK8bzcs@+z*Uu#kN{J);Y9-GH#j&m7QhFv% zWPklCrj|~?)v%gZ@o{W0TuK**IF3DC&baW2tUkMpnmKVy*}Ih5$rIQYR>RU}am1Zp zMydaJPQESSqQtj7?iKOJ)mS>3meDOJ4!_hgPU^>T;%6}@?#8mEaS4|u#ZupG?sp5WoUzAgmYBF zzn(EH@vCIfZ?VK>RdCcQmM;^_X@6`S?{1Vbd{VUVsg_{2D3)Wc70lJf@b|{WB(IC% zYeFSw=0&qOp`5ETqNvxjn%v2;FnTf8ZDQ!Esu2IuDCXN%;u#z%{L2E)d&RJJb^)!t zquAUfpMerb59*pH^#Nni^ee>7QSzKa3y5qS$zF8m;$MRqM zVlFm~;l5W9A;nP`-7e(V_y|cA7Sm`;Bo=E5(Tfh}ncxN!ABD52rdT`yqIlz2NW&+g zq*s=4*e{AF7m9h*CWLkM;4wR&r14?m z`B{L|1<8jVF5u{+G1&DgAf-Hn7q<#|nG-7eP$54uLx{>MWO2k8j(;m8BsiGN+G19} z3gLG}5ideRFf+?x`oUn{U&)r*>L4EU%H>S2V9|Ta5&faj;%$+`B=aEhM&;q*AHv1Q zIV7zg#Z8@ju2}{%)IFcOu|d?_%oSa}AnwhVaoR0;(HVKDokwvevjA_eU^+VHbNpu@ zOa1h6tN7t8zpoRH6c-hPZ(B**QOe5%aLDX9TGoRrJ4Fkj*pK(1>>YaNg?4_vPaM zF8INsUEX|LnZ>G0p5#Bw5-ot?>}{r{>aaUMu4!ps?unV;F`DVaDeJ0bQ4Ud#(B?l{KPyX}C z;a!R3Z?!W2V#W6^Jdft{y_xtdmnj{*NE4iJ?geRALM{##9z-3^;p9qp`c2NkWUU)< z7jvkKbS0>%2J`>isoSC9@e?<6wrc2I=t4`sEK1zmxh;I1MSqA7-Tf@uxwWg@uk9n#^)WxmwNq z6ArA=*U)pNllXjTn7F|imqi-#U7h*zUBh(;81+C+%R)zNWW1h#b;NU_h96xVshgm| zCBT8!L0ZmDapvCGEEY}>pRJD?-ad3-&tAbJ_3hc&TT7R&E(H9Yg@j{VS)Rq|Vn;ke zvv5zc=c_?B8Fu1p9-_rs^3WG6wd~t0K3TK0-2BUtjWRF#6*`Cxxt1x;4xBgCl4>UY z?@O{p@5GsnfEQTRrMv4bro`D)aL_T1d87Ot2rMFDCqXGuP}t%hUO_N;iNCh(LE>QW8f zF9a`07d))HEwxTr^vboxsG;Ct@#3fFmBq9Pb{rg?&53q4jFR)4Znu_vqly{xL|^=r z;4*>(SZq`A=f8smi&YWpKbVD6RgAK+WQD03*HuFW>r+eKdN4->@BMjRbe?OaJuil^ z_mGa=f5q43!BBR z@77qK(unt_6|+}sL}y2Q!;>}QzbQCCg$AAJqF44YOZIrtLl4g4RP7Lyo3aR4I9TeR zHH-?kM0Gcd4Al^(%lsQ5`S0bkv$*(C^wCCSp|u=Dcv~&6jfdj8CX4KrmMlCg=d&He z7%LS{Z$uY(rAl(%7QD68NUe+Huiwi2n>3KJmohIR2hvsW&H42PQrk+!Z&8vbwpQ_U za9=j>$;4)YIrWxhqW0{=@gfx+`V8c~;4jVI_ZJ;!731Z2yDSwu9{0uEMI|*7=FAzX zV(^{bjBTqXa*p_JKUHy~xGx8qs2TsY4^#hD(QtGh!iv=>GX_fhrDn460LrS>oVwRf za!G2@7%`{#tMuovfh^ds=GUlxxOUM9Z`hpQ@A$^M0Dyr|AvQ>ChTONyk&=55RZc;ZMuSRdR=mEQ^F*h}( zM@J1E{uJNrZ-V=o_GI*FweX@$arM`YyKzYPT#1vq@gXyl@H|s`3LZ9Ncn|uu zRq@)h2RhR3JKMW6##e>+|Kk(4RLtsb%DM(>#?0=H^$0Z`1a}zvLd~Yw9t6q!o>Ksau$56Pe)pJkbW6rLfKB?lbsR0T*0*t zU+suyM z%CRd;+%!@{-$}4Vi8H0{wxWyRPB+^yqh2Np%UV(Ysl?Nn;=hxg$Rw-E62GJ^f5|>${Hh)Pjw<1|wq>)Miq_Gs@#rFXh+C3Rm;L6d zu`!?Q)p*sm;q?O*DL-0a^h7OMHSNU z6)#oz{b}D zVvgV@X>HUj9?^&f!_>@dD%Y7w`{ z|D$BF;1PL#l0Pt$`YOT8Y@gL9T5#Y?;i3=vJQJN5J&H>*nde)dNiPJ?5gcQ251IG> z)MNNk6()ua59ni*Ym>D^b&6X92fhpMS^(j)zX@Ll_fAM*`0 z$IR++EoUFEjwRw+zF+hQ66j>Vi&CRRHjUZB?eYZT{@c&dfeCyo-iw8M0$*?J5?pW+ zgSFf6(oNvu(XHs~PZBTfgPc4T&+q~JdG|V=;$?dY88C_CUw24;I-d6~8(8EuiNor3 zvJb@LT)Gy`3CRb0)za!rJo*=}m@$dFvv>1gUp!Cl@5iibJVncP@zgDz z!u~rrwRR#iR_|rYjEVG2-ie1=;^xN(h}KR)&^md|n>TDooZyfLUti{qPj$a?Pp#BvnwV|8Q+=%05-X@Zh;=~hZ12@~n@n?&* z)c!S|?Nhcfz$}iK23zRcHIDxZ*OFTi%Wo&Q(saNCmaN@K`PT8=X|$duNwNRykKYo; zQ=+p4%ZstJ@!80}f>=%mY^GOStgPMjRMwB>-Mv**+D)W>?MfVz@CrJ?p(`^aWSMF7Ch&B zG!-3IaVa30J9%rx`!|NH6Lmxmj3KV?D$)6i!gqKTDb{kHgeqR?$8c#$CBa@%w0l-f zj86Frxo*RC1nQv#O<5IUKi{OGURQj8dIy(P0|P*SjkSog}>M zuhsY_jHTzGWt7YeL({f`50ann>|Rc|UpW51m+?=RvCLRmPW6{CoQ1bP(mjmE`6b*H zUh_rcGFB+ZQ0`udPor>*CRVT_d@N0K%duV%O087|1$JXZ$Fhu{>q0p8sS-Ci-+zL) z_+JT=bzQ-!qk>~}s$zlpSblr8nAMHOQYHM3rWRqCCs)#KMkvkeRfvvXh}5txA;3`b z=>wMt$7l=@?-$elpAb&(uH@7X;Z++gWn#-PjvT5YUjDD-#uC&YLwNE>3A-fzf6=O( zLrsD)I9ATF_oG?vQAyGHU{Yk9bS{mi@=>MuX9qF6aWT(31e5lzkkEutbm&mR*~_CT zj3}nz)*yDQD&pwDKu#JIaZ?#Ultn4w8%A@^u!MWxM&b0Th@Axiyjxt#WyfG9ZZ9El zh2RRg(vHeNQdBi#5xHa8o|u8Kmm zv;284c+9suejNFu0Gn=pbaE}^-Y7qIM-|X_pfAr~=ToH;c?MqsU9{68M~>Fq^$ukzzd$0E_L@nv92A^jHmpqE-mp5O+5Ab3@TpX^D+k_Y!C zVPg@c^?bQ@s)X*PehhvtxKww!{>&nxH6tXCS3(D^FY`u~h@XxRqgM%!XUzy&{#$~1 z$_S<{%I8r}Zx(#W$N7slab*Q8*YzgkM}g#2y;;|#h@XqSv6K6C>fl92a1l5D@?!P( zVz&5tlijZvpZea+A5nz*x+f2g7cu6@aBg-k!sxCCFQ%37<}Ytn=@xV7fhWxdip3Ln@L z#{&gawjWLd83&zL9>NzZV9Cy5{9G^NTII%Rxn4rPF@CntcUCguAl$V4-+1xzo98AqKi`%#iU&+vI`K$|9^b4CCP3LcXWDiZ)as zgHE~7YGaOQCc21zyYO`aT^KR0fYyUt*c(g;87E$s=TP2R_~0jVnLh{iNdLDS=*0Xz!Y8V==jw?ZzFx57iE9q+#@mqmHkVBb zXVy98F;6Tz?~KV~zrqP4!F4V^ci{2WT#N+|*?u^e6;<}w3a@MEWn0$&m&1mRwgfa0 z9CwgH@XG~9OPS%wir{=&>N=5qKaVt92O3S!!*sMAk%Et=X$4OZ z9+iKM4P$QSbE-QWsLSX2DMzOF$mgW7Ju_G2v1)}4HK~G^ZgFD4#R3w;9Lf4B^SYHI zN<{%Lk2~<^uY8^kb-?|fe7>BN{?g`i^tLUR!4QrZ>+@QN%%SMEr~uQ z_}hd*Y!cqitq==rY_e&ZBfNuFIfVZ$zE`H%SX~&5?`ti0k}Ub!CWm49)|9QwX3d$w zSlkev)Qdr!otcf%aSImw%;9a1p;#}^p<9F%^J{XLc6ue{e9HR^<>ZIK$0Vx%~Bd5F^LtlJLR; zXP-RYmkklWi#(=PS@C3NF4MkPGEQ*nC2oWHYLv&zTuW}K^3Z%1zdEURyLriiv!z;Q zeI39S;djmQ7|3L4_q09zg%_2>gw7WH+?~zLcLP~po=xY51DRryL-n%(J9tTPwgM+5om?;N5R_h*CP>5oSaAoE17=)(xFU|22_ zU-lL4vn*V72e40Y6`Q-}7<|uSuzP=MrCqwt{TUY^e7_TYX?a_4(|vtdHAc(Mir%>X zqb1y60FPumZ|~`gVw;wGJNpn~myNEE=&1J+o?nqUAM0ha;!$tD%eV|J>L}*O>KxYg7d+x@4p&Y3^8HGVXvCY-M%Lf3%YCr^J&SR{y+tQA3)?BZ7-^ry zk&``{+EQ?@Vcq%uQH###US!LC+)$e_;c^z%!9Dq2p2Y>19^$8+h2lv!{xjF&uvm17 z1wUMVpgUXZwA_8wlRs~1WxwhvIUA|dvlX439^^I2=IE<#ENzj){w|^?otur5==0eM9=yQ4J4d_bu;)Q9E(`wJ@QxWd zmN^uk6WwgNzn!tYaJeb-?u@DU1?N!ktvhD2U;TX1P2TOYNH-TB9fS|6HKF5O;p^4w zhEYH^Ax%UFyg@d<`E(_|GFx;kO*q;(hmIXh7`-wZ2j8w7K9r5m&@N1gmh+D2#^S^r zHk)=8|L+{h&v(Z1oQChBZyVk*i^ZZ7R&`rL<>Zds75-e8XIvo`3Baqtsxq)L8I64dr$c|Nkv`#)&qRebC?^(OPsFvxvLi zmTdXIfFa^@Gb#(qOQO$|Cpe<;A0h?kH|@|K({WnNpS2_TU%|@+Ptd;2V$Nz~`t20l zdrB)RU4)maX+x|=%i9&Lc=B8;|J#m?6*4Yn?J#(x#pA5-EhIl+W7&pnGCvA*J22#( zmKc+^EFYRplO4w58>eN!)Yd#-F3%Zddv+bk7H_+DqDPX=-2`K1FA`qs#MbO8*RXp* zE8I&ogx+h3{bCJ@x)!M1H5_eigu+=v;;81Rbh1!yH^TaphK|1(VlOz~n#ktdx~yS^ zdo!Ah%i=>+3$8!aFz;tGrU?#vKcX2=M`rO={y*xo;NsUsU+72{jqHrrA?s#aVRQa; z)ryXEGn&b|&v%tNf{9w}X~C-`EyWIoM9627ZgY;xyjvnX5v~a?{?>?XZrLPNiLcI8 z*(cJQv#U`y_4+j<^miFQRZHO^XY-`61udn2E{<-Fwz1&Y4-CXFM1$YeCU{QMFetVO z6RI?9+hrg=ks6ZgHKxtnEI#!%V9w$!>O?2ucUkv`of}atcww(~4QYE)@ZSXnJdV!d z-iihsuBT;hL}LcXr`y7Y43qXxIogEj)3jXc*jRFU!lQoCfU%ONaP8g{#da+n1~wp3 z+J7%r^bf+bIc6cc43U!G$rhj9aOr=+KVD0}4{~luv|Em=$`|;xQVyr=RN}m|v#WroOCz^E{(mLsiPmu6g)xVr-Uuj567CoDr z8sR?aVmL&2u!5Ux_YnTHzb<>^cO$o7PNU}UVS4@Xq_o(LV)1x7HQP`9-LZuKxtH;N zvG|VLO~l$*;iK&okFHooo!i0nf^jU4Jiy74SR(8Xhz3s#htl_PLh{)cjrQ?X+Xx_kMH7~ZTpAaxWmL_gd`i@niY?zoRNifG0d?;6 zHjCl0atjHI#!+=*v-mf~@OjB5t_rWbc-SWK{fy!Jimg(I9K#X)t(_o3aBv;1oV8!1N1ZHig--~e3 z6WxZfO9Z<{ZNczeI4kuxaa$)GZN2q)EsDYBTP^1W7g%;?4VIIlFgdW2H}@iFV!fVW zy3x#PxDLlAQS_cyN29h;>?mJFTJH!3&aK7#YXsTlt8tg>#LwSA+LcJ*O08p_@bz!n z)=BMm1W}Czhd3Wj-QxAa8I(HWv~`T@96_(OYe?1)=fLJQ9C#Ndypmex`;Mi>t_}1P zKESSuwItYw)2jb^UTl*%{nlDO4;4OpSRI{Khl)l?E#BUtoZP=baE-A{4qA`)zc2!B zZ{SNo82(+?QPnSuMpsr4oEm}I<7%{pl7DZ%isaD|qP@J5PB+3i{iuck65rSMs$s|b zFnTXsj;$OwE@m0VCZYUyV-=G}g^PCTN=8l^OGVHM`qhQ;?}}wCdmVz$%vIu*Dg67p zD>+jZ#_t1G;++&q!POd84iDwBoOe@?F}PMP=l0SNZZBU&(z{Teja)^woZm2M1(t#z zEb6wJlf6Sxy!Usy(XYd?-> zRHA<(kg(h3tobJO)%t?}#QIWEz8GJh04C&D^4U3n#rl;*{_D@x(-jmo^2g#sIiFkj zGD6OKWUCL||E;91%Ab7(mBM%QB{;bPiy9vq84FJK!XJO9#XMUec)+g;EQk59weJ#U zE%)P4zs0P1@58&AO6-q}U}u|3Qc6c)^G?P?_!DjBRgsbDhimu}(YN%YE^7(H9E9i4 zatRmL_;5(h8$EUeH-B5o-FtqbFR~PG3qOfftEimmi&yI^4t4bvO~xhkkn=mQTg-=r zBUqSQ%EE@e)J&3krGq0F`$w7Z@_e!ASI)yG!k=g&{bV(Ql?TgdeQpGGo|R0E@aD8; z3EnYY+%hc{tksMBqk==6@ucoZF=^L_lN= zZ&Tx?e2xs$8wrp@Wki$ za$0U2PJwGV?!F$ZomfWS-tJtiznDwiy!bMyg6YDyXw|lyD|+tS?{N_#fGa;Y7h#&}LQPHyOK!RmDEcAV53bk` zETKy)S2|7*{?fm06quFL?wBh!hNV&?<|1|bWrC}_@bzdJx5vxz^9n^L6|9PiBxml- z$m@l;#yCKBE^TjqJ#mr zobik=k$P}vT$`2f_bT~&a|)F2)kRWwY|jk4BHUfCTb+v#?^VoKHXBk_TUlXk}s}HBLorSUMDgTp71E z*6hDoD870_xHDAnM>)@|t%WpG45pt^5yr~F1nCu#U1UkGk;Mf02~P2@h$KTR`jr=P z&Cim(e-`n79G!P~j_1RM?I1?1NP>t+A`*!#Au`S^Nl5Iy)hddjs;E`9YGv=ehe#rV zBx2O6s$EoR6}4BbS~b4w_Z|LtkHkBkaX(Mq`@FBw^;aiukB?+ZOb<@IjNsl)S9XU) za^ivuG5aEzoaVxavypT?=f;aw;(eFY&n~`VIMkU$ahdDpu2}pT$+7>O$(L@-TDpgl zy^#b?bYe<*6c(|r1gAtPm%@cH(xDj-QO|kLXny?93CDZUT6b|`S8@a$|LM*V=?tfi z=}rsrieta1C+sizG0)qvHC2AO`P~U<70IVIj>L%{*_?6U!;}bGjdZ|9oWoL_z-3Sb zjrZE)`67a0$GUOXEE3cGc7!KH5VfQ$$qyn)o9w{lO_3xW=%x(vDCWKF&Nsd%E<9@X9* zz0$KQpQnpk?{=WpDRIwdcI0G4<2#_MfL}P>|MIED9CO)up zew4a(Z1Mg%N?ru@)%_Yp-|1a={cX5-j4el}hf}!5h9!S(<=;KhIb?;Cf7+UG=>z+= z=|cbI;rwK8B@J>of7n^Ee2_Tg2}}N!Ue5QAPSmT3z_*Ta1@1&J$z42Rk@R*`ZFpHb zg8B8WX(O()Ry|w2#O0D!C@=qH1nq;YiCP^Yue%l3#)`|`RSv*-z0TT_pGHNJvDbzQ zbUsd7F-^SDwt*E(Uq|3z*qKlrZ+C6)xQ3BT`_PG`I#D>?u%_HW`)8=_uNy_13&Z*BlR5b_!kHf1K{>g|s5d);9ug9E-dXY@%p?vz|5j48po`um7;$3Fk3W(x)0}EPTk5u+bM_%Md^6zlv z_g{{n!J~Er_K9TkFY>RL>w0}-#(;k!c{kHsUZyBay0w?CCz31DWAxe@NskmW{GR+M*Tw5B3Q6pev!fmLdUn2k2;b^pG^30H-cr$)H|f>+Q`RD>w%Ft-D*p` zbfpXB@A$S?BqIx2A$uxJijUFMO*0Q*OZ~Vwo?AGC6)cR zYOdRYp?O;vH?$dV|J=%lJ}s#$E+4O4%pmR0fZ}Fc`EIN90L`Ue*vj}tO}P^k&Z*y8 zuwuA$y93nQYZOkviKf_}3nxK2m9Mnj;Tg?H2#jDu+g8+@8KIny7GlK_WVkDz(l~-| z?>FNcar9p6n({0&f}Ka3V`U-kZq<@tU1zVlHfQ(a2&^5NvFE++hth*g7%Lxc_r}cr zZ3|Ni40zp89ByP2X83Joskibb?`^^L--di!NBY}9<@5fwl_OUTIXQJJ4vQLNzC^sb zxdCCW;lyoI?r@HD#Y-Dfqj7U^VMDIyytJ%qKwt6E;R!j zPc8y3)zW>u(ts2D!WoSLTPJAT|8B^%o)HWl+la*}`a5&lKpN@@_D^WQkwX!jC~2Zj zvIr*5Z_GZOpK#|!>Q&mpZl}6be=fe>{gcmH?awmmsoQg_#(!-LbR9ob-h#9E^YycJ z)n&7lZsHM3>u#lC`%gZ>eZz5bZ-AA~m#s}5tjxn{(7!%k+}TQfag=d3;k5ckeJ%0f z)LK#-TaB;(@r(yLf7NYjaY5I0eLa7v*01^-)@S7M2;M%f%kH5OT(?obO23Hz_q}Y^ zqf?LC{JvM`Q8^FG=0)(6Pc0&B4$!#%c)lpytBfG&-;=Aj=QEzNLp9RIj^mj09L1N% zarjOpC52;|t>^tVZ7h>#R&m5+EbWZ;lP@2)i_<=RKOKYlsA^)Sjp1pLc!$+!O!n_% z(XXSK^zUBoY#Gg_PE{pPyv*5!;kF_y+9I|#5IONsO+ zx7LrP*2rDdY#vM0u$=^sR<7B!a^*;kIa(X2cz-l9CQKNj!dTE=L33o6JOGMcfID;X0q8mFw? zv}-OOdfy5f)*D4wg8VpZNAfOdmo)k#3EWx9uq7kuX@3h{YwT+XrM>70f8A(2)nXsvZ zI^U1PuFrPygptbHDdTbBND`uU@Jh$)pU#CGtQtvmP_?uqBRN=qpZYyV(m$ty$H618 zT(yTKW2NVJ-A%Rf(DoPYqH?={v}7HG-xW#czHcj+03#Aw|Qfy>UD5qK9!Sy_ohbhY{~t&b1$g)8$$zoi(3+ z_MwFTqJ}ZQd^;y?mA}?`JNs7+VRC~VgghL|>c2|(>EaNYjVxhO=3seO@~OEuoPs`i zSX2+Aw){gs3?4?LWg!cHmQElxUs)!@`0ZsL30}jnXqcy5gP|-Qm&!%)_nW-AkD2-iAf(K=)> zW!*DqJ5K(Fu{q?Y%ja*9O^E$q-fhaH?bZS8tIUwTPMo1fF01tZcWdR+|KT7~?q}g! zGLZ8}GI{x{c*K}YF8mS7=rVDuq=8ItlTD4w0G=jg@zK6N+g@Zc`&bx_=Hzj8&p?8W z^0?zRkf_Bubk7tI2+CnjhXG_Q$tHAke`?xhD+eHq`)jhaHX6#=*j#3f7{KRsbD3#0 zfW%kXq_pXe(egZLMFx=9JP)g?{+vFOtN!l(oEVgY*O4&XCgn1zDva%}IaK}-%Cx%q zoM_Nr$3yz23UP^la!Iub!>#W9_%bAwhfhLydR>n` z{YdMQPOaYkD43DPS*yNW9-hjGs$fp8%#b#%AFZ#X<334#gu`k4@p}j+{nD5cAB@GT zR5myS@$ap4YO;fQCp}I2&LA$oN@H4FAKcz$%6HX|$_7~!UI}5MX(q3~4&v3o48m3g z@z>^bs^C<`qf|!Am$6QKXhcW=&WOYDXGZ`Q)6bDgSkRPpdFY3)rCis>QVC z?N@^Wcxjx%lKMXUd?<}S8~fqYIF0v)zBKqX6@5LIJ|UIoVLp6!DTQ0jycrdmfM1yp z=Po3$>46VN8YXZu$y-_7@#=2%#QAI@7pD2rXh9-B*!$ur?se#}kJc6v_$|s?{@Mik z-IZ@5FCNnaz4;)$Q_J5x2#8Lir;{)H2Pfh^Upj@82~6MW$=R=1Y^ft$2qU ztCE=ZjW@4)CNcSdavAqM@b^`>T2B2`^II2oQypJMq<{!OCS zD(OR}CegT&CnFvwQIO!Ne)l9^cJZLdD}@D5_5VAPF&yMYPHZwQAN9tkf3m!F9;_C( za9Q2v7rdzYA%)n)-VE=N!p@x@xSWh5CAb%B8Yfcds$9QL@(Z3-j^FG=oR{>J zHZ+lY^?DLMCP}@NJt*={X7{f>2`x$DdcHe84-%<}a8oX99NotE#Cxf9N@Lu~cZ|bi zVh=t>$gelk4fpM_l>IDyL(^DFX1m~TBAwSxXKt>Jr@*imyZqy^ALmZH`Ejh+toK_I zhf$d;qwdFYy2gdpUU7Jyab|ORELWV=KddR|tE3+BJYa&52^YrPZXY3|9E z*mzd9Rqo*L@pyi6WrldtyWOsgYZ0%WFc-X~KdZCKiA(n4PK9oK>!4hxDra)4;@M{E z%#~H~_#`-CAWl^|rw5b!C2+IYl}=>|47un+SB;;NLKm)$kk9j$Gv6&r#J^z=YFi{y zW9&xq#RO@ZTsiNQ$XF*=`YlXg!5t@ZQxZvf;=*73rDyxondsLE#Eum=`8|%qw;j2M zbaUq&S&$e<#7PG{{)#6?zK|Qkd=J$C>L64EZUR2zv*f>O7{;vFAjB#=#eMM68XY-hyr%>>0==DHjy!wyxaG^LSg@*hcy?c#L2^G z#e|ADZcXpZHwWTae^`BnwsB1V%u@N+Q3T!SOy=)VSUs{-#!M6&V>>ahcQm<2EIAMr zO;k@yY{ji=zwE?(m&_Pta3&ycxV;J#{TBgp2l*0LI)0>iQ@VX9l4zw#gt^} zHkwDXb)p5~O`-{`GN^+csygk+Dvn~(95Z!fMB~?{6D4b-sovQU*Y45E z_*6fjIOez$?WnEsH!IMBphwYIOzeow!Dvk-3Lr zsCsP96P?FfP0i`nT{=eTJW71@KEKPKQZJU@N-g;Qhgi(SXM)514Qr7)W4Lv6Sn z8_fbgzAu$a2MY$dhFwCI3zdH%Zk-@b;V6DvHPeWYM^W4gYDPV`XeNl8xQj>6 zxYLq};<}Arw4lYtXoh@L50yA(o_I%p{}^edTS!YC!=fM~;xryi3Y&>J#Bgd#Q`Q}g zp@mH=^{~Y7=-U?R9RL{B%3rg1L*N^Bil$-NTXOo@qwv3vtl(EwwHlDKD83 zGjyJ=TvN`+lSmf7Z_3=xQ8aDXl=f!PO!jL+-|wTDddZNd(vkj8*Abnk`^n5k47?Fd zW>iC3cGCL5KMio77o*&fCKRlXAo7wOhl@#yY3BHtn1ikjC!l2Yt7R3jjFHvT(SX|7ewQEOntr=wO(+( zJ`3u{Fetu0m(s6&&+F)aQ5lg}dYIy>_Q4D*z}(xX0U;*I~)k<>Dc z{D0n2;T%bI(kGu5-tt9T)nkC3pSG+HHR7ym8Z{ulbrglU>YX?iiQAk{KDoW4D7##r zJK4Hk8mPA*G>X3(s3$il>i^$w=sM}AN7mx+deIyzsE^sHC?dY9Lx$EnRyo$^sYNtX ztkmQ4GD@toHeQo-A26xKpR=NAd!{Z?-$l!dT!--|qgm)zn|As8aW5G`6Y&u*;}Ik# zRnbE8;Uv?&`0gLh@t^k5viS(Hko}xoqxI|A`}lm$FkbzzS3TeI&rhsY7Va?mCLh48 z_E280uOY*5DD`JlQ!sBRo6qg%)MNS4YgLnSdK@9k*hLM{G)A!FR z!X^w--o$?5HLvsCTtnzStskGO=Ka%wB;_2?{a*U-8~cg-aR4FxtEoI8-+A*&Lc5LN zqwgMkQ-;%L+Ae*+8;<{toz(HvJiLB68%7Qz_lrvAX`cV?mpu&pZWz5A?NJWoFedES z#l}(k{niQs+Ye)dM-{7^48vyT9xlHa!uF8eEdF{Z>z3@oPxEcx6BUHq8N%Q(JNff> z&2RfwkySK=iQ_7HpyRdi`Yv@W4yNw+6(p=3%+66M+KUb-azJZ+Wx`&M|24Ppeo57LF z0kGc1k;4NRZncv}mIGKhvWf-g2J*`eYZ677U>7S7rRA9D}4k zO6f9k2*Yoe^L+0RX$#7ES}}xE^LKD3Vu;RDDNDx=W?1faMlBtr<5W(Re*V{S2R)TT z(6Ck+#n%T>(WaExxdYjHr=0WM22hZ5Jggnf6zFq*er`3RxB-&9P(?ohtc>jTG0uQ0iQZpXt&smkMFmr&~clF#tV zq1buk^HXLhOLrD9O7s2EHsV9}{b+e=8!a`zUu99mu9qR?4c<=W?Y@-dZez@UA?lSW z;)6#BkHoh+f7_2gQcCc*=!fz9?N~+jEq$UBTTP?#>P(&o>{l)L<&5Bg)zs#DiD4 zM1%xU^u7T9nZfFjDZoql3-$KPSC$;apxJpWf8U1z9rBoQBalhSg{(cVJpO%!c-Dwh z%qw8(mwm|EDt@&;P&$%4tsMt4xm7-s1_$ygDvwh?25=;}h+E_Ym`w6*$IG6SVQ7k`njqvhiaKCTNOBQBe~4$9X*ki{?7eYp8| zCS%S7aH(r1D+>K_o07v2=_8`IXY(YWkJf*s$8im$=iV$@UGk^XTXCKG(jWYs!=dqg z_}e?1rSf&m7?nj)1AqDJ<MoPD_ES>TQKg_?#pqKLg-EL&!^xl`B z%CgwF$(L_^vIrdM%NN@3uf+>e{?6t=h#$WtWHWh|FLTdjp%^zZ#L+Hv_vQQCY~CDz zW?|V}l70L}iSm;^dSha&Q7uXM5LoHs!ILh1Ow@YeT?H0(}#bD~k2{Ef<=C{JZ> zo+l=c(^=cnmsV{uS^WyU|4qlu66x2|SiiuF#?@)~9`wY*G>z7advkt$239#fY+RYn ztTW#1)$zD<#hcF3ZM|vbEsmK^`?sFd_Y}t(=Sd@NZ=I*TY4lwtNll~+3C+~G^v3_^ z3{Fq-VqFv;LtTrW1Jr?WxaVSY>HCe81~ zkwsZdxAfNc)=YvNy>Ls*)s?j((j*oa4syB$ge#3r(GI9io2}rltx^9FKPDD zS>V)@HihYI?Anvcs&wKv_u%Wp83c+u9GQ?o(21Uuh!Y;V>P{W;sMwG0Y&e#L`y)4M zCP=TP-hfM1DQvFpiQ~*<%4WOM`$96;I*EULnXF!J={TOG$gk0highVOKX50wK`L*i zDSxtd3hn)Ra9~0Trw_X+t1_9>eca@`PsVwMt9orx>Di^Ha==n?8ST!){V9yx(F6DP zshnExhFhByX7qOD&5{%{n!2!RZ8A-cI5WpIg=T|XsOX%6;bteUB&U&W(2LmtX*iD5 z{(h56uYex7ifCxU<`Hty)3U*_GxNd0+SJpU7 z2l&W^38T}vwAGoZ;z^a2F3KiLBKx*8Kf5N;w~Mp5Ng^fdomgKk{Z=1W?ulzH7JvDD zMH1aUb|+0by6c^tIP)?^`Nhh)c$R{Hz3x=qPr-PiBWt>(@$6A|s?$=*%IMCYw^C_u z?w0gUptXwY7eS5Nsi z#UE-tPGt5beO^)`AH_csqZ8Tux*KbTCeo;ZJ>Nb{;K>_tjsr>bd9TmukVL==2V4#& z$_Hpq*Q`W!=-M&lvqbF1cE$0s^1pj^r?xm=ps@oh7K+=wvtyl63U!Wk=d&M^`KeEL z2CPozbA8^WiOD$5=*DU%anbSOAmSfF287Umy?8u3`$nn`=D!Aq}rxGT5C0lSIId~rL8Kfke+KOlvU1MQiveD*OPY}q^} zL3tzUlUSU{7S#O62$w{iQj_cQj)A9?~Z0^FbFOqpF-^s0h$t1;F%lDGZC>txrW+d@$ zNM|~qPoi+3B|j9zQ+s6>=@8>NdB~dYLd83JT65Gop76t+nJqr&bg7fpYQ@q1?xL>9 z1lELfVei#=wqCWN?X!4{hIi(odm{UyyO4JvK|ORf80)d5oi)$J!BQiwaBZHT`-mlT zt|bt0p)-@0C2+Y;XYv9Qnc&cwnJ*G3GqmLD--#?8Z_WAhiEJqCOzUjvLjyZY- zW1W~5lEjAkR@`Zy#JWqCRNhS_Y;`B*^@vygZ6}_H$1LAqp}zSzBD2Lcq#s-MyuH?+ z;+2!#iIGO)Sx-9Zo)X7_@#a)X*O$J&12wsETviW-|4}{vdOLN1#j}3C1rDFZQ!&q+ zQFG%N^FKeziUfN9Yr)x<@iaTy5!*-ctdR~SFg2cE-*ljElLRI>c3{yPeNNx@tP`(Z z_mdeHwj`)`pd%xGNTBmGa}qa+7oO@s^B)p9rTo($w6Xz^+dPF zT(4`q$BZd0bzdxyza~@McXbCWzDi_TN_*COB@!N{{1548ZLgWppehNQe=KOK`=^0( zM>2epxU#D~(|0B^Fr=Mw;1W6iy&2zjieq+}89rylvtFC=P{-xVA^KV8-@)HhtT>+X zDieO}oPgUu;uk05>G8~j@n_?i^{+9T+!OfqunAw(OQ6|TZ5a73ffKJy_(?qbm5B+@ zCM6JF)RxPN=KCv~QF2&M8+Y|G5EHxn}te72(-3MbfO85HuQX4M&#q!3!wbpmy*xkX5q2I@G zXt603U(44#yDf{1<7hFkHDMd$$gSOm-d~El|7gtjdfw9QZSd}^^YdM6E;z=M6w!(S z*W<(nTk-5$`J5w-2|pUI?A2E4^Gu|!WlMUFlkPC26+czRaA{I=nk2=tKf5Kpykf;R zo6}7?)cr@Aa&2TBU450GvNM)c=~E`3i)Gh6BTQ?>k#MRx3w(9_Y0e|@zW7?r`1nA% zd#{`DeYW`IpXwp46bF3Lf@jIn^*%7d^KBgY$<3t|h+}bHQ*Oq^lQ>a5B7X6Vp4)&c^=r>)@@03qEJ%OO!>OW6S;ILtH45iyWlHZI7hgkgoR!_)|7+NoD$f3#%gWMQ1h=iY~G8r?2eVM&w$y{+Rj5wxS{i9E}qlS zI}VEp4KWXnV^eJdbvwrKvB;1oWS=^hNLbPuNO};(|vA4bR&7uV&pZgr+)2N;z!lzSLt-EFV*6kcHLose<_K@a(rz{KgJThyB?ng#}UxFF3qOKQGUJ_ zX3A6CdaD*m;_Xqz^+{h7$I$8Z_-|PpR@>@QYo*pB>ef-mTs&jHtVLbhc=jEuuRLPi zhep-oPFJlv_^D^IES}EVj&Pmd|LJ3v>-uyXSP!rD+P`&mX`=DH_`ABqd>zlf|I^ca z5&!?Wux(9spI%;%JzfdwDyxf~Wdgq_2lk)mdj2N$C;zaI>Pq?dsUa|N0FRCKYVO;g zh23hfb?wiif&(8P4`#J2}pPu&nh}C@b#J77XI1{F|>S}`OYkfIyKZnZ07wrP`+StC1Bq!9I6O`(|f466GCoeC1D03e017P4_oyREU(twCYYv!s&M;5IRGoG zFqV(t(x}}WiBLbCO%*5gIKFo!kx{`I+~0-k7eUO9t0u%fSpBhk_^dF9bq#mZ_+%g2 zY}&*8pZZ|=vi$$^6Wn{3F-PVpSS|8cL{yzQG5m=73 zZ(my1t0396A02-$=hmNn={0u;Pl`i`3R6Fhj&In;GU7gH9{-|(#vl5UHm-v78zJ0T zRZiMb?O&H2T5k^KR?<%TR|QivtemPZf*JRyj8Oj|X1uGAuTJxPs|v1<3dVibF7d=5 z#@tmt&sRaX@7RI+_#kP&cTiZ_2a|7haLA+&|GDnecYr?XKC9r4K@czg*@3M?A4-mv z@kV)$9~bRp`~5%)XIHQ|F_2xEJJ{MkfcKZm3Cjs!(9|8uF7j6vQwebfeaV=-oy9+g z(EejF`@|)_QBJSHl3;#H-KKuQAdXEhAyB;F{)z4Ud0gD!RxzJn31a{3VuorSKXBDH z-r32|U|+`DieP5+l@96aVCK~+~q@09Otcv<518F^Y=DhJ^LRASywgJ3&R7&8V0c?3+$`S4Fd*@Po>PwekTtduy3s$VF}igTW}THkVOyx&^gsqV6|ib|0C(#YV){z} zjdJrDmE_N{=XtED@sppph>}x*_()&${`&x`#e=RK^rQHE5l_?Q=P)T!Kb*fj2ZhW^ z@aKn3dOztFt``(y>*Ghs`E69Y`70MlTy3@=7wc@tq^%#l-;~Nz>Bpne?HrHx<>1R= zrYfIu+~5*?Uc!a}+nK)wKCaJa(MeyHkC!f~w=W|G7GQ4U%Yz36O#jB0q!MwzF20;~ z(RMxd!A$!%N`91^;)15uzO>hN|KtSrDFs@;0r%;}+}a==#?Ecr8|cf_3q_dB@RcWh z8^1L0WrcGQ{hGs`#zh4C`f&Am0bP^>@%6hxhO8798M2KV^`Q06Li`UYC-YPRBT799 z`mvasHc-{Bn5=(&XY@DO+Aupz!%ckK?Pg3tn-?Yw$PqX#t z=}k|sT*f7-H!)6rx??`-xyz@~Xdh-~<`J*$xZse-lE&UlKawNAXK(6T?r{&+$Zw$?6hI}U;8}s#dyf-sH&%?o~w{pJ=m|UXIOUlD}vImjN^Xby8 z7yEw8V@zT%X7(;5v%~|#nFS=A^}zmBKKWnw;$Br2M;`a)mrhx=*1kTEJ8N*!Z0?Qa0~Gj-y9BZ?Ikvv%g^q;l!+$);=rDq z6L-Awn>&_sb=-!!Q+X$sw{zW@YMqbED&=&R<>6D{&cNJU3O(FdWS`07U-i61@t|Wp zm~c6hP1foKnUDz%?hFy{i8$)UCD$xAHR;Lm{@E;W>B$e#SzHTu=Y?4o-(BcI4az2Bf;&zrS;V*OL9KOJES1j0&?Sqbt=#DN zZ6+I)i?REra?eY9@aMHmqW*GGk5U#1ja*3>COwyjGY9iBIeK6HkOMTHUdRu#Hivt4 z-TAVie3K8{Xxl8CyMMXjwJn>gcU(z}%%Qu(+TIXOf5pN^dWEQ3quy3xE%2FEYjb5Y0V^Mm$$lax-u^{x~Lr_)3{q*VL+ zv0HbndS_$TH6b4Zqo!>wO##}9SW@SoIG<6pkf!M5DFnnq4~ z7ebQLrE};)&jIOt$g&~LJwx-hE`0bTPJ7#$jP2=M3$x}LHd)YnIBIqAu7xmoCrVhK1r!E2TSepPkIB8=W{XHI+k4yO1Lu**T*N z8m>=8vz$BOA&GRFcB@ zAC)^o8gmy|Ykeq<&6SpnTq?b1ElZAza~|&8iESlmH2&R&D;hU%rd#vhfi!hMt2btc z#_!b5Y!N?PSl5yO!*rgnvZ6KVT#_#5@<(xZ+fI!BDV-?m&ip$novqrwz*6z?H=Vea zo=ioG1v@-bnBr)mEUFX^4eiL?kK%Jt7EE55g3oJn{Kcym_3p^Luf^H6bfEG{3Mmsi z;JqP*pb711BK_<7`xcxKzdT`U!IqV&>eLi(F;0~}z8yoKEC0>PoW@g9S$U#8p*p_L z)B}?@M85BB7PR>>jnfi3UVbdyV^~Kn)Mz|-m=pVT8jYsNuVfYP&^o_s_jMkMj}Wjj*dD?jdx8K>sSAKlCX z-`|s%o*^I7Ej>y%GwHl~6w1u8RUTbj#}1fJ7Z3lT9n+g>JiKj3hnvZq2yaJ$IC;Qv zGYV&FJU4Df^Xe38zcZ!af8)NL8IBqkk9R4@WQw@5ml>9xX}tN-g!XZ%c!{^v43v&D zvJIKWNyN=JW%eHN+0RWla5|CES#2r!CJ{5oHu&z7PH|WpX1XSl-mo>xHYF*O)Ra#< zlK3ysgkrZOWnCHb?S({!-)Kcc^JF3tP06uO#%7WU54I+8!n`#@ze{GRnJIA(lUR1h zm|8!I-)6TVrmlJxN46$Wddq{>W|THh;i;V|KO9JA(J2#-JWZxwOk3uDpR5dGW3tXB zlj;?``QrJv_0Pi1Nff6O#t!SNJ~hMI^8sV6g`4OP#RxtAgyrRyPQk}1th z)O%sqR$gaahv$sxulqsf8gZ*VDR}Q{MgPcDZfCaTySAx3>d=}4UncTvpH`ggo~Rrt z@e=Xe@>8cK+4aq7yeo;_SDLYLT@sGsHKpyu^`i5XMzpg@=A@^%ROe(YM>SKorOroH6HYm$5Pqs9#||dbp-~Giq$U%(vI&#IUpP`%Kcc<{T7no;0Hwk&()u zl;7zalSGEhmJdog$eIS?MB;dM`hD#_>LI<@RJylBCY3e8*HGhlnIRv36kiu_srMw2 zJ8c>38gTcTbk^a93_B^`__)Rl(s5~H)KFTiWM1!Tz?BOreD&6lXUnB$9&5;gO)12^ zZ%CN9ebZeA#O_Yeb=8FXM$(gp8FJtk=}6lea##Cd5!{e`aj?JB3~0VMfvrC@U`@M3 zX5DVY&)vjb4Gfr{oT$D~L)@evf7G;*=C|Vd&kU$1u6ra-dLN%e&Kfje_`lM%UaiNE zX-Nd1t*s7|B#MGQ`3%(cJAFZYt=A^eWK})sU&Zks)={5yGF{E2%lVMRkV&6>+?OTO zSbCu=Tct-AC;CvJJjoMvSUB{5_k}v_i&MW#{o1_ykc{=sdi3y5!RCKFX>1BZzOIAW z>=f+g*TSxK3ZwjMaaOw8*g)xkq|df#S&xv~;=?Ozv-*7k)nC;jeo7*S;!63`<>%Mu zZt9mv?1s8LUZ2R9$#obpLHt(lH~D2ES8VHYYj+}l#MEL$*#WLy=tH?U#*jstk8Z9Z zN%PvhKUFhM>+Um7if?E>nlWE`p+5tuv$BS`wS8zdXD|0&2C}x*0p_*TdiMQ&tkU~j z-f@6YivpGJQ={I6K;?Aqm$oo~&;H%Vr2hgKv$jTgw*k!lX|FP30vP*#FO&NFv)gbl zp>6!}XmpUWG3q-sJ3!zWKjyWQk4y8{ev|jBYh3fm_xgOzPtQ-QVMP-^HuT?1#Y8{x zY;hg)Af}zJq`Bt(9T!xwd2b&cM(ig1r$Dk6?_!vT=HW9cnSLvft$$WAaA}}?8+*9p z9mv25yUF~=pMeIuS@pYo1HbQ~re^@>d+s4ndjA>G)r>h6!1In(G;vcO#Oz8=cm!}f zY!Clv-F^InYKHIir^iPl8myYZ)9Qtpc^q(+thR)+d zSRGxX&O+hAg?l;nHH`VR57oY6bXn(TFqnR~pNGeMq%+)0wWa2<#nNNV@xyn1HLw2F zyt=)7XLHpHAzhNWm#=)xl^oLcbdIg&ZBJijjIUzk1C*apNyby8Kib1%y>El>cXRk6 zw0y9eCyRXK!>`8jTX^zYC9aLsH@UKke;WHRZfqrH!+q#+eh>aJK6F2~hlAU_8E(Fp z-2L7d1y`#Z$cJtL)pXN(f6I@R?DO}g+DVUBym&ou4@2}=X}?3hOJ64JDaS0@m%n>d za7{UpGdu3oxRoy9S~*%WCcwL#o1eq`4?AeTPyH09cCoXWFWYqdS3CSKXQG1tUiffr z$WHtnAXcw$8{wne#Byd{RgUA8U8K3HmgzCOzr4_;Q#GR=$SD|XWO2TyDh%4v`)eZ#$79N*wYubJxi zy6j0z`7W}jdGcFO1-I@i|8o9LJ}m8xL0l=->gC*Uw*+@PUyjc&;j}rV-Io7ty$=&- zY-dd`!ebK z)%D_&xY?u5o}BS7!SbR93+I*7d#@KGf8N2O{W>1nFUO9a)G063`R`5Mk}_I+Fa5=q zQZ_&H;6zLbPZxWTA5coZd?oAu74Hm|-^6nVYhK95lDdN{U-ZWAk5XkxE9b(aj3rll zk=me~tScT=YQOeh?1i&(wWrqeVbNE`M0N9Fz@%b)yuC?(UBn}uU)S2jI7NA>e|DSv zvg$v1P)K{{-b}41mImHS9gW-B(AA5BU&wbk%#&GW$}d0Ln-&J!*ii04_lZTEJMF># zr}E=H?8TL<@;QoooZr6<`$P}&qKddZs}~-Ri-~;YL8DH}L9Y@AS+t$9<{rwvRvy(c z^{1{W=J|N#cRVYQX0;awKPzFBbSmw?E@e#{?bp;&t@XR}xpaU>{*#_!RvG^-=_$=a znV4HoCbuo(q_{@=hehnH)l*vSB9>aXV{2AS`KX>)eZGx50X_NBa~nHu^k7YN5iR6L z8PIz>_fDxFI7Jy2jc`)~G8r_eU?i`0)YejC?bx{9NfusBCKASK%w zC%wko7Tc*3SK0MK+;nIU8g5m8+rMtg`z@x_*^O`Xd3SERP*;5LqVyysE4FKnAwSK* zZPYe%#rBGhqmK*S!nd(D-dWi~`S>q!=TUVYVHx5ooAUVfgB!P<#lZ@d`>`gEf{|`i zbSk7yT2I2>6tLC3CmY8W5ISA2vnt@(wjSIImJjrA@sB3?JUQ#im6>_O-Eral%>v~v z_F&JWe2fiyC`WyZeO6TdRJu_=5aIEh1gQ%i0yP@a%v&lzjT*IxR8p39{kX% zP(DxTa0&{Pb?qu&Sw1<(U8GOQXZs^(I(?JRb#G_x+!Uv6CS8qTA+NlpC&@0rcBKm| zk_+fl;iSI4JObMZaMmkgT&^qkhim+Jx$xD|LXLEG!M8&p?WAX!{&Nxa`nxblKF`E8 z&K#Li#0)EEX`Tw1_}Ga&o$rPI&b+&pOP?1mH29RmBLioQ(zDrSUTHXjZ&9^ z%dhJ@v(+t+zPGw4b25)h#Ws8?zFhT{4ZrEQ?CxZPr(qtk^Q~z|E?;-Fq^)w;j?I$3 zre!A4{#}#b|B}AS!b|%xetZ^nTyHJ!0870+E_$zYwACQmGw;UJyns!rU@%qHl* z6&tQ(Q~GmfYKzM@x?@R~ue0$S(utpRyjMN7!gfv$R<`0&XEGQfo^wWi>tW&^^A2Wk zpE6Wch5>!9uKXThu!;(vq8mAjhB_Kh8=_kAWQ ziS79HinedM1xAl`JY74orf(Kw2blBqA?ats%xU;coX@X4buu!!6k^8FUD@2|Z9(F! zY+^2$)31Z{p<~sLQzO0_)}8`!`{|?FDIYUOJsTEWI;=j=t>$=L%$A3>J-;r@qFaF( zU(U@|SDySq;-s$zb)tD$y8eE2B=ECzHf=NKu~|Be|50Di?`as1Xb&Fg>VIobl=#;H z@t=P>h=)!THyS9;S=frQu|d_V?g^?ny$NZ(YrvwqkC#45G}XJL;W5#U>Mm{UvT%WK73h z;?*Usx$`Uo6Du=zYdq~y|4`^i`Mm>_tE=O&Xh9o%G%i;CV!{@uOv=ZYP*jkib!lTP znq-poyfw8wGpL!-O1gtg4i}no@VtKixGnzKS}*Zz%dW37c_hD=%|qoHhP7sTmn{0; zYeTa9{pa_##$24*VPq@v52mX3xfNB-wBNxk`E$QGXJAW=ho<4$u{kc{+NQ(BfyCwS zylkOd=`;opF{0zMGy)nnSO0k$M>;m+$k{ac6Pq&Pk95*kv}AQfIzQ}hfwNw3)Lp!1 zLplRZoAX}$_#bhe$y$GK5l7h^to;pDKhdLf%KTdJ=6yO#% zy{6*t4V$u0$770FD^Ao?e&aRywH{@#Dpfts8hdjl9k@XV#|-JRUZKPMO$WZbER!R8|$VWXmS`_^Vpr-9tHv zbB*}kTO3&aGE?bP%W1*DQ>j`jYtG7oRKh=(F3CNO!~L3J<(^8D{Y_adeYLwjf3i;+ zUrVR7PwN~xE={RCnZ~j$O?c&(&a&lAFx7Ef`lTTY1I1yb^O-z8o&OFRFuGAX_P;cs zmd0W16+`N29pOklajk6SQ`TzCUX7z?w+)DSsqy4!z-jHjS6~xLmq=ef(U4j1bo}ER z%cuN*Bwck}lxf?gL%O895or~XxevB$t)gpSuKHSQ>)IlAu8ECEcMdT0fL*MCh2706 z21*R@o!#%R`OPrQ^E`K7=Q`(Hal}luP|J2K>#B{b)8p{ONE2QoI6fxppl3rIqzZm7 znssmOIm=@;p z^YiO8fn%|F_b;z$b}SC^`f2@Q@hV&k1#4pA|3U*ZIPQw)Yf*1;3NL$UVBOkN(4tR| zM<349V@mL|jzcW*oV1Up5WY$k8f-7ET`JUwoPtWG5|sJ=!k`Xun(ebXS{)9j0?^zs7)+!^2`K=%16G@rJ@bg!~(R})r{-Xw$O5*MhROrWl67kw9uv0pT znIX#f&i7fpl(3Vya`;tsRE#}|Cs$PA!u91zk~((q`Q~g;gAd2ag%2utn0*q@nmWXW zWw8j3P{%8+SXdLs(&RW9&)@%(&-?H1U$ADr;!kDh_lZS@nG$s%d_O~t@!u(A=cph+ z5sO{7SU0MTd7NG97~oNb+0+SCr&VI!c7edd70|GfV78?k9^)klZ!9O4Mt_1~a`;uU z&O);sWjA`U4rV2aM}?w7i}jWM3dM#~6;SZ==*yK@y}cJcD^=n_pI+#i$nSgg!f*>Y z>@@iIP~u6wdSU0f3WPJ>a;hzdpIL>YCG<6<-|^t3j2rjKar046s1;T5{M{30 z0;|yZX)w%}$#KoBCmw{AvF36p0-{SXt|b(8JIe9HER;0}OR!cYlsa7*-hS!@%T2{t zcDxtrpOyWWA9rgm#hO{YkRqtpV!XEdRWW9K3qh7wDbD{If{?w%FkcixPHrj2^bSGH z{Svf}=!wIZi?R0ao-ocTL)WK0F>qojb`I(Zb1mxXJbS|OPAT>=?wn^|g6z+%+h|cn zzaQqeAIj(pPhW*GG6eDYzI-ggala7UoLqzw=MY>tQ2>|bp7cH@p5)aN?eArHtQrEV zQH8{JdNM{U!uIh!5qhH#gLekg@3;Vd3xn~(w-^tYH@}cB!|_?cDF3|(D!Y5Yn>?YI zf}VII%g27>V8m$1;X5oCWyAq}KlOlOw;V~ij2opDaNJAXK_~i459k5guqp(5_Q2I? zmH3b~5S)dv7@gF75`oPbE&= z4#HU9Dt!1J1T7hTt!o1jWl@1eB8Z$6Imc=crmv>owoVXz#Y>SlAQ;2$l)%Y1m|Vva zG<@wre~x0z9nk|?$z{0yu?GfNmf?JJcNi@#MSW9u4EU>V zADdH-Cx3Ov>*=LXe%uZ5FG>)wsvDMdE{9}XHyoQ)j*@q*mm#CS_uC+t{zDz$&me4F zSc(U;gV1PMin_i*ICZ!LOL_!h_pfDmw=@uaa!bj-4}>XsdGb@Na}icT%q{>|I*Q=< zXAjg5D1b$N5A4Y(gx4t6`S`UE2d{QVc~Sw+(PwjBSs{kHcE@|-h8`cf;ofQL^Vn{R zr!tH(?}5CNMaUS~9kqWHqvmcmXdaN^s}A3vDn#PoZqU({Ax*;PP%FaMxFFOt7GTMf zKrFf;!&Ju8Z)O!C{&65Kn-wv}XPu8b1($0Kh?Ev%{}B3NJ}II%8hHzaGF-XmkB6s>cZe9xg(7z8^O0Q_pyw<8DqqR91G!i|{;+ZB7apXf(PRfN@1g(f7Oj#$O2Rl z$9UgY3hzEa^zxM=g5&S<)qIS86^Jh{@}N{6h?6P#)OXXLG$9WwbOPafk2*)w09<{? z=iu|F?aoDctsm0H6u=;fzM&K73-(JOR2!u@-w}Xs*7+E*DgciLNO79uqiS|OYnb}O z$&CK$#`N*nlZVHf{ODC8#mfx==xbYm?^XV|L;P^yLx0qAz77la!yw{>ys5Q>SccWk&WA4eh}-jVepSH>(dru`Ep-eTb&2v=j2^v z<)P()54;AjF5b7UIJ~m}iNX)N{wGD^d0#vW%}1v}zKG&!$ZxnW>jC8>D#!=zY}aYT z8ID{iKuEF=CYf?wJmG_Dv#0^}!M@qKtOrPb&FLH%O!vjvr`ZUv@cO&m&H+g~&$fuB5WnzZRpkolAvrH4)nqq zy=-hs^+eG7Tm%uY{?~thnv*yF=TCh2qbIff+4ySaiNg;$kMz5+z8!tm7JI?MG8b## zd%~mU?*2X~CI78$YgYt5&A^}ZLop4{z#DyUxEu2CJGx*nb-0JM zyFh(qI>OpK>3g1uNQE~7zh_{odl#(gN?q)F@=tE0s8x_7vvh5gti+8x(>?I6DQ(;1r&XF>=Mlw8b!?k;y^ z9?XOm>*=U;%f!LXZivXpM8zgIyu6hG#b2((Xfq(rus&~fI_i>L$Y-S<`d1eWq+i_O zWzLAWpN@sMoUlqi9dWN5u`)3W(X-r9?4N}P1#akfD-)f}UGcby_u=7;S38O0>N>%c z&oy*4{Z|UIu%*roO4L7_RJh>CGUCl$U2s4z6XPyABQGF}no(zXsbwMZn-eyBWJ0Fl zgm-gN5vAphvK1+qG|CNCdsC3C<%)S#^ilJ0L6mt4LN8E%^eP#zuR7tWNF(0uj<|nu zyJc?J)HM|z39c|$NL}((7sQhv7)IXBzdmcBcbzf$A#tzoPS6;af_I;s&@`MlmWdNR zvy#cbbwq||8d7$+V(`6G#Qp7zHxb0edOBmjb}C*zA#N}@1!~HU%)O?;x7r22=cVDe zkqg()H0-_RjJ2my;auZ{6zw!bu5d!ar!;6Ecftw>@{K~))JqyUgJY$2e(+tu0P{O=X^({1)?6XpOXj_CD&fzggnKjC6cfx5u)IG`v_~hY9!6pf;O+Gj~!k zxsCd))HKBWVvSDvX|Pyr#r#M*7NywYoqal#vTZQ`d>VeZ+rVlPalvEs>#a#dR_9a&I zJ4nU-U#YXIPl4jN1#)5wIFHQHOP$aC))Z5=B+`q;46lw+AKqYsq(u5tzOrP^`eYm;Kj^hCaaZzq z-tc$+;&Z59O(Hg6hK{XCSTxBLa^^Ya@_7$lNoL-&Gn}Tgo~qOo7l_}^yG>lkCIx#Q zvEK9JWNJsv=;_XO^Dsk3Su%cKV1if=^83g)THPrX)7KiI&@B<|i%sB2{raAHM&t?; zFWzp1JKKpDZ!|<$-$W>#F~H(r))%?2hfl|;dv7pCL{%bny~e0%;`8h^z#`)H?tAs& zR7aeU_=rktBHpbfUUN4IiN}nP_*)WYkEXv(C2`JQ4KR#&=fB_coS8%qaXnOU+$@-5 zjLU+!`*=e%Mk{5uYH5`ao}1KJl5&)+)bYGTJm=KrJ$kO7_~0MpC22coOr)e zivcE+?`!5}h&J+o1EchD>H>eSQ4jH)$3vItq1zhfi*6Z`OG!R(paE3Lqn3pkVC)q7 zM{d@`hsg<;#mH8POXt0eun-@Pzo+kQ3w)Er>^QCh-{JpD(uRVPsMQl>F)Y zOn=I2=0Cybt$jI}A6)M6#02YrDuBFi!X zJ;>XM+fST*ln!^BX5zL1iCSG&@RRRL2U%SS3)+a6%%RI(JYgNQNOF(Ur3I?zprBjqK+$9m`^pr5* zHpla9CFm~YydJCuX_%ZE=Rl6ZDuh`wUUg@@-WUKw#`mwtzs}5-lYbn5&t{cqxfOtU z)m6BA%pa($L~@xwGOH>ue1bpj22?Vq;0Jj~6}D@#Ucxy!9+mrHsIMFcm`C(iseos_ z9|CR5adl-NJ*8N`DxLXD#?w!v0nk5J0;P@q)CiX%{5<*X^v4M+^@qlua(wE-eCW(l zRIKsG#hqn1+n@Q+xAfs5@B5EIrR1FWVV1N6*Q@>Dom7m!4)`Pd9qWp>(zoz5c~5B`zEK(BrHM^Tv0jcVHDX&6$VPljGnMZ_NHw&b`(f zV?v0REN1@iVHLK@x?mx{7i;c~cU_C@=gns1gp>J#nUy_*j-FHb+(S&dm3K(nLA-hk4>s?-InO`(o`c<@A>JMVm?~47U5=l2sX$e0{NUYAIwN zeURf`f<#LnY=2Zv&ji-BR4v14Th^60PzuxeJ~)|JiXFj>Z-{?H9`nWp;w4%iy5dG+ z8Qf+wpPN&L2R`JRA1a02nJ&0X{b7J+7c9F_j-sC4u$)PrTAddTdzRxg^PGii%ji|X z_(G)&ldYKd99YU6k|%n|N-*x4C+oIVAa}7R#(gfs^BzT1^dnF4e^ROzN|$j!}cu3X(q++F7Uy| zR2kOJW*v+bMOcv9l{G#J;oahmdy8b))X4bfw_-fcXFmB^5hk-g_5Y+F_V3#|a1qaQD`z)vL0)IDaBtr|d3rZ!~@@z+Fifl=Lsa zrypH#)U1F$C|&S;g%qD=vW~~^gIzhv=A$@ys%WakaeUz(4)G5UdSGJ+?Wfe?w)YFl!IP>dZ6%J6}je3X zKix5PX(hB6zuB8sVr#QI)-J7J4Osdu)Rf}NX6gj=N|80p1N*;Fw|bNO{F|lpIB>^@ z;p7MAxg%>&84@13k(*bFnD1_^9Z>?mVT{+P!#p(I4NaFzaOjgOn)3>==QQ)QuEmh| z^{WXPH*W!vj1;zBaW!x7d!?>~T=$u)EqRVcO=Mw+YbEE$> zeZ`);;wQ(I%HJ-yP+0`u*?d2kJic-l%;CDzQ|`v`P=XiqmDt=?jIRe=agKbo+lO3H zafW=y%`P}*AVbqmXB=uR#1ZNi()j<^S2;npHxIU7-SKB!KEj{66H6|D+|mOgOiG=C z2U@O4@okVh)>%psIm;be9P&}|hWGV6A3r5-=-EFX?vBi#+fdip+Z`D?TrC9WrGscdRVi4m;+oQx~vK>)C-rcD4&d78qfWsFjg!ZRybrbXIV+--J z-HBR|0(5&v{lOQGk9J35`-Mo#a>Th3^1?QFz(k&dL_>Fs%+JQ8zujO@9HaJzE6N^b zQ;+0=8AG#?>g$3*UU}Gk!W|Ana#@do{r@2sHk$4jPJgqCT36m@4rUlK9wzQIazDSn zFb7@kJ7cC+4ortSBa1pjS%njE#ytGurOinK1cROKMU-Igb9ATG{he3~=ap@HC z$@`Aj+L4PL4vzSZ`pq2X_q{#yad?aqEYh-I)!>8=BbHd$D1=u>!5w;tou+V3_k#83sY0o@6*CicCo+YJl(RV=i>rxn-&|kEV6sEp* zSVI2W5NkVnMQ5{?kOTUz$cDn+0Vf`F9zJ$pEiU@Sjc45ZARB9?cEpu)sY|qn+VosZ zIcJaH2|37-*~6eQ2UXOE^c#}{)#Y}$zb*$JM;QM-&c>M(=Ft!3!Bxc(mBcA`x7(BJ zoClK#dmL=b!5PNCyRYWrtc@M(Ptd0>$`<}zb5U1DKaT{qR|VtSEv!Sy{Cj7seB_U$ zziPjH$S&Gpu{;l9j5BNf@~~+k>)c54FuKYHpJcfR{b7TQZn=0h*BbQ?aW*LQGVb=sM^k|frX}TJc%=;{T+74P1=cW*$b(KdE7r)%g$3i~ z*=m_^yk|%Kcm|S}*};EY1`e;c#n#Rl*l>s6Z_C0+O-KB*JPX77J5ckJNzXZZ+!>rj zeWg7>oM-A?Tg=GJz|u!H7(gE1p-gMMV?Q6(cECR0Y@})1qjyFYmNE|R^Ec}UT(?2> z)GUYg9rUc5miV+M8=gC+4 zvdxz8N+&;Zi3L*5WaBSbkYkYze?@2PC(hN^%nV)r%)+4OCV19H{PcHAtT@kl6pdy$ z-YXmF)5x1}&&K*#6U<+bgHQTqjHy^pBG43ndgdUNz9m`H(jn$qqN9xX$Vp2y-A%)} zm#oi2{3!2BXPkMLhH&BzM>5h7%l0r0NrS1v6!yepw7gB>B2UFci3y_nrDOPH*8d^i zbo{G1lq!hh5eGOwDIIVAFehe}4!aq|1uE0woW}aaf21QR-wgi5Td#FBL&J6AK6<7o zAkG?@WeKYV8K{dgXZ^Me3@Pjkn-LjUs33nsI|DkMh$B2r$GrWfn3$A~S#c)VMPEVr zFQ(}2M!c`i7#)fXT*xuP!57pwGp;?ycGZ#?;$ATMn~wUpuOOdui81POvfyZKj2F){ z(MQP$pM0`l>qT9PDSZ}$^|8k#i+(}$rDcC^HqygG>g!E)j2Q!Dqj-iPwcJ^l=|jAL zU43w3eGG7WC+#<-E3iX*m0 z_)8F{(b9+RW#Uj3#wbfl!?kTjn6oYomQ{u@cTL0D(FRDUOl1vIJ@m0pgJh2`F23dW zZB4K~GadW38Y6v3I-XLWQ^9ui_{R{tRnu|lfBMKIzj70wW7|^lTa`_)zdao_kw)lq zE**P{46%!PcLVY%4*RDg_7D2@t|iX8*AS07Q&;}G0Rk_kdG&~E=jFXF|XQ8WcCv0DtiLC!=AaW&r5jAvRB1^@5etv048iHTb?{|JGR>f-J zn;~`VTQw2CD;2KBnur^njt93oVJh3NcB2mN9OO8irVW+!G?b2}?~En=7?U(G_<1^< z`smWfFCCA^YNPAablmH!1sQpydyZ>h(}N5I=j*_d;NvB2 z8%P|#Cv`&Pv0m|~&o9U2uJal^<7Gg`=d10W3A07?6ZRr*`ay^F-l<>T)d_J^Q}Fqy zHbTf_{QkEVb`K$5)j}WOq8^blIqsv175_N>gGVx-y8m!ok zHWn%v{EFjuz7nFztL+x6hT7-Ur8DkVy`PHYqbm5Qo`w;9lu>(^K9j~u*tI(iyLM{e zYQHo%j8#Yar8IbH(HABr4Zkf{!O842`b#U*Lq82ZtCSFF#`(^8*=GXh*G)D2Qj&(u zTvd4OOo!P;>W9XpBY`}M3gWc?@;TNnXS$NIM0yhAUzF zY5IgtRL26nROBsG!*&zmps_0WmHwsw){DB~ocjOxzddM-nmmBV% zufpqaS7Ow}4>VlqMK34k#RcQXiayliD6t)G zZ>JtA$C+pF5-bmPM(zG$yxZ;!^UlSXHq{ARoMiMKb)t_gbx|%(2zXM2tX4;K`m+Sp ziybjQQi9-9j`S&{zJ{NlP-6Vq*%7|4-b%) z!hxwg2i}z<{+2zx8Y|(+E1vP=R|qCsvNCB;VK$ z)$imOan2UYE>$5X&IYT-SHW6AS_ z%gT@;?5V>mh1MfGnA()0x3GiW({jXhv&Xz#`Y=7Rg&X_(!)04se^-X;VDetim*TRf z9i)sKFMP5^jZ!(9mfK)dMJc>S+h7>`>)Ik4I1Q^n2kRO3+ER|EU>$(0awy0r)gM^K zwZw*AQx!P+KWhwOd@A>{#*}{LSjXq6&n?55qvUsfD#GPajwmO-kW%IVhl$1bc+3G0 z;$(Pk?}$rjGVJW*fCY^A^^F~1b)G&&@9Z#WybKvUSMRGWLhVC4eCZbhB8T`9Wpe7}BF3HD{!;$@Fw{C3oqf-M<#@LYVK*Hu4mgQfhv z^?%yHYY}~(%x$oxmAbTr)~u5xBcGV(=~*&_)>`4tpc3rXv&B8~Zepi1Uqk<-Yd@@5 zYqS`7JjZD~EyTAi_K4_H2-7QeC{kyg_d5FQZ7sm19(GvGIMl}27CQr3&&$#lOU_V- zb(eXbhC-ZNO#OCrA)*J`;+Lbu4P5yg%wht(Yp{nulRXeAp*$ft(aAaA18R8PA|YQ=8p=O z6yf%GYZxYyPqLBv?(!<~h%7NEg}z#6Epf<8j`<~)*wv#F-m%nK@2$X%dJFu*_3oUO zCH(qUL8s9Ir}lIHjIzYi^_BQ*lLe|mRAPHQ-w&*S z{&#a|HI?GJvlRwXS9i(Q3Z@^*|9ibTw+wh^3A-fX8M7>L`DHm4npz^}0e#$^EOCdp z=!OFFb5+Z6PSpZs-%6N^vw%{cGHhRJ&YBghi|1<&SwI<{@tnFpq#U{078t2p4!7ve zn6aP&PgGbp;Y%q(KAS;_^T2+O8MZDj!=waLM6E1EGV@>;$Y08HFh$*&BKj3EFIZfJ zfqN{OgQOml_dCI<7{_Pw{O?Wttiv3cdBw=pw}SM132M4oV$4+fqEjbcf?})~XO6LN zWW@C?P|>{vpGwT}ai9#zA?9%R;rRFHjPCLx%-O^HdLY9$>frCsli@*sGu*S6Vdz0q z7@Vj6uG|C-r%LEc(-|Hz^4OktMz;?oxTVnRw+`fbI+OV}BjOd>RybZD#ql|om`*;;?RxUBRivyv$T}J) z3m~0sfp<0q*r;j2I(JfZPst1%n(kU;#|fhwQdEtU1*B5_fjlZ zHpPM6h3L|Jyr)}>Ea zlFkU2l!w2)%;+D(>!_N-<12Y5S52^o_{ED`rsTU3x8m<<44_Z_CKHrI<{;=hU;Rp< z!*jUn8X4Tk1OM>72+|m1jJU-0=zqrOZX`qaQs&`exUbb2!O69Raj+3{z{QyP-UypZ ziJS7A-@yJY<2nCsY%%pChPaa;gUxIMB++-xY@8u+$YSg>G=w6sn0g5V_+01jF4Ko8 z*V(mUda(RifI1r!^jTN{N8ZP}Q&M`_(1()x->H$t@QIV6Zh;YA|B%u<&k#9TQWOt0 zz%t7sq>|4)A+CUWe`7qET>$GMBdiT7z`MJKu;99+w9pX!b`h`bZU{l#wxrkqAwvt% zWNJW7N&ytp^{FT3cyram?bA}~wDpLq7vaujV^rKLM6SdL;iHR~^V7$|2ZfM)Ho!jO zY1y|7;NMb+zn|#AE1(b`eD#P)6hU`4eGFLdG1klolX~PKw#*m@Uen+Hurcze2b}TT z2rgy0lt?z6Zhyn%MhImE?|tD`&D!A048?xg(xp4*Lh z@k2iUuAF=<{7nbhmibtv$NDixsXOl732s~SaLYm)Ma(-aVt#oX`}1X24ZN8oMgN#i z9JBez$<@X#|9sY`W!>H&DS{_!VKUc`)r}gkWPfjI)gb1RjmbxK5v-JrXNPn!EIAvx zZ0DIVS@`FvHa?k=w>VoHPljb7t3Zo+*K9m^N1upd@)(&v&TGy>2;=2@#CNtE>f+cx z#DV(iz)$2LWmYG|OL9;j!n(ersn_kM4I|>st3PVu*~uIn=&ggP|Ku>gp@oC*b5Owe zxWbHl#<3dsI*54eH0FWtN%6Ey9arn6*s86DFjw}kF7vYAq*%H^1s2JLsP0h5;7tVx zzpf6W%0euCtA-0Jspnp$29u|p_tRA2y1Wp|=T#un<-Gr086{WgmpMuq#ghx5+D{3J z2%ckJGj1b~FM5DF?pNj_Mp+H3H|L_~Jr!(p&iyYg)p2J1)<@JCT+PE2ea6N8i0iAX z!uNe1R6|vuHG#g5j5mM0Wc>}ko+EDilW|_5JomrXM>%q0)>)~n-Fb3P`?)nIfYA3FxA;|qNoC!49j;P-sk&r!u7p66DDD$~z|J_h{Vmwv>l z883T};`pDTiXI!u? zgPKw5kiE>tuny+yx8`7v3gg^5>bqB|Lb^W(SNbVq-RJE8;`Up5IsaX+nB%~$n-VlG z=3rik8a9*nIVWEQvq$E_k8$@98#!uf%rLHNCG3fZo|#mIciexYQY!z$0dJ+tk*Upn z+lX;3&rwRR=}*d6T&dz2$b?vR6=Dia@C$!up4@~vkv8l#%m*}9JV z%T($gR&f1e-uhQJBLw|jfy=)d;rb0Z%AHx~N`?99TZX7Ll_PMo0rN1Gtovnvk-n9z zgJFPQd7kaG%m8lGS9o*%_tUP#*_qTMU1dC%t%o}1liSJH+5CGI^c!{Yzc+IHSgZ$a z#_{Wf9$rnVK;A1|BvZGs;hHh`#B%yvm>_#3<6yq-URMgko5q;hpLyR7Bgn{`pKEE1 zD3el@elx_@VT`9!4e^0_zz7pV+;1w!;Y-B*49YQ|&!Ll4jzhfvv=wEzpKrk2VL771 z4X``3oSaw#xMr84h5O3wRTUWYlKc8K>MB~v*HKW<&|jZ5#mXVyqDRcUj2J2FUG*!) z04IH1%_@QPh9TDVW1K_W&v<+ZjQIRlPM07{nR=_CCD0h757kS|7qcDu8}NLoqL0|y z%un{yqc?8}F1**J*LW31e4{_lPx1%2PLC!&QP2JC2iwb=`l}~R?9Z#LpGEv*(_kH3 zZLUPT;J!fJ!?2S&%()Xs>C*|%5-QMXyfz-NUz0p_aEaePv#b+>t6BG&_}LltDy~`D z)Edcg@}w4m6>{RmTJYFV`QLgT%XnVnye4E>m8jL@`uI!^rC1G=Wmn?20UD^hU4hC% z4fIkgXRR4sdY6<^%gpvjDuch0F1P^T(;V`R?lIn;!uw%-arbp6?2Rr(#t^RevrF-E z7xx*ra;UA>K>%@)wY@q)g?=$|?nB3&$`E;+>onu#Al*$K z0Qa3^C8a2^)pe z?`zoaisPE}0WQJmG)?H-Eyf=1dslZ-XR%5H#obHsX1)d%`WIn-1AVTC$sv73{S@Ov zd9oV1a^9pRay_$@BR@qAzT+yx)}v8ECUyHwGM zyqu*YRB&mQ9K(95U`smvUsiA(B%Y$h*VG+VXyW=QIZGWCU&GE-{PU{G#)>sAC$c4&7Gb zSNiH`FD*lPqblC5DuWoRLVZCgW=>V5$5a`9(dTyeaoU}n zzY+7)5&feagWJ>)WLJS4do>K~OTNqn)}wDJN2`qY{k#lyCsd$kL_CJiVZk`{Yq1hK zo0R`|pJV8+Y(ktgysr$A@v8JvD8Z;tYS3ptj@_h=4B{TA7pP+-^ZAROs-ueW=D+-{ zZIv?AQ8(v(l|DjRs;E9xjBbA^v+i6m8Xl@ZbSZ}GFlBUVEXJ*JC9EXQayMKF6OI?7 zlL7T{T^MgRsN#}4^e?b1#9GCHF5&;%`RE58BVF#jiH;S@p9T*+fF6#X|;Ju(x436l)yqqR+si6(~2DAv7e>*;$ z{vjs#wIg`lH!)>z8?pKCV&Szm#1$ySE1xzr88?eU%{D0I{SdVc3f7Bm6K=&fL;QaK zEFN9&K%LTOk-nz`Sr6Zdmf{X9OL!x0^15?3Hi!j$oqfArI3%`Xd*T;yO}ztyN52;< z@3dpK{X4PuV>_ap>cz~Ic4Sk1y&AeXNkv4LrKZ{}iD6sO6dXcxSgT4>1M9i&r%*-h5iCK@^5Uu-Aym;4!>fc@p zwZ(0)S#@9JrL^H(*)!28lxwM*jQsW!x@oDxIH$ zXa}xz%@_5e18Vbf#f#_dc-BxRk+x204psBK4mrA$=JYKON{xj5S1hS4Y%Q9kXg z8B!qT{oW3bPr|v|*2R zv3OFZAQ!JdB*_(+TAU{;N_n3qB_jQs0!Nn>i!(D7cokYM<_7V#bD=nSPk})edE)x@ zFCkw~q>J;M*B+13gx2W}dTE{#EyFwDpphXK{L+CX5vk(h8qT+KX<~O+2d4JJUN{vez1S;wkM0_ZhXG% z1mW1)266wCI4WyHaATI}m&blOl_}if+u)&}F7oQw{!_BVfgNn0j6_l5szBQPY%z!9 zI4vMUT)d<}_=prS=Z%8?)JbBsMH@E%6(?rcDj>a(BHmgn;P5lpQ3WpfXRk!L&bN_s$qZ|>lEdY^d6`P+HO0pT6l&b@!HxHgdMiQgfy zVOcxIR2>v{N$vF8-Y*`!Qov>6A<^#828Zl@Vs;G2ZSfv)LWAo?>VEO5SplWOJz~cp z1!mrg77Lbg-S~5#uvxFb_i1~@nxs~YzH>;N`Phn#uLp!rE7z$Je+iTFcK99HB}SBV z!0^gu@ndfXF5TTIo^d^E`MOQq>S%}J=4Ro?dDDJ{nYvAY>u21uT_WbIg1pFWV#Qenrde+m%XTS{vwXWyH&x(C$7XS$ ztrau({UyG>ZzVpwQ`ASc;==DcM6_Qk+rL&^?%;m%`v!5C>)*Mbt3-`*8+DBv#s4Z4NNJ7|(IeYX zGA2^2oY01et5=94-dtB}SBWS+1uVvH6cZa-VK{fKXzIfIn6^PgA8zGyMu|O5E!aMI zwXjR&zISbzaNz5+AM?e~Jgx&fXA5zR>yh6w5&W9#mg8cP^mjWp|2kiU@_sD5<_IJ0 z4$QbULyYD8wfS?Y2#IRLv+?spw@YpC>-;}q^+kbaFBXYDzHONLc#inHrvlZF7l=0> zS`mHvPhqFad41-8V#nxKtXw@^6mNCuwXAN6I40$~`p55L)&Z|xN^8c5`;{F?YaAnv znsp%W#VD~RkmFoT5-&frLuvRp;aA#@hQCLOnUmRG-=>IArFIPcW0LR~%XS$*T72EZ z`+YuE99HN0XcR71cPKD4Y>Ke!&2hA3oOm}}fuPpWV)?RG)ZG{m= z28i*TS4!di#O_-P*qDwG4_3FqrD=$mS;}=UdXTW}t3ckdLE_m81ukg}5c(X?(S<`q zg?cN`Dg(s0Yb}^99VX6&binUnn9vR%*eiHjpm6%yfpKMl!k7DYlZv0H>e>NQ_pZW% z`(9y9sL-0;jwb(L5pa#?h24Q-axmY!`HH?4Y@eRZ5Z&rv{$NleJMUXJcY{R0{ z-olmp%kJJ1u`5vlt?=%`Pmk-vxtQGsA$k9-e)JN3pSSQF5+DNfTA?(otEl_b0-GZotjv^td8ILA82-QRF7MGg2UoO`Wufp39b;CqV;XIvsLR*aEJ`o*kCH(ra zy}ufWwX<63ldmII^=ieq_YUI5t5)Wf&Bf0Ptr#IS7P#r-`*ZyCs{F```uVop|Xkl;m}6ObQwR_ej&NJr3KZi9!Z+IwqoBNRk10x z1!|_sB1*Z19&)cGO@B0_aEH1G|Jsa|FTYC+_BO*W_nkx~qY3Xy9!e@NH{scaACh@? zO_(ZwExE7LgfuHn5z+J$B|nvgwPq78X?~XsUi<@#!oEv%?*8EYJe9QBbRcfcHHrVo z4lEj6DtYyT>pNvb-xV)l_z$w04WVnEj=?q`~CW6o{KfZ`^U%&C#gTgUq>x*!>`vk6hom6A!3 zKXKHtSW@iRh^9_gCE*(y;bBuMdGq228X|5<1}yuAsK{!`@}O_XYb}-7o^8hnml#Q( zsXULh=Sdv6kNU->N-p{|L(4v2a>L~Z;&!A;o^*WUxi~}8dt7_3?I~L&o#J?o_`F#% z^8wpCXp`i@lXmPYTO#pP*oHQQj+4CZ)PbpMCQFY0uLX-bPD)Pq;=a{&k7Qt4E1pfA zAu;1PT4cRZ;x@Gjd5^Y8tm=Q_hIy1Eec%t|1J#E( z4@n~KG(zd}YRTHGU-4|&L`jS94?LT@O|tFrHu$>=67v20yO?gkrF5}PCM7u}~r@lvCjf!OF>(2=LG*}{)e5TKKuw>7Y zk9ekSD!DTCGvcBqNuE~LQ|}%kQK|lb8=nFs0f}$vO>ZZ;rFcP}l8U5x^GC$J7$-S5 z<|7RK21~Sty+@pDFG;=qOZc60mTXb#DN$My92(nSDJ*JANT|i}A5c1x5t^69-&gDp zy>j{us(r?Ve(!jSs9zuVIy&SM^G5f2eTsMtC67U&x!-R?N#8Ma$>NuA*mNdT&*(Lx zPDh8X{!xu6{_dsz_gN48XsB-5Me3NghkhLYl(k^Lg)092J-3w5*Y6&ndO=y}^N5G6 zpZ6s6Q1wH^MXE`1Pt-xl>3isM$qhtBUkr`!bQVzo_d>gDSHNmdn-Jp^STesw=q^;? znqHGwox%6n-^94tT$kjn!f;nByzhMx8eCro6t#)|-mUbP`zCHaYJm;^KdH3^HM<&x z!|N6(9=C|7>K1y_{}6!4uhTkt{L<9Td5dmK}5B+AT9Q-Xwv3-Q1e=R+so&%{463W zTCjZNJMqu^X4bp>DvW(wFypU!aU`e(OP;?Kbsw9tWYT95@7cmSM-lv->!0xl(bS_E9~$0^fWyr=m-$v~^5Xuc`by5}-52oGn@~k@0lRQ0{xyPsO6&TCgwjfp8kpf>-_PL=*4FV)`o) z{-YT|9?!+(qs>sNdL;f=*No9K>O|k+&G6KPQ9=stkZgF28TO(XD zxZgdyEiUzGMd#Z$MA@iTY_-2C8h5r}&@Z=z>&+I(kJO4mZtTCZ>q0rA1$Arw7WE2_ zC+jO>--;F}ZM!MP#I#_v%T?k6YNEf!^TCX!=^LgIqp(?S2{nNg-QtWxmanV>I zv<~oo_gxScmK-;O&xs%YEpU2%TD*vEf$quELQRkTG5n(N;P?+YcScOhZpQZ#x%fD! z84r$K78eF^ocWv=VkGBF$yqU)_xq|(wQv~IgqD7lVhYF8zFs9F$eHuwe37_)y%m>s z=8L=?tw{PKex%~Nqwa;0YIPAnFM2e{w67Ksvdw(p4ov3eiR;RU&3Ki8G| zgdDNWs|5jNxnfRMGwf<}M5iI_S6w4y;fTfDv93fa+2@$D+lxAJuHp6kE`yHqhWxE1dfWeAB8$De<)@VeLn zmHTmG5YL5KpHqYm=SRaInWD$G7Q_{&iIzs56JN%Qgc3eiaGKCydwf`xB$}7w}d2avfS)hZnB5CU3}h8 z2q7d}mk>giE?q*FOOmxDBuNM%2_earBuY|A+Em(`W~OPHnWmBOd+zu5*Swm}ob%bv zInR4}p3jrBu;cX*yypx~mhkh=^CX(DekBKYf0!$DkkbdE2sEaLZAs1I!1IgU0xiXNG~ZdM#d{YrjcwK#}{jbEwviDL-$ z|4R37`@xLc74Y;3_V9Z~f4ncG*K`!Q^(dsDbma5*A=EhPIJd(eZ6D~!uA3ivdFi;0 z_+cy_!0T<7FSPd>DKGX2qHb#`bpA2C-_}S`8HbRa*hB_R-uU|8I*Z+l_;$RWjJz<% zh~wqH|HA(1R|-Ao4fO}UkGJna+9G}q$9Q2QedU_(yRq|wj`Q%naqm|hinH_u))}mW&?m zKmp%hlHKl@`>Bac=lq3{SDUCLYAp=;Z%@YIO+0U|*FE6F&)JfN?ikX(iL55Bhds9^ z;Kw@5>i(6?f7t}YbDX|&1ETd97nyBAys?f#Q{6G4sFA{kxS`9NMsoV%fyG-JDPZz? zct6sTwWb))sWbDvVFdy>T6C)osoa>I307rj?)d~ z{Bte#K58JZpR1r*pym9TmGJx4KnvS1frnH>X^o2ze4FF{AM;SG-$a^scJNm+{u(d? zr)ThZ4VZ~kzJHyEPs60Myj~k-;!ax~Ioi%exK|^29i9o-Yg$T4u!EPgmNbpCVDpUQ z+uk$KSE=Fr-`OzT&GXSnShSb>zt9R#EEzX3-ab{LBcttR82?yD2|?CKIjtklk_o8H z;q!)#h5M;SDx5e9j_9IZWIt>gQr7eO@tcf5NB-UA zKk$5vmeQt3^CAho%Oy&?6i&)KaFHh;IiP$nV2Q0{c&EsN(f>qzu!L?wbvQR;Wqy zYyy5(smZzZc!Vrek-44)76yxPz0=xz=iY9No_O<@qF zp**XBc$lnaU+NH~uHn!9{h@EBCR_iZh$&K$+f6f=-c(V*cT+q(%=o0p6j3{QK1zCH zczq+KZ0re*Un9B7jj{U%uUlV3e67|}68a*T@to_+?s#9NB}-o;lswULZe<5VpWyMy z>xlw=E%TYiD14(~9@!9yn;U4*{GKpBrzV>}`a;>ZfxS$|INU)^?&p5NSdE%uoVvid zt(qJc^uls&JwHEs;QLe+IX*K+!{>U^JJcIFX7!x=+#NX1>tT3nbmi+Ct!{yfemu_R z)ndiv4A+A#twfxVv6t9#c|Dml`qJT*Wnq3{d8+BL_Zu#Zqs=GqL=^-3+*;(jKE zPhuQ8q)?o?#klZlwm7@4j@<8*iTwu@6!2HBXq+RbBSX`L|9d$(mnMnW2pL(KKM@W; zxc&c@3B~GKidaz~3_i*!%raa2(Njhi#c#!!U*%-4s}xmN<@`P_6@6yQNa>X?P7aik zMZ1sUOmsDSkmE$}Fz#3AePKD1$IuM&1ua(sC)qU4A5Lj&i##u8HDB3X1L< zDxPjpkaBgPDB$*+zBwwq2Qt2W?=4=L$|!U1e(}q+8Z!O1SNJ6<$SUTt@H$*eCCB}R z%^wQh!}^xE`CZ2G$7M0@jGS|rg2cC>9H`>DP+sEq zy^MQ5-V!ImrIc{tk}wjCS2d@E^YwCSVecavKUGoY;Jae=swxT?d0DuGSCVr5MbUdW z<6oBm;Xa{)bfa#IilTBVITj`ouauJM+8{ABTS6rRUBn+hCCta#i*=(J*WMf}G~3Il zh3)U+2jkbUWPQ;}ubKkjC?-iL=}JUJY|fSwX2X?xb+n-u~lS|EfM!3Atb0 zA(~niky5M|k%4)X&~mFdH9Ln)54s2&V{S*U6XN*eFQm-eFODuQrno2GV!sKWf7yQV zpx`657_&)qHhf23J2aC9G$(QYS_xHLE|vVW5I090#LG8H6tKuqC_@rBFKM<&!dFT-`5kjs@_S=SBf4@tW7Pd8v{!U=XI&F=Vs+GY zofdO$bKGgC!l5NPx^DIZ`h9eq58jAFvvs7DHNcYNz(mH~E)9+3nf3$S-*cRn{S8C- zeLw!wSM2)MNJcIiX#Zqh%ts3+ex63GR-r_v{U44WCezZX72k1Yk@kN)Ks)A{O!;?L zAMkU%x&cLN`8leufs5t;A3uqY`;Vu%K153^b~R#dPc8Yp)u2V0j>fwx(Uy5m-DL%0 zhkT{thgFdLsiW8vio3-#yZY2M=HF&_hVt|nZFJ^IE zxu6!!c8#>jS%&sI8!2In1d5PGI&`)IB0@_Ezo>AF-KKwqv zSb%FzI^KJ+4Bhh^Nm)_?<&s9S`S}IggS2#?@q5a7E%mJ_gNq%{&)r-&eQu_0 za9la#Graz8V4#ieC#*uHtzd z`U$Z=byR#Z9oD5f(y-2aX0DD-={~{cD9^h^CQeV(kyBL$G@Ut4nfwl8D>$ALxp-R3 z@l(I|h+`f$BsLp~NsYWGOBULnZ=_u>-a|9Jk=#~)g5iWlGJKZ>8;(DtV$-p>S0nWf zPQ?(8iye(};UVF;uk<5YasRYqGSFd#mUh|Y;G4acBu$x!;P?G%#|#A8azA#yhm{$> zhg-ix?}i2%emWOh;`qIvk_L;8Lxbb zupT!A0m+vqd4kwQMkAa-UW@00WZT8^vrhu=eQ`$n2%au*J# zwX}3&Gz{Nxyfpg(0(l&sSjOSQ_XY}2j={)`2Hq2taeM^FN5f-b$)A27?;&t&1C4CD zgBVv0nQVNBlldA7Uhx2zN;rOeaTiZ`oy8rE#A7`jB{@W3p{9|HE3To>KweiTwN=PBA|}ARGgu85i}q zian3D6k8O94ZF4EIq?P@`Ty%~U&9#YyYD}~h(|;Dxpngf>|Zo+o^LpG%?)H|dleOR z4P^Ht3^B}0YZgc1(GDKRWjC;T5y!>PFJtc51{x4~5hwZY)%PRdxVnK{B;lxt({SzV ztMJokxIR)89yn_##55B6S2g_Hzkx80mm}6*hwWMoneVuQD1I(vuDgim{*9!)d=6?O zo|krkQ1X4X_urHFF^HeTTm7+upBrsM&%%d!{nT~=7?h-?P1{2eFi}f~Tmms19M@-_ zgtQw!&we=%KaL-lK0JdXt_?J|?`aHr%j;{wDae8u-)sqm&-ez`)z4!a^X)cAf?+Px z(EXu-SkbH@N3)Z-Gq-{FRttblnTB~;fBY!m@27;|S*eD4h6Z8rEe%tNjnO=bTwJ+KaS%5YC3hm7gkV{N9A$+9>DJ!!X1&^nZB8o6oZyY{SQUFpy>P`(#kIM1W8WneZTa^oZgadJHt-1iuc~MR^C5HA zsyNS?d4^7WA9UV^D1P1!8ny*{6Zv@?xd~(KScloO1K+kZkk!epXu)_d!C)&23)N(O zVmq9Tx&IY^t-%PZLN}PC@n(NVHI`tbjP2LJkFC{VfD72>xj8P`lg<&Ojg145aX3^OEHP+ zNjJ;^cKi5xwSU9SznuXW& zm~T-}hFdmZ=tCuChA&6^L+R3+_N3W?opFgIf zr-hna3MQkqobmbJgeQ!v!)MLLf(Y(s&~)@aSx*&jtg(UnF{ybH&VA(XSN;Kq{YtLS zI35Y*+>c*pVcza~vL8GbiUK87+_eGX>PRMcgMl}p`4;@ z#v;#%@#Kz?uzbpTqtP%l{g9GZ+8|V`Ysfv-6vKNf$?JG8w7ObHy-yiq&rKeuhJKjT zvyKu75XIp_bYMZv~evTx{uJzo^G(9V!~Xa(=l(E&A0a`Fpq zkF;1h1sk-*>CbWs?c55hcgoo>^i51YFC%xAM%>G;rHX?_c(t^a*KY^*GcbO(Z-HJV zaxz_SjOu0?*&gbI;j3h%%QryZOHvxNSq}+&`FwwN$If?*tA}=hB3(-6=^bFxvW6z5 zwPf9{hHU$G#g0x=a%tTW>&hkMdei`hHr3R1Z!3gMkdjHyUij9phHU;dM$$_O`L*wb zvf&bX=JX4))>TsrcLSL0WgL9CEoz3yDegk8h<(9$bN5RjwXY%1{S~4~S52;;(nU{A z71-BZWY;XC=(~vRdO8qNf=D5APdh7kv2?137vFe?$IhT^3{k=cPlA+M431~yMj_S zm5HFAWvtuhh};F$u4fhF-S47tYb9ka*NSJ;E6Dk&T8t=ToNO-> ze$&gy`dyhAXZ}MIWIrcKSpJendF-#aeK?20j30^93oFT_?!K7D{fM>;6Hz_CkkQ?{;$3+$ zS*P3(e-8S>>+GWVty?)|_J|X2O-d=)@1Dr&R758ESA^V;asPsgB3D{WnFk+^3y?UC3w=`%_C28i)j@;E=vTYPHzL;;(8#01-HO1a=IHkoFz&c9y_e4S56 z%7cXGgimDs>q#+e;YV@}IwD#fE#RENE5hkQF4r!&Af~VQK+0Es;#6rancuuFh91l! zQ>!2`a%(;XSKbjZWAn(qAX4;p&!)`dm&B~YeEzxxiFZ~>)MDr*(a5~+f4cu9#tk`VzoWmdfqp#s2H7%>w+1vJbaDf=z21!L zjvROYrDI;Af#QACn89(UhW!CePc;>e4Sr0eHa~292R`qD0E3=jVi?g$j$T7B80~xVz z;2y`Lol8feeY3LJUHJTCJIN1kiQ$5Dcw%-;^$t7KoUh61B%anp+V z(t#4JtC^2b;{6*n?V2pd+U05rVc&g? z9mi??*ayLJW~WPXI0-cstgpc?j(^?w|GP_>XXWdey=0zTRfCjQDvC&~MAQJr5k@5# zz;R&V)DrYw%(&)ADT;4#JlI%>kjMt|{+NeuQyKqw74!R)zhC?rZt)t%gB3_B;PD<) z0+*W{fA1+`UncXw=RYHz`QYM=FVL~y$98NnUhm=Kobus1Swn}u=VBAb!AD%nkRHkL z2>Td(UaM*Q;{sGwaC=+jBhFV%h2P5I%yF^P=^_N}=l%v4;J4vwima@_kJTJc=awM# zH#I#=FNTGiin6M|;6BHr()c1YGcO+M%>Mu9Dr#k#hv4%njt|Qaa#TfmF@-qgqN2q3 z0xSt&-XS3iDJBi1ACQ6J0~@G{d6SXzc%JQZ;2~!m_uwP!4LPp;_#O$F8aj6D6T;mY z=iSW2K*n`S%D|!J8fx|E9k!-%JZzSY334?V=zYY?%W5(^{tivd-)pvIpxtryQ#HMZ zb_d7ze}6(JUUy!OSvWOVO;NMc5%Wz&!)@PTtpOjmBnK5sRWx8$7M$AfxLnPIGEqe% z+3yg`@ogOQB(1`^pDo_uD95oQzhs|jPKo^!;SlGW|@M}lWMv?HxU~+uJ`1;g$Jwy z=_=o1j5~inJ{j@*7?<@)!X5U{ZFrafy-w_-^LvX5?tjAAH+aHvsNT<)h(DmBBLT@M z_*+GHieDk{XFWw(r{Z8+j!&n(#qgSX^0s*cGh-FaT9<@FH`KJH`8f(r)fE2wb4>c7 zqNsnK!S#uXD#pIVCXVChy2qn?dOamHB*2H`c1u+}=HKABcFi+9*{$K4txxdJJD%5J zafs#nllRDhl<|7O>w6f%IB(LoI2@nN`rVFL%>Kamqh~DSypF?s?;~Z6hSnL~!PPo7 z8D4*kZu8XSeKH1nZPjF+a~BOq8Ry8J;Maj_QpjSl{gaBW|MmdOA2Z(Qat}2>RiskJ zLHb%nsER?rCKWX|-o`Zk^j1GbW;qrT^Dr5YT zd>2P*>nWz+Q*@Qp)8gBYVBpLBi-|#-#T*|GxQFvo>&gAwLyYNNPv#>ZKsS(es+c<% zJcs!S=Ua$;pr+O3HxN{;rmjxmc+L0gLS-19JZ1cD90`Bcaa0M{5W(v?s9QMf_&F36 z8wJ%@6)_`xq=5g@Aj?3;WUHC=~@`N z6tZ9N%SD8;UX+q@9p=*+5A?i>Q(+QxwC0pC=Bvdyq{?>W(2Be=s$sQV?6GadJ;R6S)V-T53_$+ zr@O&?)?cg}jXRHse*D?-9F|Ps_s#0F7}#G$W-e#2>2W>D+n$E|x_Sx@3BZP{_2l{G z9QyJ&dEE`d&DA{5KTpHTqn`Kq4n^}hCG}1YhUr@+g^oOh373`RIp89a0+rPE#(8|_ zak$bDg07BAN}6~QCR4fpZ_hzbpK-_iv)B|}M{XN~5c<82x|(0WgBNwQFen6x(-?1^ zJc$(}>bZX6ag6y_Nv_PVJa4U}oGt-qe9Jna^f(S$)e)?YW5j#LM_*20<|ze*+xWxL zpYK`QP!vojfJ& zdA=LT?)4O~%@<}o&oM)fVGECg*5fdy7%}c_vmai6)KeZE#g<$pbu~K($zC3Z8gHEa zSw}7Y*o6T#O0Gfei?&sKzVXM9byG=4?2h2tbY5St43Mvfu!qYef85-@y_HK0)RdEE9w$-uzcNi~<6%;@25cCGr(UyG& z@xnnt=93Sgv;|*ZdJKaGD7e<_LDVCL0iV#tyW`UHtVUAJkiOOb;)agqv>DPVJ~bzpE2C8!)p<} zm~n1*Cv=^xAR|Z4zxc1eSKN{Rlku)>6}-;XlKaYS=$arWNz1X-x0cMq>@j6QE$8tp!H?r|-ZPzfnFz+6+m>OZL`I%T zi}3J{j0UZ+hr~ioINz(i;1IN=g6RY&1_{ysWmv>W?)f@t%pepNv=2r=k5j2?b7@ zj`_3MH{HP=4Ze(DtLLEa3OQMw9S8XX#`F23Fo*jYt{IHSgJtB=Z#|R4%i$}n;zl1VX1K=@RN`=2p z#L&exRff?0g(a#(fkX4^?u$WOzK2t`cY+DuS&Wyye6bV%vnF9UvY6>@+h^+}#Wa%88fiqRW-B*YX)w^xzRU~^>oRq{UI?8jMOLA@XLNBp%4-ltZz>_nw#l3;F+Tk^ILOD(uk-3qy-2G~ED+<)0~LO$TV1M~L=l zgDH2J|4^2SD$mc9x4A$hPA}j(>M3F~`}mDql7*2c^AXXd!u?zUSuqcE%RiqIn$m@p zeI9v^%Mb&{uyA67su zjDCvk?ej@#rxkg9^SE|ogBYyNA?u)*mGfG{g&7L3z1*? zhJtU#iRLY@sKtd?k^7eOF=8GG*DcB9-uI>GU-Fu3lf4k30k0@-*mGeXpG-#56k*?v z{TsKE#m1DkvRCa>+$%s=t<7e$KYelN(R|1IG`uPL+XfslH0y!hY;w(eF@l1l^bJgBGa<{wCT z$9}I)%}8S3nMc1SOfh7?*y#pz?Wm#{_Iu>%|K|t$iCN?Lc)Mm4Fdq03_Z9V==VL#q z0h8V-DXwEP7P3Dqy80`EFDU6wheoXX!13c`4aR@q_|WVpk}WxIey+q)j-L{iG{gEf z^VDulxcH=w{TVt$-mBxftXd?dGOx}&j<=5E#0_dJ8(v3d9%{^A!13@36&&;!C)6u3 zKA8E6HFfZRuOfpg8Djoa(W%i=47XCzo~TMFu5-NmS1s(m){}#Q1i^FbX-sh~vX?Nv zIV8iNuzE6xsKLZWZm)SIs=p|Cyi^F`_}`3qkPThAziSmxeP*1orW%J`m82VA3y+;j zk}Q{Dx+lkl|M56;mE^|xCNUPQClv7Uc^nTeuE3$BI*!L=NV{LhwLK+}S8{xIzY>`P z>*!S1I&>PtIs%{1vvVD#Uz5SQZ5=r*ksv>p{a{vQh<(QGOV35ui}hslXEDyI8IQ>d zp}oy<{hk6CGj1_?QjXNGN^;3BgS`VE&pgSg_4Ra$d73=4dOCKe5G%(rZmTbV*=)uI zJM!V4s3gOLVi<*RTpyB$-Q##(Dob&FCF?GRUr?c^q)zkmk;3u)LQOFu`7`A~0kj+H zc>mlA#Gm4M(QsXbOLa75OA)@Y-eLNq1pPP;4I1zTgDxm|&&)!UG%853ssOen?9ZE$ zgTkqd!%CPZVf<;+BNHjx>nYM93oUtGCMBdHGf7DfM(;3mP(AfMoQook$0IC1A(L^M z{j78}`zh%MGO%!jlAhobBx{u9c=H2Bb>p~w*?XK_!2Pm$2hH6&3NKH`32tBCuw1Oj zV!U!F8xg#&3_E>5@IsE`&*$Kek##h3%?DH#C@AS@4i41RkwTM-^H(@7ZIgj5z3Rx; zI}N!-taoh9M$IGzS@-z>tG$d{&b){5HU$N5NX5h;#v@BoFqHeDy7(H^GwZ2&cOp)> zFy37B5?P|2eC(eia}?v~Y00Q+P?F~ROKd1s(wN#8FwbIK`!EG>qIe#NlQ`A<1xlQ%4>d@#tu-r12Y{VHNjl%%5-2eKyDKcVFV9e;rwEO-1~C zURNJqqg$1N5{+MB4}U6TFVLx+b)65-(U05T_e2W1?PlGuUjhuR6{Owp91ZIg6vgc~ z31i>nwwEv|=J5u7gBIr=;5py- z7bi#K>`^6EExwC~DZDNZJcaID9p%*CMvt62lEgg0;^lmwOpZff4C9^!v5@dQW#5Ux zr5knRIqM$tuyypL>Jd7r6kLZR22oK8I+k)D8?qE+79EW$QAhI0PjRPB9q)-3i^oS5 zG}7We)+}Qj)Git^d_Orohyxdop}_1%$ZN^EUDiYB7#B7F$8WGM7vJL<#wlv4mD6MF zimD|agIJ`w)v`|i04Wi*6#nK3LjSC##Fvk7xHIclWe>2umT_6o9RwKH(x%X8EM!)% zxL*_sc-XJi;OzcG#)ehH%^>nKYVjuUh1C~agoq8S(N`s)g8 zYFNi?a~peQtQTIo2|B?zcw+?4JyGyJgV$j&T0yg-!{BpHL3WeFP&86Oo?EVBQ(-L) z*l`J=Jddhfx9}~qmOMK}!jy61G0t0w$mM=@2#4_o?r(qgkFY;9+%*h!|JHK-QueX1 zpVfIoIQyRD^k&N?_Jh=toc$?V<5>TCb{(CPl8V44Gn`S>w&|w zqG0t{PKK6|7{mB$*XtWdStqCT#BeOW%Xo?NSnlV^X#0XosN?<`2b@O$>!f+iM_ftc z`^NDs9{kDUR2&G;bOqU`o<`PT?w@5SbjukxZV1Fx3k7w*auEl6D+ou=!`fCsTdswm z)8JaVo^u{O&(xBN{USdYPny=B#q=Y!^o;XVp0}>0D~m%=IR8K0@FHL)r|rLmqT6OU zO#g^LQn+JBLk-kH)+UM4q*rv@cI1BuYlZb^e$o zK<_hE;nR!WcW!8H)fr4`blhI{A9c21WLnXr0o%mOHML6btnj>17+lx zc^Z||r4$_D4?R29Kd*;Crjv55q+kS}lX5NZAhcqf866PF?@cMa8FZTKfJo_1N&vFo zvv2v?adhW?g}(5`9|pBF#>odEcjUYu@KGc_kdyVq!-)Nx+uiRVdNRI#GTRqDS#Rz- z_Yi*kc{zuQZlqVj{K)mN+0M8$Hp2`X8EG4 zTMfC@_#*$HoGhR3L#t7YU$5M};R@r& zfTZ29^p%o#nh$UFA>};z19->!ud}r`9PAi(TkVBqg@pHd+YRSmrPSl?R5AEcAb=v%ZUTHxK~1Y@Af0lPeK>ld!eec zgpy|NhJicl&>fFq@pcLI+;rgHF zV!z8|#>si}ap|&zoO-WEsaXv*Ut5KwWC`hKJHf7}gkm-f z=yjj*_rFU~l3hWDy%r(1koERRuItf)+qHHhva&0w#mcpq*o$@W8>^A>w1OfcoiLZL zXFF#b90yfWLfl3u)>o4Gr*&{%z&>;4u{sx*ll;pv?3`RdF=v**N?Jx9Mf36CX*pSb zaYX54#_Qu3qvt2auVWUXOj%0dZ|4Kc*w^1Y4}+F7zi?^}Vn#4;5IhY{b(LhRoD8Sv zN`Alpfe*K<$gzzrTsE_RzF``qTPn%wS8EgwtK>b{g?;ZI?J;R1 z# zi|fiL;;tP!>9f9{H5=NGC1hne9oyZ?C`C695q!M)X*;xc<8e7@!Mq$Fe|tDqGcVv2 zZ;p$z%6K0^bA)s&V_*6pgbXPqWyD}?JI6kQ!2=P{u7sY&nPL{>f9v++(SBGNS?n7N zr-!AqkolmsPfN%=dI+*#e<6vj8PeXe4_{`AfE50n<0#m(?w=B5j_h%auVa3L(@EwF zE?6R>@e9YTBaxg|LMF05FxQ}jVxlIZGvjyX50>cBSWGcDE#Z+{#5I&hq4U{didZ@V zj}{h@yVX$S<`j~VV4h~x7fM?)0hS$$$z{4F_E!{A-cSp)u`J}elOyotIp-w=TVr!$ z5!dUVi2L6PY0|iHaJl-KENn(1tB!Gbr77PZh2-oy5OcpX?hi0UE9qx)d120VPzosY zrzxIwV7#6;7+V$;P=w43p(S~ga&7=h?&g!<)S>Y4%%>y^Gh8Uoq0o9$jN*Q1F89Lj zsb45OqYuv7F>f)lCzOkd$?~7Bn9l9AwlT)<`wB>Jry(qi*hf*)9?BU-B)Q!KgI9j$ zdSaasaHf!&kM&~TD*G*byW{h}`DDrdq42sq(p@#go_C+A>wzAqxW(;$$)Eq`kz@NV zu$Wvxerx-{-LZf?I`qPpi+QB+=mFhI<`o=zAna!@8QtiGfi-z#;%bWPk8`+wL{Ah? z%OSlMrZ_WzeG?XX*q@!t`GT#HQt*lEGc<`uGd@zuG_7dfpTo7;TVeEC_El_ch2e4h z{lo7f;s)dX#|>iZpGW|Q3=W28U)$j_0EID0mWYz}n5iX|U7kH-+kcQU9&s}2}6 zp7TQ%8Dnu@Zm+@!w<Oxhx1=j;5G4;Y$mMP;R3BvC%K zH0s)-9c%}rFpt(6z3bnTeT$B;{ws~r)E%(w4f7Db2GFtp#FgvaNDrn^$?o>}VDgqs zL(9bx&P&N#lP@g3zofXqd1Asf_K9Sail}aHI1jc`^ncI(lWAq5l=&6qu{zO1@{()d zmW!oVxc=(vQgO)gHQ7(C7vT%}xWqbf>QMqY#>jUj*sH=J!*}Yx>sa#rzLuC zO(dI2<_|MolSx(^47-#>3vJtA#jzKZkkE>CusY6v_<<3T3Yr_;0D~X}?UB?Y&RN0x zTKq(4yn>wed_!h{g3`w|B661EfBeQxjyFU5e@7>d&nkSr!mN(t%^WQ{<^o-7PRAMB@-QJ%hSmZ6IV;!oH-a}4hQ>FO8I!Nrn zY7AzbCV>4b;jGgX7%Dhll6{k&QpEDO&zez=t!9iPR~F-rBl|m@lU`WC@9g>@&R&)6HvKFG#A$QUPepInZcW7&7PxC~c3ivq3I4uK4rL7ax;-`Z?M8Otet$VaT*&hbAVx7m&3<5?N7RdBzyrsK?N89jUV4&TPhxPHq= zEVGbtt?VrHWL?YM_dT4rzr*uWG2lDnqQ*~XQ6!~JZ#duRF5~p|Z((w@mW;BJ(dR#1 zaZnOMN7nK_anIm1qL%FbtB2{pIBE79Xc#xHnD7$yetbU-NiSdc}mDgd&`RBNPh1dCJt_w0^~h22cp|BxL1nK{ z@|FF$zdgZv))C_s57CM9LCx>SUDT~j3&87 zV}=9kg14Wb&o1s?r$=~NASKtp7;I+z7Pm4Q!C$3hIpZ<=P#FKjbN!D`tb?lVNx=+}@-eKhCw)$l%AcaeRdhSDcL$7Y8bD%lu=8peGiKlAlm8NbxsMfX4n zbsc*fizmrRKK(Wh@8{>uk4UV$FQfQAk$Biz&h>t;Vd()G$>&_gQoirJ>o3BaalGsA z*Kk6@je=#Nl=kkug)7|uq;WSP<^0;{88;BxmT{}*8m8}& zQrNDm7{&OrxARr#U8|wc15rrHtD&X)A`!uO%%bc%VwH@m``p2otu?eRJQ9o3CFI@b z7VIxb$gb!n25ey*iU=IdsG-EBOW3l6``aoULzdQ%dH>58kS3uiC&QpzA>sHS467Tf zDb(~5cKpKluaf;W9_)*Leia5cs%iV`o4EV7n#z`4g=%6o=XZu-7VD7GR~J#m?Jvs= z#T4**OgV?K3#FvJcNQlMS?``1gc)h%wlq*lz-bq?ceSy#Or2&2o@wAc3n zuDoWwc>6g#{!&E~dYna0zbc9g4uV|_>(5g{vB8z`Z%7D|O{!Rb3x)@u->vBcDzo^w z*#YQyt%?d3oksrRDt_Ld!X;e^t))YIdV2p`7$&`!S({ z^V>J?!|_PQxBu+Itd9J5Z!aYMUQVj0{ZRkspKs#@le1;KkB<)=i_2(Cqc@5N@$t9! zT^kJya6kIETOt;5(S6=Z3)6IqWdc%R#CIOxkd{QC{;KPqG0 zX+1Js8DEcFi?$7Xo>5z{{+Dukw%QZH*5#BI;*R6X%D7(YMzmhad_j>1rslJ6{^3R# z@$U);{DTjkrDW9G9Zo+>D03_y_p_9oUwfkBWhoh|{=wDY5|Us12kC_+)b-|O6uXpC zT2J;9k2k*SUl|XWB!x zk;ieHGxTqlvOnGl2i5EoxZnii8;tAMEx|8tU--Q_4=Uy*QjV>Hyln~T*E*qdrxNOY z*bzf#eBr$W7h%Q3Vlt_ok2?-L?(f%PUQ`J=esqDSM+y62Rv|36n8K=^5bsn>g|rws zWvtVCxS-7U3k45ejqaZrpZ8o0v$5Ro#hWmG+ZS?LvJt~J^Y4o`py}clGEZ0!ZE-O* z4_$-ze4dh9t8nCC5xH7AVN5*dJ1lm@gI3G~n5~C>Y7sT}T91jW=ew?7jm{^FD6^A2 z+y@p?g~NpcwWQNe&m0QP6B`xKco_ zp1_Kqrz0&fz*ngWOxF$oC?SqEcH5|SiIk|arzB!ndG z`@S!?+rFw~3rX@j-``)??cV#|_j%suy`FPE=bR5v)GuF@LnrbdIa0WAEP6W?%DgUm z_)oP!`q@rJ$dCErGj1}r)#i#Fbw(bY3S^}z;IN*5zcUTP7w3tJ%5H9n8rsaukrXE&r&K1L%KytTS2`QV3nHJgNC%?lglixdHFn)NNBbHBx z!bK-XRMdu|%Y`f%l05`X2XiFg&?wYh&R}o%!RQs9Ev+RZp)}8urq!chHYh_9TZUjc z`3?(=$7Abk)-lInUaw5{WEh20!Rgd3j6_2qeJmfx;mC$eF|-?t>u=NP1092dT4^%s z-6%A_p}u12a7-DWCf4t@aa%J*T5k`*zVDOii_nI}$V9RD{4<7(OqSU8QP3NoEKN^G zVA|Yx3Ftc%^~CKSZ?s{yEt-Dyp-|ZqDXR8EA!WH@={pc*Z^-Yg9stj-IWn=cCJfhQ z%gP!3arpZziL}+gI`<42GN2E}^v#sS3q9d|Kb!e2TDaYXJdD`@?4O;U0AbqF=s=Q3a8Xg6FK$?;9=1*;0`K_YwO zLrV(#5BG#(e=_wq>X`n0k{CYk39Zd(V%K#5+|E=4WYkMdG#pM4LkmsR>!ivIn?YF9Jz0Em z24nl41hF_W2ot_bki@0kVZAqAI{niXBlg5eY}5~UJ330*H+_fgf5eIM_ior-6fGt# z-7sTgj5r+bj@$o5O3(%R^Lmok>DCKJuEvS!1$7)*7%eJYf5ejqk)n69JM4$Yix>4= zBYut(uk-Zz=`!D>qc`TxiIIN0dZRouQrfTdhW)xY(T)EJ#wyYBI!Ob0brCYku@AIz zOT~@cVk5*jpHth6w9!I&|MfMgh?+*DB$Mw*olRWaw1eey%*wX{TT;{3jz&VaoO{QJP3S`Z-^(R$U7K(t`|e*k?KCKmyk=Xc+2O?vn>d9 ztrz=mKBDvNdg|I+pmK|P$LDR(pIa~aWnU1T&;8ZtudJ7IzgpRblcjac+x-AP;_@L+ zUSU~AgM?D|q5n&xI65}Kk2=yWqwDc$T%(wi$5=)j>wcw%`dQ+<(XX+4YXj>NjquSV zUh-*xbZwC3ih5*^ZeYG^E&soJA!`4a53f8gSHIO+giFK0i)QGHd>NJ~c@$pH6 z_&zO1TS$Xw>X)I#qJg<}MF{gCUSb}p(vXkTx2*kv<4jdzCa<4Q=VGW6$A%58MCpCv znQ;1#h~o_RmEak1h50!J!Z|)&e%@~-uh-FHT*aR40xLOw zvt6aQe3|vXPz7|J)Jv#wAuN{E%bo`nm`z*}olL*aVAl8g7jwPUNw|IyDqpfb6p7T48qO%jkNdb^&aK99)JfmXl}MaWCxarXiy1}zshtvSPa@&AgW7^Pl+29=*!=UkkE`AuBc-)AA<8SzJ9I{wnH6QxTEe3x*Z zw$hJutWG|7W}=yR!M->h_Q}K%`_u4Ud#%K-Du5~VsRq09ai~w7teKaC-P?&fOnDyB zwW3v>iQ4d5+0rKi!#CH8`O;MMD|{h7gObrTo%iXCcw8L!Lfls;F(;MldsI9&ZhIk3 z+oGZQgm~~vB>&%jL7WtUFB3UWCeM-l-3#d@iLe<+yg5A%rw6?dzqlyGudkO6*%6rO zQ!l0dQAoC|r#>qjTCC@4zevKgfxM5IFVp^j>v~f(?0q>ObHm|695v%g0&ef*xSivX zMc;AgtVsOypjM2dpTpre*S~5K?k!+_a8n$#nm9hM81(1(>t9FVV2?Uc{U;oT8MRV7 zCmFk_SFTpZqvI5D($^S_aU#At9f{mIoR4P_IQ)_I%Mao7=hw=DF3+)YIQ_y-iHKqS zQ1?PSw8pcpx+n&ftu3=>t@}sufqGAT$rHV_(l_aHRg)G%N%Q ziGO=JJw}H=>%!NA(P;tw)!oDJ^E~3x`JwnBsfK;3L$S99@#Ve{TxFfte{?XKqxksy z6SNaoXT}EN#JE~<`T7t+KN6R2xsTv$oF}#WSfx*#`ROjq6N#rA1JRdw^6=5e=(~h? za@{>>&!*4%b1?O7)uPSMeLYq!1|tKZD65vmZqKktQ7xIro9G3*a zfc5ReT6dtnxK4t!1L5gGzNF+1zW!V%?LIz8>ZldZzr2yF%HItef3$vECw^hKaMO+F zJMJdBOsJJT*S+!L68VFluVeYFTILR3LniUF<-=>d-#A}&0XT7zJi)QsXj;g6ca}en znbeA=@)myJ=ZC!U#k3QwC%fFl17(dQzr2B`sl?yQy-~HfM%)_6*Ob;sYvXOW5tkd9PF7-$Glxk@nc^hh3|ErVx;?*L)FUJR#YQ*Oi z*D?1B@hp$?gBIVHa0gS?R!PgUTd=sqy7u)OSp10iRxbc9#Ouq>+(vd(rQ~b*qK{9N z#F}}bNBsYA_zg7XSIWfEUWgo2$sCz$u#`$MdvqP)8$$b-=ya5+^i7S$ejs#hbAhg^i$;c6MyaRCld)iUUqGj^|K9X*jgE#mJ; zRd?i=^ZI*U#0S>jcgCHk&y=_~?i@Z=@;E)NpnXKOm~WsT>NfcVALiKfsuHys7hrgx zQc{_7JMiafnf9v((m`K-qB|5(Rif#A8K!fpWP61RYOYtwpobUn^>HPA-WO5D&*?;- zhf8#YOtWVWjXIB4;DIT+)aB2z z+T_=giz>x+pc`xrD@BXERbt;taXWDd7Drj{|8fDl!^*|I+j;!Q`3ow)LZ51d%pT|t zZT$+_XK@L}(dE4VF3=}gAqw(aF|ifw*?R>&L(9ce|04dLSS~(UF1TG%E_1FrB6v%= zco;dsn05F4rH*J-XWrg@XG~dECbi#OfW_i6@$2G*E)Jz)?0gO@imF6!=vmA@SS1a& z?V(x2^E*d<(YY%2IdjAy@(ZoI9k6*srL^31K#!f3lB{NjSn?EZU2NeugZ#qp$FQhB z^$4SnV2lO%hgbWtFsMQbkK18l7|+}AB$5|ZNag7hm}XZY@%N9T$2q=l!!exriMoa- zN03%oA-0d~;gnV`%EfjV#MhlJ9mfdf1#bB5I3Bu{N#E6yW^6tMgpyG`3U{|2+;B zyE0kMzCH=vSpSc3z{h2!;u}oeRStQGM|S8$-0!;l6rQ{-kzQFRpwGt*gB)?WSE;l* z*h6DMi7flg4#W4BNO&rFxvixVq;eSBdX~_~bP$EV@O`z`SfEqFo|;w|PyK+UjWzVM zsS8+o7z2%!GU}EMwhUHE;Fx1*A4h$JxfMn;2f}ZREhcPGNRP9};JsPF{Nkgy7hNP_ zst2L5txT%>uzyb=&nMIp+vuaPy|W2x!^lglVXiLq6^5@?V{L7zto&sk_D-O#p;UGFN7!#lKi#@w8PaTwx*o;c z=dZvRUFsdQ4H5r^K8xR1W6g^qu^zh;Z$KX8^xv4eg}jK~I+%S^EDqjlaq?pUbJ>k> zV|O9(_)_>@t8p%k$9rW?J$Dgx-y6~67=0T< z)?p3#j+R6dY~NTU8u?qGaHk&Qq6JFn|JZ3`igDrjqPB1?Mmgn4;R+M}zs>y1zy3zJ zCiN!d3H8XsSg+U#7wRW$KW)X^E`<^nY{7g$@-V|UqMvKNRFB_8|9XMAjo*o6|9t9$ zwqlHJ9`i&uBDr^ggjp}eY4R52l^Om zS0E-Ti{K&!%u8MXnBB+qhIFopXi~MC$DYvFlrjV&vY7=n&;D(y#TrfdD8x) zJ{E4z<@IL&r4!lgn?uVy{V^6-XJU0H>Q@FX1oq~Lo~k}VE3;&|-8|eyuBg^7M9$zG z>TeBD`@hfqJ0Di($Zu>|f}c<3$gnX6aQcxvOvEDi>T^7UmtY8(?>T=emY&FB{@7H& zfa40Ch%djU%RK*I5&kAsVt@Jt8hbOP{@rwp_o5HR?{}z#q)TkuM1(cbH^LmEyMwc& z{E0yOUAib&OvkW)(#1n(8csjTlp)%4Fy~wL2U$ED=YOW(X1pF2u1gculBuY_o*^MS z*avEPx&*b%!jzer5|X|Ee}74r#1ws;sY&BLeF5^nq{qn;qDA4Z~2w?t9y8;7-hlO$yLSgiJqm(1^e zfkRb_v^V{Z#W~5cJbVHUFNznx>%U^1Q;O)!nn689vQ!_RjA5Y9r(^;&hB1fa^8`fL z#mgwuiLm~ZOuRJ>haHl{?bLM4uHfs%)37r=L4rC>fz99)S!py2PRb+++ogx@*$JZI zKaKg4@zVM|dA&{4!F0^VN}VKe2%Cksy%WXlq#mqak@t$w!xHi}>X|dp|0MaP)pOzJ zlqAEtlNWuHAg0EDVo+k7L~6}K2>n8t14d(mQ=H5@O`X`XSb6O>5=ARx#ISf6O!h>v zFWzwUTSDGugAV@Mz`vJ|gz^l(>oHPaq)Q)pv~=F@g9f;0snhsgY>%OFQFgWJK~OtWU3z1s~r- zm9H=F_71;u-`Mf}M?5B8aQ(Fd6UNoZ&W=`?cICePLksd(R7+4|2Q;m@uiVmx2lH6h z@%W7VG2CYteMIb`Y6%798V&Wp(Mp!to&e**c-t?pPC~3y~4Xj^k zFb7woR+RtNqwI2xY+v#k+QbRVDqrG{=QT3t#S7|KYh)jJpX<>zVs^3?ooCcYn7o03 z)JR|w{Y_(uqY_`h`%$$R@qKI5=reV%MH1_8%a|`yMct{+x+XMl<34%rOC++6%lOu--N5YaOq|G3x6FymtUe2BPlvH}joL(@8yqPDR{i~|cX zpZH0;z6#U+SEu|?hFYr{?o&%(%JG^6Dsk#5abRx+nh$aRKduV8=WFEktO~etKfioH z1+K8}+R?cj`vZC2pNg@T^YNJcjVZ5lSL%3f_T%{3UskuES{fFYqM7)iU0H-L-qru# zZzm{-_~v3IjC5GHyIh9DNmbH3sRYJC{P>d+V;igJpD2Q*Mz#2~SE2S>;*7cqOfKVf z?^2Fd>U%9sN|8=nu#CQ`Z~v~6IoqmH*~mUrUS*gcOT6=QDY_CD%&=45Fggp=VMzkaUJ{H_V?$!kZ19C zt&!CBG>qUn-?uFlhYUI1))e&bStB+JQjq?Z=lQGvf9>LZF@=25$Qqe6G6#3&*2vq; z4CF@=--PDl<~8Pk&&x&aalT(C8^^d#rX9_I${^w@-82L_Rm+^u$uHtYkWV9t0$QYJiz z$6}AA<8(9q!?7s{Bk-?!jl@@l;np9V z=LL!ICf+v7k3|J>rq+c>JeX81`y9jYY$w;BYXVezS4(G!!=@d)-%iHhUU`)$mnLG# z_tor^90TtQ^p$^;%swZ~J!7u$`U$+hPDS8P;w#&U;n+YtJzggsx_gNqr^mu+8S~kh z!?S#Tm6%M5z^cMZanB?#M*LOJ{GK;9tSe6rhmLBMXbg|T{RNzl-Z3y>eOtLB0=6$I z#Q5*$Sp8q6_*y2QlTM|~coU05#AO|Gq7i+*Lj10Uqky{aA%$UBda6P^6bU$Syn=NX z@>;!FNA4fP{u&jcJu?b3rxWL{j=*;ED;`^(K$~@ZzouZE;yAs{=KrXGHB7{ZA==S_QxZB678`h}u=5bOTo!Dz~)K0f9dLYEVV`-i}Yb?boS z$G8cupQ2y{tzmBcj)%}5St%}C@8cWu3i%Kah?fnlYq!x4ce_Hg)E~n_LH~QNU}zJU zJ5PInuFS{7y$9$qxI#ww1z|UjlV}i%G>ZzUz5f*UM>rqdL*P|bF0toB(fJSJaXK6) zD_AFIe$Nyi*10bR!@h61*p-Ch_0V#8UH1fQSCxz2*?Z`sOP%|N2UzgFOcd@x*b-1C z!Nx(r59PA`YcO`-Et5IT!BFR852FV-@(=U!y57fzU&*H$1IM*| zedtZ7+^CRcW#0HTu|no#UPo{83NCt{?6+LOK5@S2*jp~`zgz;e-Fe+OAh=+B?z2bC4& z^7yb1(!+_wLu-&@4Zi>~84KDYh$I?nuEF1c#{_)1^@hb6x7 znp`IPL4RINsl8A|`J>)Y5NA6rxrSRwWwK>LAo}q0l@S35xnIV$(ow)(3 zw_y9Gl)0)mVX?4OoWieRm`^GDie1A#-7>McAAsxrWn!;;2l{==MD2_}nr@X!?npmm zPAirA;l6meWyfPRD4nUcZnES-oS0@ z4wiTI!t)fRnCW@pyB~?)i#?I8&VGWoZz8csDF@rV(Q2<0nU7OXE99mC6L@h+3y%P!%o33;2Yu2}IM*Xw5wgpML#vhfP@)X6uHAJTnM zMxBHkzFole)9niKTRBep(O%xqefd>#HBz0zu=BiSz~?)akeG0 z#?l4J&**a)>WsmCO2kC-JXVyGA1J>Jf9Fy$)VPdpEhXaGaS5)}MeJYU3g?m%2}`~R zMQ`dd-n#&EmEyDbJd!k&GCS1~bG~pMZLT6DsYIM_UV)`ei7aS!$3*H(oXB^14=E9~ zK9?|iuafuGC72s3C8)^-Kb{~E_KG3KT2f0nFs!AREpZO%LrBHeADmv z`bY8-q4WcOR>%xbCs>|Q%1TcU%>Pd*F1OsV{XOyj5;vGrkFn;=CA3{GmQkv%u=7_) z-_sY78>t}A>5QX!%%=?VB;Q^vmVaJ_l6s6Fdk?HND;A&QSJ0oj4h8we5ethYy{9{7 z>GOHVSs2`7zJ!q@diukA01&jyhJAI+au6gDUJ_MVzYjUxKNii zo%x>@mmE<--AMh}vsmn`Bp+}Fs4SMl%TD3O#9}e&V~Zaq6%%jUz?I*hs$~UdE%Fb) z9l)WMVyXPWp8e8_rPs$3c)my>z8a^X#$3>YVhi)IBL3Y5T8D~cSiUvp^E?yhS)uDk z@;Ak2pu*!f-=+R5g#9p0PGi!sA{n>97QVj}iD$Rtm^QXpEcP)^=|++0Ket27BkEoL zJ&8;`@+%c5sNZG&XT(vst)h-*l>h>Aivx#%o*_ou$(t38y*3uN~hJ6wHIAY+0Y(4tZ(nd|H^&ZIzs zBkW=IM}ep%oI=+I@+z9l{|L7gf#t!gG=(objL2{ znsb~{|Ke_Hu2`(Ggx%U)X$ss4Q&0M9s{TXopEwTHeK1I7f0c6^(fA;TbsJMG*`6)2 zw^zZ!HcKoF*V5m|zAL>}VfjDgG3FW}{cetUb+y3lT{+V3y8*MwEA7u-hx_%^z4S3d z!HjJ7vo*!!q72zTYZd!K@_j$b2&n{Ecx^9Ha4>_VyvKxsJ{N6n~ z;iN(yD|;IPukk!jZN>{{>RhI7LdP?XhkT@kMV8oQ??LWE=EX8UEB?O>+0)Mwojo(9 zQ_)`N6sC)x{0lGgG}cSEVRvN)`wi`dUn=uglzZWDKZE%rEAX`=P5h28!?NmB(OqW< zS1snQtX_d0J=0{0>EBp%Jw<{m3^95|hN#u8#;OA5rR1$5ZqJbA39Aq=B#r(uW0+4% z6(2og{E?X=JE^&MlljZP{)%a~a{Yimav0^g)MhO-OK9MGcS2rU*GF8Ifnd43+bw)kRF?Dx}WIkDk z_PgZwjCUYtU#cW#@_PJ5-;{|tQtu>-+p`U58~)yP|ve@2dsG>!}{;U$B1P1 zQ{RGn%zFvzwG>&qli84{^>#x%9G@ut)c?l2-SMm|FNaM+oD4Bo zhSB7s434kHu7%VAoiK)aQ-V~Nt-xEac&_`E@S0DZO~1eKS&>Bkb3M>Vey3y&RxV1C z@)%PLnUo+d-B&~Jew{_%N0D&>6@_YY$EIY8}a&E@>8?S@$qt;wC1eGygy<^{o_)M ziHj1aK7SDhMo}-fls*sgK983`>vk;pn3d4n93vLjjPS;Y{7&}YIQB7`KE8kOk2d+D zfz){-O8m}qT`Z53*onsIml`8Jr&nX$9_omWu7=+?Q8J|4YV>^-A?l?ZPZD#6W2tXV zik696*TZ;QlvL|ehp7=IK4VPbvnZ1O4p)PiaSHR)sYAe#Va9Dy1R) z6AIdxrtudJn>O*+s`q%n{qf>cA2HFTT*@zerca3bx`8doG~~W-MaTc|dvz{!pxw7jDx*K6 ziu>RPnXSl}L|j3B%l&DYIE-z9pKY0RVs4M=Zti#Yd_erXDoOwR264n$i*=i+gRYWc z$`=Tu-*|UxEk@f{%D9nlFqh*EVGhn3`hpKyH{o9|;%sFjY_3#_-OG9m(`EhgLmlgV zmD0DN8h7v0SMBx&DjzB&dB{sN|3zG3)BxA+#NQsxqp-rRV+M&hk$|J1^6C~=0(8%)_w{9x9M!$ZngUu%ZS{xS(aUk^3rmX(ia zKv&lJbpPUW>VBt%l6O;7ivGDu=&8|1ol}LTt{i`f5_YFqpVccud?s;Hk4n6)r*4}% zB-IgIKZ8o~vsHzJCzN17U4>+u6(jf}@#e)s{LZ>(_<(Y(L?78-%&Y6`M81dm_ua8+Xxu=&sh^B0zJI%FKGIW&Psw8~ki zy7uZ!^x*yDZJmyf9QRJsG_>*hTX#-|4(reJ*uSd(Wa9BvIWVK&y*fRc`4C)Z23dH| z_YLz-hrt8ZbH7Q0|9ax_$|R@|Pr4l|z{JPIk$v*9<{@#GHb1|SI`sNXOyqMv`tvTB z(+?kG&1y(Sq(ro`{_3ed{+WU?+7YxueHm>h)W^SNd=49~NUx+4Qt zhlw+1q$71$sZ2SUf`IfAsm#v6fW@WKkXnFT`q?|a=0hj8L=3OwqR)_0nb9W))tyU4 zCom0FW%RpO(Py`l_13;Q_=)x7YVu_T79}!lTMB%*&ks3~jDVr+7eHU#2h|EmA3!}6 ze}`Jgi$(GN3TcSJq(rVC*C?#cSQ!0WB5poWD14xlX8Q8F4<&Bu`y7pDS)Vpf#KYf9r0=>ocq~^+bWSV=Y@$Em zYb4s}Gw{iaK+!0rw5f$-;7H>B>I5VjDdoWrG4RbSmN_v|2)@o70qVen^RtJ1Rcs)C zx5*m?8}RvF<|22b3&n9&3wbvPqC7G zhn~|D_URz*Ui}z4%vp%-`4D=lCE_rTdC}`irD?%aJSJWa<8gZtA20jw0hIp|Cm#!f zGKV^VxVvym;JA6*>s(LU>z`o%Zu%G69%BW43U>D&V+i?*mE_a%9F*ex!$TBoDG{UE zhwxsclr2y1@%NoMjcU&j8%w>xs8Hd%@KQmG8apUw0?^a_IE1>(!C z_h9a!AYUJXk7Wuu+4%|FT@ z>Hy|H#y?kzB=FaVNT$yrpfLzvLQ5oQ_FW41OXMW`mK|Hobu!EkzcO#a*)ssTQA(+G z@yAv29V_Siv46Kxa%;Sy9Y`FTah>`LC38BwP;SS(hD$e*Pkq9q{WqvvA%1T4!e8da z^1ARERR2^+kcJn`BZ#m21)`kmWz5bys93>uGvGGfyegK&@>>WR$NUF%e|!lqmMQAK znEF7$ez!MKucwd)w%1|wd$Byo51>AySVGs`!C1XwQS0f4uzZDtJ@SQ}3H>4IKJXYw zy@bsTY+xS?^CRBaOy7r3&pTMvO(E0r{4lkxNc{TV!XeipiT=(PhIfm^WPuO-+X`h^ z7(2saotMC?{P}k7w@lDKTp2YquJ{W(lh`N!x2>-cAs*Ua<&8Ud`K7Z(5 zDU=P4{?NEvC@Rly;je%~S={$7QWfl@@#YTpeOD;1}$&|DyvbFO2~U(BoUy@nxU3nkUr7n{=x#9!%ym_7xPSnUm?mVEJSxQ55m^2Oin z8Z5|nm|njPFZw!`Z@Y!ZkLmANM;Z zj?dEt<*V60rHczzUMLXFmh&*s;JP&MfXS0W8LvToTn+UdMVGK_MWLA3x! zUTb@LU_@W$g34u_*^w{XPrB2$K;1;qWlVF)my;_l!R}q2l=`}1(`EWw5?s;SG*5c; zBR@EyK<140#8K)?tRk-B;PZTOI(r2JnBOsmy1gSwdCXP3!r!GlF}&x7WuM7cto4Lt zW3J3Gxq_0Ld7|WeroN}oXRtel-OpqGiWBp$*uN#}9Nftdbj@+Zm}dG)BFF=d%N4Vs z7hpA>$Ek9{@TeTAHaL$HOUNVmIpH?_GowbH!`r-UF|s)aV}8%_MQ-^14s{&W7oo#E zknKNTz=X*;GW*x_NWYRTAdgwzD_eGRzFm#j?P4K+!;w6Mp|2y>4k9mLbQZ=& znbQ8+33L52q}PdanD!x00<;~`a3fD_$e%4P`5%vT8k76cPc_&ML6*5PV+wP}^Kzu2 z{shv$%aPP$$FZ^{SDc5RMT!ygSI?hC0*XuYs-yshY!v1^b>HB$h6czKb#Xjy7@|!b7ul*z{6WK?1`Z1`6 zW=QU?W2oGdB@Z^8#LR{CMU|ewyTT07l#_VslPP_V(dP>CAl|lUV;|qc7mp+8L#9ll zZ+6wiOj*#M^Y}hP^f#SGfDU<;R*tVdT~;1A1xxZ9Q{qn|x@U&CKRf|9e(v=@4y@;A z$T0UaP#>8g8mG^oIzL@(|2d5vN7JO=q?70$lqp`nb3Q(h-x+@vUNh4r>?a5KHm3=k z?NPmp`L`{0Ft1J%$2DhRrk^IhV;!KApT_;^Q3Ui&6OE1|NF9|bEw+ac>zN|;J_nH3 znk@Cx52F5VnvD4C7#2TImG~>i&}C(+Jox??EE|&Lwf+%k4@wn}7e~-}Qj)Zo97K$D znoM+{PBMASb%YgGOiz`7*(VYDgubz+ z;~1}zECx4DurEQ9wC}LNt%b~yd2ENb9;p&^8j%~r_&CXqbfAoqsi~gvB7JN1W_ZO`t6o@(VS$BOXP17_aDKcJLDUV9HEaQQQj^+ zf$y@&&!iuxUpG-~`yR*sKjI}=+XgeXQ#X@Eoo8{ZOlmm>zY_LeHnhh6V+o?Q<0SmT zW@2H1KKM2dpX!Zj?jM^IJ-kd%Nn+1^) z8Fd(qkujqAhc$Y97sEUZYdl;SDfYXp;ruX4rW7B+w|!$pcc(30+=~&@lgF?$CR*%# zZJ_xoN=*Jc#y+}{GVi_(6wT>kcw|2=RPs7@{TCtR!3^l{T~?UF{LUTd`+KrjuG)^> z|E0;C#{aOYoPM;B{}5)AB9YJcAhjlmdC_d1CbB2cQ#|SU- zH6OO(@>}Y(GWd9f{h?CKF=~FIw9}Vdm5?AISxiHwPAbyP5>LwFq~2jGy2r$d+lw9W znaTWQ$Ia+YUd?C9J_J(NwLJS@gngy1%XueGn8!=KatFrsq<(7Fzi4}qAYt$Kpi?dN zQGvU$@CNyvL3>fXhyJyS|5!Jm{^^i8)}Nt|&0zz&-lZ?ClseL->{GRMBfbfbB`(;E zhZ*##z1{-9G30xUw_wxHd%$R;mR*q-oI4lxOU(z zaow=+PY7rIaA)#ITzE-5H|hhHv;OEl=RJ(Sr#^PwJ2X2JZ+z&07VC?tG41@_Dv{E& zpHO~ZDLWM%?2F5s^Vwfu$bG3(K`V+_$I>4C9={gQzdXDJ0Z*u#UD5`%f0=vUhv##c zK4Xn{$RDX>Kei5NbDuh=t_?Gj_HD!YM((4?cb$z;i2s=nSZ7)+ zwHx0f(Lo`z>)C(&AnQA=9o#1>8w9e&(uSU_=m@};y!)c;+H6|Cw@z4gztIknorfEDo7~{ zDw<)snDd=di%RbEHM`ef$!H~gU9a$q9_x_L8evR5ayY-Yf%wMzVjZjwa-V*-2FZUG z%b1OCFh0GQ{V86dN|(89+Zv!Zy;xSd)MN4sh0No5)U+ws$D|rvZ*$*C9!swe@j-ku z?3o8=QTGaokGO9SYee-@g@l+j;LJ>g=$Y0c<#Q2p0^TC<7lm}SdW|03$LqK@lQ-hN z^l}p{=?7$+K02$@2@fP79Q@lN@j3XCu;k;0{A&|v-AVrLC*RVZadTM7P}QzDwT z@^K-W^OaGEA3dlq&#yxLe6GJVC60Y!-d^8giZ6ibM90hVkm7R^(YFko)KPHs6coH_kH$}wbi zv7{Q6vOid{EY?w?=D%XGHY>*40?v=20xN@w12>d`%%$YkE3v-1i2JDm6gd+wPN~Mk z*F`d-lDSMjD5Tb_5>BimdR-{{|2k_6^;_OHMS^F=nEfN?|3eYNcX1zIMm-q!^YtsM zU{CxLbg~R@2Nuy6t;8teqvc-}INU+}^k)%F?-h!ct`hsV7ZP6=z~Zb@bdA$-X9Dr& zn{+IrK0j=CD)MJ3WttuP#WyKMt0f2ROO&GFLfzC$j)yr*zfc$NvMU|aUKEShk~C;_ z<9wb>#%bmiI8sODNADO;e(e#%&CKVH;w%U*uSixf&CMcl2NV7+{5U6 z^vPfjfMy;Rv+nHqItSJz3Q^3;pnkAeqR(c)jq9%b&kUGwp2mz$L62n$vF(xzix}3W z3$o!cKp}_8H)&ZDhg)Z|K2;>+XQwk)k^1^D=5K3rJzhw`&b10@IGT@9@kP>CBM<+? z7K!$gOngt=lzhAZ0n8=X>7EDg_r#Oi3$T}ex9pz<)k(yqAJVB$;phHNL*F>!$-QZ? z$tV;*>l8fxu}CV(_hk?#%~+I$OzP&<3NsPXP$1!(v#`0SP&_AQpx&@h(seUnJg!jO z^HQ+Qrce~E?00{II{Ef&d>%~wKJ{s#ONhG~)A4N!>%5oKFg~h4d`G09pBnY?St;1c z>y*Da0VVCl(xp=@$}NjUYhWytd{mT1qf>w0|BoW^a5Hlh`bQxCaIy55k&I=h*ZT6{3AU8k6dZ#Q01E91bZYwDLK0`TE2k6X3d?w)J zV=krouo(Ce|A)Mfgl2J}bonC^uh$jIkon=T?@=T}a-PHG0l5emSPWitDw5si(YXH&*ZE5NG2IJfqE7_Wdlbro-Or)< z5Apf0&+(ILk+}YpjGT@1JN%J^(RzhaI+yub_leJ~W8vJbQ2Z;RVd7gLrN^VN=XkzY zybVJq>i?~n&)$5eK&HKl$37L}-?A7)xiRM%QX&6p9=85x#F!b%5FRnQ;>@S!nnX96p{xMgE zy?c)4J_=D@eu~*c6%xQ4tPkeI`Bxq@H=66L+asu_aGj~#hhJ8qgxcRjjIux~8}71y z4zGjBGdTJ1_u@$?+y_ukp#Bv4p1cmDnb#FjDDD1_(UZD{5bEXn4Js7P2f-LzP#_(@ zJVf_!j`#0}80cKUzOzBlBri4RHFMaxt`8eO!>{KGWjT358(YqIb_fR1=P_i@6FlHN z528+NM_YlswG73yTLt9(o?wamig-_FTV$0&acjj`*?jdUp|ZsM(vz@NniF5S#!xR{6yWEU!FKHCq8s4uMhLZcBJG= zY4Kg$UCq4Cm%-S_*UdjY#0@2LGE5#IYzU9vh4V*z-+J&d-Y&`$>!gR+9+NAf=YnDT zBv))_JcRk{T-m38AB~f8B`oMZd4*g_HV=f$H+iD_^%+j5X`waRSq(Y%k#?b(v~@g5%jmMy*$1Ia^V zi^G_Qh&0KTJ)iF*y*NwWcD|1t)3POG^F8doNc?JY7v;p6PQLeGyuVO%%d$Ew@p@b>1-c7VwGld(#&yM>5CciZ8;qQg1TX2hoRf#AmoS-bUt0_RPD~ zz75k;9(!eX8e3{kLA&oSs9znLg8sY$+7-i>}$+uU=z6AMzvpeQ}Wf zqE5GN!kRpVPu>kY+(~}K{sy$E<0yYapX}Cbai4x2_K&lqh5pwkcA27cgFM~0ysq@w z&S@my;B^xUUXSR)8%S)(lz_9|NGFeyc;Pw>`(%mvS}#2H%ogvl0cc*8EpKrLrTucm zW4b@2B};5h`=OTn#VGN^{WjwFNj~_xIYU}XnHSe5Q+j;xf*tiAp4E5pr8{|`j{(>@ zCQB^i{ju^)miR>7#hB57muV89d6l{x>Ls4ufYtGI@lo-H&V+R7_s|O`o}@})*fj*{r%LBPJTb-~ zL+mqe;a*m{3@NyYFz+;J>U$FldZ)1;jyIISDeQN71Jh@xNtcUW*cX$+eve)_+c||k zO)psW%$4dM*D&ZPbuh;~aE?6DYuhVuJVhT>ygPFyv#4{wgcBv15}x9UdHu6w!xk5K zKFStN@`W1Y>D+WZkUg9{la)IR$ODyk_CU8hUN7Ct*zBAol_^(IQ%S#5o(GI}XG;G3 zD_B5&N7>~H=8-4zAK;Foro0bpuVUYD@;eJ%@bhi*F)N*M&xm}?17|dy&J=?>XN2je zOXschu^yq1s*58gZcLNR;ZEq=mcjbOCGIZ6i^?UerC&-n_#*so zrOEOVXT%PqE-1(YPUL|+D%c0Xi#*T-cW4esm(ov{@sQVN_5~N*bIFKqG{is7sVIJ@r^2e>r_x-}VD zNp^(uG3MQvI$}#uqD*;y4qa7JMQ6Ax9!I5!%?KB)ot7*n16?qJ{Da0FXWZGAEZ*y# zV053l7@zZS{wYN~dtAb|)7Ura;zf+^!(8I1i|E1}oxWE&FXcS0`UM=#NnuW{I~qQw z$n0P@oK2z*Y0zcF<|c}}i7S?oFVL;N0Q2+|(bV!la2)+zrdROxJ@bjSxx;8|vNUrY zw11N%>SHfMRW(_L9dU#HUx}iB-wm@j@c1=X@iX&+-2b|Y4*|)NJI4c#2NEUd7k4C* zCmON-JnG34)lWNz!+$48D1Fe1AqkSMbi(qMI5|i?rCxoUOqqKQ6SgGCZt887o#f`Co2;y2G3qZ?yoM(cTGtHnvjaVJ>UCP?35Zdh&*FB-isAtNSErnz23 z!k{>5w|2p#t+CYSyW*>J0)KkkQM@=_Y?fX|6yjuy`epR~K0(adFX2*Y9Qn;lcQ zdUxC~XDNMHXU^elJoAJa&Y`0|QkvDy!ALz)47AT7s3C?q{>}&)Ox+L9OY0>4VddxH z=MhPr_<0m0Qs-mngi&*2#Aw$=oD7eV;O|`!zam=3csk?ABKpFtSeJMoA^yEwP+AZp z&LdnA&fMkFvu?PZ87;~K7tt~FO>|fz?I!VU;Y!6pn*D;graD~3TdE-xGG5vTB`e*Tt zC;7fdXAsnpD23M@pgt;5boMewa3u9dwWsidK6#~rlduhrm8Kb|u%|vjEbrQ5$A$#a zUrHV~I$nm{IE^oB;$*q@X}lVoK!1cC@^&XkC-&R0dmS&e!_S~>PrP^@I}7v9)QyFl zL9dWF(OzwjvDMUDtv-Xff5u6wsw4BiqD8OcINtS+5~aT_BIia*6ZvGT%1D{SzNEbe z#Y*foJE%yERBo|D#+VqXjyj1mc2N@jB|5iGW1%8a+!mikNqn@_&a}hV9g(t6-3~_z$z%0(#NoCm*>m+Q zbBgH?e0&xTN9pr>=71r_)PD^)g9Cp?%9@ST=VnGq>w0@MT`Q8%rybbCesc9LZCK$! zeD#(&)2ifgOj@vOHS2s!+A*+(d2I9BnX^r)1Np9b}&jzO(ZHDaFpfR9-8u0VQhe}_Qk z%kLce9)8~yNSn%6l%LI)$0xtw;cJ=@{o0U89d7tA=5LSX=NGhK%FTSSo%w$pU3pxM z`5TQf7>sR<$ucIUA?q0X(tDol*|Ur>#?lyL-?t&l-0D`hx-AltBuPS&ge1A``@Sa$ zNs^=zLVjm{f8EdB-}k#b-{(BbISsgShxwx~n=zwbzO3o_9)sxbtew$-$>gOg-`#*H z`lJ8Vg?Sj|NfUXd+%D%yaNj2U_znHF&u`K7My}{uHe&tJJn_@i!HfRv?t<62LVs%d z1;z*Sa%IG_kEkhRy=xKq!lyDH^r#6}OLHW)xE@pJH@Q)tZO8)p_aAF9F1tvYAHKkd zDdg45qQ04bkzDFqg)t-e{{83J$a!%6xso`#NYqQ7;hj6<32wD$*{(?ZJZtbbSl3)! z1KlR(8%r2Vt+_rC%UkyQ(o=UBEm?6=q$|mk4zg zo<1P2-s?&@bAA#pK1CSuoAb4&FkGE4f#d2RNAjiVP%Rdw=S#Qjm&j(Gc1i6^jOxUE z8c)14A%xmcwryI?@oWqEhj7#N; zAIIe&>!@`Ho-zNGD=X_O(91kmdg{N1C+m>6&aGj-AV;e2RO8(;=EpLsu&V>{;oM62 zndV6DsR|^HEfUkdk1&h-qFSE7g!s6*<^gKf6iUCmCpgdicl!1+cupn`U_1+}82@2B zD1_s$r!B%O@+2DlRF3cB`DpZr`Z9d~S}DB$DUcD@*#8(_ASH`S;P7LCl;0{LUla4l z6~#E*`#+t8LX+eb3d*Xyl_CGo~=F9XaC1~|DUzX<;qu;`OdEC30yfGZ#zE3c{ zBlE+(AE6*7Uy_xFh<-pkaOMFvl;ugc6(v}3F;Dc57h^qfLO0_A^4a9c^o>tZ#yayk z=N}_@Eyq2x3~zs9KKOPic9R!is!|Rk@+FSxQ3i7Z;)cLt9AUmye{K;hLUScp#p_$b z{n7m)b+2=!>fU{HBwna>EX0ax@&hp581x`VmUMgq*Y3oVj5Btbm?NdUpI$9E-sYt^ zZA2bHj$iLS#1T=&=*)WdJ|hcZSIoTQ(n9$EkR#2TAERSYHgW#r|MMo6KP^R{sjPc{ zP>LCG+0t7F^dgC$sQJ7C*N# z6QvD#lHMT$^RDJeYpXQ)eZ_g$laJGkQ}{;YqL6WjsRwdU^C?dv+_KScAJ?;K7G9sp z6T_hy=+Gul%6sHv-%PIOs$>*V4`ZlYjcn>JV)A9=fR42ErR3Z(wr?O(b;Gw zUaI|ueW{VzGRi*<^V$N94(J#)&rfWIWiIpioX&Ao@sZ;ZGBgtZGR`sNA^RcM<&oDT9_z=^p0|ucG#(X&oBzcL-jcWc5AuV4n~c?rYv_6=K~3IK4eREr%5%iOV>CYW z%#q=h(HPZ&kL=Uj{VGTDO%l;@RE})yl86sZj6?hzho%4INOspaRC8XIc8| zz<+%nj3W~73^{uT-h5wMABz?*Go^V?G}bt0%HkiXbJ&u2tsoM?|71$nE%#tUT;*zX z7iTZ<_k!cG^Q$ab{UQMux@Jl4m{>$~$&_K{(Ky#LQ<~1*!;q)x;yxx4@1|x+@~kAR zKb|S>y_2zfY^D@z6A`mv6>AnJ>B@n5FH2sucF8 zM551z6v-WU7Zr>*1ytXGG3zFRd)+~3fA-N#=3_PMAhfrkBCc)tDGWQukjM1E4V-6v z#NyG{F^9NbtGT;97U2kfnI%0J-GFB&>fwyN zfkuw|V%>GL`+{{9Ng*Jsge0bh;ETU9#c#nibS|ZiO>7XJ{my!YHrLQUwZhk*T!R^PZ#t-haL_89amz4t zf1D=W58T4p32CzPeJH}$5}&uYjvK_q>0__M|1|U8+pi&zcyUxs2>S5(arO&;QI{s^ zV{RjKCv|lm--dpRG#Pd{4CkGwJIry2xIz5O-y6yKG;Dnn+MiNb{}Kw%N#rY0g}{Aq zx@eC_z}=O7C>+0GZMja4hoiC}MaH}i!#>toWFEZ*m+w=g+qye&xsoi0EyD3z9r4MX zU@Tcg{COz|pH111vNQxLi)6u$V5HY4$;SEDp!+pR`klWDee%XmeR%~{3zDUdJbYIT znTJ1l0}sY0Nhoy`?ww3zU05(me@rBwbO`ENCCTJ%!8k@d6FToIK3yj+_Pc|te7*Cb zTktrVL|kZs>;6@#np$>YeYxV$$*TAE&gc5$Y}-nxv*6BwV`!1}}p z?$cKnq5Fo97XnZ{DqT$C{E=FpD&gu27`KG+i5fpRXQxZ|&sWfeag>dWcQ%isUJ?6# zpR&FsWcWpd8ZzF&{^5QVDH2(E9@-7*(qTj(W}Z%y@`B4Kb4e8#TtUBp6si7^-#1JV z^*@0)oSZD~XBgjXl`P@9d3K4Sd36>)lb5D?=tb(fvM;IX0xqz=r9=J&#+6xj zag+Rk|1zF(=R9`IOOmeh{LwR#|1;t|+Ht*%O7%nGSBa9?;~Z8#W?W;@B{*d!%EFEp zG0dI#mAaoljZT!_mgixAE?KPVFJp5od2_l1A%1L<^d{fnW!{ge+hq*k?-#?E}!qGEO|7_~U(xIB`9D z0nc~FO5?2a==hNJAW0YC&iKgcTYflL8Y4d8{;-`wzU81x(B(4@Q^!8*;q2?`atRYy z&tur>BK*5i?}_o-NriDzy7vl9$Foj_X71 zxQr1Gqs9M?4|adYI+C6~_>OUu<8E_r zmpsg2+gML~k98;;{GpymeeW0Nv3m~VCa=yRZWQZEOvxKbJa5|T9DaIoPezS8hh3}( zGW`1@Hg4hf{@{LKzt*KS0kGM|x}b>{vB@n;)@m-Gor_L7EcJ&m`Ip1a1>oUN(K0XM zGPWcz9K5VOXnmngefts*Ym=(!#Y_*J&yq1pGScwq7Fn!5cM@Q zijI7Ho>*%WEqfXF{n0f_VvnB2Sk_~fH#DQiF#4%eKH)I^t&dNe;QmJrb(P;EsSnRv z_BE+GMHN|(CeEcjlVSF%Fleiz5%5# znWq`qfV-?a?6|%jW7vQBAFhA1fqoJBh0>p9$&$;|O($ru@<)QW&QWPQr~|L+*qWy-<+AJNv3pKEvvn~(Hwi0fZ7&!7%$ zhU;?rqg{yqS*O@Bl>K4spRFbjwU&LU`5B+6zr#3hIO}`HXG+7?4_IQ6A(I*JxWqnB zvk{Hhtz<|gufw1>dA`1^$BGZseVg9^^HUjO9AA%yq;y$+wi)p=SQlCT3G=$rKkG~V zGWKKE3~c&;9b(zgcW`N+E`#>G#a_N1T-JaU><0~JAJpjHw6A?XqWg`s|Nn0vYxaqr zYeereX<|I49*fC)PE}RBui&{j@B=Q_QLpaJTQuBGm8$%D>O;Q>8TXJ$gE)62H8~6rQt@?;7##zEsKQ|5}!(h^gic^5?KmbwdMMkbi7e zZXHVN+4mV+hgreoSL^l~4$SAQ{P+q^Z?k3PwJJ3EWs3!I`(oD1x?Zk?6YE;*N}pkv zLpE_k1v)ZM*U-5Rr>H*|T3e0Kyet{kwi@OG`27i$xUwTlTK`>%*UU?_BJMAqku8A} zp23{?i6N{9S{#`r@dICDP5Uf4m{5zbX8O5DU*a0)x2|;!wh@OU8dc%o-AwYCy@V0{ zu-&|#RQj=ryDCvpmmxm<9Uc3BOIyFj@z&&bE3JiRd4@Fd`}@XZ%G3)lVeOD1dk?;V zwQZ&}wyc6}0q1*QB~~zxFpqJN2Kr|$JJsRKvUKtWzk>U1zJBNxc|MrenD!DM_wwBQ zwi+7;q{~8nzNsJcLv7vVg4eix5N$mX^k2j@DGvg`2p6OymJ-G1m z%wx=~LDJqdG1OJVgZ|Ib@2W7UU79rh`5g1!X7r#c*Eyl8o<)ZTf8 z{`_1-i)uuSP8IKc)o@wBK3~RHwlhBO-}N~LQ(qw9I{DDeSbrE>f$w>qmi+P>roB@n z_5yZOQe@|q7ce=NEFtY)U|q))X=TFu@02V756DygHi>rr8Ct87$yfIj zjc0h?-KxN!PUL@^{uFC!nYWuC;|&hZ#G|F;qk5Got-BN zab1*@;5Geh@7N-2bxjxJUy3mNd=1Qz^UIsaD-Xdf8=xVbJ}MocP0 zV~=#n^?ZQ)kJt}=vIPBY)1}>sVr1rU-}WqqUncR5K{<9drOD*BxzG#zF>=7&=3otGlxN=xwF5A?G?7vaIK z6!G}xKK$6Hy|b!_^GBV9txxgcJl8=5<3%k~rQ^>}u!H%bep!!kMMwXc@u@53^t&9( z@J~px1Wha>KXJ133w?-L_N;SWT8anMaTvrn(52{P#*Od8j`<`b)^Xi>o-9j-mSY!r z{rsPoVqbU?&&d)D@lBGZ8%2m^pSIVxMKHdVMBeo$@adH#-I5-m$SP4H7!O;xlzrYa zAHt!Ac?XXB4W5?`n@iDVNutc_`T&RbCrNI82?j6^(V73>IGXvKr2Eu&X8kP3ulzdo zGG7!ym6RYKV~bH77%xq^MVQlz{?@NWIQ%o~Usn_&c4MY=TT%dL+KaN}Jm}t%_wjuW z>PIsFJ2xAlMj3LvJRNU{vsbT8LoD%B#}4V3$2xRp{S?e|WIukpROqQQB>F)CVu|~r zyX7-3oFPNH=Ae3Cx(tcP#887MCWqZt3{W zK275J{@m}=CEOz)!)EaHsj1Kfq)JoYWLynSlkHEk@#$%*Z1f}_{7UA9BQv079`R;c zDzZ{iBqA;a*_GsxEY8Oq+J!l7bD_`tad}EM{4D6#f0v0?Tp!cJs1tY~MS`!Uq4uj3 z>C-L)sh?A1>$WuPr(YZRG7XD3@8ej<)^1p;49m<%8tu#Qjk$0o-{L~s9H5x?WkNQ# zo=TRcY1zp8g?x=;GRWJREDqcA@kWn!B|H}ftCFSNwq*37pIjJ{f=)w|Bxrv+z83OF zzE8#3`a~H%E)6#Hv%NQ@z_eweEZ3wUz%EIaTIZqeF7uaWy#5PGa-2M5eVCW>>79vO z>W`+j&%`)it{c|h&7n@I!OS$c_Dhh);ptfFnjpIuay&Cn$N}PwMqL&5nBmY16-zf4mr@;KYPC755PQX|l z`!QH=*e-_kI5`*_#qV{_L6?Qm(sE}u^vFxub`JFwq}f_&3ZM)0}S{(4>qPq5aY4!hckb^KM7W}hgIVfFee~cx}S*0 zx8cl>nELKOUpQxeoCXIr$#a4PvDt<1TXb z#ywJ_&O3@7%xfO%m0s#lE&O9 ztZd1=_{3=R8%I8k1<{y#Q72xLb=32Wl7qAEq5K2ab=O3^<-Ra#!}U=gE$@!SqkLAh z7#)wtyh+scQ4-jPX_TOTqxos%)*2hR0>+up7 z636ciLDA(H+1}|ohWOFmY3@+xH(orw!m;fX^@-RA9rR5cb!%>uUzu^L(P8wTsWVk} z3x%$+qGtc_XZ~OGq&vVi&YOJ%eqg=A_TW3%ag#dIBW|Oc5A*B@hv8o_j0fGqOXlf= ztwM14>u3q+9D+3RiS(X!9j%F{4`z~gkbJe%2VcYLJ>*MSdINzyqhty1!;0|$@6_v< zdoxP19j@cI%4kV`dU=YH)Fg}Et&b?GP7(_~+VxA8s!ks; zcN*(pCN?3Gaiqj!@A0-IS(Yt-hl%8+@jChj-Obq7-qMc=WIswo3F~7<)Zq&U)>Hge4?Sz1bH>d$vVwY6-|;@uSSM5c0nx0V z&{{RYh<=mrk$3p}W4wg059FU=tdnWqh&dan<4yc$n#MR$mj)F2aKBbG;}&^}yAg*w zTQLr~{R1lQ$4Qf66L}d}A2ahEdT)=D>dB3;)1&`%iuboRPL3Pb!~9{aj9~xC8yB80 z#PdPypVDvl3DLb6@9FUo4y?oZ?{`DEZvMNzJ`35WWkg*4j`0@D_qgmFD?PWoMFshA z7HZjtL*AIBT8?^zpS4*Y}$;C z>>sM^`HA-t#lBMJ`>UfRg8!GWGD?bLsUOAjM{iye>%5{QwU)fc6LnHG?mc=lZj#!w z5gQIhiN5t4_>I&_@v}Fmv}Ya3`UWgx-A5mTdRXy1(EFEoX(8j!%zJw*O%`Xb7Z^34 z{%DKWu)dol4!vF>-y}(Tro6;N_T%M-y}*#fL|I0DUj1*Aq{D$qq^@Ouo%eHCbW4=U zT`KX_5&E&jb^qy|IXoywSAWiTLIt)l&N!rkdQe@d18-7`fg=-S&Tq9SN@ILE>m|bG zCW?Q34bqFrm)+wP3bX0w{P+@w*oT+s`vRvp|7AUReb(`^bA2UZGZ*w)#>S(#d$zJ01KX0?oPxAsbWib*!zUAj5Vr16p7r0&@D+{MS$JGYb;XJ9pIjb0P z53HcSOI@}Zuc=SQcwtrz7FI;dh%?nFQAf-6Z>rE~N0c<1S3;lmcM0ntN=DGGWK}}d zH(L61e}+%2%ei@_0uLIZ#dhRV{K9oGj^koU`>Y*U%eq~iXwSSx3wzoj_VXC=BL?vVZZ9C&({ioOW>;#vF~8{!1P~!}Hnj z&j+Yuomy2u8EW2fzkOMTVejK)&Zh?mpU8f_L8Z7yJKxrV{X^xI>*O~mUR-t=JR}i zQjW8md0j2p7et=*#pGk|&OW}LMUQbt8!MiCU9T=i(ut4PoZ$IPoaWnx{erz8;`o6W z=|8v>L`>v~En(azhWdHs=##>D?D;~RD~^&@>kAP>9;ur-k6;nPe$A_ou$=yA$b&MZ zao4nXi+bspW_t94$l0)APhWO4{-9ZI(_t z^3j;*y+!*+xbcATWZs|2{d*GMq6{tni?{xok2QMay|T%N#UD{J;+H~<_&Q2@qX6F+ z>tt$q0fwE35?}VS=xP}MbCbpGRP?5I*vXW%39*Qz9OD&ug+RN~q8 zJ$1rV;?}AG7p_{0`QOdByup%vn{N^1Ybko?>ap{crF^6v+*oHRMyEbt<2@^B`6uIx z^Q~mo!uK$Aw~|J@VSLLqSdxHSrbfw_D262G;9TT1tQRxy@^5C7ric zK?*Fz>$^&v_O_BWU%n z&nid5cf5{&87E3mNu=|A#DrVQ%AOA}Ypeb|laVOg-cW+`KS$w1;EUPqfWObS#<*Z;d>{QlxIgFnCnGvc?>SNsiZCYg_6$m^FJiv&kHKq$bO(*o+@cNb`M>q zT8h>y0kMNDrOA%GLCY-V(uhbr8Du2^lVk9K>!_0W z9}b_-J8%!PYOJKPj6B;_R{!Upp7GvFrqVy|J>6PNH{XNdpVp$;br&vn*7Tnfu{Hc( z@{C+Tj~^^0ck5LcrExutxQg3BocG_ZVr2(w3ELeEg9)6k=$m+YMJ3(0-NcsXD)wiF z;^0-4EF?elCyujWXZoeQ|DE(x(>b3*DsQ9RK`SX9a0iZ6Tz|X5$$M)leoJrRV6v5T zQ{TX@c~&xrzhlSw?mRP$@i{9onHPc|##@Uq{adpit)=P0EfjEn=pVg~@;%lv+29sZ zm#C%n?dxc>NG0Y`)FnHvl2LokAp$DVd_Duudwjkt5N*o&{-BG@hgph0^J@L$RnljQ zKhj^S#3=j>UK(4HM_ZI@iqat+JA)ffuR2V8uSzGbpLI64OV4$R24Wnl$Q}srk8BUmVY~CJ*Z+ z6n@F|I_V-h{%TFW*$e19Of6%mTVFBIT1v8fp}l3z{Ph*InW&cKd%UsLo#R_{g8M@y zx(P?onfu81<8cHhab17VBL9x1B*wVmB*(k3+6k&;OIh~IaU?feibH!>R2o=`J9&rw zGpr;v?+9wLtXRKu41H!;OJcM;+H0)E?^_Q{yJ#&FSf3owNiB(i&Tw^9OX1sNST|Bl zTRc+3Bbw}z`b$9=agW;Jl%Pjm!m&&=97po(_0casBN zsI0_mgbglq;yz2Z!!ToO39`09)K%J#@15|66X$!SJlI%39jaU5yR24^wTHqffB4gbrN>_kq0MdNYhwsYN$? zCGPf6vtNG+Ru!ma+!6AZ>f4Cl+21kFis#>*&D0A~$++u(W66A#G!$<@V}VKnXYa=q z&i}g+JJCctt9!Q%hs-P`c)}jcJYgvv#_vaYYfEu;TTgu%?z68qlCPTfeEB|j_O=qe ztR1kkv?{Vv@4 zMlGQYYcV;8*Bh}Nv8i0Y1)EVFq?XK8>v3(Um3X}Gi}LfRKK8Zivt9;O|B zK8n1_*5rE~kM3Lts@}gKHHCIo2I7#OTHf`XjC0e~;#JZBWXv$B=# ze+@$DcJAYj^Dvs{k6wrAxb-{dCvG;JdG3wsYl=SCIS*yC;Y2$Y*47Nx2f3eS%*E(@ z?$^TUFxRsoPvQb3HLJz^%?#{#Lpu>Y2P6Gd;xj8#NsU&CtHmv43-{;tQ}>kBdX|#e zJ6WmUXe}PL=}KU4?sH@+4)geX%Wo-eY1UFXIa#^+iSt#Tu5|BfBZ;GLD>XH?qH3#C zLc7??xQaC8u&tf!`aV zE9E?Ab%}43C!AlyZ@<8eCf>*BkIJC-Rx++t3mi$e6qBzjS*AgIefbN_nqb5F(kIF# zoE7&-a;rF`N8IIsZGa|CefI^9x&HZ?iJ!qMd}*zf*1;wiEN6UtoP32QirOL^0fJ zC);m6SAL4M6O;S(N|>3wEH!$gH288o?)d>d=~w9M^r3fv{=?ml7(#pByRj!C)^Wex z>Wc1b>A$V-fFVX!;6R~G`?)2`A zceDqcm$XC2-?^Ur`#}4E^Vx#>*FSPyP5BN!o7AFryFDtO+RB{V9_YEuR=Op$LsNl` z1f1)IQXS{zDkG1fwlcimHyFLaPIN2VBRb5T_1Uc_BnF+P&gH9#Hy!On@9YfY+$yb@ z8+seBJaJ5P$2uCXyUfP~XXAVC?Zm(?$+$<YFz4gOLXQ*#t$x@6Q8Y}6@xR@q8Bq!sVSws`bJNgNjs?P_q7sv z!AiCljZ*xg>_s(LQI`BSkDrz(7Ku)x7xuz<;9jk4_v@_K9&`|Mw-L&Rw@%_Sd%W^t zm6Pb4mnes49FgHc-Id;I7a5-NlXAksRSY_fQvx*};$z-jvHy5fbZf^bcS>Bv=k9DJ z;(>>hjT)=OY&b5#dqtV)eniZaKa_^uyq|vE6iGiV!=Lq6mfZA|va+E{>1Io5yTVc_ zH01idxIt01;^R*zmHnMLudlq6r2}kad-h+7c8^+ABX=t$4QerZY^zvkZKU#jG z=e=i@)3J`?)5=%Wytp;`$ZvO}qV?JU9Pt(8mr`FxGDlDl3j20xxwT3^x1 zyGg#v%d;+`8|t7KG&{4d`h>DD$W2_=?@)R#JR+IjS}O5REoFV{tIFV`HsW*Xva)`z zMutE2Q=GPQ9xSgaU-Z$6sy;yZw3l{r_Hy`#i$y||u_enb%Wvw{6PxNWwP z;*M{zf31zQT>Azc=i5lD=GRzs-9}bW%t*C!v+$Y9bs=aH_ezID^7*82QT%n)E_zchg z*!$E;kF%CJtgqiG~)KHA8fm1VGA$8*d25&Zho4l)0}koVQP4fE6O zY-RJiLL~fXE4tJtIG$=N7GISiVGzgdJN52ks@o>+; zrpJ8#G!K31)M9cr2e(?-$nNEt~R4MyeT)NyasAj^FPE&@8bL-KPvZyTQkR zJm3NSqS;xfPOuT%lyr2>wUM2EDHznxR@RW8_xUqkKl>W`%%=TVluDgITlsi32hk-Q zXRmAw-)k$EluTINv=yz6d?q{(cbDd2;y-HY02jc6e!%jPNz}8nmW4mYVJ`2>=hs;H zRnl$^)G>dhmPj+|F#V>Ml6^X8Io|!YM4_Dbx1RZmR>^Ae0#cW0C+A`IUHsnJMy&X{ z1INF%DGr7|^FII3q5F0lne{0iV=mf|SC9O#t~L^{z6;ZGjt6;SnxSqa>#OOhGGV7Z-=<$9tH99yy z;ko!Q67S2n{*MHs=m(Auc}3SA;{VMK!J5T3v;$YMKiP);1i|DVun|}CVs;;CE3MjJ z$D66#N8|;#_OqR|wGKwz6wX-ce=eY+tBrUJ^TS(b8|rqP#VTG;hs&2?_L<`~^*qe%Y$Wpc^LXOV^{7uCPud~F z!I$9w+D1&r2f%Wntqj@ggQ5Ui(agJo<^{GgFXS=|IA6Lg0l2rqRyv%%h*XYq`Mm(F zKVU0^ruma6pYvAai!O1t($&Bh`+C|*Nh)zI=W~hiCDc8$mHwv#$fLvaJAyn6OYNk1 zgAb0_*h$M)K`{H(P6GWdLHoO%Bqva}`>0yXeq=u}?QcV_8&;21%jSMZVKkBJvHB?9 zwB>bwa)oA+jV$bP63yIa<=0N2{dimEdD;K0XDhu^oY9%j*QcDs=yF@}YCM5L-p?SD z6Ien&B{kn2^*ql?=DNX#>tpi=XH3~+$9_dOq%O1**Izs_<%ym2e02iH=uhevyQBDy zoh&c>DKNPrpDPx&9}#KJ&)_R4Lc*maKU2TSt%@UhFkSoWKp7@j|X>_fbdCh`gT z^SbX?qg8ia_Z{jikJnH~#R6Z>(omPl7T!i0(VetLpo>Pl`dVSq-x}&Ukk?P&UN)~% z;m84d3AnT$yJ>$r+BxByXPg)I7l&HdNcJ)tXx{O9UOA$zv8@;eX>gJA5wOt?A4b|q z$V)9gj4plG5)Fz&5u8T427uw0tiZP`3b6h|j$4{DXd*Y=|#6L;I(Vn2n(>iegJ1z&#ix zwqibMJsiw!rR}TjIAmcfg}-mcv|8GUzPn)d1LtwbCMcKeL~~#lGD7TR`T0%Qsp7ns zZbjK>jr2C#N!>AC*T+4$9iox8rQ6WziM@D?*^KicwvwxF2%~7;r^f)a=eQa^HNcKT z_EMfP0I#Pz$dE04VY$OW%Fi0%NtT0{9O?(nbw~1~^@rz9tt`D}goQ7(GH$gYd}Fn& z!ySy`9^6m2C!vade`2;VChFUX{^_5Q+1XCYR!_puS83-LO+dn9`ZYHNT}wF+c}5t| z{i7W{6=$pL#AwGvT$-X0v%}O^wbF=j_E7Zy$oJ#;&>hBh5E5!D|tVSlaQ6{ zAeuYIxNqYqo%anx(oYUD=hQGHuW*pspG=Xib(FI0V-WG9qXci6j$)OgY+ho*Iyo(Q zwv2K1xKI;X|Muft+-yTXd6Oxk=Guv0!wmdGe6xP!eDxxF!pPh>l z9Our|^C;`*AV%L%zqps9yqh=&fvLyDBQ9KNXy+ldbHbD_W@yFaOs4Y9UHZ|%h040g zP7*vbLFv}$C}wAimBn3&AAD{p_jOw7Y>}#TGj}FmOS)2c%0S-;KI;u}bJQS1~&suLS<(BKn6ODI>@5_47qaMeb2C zI~k_*lA~ham9DI8auvOs50up5Zj#tHO-XM<+~M_DIeXJxbT@OApkIzs*XD_0HQ!BY zPgN^=H;;;*oR6_zAp5jEb)VWI z;2H7x$_AzRJ@M}R_Goe2k$isdmEuWGQuwM|dEebhJlfPKRz_M0X!QmD%+iv7s2!fZ z)=Hsmqmq4GftDNHWO%2y%6dPI%qjXFZg(`)C;0|8v=58d zbikVl4)X49FI)?<7bB-0*z}tN`HH(xF56yqkLrdc2ep!^e2@C)j^fp-JJxj5ivCZX z(KyIi)?et2tQJm;|MW%i0B7H=x?saa9;~>z)|b z`(75+-*v_|3D+6l`%1~&N!(i3UfHz7UtA6PDI*Ptds}^{bomq{W%`2^yJG>eJ#3Wn z)vX}Wn>azqbqo}rUgMQNH(VCI;#ta^abZ%H_lt6O@?9|>Fh&`CK16C;O;9}d-ImS+ zrzwM4-4fNl1fYaF}t%)X`$yset_>4e^VbZ zc{5(o+&V46ZD%PHcAgf!y~~v3&=cZ%;4fv4@d@%E?NFKxeMO}nqO|<=jBJk?q0FA< zCk9a?mCE{4tfyY1T)cQ*GCL^$|J|}LepS59y`*f|ex}zACG<`lJ z215=jWq14~*nFL0nBXreeU)M{`@HB4vR2+*@{xewoRv9;FR{*flk(_7fS7erDdQG7 zi>r^X(!bbEf-l=CEuXu{_Fuh~(o$F1elb9qW9=@kU9FXAU%83yCl{q)-*NFUQ7Ikw zb6?E&Rt^my-am6nskrMQmCLP_*w06$^JON8egUJyW_IGTac35?U-av3RR|f zdy@CbQ}J5mDP}D%C_ilHJX}1c?AYTarZ3JY!*`t&*QY_sjguZ?KH`S*igtWozhLF7 zBaA}?hbouo=WRay37SgUb(c4AYGhn$&j*a0YA2PN_vo<5PMVt=vHF;utcm;xt3*3_ z{PGR<+1W{}e)aG%)=1-qPso2`C*f^b7czn!hg_6g$MaVX}A22KBq1#;|c*aC@;`RZFu$nuiq!H z0=56x%i^K0F_wP8$6YVrXl^eNbDzQc8wb{By~Kek+WVYJ_WRh$pbhu2jQ+{)paT5L z_}#ML2N?d+PPQ_i|Cat(a%CyP+iS#UI_tz|^M8s9P!gaK@99No)y-baSx4Z?aWba9 zO`q@WWw^tA4DDerfj5f~zLWpIrX2Mvd7ahwnfIsP_RnKHEw`5v%TiYSIfy^=_!$En zM8B>Cb=CF~-ts=2-5kVcP7%V0hsSk&g4H|dmo9&VSM=N4_IiM@U+knq=o3WHf7JV) zeE{@-r}F=&n`va(qjLQEpC7U95%x~7lc4o^)OR7?D#*lX;;gXw={Q=bMj*KBxciG6fwT*~=VW-&Fc{!7cJp%5hCL%YxxF`c1r!ZJrJ?Y*Z?=>+Pg_MiNFG zv6DpaI6Ne-$v(;ca~JxZ&G+!pjgN_UapkU^e4H2sZ~8e6u@Ts7s1d#4$%yTx5m&Ex z7`gI3Z^hv5M8>bZqEX5CTF<|uu&e{G-y#vYN%Zd?N1~}pBkG*HsNy;`e-(?CZS18% z6@wW|?Pcm-TJpu-?jEsxRp4=1c@95~$C`Bxk{B0-cgGy0>!nEeKIOR=#QgD5#;IAq*YP~#()HBsC5~x* z=>~O=G@`oCI>mMxS-U6%<|~LNo&;fZtVXP++{7l1|1gk`k>_agrx2t}w3n*x?1$y` zcK+ikf*06}ugNVm#nCTa8-^stzjaYJaEX5G7^_fx&-i0I_CHTIqu;$H2sigT$Qqk4 zZ2r?hO6J`}!~zGYco&LCqZ}mE?HWcT@OnRo!>Eb=RDLLoyE(GI`Z~5Oa}*Eik<2=0 zC!_Kr@H_FrV#C`gd~PS|3&iV#H4;wUmsyuJV(WhkGwNx##@s<9{m%~5$vgSqem4#O zzyH`x8;*)92Qhwi1~;BL%Jz+CF=-&$-^!Iw3qJ= z`N3#8{iEOgV6jaj2V45Wc#%d5mz==^+Rf_B%TQZrx<=g>}4VI!n2Y%@9yLq(sFzthB!M?hvO2mFE~nRi9gou;d)N-fNvu4)A-|9m8+3J@>`8~ z!RO+Jcds>KQcE4yFNjwjxFDbFxH9J?Hqq|;6uDzcF9%s`=LV0f^y_`RpvU{uKjj5u zuAjiWp4gqpeQkCE@i*+Hko<9%-*KM~aK$_a2T|Lc!n7|P8TazWic1bMNI8j_vmK?w z+!N>+>L7)4-7!AKK`dGvf&ENJIc(+yY3WFQH&0yJNIzTSjv-Z!67h!%tTG)XEW!&t ziyT?U>j`)I;mNjc*wLH*w}Cr0FV;$Klq;tFqLu0$-msmmrOuQGf<|hk!`S0U3(!hU zcUO#LyxS-H2tJo-Wy04kaQ;OjvHbjk1)NVSFRbfFJG4lH^9A;j8)$piuy^KTpE&ew|GT1&hf&V0oK3wTc9eK|QWKdk+~ z-auf4RtyVm(0!v;My$8yexUz7K!qJe^c&7tpjEAwe4W;qW91}6o*hD3CD*;FBh??A zMBT{&gX^@i#@`O(_c)0g^XRG{oTYfGC3cSFIYr*AKR?@xHq;4w?%Ip#1ADaT;vmJj zjtFq!etMzBi)sg1-NOYZb~wt^U?&(abd-Qd2aK7dmDR_o@6ggo0;``k!Sck+?zF+kh z{BpIjzU4~f9(9t~kR|w~6Z0NPOR#){lXMH+j`Sd{xDu~hO?Q&cHtVpff#Ybf5zl{f zlI7c1Bk+ZjXx35Zasu-ne{O+AM`zLB`X_FGATDrQ3VU}K@iAEf%fI+M`)_nv)$Y^qshQq||&cs=l zhp?W-Sxgr7h1U>g(F-xefUlfIw`&;sU38Jcheqi61MyUTKQs`RE)DIE{RdoRx7je- zXIDua*cXA*>F2&1jyZWpq4!Y-SJ#KrVG!>q#`9)Ee>&IyL=&7caFTJ_kx1bBUg|#{WnBNRb+h4N z=p?m2m_U#7ySv?F?7ZkC>$MYbw*%)#6fGb)2(wI6fOqy*ZD5lVO`oT;6#!#+~LoKb*t$ zd?d#5bBmYGgUJgQ;>&5+r*RP@;~98))s=kp3MQK!kx`u|qU2BF^aZnFGW3XeWK2T* z^&`|#nGP-UjN0Ba@y9<$BzMR(JZ3&kHF6^Kn~%tvU4UdbO4|rC4Dz`k0im~)RgW%` z*F8cRmvB;atHYE?{ZnFeH%^(}+FRbOyRFPi^^)P~kxGvhUSiNXL%FQ)%XJ*Cgpc(W zvum+Rrjs{ylGF)Mt;}UV8 zW3IA!fv=PeOjCMp5WUpg|8aEPaW(J%KXl2sX4mXyla&?M z`aEADSs{CqogFuE2_Yoy&N-b^r#&QM%@9(ekIQx9wpK)H# z@p`_LaX-{joL8xse+{4x`byd6u95N)9~FJwK*>wEseE?PaenZ>%2^{V`z9VMHhXkp zPnFB;4bWqmO6(VXQOttL&!ki+_lQq-> zIb(=~ZUNG?U2TNDRx#JMHS$YTWTlPKL$4+dZi0mc0b-kLh;;53gDwrBOVP-J=FQQr zA>W_U9KB<-l0UKzj23DnYFS%!i_(e>eFUbr12~_&2}-#iTn^S{-i)`X{M%xH&WAi& z8@wOmElI8&U_Z}SiYAz1MOQyDsoNR{cKA^zY=@L;KXGl?4yG(JcIw8gB&PqvGf^^vDp!~KVmHGc0 zm70H&SU2rcMm0~B4$t=}ISo%s(#K88iyLX;@Xc8n*)UtQ*Y+tZ|KjH^J*ZUmOXqR1 zPkAydMSOhS6{W!mF&K78(bk+4+Z--{uC*;2_vtODS0=7mF5G(#BNrglGKj8jQK95 z%cTUFW4}+?!uz&c_bKZ?MM>!jALZi6M6tc+qI`{r6qo2QCBZgEn#O9BO8aO@9}=u+ zC-b&jnDXK1aq$`Kt>n%&;9IPWiw#nqyo{AO)5DcPEu+}C7_Sr* z#7p}80L8I5fxK3@VzGq$ly|stcT}wOi#e*?^oS8Hd4~2W$9bIUlv7p5Bxz2F(jy>A z3TK5VOLrWXre~uR+maKK*F0KjQJN%nrU}aAYsVxkvFWmv!u%vtUsIY+B-yb0@>USIJskN*qIVeH1bXGF6f zIC_@14qs7oz(cytuEZrz{@;gJU{s0+{WaCtMm}~(*YD`v&Qms9R-jgzyO^*qru&ye zQoufyC4aKc%wr$Te&Q+SOa!cVr~khKnIGJVmwv*bJ%7*TFBmnG|HIxtsRtaEh<=qg z&AR;S`?vUKvAdMLe~pzP?y{NlQtA+wHJww2iNrNlgJ0o=*ldSU= zrM$%XzK7-csyA4^^|0JoT8cl6J!Hf753nYGI-zqJ26ZPtIpqyn*>JnrCt=QYaI*P? z{-^l5k<4W{?IEuJkk|Ok=S|-rqR>O0guI5~Tu&*aPhi?S);C?>!)q+-f{pLcNbf17 zn%5YZ;V$`y%CUPm>x{S(`bmk8HP3M8fIH{#K0w56)~mB$;J++)X}jYIKCy0f|L_1y z$qU2yDOM~#EH$=|@zm%r`ISew%(}fP`_RvtAC`M(?!)#!;*9rC@tn5~S^whd|8UkA z`VCmOc8Y(71{*y@U-JNNdpx9fNeMo3|CP^w!n`B$#qret`*=#`@TYjU%Ts1ux{vLw z$1UI9!#ZbA*>&YPs%LsiO^auE*`CjbKZIu>_iNpU=sm?U*M%6tI>eCu z-Bt}e>07#nvE5mREV>K7>GT&hyM@w4p7P4~Iy7OP;xL2rd(U`EYKuF#_VlnkD#?cH z2CfVFhTN0f&y#a7*~C+v1G4dm`?Ip(JiMlOie~CL1l(m^>Ya-;wWpZ*oWUVyFEQPk zgVRU7WX7>;I$cH>wKXn&$%f+9qh?iDf!RpC8?wl^-nDt?)^v}WVfrrKIayEJ# z<8itC5{kJl9$%>cmmFq(@_CrGA#U=&jF=;=pGz;|v4sb7sxBaI9C1VM9GvBT9P;}W zEaLeU5pWR~LwLS@yMlc>{@#I?@y`-|uYEewOR3*XI)(P0hv^4SKwGY>Ypc_^mBaIV zRR+da9Tw|*Cy{yWuzbDG`2{sRj+Q4gpW8#yEKcB60}q*THUVFVkM5)=BD@{HcWpWr z9`=xXB`L%m9Nt8 zHYefDZ=US4%fR$ap0eToNjTi{l)<-CVX>L#%S7tm37%pZb{y`;Ua~7Q1!ezwN=(pc z$V4y6AC!R(cRVHUNg8^x?r(I9ue0)!O1CUjczQ`}`7-dsIBW{*1u)~!qzrq7gF&rC>vxmLJczrx zN#EXE%AJql{!TAhc+ti3n;ete|$YF}(^M?cv}AACOJ zD=yEx(cy0o@hT6*yY0kz(R#!X2NW3SU_Zc9I%EVO`8bcqLmCYI;34L{{85|NyPk>~ z1$#Wj?y5f?eBt$?+7}+gLyP8k!C<{7@oW&xc6dq2CqJkwxnCFR;n2iOdVkR(+TBYU zB&bmm%iGz^OXvM{7R=l4?JakhPk(HNw^V)d#fYz7(pF2~ytB7->#RfZac`+??2lei z-qO2Q2=<=y=9~#VZ0&r+^eX)bbA9LwRl{+Pk5ni5V=eKP)idU{TM$o7+X27!zU+&1 zM#E%o{}*TGsuDlc{|DCRST}8Q!5HF$qOm)1=*V~KwT2HZw@_-|c(}D`-d=K=J zQM(TzwGMTvBL@)Ig~z3rE57mi;1a%z`5DABHQUj&p_gcvA4ZD5mzZtgT+9kD*^svf zRoTS10Ul`f#7jo3b;Ff8-twyL0emj-mY5TJVfo5i;+wf(Yi)1(O%EfWtGDD%az{gV z;>w+zqv_)<+s3=XWuT8_wb_rk++MqqJ&2@l(6WUm_C55L=PvGey_xl5i$gf5^^w8@ z`%wI+ugvQ2f-f^zPuKH+W~#4rY3PnFH9k@@mGdKmeWloWAO4K=mAz4W;GgIt%g1`5 z6(3J>AW!n%S0)?pMfo{jaqQ`dZ8Lnu%gPgz-ucRdd+rFe_mf6H4r0p};;t8Nc)!?B z+HTkn^V5D3`#W>XyYYWV>w#@`{iLbmTr3Us6`z4Kk^8^8b;~rg%=Kd*(L8Lh_7}(b zv#2Bci}TNEu(G8dduu+l#wtmYsYtx&PhZ1g{Iy#pB^PF4GIbyAlc}h9&w72pQZ%}v zmgUv6(B`R{b>mccj8;po$t(!`CVh{28qpQnt?ltvJ`mU_ zZ)CUR{W|M$s-G|C_AP-ik0Yb_tx(x;-5ze>94lYu@vVf4+bB!<7ho>?^68mSg;DKe@AV2^>#zd)IA-!C!u&J+cOme)`cjuo;Vq+nb(P zjdwiWvbL^;Jg0uv$^p-(QhzR90n_fpc}<6`7`5$CI@kLfz$tC>z(KkAOkI(q3H+yUyXfih!eH=MSj4q2}|Liz@a zQE*2DFVT}9=We_HeQcM0Lb1Zh%h-*_bjH;~`GwpDk(P*U5w-4O6Q|Buj zfQY^UQu@IRfBXud9@!la*Q=$ZbSU-r%wSAJ83Moeb;iH(MY_ZPU+Cp3cWmt+lE`?kh_lanuo&BR42x}hQV(zadxo< zu1@il1v{spaJQ>!v z{pHbxF|eT@VO!h;R6HlHjkd(N8h=S|Lf^?_f9bb)BF2wV%YxNoU}vh9)R8v$TE_Kt zoD9do8X0Fa7Bm0QNRIU+Gzid0$=Zo{wJk-eE@UVp#-5SV$Ta2tkkevolA%Ob5f{GC zR1B`3l=9T`%2%_q(qYmS<=2D^$w|#o_N=2WUXrIgFg__Atn-zZa$0gyZYXc+QGd71 zSG+%^i&5$g#bWbGDN^n$Q@>@2kL5L`;`eNEcy?1stdlM|gYPQe+a_=xX1ZeFcT9$a zW+*0qB$2;7t&FW5FFw;QDy>pu#coc%@@2{isp^@beEBUw#@#PaZj~LCrVZ~ZvptTB zrO_qjAM<0PZC0T4D@-EZyrC>^cU;`w7bv$kB}!PzJ%0Z&>2U0xqA5$3u+zDUoJ$eA z=699qA1B0i;Vs4Q*m1FqyrX@@*p@`wA$;6MM;E|FSxJxWD;*K zzpTt35W#-p=gPp~Bk9jCQ);a~B2D9-DaJjbr9=0xO4Z$?(xJ_B#rjXa zZ`&88Z%CZPUVWf+86PA4Y%7)0RmWu8o99YvFZu$CYGZrbqf+$vi_#QF#IE-j<@Wlc z61MoG;yL`76kV-Un$F?-(*9HKx(11ZRUO#w=55yocx@3Xwsv2XU-S{!Hh!X1-q*8# zst#f;!o=X>M`i2c5HV<82hXpOzv^76Bp>JNI@H3tO1;>uXo%_bOO*C7f}>Ta6ppHc zRY`n(c0K%V5GmU({ZNtuBbZZH8+CHR#Biqp28;+5yAh2!k1CkC-%W5fE?ivS*G9?G z5E-(%1?)G4(O2FC!E3@Lc4U40h=~+O``Q4%$M8i9xKxvm+xZ9e-6+u(*2R$@^h5lt zkEFBVlE1$ND$66KXkJ6Snj9&qhE1^CAwbNQw!^xZ04Yywjca{MzqEE76DRpvLnirKvAtW#w!c*VM)g5c2OroTADBiKr2JsP2m>K>tf61>}w0+ zoRfCw@^_$gAdjOp43;?#Es&cOBn#HJ!N~D?F|urnm8E>#r!6*g2$rmX_Bg&ERJIkh z;T(|=)-QkJ>}~Qat;3Zhq)O431Z7u9HvJw)l|h}eWZPu=8k9`-cO)t!JEh5-i3!RD z;|y^rOjSO-Jt;0n(v%^$62&3zr1H6tzN*Jx(EgOCd`&Ay=dNCo*|Qp3C$law{*LtL zth<%(_(i`?Y2U9Hbl+3D*;QcOWiQ$Or~(^%vF>Fb!P-u&*Z%#9vazg7Hdi5v{-Ya%H+_wgSTYV(Zn>izW ze59gR6^$^X(f75^GL+xSQ)yhH!BKJqoM6a^+ea<6R(`knL< zla3Wge(pnF?L9j0@{v(J-@>ihNAhi7qTNqV3AtE;fjOSih`xWXSDrE|?h(en_ms(J z>6c&OC4oN0a5nLhVf5|S5&EHKK0=s1>&X>G=s({}ek^zaFRhofB)*@<{*i6tpI{8} zNhSLVhBxQ>Hh+diT;D}!9%9-q*8PRd<9p&QrrKw4Sxx<;^;2v;<}GipJwVvZ9%$n^ZvpPIP_kG+xe*Vp;T<^c=i}>avgYBN<*-`rB4i@8FUtg(?qQ9cI zudMs<2%%gTN8;=K@!pc3cMaQna6Qfzpzi}8*99=+MYZCgTPySZ_Bq%E#LX zFHz0UN76JeX&iD3V+x7S$R{{+J?@;NzhM$}fu}dHnYd?HQ~|b4rruM{IjFmd*ZSN> zqa1I!*MNS7>#XyJ-$l!B)Qe1SL&Z9J*u#5xIMPQl8{b8yqYraBZ($m@+pW3?>NMWx z=kGD`m2vafZ{X`CkDgzGquxuB_nwErTQBiDcLs*l#4$tjkoq6}cU^PQbAz`;X>w32 zn#X-vHp+RwBKaytFXH$Adl3N#ePma=JX|RBmbl*J85;Y@h%LgV9ZMDCyD zD=_6C~2VqY1Ef$mw2xC>~wVh>@Dm3)6i&) zj~F^8sL!2B#Uq`sWNA{-?U%1?`pRw?6<16>9qi}1fuQ+T7 zgH;WWo8$!Oxc{maAH%mC;<{$hc=DT{ShWblW#TZS7Dv#Cde^j(G3cJf{S+O6&4s@5 zBq##g)qXPKW+;yJ<>M!h!F&wsQs!HK*89nXe`4{2xZ}x)Xhcz0(4S*}!~%bryetf7 zpZQ5ucs%@0@qOXPaPmJtS%6rKxaB98(vPCLjlUGPkHG}$k%qrVqNF$L+Le(gjw4

Q@X(zZb?W^_@>x_U9#)}8uRTm%xPsKnt_2oC3ZOQ9sdf#>gtnQ^dL zLi|3)9|J3V#XQ*${Zjp;_@p-u4&wUfX;8DzPtI4U5Y(D@qn>?kNpQ(`teZ0}Bqput|7JvmSi4SAc$o$0fxN9&T1^G&&YauAPKzzAT zk5BA(beI_g^*vuP+#Cp_jehdBl^!cY{RF0gxXJyoZCwaj6DLGW4nn5Azf^V#M%WwT ztH1P^I)UpkV-Iq|xc&}1;clRkE~eXY@f&rq_xtdsvq}a>y5R3wDk(a&6LyzW(mHns z5{Gho)^5l0%PMhB-;d(0Ri8MIY7Tm$?r^_GrXz>u!uat`YlmCv55x z!1{P6=N1xo2z?meh|9@y>>5Y?v2-t-h6hO0qU{*{SVNv>AEIw*q_}23%+>|S57#{y z@gH@w>YeCBoo(8}!+13|KvcU9A-PY0Bo90YPyYZh-r)*|Ljj`a=Z$%w747)lxa6pl zagNR?wDJ?bw})ZM{j8s`52qUuFMsyLHw%B66LJVMe2BXbxpD3RaPjr0AeE7o6u?$^}J3%5hEqLHe-3t(6)KpY(B zVez~Gu^%-JYwQE0YS(PEKB1A;H}Sr$^uz#h zO7mjiNo>BO>h1+2{ZI2K^M z1WNwIB^drbP^u@*g^{sNs-|zmFTGB(Lf4=$n|y=SDx}}gN&K!=h|Uj^q=pM{a24Nw zZ4CzW2$DSVGlR(^IL_LF+l|yxde{LM$Ri|awxH*0HTCO_$f!?!mA~&d1Ktkbgaur; z(qJdFN!EyET?Z_rK5KN|5hh2-i@e{6HyPv$Y#mWCmHMp9HdIt<$!|C!>OzEUJJu1G zw@0vk?1sh%Bc;^P49&kpkq7UH1YMN$-qsCPOQR%gs~LWNqp!MKN9Hm`i%&u~L}f%t z4s!_{4#r5A0qiHaM?6>B9ft88i*`ixcDsWj)G31;#S@V=Ep;%L&FhhMBHR&(if**MTq{o z8PflX5R+BC&~!~GbLWO3;t}y%|3OIT9Kn1Gb65@L=d3n|#SVV{P)kfuhe^@+VR&*R zTvYUbBzZ=Ps(&AN)r*wY*?n=Ac+EazG#;D_mj(BR!Fo79zhV$vxu1)+kHwOFofsyK z#IdP?GN)`PIO|oiHVnqhpdj)#7N{Dnlk&zksF@KcVUsLz%OHry+i>hX8Ym`>#-c$n zkF(noai&|4xD}2hkE0j2$YFSMAxO5VhohBepxCXpfo6B07?n@KhB10EBM-A+daxAt z8HPk%kUX-r!5haQQ9ZUrVn_Ns-dJN|Rxo`fmYDlh&zx3EI33{QUK6muSTB!;*x<$R zV6ks+4YLBSW35q~4;3u=UN*=L)Qh&REwastb1#!0TEN@tiFms;Sc+hak*`C=@zogO zR{9@&Ccxb~RE&(qpk+g?xKvKW4Eh4hhE9TxehbSwwy0j7CH=CClm$MSlGNy#QWvMB zyu)K*S}Z3QO_^k{#CI!m?7IKWhqn2~3 zl<%mES-VpuC!+zrrl;`#|97+w=JtK5k0+`lQr@Hvru@e~lquhod{rF(FKU#q@kb=< zYeVe*9w#;)hFIuIp3AT<`gMz;zrQ~8r(?zbVFR=|5zid#I{0}cUbGhsaH${ptyT?i z+mgPe$VQMYv65S>8Q!Om&zai-)6T|=iDN@NKM*IjZ<-LFB#6W6`Z#Q!z<#2J*fsXJ zEbwZ`JlJD$C$%Z`bB~JKpMS#iUA#0p*9^g%DytjLcXo28P2CMU*b|*H2fGP{g|s^P#!K;p>6P8OMc~Gb6g+6$D6f5w<(d5zPAnP zknf5g(-0d40@+ZXAzZikKT-C9d{?iID2Rxaa^{0* z`yY|8m^SF`aD?-SOrd%ZDzOPBs5!y&@NNgVY56`4iUEQ*yJbP}ap)dMAIyr18XIt-fIT4)VU|e&ERq zU-}`ckxcy~Zt+*7b@pSrjm!k*rg?e1{MDPm4qyPkB4hjQoQah z47%~QODRsUPSrO0gafyIWZK#l;Th@``H6MPLv(BBFUvZV-b&9=3@av=! zw-?V~#~_RnPIYQYCNKJVbd6@xt>5C?X$Xr7OWK>SpP0i%}3oo$TWi+~a!XZGDWfF20;= za35>(d?k~4j;{mM`iY0>HH^OQCt-QF(1i7HT=VPb!}Y0Z zpN|?t`s5bh!$z*hoK?5cm^i|9Rv~#P;xx`}jNp3NrCx(4^_;ekuEPEr>uU8aSRW>y z3cQJCZF&5hRyD68}D-tV#j-aGPy%G+85I=*!waLlGkXx z=semir7kn|EM_+(-dcPX4Ql*k4nL;{aj!?kW#;Yi{M?<3$9srB|I0!8d7h`Uvf<&& z>k9J=-N&jVwZVDB^E%S_c{YYytHjml3KmRKN$i1(_~V62@|ly~hR0QYr!(;Aq?YG3 z%rAea5)*?92%`bpTr=Y5w@5*!dMZgAZ~{Nx`-{n= zbS$R-QGY2FS@aVcIFLVyPzkC}V^9G1U!QbL%jESiEDgP{6AwA2!Y@xHKN_WA&p5Ss zTuZ{S{%X1RG67fX^Y_i+9KzLV88$7Ie3x3xyQa`jsS(wKB&?gKmhxMt(aoE_<=j&^ za$PM&FOo51fkyItl96{uEmk`-anD>M1p_k?x|4eDtW-={r4h&d$1&`phCFp53Ou>L zk&e_XjfBLcVR(Di`Nb!YyC{HsLn7`h50ILkNx0D5Ut$(zz_bPN^01S*u*qMF+)rZ% zueZ-TXX20l{AJkN(^zjoAMNB&6c!TSH3`SfIU32o9EJhe#1V_4U|6G(80!dlcM1@@ z*bvyO>7Sht3(Fe;%!LYrrkPfpQbW){8z5Pmqp@TLeYM4$*L9x0-I54I{^ajb9mTed zT5(+%jidD4HoY5)y`TN1d|^C&TPlh9eiXM7d40JRjwKK1M{OSlr+!@jkOW*zP)Yoh zV^DE@^_+ipPQ&wPVJvokU|;3_D0sT5r852~g4S_e`$a*S%I$d*hxIqqvhH{+QXfzs ze-@3|-_>$vT@+rHswHiA0zOhVjQt}H1IyIXJop&4#}LQ3+wvIXm6~4uM=0j25XklcYNO;b*=?U*-1ax5GU6?>xJ)6 z)bioB7FXM7*te&`y;mCXDfNMA9&vJbF!md1q)}Hr>hIUcfXO`Dv~6d#6X|e{_rV$U2sb*4SgR|kncXfKjq1phz3(xwM-i@_e$j?{}?!+n@` zfPU+CyYXAOUb4Eo;^_NeL8=Sx{TCu8P4~doEJWNQoKcJT-=p;*I6VrGesvCDiM3YB z3ie?y@x0G?=0Gmjibdr?x$JC$2Sa zh_DEhQGxrh=@i%J^Z}I6KVH0gFXrqc-*C?p^A7U3d2kT<7XxM8_kGxSI8eU+>4C-_ zf~53sccj(}lByA&NJ{7Wm>wo?8pJuzZYY{SJQsZcn?v-neC;8GIYvl_-=-mKOC;y2 zPel>yRjZI$XgZI5+F4WaGAoj~$8*qSbF`REpN1n2QRLHSVyucf=*RhR>%>0n?X$6F zF!A?+Y0Os*mJx0X;7~+-cWpNOi$cX`z%*nvq+j>rR0OUKkwz;QBI7`)SnivN$xTAU zFlYtxyhCKp6FZbsC(WO@0Qy$!+m2t19{a;2@5f9`B~CAlpwHzyardkR(6tX28}|KF z|4v+hA?S8e;KwqhDlhi9WJjA zm!k0bSluf^dRxuG{3D@K7O@Uyd)cqxwGwW9!llyO4o_SnWQP4h%(@vNs^D2z^dgjV z0ykk!ahOVE(=x4iV>vZCHjR>efRl=A$k9Djvl+!QLuRoI5$- z%%&i*8@LXYxj~$_vI@P~r)_g%34To?zFxHg``eNCsBMQwS@cot*oqmQg2d;=CYbv$ z_swS+eqYQ!g9cmRWTBU&J%3|GRFHIOLw`&Uo)3@LVb6Iz`-wLok9w=mvo$!^B3LTV zI>D3YgX5kpFp1>;d9x9L%#Ry)*%8y8g@|#+Ml50rxE9yVw+V8uhSi{@Nu%} zW4pmfG;y2X5!1h=N^FQ3Hh)Qx@{49Dv`rC%pS=;)KaRQM9WnR$F|m8t z5j`^#M6c_B1`QIV{COw%sff?IcE`vo$E5XNJ#cDQ66dpYMBX*}72-N#{@g?{{L&rk z#>F#lt`~d`9+&*(UD0_PeH3NpIJqZYqV(pd{*@$EnP!-5b6oPqn&Dp92`Sv)9nEj> z`S%vE&rB56oW8jEI$pZG8-R`jlEfsjFW{Xh>tqm8|7EU1!C)+Np)X=dU*=#YOHx4} z+}y(RBhVZZejbsedS>hkiji%9^g>*VBjm5m;J7DR^0r%`L>(hxt;}&KGZH=e|C{&sh?t%#LU@?D(<9FYz;EujAqEm4;(@SsVoq;oq`9f^Af^~MB8;>N#+ z!eKzHwElZAz7CHQ`#$~fbWOm9@s$3Nt`1;&=gh)2EQXwdB#^>lNn zJ09VD5KH`;d{hkI55uK3v0@M)7~15RSOpJ7M3-18svHKx=SRgsHwY=eGhbrtNEk%Z zXK`{E4z}Rq6D;v}9{m&M7Fa|aYUwqe{dY&Db>JxY*NK zNb;4#aON4WOGy^E-M)FTh zKuPBq>JQc^B0pM^H32J~$&;E-LaP_iV!V11@_zAmb)Jf*7uol)(gxcn^SZgl78iGg zNpI~07^Q?tUN2j?WQK{)Y+JOSlqtrO8^XaZLwb*Dh|rtaQn;@H^2cO}Tb+jN56qC* zI*qZuGF|je#t7MzEoSyj@Pv6G`5w*TpLa%z>o>=|BiYi=xj8ahWQjpaGejUm49Z%g zM=SDFOz zf6vYK*jq)O$*l$cSj@c5a${6xriodt-*KjEGUr`1L;31du{CTC=Pu-%PB+KGTWK=n zLo@20eBXz*_`Ecgz8YiL(O+b-zZEK)ofMUITO7_vk=8%j;L+V=$qH(VNq?kC*_AeE z|Lc@AJ=+#u?4$AUY=^44sp1;>Cx*u*OL4=FICnFF^8(tSsA+rmOr7@s-@y{72XA_S$}>-Bj%x69R7@#zq5|(@r(J#8d=l* zD|8by62V-_O1(w~FZv00>QLITU*W_0KlQKA&NhyEzVrL{JIrfot%KY3G5+;;CZF0G}$=kWpWTdHNi)pzjmB2GQ`2LB|g<;ll#%-E@xo(;Bz>S4THd5$`o`AdWk(MVQP=69^qh?%@c^RH?iZ*MV#_YKsqQ1n?N+biB-cZP;@ zcHf}GL+VF-|1J6(jeAtUVpITqWaW5sPb10Xcdo|;$dkf1Ff$L3U8S$FbySF_@JjNL{^{kx_(6*9zgMB3_#2INO&(ODnMkd^Tj2D|V{Qr7@$Nn0LCm#|u zLnAXzJcm^kabMRb*k7iRMZ=45<4^jq?vUqc8z2V?USL=e{f)Pa(Q8eBEY&~40dD^- z=6!siUX@zG`3a!`oV)l8nP~wM$M4ztK0vg69%5Z9t$0NhA*U=r@|`(P<2UMG%nh*| zsFiUYo}fC7{do%ec7Cz0|NaE}J?w{66>~lXah%l?9IO{09(}LCXL^8?xLrrHn*s7* z-c5v?YGp#d>nP;9+os*d&~EgF)w+p6^o`oIxPjyISZ5d9AYZPPtZdGioXF?D-{o9D zuDkPX)IUT1pZzt@K5OODH_o;DLnl_8$2fkXPHeW{!mta(P0Ss+MZ9JB5BqO6=;Yq) zeAG%-%N+MRh@~&KXS_) zgk;{p1Nv{1Jg(#3RgH|Yy^H9lJT5=oK*lHfNxv52=D+~CbL$og*9VBx=o=_bARfxS zhoMfy*B?12WL1E4I(ZxKh!Y=8yoAKRH8LXiJX8@HY4AP=MQ{0eOPHrYy|~al4`=f= zvT`W&(HIBE@1=c+nsd| zIlK)Se->9eYsGSFHa1beyL2NDKc8^_{kVX?xQ=d<&p>mX&)>L$cf)it+2b<4{!ZPo z|9RqZ9s9}8P{$@Ny><};vvlG&=^RdP)k$W{^H|w3Q1(Wg!Q`hpar|-?K__*h+MW$9 zZ@o5N!Ij%O*)`%KdJxCigkFGkI(4RB+33mRdV#`xQ0|u;RT8@7>f{ykFz%=6q$W2R zJCzbf|A-aU}wv7f}hSovaa_D1oYR7W#{9ZSI__-%u@rQ> z&%W2|$I*@Wc*MIjm{TvUT6Yo|#CJt&IQQ&}R=Tt}jyoNBJWB=|Z`aB!_cRzLXgQ}k z8P4Cda-U5r=aF6(T_k?yednH0NT>exTos0azX!9f3CEOH!Llwk3N46(7rl#s z$#vod@-{=6Bi%G67CrboUCu|~z&V{nEeT^zhL-cW6EN}~&+Adl9hpm=u_gvJ&N?yr zJqlJIxc^cjal$%Kaz{j<6>)ma>;&vj;p_UxA$KZ|7lUJ*BNHeG;-Zm!Hc&nohobo} zo~J{O!80+CIS)rr=PGr}R?%qPKS*9RkANll3`^5+#1Y@OogIpToIokcjzix+x&Lfq zFvK%R3{s=;M;3kco5Nu7El_&4NWj0_g4l0!lst5h4_?`Yir&?i^X5V&;-we#n?gAUf_Wk>iT^J6!nA#u zoM--Mp>>%2P*gaZ!#?*@-nbM>z5iJNrqm7+`}G<$3=5L9AO5&WUvW$NbDX*Tw?+hF zVO#cxzg44m1-EyxKl*SxN>Y6>s!lNb<-9RyFZ~fKe9+%MNH!bmVM%=0bfFF{`MNCc z0G!CC-n+*i_Q!d9)E5VD28o{seK9|S+v(sxhB)zn1}6W*^^;VXH=a8DIA3JC z1WRcJHT?2*sx?QFpo}3O5kCFf^stOU8Os-F_5Xqmc zM+tTKw8lD|_X`o{@jA>WpA!F1Fa{7Ompu=`ozc{#F9*YJX9W4D?YQ|NocRFTVfQGU zINt@1P7zWzVK+23kuv8Hb4dn8ijT=&n9{e9WVereQ>0Yx-pRhk2uYpqfzmWQy|33I3iaPUNSe&G9p=cM{QkN`G z_y=`X6Xym0gMD7Xd_uu3<_PU|k zAViEF9KvhI5Gl;xht1T#ZNm3s7;$z;Js0RA=_82Wfv|v3vG{El4mgEKUfaXCLLOw= zYBy}3M?b>E1MtcWm0j`sVCEerXNK*?lEM)2I^}^2dcH5!4e`|TrqTb?!97&GJUy`} zC{)ZR(|5BjOpHPg;w63T#YG3vzhSrx=yw1&TZc=0Pgm6N@m(Gs@E;N`Bi!AvF)>^& z{W^gCOTyUaau{J9>2Iie7-{AavhJiCGPZHQJl>CuH~6{~4-8J{^W>fO(r^BCCVfVu z_0o8*2ZDa;WwV<*njO`1zaNIKMlZJWJ+aG(zJMOg19Cks+TBx;^EpW@J96I081{u< zw#CbZN2QQCs%;(OQHsKBabd?X zaT~G(of{nE{G_EYo}0kD-G%s=AJ6~ug;;Z&Ig2f3Vfbl&UmW|Zyb|P5#(eZ(?qF%c zeC(yZJMO?t6#ruXL&vG~@yCe4(y6eW&3p@u9Zu&G4_eM<{T9ObYctlEarows9 z5wZPkCIS}{hYntXxX2h87d;=x`^QSzlxaXfw0PWHi3MGbNS9knFqXLAuF+Dw9~L9d z%!Rqv=BV_(H4|Q&h}RQlqxa=#F$!D`F&;0xiOOS6FE3TgNacRa;QH`C8 zQa!(C)Ed~|Jt9RdS0UuwQT8=1M+fTe`7ulID&mN^F+caioTIWJZ83)b#=H>YO=$G$ zh{Ru5i$!yfh;i4AxbP`Pa(iyTkJ&Nen6MEc?C)?{z5)?b$vM9Tu9ic$udnA)aCq}h!m;3)E^hRWJuV-J{V=4F4g3}tO8Do zLytZv{YihzHVb4tPZ7&AgRrrEI(-*?;cc2K)f0!}^)mW&E)C+mczzzA-}X9HEc8Q} zf0j-^)j%xVM&C}#P}nCkhvU>R)C8qUe#vkQ9m;k2dkB4~snXhZ6t*wR5VwNiSUs5i zTyKHBfAW0;1n2i~e#p{cnC!yWy|d1s#aoAitjd{@4SX7+BIW1Ng|LBz1ej9`8FKJ@+#R_k~(En0195Jc9 zJ`Nv(+6m+}{~C%0%=xfz7={mq$EDw7!Jb>mqII@Fo2n!ka?}D-q7r3>ZX_P}OcA5A zgV5<9aBxy6?7 z$vz>L!J{$Snmq3jOZ;;*MaFdz=I`;ky@tNDImw(SI|juyY#Pl(M18yNqdBxSBPIOCWiVgBRLF_JvZ^s&$!Pm!jYNl4C57Q-$! zxIx}=UH`G@WO`Im^Q{qS&peUcBl*4LALot4r}pH7gMoGT$kSTz_;aF4<=%HPP~}?H41~|m=qRGBwrsV#?Pi;!d3F9r)*Jt zlKpthg|?p;FSa(;=>Lx2KhOq)w7ndT&e(ES!QQx!!m9X0spd{ȝ(B!zf^Lg~q|^A%*bvA* ztH%}4|D~5XAAX{`r(OzTzhejM;_AU)@oK(ScD1g7E%Bg7=2vV!LEUb_XC%F1-G8Z? z^^#Whj{J!s^@yW;e8q%S)a%CmfO&{cD(LsIiP3RR?iVcT5-7Kx|3Iyo)HAGJq17$o zz+%p=O{E@n`5kecPRy^phAHvDnZ=)wG9XYEO)EtP`)F<4Ut&XJ>Kz9@!S?qc3CsF` zgK2>>q`_OvZAYDN=^Gfmp+AxD?@IhOqvAC>s<@rU-eJqHAh|={DVN*rK>o+HIdzgh zUcrw(#4fhwu%u6R$e2&q$@<=;?|bz6M=uU7-y&xZ>x}lLc(+9>lifeTTCJ7A^*>

8+sxR~qY(#DSvu1CpW&WG*Bez#d= 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�WD$5a1> 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

KZ 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

Kd($>)>8B;ra%7}kxZ;& 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

odTTQk^i`Slwq|;mNzaZe2h5=d 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 UT-iBHe58S%ZA2gQH|i$$f7kDhO8@`> literal 0 HcmV?d00001 diff --git a/source_assets/textures/pebble_bricks_4k.gltf/pebble_bricks_4k.gltf b/source_assets/textures/pebble_bricks_4k.gltf/pebble_bricks_4k.gltf new file mode 100644 index 0000000..6043300 --- /dev/null +++ b/source_assets/textures/pebble_bricks_4k.gltf/pebble_bricks_4k.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abe2d69811650bf94f75867c72ea7c16734e0d5a6a07a4f36bef1cf347ec9120 +size 2788 diff --git a/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_arm_4k.jpg b/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_arm_4k.jpg new file mode 100644 index 0000000..2c8ebc4 --- /dev/null +++ b/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_arm_4k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c918907704ae266e2ccef6784be62e64de67833b3967b8acf41c833fcdc5b15 +size 16434309 diff --git a/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_diff_4k.jpg b/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_diff_4k.jpg new file mode 100644 index 0000000..9801ee9 --- /dev/null +++ b/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_diff_4k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38993a7b7efb9c037d12b99bbb464c0b46ab9f1c1d0ab93e5370452b7d61498d +size 14259465 diff --git a/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_nor_gl_4k.jpg b/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_nor_gl_4k.jpg new file mode 100644 index 0000000..6c32003 --- /dev/null +++ b/source_assets/textures/pebble_bricks_4k.gltf/textures/pebble_bricks_nor_gl_4k.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:565457e7271e8546d938ec17505f9565a734769023c1cd0438524e727002bbbc +size 20424876 diff --git a/xtask/AGENTS.md b/xtask/AGENTS.md new file mode 100644 index 0000000..ad70ca6 --- /dev/null +++ b/xtask/AGENTS.md @@ -0,0 +1,8 @@ +# xtask subtree rules + +- Packaging, migration, validation, and headless commands must be deterministic and scriptable. +- Packaging is a slice or candidate gate, not an inner-loop command. +- Package tests use compact fixtures and must not require the editor crate. +- Repeated package builds must be idempotent. +- Use the isolated package lane; do not invalidate the fast editor lane. +- Run package-focused tests before any full-workspace gate when packaging changes. diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml index fcb40df..df85115 100644 --- a/xtask/Cargo.toml +++ b/xtask/Cargo.toml @@ -33,10 +33,16 @@ name = "upgrade-project" path = "src/upgrade_project.rs" required-features = ["validate-levels"] +[[bin]] +name = "process-assets" +path = "src/process_assets.rs" +required-features = ["content-pipeline"] + [dependencies] walkdir = "2.5" scene = { path = "../crates/scene", optional = true } shared = { path = "../crates/shared", optional = true } +content_pipeline = { path = "../crates/content_pipeline", optional = true } settings = { workspace = true, optional = true } serde_json = "1" serde = { version = "1", features = ["derive"] } @@ -48,5 +54,6 @@ libc = "0.2" [features] default = [] -validate-levels = ["dep:scene", "dep:settings", "dep:shared"] +validate-levels = ["dep:scene", "dep:settings", "dep:shared", "dep:content_pipeline"] validate-samples = ["validate-levels"] +content-pipeline = ["dep:content_pipeline", "dep:shared"] diff --git a/xtask/src/clean_target.rs b/xtask/src/clean_target.rs index 775886b..31be03d 100644 --- a/xtask/src/clean_target.rs +++ b/xtask/src/clean_target.rs @@ -1,410 +1,13 @@ -use std::{ - env, fs, io, - path::{Path, PathBuf}, - process::ExitCode, - time::{Duration, SystemTime}, -}; +//! Compatibility entry point for the retired age-based target cleaner. +//! +//! Build artifacts are now managed as whole, sentinel-marked lanes by +//! `scripts/codex/build_storage.py`. Deleting selected entries from Cargo's +//! internal directories is intentionally unsupported. -use walkdir::WalkDir; - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -enum Profile { - Debug, - Release, -} - -impl Profile { - fn as_str(self) -> &'static str { - match self { - Profile::Debug => "debug", - Profile::Release => "release", - } - } -} - -#[derive(Debug)] -struct Config { - apply: bool, - days: u64, - target_dir: PathBuf, - profiles: Vec, - include_artifacts: bool, - keep_incremental: bool, - verbose: bool, -} - -#[derive(Debug)] -struct Candidate { - path: PathBuf, - kind: &'static str, - reason: &'static str, - bytes: u64, -} - -fn main() -> ExitCode { - match run() { - Ok(()) => ExitCode::SUCCESS, - Err(error) => { - eprintln!("error: {error}"); - ExitCode::FAILURE - } - } -} - -fn run() -> Result<(), String> { - let config = parse_args(env::args().skip(1))?; - let cutoff = SystemTime::now() - .checked_sub(Duration::from_secs(config.days * 24 * 60 * 60)) - .ok_or("invalid --days value")?; - let candidates = collect_candidates(&config, cutoff)?; - print_report(&config, &candidates); - - if config.apply { - apply_candidates(&candidates)?; - } - - Ok(()) -} - -fn parse_args(args: impl IntoIterator) -> Result { - let mut config = Config { - apply: false, - days: 7, - target_dir: env::var_os("CARGO_TARGET_DIR") - .map(PathBuf::from) - .unwrap_or_else(|| PathBuf::from("target")), - profiles: vec![Profile::Debug], - include_artifacts: false, - keep_incremental: false, - verbose: false, - }; - - let mut args = args.into_iter(); - while let Some(arg) = args.next() { - match arg.as_str() { - "--apply" => config.apply = true, - "--include-artifacts" => config.include_artifacts = true, - "--keep-incremental" => config.keep_incremental = true, - "--verbose" => config.verbose = true, - "--days" => { - let value = args - .next() - .ok_or_else(|| "--days requires a number".to_string())?; - config.days = value - .parse() - .map_err(|_| format!("invalid --days value: {value}"))?; - } - "--profile" => { - let value = args - .next() - .ok_or_else(|| "--profile requires debug, release, or all".to_string())?; - config.profiles = match value.as_str() { - "debug" | "dev" => vec![Profile::Debug], - "release" => vec![Profile::Release], - "all" => vec![Profile::Debug, Profile::Release], - _ => return Err(format!("invalid --profile value: {value}")), - }; - } - "--target-dir" => { - config.target_dir = args - .next() - .map(PathBuf::from) - .ok_or_else(|| "--target-dir requires a path".to_string())?; - } - "-h" | "--help" => { - print_help(); - std::process::exit(0); - } - _ => return Err(format!("unknown argument: {arg}")), - } - } - - Ok(config) -} - -fn collect_candidates(config: &Config, cutoff: SystemTime) -> Result, String> { - let mut candidates = Vec::new(); - - if !config.target_dir.exists() { - return Ok(candidates); - } - - collect_flycheck_dirs(config, cutoff, &mut candidates)?; - - for profile in &config.profiles { - let profile_dir = config.target_dir.join(profile.as_str()); - if !profile_dir.exists() { - continue; - } - - if !config.keep_incremental { - let incremental = profile_dir.join("incremental"); - if incremental.exists() { - push_candidate( - &mut candidates, - incremental, - "incremental", - "safe Cargo incremental cache", - )?; - } - } - - if config.include_artifacts { - collect_stale_children( - &profile_dir.join("deps"), - cutoff, - "deps", - "stale hashed dependency artifact", - &mut candidates, - )?; - collect_stale_children( - &profile_dir.join("build"), - cutoff, - "build", - "stale build-script output", - &mut candidates, - )?; - collect_stale_children( - &profile_dir.join(".fingerprint"), - cutoff, - "fingerprint", - "stale Cargo fingerprint", - &mut candidates, - )?; - collect_stale_children( - &profile_dir.join("examples"), - cutoff, - "examples", - "stale example artifact", - &mut candidates, - )?; - } - } - - candidates.sort_by(|a, b| a.path.cmp(&b.path)); - Ok(candidates) -} - -fn collect_flycheck_dirs( - config: &Config, - cutoff: SystemTime, - candidates: &mut Vec, -) -> Result<(), String> { - let entries = fs::read_dir(&config.target_dir) - .map_err(|error| format!("failed to read {}: {error}", config.target_dir.display()))?; - for entry in entries { - let entry = entry.map_err(|error| format!("failed to read target entry: {error}"))?; - let file_name = entry.file_name(); - let file_name = file_name.to_string_lossy(); - if file_name.starts_with("flycheck") && is_stale(&entry.path(), cutoff).unwrap_or(false) { - push_candidate( - candidates, - entry.path(), - "flycheck", - "stale rust-analyzer flycheck target dir", - )?; - } - } - Ok(()) -} - -fn collect_stale_children( - dir: &Path, - cutoff: SystemTime, - kind: &'static str, - reason: &'static str, - candidates: &mut Vec, -) -> Result<(), String> { - if !dir.exists() { - return Ok(()); - } - - let entries = - fs::read_dir(dir).map_err(|error| format!("failed to read {}: {error}", dir.display()))?; - for entry in entries { - let entry = - entry.map_err(|error| format!("failed to read {} entry: {error}", dir.display()))?; - let path = entry.path(); - if is_stale(&path, cutoff).unwrap_or(false) { - push_candidate(candidates, path, kind, reason)?; - } - } - Ok(()) -} - -fn push_candidate( - candidates: &mut Vec, - path: PathBuf, - kind: &'static str, - reason: &'static str, -) -> Result<(), String> { - let bytes = - path_size(&path).map_err(|error| format!("failed to size {}: {error}", path.display()))?; - candidates.push(Candidate { - path, - kind, - reason, - bytes, - }); - Ok(()) -} - -fn is_stale(path: &Path, cutoff: SystemTime) -> io::Result { - let modified = fs::metadata(path)?.modified()?; - Ok(modified < cutoff) -} - -fn path_size(path: &Path) -> io::Result { - let metadata = fs::symlink_metadata(path)?; - if metadata.is_file() { - return Ok(metadata.len()); - } - - let mut bytes = 0; - for entry in WalkDir::new(path).follow_links(false) { - let entry = entry?; - let metadata = entry.metadata()?; - if metadata.is_file() { - bytes += metadata.len(); - } - } - Ok(bytes) -} - -fn print_report(config: &Config, candidates: &[Candidate]) { - let total: u64 = candidates.iter().map(|candidate| candidate.bytes).sum(); - let mode = if config.apply { "APPLY" } else { "DRY RUN" }; - println!( - "{mode}: {} candidate(s), {} reclaimable in {}", - candidates.len(), - format_bytes(total), - config.target_dir.display() - ); - println!( - "profiles={}, days={}, include_artifacts={}, incremental={}", - config - .profiles - .iter() - .map(|profile| profile.as_str()) - .collect::>() - .join(","), - config.days, - config.include_artifacts, - !config.keep_incremental - ); - - print_kind_summary(candidates); - - let mut sorted: Vec<_> = candidates.iter().collect(); - sorted.sort_by(|a, b| b.bytes.cmp(&a.bytes).then_with(|| a.path.cmp(&b.path))); - let limit = if config.verbose { sorted.len() } else { 50 }; - for candidate in sorted.iter().take(limit) { - println!( - "{:>10} {:<12} {} ({})", - format_bytes(candidate.bytes), - candidate.kind, - candidate.path.display(), - candidate.reason - ); - } - if sorted.len() > limit { - println!( - "... {} more candidate(s) omitted; rerun with --verbose to list all.", - sorted.len() - limit - ); - } - - if !config.apply { - println!(); - println!("No files were deleted. Add --apply to delete these candidates."); - if !config.include_artifacts { - println!( - "Add --include-artifacts to also prune stale deps/build/.fingerprint entries." - ); - } - } -} - -fn print_kind_summary(candidates: &[Candidate]) { - let mut rows: Vec<(&str, usize, u64)> = Vec::new(); - for candidate in candidates { - if let Some((_, count, bytes)) = - rows.iter_mut().find(|(kind, _, _)| *kind == candidate.kind) - { - *count += 1; - *bytes += candidate.bytes; - } else { - rows.push((candidate.kind, 1, candidate.bytes)); - } - } - rows.sort_by_key(|row| std::cmp::Reverse(row.2)); - for (kind, count, bytes) in rows { - println!( - "summary: {:<12} {:>5} item(s), {}", - kind, - count, - format_bytes(bytes) - ); - } -} - -fn apply_candidates(candidates: &[Candidate]) -> Result<(), String> { - for candidate in candidates { - let metadata = fs::symlink_metadata(&candidate.path) - .map_err(|error| format!("failed to inspect {}: {error}", candidate.path.display()))?; - if metadata.is_dir() { - fs::remove_dir_all(&candidate.path).map_err(|error| { - format!("failed to remove {}: {error}", candidate.path.display()) - })?; - } else { - fs::remove_file(&candidate.path).map_err(|error| { - format!("failed to remove {}: {error}", candidate.path.display()) - })?; - } - } - Ok(()) -} - -fn format_bytes(bytes: u64) -> String { - const UNITS: [&str; 5] = ["B", "KiB", "MiB", "GiB", "TiB"]; - let mut value = bytes as f64; - let mut unit = UNITS[0]; - for next in &UNITS[1..] { - if value < 1024.0 { - break; - } - value /= 1024.0; - unit = next; - } - if unit == "B" { - format!("{bytes} B") - } else { - format!("{value:.1} {unit}") - } -} - -fn print_help() { - println!( - "\ -Prune Cargo target cache for this workspace. - -USAGE: - cargo run -p xtask --bin clean-target -- [OPTIONS] - -OPTIONS: - --apply Delete candidates. Without this, only prints a dry run. - --days N Staleness cutoff for artifact caches [default: 7]. - --profile PROFILE debug, release, or all [default: debug]. - --target-dir PATH Target directory [default: CARGO_TARGET_DIR or target]. - --include-artifacts Also prune stale deps/build/.fingerprint/example artifacts. - --keep-incremental Do not remove incremental cache. - --verbose List every candidate instead of the largest 50. - -h, --help Print help. - -EXAMPLES: - cargo run -p xtask --bin clean-target -- - cargo run -p xtask --bin clean-target -- --apply - cargo run -p xtask --bin clean-target -- --include-artifacts --days 3 --apply -" +fn main() { + eprintln!( + "cargo clean-target is retired. Use `python scripts/codex/build_storage.py status`, \ + `prune --dry-run`, or `prune --apply`." ); + std::process::exit(2); } diff --git a/xtask/src/package_project.rs b/xtask/src/package_project.rs index 54e9f0f..ca6adc2 100644 --- a/xtask/src/package_project.rs +++ b/xtask/src/package_project.rs @@ -319,6 +319,7 @@ fn run(options: Options) -> Result { } fn validate_release_ready(project_root: &Path, phase: &str) -> Result<(), String> { + validate_generated_content(project_root, phase)?; let validation = scene::validate_project(project_root); if validation.is_release_ready() { return Ok(()); @@ -342,6 +343,99 @@ fn validate_release_ready(project_root: &Path, phase: &str) -> Result<(), String )) } +fn validate_generated_content(project_root: &Path, phase: &str) -> Result<(), String> { + let registry_path = project_root.join(content_pipeline::REGISTRY_PATH); + let source = fs::read_to_string(®istry_path) + .map_err(|error| format!("could not read {}: {error}", registry_path.display()))?; + let loaded = shared::parse_asset_registry(&source)?; + if loaded.migration_required { + return Err(format!( + "asset registry requires explicit migration {phase}; run `cargo upgrade-project --project . --apply`" + )); + } + let mut processed = content_pipeline::scan_project(project_root, &loaded.document)?; + let mut model_plans = Vec::new(); + for record in processed + .registry + .records + .iter_mut() + .filter(|record| record.kind == shared::AssetKind::Model) + { + let plan = content_pipeline::plan_model_artifacts_at(project_root, record)?; + *record = plan.record.clone(); + model_plans.push(plan); + } + let expected_registry = content_pipeline::serialize_registry(&processed.registry)?; + if source.as_bytes() != expected_registry { + return Err(format!( + "asset registry is stale {phase}; run `cargo process-assets --project .`" + )); + } + if model_plans.iter().any(|plan| { + fs::read(&plan.static_path).ok().as_deref() != Some(plan.static_bytes.as_slice()) + || fs::read(&plan.animation_path).ok().as_deref() + != Some(plan.animation_bytes.as_slice()) + }) { + return Err(format!( + "model artifacts are stale {phase}; run `cargo process-assets --project .`" + )); + } + + processed.runtime_catalog = shared::RuntimeContentCatalog::from(&processed.registry); + for record in processed + .registry + .records + .iter() + .filter(|record| record.kind == shared::AssetKind::Texture) + { + let plan = content_pipeline::plan_texture_artifact(project_root, record)?; + if !plan.reused + && fs::read(&plan.output_path).ok().as_deref() != Some(plan.output_bytes.as_slice()) + { + return Err(format!( + "texture artifacts are stale {phase}; run `cargo process-assets --project .`" + )); + } + content_pipeline::apply_texture_plan_to_catalog( + &mut processed.runtime_catalog, + &record.id, + &plan, + )?; + } + for record in processed.registry.records.iter().filter(|record| { + matches!( + record.kind, + shared::AssetKind::Material | shared::AssetKind::MaterialInstance + ) + }) { + let Some(plan) = + content_pipeline::plan_material_artifact(project_root, record, &processed.registry)? + else { + continue; + }; + if !plan.reused + && fs::read(&plan.output_path).ok().as_deref() != Some(plan.output_bytes.as_slice()) + { + return Err(format!( + "material artifacts are stale {phase}; run `cargo process-assets --project .`" + )); + } + content_pipeline::apply_material_plan_to_catalog( + &mut processed.runtime_catalog, + &record.id, + &plan, + )?; + } + let catalog_path = project_root.join(content_pipeline::RUNTIME_CATALOG_PATH); + let expected_catalog = content_pipeline::serialize_runtime_catalog(&processed.runtime_catalog)?; + if fs::read(&catalog_path).ok().as_deref() != Some(expected_catalog.as_slice()) { + return Err(format!( + "runtime content catalog is stale {phase}; run `cargo process-assets --project .`" + )); + } + Ok(()) +} + fn load_profile(project_root: &Path, profile_name: &str) -> Result { if profile_name.is_empty() || !profile_name @@ -674,7 +768,14 @@ fn resolve_output(project_root: &Path, output: &str) -> Result let suffix = lexical_output .strip_prefix(existing) .map_err(|error| format!("could not resolve build output suffix: {error}"))?; - let resolved_output = resolved_ancestor.join(suffix); + // Joining an empty suffix can preserve a trailing separator on some platforms. The package + // lock stores this path as its identity, so first publication (output absent) and subsequent + // publication (output present) must resolve to byte-identical strings. + let resolved_output = if suffix.as_os_str().is_empty() { + resolved_ancestor + } else { + resolved_ancestor.join(suffix) + }; if resolved_output == resolved_dist || !resolved_output.starts_with(&resolved_dist) { return Err("build output must resolve inside the project dist directory".into()); } @@ -771,7 +872,7 @@ impl PackageLock { })?; if record.magic != PACKAGE_LOCK_MAGIC || record.schema_version != PACKAGE_SCHEMA_VERSION - || record.output != output_identity + || Path::new(&record.output) != output { return Err(format!( "refusing to overwrite unrecognized package lock {}", @@ -1478,7 +1579,50 @@ fn runtime_asset_sources(project_root: &Path) -> Result, sources.push((relative.to_path_buf(), entry.path().to_path_buf())); } } + let catalog_path = assets.join("content.catalog.ron"); + let catalog_source = fs::read_to_string(&catalog_path) + .map_err(|error| format!("could not read {}: {error}", catalog_path.display()))?; + let catalog: shared::RuntimeContentCatalog = ron::from_str(&catalog_source) + .map_err(|error| format!("invalid runtime content catalog: {error}"))?; + for runtime_path in catalog.records.iter().flat_map(|record| { + record + .texture + .as_ref() + .and_then(|texture| texture.processed_path.as_deref()) + .into_iter() + .chain( + record + .material + .as_ref() + .and_then(|material| material.packed_arm_path.as_deref()), + ) + }) { + let relative = runtime_path + .strip_prefix("assets/") + .ok_or_else(|| format!("runtime artifact is outside assets/: {runtime_path}"))?; + let relative = PathBuf::from(relative); + if !relative.starts_with(".import-cache/runtime") { + return Err(format!( + "runtime artifact is outside managed runtime storage: {runtime_path}" + )); + } + let source = assets.join(&relative); + let metadata = fs::symlink_metadata(&source).map_err(|error| { + format!( + "runtime artifact is missing at {}: {error}", + source.display() + ) + })?; + if metadata.file_type().is_symlink() || !metadata.is_file() { + return Err(format!( + "runtime artifact must be a regular file: {}", + source.display() + )); + } + sources.push((relative, source)); + } sources.sort_by(|left, right| left.0.cmp(&right.0)); + sources.dedup_by(|left, right| left.0 == right.0); Ok(sources) } @@ -1755,7 +1899,7 @@ mod tests { fs::write(root.join("assets/.index/registry.ron"), "[]").unwrap(); fs::write( root.join("assets/project.ron"), - "(version:1,template_version:1,default_level:\"assets/levels/main.scn.ron\",asset_roots:[\"assets/levels\"],capabilities:[])", + "(version:2,template_version:2,default_level:\"assets/levels/main.scn.ron\",asset_roots:[\"assets\"],capabilities:[])", ) .unwrap(); fs::write( @@ -1884,6 +2028,10 @@ mod tests { })})"#, ) .unwrap(); + let processed = + content_pipeline::scan_project(&root, &shared::AssetRegistryDocument::default()) + .unwrap(); + content_pipeline::publish_content_documents(&root, &processed.registry).unwrap(); let error = run(Options { project_root: root.clone(), profile_name: "release".into(), @@ -1949,6 +2097,19 @@ mod tests { fs::remove_dir_all(root).unwrap(); } + #[test] + fn package_output_identity_is_stable_after_output_creation() { + let root = fixture_root(); + fs::create_dir_all(root.join("dist")).unwrap(); + let before = resolve_output(&root, "dist/qa").unwrap(); + fs::create_dir_all(&before).unwrap(); + let after = resolve_output(&root, "dist/qa").unwrap(); + + assert_eq!(before, after); + assert_eq!(before.to_string_lossy(), after.to_string_lossy()); + fs::remove_dir_all(root).unwrap(); + } + #[test] fn build_profile_rejects_unsafe_target_triple() { let root = fixture_root(); @@ -2153,6 +2314,28 @@ mod tests { fs::remove_dir_all(root).unwrap(); } + #[test] + fn package_lock_accepts_an_equivalent_output_with_a_trailing_separator() { + let root = fixture_root(); + let output = root.join("dist/release"); + fs::create_dir_all(root.join("dist")).unwrap(); + let lock_path = root.join("dist/.blacksite-release.lock"); + let record = PackageLockRecord { + magic: PACKAGE_LOCK_MAGIC.into(), + schema_version: PACKAGE_SCHEMA_VERSION, + output: format!("{}/", output.display()), + pid: 1, + }; + fs::write(&lock_path, serde_json::to_vec(&record).unwrap()).unwrap(); + + PackageLock::acquire(&output).unwrap(); + + let refreshed: PackageLockRecord = + serde_json::from_slice(&fs::read(&lock_path).unwrap()).unwrap(); + assert_eq!(refreshed.output, output.to_string_lossy()); + fs::remove_dir_all(root).unwrap(); + } + #[test] fn unrecognized_lock_file_is_preserved_and_rejected() { let root = fixture_root(); diff --git a/xtask/src/process_assets.rs b/xtask/src/process_assets.rs new file mode 100644 index 0000000..10c2ced --- /dev/null +++ b/xtask/src/process_assets.rs @@ -0,0 +1,239 @@ +//! Deterministic, GPU-free content registry and runtime-catalog processor. + +use content_pipeline::{ + scan_project, serialize_registry, serialize_runtime_catalog, write_if_changed, REGISTRY_PATH, + RUNTIME_CATALOG_PATH, +}; +use serde::Serialize; +use shared::{parse_asset_registry, AssetRegistryDocument}; +use std::path::{Path, PathBuf}; + +#[derive(Serialize)] +struct CommandReport { + project: String, + check: bool, + registry_changed: bool, + runtime_catalog_changed: bool, + model_artifacts_changed: usize, + texture_artifacts_changed: usize, + material_artifacts_changed: usize, + processing: content_pipeline::ProcessingReport, +} + +fn main() { + if let Err(error) = run() { + eprintln!("process-assets failed: {error}"); + std::process::exit(1); + } +} + +fn run() -> Result<(), String> { + let mut project = PathBuf::from("."); + let mut check = false; + let mut json = false; + let mut arguments = std::env::args().skip(1); + while let Some(argument) = arguments.next() { + match argument.as_str() { + "--project" => { + project = PathBuf::from( + arguments + .next() + .ok_or_else(|| "--project requires a path".to_string())?, + ); + } + "--check" => check = true, + "--json" => json = true, + other => return Err(format!("unknown argument `{other}`")), + } + } + + let project_display = project.to_string_lossy().into_owned(); + let project = std::fs::canonicalize(&project) + .map_err(|error| format!("could not resolve project {project_display}: {error}"))?; + std::env::set_current_dir(&project) + .map_err(|error| format!("could not enter project {}: {error}", project.display()))?; + let project = PathBuf::from("."); + let registry_path = project.join(REGISTRY_PATH); + let previous = load_registry(®istry_path)?; + let mut processed = scan_project(&project, &previous)?; + let mut model_plans = Vec::new(); + for record in processed + .registry + .records + .iter_mut() + .filter(|record| record.kind == shared::AssetKind::Model) + { + let plan = content_pipeline::plan_model_artifacts(record) + .map_err(|error| format!("could not process model {}: {error}", record.path))?; + *record = plan.record.clone(); + model_plans.push(plan); + } + processed.runtime_catalog = shared::RuntimeContentCatalog::from(&processed.registry); + let mut texture_plans = Vec::new(); + for record in processed + .registry + .records + .iter() + .filter(|record| record.kind == shared::AssetKind::Texture) + { + let plan = content_pipeline::plan_texture_artifact(&project, record) + .map_err(|error| format!("could not process Texture {}: {error}", record.path))?; + content_pipeline::apply_texture_plan_to_catalog( + &mut processed.runtime_catalog, + &record.id, + &plan, + )?; + texture_plans.push(plan); + } + let mut material_plans = Vec::new(); + for record in processed.registry.records.iter().filter(|record| { + matches!( + record.kind, + shared::AssetKind::Material | shared::AssetKind::MaterialInstance + ) + }) { + if let Some(plan) = + content_pipeline::plan_material_artifact(&project, record, &processed.registry)? + { + content_pipeline::apply_material_plan_to_catalog( + &mut processed.runtime_catalog, + &record.id, + &plan, + )?; + material_plans.push(plan); + } + } + processed.report.changed = processed.registry != previous; + let model_artifacts_changed = model_plans + .iter() + .filter(|plan| { + file_differs(&plan.static_path, &plan.static_bytes) + || file_differs(&plan.animation_path, &plan.animation_bytes) + }) + .count(); + let texture_artifacts_changed = texture_plans + .iter() + .filter(|plan| !plan.reused && file_differs(&plan.output_path, &plan.output_bytes)) + .count(); + let material_artifacts_changed = material_plans + .iter() + .filter(|plan| !plan.reused && file_differs(&plan.output_path, &plan.output_bytes)) + .count(); + let registry_bytes = serialize_registry(&processed.registry)?; + let runtime_bytes = serialize_runtime_catalog(&processed.runtime_catalog)?; + let runtime_path = project.join(RUNTIME_CATALOG_PATH); + let registry_changed = file_differs(®istry_path, ®istry_bytes); + let runtime_catalog_changed = file_differs(&runtime_path, &runtime_bytes); + let report = CommandReport { + project: project_display, + check, + registry_changed, + runtime_catalog_changed, + model_artifacts_changed, + texture_artifacts_changed, + material_artifacts_changed, + processing: processed.report, + }; + + if !check { + let mut publication_paths = model_plans + .iter() + .flat_map(|plan| [plan.static_path.clone(), plan.animation_path.clone()]) + .collect::>(); + publication_paths.extend(texture_plans.iter().map(|plan| plan.output_path.clone())); + publication_paths.extend(material_plans.iter().map(|plan| plan.output_path.clone())); + publication_paths.push(registry_path.clone()); + publication_paths.push(runtime_path.clone()); + publication_paths.sort(); + publication_paths.dedup(); + let backups = publication_paths + .iter() + .map(|path| (path.clone(), std::fs::read(path).ok())) + .collect::>(); + let publication = (|| { + for plan in &model_plans { + content_pipeline::publish_model_artifacts(plan)?; + } + for plan in &texture_plans { + content_pipeline::publish_texture_artifact(plan)?; + } + for plan in &material_plans { + content_pipeline::publish_material_artifact(plan)?; + } + write_if_changed(®istry_path, ®istry_bytes)?; + write_if_changed(&runtime_path, &runtime_bytes)?; + Ok::<(), String>(()) + })(); + if let Err(error) = publication { + for (path, bytes) in &backups { + restore_file(path, bytes.as_deref()); + } + return Err(format!("headless content publication rolled back: {error}")); + } + } + if json { + println!( + "{}", + serde_json::to_string_pretty(&report) + .map_err(|error| format!("could not serialize report: {error}"))? + ); + } else { + println!( + "process-assets: discovered={}, added={}, moved={}, removed={}, registry_changed={}, runtime_catalog_changed={}, model_artifacts_changed={}, texture_artifacts_changed={}, material_artifacts_changed={}, mode={}", + report.processing.discovered, + report.processing.added, + report.processing.moved, + report.processing.removed, + registry_changed, + runtime_catalog_changed, + model_artifacts_changed, + texture_artifacts_changed, + material_artifacts_changed, + if check { "check" } else { "write" } + ); + for diagnostic in &report.processing.diagnostics { + eprintln!(" {}: {}", diagnostic.path, diagnostic.message); + } + } + if check + && (registry_changed + || runtime_catalog_changed + || model_artifacts_changed > 0 + || texture_artifacts_changed > 0 + || material_artifacts_changed > 0) + { + return Err( + "generated content state is stale; run `cargo process-assets --project `".into(), + ); + } + Ok(()) +} + +fn load_registry(path: &Path) -> Result { + let source = match std::fs::read_to_string(path) { + Ok(source) => source, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => { + return Ok(AssetRegistryDocument::default()); + } + Err(error) => return Err(format!("could not read {}: {error}", path.display())), + }; + let loaded = parse_asset_registry(&source)?; + if loaded.migration_required { + return Err( + "asset registry v1 requires `cargo upgrade-project --project --apply`".into(), + ); + } + Ok(loaded.document) +} + +fn file_differs(path: &Path, expected: &[u8]) -> bool { + std::fs::read(path).map_or(true, |current| current != expected) +} + +fn restore_file(path: &Path, bytes: Option<&[u8]>) { + if let Some(bytes) = bytes { + let _ = std::fs::write(path, bytes); + } else { + let _ = std::fs::remove_file(path); + } +}

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�x_!h@LR+VwsUVF#0n;2Z?7Wk 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

RdZ#IT1S?T*o+SMU3p_vM~?iu0k=nb@csrJ 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�x_!h@LR+VwsUVF#0n;2Z?7Wk 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