From cb86b74f6159e3e4a6a2f6b35a1b269af1922f0a Mon Sep 17 00:00:00 2001 From: lyeepedro Date: Wed, 23 Sep 2026 12:51:53 +0100 Subject: [PATCH 1/9] Establish Cafpack as the unified asset I/O layer for the Caffeine suite. Add architecture documentation, Reader/Registry APIs in caf-pack, CapLoader integration, suite CMake options, and shared export-to-cap script. Document Convoy and WaveShaper export paths through caf-pack. Co-authored-by: Cursor --- CMakeLists.txt | 23 +++++- Convoy | 2 +- WaveShaper | 2 +- caf-pack | 2 +- docs/README.md | 6 ++ docs/architecture/cafpack.md | 149 +++++++++++++++++++++++++++++++++++ scripts/export-to-cap.sh | 28 +++++++ src/core/io/CafTypes.hpp | 6 ++ src/editor/CapLoader.cpp | 88 +++++++-------------- 9 files changed, 243 insertions(+), 63 deletions(-) create mode 100644 docs/architecture/cafpack.md create mode 100755 scripts/export-to-cap.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index dcd15b56..cada7b81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,10 @@ option(CAFFEINE_BUILD_HEADLESS "Build caffeine-core without SDL3/RHI" OFF) # ── Scripting (Lua + sol2) ────────────────────────────────────── option(CAFFEINE_ENABLE_SCRIPTING "Enable Lua scripting support" ON) +# ── Caffeine Suite (Convoy, WaveShaper) ───────────────────────── +option(CAFFEINE_BUILD_CONVOY "Build Convoy art station submodule" ON) +option(CAFFEINE_BUILD_WAVESHAPER "Build WaveShaper audio DAW submodule (requires VST3 SDK)" OFF) + # ── glTF Support (tinygltf for mesh encoding) ────────────────────── include(FetchContent) FetchContent_Declare( @@ -700,7 +704,24 @@ with open(sys.argv[1], 'w') as f: message(STATUS "Doppio (IDE) enabled – ImGui v1.91.9 fetched") endif() -# ── caf-encode CLI tool ──────────────────────────────────────── +# ═══════════════════════════════════════════════════════════════════ +# CAFFEINE SUITE — Convoy + WaveShaper (optional submodules) +# ═══════════════════════════════════════════════════════════════════ +if(CAFFEINE_BUILD_WAVESHAPER AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/WaveShaper/CMakeLists.txt") + add_subdirectory(WaveShaper) + message(STATUS "WaveShaper (audio DAW) enabled") +elseif(CAFFEINE_BUILD_WAVESHAPER) + message(STATUS "WaveShaper submodule not initialized — skipping") +endif() + +if(CAFFEINE_BUILD_CONVOY AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/Convoy/CMakeLists.txt") + add_subdirectory(Convoy) + message(STATUS "Convoy (art station) enabled") +elseif(CAFFEINE_BUILD_CONVOY) + message(STATUS "Convoy submodule not initialized — skipping") +endif() + +# ── caf-encode CLI tool (legacy — prefer caf-pack CLI) ───────── add_executable(caf-encode tools/caf-encode/main.cpp) target_link_libraries(caf-encode PRIVATE caffeine-core) target_include_directories(caf-encode PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) diff --git a/Convoy b/Convoy index 39addbd2..77ffa4cc 160000 --- a/Convoy +++ b/Convoy @@ -1 +1 @@ -Subproject commit 39addbd2e61667b2844442871e87c103157717b7 +Subproject commit 77ffa4cc711eaac33f4d739ea7750111cc345db4 diff --git a/WaveShaper b/WaveShaper index 240eb4b5..d70b9465 160000 --- a/WaveShaper +++ b/WaveShaper @@ -1 +1 @@ -Subproject commit 240eb4b5d58404f16f5e8396eccbb09e67e4e526 +Subproject commit d70b946554f14ef6c912547418ffee69fe88f685 diff --git a/caf-pack b/caf-pack index 677d2024..d4d859de 160000 --- a/caf-pack +++ b/caf-pack @@ -1 +1 @@ -Subproject commit 677d202424b1c453f57de1d718b2164b793286c5 +Subproject commit d4d859dea7b462e2a2decf6c92385f34466312fd diff --git a/docs/README.md b/docs/README.md index 35b27e23..9d6b0008 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,6 +6,12 @@ ## Índice da Documentação +### Arquitectura + +| Documento | Descrição | +|-----------|-----------| +| **Cafpack** | [`architecture/cafpack.md`](architecture/cafpack.md) | Camada unificada de assets — suite Adobe-style (Doppio, Convoy, WaveShaper) | + ### Roadmap & Planos | Documento | Descrição | diff --git a/docs/architecture/cafpack.md b/docs/architecture/cafpack.md new file mode 100644 index 00000000..6a087f55 --- /dev/null +++ b/docs/architecture/cafpack.md @@ -0,0 +1,149 @@ +# Cafpack — Camada Unificada de Assets + +> **Namespace:** `CafPack` +> **Repositório:** [`caf-pack/`](../../caf-pack/) (submodule) +> **Status:** 🟡 Fase 1 — biblioteca activa; migração de tipos em curso + +--- + +## Visão + +O **Cafpack** é o "fio condutor" do ecossistema Caffeine Studio (estilo Adobe Creative Suite): + +``` +Convoy (arte) ──┐ +WaveShaper (áudio) ──┼──► Cafpack ──► .caf / .cap ──► Doppio / Runtime +Ferramentas futuras──┘ ▲ + │ + única fonte de verdade para leitura/escrita de dados +``` + +**Regra central:** todo novo tipo de asset (mesh, textura, áudio, animação, scene, prefab…) é definido **primeiro no Cafpack**. Nenhuma app inventa formato interno — só consome a API. + +--- + +## Contrato por aplicação + +| App | Responsabilidade | API Cafpack | +|-----|------------------|-------------| +| **Convoy** | Editar texturas/meshes | Export → `.caf` ou append a `.cap` | +| **WaveShaper** | Editar áudio | Export → `.caf Audio` | +| **Doppio** | IDE / preview / pack projeto | `Packer`, `Reader`, `HeaderGenerator` | +| **Runtime** | Carregar jogo | `Reader::loadCap` (zero parsing) | +| **caf-pack CLI** | CI / batch | `caf-pack --input raw --output game.cap` | + +--- + +## Estrutura da biblioteca (`caf-pack-lib`) + +``` +caf-pack/ +├── include/ +│ ├── caffeine/CafTypes.hpp ← fonte de verdade (.caf + .cap) +│ ├── cafpack/Types.hpp ← alias público +│ └── caf-pack/ +│ ├── Reader.hpp ← ler .caf / .cap +│ ├── Registry.hpp ← registo de processors +│ ├── Packer.hpp ← agregar → .cap +│ ├── HeaderGenerator.hpp ← IDs hash para C++ +│ └── *Processor.hpp ← PNG, WAV, OBJ → .caf +└── src/ +``` + +### Adicionar um novo tipo de asset + +1. Adicionar valor em `CafAssetType` (`include/caffeine/CafTypes.hpp`) +2. Definir struct de metadata no mesmo ficheiro +3. Implementar `AssetProcessor` em `src/MyProcessor.cpp` +4. Registar em `makeDefaultRegistry()` (`Registry.cpp`) +5. Consumir em Doppio/Runtime via `Reader` — **sem bypass** + +--- + +## Formatos + +| Extensão | Descrição | Magic | +|----------|-----------|-------| +| `.caf` | Asset binário individual | `0x43414621` ("CAF!") | +| `.cap` | Pack de assets (mmap) | `0x4341502F` ("CAP/") | + +Documentação detalhada do pack: [`caf-pack/README.md`](../../caf-pack/README.md). + +### Dois headers CAF (migração) + +| Header | Magic | Uso | +|--------|-------|-----| +| `caf-pack/include/caffeine/CafTypes.hpp` | `CAF!` | Assets importados + `.cap` | +| `src/core/io/CafTypes.hpp` | `0xCAFECAFE` | Scene/Prefab engine-internal (legado) | + +**Fase 2** unifica num único schema; até lá, runtime assets usam sempre caf-pack. + +--- + +## Pipeline de projeto + +``` +my_game/ +├── raw_assets/ ← PNG, WAV, OBJ (fonte) +├── processed/ ← opcional: .caf individuais +├── game.cap ← pack final (mmap no runtime) +└── game_assets.hpp ← IDs hash gerados pelo HeaderGenerator +``` + +### Export manual (qualquer ferramenta) + +```bash +./scripts/export-to-cap.sh raw_assets/ game.cap include/game_assets.hpp +``` + +Convoy e WaveShaper devem invocar o mesmo script ou linkar `caf-pack-lib` directamente. + +--- + +## Integração CMake (monorepo) + +```bash +git submodule update --init --recursive caf-pack Convoy WaveShaper +cmake -B build -DCAFFEINE_BUILD_CONVOY=ON -DCAFFEINE_BUILD_WAVESHAPER=ON +cmake --build build +``` + +| Target | Origem | +|--------|--------| +| `caf-pack-lib` | Submodule caf-pack | +| `caf-pack` | CLI | +| `doppio` | IDE (liga `caf-pack-lib`, `CF_HAS_CAF_PACK=1`) | +| `convoy` | Submodule Convoy | +| `waveshaper` | Submodule WaveShaper | + +Desligar ferramentas: `-DCAFFEINE_BUILD_CONVOY=OFF` / `WAVESHAPER=OFF`. + +--- + +## Fases de migração + +| Fase | Entregável | Estado | +|------|------------|--------| +| **0** | Submodule caf-pack populado + `.gitmodules` | ✅ | +| **1** | `Reader`, `Registry`, CapLoader via Reader | ✅ | +| **2** | Unificar `CafTypes` engine ↔ caf-pack | 📅 | +| **3** | MeshLoader/AssetManager sem bypass PNG/OBJ | 📅 | +| **4** | Convoy/WaveShaper export nativo → Cafpack | 📅 | +| **5** | Deprecar `tools/caf-encode` | 📅 | + +--- + +## Princípios + +1. **Um tipo, um sítio** — schema + processor + reader no caf-pack +2. **Sem bypass** — loaders da engine leem `.caf`/`.cap`, não PNG cru em runtime +3. **Projeto unificado** — um `.cap` por jogo, partilhado por todas as apps +4. **Mesmo CMake root** — suite compila junta na raiz do monorepo + +--- + +## Ver também + +- [`ECOSYSTEM_WORKFLOW.md`](../ECOSYSTEM_WORKFLOW.md) +- [`assets/caf-format.md`](../assets/caf-format.md) — formato engine-internal (legado) +- [`plans/2026-05-17-unified-ecosystem-build.md`](../plans/2026-05-17-unified-ecosystem-build.md) diff --git a/scripts/export-to-cap.sh b/scripts/export-to-cap.sh new file mode 100755 index 00000000..c89f47cc --- /dev/null +++ b/scripts/export-to-cap.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Export raw assets to a .cap pack via caf-pack CLI. +# Used by Convoy, WaveShaper, CI, and manual workflows. +set -euo pipefail + +INPUT_DIR="${1:-raw_assets}" +OUTPUT_CAP="${2:-game.cap}" +HEADER_OUT="${3:-}" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" +CAF_PACK_BIN="${ROOT_DIR}/build/caf-pack/src/caf-pack" + +if [[ ! -x "${CAF_PACK_BIN}" ]]; then + CAF_PACK_BIN="$(command -v caf-pack || true)" +fi + +if [[ -z "${CAF_PACK_BIN}" || ! -x "${CAF_PACK_BIN}" ]]; then + echo "error: caf-pack binary not found. Build with: cmake --build build --target caf-pack" >&2 + exit 1 +fi + +ARGS=(--input "${INPUT_DIR}" --output "${OUTPUT_CAP}") +if [[ -n "${HEADER_OUT}" ]]; then + ARGS+=(--gen-ids "${HEADER_OUT}") +fi + +exec "${CAF_PACK_BIN}" "${ARGS[@]}" diff --git a/src/core/io/CafTypes.hpp b/src/core/io/CafTypes.hpp index 44d84dbe..cbf06935 100644 --- a/src/core/io/CafTypes.hpp +++ b/src/core/io/CafTypes.hpp @@ -2,6 +2,12 @@ // @file CafTypes.hpp // @brief Caffeine Asset Format (.caf) — type definitions // +// MIGRATION: Runtime asset packs (.cap) and imported assets (.caf from PNG/WAV/OBJ) +// use caf-pack as the single source of truth: +// caf-pack/include/caffeine/CafTypes.hpp (magic 0x43414621 "CAF!") +// This header remains for engine-internal scene/prefab serialization (magic 0xCAFECAFE) +// until unified in a later migration phase. See docs/architecture/cafpack.md. +// // Philosophy: Zero-parsing, Zero-copy. // The file on disk is a direct mirror of RAM/VRAM layout. // No deserialization: file is read as a raw byte block. diff --git a/src/editor/CapLoader.cpp b/src/editor/CapLoader.cpp index d46795e8..b770fa72 100644 --- a/src/editor/CapLoader.cpp +++ b/src/editor/CapLoader.cpp @@ -1,91 +1,61 @@ #include "editor/CapLoader.hpp" #include "debug/LogSystem.hpp" -#include -#include -namespace Caffeine::Editor { +#include #ifdef CF_HAS_CAF_PACK +#include "caf-pack/Reader.hpp" +#endif -using namespace Caffeine::Assets; +namespace Caffeine::Editor { -constexpr uint32_t CAP_MAGIC = 0x4341502F; -constexpr uint32_t CAP_VERSION = 1; +#ifdef CF_HAS_CAF_PACK std::vector CapLoader::loadCap(const std::filesystem::path& path) { std::vector assets; - std::ifstream file(path.string(), std::ios::binary); - - if (!file) { - Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", - "Failed to open CAP file: %s", path.string().c_str()); + std::string error; + const auto loaded = CafPack::Reader::loadCap(path, &error); + if (loaded.empty() && !error.empty()) { + Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", "%s", + error.c_str()); return assets; } - CapHeader capHeader{}; - file.read(reinterpret_cast(&capHeader), sizeof(CapHeader)); - - if (capHeader.magic != CAP_MAGIC) { - Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", - "Invalid CAP magic bytes"); - return assets; - } - - if (capHeader.version != CAP_VERSION) { - Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", - "Unsupported CAP version"); - return assets; - } - - std::vector entries(capHeader.assetCount); - file.read(reinterpret_cast(entries.data()), - capHeader.assetCount * sizeof(CapEntry)); - - for (const auto& entry : entries) { - file.seekg(entry.offset); - - std::vector cafBlob(entry.size); - file.read(reinterpret_cast(cafBlob.data()), entry.size); - - CafHeader cafHeader{}; - std::memcpy(&cafHeader, cafBlob.data(), sizeof(CafHeader)); - - Editor::CapAssetMetadata metadata{ - .magic = cafHeader.magic, - .version = cafHeader.version, - .assetType = cafHeader.assetType, + for (const CafPack::CafAsset& caf : loaded) { + CapAssetMetadata metadata{ + .magic = caf.header.magic, + .version = caf.header.version, + .assetType = caf.header.assetType, .reserved = {0}, - .payloadSize = cafHeader.payloadSize, - .flags = cafHeader.flags, - .crc64 = cafHeader.crc64 - }; - std::memcpy(metadata.reserved, cafHeader.reserved, 7); - - LoadedAsset asset{ - .hashID = entry.hashID, - .type = identifyAssetType(metadata), - .cafBlob = cafBlob, - .metadata = metadata + .payloadSize = caf.header.payloadSize, + .flags = caf.header.flags, + .crc64 = caf.header.crc64, }; - - assets.push_back(asset); + std::memcpy(metadata.reserved, caf.header.reserved, sizeof(metadata.reserved)); + + assets.push_back(LoadedAsset{ + .hashID = caf.hashID, + .type = static_cast(caf.header.assetType), + .cafBlob = caf.blob, + .metadata = metadata, + }); } return assets; } -Caffeine::Assets::CafAssetType CapLoader::identifyAssetType(const Editor::CapAssetMetadata& metadata) { +Caffeine::Assets::CafAssetType CapLoader::identifyAssetType(const CapAssetMetadata& metadata) { return static_cast(metadata.assetType); } #else std::vector CapLoader::loadCap(const std::filesystem::path& path) { - Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", + Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", "CAP loading not available - caf-pack submodule not included"); return {}; } #endif -} +} // namespace Caffeine::Editor From 297b9eb28795100c7878c8625830567633a77841 Mon Sep 17 00:00:00 2001 From: LyeZinho Date: Fri, 2 Oct 2026 03:30:09 +0100 Subject: [PATCH 2/9] Add HDR forward PBR pipeline, GPU post stack, and full material/post APIs. Move rendering into caffeine-core: probes and SSR, shadow fixes, PostProcessStack with TAA, expanded Material Editor and Lua bindings, editor viewport quality (render scale), and documentation for the new systems. Co-authored-by: Cursor --- CMakeLists.txt | 114 +- assets/benchmarks/dense_outdoor.caf | Bin 0 -> 43103 bytes .../post_processing/scripts/custom_effect.lua | 25 +- assets/terrain/Terrain_5.cterrain | Bin 0 -> 66584 bytes assets/terrain/Terrain_6.cterrain | Bin 0 -> 66584 bytes docs/HISTORY.md | 8 + docs/README.md | 18 +- docs/editor/material-editor.md | 62 + docs/editor/scene-viewport.md | 51 +- docs/physics/physics-3d.md | 27 + docs/plans/2026-09-21-rendering-roadmap.md | 50 +- .../2026-09-22-engine-pillars-roadmap.md | 28 +- .../2026-10-02-forward-pbr-post-session.md | 57 + docs/rendering/forward-render-features.md | 61 + docs/rendering/materials-pbr.md | 42 + docs/rendering/materials-phong.md | 8 +- docs/rendering/mesh-lod.md | 13 + docs/rendering/post-processing.md | 45 +- docs/rendering/reflections.md | 48 + docs/rendering/render-snapshot.md | 57 + docs/rendering/volumetric-lighting.md | 13 + docs/scripting/runtime-apis.md | 68 + .../postprocess/PostProcessEditorUI.hpp | 22 +- src/assets/MaterialCache.cpp | 76 +- src/assets/MaterialCache.hpp | 17 +- src/assets/MaterialFile.cpp | 170 ++ src/assets/MaterialFile.hpp | 14 + src/assets/MaterialPresets.hpp | 173 ++ src/assets/MaterialTypes.hpp | 45 + src/assets/MeshLOD.cpp | 131 +- src/assets/MeshLOD.hpp | 6 +- src/ecs/ForwardRenderComponents.hpp | 61 + src/ecs/PostProcessComponents.hpp | 9 +- src/ecs/PostProcessFields.hpp | 176 ++ src/editor/AssetBrowser.cpp | 209 +- src/editor/AssetBrowser.hpp | 17 + src/editor/BrowseSession.cpp | 59 + src/editor/CameraPreviewPanel.cpp | 24 +- src/editor/CameraPreviewPanel.hpp | 1 + src/editor/ComponentRegistry.cpp | 21 + src/editor/DenseOutdoorBenchmark.hpp | 105 + src/editor/EditorContext.hpp | 47 +- src/editor/EditorPanelUtils.hpp | 95 + src/editor/EditorPreferences.cpp | 3 + src/editor/EditorPreferences.hpp | 3 +- src/editor/FilePicker.cpp | 4 +- src/editor/GameplayPreviewPanel.cpp | 33 +- src/editor/GameplayPreviewPanel.hpp | 1 + src/editor/InspectorPanel.cpp | 198 +- src/editor/InspectorPanel.hpp | 3 + src/editor/InspectorWidgets.hpp | 113 +- src/editor/MaterialEditorPanel.cpp | 569 ++---- src/editor/MaterialEditorPanel.hpp | 58 +- src/editor/PreviewRenderer.cpp | 542 ------ src/editor/PreviewRenderer.hpp | 91 - src/editor/SceneEditor.cpp | 15 +- src/editor/SceneEditor.hpp | 2 + src/editor/SceneSerializer.cpp | 15 + src/editor/SceneSerializer.hpp | 5 +- src/editor/SceneViewport.cpp | 92 +- src/editor/SceneViewport.hpp | 7 + src/editor/SettingsPanel.cpp | 50 +- src/math/Mat4.hpp | 35 +- src/physics/PhysicsComponents3D.hpp | 56 + src/physics/PhysicsSystem3D.hpp | 100 + src/physics/PhysicsWorld3D.cpp | 254 +++ src/physics/PhysicsWorld3D.hpp | 32 + src/render/CoarseOcclusion.hpp | 133 ++ src/render/ForwardRenderFeatures.cpp | 71 + src/render/ForwardRenderFeatures.hpp | 18 + src/render/GpuDirectionalShadowMap.hpp | 4 +- src/render/GpuEnvironmentMap.cpp | 125 ++ src/render/GpuEnvironmentMap.hpp | 58 + src/render/GpuPointShadowMap.hpp | 2 +- src/render/GpuProceduralMeshes.cpp | 2 +- src/render/GpuSceneRenderer.cpp | 1688 ++++++++++++++--- src/render/GpuSceneRenderer.hpp | 216 ++- src/render/GpuSpotShadowMap.hpp | 2 +- src/render/GpuTextureCache.cpp | 130 +- src/render/GpuTextureCache.hpp | 11 +- src/render/InstanceBatch.hpp | 44 + src/render/MaterialPreviewRenderer.cpp | 250 +++ src/render/MaterialPreviewRenderer.hpp | 65 + src/render/PostProcessRenderer.hpp | 126 +- src/render/PostProcessStack.cpp | 551 ++++++ src/render/PostProcessStack.hpp | 132 ++ src/render/RenderFeatures.hpp | 55 + src/render/ShaderBytecode.cpp | 38 + src/render/ShaderBytecode.hpp | 21 + src/render/shaders/fullscreen.vert | 11 + src/render/shaders/grid.frag | 75 + src/render/shaders/post_adapt.frag | 20 + src/render/shaders/post_bloom_down.frag | 29 + src/render/shaders/post_bloom_prefilter.frag | 47 + src/render/shaders/post_bloom_up.frag | 26 + src/render/shaders/post_composite.frag | 170 ++ src/render/shaders/post_dof.frag | 55 + src/render/shaders/post_fxaa.frag | 108 ++ src/render/shaders/post_luminance.frag | 13 + src/render/shaders/post_motion_blur.frag | 39 + src/render/shaders/post_ssao.frag | 86 + src/render/shaders/post_ssao_blur.frag | 26 + src/render/shaders/post_taa.frag | 86 + src/render/shaders/scene_instanced.vert | 37 + src/render/shaders/scene_lit.frag | 551 +++++- src/render/shaders/sky.frag | 39 + src/render/shaders/sphere_lit.frag | 8 +- src/render/shaders/terrain_lit.frag | 92 +- src/rhi/CommandBuffer.cpp | 40 +- src/rhi/CommandBuffer.hpp | 10 +- src/rhi/RenderDevice.cpp | 96 +- src/rhi/RenderDevice.hpp | 24 + src/script/ForwardRenderBindings.cpp | 83 + src/script/PostProcessBindings.cpp | 350 +++- src/script/ScriptEngine.cpp | 30 +- src/script/ScriptEngine.hpp | 5 + src/script/ScriptSystem.cpp | 47 + src/script/ScriptSystem.hpp | 2 + src/spatial/Octree.hpp | 7 +- src/terrain/TerrainGpuTextures.cpp | 4 +- tests/CMakeLists.txt | 10 +- tests/test_forward_render_features.cpp | 76 + tests/test_material.cpp | 91 + tests/test_math.cpp | 16 + tests/test_mesh_lod.cpp | 56 + tests/test_octree.cpp | 11 + tests/test_physics3d.cpp | 78 + tests/test_render_features.cpp | 93 + tools/render-snapshot/main.cpp | 201 ++ 129 files changed, 9100 insertions(+), 2044 deletions(-) create mode 100644 assets/benchmarks/dense_outdoor.caf create mode 100644 assets/terrain/Terrain_5.cterrain create mode 100644 assets/terrain/Terrain_6.cterrain create mode 100644 docs/editor/material-editor.md create mode 100644 docs/physics/physics-3d.md create mode 100644 docs/plans/2026-10-02-forward-pbr-post-session.md create mode 100644 docs/rendering/forward-render-features.md create mode 100644 docs/rendering/materials-pbr.md create mode 100644 docs/rendering/mesh-lod.md create mode 100644 docs/rendering/reflections.md create mode 100644 docs/rendering/render-snapshot.md create mode 100644 docs/rendering/volumetric-lighting.md create mode 100644 docs/scripting/runtime-apis.md create mode 100644 src/assets/MaterialFile.cpp create mode 100644 src/assets/MaterialFile.hpp create mode 100644 src/assets/MaterialPresets.hpp create mode 100644 src/ecs/ForwardRenderComponents.hpp create mode 100644 src/ecs/PostProcessFields.hpp create mode 100644 src/editor/BrowseSession.cpp create mode 100644 src/editor/DenseOutdoorBenchmark.hpp delete mode 100644 src/editor/PreviewRenderer.cpp delete mode 100644 src/editor/PreviewRenderer.hpp create mode 100644 src/physics/PhysicsComponents3D.hpp create mode 100644 src/physics/PhysicsSystem3D.hpp create mode 100644 src/physics/PhysicsWorld3D.cpp create mode 100644 src/physics/PhysicsWorld3D.hpp create mode 100644 src/render/CoarseOcclusion.hpp create mode 100644 src/render/ForwardRenderFeatures.cpp create mode 100644 src/render/ForwardRenderFeatures.hpp create mode 100644 src/render/GpuEnvironmentMap.cpp create mode 100644 src/render/GpuEnvironmentMap.hpp create mode 100644 src/render/InstanceBatch.hpp create mode 100644 src/render/MaterialPreviewRenderer.cpp create mode 100644 src/render/MaterialPreviewRenderer.hpp create mode 100644 src/render/PostProcessStack.cpp create mode 100644 src/render/PostProcessStack.hpp create mode 100644 src/render/RenderFeatures.hpp create mode 100644 src/render/shaders/fullscreen.vert create mode 100644 src/render/shaders/grid.frag create mode 100644 src/render/shaders/post_adapt.frag create mode 100644 src/render/shaders/post_bloom_down.frag create mode 100644 src/render/shaders/post_bloom_prefilter.frag create mode 100644 src/render/shaders/post_bloom_up.frag create mode 100644 src/render/shaders/post_composite.frag create mode 100644 src/render/shaders/post_dof.frag create mode 100644 src/render/shaders/post_fxaa.frag create mode 100644 src/render/shaders/post_luminance.frag create mode 100644 src/render/shaders/post_motion_blur.frag create mode 100644 src/render/shaders/post_ssao.frag create mode 100644 src/render/shaders/post_ssao_blur.frag create mode 100644 src/render/shaders/post_taa.frag create mode 100644 src/render/shaders/scene_instanced.vert create mode 100644 src/render/shaders/sky.frag create mode 100644 src/script/ForwardRenderBindings.cpp create mode 100644 tests/test_forward_render_features.cpp create mode 100644 tests/test_material.cpp create mode 100644 tests/test_mesh_lod.cpp create mode 100644 tests/test_physics3d.cpp create mode 100644 tests/test_render_features.cpp create mode 100644 tools/render-snapshot/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index cada7b81..db7f06cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ option(CAFFEINE_BUILD_HEADLESS "Build caffeine-core without SDL3/RHI" OFF) # ── Scripting (Lua + sol2) ────────────────────────────────────── option(CAFFEINE_ENABLE_SCRIPTING "Enable Lua scripting support" ON) +option(CAFFEINE_ENABLE_BULLET3 "Enable Bullet3 rigid-body physics" ON) # ── Caffeine Suite (Convoy, WaveShaper) ───────────────────────── option(CAFFEINE_BUILD_CONVOY "Build Convoy art station submodule" ON) @@ -96,6 +97,8 @@ add_library(caffeine-core src/procedural/ProceduralWorldSystem.cpp src/procedural/ProceduralBindings.cpp src/script/PostProcessBindings.cpp + src/script/ForwardRenderBindings.cpp + src/render/ForwardRenderFeatures.cpp src/render/SkyboxRenderer.cpp src/engine/AssetLoader.cpp src/editor/TransformGizmo.cpp @@ -119,6 +122,37 @@ target_compile_features(caffeine-core PUBLIC cxx_std_20) set_target_properties(caffeine-core PROPERTIES POSITION_INDEPENDENT_CODE ON) target_compile_definitions(caffeine-core PUBLIC CAFFEINE_SOURCE_DIR="${CMAKE_SOURCE_DIR}") +target_sources(caffeine-core PRIVATE + src/assets/MaterialCache.cpp + src/assets/MaterialFile.cpp) + +if(CAFFEINE_ENABLE_BULLET3) + set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE) + set(BUILD_CPU_DEMOS OFF CACHE BOOL "" FORCE) + set(BUILD_OPENGL3_DEMOS OFF CACHE BOOL "" FORCE) + set(BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE) + set(BUILD_EXTRAS OFF CACHE BOOL "" FORCE) + set(BUILD_ENET OFF CACHE BOOL "" FORCE) + set(BUILD_CLSOCKET OFF CACHE BOOL "" FORCE) + set(USE_GRAPHICAL_BENCHMARK OFF CACHE BOOL "" FORCE) + set(USE_GLUT OFF CACHE BOOL "" FORCE) + set(INSTALL_LIBS OFF CACHE BOOL "" FORCE) + set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) + FetchContent_Declare( + bullet3 + GIT_REPOSITORY https://github.com/bulletphysics/bullet3.git + GIT_TAG 3.25 + GIT_SHALLOW TRUE + ) + set(CMAKE_POLICY_VERSION_MINIMUM 3.5) + FetchContent_MakeAvailable(bullet3) + target_sources(caffeine-core PRIVATE src/physics/PhysicsWorld3D.cpp) + target_include_directories(caffeine-core PUBLIC ${bullet3_SOURCE_DIR}/src) + target_link_libraries(caffeine-core PUBLIC BulletDynamics BulletCollision LinearMath) + target_compile_definitions(caffeine-core PUBLIC CF_HAS_BULLET3) +else() + target_sources(caffeine-core PRIVATE src/physics/PhysicsWorld3D.cpp) +endif() if(CAFFEINE_BUILD_HEADLESS) target_compile_definitions(caffeine-core PUBLIC CF_HEADLESS=1) @@ -139,36 +173,51 @@ else() list(APPEND _shader_formats MSL) endif() - caffeine_compile_shader(NAME sphere_lit_vert STAGE vertex SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/sphere_lit.vert" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) - caffeine_compile_shader(NAME sphere_lit_frag STAGE fragment SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/sphere_lit.frag" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) - caffeine_compile_shader(NAME mesh_lit_vert STAGE vertex SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/mesh_lit.vert" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) - caffeine_compile_shader(NAME scene_lit_vert STAGE vertex SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/scene_lit.vert" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) - caffeine_compile_shader(NAME scene_lit_frag STAGE fragment SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/scene_lit.frag" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) - caffeine_compile_shader(NAME terrain_lit_frag STAGE fragment SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/terrain_lit.frag" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) - caffeine_compile_shader(NAME shadow_depth_vert STAGE vertex SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/shadow_depth.vert" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) - caffeine_compile_shader(NAME shadow_depth_frag STAGE fragment SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/shadow_depth.frag" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) + # name|stage|file — every entry ends up in BuiltinShaders_spirv.hpp. + set(_caffeine_builtin_shaders + "sphere_lit_vert|vertex|sphere_lit.vert" + "sphere_lit_frag|fragment|sphere_lit.frag" + "mesh_lit_vert|vertex|mesh_lit.vert" + "scene_lit_vert|vertex|scene_lit.vert" + "scene_instanced_vert|vertex|scene_instanced.vert" + "scene_lit_frag|fragment|scene_lit.frag" + "terrain_lit_frag|fragment|terrain_lit.frag" + "shadow_depth_vert|vertex|shadow_depth.vert" + "shadow_depth_frag|fragment|shadow_depth.frag" + "fullscreen_vert|vertex|fullscreen.vert" + "sky_frag|fragment|sky.frag" + "grid_frag|fragment|grid.frag" + "post_luminance_frag|fragment|post_luminance.frag" + "post_adapt_frag|fragment|post_adapt.frag" + "post_bloom_prefilter_frag|fragment|post_bloom_prefilter.frag" + "post_bloom_down_frag|fragment|post_bloom_down.frag" + "post_bloom_up_frag|fragment|post_bloom_up.frag" + "post_ssao_frag|fragment|post_ssao.frag" + "post_ssao_blur_frag|fragment|post_ssao_blur.frag" + "post_dof_frag|fragment|post_dof.frag" + "post_motion_blur_frag|fragment|post_motion_blur.frag" + "post_composite_frag|fragment|post_composite.frag" + "post_fxaa_frag|fragment|post_fxaa.frag" + "post_taa_frag|fragment|post_taa.frag" + ) + set(_caffeine_shader_headers) + set(_caffeine_shader_cat_commands) + foreach(_entry_raw IN LISTS _caffeine_builtin_shaders) + string(REPLACE "|" ";" _entry "${_entry_raw}") + list(GET _entry 0 _name) + list(GET _entry 1 _stage) + list(GET _entry 2 _file) + caffeine_compile_shader(NAME ${_name} STAGE ${_stage} SOURCE "${CMAKE_SOURCE_DIR}/src/render/shaders/${_file}" OUTPUT_DIR "${CAFFEINE_GENERATED_SHADER_DIR}" FORMATS ${_shader_formats}) + list(APPEND _caffeine_shader_headers "${CAFFEINE_GENERATED_SHADER_DIR}/${_name}_spirv.hpp") + list(APPEND _caffeine_shader_cat_commands COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/${_name}_spirv.hpp" >> "${CAFFEINE_GENERATED_SHADER_DIR}/BuiltinShaders_spirv.hpp") + endforeach() set(BUILTIN_SHADERS_SPIRV_HPP "${CAFFEINE_GENERATED_SHADER_DIR}/BuiltinShaders_spirv.hpp") add_custom_command( OUTPUT "${BUILTIN_SHADERS_SPIRV_HPP}" COMMAND ${CMAKE_COMMAND} -E echo "// Auto-generated SPIR-V shader bundle" > "${BUILTIN_SHADERS_SPIRV_HPP}" - COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/sphere_lit_vert_spirv.hpp" >> "${BUILTIN_SHADERS_SPIRV_HPP}" - COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/sphere_lit_frag_spirv.hpp" >> "${BUILTIN_SHADERS_SPIRV_HPP}" - COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/mesh_lit_vert_spirv.hpp" >> "${BUILTIN_SHADERS_SPIRV_HPP}" - COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/scene_lit_vert_spirv.hpp" >> "${BUILTIN_SHADERS_SPIRV_HPP}" - COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/scene_lit_frag_spirv.hpp" >> "${BUILTIN_SHADERS_SPIRV_HPP}" - COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/terrain_lit_frag_spirv.hpp" >> "${BUILTIN_SHADERS_SPIRV_HPP}" - COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/shadow_depth_vert_spirv.hpp" >> "${BUILTIN_SHADERS_SPIRV_HPP}" - COMMAND ${CMAKE_COMMAND} -E cat "${CAFFEINE_GENERATED_SHADER_DIR}/shadow_depth_frag_spirv.hpp" >> "${BUILTIN_SHADERS_SPIRV_HPP}" - DEPENDS - "${CAFFEINE_GENERATED_SHADER_DIR}/sphere_lit_vert_spirv.hpp" - "${CAFFEINE_GENERATED_SHADER_DIR}/sphere_lit_frag_spirv.hpp" - "${CAFFEINE_GENERATED_SHADER_DIR}/mesh_lit_vert_spirv.hpp" - "${CAFFEINE_GENERATED_SHADER_DIR}/scene_lit_vert_spirv.hpp" - "${CAFFEINE_GENERATED_SHADER_DIR}/scene_lit_frag_spirv.hpp" - "${CAFFEINE_GENERATED_SHADER_DIR}/terrain_lit_frag_spirv.hpp" - "${CAFFEINE_GENERATED_SHADER_DIR}/shadow_depth_vert_spirv.hpp" - "${CAFFEINE_GENERATED_SHADER_DIR}/shadow_depth_frag_spirv.hpp" + ${_caffeine_shader_cat_commands} + DEPENDS ${_caffeine_shader_headers} ) add_custom_target(caffeine_generated_shaders DEPENDS "${BUILTIN_SHADERS_SPIRV_HPP}") else() @@ -182,6 +231,9 @@ else() src/render/ShaderCompiler.cpp src/render/GpuTextureCache.cpp src/render/GpuSceneRenderer.cpp + src/render/PostProcessStack.cpp + src/render/GpuEnvironmentMap.cpp + src/render/MaterialPreviewRenderer.cpp src/render/GpuPointShadowMap.cpp src/render/GpuDirectionalShadowMap.cpp src/render/GpuSpotShadowMap.cpp @@ -435,6 +487,7 @@ with open(sys.argv[1], 'w') as f: src/editor/HierarchyPanel.cpp src/editor/SceneViewport.cpp src/editor/AssetBrowser.cpp + src/editor/BrowseSession.cpp src/editor/AssetPreviewRenderer.cpp src/editor/EditorPreferences.cpp src/editor/InspectorPanel.cpp @@ -453,7 +506,6 @@ with open(sys.argv[1], 'w') as f: src/editor/ShaderNode.cpp src/editor/ShaderGraph.cpp src/editor/MaterialSerializer.cpp - src/assets/MaterialCache.cpp src/editor/MaterialEditorPanel.cpp src/editor/TerrainEditorPanel.cpp src/editor/EntityPresetTypes.cpp @@ -461,7 +513,6 @@ with open(sys.argv[1], 'w') as f: src/editor/EntityPresetPackages.cpp src/editor/EntityPresetFactories.cpp src/editor/EntityPresetsPanel.cpp - src/editor/PreviewRenderer.cpp src/editor/AudioPreviewPanel.cpp src/editor/CameraPreviewPanel.cpp src/editor/GameplayPreviewPanel.cpp @@ -727,5 +778,14 @@ target_link_libraries(caf-encode PRIVATE caffeine-core) target_include_directories(caf-encode PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) target_compile_features(caf-encode PRIVATE cxx_std_20) +# ── Render snapshot (reference scene → PNG through the GPU renderer) ── +if(SDL3_FOUND AND NOT CAFFEINE_BUILD_HEADLESS) + add_executable(caffeine-render-snapshot tools/render-snapshot/main.cpp) + target_link_libraries(caffeine-render-snapshot PRIVATE caffeine-core) + target_include_directories(caffeine-render-snapshot PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/vendor/stb) + target_compile_features(caffeine-render-snapshot PRIVATE cxx_std_20) +endif() + # ── Tests ──────────────────────────────────────────────────────── add_subdirectory(tests) \ No newline at end of file diff --git a/assets/benchmarks/dense_outdoor.caf b/assets/benchmarks/dense_outdoor.caf new file mode 100644 index 0000000000000000000000000000000000000000..b83a96b2a8013c8ca57843025aaa58a364366733 GIT binary patch literal 43103 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 PW1~ZrA8jo0?!Ny5>&f%A literal 0 HcmV?d00001 diff --git a/assets/plugins/post_processing/scripts/custom_effect.lua b/assets/plugins/post_processing/scripts/custom_effect.lua index 888b41fb..1bd28f65 100644 --- a/assets/plugins/post_processing/scripts/custom_effect.lua +++ b/assets/plugins/post_processing/scripts/custom_effect.lua @@ -1,15 +1,26 @@ -- Custom post-process driver (template). --- Attach path on PostProcessComponent.customEffectScript, or set via: +-- Set PostProcessComponent.customEffectScript on a camera to this file, or from any script: -- caffeine.postprocess.setCustomScript(cameraId, "scripts/postprocessing/custom_effect.lua") +-- +-- The engine calls onCreate(entityId) once and onPostProcess(entityId, dt, api) every play-mode +-- frame. `api` is bound to the camera entity: +-- api.get("bloom.intensity") -> value of any "effect.field" +-- api.set("bloom.intensity", 0.3) -> clamped write +-- api.enable("dof", true) -> toggle an effect (aliases: ao, aa, fog, dof, ssr, chromatic) +-- api.snapshot() / api.apply(table) -> whole stack as a nested table +-- api.preset("cinematic") -> cinematic | horror | arcade | reset +-- caffeine.postprocess.effects() and caffeine.postprocess.fields(effect) list everything available. -local state = { cameraId = 0, pulse = 0.0 } +local time = 0.0 function onCreate(entityId) - state.cameraId = entityId + time = 0.0 end -function onUpdate(entityId, dt) - state.pulse = state.pulse + dt - local bloom = 0.1 + math.sin(state.pulse * 0.5) * 0.05 - caffeine.postprocess.setBloom(state.cameraId, bloom) +function onPostProcess(entityId, dt, api) + time = time + dt + api.enable("bloom", true) + api.set("bloom.intensity", 0.15 + math.sin(time * 0.5) * 0.05) + api.set("vignette.intensity", 0.25 + math.sin(time * 2.0) * 0.03) + api.enable("vignette", true) end diff --git a/assets/terrain/Terrain_5.cterrain b/assets/terrain/Terrain_5.cterrain new file mode 100644 index 0000000000000000000000000000000000000000..6a776f560e2163da44b07d00b65ce9e15a1d73e4 GIT binary patch literal 66584 zcmeIuu?+wq3 **Painel:** Doppio → Material Editor +> **Core:** `Assets::MaterialSurface`, `MaterialFile` (`.mat`), `MaterialCache`, `Render::MaterialPreviewRenderer` +> **Shader:** `scene_lit.frag` / `terrain_lit.frag` + +O editor de materiais vive no **core** da engine. O Doppio só abre o painel, publica alterações no `MaterialCache` e mostra a textura GPU devolvida pelo preview renderer. + +--- + +## Fluxo de dados + +1. Abrir ou criar um `.mat` (`CAFMAT2`). +2. Sliders e combos alteram `MaterialSurface` em memória. +3. `publishLive()` grava no `MaterialCache` com a chave do ficheiro (ou `__caffeine_material_preview__.mat` durante edição). +4. O viewport e o preview leem a revisão do cache; o carimbo da cena (`EditorPanelUtils`) inclui bytes do material para redesenhar sem mover a câmara. +5. **File → Save** serializa `CAFMAT2` no disco. + +Browse de texturas usa `Widgets::AssetField` + `BrowseSession` (mesmo fluxo que o Asset Browser). + +--- + +## Secções do painel + +| Secção | Campos | +|--------|--------| +| **Preset** | Lista agrupada por categoria (`MaterialPresets.hpp`: Mirror, Chrome, Gold, Clear Glass, …) | +| **Surface** | Albedo (RGBA), metallic, roughness, reflectance | +| **Maps & UV** | Albedo / normal / ORM / emission maps; normal strength; AO strength; UV tiling & offset | +| **Transparency** | Alpha mode (Opaque / Cutout / Blend), cutoff, transmission, IOR | +| **Clear coat** | Clearcoat, coat roughness | +| **Sheen** | Cor, roughness (tecido/veludo) | +| **Iridescence** | Força, espessura do filme (nm), IOR do filme | +| **Emission** | Cor, strength, mapa de emissão | + +Albedo no editor é **sRGB**; o renderer lineariza na GPU. + +--- + +## Pré-visualização GPU + +`MaterialPreviewRenderer` monta um `World` mínimo (esfera + chão opcional, luz direcional, céu da cena ativa) e chama `GpuSceneRenderer` com: + +- HDR + stack de pós-processamento (TAA por defeito) +- **Reflection probes** (até 1 probe, resolução 32–256) +- Mesmo `scene_lit` que o viewport + +Controles **Orbit**, **Height** e **Floor** no painel. O renderer pede frames extra enquanto `needsAnotherFrame()` (TAA, probes, auto-exposure). + +Ver [`../rendering/materials-pbr.md`](../rendering/materials-pbr.md) e [`../rendering/reflections.md`](../rendering/reflections.md). + +--- + +## Ficheiros + +| Ficheiro | Função | +|----------|--------| +| `src/assets/MaterialTypes.hpp` | `MaterialSurface`, `MaterialAlphaMode` | +| `src/assets/MaterialFile.cpp` | Leitura/escrita `CAFMAT2`, `sanitizeMaterialSurface` | +| `src/assets/MaterialPresets.hpp` | Presets nomeados | +| `src/render/MaterialPreviewRenderer.cpp` | Preview offscreen | +| `src/editor/MaterialEditorPanel.cpp` | UI ImGui | diff --git a/docs/editor/scene-viewport.md b/docs/editor/scene-viewport.md index 58b524f7..5840ca65 100644 --- a/docs/editor/scene-viewport.md +++ b/docs/editor/scene-viewport.md @@ -17,7 +17,7 @@ O **Scene Viewport** renderiza a cena 3D num target offscreen GPU e compõe o re | Modo | GPU | CPU overlay | |------|-----|-------------| -| **Textured** | `GpuSceneRenderer` Phong (sem shadow passes no editor) | Marcadores, gizmos, grid — **não** redesenha meshes | +| **Textured** | `GpuSceneRenderer` PBR forward + HDR + `PostProcessStack` (TAA/SSAO defaults) | Gizmos, frustums — **não** redesenha meshes nem céu CPU se GPU cobre o viewport | | **Wireframe** | `GpuSceneRenderer` pipeline `FillMode::Line` | Idem | Alternar: botão **Textured / Wireframe** na barra do viewport. @@ -29,20 +29,20 @@ Alternar: botão **Textured / Wireframe** na barra do viewport. ## Pipeline por frame (3D) ``` -1. resizeCanvasIfNeeded(imguiFramebufferSize(viewportSize, 1280)) +1. resizeCanvasIfNeeded(imguiFramebufferSize(viewportSize, 3840)) 2. syncTerrainMeshes(world) -3. GpuSceneRenderer::render(cmd, world, ctx, colorTarget, depthTarget, opts) - ├── gatherMeshDraws (frustum cull, LOD terreno ×2 no editor) - ├── shadow passes — omitidos no editor (enableShadows=false) - └── renderMeshes (samplers dummy sempre ligados; Phong ou wireframe) -4. ImGui: skybox (CPU, throttled) → AddImage(GPU) → grid → overlays - ├── drawEmptyEntities (marcadores apenas; sem meshes se GPU activo) - ├── drawCameraFrustums - ├── drawLightGizmos - └── TransformGizmo +3. GpuSceneRenderer::renderWithCamera / render (HDR scene → PostProcessStack → RGBA8) + ├── resolveForwardRenderFeatures + PostProcessComponent (câmara selecionada ou defaults) + ├── planar reflection + reflection probes (top-level pass) + ├── shadow passes (runtime / quando enableShadows) + ├── opaque → sky GPU → grid GPU → translucent (copy opaco + blend) + └── TAA jitter, SSR history, needsAnotherFrame até convergir +4. ImGui: AddImage(GPU) → overlays (sem fake post ImGui) + ├── drawEmptyEntities, drawCameraFrustums, drawLightGizmos, TransformGizmo + └── CPU sky/grid só se gpuImageCoversViewport == false ``` -Ordem: skybox CPU → composite GPU → grid por cima do GPU (se activo) → gizmos à frente. +`renderScale` (Settings → Viewport → Rendering) multiplica a resolução interna da cena. --- @@ -82,13 +82,14 @@ Usado por: grid 3D, frustums `Camera3D`, wireframe CPU, anéis de primitivas. ```cpp // ImGuiGpuTexture.hpp -ImVec2 fb = imguiFramebufferSize(viewportSize, 1280); +ImVec2 fb = imguiFramebufferSize(viewportSize, 3840); resizeCanvasIfNeeded((u32)fb.x, (u32)fb.y); ``` - `DisplayFramebufferScale` do ImGui reflecte DPI do monitor -- Cap **1280** px no maior lado (editor); previews usam **960** -- `AddImage` estica o target GPU para o tamanho lógico do ImGui (downscale suave) +- Cap **3840** px no maior lado (viewport); camera preview até **1920**; gameplay preview até **2560** +- `ctx.renderScale` (0.25–2×) aplicado em `GpuSceneRenderOptions::renderScale` +- `cameraFarPlane()` dinâmico a partir da distância da câmara ao foco --- @@ -99,9 +100,14 @@ Construídas em `SceneViewport::render()`: | Campo | Comportamento no viewport | |-------|---------------------------| | `wireframeMeshes` | `true` em modo Wireframe | -| `enableShadows` | **`false`** no editor (shadow passes omitidos; samplers dummy ligados) | -| `terrainLodDistanceScale` | **`2.0`** — LOD de terreno mais agressivo | -| `textureQuality.enabled` | **`false`** no editor (menos churn por draw) | +| `enableShadows` | Conforme contexto (editor pode omitir passes; shader suporta PCF atlas) | +| `renderScale` | De `EditorContext` / preferências | +| `viewId` | `1` viewport, `2` camera preview (histórico TAA/SSR separado) | +| `postProcessCamera` | Entidade com `PostProcessComponent` (câmara selecionada no viewport) | +| `environmentPath` | Vazio se skybox desligado na toolbar | +| `grid` | Espaçamento derivado da distância da câmara; desenhado no GPU | +| `terrainLodDistanceScale` | **`2.0`** no editor | +| `textureQuality.enabled` | **`false`** no viewport (menos churn) | > **Nota:** `enableShadows=false` desliga apenas os **passes** de sombra. Os samplers continuam ligados — ver [shadow-mapping.md](../rendering/shadow-mapping.md#editor-vs-runtime). @@ -116,7 +122,7 @@ drawList->Flags |= ImDrawListFlags_AntiAliasedLines; drawList->Flags |= ImDrawListFlags_AntiAliasedFill; ``` -Afecta grid, gizmos e linhas ImGui — **não** substitui MSAA no pass GPU (pendente). +Afecta gizmos e linhas ImGui. Silhuetas da cena usam **TAA** no `PostProcessStack` (não MSAA hardware). --- @@ -135,6 +141,7 @@ Afecta grid, gizmos e linhas ImGui — **não** substitui MSAA no pass GPU (pend - Move speed / Orbit sensitivity - Show grid +- **Render scale** (resolução interna HDR) - **Texture quality** (raio, falloff, mínimo) — ver [`texture-quality-lod.md`](../rendering/texture-quality-lod.md) Campos em `EditorContext` sincronizados via `SettingsPanel::applyPreferencesToContext()`. @@ -157,7 +164,7 @@ Campos em `EditorContext` sincronizados via `SettingsPanel::applyPreferencesToCo | Item | Notas | |------|-------| -| MSAA no pass GPU | Não implementado; silhuetas podem serrilhar | +| MSAA hardware | Não usado; TAA + render scale > 1 melhoram bordas | | Gizmos ImGui | Sem depth test contra cena GPU (intencional — sempre visíveis) | | Runtime play | `enableShadows` conforme contexto; ver `RuntimeSceneRenderer` | @@ -168,5 +175,7 @@ Campos em `EditorContext` sincronizados via `SettingsPanel::applyPreferencesToCo - [**Performance — Editor Viewport**](../performance/editor-viewport-performance.md) - [Sessão 2026-09-22 — Viewport & Quality](../plans/2026-09-22-viewport-rendering-quality-session.md) - [Texture Quality LOD](../rendering/texture-quality-lod.md) -- [Materials Phong](../rendering/materials-phong.md) +- [Materials PBR](../rendering/materials-pbr.md) +- [Post-processing](../rendering/post-processing.md) +- [Material Editor](material-editor.md) - [Shadow Mapping](../rendering/shadow-mapping.md) diff --git a/docs/physics/physics-3d.md b/docs/physics/physics-3d.md new file mode 100644 index 00000000..bcdf0edb --- /dev/null +++ b/docs/physics/physics-3d.md @@ -0,0 +1,27 @@ +# Physics 3D (Bullet3) + +> **Namespace:** `Caffeine::Physics3D` +> **Ficheiros:** `src/physics/PhysicsComponents3D.hpp`, `PhysicsWorld3D.cpp`, `PhysicsSystem3D.hpp` +> **Estado:** 🟡 Primeira fatia — box, sphere, capsule, sync ECS no play mode +> **Pilar:** [`plans/2026-09-22-engine-pillars-roadmap.md`](../plans/2026-09-22-engine-pillars-roadmap.md) §3 + +O ECS não inclui headers do Bullet. `RigidBody3D` e `Collider3D` são POD serializáveis. Os `btRigidBody` vivem em `PhysicsWorld3D`, indexados pelo id da entidade. + +## Componentes + +| Componente | Campos | +|------------|--------| +| `RigidBody3D` | `mass`, damping, `friction`, `restitution`, `bodyType` (Dynamic / Kinematic / Static), `lockRotation` | +| `Collider3D` | `Box` (half extents), `Sphere` (`halfExtents.x` = raio), `Capsule` (`x` raio, `y` altura total), `offset`, `isTrigger` | + +Ambos são necessários. No Doppio: **Add Component → Physics 3D**. O step corre só em play mode (`SceneEditor::tickSystems`), a 1/60 s com no máximo 4 substeps. Ao sair do play mode o mundo Bullet é destruído; a cena editada volta pelo snapshot já existente. + +## Política + +- Gravidade por defeito: `(0, -9.81, 0)`. +- Corpos dinâmicos: a física escreve `Position3D`, `Transform` e `Rotation3D`. +- Corpos estáticos e cinemáticos: a pose do ECS é empurrada para o Bullet em cada frame. +- Escala de `Scale3D` / `Transform.scale` entra no tamanho do collider. +- Terreno heightfield, mesh convexa, debug draw e joints ainda não estão ligados. + +Build: `CAFFEINE_ENABLE_BULLET3=ON` (defeito). Sem a flag, `PhysicsWorld3D::isAvailable()` devolve false e o sistema é no-op. diff --git a/docs/plans/2026-09-21-rendering-roadmap.md b/docs/plans/2026-09-21-rendering-roadmap.md index cc1c0d09..baa7152f 100644 --- a/docs/plans/2026-09-21-rendering-roadmap.md +++ b/docs/plans/2026-09-21-rendering-roadmap.md @@ -2,7 +2,7 @@ > **Objetivo:** renderizar ambientes 3D com alto volume de polígonos e texturas de forma **otimizada, consistente e estável** (sem spikes de FPS). > **Critério de “completo”:** cena densa (terreno + centenas de meshes texturizados + iluminação dinâmica + sombras) a 60 FPS estáveis no editor e no runtime. -> **Estado atual (2026-09-22):** viewport 3D GPU com Phong + CSM + sombras point/spot; runtime GPU-first; `GpuTextureCache` com mips, refcount e **LOD de texturas por distância**; wireframe GPU (`FillMode::Line`); HiDPI com cap 1920px; mesh geometry LOD é stub; batching pendente. +> **Estado atual (2026-10-02):** viewport GPU; cap editor 1280 px; mesh LOD; GGX + ACES; sombras no editor só com a câmara parada e **1 cascata**. Instancing e IBL estão no passe principal (ligados por defeito). Oclusão coarse, reflexos (planar / screen-space / probe) e volumétricos são opcionais e ficam desligados — reflexos e probes só correm com a câmara parada. Cena `assets/benchmarks/dense_outdoor.caf`. O gate p95 < 16.6 ms ainda não foi medido no editor. --- @@ -50,7 +50,7 @@ Cada fase tem entregável testável. **Não avançar** para reflexos/volumétric | P0.2 | Remover fallback CPU exceto wireframe/debug | `SceneViewport.cpp` | ✅ (GPU texturizado + wireframe `FillMode::Line`) | | P0.3 | Upload de buffers **antes** do render pass (já parcial) | `GpuSceneRenderer.cpp` | | P0.4 | Runtime play mode usar `GpuSceneRenderer` (hoje CPU-only) | `RuntimeSceneRenderer.cpp` | ✅ | -| P0.5 | Profiler markers por pass (shadow, opaque, terrain, composite) | `Profiler.hpp`, viewport | +| P0.5 | Profiler markers por pass (shadow, opaque, terrain, composite) | `Profiler.hpp`, viewport | ✅ | **Métrica de sucesso:** viewport 3D sem `MeshCpuRasterizer` em modo shaded; FPS estável ±5% ao orbitar câmara. @@ -66,14 +66,14 @@ Cada fase tem entregável testável. **Não avançar** para reflexos/volumétric |--------|-----------|-----------| | P1.1 | `GpuTextureCache` central (path → `GPUTexture`, refcount) | `src/render/GpuTextureCache.*` | ✅ | | P1.2 | Geração de mipmaps no upload | `GpuTextureCache.cpp`, `RenderDevice.cpp` | ✅ | -| P1.3 | Bind albedo + normal + ORM no `scene_lit` | `scene_lit.frag`, `MeshComponents.hpp` | ✅ albedo + normal + shininess | +| P1.3 | Bind albedo + normal + ORM no `scene_lit` | `scene_lit.frag`, `MaterialFile`, Material Editor | ✅ albedo, normal, ORM, emissão; o `.mat` alimenta o passe | | P1.4 | Async decode (job system) + upload no frame N+1 | `JobSystem`, `AssetManager` | | P1.5 | Atlas opcional para props repetidos (instancing) | `TextureAtlas.hpp` (estender) | | P1.6 | LOD de texturas por distância aos visualizadores (tiers em cache) | `TextureQuality.hpp`, `GpuTextureCache.*` | ✅ | **Métrica:** 0 `stbi_load` durante render loop; memória GPU estável após warm-up. -**Doc:** [`assets/asset-manager.md`](../assets/asset-manager.md), [`rendering/texture-quality-lod.md`](../rendering/texture-quality-lod.md), nova `docs/rendering/materials-pbr.md` +**Doc:** [`assets/asset-manager.md`](../assets/asset-manager.md), [`rendering/texture-quality-lod.md`](../rendering/texture-quality-lod.md), [`rendering/materials-pbr.md`](../rendering/materials-pbr.md) --- @@ -83,15 +83,15 @@ Cada fase tem entregável testável. **Não avançar** para reflexos/volumétric | Tarefa | Descrição | Ficheiros | |--------|-----------|-----------| -| P2.1 | Mesh LOD real (simplificação ou LOD chains no import) | `MeshLOD.cpp`, pipeline `.caf` | -| P2.2 | Seleção LOD por distância + hysteresis (como terreno) | `GpuSceneRenderer.cpp` | -| P2.3 | Frustum + occlusion coarse (octree já existe) | `GpuSceneRenderer.cpp` | -| P2.4 | Instancing para meshes repetidos (árvores, props) | novo pass instanced | +| P2.1 | Mesh LOD real (simplificação ou LOD chains no import) | `MeshLOD.cpp`, pipeline `.caf` | ✅ clustering; import chains ainda não | +| P2.2 | Seleção LOD por distância + hysteresis (como terreno) | `GpuSceneRenderer.cpp` | ✅ | +| P2.3 | Frustum + occlusion coarse (octree já existe) | `CoarseOcclusion.hpp` | ✅ off por defeito; modo Coarse | +| P2.4 | Instancing para meshes repetidos (árvores, props) | `drawIndexedInstanced` | ✅ até 256 por batch | | P2.5 | Terreno: collision mesh separado (feito); GPU chunks estáveis | `TerrainLodSystem.*` | **Métrica:** draw calls < 200 para cena de referência; triângulos visíveis escalam com LOD. -**Doc:** nova `docs/rendering/mesh-lod.md` +**Doc:** [`rendering/mesh-lod.md`](../rendering/mesh-lod.md) --- @@ -102,9 +102,9 @@ Cada fase tem entregável testável. **Não avançar** para reflexos/volumétric | Tarefa | Descrição | Ficheiros | |--------|-----------|-----------| | P3.1 | UBO de luzes unificado (dir/point/spot, até N luzes) | `LightingSystem.*`, shaders | -| P3.2 | PBR: metallic/roughness, Fresnel, GGX | `scene_lit.frag` | -| P3.3 | IBL básico (cubemap skybox como ambiente) | `SkyboxRenderer`, shader | -| P3.4 | Tone mapping (ACES) + exposure | shader + `PostProcess` GPU futuro | +| P3.2 | PBR: metallic/roughness, Fresnel, GGX | `scene_lit.frag` | ✅ specular GGX; diffuse Lambert | +| P3.4 | Tone mapping (ACES) + exposure | shader + `PostProcess` GPU futuro | ✅ ACES no `scene_lit` | +| P3.3 | IBL básico (irradiance + probe opcional) | `scene_lit.frag` | ✅ cor de ambiente; probe se o modo estiver ativo | | P3.5 | Spot lights no GPU (hoje só CPU) | `scene_lit.frag` | ✅ | **Métrica:** esfera de referência + terreno com resposta física plausível; sem banding em gradientes. @@ -124,7 +124,7 @@ Cada fase tem entregável testável. **Não avançar** para reflexos/volumétric | P4.3 | PCF / PCSS no `scene_lit.frag` | shaders | ✅ PCF 3×3 | | P4.4 | Terreno `castShadows` no gather GPU | `GpuSceneRenderer.cpp` | ✅ | | P4.5 | Spot shadow maps (1–2 luzes) | `GpuSpotShadowMap.*` | ✅ | -| P4.6 | Desligar CPU shadow path no editor quando GPU OK | `SceneViewport.cpp` | ✅ | +| P4.6 | Desligar CPU shadow path no editor quando GPU OK | `SceneViewport.cpp` | ✅ editor: 1 cascata só com câmara parada | | P4.7 | Point light cubemap shadows (até 2) | `GpuPointShadowMap.*` | ✅ | **Infra ligada:** `GpuDirectionalShadowMap`, `GpuPointShadowMap`, `shadow_depth.*` — ver [`rendering/shadow-mapping.md`](../rendering/shadow-mapping.md) @@ -148,9 +148,9 @@ Cada fase tem entregável testável. **Não avançar** para reflexos/volumétric | Tarefa | Descrição | |--------|-----------| -| P5.1 | Pass de reflexão planar + clip plane | -| P5.2 | SSR com depth + normal buffer (exige G-buffer parcial) | -| P5.3 | Probes automáticos em interiores | +| P5.1 | Pass de reflexão planar + clip plane | ✅ meia resolução, só com câmara parada | +| P5.2 | SSR sobre o alvo planar (passos configuráveis, sem G-buffer) | ✅ | +| P5.3 | Probe cubemap local, 16–128 px, recaptura quando a câmara assenta | ✅ | **Pré-requisito:** P4 + depth prepass ou G-buffer mínimo. @@ -164,9 +164,9 @@ Cada fase tem entregável testável. **Não avançar** para reflexos/volumétric | Tarefa | Descrição | |--------|-----------| -| P6.1 | Ray marching fullscreen (luz dir + depth) | -| P6.2 | Froxel grid ou 3D texture para fog local | -| P6.3 | Integração com sombras (sample shadow map no march) | +| P6.1 | Ray march no shader forward (6 ou 12 passos) | ✅ não redesenha a cena | +| P6.2 | Nevoeiro por altura (sem textura 3D) | ✅ | +| P6.3 | Amostra opcional do shadow map no march | ✅ | **Nota:** `PostProcessRenderer` atual é overlay ImGui — não conta como volumétrico GPU. @@ -176,12 +176,13 @@ Cada fase tem entregável testável. **Não avançar** para reflexos/volumétric ## Cena de referência (benchmark interno) -Criar `assets/benchmarks/dense_outdoor.caf`: +`assets/benchmarks/dense_outdoor.caf` (constantes em `DenseOutdoorBenchmark.hpp`): -- Terreno 512² com splat (plugin) -- 200–500 meshes instanciados (árvores/rochas) +- Terreno 129² (sobe para 512 em `kDenseOutdoorTerrainResolution` quando o orçamento aguentar) +- 240 esferas + 40 cubos, o mesmo mesh para instancing - 1 direcional + 2 point + 1 spot -- Câmara orbit com medição de frame time (p50, p95, p99) +- Plano de água em Y = 0 para o modo planar +- Frame time no profiler do editor (p50 / p95 / p99 ainda manuais) **Gate de qualidade:** p95 frame time < 16.6 ms @ 1080p antes de marcar fase como done. @@ -209,3 +210,6 @@ Criar `assets/benchmarks/dense_outdoor.caf`: | [`plans/2026-09-22-viewport-rendering-quality-session.md`](2026-09-22-viewport-rendering-quality-session.md) | Sessão viewport: HiDPI, wireframe GPU, LOD texturas | | [`rendering/texture-quality-lod.md`](../rendering/texture-quality-lod.md) | LOD de texturas por distância | | [`editor/scene-viewport.md`](../editor/scene-viewport.md) | Pipeline do Scene Viewport 3D | +| [`rendering/mesh-lod.md`](../rendering/mesh-lod.md) | LOD de meshes por clustering | +| [`rendering/reflections.md`](../rendering/reflections.md) | Planar, screen-space e probe | +| [`rendering/volumetric-lighting.md`](../rendering/volumetric-lighting.md) | Nevoeiro analítico | diff --git a/docs/plans/2026-09-22-engine-pillars-roadmap.md b/docs/plans/2026-09-22-engine-pillars-roadmap.md index fe453aed..cee0c50a 100644 --- a/docs/plans/2026-09-22-engine-pillars-roadmap.md +++ b/docs/plans/2026-09-22-engine-pillars-roadmap.md @@ -2,7 +2,7 @@ > **Objetivo:** definir de forma **sólida e verificável** os subsistemas que a Caffeine Engine deve ter como base de produção — independentemente de features de editor ou plugins. > **Critério de “completo”:** cada pilar tem requisitos, critérios de aceitação e estado atual documentados. -> **Última atualização:** 2026-09-22 +> **Última atualização:** 2026-10-01 Este documento complementa: - [`2026-09-21-rendering-roadmap.md`](2026-09-21-rendering-roadmap.md) — detalhe técnico de rendering 3D @@ -55,7 +55,7 @@ flowchart LR ### 1. Rendering 3D Phong (sombras dinâmicas, bump mapping, câmaras) -**Estado:** 🟡 Parcial — Phong GPU + CSM (4 cascatas) + sombras point/spot GPU; normal maps mesh+terreno; runtime GPU-first; `GpuTextureCache` com mips e **LOD de texturas por distância**; viewport HiDPI (cap 1920px), wireframe GPU (`FillMode::Line`), skip shadows em movimento rápido; CPU shadows off no viewport GPU. Falta: mesh geometry LOD/batching, 60 FPS gate. +**Estado:** 🟡 Parcial — Phong GPU + CSM + sombras point/spot no runtime; normal maps; `GpuTextureCache`. Editor (2026-09-23 / 10-01): **~10 → ~100 FPS**, shadow passes desligados no viewport (samplers sempre ligados), cache de frame GPU invalidado por câmera **e** conteúdo da cena (transforms/terreno), skybox com raster adaptativo ao movimento, profiler hierárquico (`self` / `total`). Cap offscreen do editor: 1280 px. Falta: mesh geometry LOD/batching, sombras GPU de volta no editor sem quebrar o budget de 16 ms, gate formal de 60 FPS. **Deve ter de forma sólida:** @@ -71,7 +71,7 @@ flowchart LR **Relação com PBR:** Phong é o **degrau imediato** (P0 rendering). O deferred PBR (P1) evolui sobre a mesma infraestrutura de G-buffer, shadow maps e materiais — não substitui o trabalho de câmaras, sombras e normal mapping. -**Docs:** [`rendering/materials-phong.md`](../rendering/materials-phong.md), [`rendering/shadow-mapping.md`](../rendering/shadow-mapping.md), [`rendering/texture-quality-lod.md`](../rendering/texture-quality-lod.md), [`editor/scene-viewport.md`](../editor/scene-viewport.md), [`2026-09-21-rendering-roadmap.md`](2026-09-21-rendering-roadmap.md), [`2026-09-22-phong-gpu-handles-session.md`](2026-09-22-phong-gpu-handles-session.md), [`2026-09-22-viewport-rendering-quality-session.md`](2026-09-22-viewport-rendering-quality-session.md) +**Docs:** [`rendering/materials-phong.md`](../rendering/materials-phong.md), [`rendering/shadow-mapping.md`](../rendering/shadow-mapping.md), [`rendering/texture-quality-lod.md`](../rendering/texture-quality-lod.md), [`editor/scene-viewport.md`](../editor/scene-viewport.md), [`performance/editor-viewport-performance.md`](../performance/editor-viewport-performance.md), [`2026-09-21-rendering-roadmap.md`](2026-09-21-rendering-roadmap.md), [`2026-09-22-phong-gpu-handles-session.md`](2026-09-22-phong-gpu-handles-session.md), [`2026-09-22-viewport-rendering-quality-session.md`](2026-09-22-viewport-rendering-quality-session.md) --- @@ -97,7 +97,7 @@ flowchart LR ### 3. Física rigid body (Bullet3) -**Estado:** 🔴 Não iniciado (3D) — Physics 2D custom existe; menções a Jolt/Bullet em planning apenas. +**Estado:** 🟡 Em curso (2026-10-01) — `btDiscreteDynamicsWorld` com box, sphere e capsule; `RigidBody3D` + `Collider3D` (POD, serializados); sync no play mode do Doppio; gravidade e fixed step 1/60. Falta: heightfield/mesh de terreno, convex mesh, debug draw, joints, teste cross-platform de determinismo. **Deve ter de forma sólida:** @@ -111,6 +111,8 @@ flowchart LR **Dependências:** ECS, math, terreno collision mesh (`TerrainCollisionMeshBuilder`). +**Docs:** [`physics/physics-3d.md`](../physics/physics-3d.md), [`physics/physics-2d.md`](../physics/physics-2d.md) + **Nota:** Bullet3 escolhido explicitamente como backend; abstração `IPhysicsWorld3D` para não acoplar ECS ao Bullet em todo o código. --- @@ -297,9 +299,9 @@ flowchart LR | # | Pilar | Tier | Estado | Backend / notas | |---|-------|------|--------|-----------------| -| 1 | Phong 3D + sombras + bump + câmaras | P0 | 🟡 Parcial | CSM + point/spot GPU; `GpuTextureCache`; `Camera3DControllerComponent` | +| 1 | Phong 3D + sombras + bump + câmaras | P0 | 🟡 Parcial | Editor ~100 FPS; cache GPU por conteúdo; sombras off no editor | | 2 | Eventos + timers + tipos custom | P0 | 🟡 Parcial | `EventBus` + `TimerScheduler` | -| 3 | Rigid body 3D | P0 | 🔴 Não iniciado | **Bullet3** | +| 3 | Rigid body 3D | P0 | 🟡 Em curso | **Bullet3** box/sphere/capsule + play mode | | 4 | Áudio 3D | P0 | 🟡 Parcial | **OpenAL** | | 5 | ECS próprio + editor/runtime | P0 | 🟢 Avançado | Core da engine | | 6 | Handles + refcount | P0 | 🟡 Parcial | Generation + RAII + LRU + `GpuTextureCache` | @@ -509,3 +511,17 @@ Esta branch isola o **Plugin SDK** do core do Doppio: - Ver [`docs/editor/plugin-sdk.md`](../editor/plugin-sdk.md) **Impacto nos pilares:** o pilar 10 (Scene + tipos user) e o pilar 5 (ECS reflection) beneficiam diretamente desta arquitetura — plugins registam drawers e serializers sem recompilar o editor. + +--- + +## Próximo corte (a partir de 2026-10-01) + +Ordem ainda válida. O corte activo é o **pilar 3**: + +1. ~~World Bullet + box/sphere/capsule + sync play mode~~ +2. Heightfield a partir de `TerrainComponent` / `TerrainCollisionMeshBuilder` +3. Debug draw de colliders no viewport (toggle já previsto) +4. Convex mesh a partir de `MeshFilter` +5. Voltar sombras GPU ao editor só quando o frame couber em 16 ms (pilar 1) + +OpenAL (pilar 4) fica a seguir, depois de o terreno colidir. diff --git a/docs/plans/2026-10-02-forward-pbr-post-session.md b/docs/plans/2026-10-02-forward-pbr-post-session.md new file mode 100644 index 00000000..5d79e901 --- /dev/null +++ b/docs/plans/2026-10-02-forward-pbr-post-session.md @@ -0,0 +1,57 @@ +# Sessão 2026-10-02 — Forward PBR, reflexos, pós-processamento GPU + +> Resumo técnico do bloco que move renderização e materiais para o **core** (`caffeine-core`), com o Doppio como cliente. + +--- + +## Pipeline de renderização + +- Cena **HDR linear** (`RGBA16F`) → `PostProcessStack` → saída `RGBA8`. +- **TAA** por defeito (`PostProcessStack::defaults`, `antiAliasing.mode = 1`); jitter na projeção. +- **SSAO** suave nos defaults quando não há `PostProcessComponent` na câmara. +- Alvos por vista (ping-pong) para histórico TAA/SSR; `renderScale` 0.25–2× no editor. +- Céu GPU (`sky.frag`), grelha GPU (`grid.frag`), sem overlays ImGui de “fake post”. +- Sombras: atlas direcional 4096, cascatas 2048, spot 1024, point faces 512; projeção z remapeada para SDL `[0,1]`; PCF 12-tap com bias por texel. + +## Materiais PBR (`scene_lit.frag`) + +- Metallic-roughness + clearcoat, sheen, iridescence, transmission/IOR, alpha modes. +- Pass translúcido: cópia do opaco + blend / transmissão. +- Texturas sRGB→linear na CPU; ORM, normal strength, emission map. + +## Reflexos (`ReflectionMode::Probe` por defeito) + +- Probes por objeto (LRU, captura incremental, cubemap HDR com mips). +- SSR opcional (post + features); reflexão planar HDR; `excludeEntity` na captura. +- Material preview e snapshot usam a mesma stack. + +## ECS opcional (não são settings do editor) + +- `ForwardRenderFeaturesComponent` — instancing, IBL, oclusão coarse, reflexos, volumétricos. +- `PostProcessComponent` — stack modular executado na GPU. +- `PostProcessFields.hpp` — reflexão `effect.field` para Lua/C++. + +## Scripting Lua + +- `caffeine.postprocess.*` completo (`get`/`set`/`getValue`/`setValue`/`effects`/`fields`/`blend`/`handle`). +- `customEffectScript` → `onPostProcess(entityId, dt, api)` em play mode (`ScriptSystem`). +- `caffeine.forwardrender.*` (`ForwardRenderBindings.cpp`). + +## Editor (Doppio) + +- Material Editor: presets, todas as secções PBR, `AssetField` reutilizável. +- `MaterialPreviewRenderer` substitui `PreviewRenderer` CPU. +- Settings → Viewport → **Render scale** (persistido). +- `cameraFarPlane()` dinâmico; cap de framebuffer 3840. +- Inspector: Forward Render Features + Post Process (UI partilhada em `PostProcessEditorUI.hpp`). + +## Ferramentas e testes + +- `caffeine-render-snapshot` — PNG de regressão. +- Testes: `[material]`, `[forwardrender]`, `[render]`, `test_mesh_lod`, `test_physics3d`, etc. + +## Documentação + +- `docs/rendering/*` (PBR, reflexos, forward features, post, snapshot, mesh LOD, volumétricos). +- `docs/editor/material-editor.md` +- `docs/physics/physics-3d.md` diff --git a/docs/rendering/forward-render-features.md b/docs/rendering/forward-render-features.md new file mode 100644 index 00000000..9d6899b6 --- /dev/null +++ b/docs/rendering/forward-render-features.md @@ -0,0 +1,61 @@ +# Forward render features + +> **Componente:** `ForwardRenderFeaturesComponent` +> **Resolver:** `Render::resolveForwardRenderFeatures` +> **Lua:** `caffeine.forwardrender.*` +> **GPU:** `GpuSceneRenderer` (`resolveFeaturesFromScene` por defeito) + +Instancing, IBL, oclusão CPU, reflexos e volumétricos **não** vivem nas preferências do editor. São capacidades da cena — como o stack de pós-processamento — que o renderer resolve a cada frame. + +## Componente ECS + +Adiciona **Rendering → Forward Render Features** a uma entidade de ambiente (por exemplo `RenderEnvironment` na cena `dense_outdoor.caf`). + +Sub-blocos: + +| Bloco | Função | +|-------|--------| +| Instancing | `drawIndexedInstanced`, até 256 por batch (ligado por defeito) | +| IBL | Difuso e especular a partir do céu da cena (`diffuse` 1.0, `specular` 1.0 por defeito). Com IBL ligado, substitui o ambiente plano | +| Occlusion | Oclusão coarse na CPU (off por defeito) | +| Reflections | Planar, screen-space, probe | +| Volumetrics | Nevoeiro analítico no forward shader | + +Sem componente na cena, `budgetSafeForwardDefaults()` devolve `RenderFeatureSettings` com: + +| Capacidade | Default | +|------------|---------| +| Instancing | ligado (256/batch) | +| IBL | ligado (diffuse/specular 1.0) | +| Occlusion | desligado | +| Reflections | **Probe** + screen-space trace | +| Volumetrics | desligado | + +O componente é gravado no `.caf` (tipo 45). + +## Lua + +```lua +caffeine.forwardrender.ensure(entityId) +caffeine.forwardrender.setReflections(entityId, true, 1) -- planar +caffeine.forwardrender.setVolumetrics(entityId, true, 2) -- medium +caffeine.forwardrender.setOcclusion(entityId, true) +``` + +## C++ + +```cpp +auto& fx = world.add(entity); +fx.reflections.enabled = true; +fx.reflections.mode = Render::ReflectionMode::Planar; + +Render::RenderFeatureSettings settings = Render::resolveForwardRenderFeatures(world); +``` + +Para testes ou ferramentas que injetem parâmetros manualmente, `GpuSceneRenderOptions::resolveFeaturesFromScene = false` e preenche `features` à mão. + +## Ver também + +- [`reflections.md`](reflections.md) +- [`volumetric-lighting.md`](volumetric-lighting.md) +- [`post-processing.md`](post-processing.md) diff --git a/docs/rendering/materials-pbr.md b/docs/rendering/materials-pbr.md new file mode 100644 index 00000000..c6e7418b --- /dev/null +++ b/docs/rendering/materials-pbr.md @@ -0,0 +1,42 @@ +# Materiais PBR (forward) + +> **Ficheiro:** `.mat` (`CAFMAT2`, `CAFMAT1` ainda lê o cabeçalho) +> **Core:** `MaterialSurface`, `MaterialFile`, `MaterialCache` +> **Shader:** `scene_lit.frag` +> **Editor:** Material Editor + +O viewport deixa de ignorar o material atribuído ao mesh. O `.mat` é a superfície que o passe forward já consome: albedo, metallic, roughness, emissão e mapas. O grafo de nós antigo compilava GLSL que o `GpuSceneRenderer` nunca executava. + +## Parâmetros + +| Campo | Efeito | +|-------|--------| +| Albedo | Multiplica a textura de albedo | +| Metallic / Roughness | GGX e IBL. Um mapa ORM substitui os dois sliders por texel | +| Reflectance | F0 dos dielétricos no `scene_lit` (por defeito 0.04). Metais usam o albedo | +| Emission | Cor × força, somada antes do tone map | +| Albedo Map / Normal Map | Usados quando o mesh não tem textura própria | +| ORM Map | R oclusão, G roughness, B metallic | +| UV tiling / offset | Multiplica coordenadas no vertex shader | +| Alpha mode | Opaque, Cutout (`alphaCutoff`), Blend (pass separado + cópia opaca) | +| Transmission / IOR | Vidro: refract + Fresnel; IOR típico vidro 1.5 | +| Clear coat | Segunda lobe GGX | +| Sheen | Tecidos (cor + roughness) | +| Iridescence | Filme fino (espessura nm, IOR filme) | +| Emission map | sRGB→linear, × `emissionStrength` | + +O mapa do mesh (Albedo Texture / Normal Map no inspector) continua à frente do mapa do material. Metallic e roughness do ficheiro ganham ao material embutido do glTF. + +Presets nomeados: `src/assets/MaterialPresets.hpp` (Mirror, Chrome, Clear Glass, …). + +## Onde editar + +- Asset Browser → criar Material, abrir o `.mat`. +- Inspector → Mesh Filter → Material, em primitivas e em meshes custom. **Edit Material** abre o painel. +- Os sliders publicam no `MaterialCache` na hora. **File → Save** grava o `CAFMAT2`. O carimbo da cena inclui a revisão do cache, por isso o viewport redesenha sem órbita da câmara. + +Ficheiros `CAFMAT1` abrem com albedo, metallic e roughness do cabeçalho. O grafo deixa de ser avaliado. + +## Pré-visualização + +A esfera do Material Editor é desenhada pelo `GpuSceneRenderer` (`Render::MaterialPreviewRenderer`), com o mesmo `scene_lit`, HDR, TAA, pós-processamento, céu da cena e reflection probe. **Orbit**, **Height** e **Floor** controlam a câmara e o chão. Documentação do painel: [`../editor/material-editor.md`](../editor/material-editor.md). Reflexos: [`reflections.md`](reflections.md). diff --git a/docs/rendering/materials-phong.md b/docs/rendering/materials-phong.md index 0238c290..c12a50cd 100644 --- a/docs/rendering/materials-phong.md +++ b/docs/rendering/materials-phong.md @@ -9,14 +9,14 @@ ## Visão geral -A Caffeine usa **Phong clássico** como modelo de iluminação imediato antes da evolução para PBR deferred: +Meshes com um `.mat` usam metallic, roughness, ORM e emissão. Ver [`materials-pbr.md`](materials-pbr.md). O passe GPU avalia: ``` -final = ambient + Σ (diffuse + specular) × shadowAttenuation +final = ambient + Σ (diffuse Lambert + specular GGX) × shadow ``` -- **Diffuse:** `max(dot(N, L), 0) × albedo × lightColor` -- **Specular:** `pow(max(dot(R, V), 0), shininess) × lightColor` +- **Diffuse:** `max(dot(N, L), 0) × albedo × lightColor × (1 - metallic)` +- **Specular:** GGX com roughness e metallic - **Normal mapping:** perturbação de `N` via TBN e textura normal (meshes) ou triplanar (terreno) --- diff --git a/docs/rendering/mesh-lod.md b/docs/rendering/mesh-lod.md new file mode 100644 index 00000000..a0e133de --- /dev/null +++ b/docs/rendering/mesh-lod.md @@ -0,0 +1,13 @@ +# Mesh LOD + +Meshes with at least 600 indices get two clustered LODs (Rossignac vertex clustering) in `GpuSceneRenderer`. The source mesh is never rewritten. + +| Distância (mundo / escala) | LOD | +|----------------------------|-----| +| < 40 m | original | +| 40–110 m | célula = 4.5% da diagonal | +| > 110 m | célula = 12% da diagonal | + +A troca usa hysteresis de 12% para não oscilar na fronteira. Terreno continua no `TerrainLodSystem`. Objetos perto da câmara, incluindo a esfera do viewport, ficam no LOD 0. + +Instancing GPU ainda não existe: `CommandBuffer` só tem `drawIndexed`. Occlusion culling também não — só frustum. diff --git a/docs/rendering/post-processing.md b/docs/rendering/post-processing.md index f8f0eb73..e187b1b4 100644 --- a/docs/rendering/post-processing.md +++ b/docs/rendering/post-processing.md @@ -1,9 +1,9 @@ # 🎨 Post-Processing Stack > **Component:** `PostProcessComponent` on camera entities -> **Plugin:** `post_processing_plugin.so` +> **Plugin:** `post_processing_plugin.so` (UI + presets; execution is in the engine) > **Lua API:** `caffeine.postprocess.*` -> **Preview:** ImGui overlay (editor); full GPU stack planned in rendering roadmap P3+ +> **GPU:** `Render::PostProcessStack` (HDR scene → bloom/SSAO/DoF/TAA/tonemap → RGBA8) --- @@ -11,6 +11,8 @@ O stack é **modular** — cada efeito é um módulo independente com toggle e parâmetros. Presets (Cinematic, Horror, Arcade) são **benchmark looks** opcionais, não tipos de jogo. +Câmaras sem `PostProcessComponent` usam `PostProcessStack::defaults()` (TAA + color grading + SSAO suave). + --- ## Módulos de efeito @@ -19,18 +21,20 @@ O stack é **modular** — cada efeito é um módulo independente com toggle e p |--------|-----------|----------------------| | **Anti-aliasing** | Pre-processing | FXAA / TAA, sharpness | | **Ambient occlusion** | Pre-processing | intensity, radius, bias | -| **Auto exposure** | Color | min/max, adaptation speed | +| **Auto exposure** | Color | min/max, adaptation speed, compensation | | **Color grading** | Color | exposure, contrast, saturation, temperature, tint | | **Bloom** | Image | intensity, threshold, scatter | -| **Depth of field** | Image | focus distance, aperture, max blur | +| **Depth of field** | Image | focus distance, aperture, focal length, max blur | | **Motion blur** | Image | intensity, max velocity | | **Chromatic aberration** | Image | intensity | | **Lens distortion** | Image | intensity | | **Grain** | Image | intensity, size | | **Vignette** | Image | intensity, smoothness | -| **Screen space reflections** | Screen space | intensity, max roughness | +| **Screen space reflections** | Screen space | intensity, max roughness, max steps | | **Deferred fog** | Atmosphere | density, start/end, color | +Todos os campos são expostos em Lua como `"efeito.campo"` (ver `src/ecs/PostProcessFields.hpp`). + --- ## Editor @@ -49,23 +53,30 @@ UI partilhada: `include/caffeine/postprocess/PostProcessEditorUI.hpp` ### Controlar efeitos em runtime ```lua +caffeine.postprocess.add(cameraId) caffeine.postprocess.setEnabled(cameraId, true) -caffeine.postprocess.setExposure(cameraId, 1.2) -caffeine.postprocess.setBloom(cameraId, 0.3) -caffeine.postprocess.setVignette(cameraId, 0.4) -caffeine.postprocess.enableEffect(cameraId, "motionBlur", true) -caffeine.postprocess.enableEffect(cameraId, "ssr", true) +caffeine.postprocess.setValue(cameraId, "bloom.intensity", 0.35) +caffeine.postprocess.enableEffect(cameraId, "dof", true) +caffeine.postprocess.applyPreset(cameraId, "cinematic") +local fx = caffeine.postprocess.get(cameraId) -- tabela aninhada por efeito +local api = caffeine.postprocess.handle(cameraId) -- handle para scripts custom caffeine.postprocess.setCustomScript(cameraId, "scripts/postprocessing/custom_effect.lua") -local snapshot = caffeine.postprocess.get(cameraId) ``` +Conveniência: `setExposure`, `setBloom`, `setVignette`, `setFog`, `setAmbientOcclusion`, `setAntiAliasing("taa"|"fxaa"|"off")`, etc. + +Descoberta: `caffeine.postprocess.effects()` e `caffeine.postprocess.fields("bloom")`. + ### Efeitos custom (Lua) -Definir `customEffectScript` no componente e implementar `onCreate` / `onUpdate` para animar ou combinar módulos. +Definir `customEffectScript` no componente. Em play mode o engine chama: -Template: `assets/plugins/post_processing/scripts/custom_effect.lua` +- `onCreate(entityId)` uma vez +- `onPostProcess(entityId, dt, api)` cada frame (`api` = `caffeine.postprocess.handle(entityId)`) + +Fallback: se não existir `onPostProcess`, usa `onUpdate(entityId, dt)`. -Escrita de **efeitos GPU custom** (shaders HLSL/GLSL no stack) está planeado para quando o render graph GPU unificar passes de pós-processamento — ver [`plans/2026-09-21-rendering-roadmap.md`](../plans/2026-09-21-rendering-roadmap.md) fase P3+. +Template: `assets/plugins/post_processing/scripts/custom_effect.lua` --- @@ -74,8 +85,10 @@ Escrita de **efeitos GPU custom** (shaders HLSL/GLSL no stack) está planeado pa | Ficheiro | Função | |----------|--------| | `src/ecs/PostProcessComponents.hpp` | Structs por efeito | +| `src/ecs/PostProcessFields.hpp` | Tabela de reflexão effect.field | | `include/caffeine/postprocess/PostProcessEditorUI.hpp` | UI ImGui partilhada | | `include/caffeine/postprocess/PostProcessPresets.hpp` | Benchmark looks | -| `src/render/PostProcessRenderer.hpp` | Preview overlay (editor) | +| `src/render/PostProcessStack.cpp` | Passes GPU | +| `src/render/PostProcessRenderer.hpp` | Resolve componente na câmara | | `src/script/PostProcessBindings.cpp` | Lua API | -| `apps/plugins/post_processing_plugin/` | Painel do plugin | +| `src/script/ScriptSystem.cpp` | Executa `customEffectScript` em play mode | diff --git a/docs/rendering/reflections.md b/docs/rendering/reflections.md new file mode 100644 index 00000000..010b613d --- /dev/null +++ b/docs/rendering/reflections.md @@ -0,0 +1,48 @@ +# Reflexos + +> **Resolver:** `Render::resolveForwardRenderFeatures` +> **GPU:** `GpuSceneRenderer` (planar, SSR, probes por objeto) +> **Shader:** `scene_lit.frag` (slots environment + probe + SSR) + +Configura no componente **Forward Render Features** (Inspector) ou via `caffeine.forwardrender.*`. +**Sem componente na cena**, `budgetSafeForwardDefaults()` usa **Probe** + screen-space trace ligado. + +| Modo | O que faz | Custo | +|------|-----------|--------| +| **Off** | Apenas IBL / céu | Mínimo | +| **Planar** | Redesenho espelhado em Y (`planeY`), alvo HDR, `resolutionScale` | +1 cena (sem sombras no espelho) | +| **Screen-space** | SSR no shader (histórico de cor/profundidade) | Taps por pixel | +| **Probe** (default) | Cubemap HDR por objeto glossy (LRU, ≤ `maxReflectionProbes` por frame, 1 captura/frame) | 6 faces × resolução da probe | + +**Only when camera settled** adia capturas caras enquanto a câmara move (TAA ainda converge). + +## Probes por objeto + +- Objetos com roughness baixa entram na fila; os mais próximos da câmara recebem probe. +- Cubemap `RGBA16F` com mips; amostragem no shader por draw (slot 9). +- Entidade em captura excluída do cubemap (`excludeEntity`) para evitar auto-reflexo. +- Faces do cubemap: projeção com flip Y para NDC SDL (top-left, y-up). + +## SSR + +- Lê cor e profundidade do **frame anterior** (por `viewId`). +- Parâmetros no `PostProcessComponent.screenSpaceReflections` ou no bloco Reflections do forward features. + +## Céu (environment map) + +`GpuEnvironmentMap` — equirectangular + mips (slot 11): + +- Fonte: `SkyboxComponent` ativo ou `GpuSceneRenderOptions::environmentPath`. +- Especular: mip por roughness; difuso: mip mais baixo quando IBL ligado. + +Onde probe/planar não têm geometria, cai para o céu. + +## Material Editor + +`MaterialPreviewRenderer`: mundo mínimo + `GpuSceneRenderer` + 1 probe. Ver [`../editor/material-editor.md`](../editor/material-editor.md). + +## Ver também + +- [`forward-render-features.md`](forward-render-features.md) +- [`materials-pbr.md`](materials-pbr.md) +- [`render-snapshot.md`](render-snapshot.md) diff --git a/docs/rendering/render-snapshot.md b/docs/rendering/render-snapshot.md new file mode 100644 index 00000000..76163658 --- /dev/null +++ b/docs/rendering/render-snapshot.md @@ -0,0 +1,57 @@ +# Ferramenta `caffeine-render-snapshot` + +> **Target CMake:** `caffeine-render-snapshot` (requer SDL3 e `CAFFEINE_BUILD_HEADLESS=OFF`) +> **Fonte:** `tools/render-snapshot/main.cpp` + +Renderiza uma cena de referência pela **mesma pipeline** que o jogo/editor (HDR, probes, SSR, sombras, `PostProcessStack`) e grava um PNG — útil para regressões visuais sem abrir o Doppio. + +--- + +## Build + +```bash +cmake -S . -B build -DCAFFEINE_BUILD_HEADLESS=OFF +cmake --build build --target caffeine-render-snapshot -j +``` + +--- + +## Uso + +```text +caffeine-render-snapshot [out.png] [width] [height] [frames] [skyboxIndex] [view 0|1|2] +``` + +| Argumento | Default | Descrição | +|-----------|---------|-----------| +| `out.png` | `render-snapshot.png` | Ficheiro de saída | +| `width` / `height` | 1280 × 720 | Resolução interna | +| `frames` | 16 | Frames para TAA/probes assentarem | +| `skyboxIndex` | 0 | Preset de céu (`EnvironmentSystem`) | +| `view` | 0 | 0 = frontal, 1 = lateral, 2 = afastada | + +### Variáveis de ambiente + +| Variável | Efeito | +|----------|--------| +| `SNAP_NO_IBL=1` | Desliga IBL | +| `SNAP_NO_SHADOWS=1` | Desliga sombras direcionais | + +--- + +## Cena de referência + +- Chão 24×24 (roughness ~0.35) +- Esferas: Mirror (centro), Gold, Clear Glass +- Cubos coloridos + Glossy Plastic +- Sol direcional (intensidade ~2.5) + +Materiais vêm de `Assets::materialPresets()`. + +--- + +## Ver também + +- [`reflections.md`](reflections.md) +- [`post-processing.md`](post-processing.md) +- [`forward-render-features.md`](forward-render-features.md) diff --git a/docs/rendering/volumetric-lighting.md b/docs/rendering/volumetric-lighting.md new file mode 100644 index 00000000..da2228c6 --- /dev/null +++ b/docs/rendering/volumetric-lighting.md @@ -0,0 +1,13 @@ +# Luz volumétrica + +Ativa em **Forward Render Features → Volumetrics** (ou Lua `setVolumetrics`). Por defeito está **Off**. + +Não há um segundo draw da geometria. O nevoeiro marcha da câmara até à superfície no shader que já corre: + +- **Low** — 6 passos +- **Medium** — 12 passos +- **Density** e **Height** controlam a densidade e a queda com a altitude +- **Anisotropy** inclina o nevoeiro na direção do sol +- **Sample shadows** lê o shadow map em cada passo (mais caro; deixa desligado se o frame passar de 16 ms) + +Um froxel 3D ainda não existe. Ver [`forward-render-features.md`](forward-render-features.md). diff --git a/docs/scripting/runtime-apis.md b/docs/scripting/runtime-apis.md new file mode 100644 index 00000000..593e824a --- /dev/null +++ b/docs/scripting/runtime-apis.md @@ -0,0 +1,68 @@ +# Lua — APIs de runtime (core) + +> **VM:** `Script::ScriptEngine` (sol2) +> **Sistemas:** `ScriptSystem` (play mode) + +Bindings registados em `ScriptEngine::registerBindings()`. O Doppio não duplica estas APIs — plugins e scripts de jogo usam o mesmo `caffeine` global. + +--- + +## Ciclo de vida (`ScriptComponent`) + +| Função | Quando | +|--------|--------| +| `onCreate(entityId)` | Primeiro frame após load | +| `onUpdate(entityId, dt)` | Cada frame em play mode | +| `onDestroy(entityId)` | Entidade destruída | +| `onCollision(entityId, otherId)` | Colisão 2D | + +`loadScript(path)` resolve caminhos relativos à raiz do projeto (`setSearchRoot`). + +--- + +## Pós-processamento (`caffeine.postprocess`) + +Documentação completa: [`../rendering/post-processing.md`](../rendering/post-processing.md). + +```lua +caffeine.postprocess.add(cameraId) +local fx = caffeine.postprocess.get(cameraId) -- tabela aninhada por efeito +caffeine.postprocess.setValue(cameraId, "bloom.intensity", 0.2) +caffeine.postprocess.enableEffect(cameraId, "dof", true) -- aliases: ao, aa, fog, ssr, chromatic +caffeine.postprocess.applyPreset(cameraId, "cinematic") -- cinematic | horror | arcade | reset +local api = caffeine.postprocess.handle(cameraId) +caffeine.postprocess.setCustomScript(cameraId, "scripts/my_stack.lua") +``` + +### `customEffectScript` (`PostProcessComponent`) + +Em play mode, `ScriptSystem` carrega o ficheiro com chave `postprocess:` e chama: + +```lua +function onPostProcess(entityId, dt, api) + api.set("bloom.intensity", 0.15) +end +``` + +Se não existir `onPostProcess`, usa `onUpdate(entityId, dt)`. + +Campos disponíveis: `caffeine.postprocess.effects()` e `caffeine.postprocess.fields("bloom")` (ver `PostProcessFields.hpp`). + +--- + +## Forward render (`caffeine.forwardrender`) + +Ver [`../rendering/forward-render-features.md`](../rendering/forward-render-features.md). + +```lua +caffeine.forwardrender.ensure(entityId) +caffeine.forwardrender.setReflections(entityId, true, 3) -- 0 off, 1 planar, 2 SSR, 3 probe +caffeine.forwardrender.setVolumetrics(entityId, true, 2) +caffeine.forwardrender.setOcclusion(entityId, true) +``` + +--- + +## Materiais + +Materiais em runtime passam por `MaterialCache` e componentes de mesh; edição de `.mat` é no editor. Ver [`../rendering/materials-pbr.md`](../rendering/materials-pbr.md). diff --git a/include/caffeine/postprocess/PostProcessEditorUI.hpp b/include/caffeine/postprocess/PostProcessEditorUI.hpp index ed745f51..e5d26eb2 100644 --- a/include/caffeine/postprocess/PostProcessEditorUI.hpp +++ b/include/caffeine/postprocess/PostProcessEditorUI.hpp @@ -43,9 +43,7 @@ inline bool drawBenchmarkPresets(ECS::PostProcessComponent& fx) { inline bool drawEffectStack(ECS::PostProcessComponent& fx) { bool dirty = false; - ImGui::TextColored(ImVec4(0.75f, 0.8f, 0.95f, 1.0f), - "Editor preview overlays are active in the Scene Viewport and camera previews. " - "Full GPU post-processing passes are not wired yet."); + ImGui::TextDisabled("Rendered on the GPU by the engine post stack (scene viewport, previews, runtime)."); ImGui::Spacing(); if (ImGui::Checkbox("Stack enabled", &fx.enabled)) dirty = true; @@ -71,6 +69,7 @@ inline bool drawEffectStack(ECS::PostProcessComponent& fx) { if (ImGui::SliderFloat("AO radius", &fx.ambientOcclusion.radius, 0.1f, 2.0f)) { dirty = true; } + if (ImGui::SliderFloat("AO bias", &fx.ambientOcclusion.bias, 0.0f, 0.2f, "%.3f")) dirty = true; } } @@ -86,6 +85,9 @@ inline bool drawEffectStack(ECS::PostProcessComponent& fx) { if (ImGui::SliderFloat("Adapt speed", &fx.autoExposure.adaptationSpeed, 0.1f, 5.0f)) { dirty = true; } + if (ImGui::SliderFloat("Compensation (EV)", &fx.autoExposure.compensation, -4.0f, 4.0f)) { + dirty = true; + } } if (dragEffectBool("Color grading", fx.colorGrading.enabled)) dirty = true; if (fx.colorGrading.enabled) { @@ -105,7 +107,7 @@ inline bool drawEffectStack(ECS::PostProcessComponent& fx) { if (dragEffectBool("Bloom", fx.bloom.enabled)) dirty = true; if (fx.bloom.enabled) { if (ImGui::SliderFloat("Bloom intensity", &fx.bloom.intensity, 0.0f, 1.0f)) dirty = true; - if (ImGui::SliderFloat("Threshold", &fx.bloom.threshold, 0.5f, 2.0f)) dirty = true; + if (ImGui::SliderFloat("Threshold", &fx.bloom.threshold, 0.0f, 8.0f)) dirty = true; if (ImGui::SliderFloat("Scatter", &fx.bloom.scatter, 0.0f, 1.0f)) dirty = true; } if (dragEffectBool("Depth of field", fx.depthOfField.enabled)) dirty = true; @@ -114,6 +116,9 @@ inline bool drawEffectStack(ECS::PostProcessComponent& fx) { dirty = true; } if (ImGui::SliderFloat("Aperture", &fx.depthOfField.aperture, 0.01f, 1.0f)) dirty = true; + if (ImGui::SliderFloat("Focal length (mm)", &fx.depthOfField.focalLength, 10.0f, 300.0f)) { + dirty = true; + } if (ImGui::SliderFloat("Max blur", &fx.depthOfField.maxBlur, 0.0f, 2.0f)) dirty = true; } if (dragEffectBool("Motion blur", fx.motionBlur.enabled)) dirty = true; @@ -121,6 +126,7 @@ inline bool drawEffectStack(ECS::PostProcessComponent& fx) { if (ImGui::SliderFloat("Motion blur", &fx.motionBlur.intensity, 0.0f, 1.0f)) { dirty = true; } + if (ImGui::SliderFloat("Max velocity", &fx.motionBlur.maxVelocity, 0.0f, 4.0f)) dirty = true; } if (dragEffectBool("Chromatic aberration", fx.chromaticAberration.enabled)) dirty = true; if (fx.chromaticAberration.enabled) { @@ -159,6 +165,11 @@ inline bool drawEffectStack(ECS::PostProcessComponent& fx) { if (ImGui::SliderFloat("Max roughness", &fx.screenSpaceReflections.maxRoughness, 0.0f, 1.0f)) { dirty = true; } + int steps = static_cast(fx.screenSpaceReflections.maxSteps); + if (ImGui::SliderInt("Max steps", &steps, 8, 256)) { + fx.screenSpaceReflections.maxSteps = static_cast(steps); + dirty = true; + } } } @@ -179,7 +190,8 @@ inline bool drawEffectStack(ECS::PostProcessComponent& fx) { sizeof(fx.customEffectScript))) { dirty = true; } - ImGui::TextDisabled("API: caffeine.postprocess.* — see docs/rendering/post-processing.md"); + ImGui::TextDisabled("Runs onPostProcess(entityId, dt, api) each play-mode frame."); + ImGui::TextDisabled("API: caffeine.postprocess.* - see docs/rendering/post-processing.md"); } return dirty; diff --git a/src/assets/MaterialCache.cpp b/src/assets/MaterialCache.cpp index 04452cb5..da4c2b82 100644 --- a/src/assets/MaterialCache.cpp +++ b/src/assets/MaterialCache.cpp @@ -1,6 +1,6 @@ #include "assets/MaterialCache.hpp" -#include "editor/MaterialSerializer.hpp" +#include "assets/MaterialFile.hpp" #include @@ -11,52 +11,74 @@ MaterialCache& MaterialCache::instance() { return cache; } -MaterialSurface MaterialCache::resolve(const std::string& materialPath, - const std::string& projectRoot) { - MaterialSurface empty; - if (materialPath.empty()) return empty; - +std::string MaterialCache::canonicalKey(const std::string& materialPath, + const std::string& projectRoot) const { + if (materialPath.empty()) return {}; std::filesystem::path resolved(materialPath); if (!resolved.is_absolute() && !projectRoot.empty()) { resolved = std::filesystem::path(projectRoot) / materialPath; } std::error_code ec; - resolved = std::filesystem::weakly_canonical(resolved, ec); - if (ec || !std::filesystem::exists(resolved)) return empty; + const std::filesystem::path canonical = std::filesystem::weakly_canonical(resolved, ec); + if (ec) return resolved.string(); + return canonical.string(); +} - const std::string key = resolved.string(); +MaterialSurface MaterialCache::resolve(const std::string& materialPath, + const std::string& projectRoot) { + MaterialSurface empty; + const std::string key = canonicalKey(materialPath, projectRoot); + if (key.empty()) return empty; auto it = m_cache.find(key); - if (it != m_cache.end()) return it->second; + if (!std::filesystem::exists(key)) { + // Published-only materials (e.g. the editor preview) have no file behind them. + if (it != m_cache.end() && !it->second.hasStamp) return it->second.surface; + return empty; + } - Editor::MaterialDocument doc; - Editor::ShaderGraph graph; - if (!Editor::MaterialSerializer::load(resolved, doc, graph)) return empty; + std::error_code ec; + const auto stamp = std::filesystem::last_write_time(key, ec); + if (it != m_cache.end() && !ec && it->second.hasStamp && it->second.stamp == stamp) { + return it->second.surface; + } - const Editor::EvaluatedMaterial evaluated = graph.evaluateMaterial(0.0f); MaterialSurface surface; - if (evaluated.valid) { - surface.albedo = evaluated.albedo; - surface.metallic = evaluated.metallic; - surface.roughness = evaluated.roughness; - surface.valid = true; - } else { - surface.albedo = Vec4(doc.properties.albedoColor.r, doc.properties.albedoColor.g, - doc.properties.albedoColor.b, doc.properties.albedoColor.a); - surface.metallic = doc.properties.metallic; - surface.roughness = doc.properties.roughness; - surface.valid = true; + if (!loadMaterialFile(key, surface)) return empty; + Entry entry; + entry.surface = surface; + entry.stamp = stamp; + entry.hasStamp = !ec; + if (it != m_cache.end() && it->second.hasStamp && entry.hasStamp && it->second.stamp != stamp) { + ++m_revision; } - - m_cache[key] = surface; + m_cache[key] = entry; return surface; } +void MaterialCache::publish(const std::string& materialPath, const std::string& projectRoot, + const MaterialSurface& surface) { + const std::string key = canonicalKey(materialPath, projectRoot); + if (key.empty()) return; + Entry entry; + entry.surface = surface; + entry.surface.valid = true; + std::error_code ec; + if (std::filesystem::exists(key)) { + entry.stamp = std::filesystem::last_write_time(key, ec); + entry.hasStamp = !ec; + } + m_cache[key] = entry; + ++m_revision; +} + void MaterialCache::invalidate(const std::string& materialPath) { + ++m_revision; if (materialPath.empty()) { m_cache.clear(); return; } m_cache.erase(materialPath); + m_cache.erase(canonicalKey(materialPath, "")); } } // namespace Caffeine::Assets diff --git a/src/assets/MaterialCache.hpp b/src/assets/MaterialCache.hpp index 949d2f57..bd331cc1 100644 --- a/src/assets/MaterialCache.hpp +++ b/src/assets/MaterialCache.hpp @@ -1,6 +1,9 @@ #pragma once #include "assets/MaterialTypes.hpp" +#include "core/Types.hpp" + +#include #include #include @@ -12,12 +15,24 @@ class MaterialCache { MaterialSurface resolve(const std::string& materialPath, const std::string& projectRoot = ""); + void publish(const std::string& materialPath, const std::string& projectRoot, + const MaterialSurface& surface); void invalidate(const std::string& materialPath = {}); + u64 revision() const { return m_revision; } private: MaterialCache() = default; - std::unordered_map m_cache; + struct Entry { + MaterialSurface surface; + std::filesystem::file_time_type stamp{}; + bool hasStamp = false; + }; + + std::string canonicalKey(const std::string& materialPath, const std::string& projectRoot) const; + + std::unordered_map m_cache; + u64 m_revision = 1; }; } // namespace Caffeine::Assets diff --git a/src/assets/MaterialFile.cpp b/src/assets/MaterialFile.cpp new file mode 100644 index 00000000..67dd6262 --- /dev/null +++ b/src/assets/MaterialFile.cpp @@ -0,0 +1,170 @@ +#include "assets/MaterialFile.hpp" + +#include +#include +#include + +namespace Caffeine::Assets { +namespace { + +std::string restOfLine(std::istringstream& ss) { + std::string value; + std::getline(ss, value); + if (!value.empty() && value[0] == ' ') value.erase(0, 1); + return value; +} + +f32 clamp01(f32 v) { return std::clamp(v, 0.0f, 1.0f); } + +const char* alphaModeName(MaterialAlphaMode mode) { + switch (mode) { + case MaterialAlphaMode::Cutout: return "cutout"; + case MaterialAlphaMode::Blend: return "blend"; + case MaterialAlphaMode::Opaque: + default: return "opaque"; + } +} + +MaterialAlphaMode parseAlphaMode(const std::string& text) { + if (text == "cutout") return MaterialAlphaMode::Cutout; + if (text == "blend") return MaterialAlphaMode::Blend; + return MaterialAlphaMode::Opaque; +} + +} // namespace + +bool loadMaterialFile(const std::filesystem::path& path, MaterialSurface& out) { + std::ifstream in(path); + if (!in.is_open()) return false; + + std::string header; + if (!std::getline(in, header)) return false; + if (header != "CAFMAT3" && header != "CAFMAT2" && header != "CAFMAT1") return false; + + MaterialSurface surface; + std::string line; + while (std::getline(in, line)) { + if (line.empty()) continue; + std::istringstream ss(line); + std::string tag; + ss >> tag; + if (tag == "name") { + surface.name = restOfLine(ss); + } else if (tag == "albedo") { + ss >> surface.albedo.x >> surface.albedo.y >> surface.albedo.z >> surface.albedo.w; + } else if (tag == "roughness") { + ss >> surface.roughness; + } else if (tag == "metallic") { + ss >> surface.metallic; + } else if (tag == "reflectance") { + ss >> surface.reflectance; + } else if (tag == "emission") { + ss >> surface.emission.x >> surface.emission.y >> surface.emission.z; + } else if (tag == "emission_strength") { + ss >> surface.emissionStrength; + } else if (tag == "albedo_map") { + surface.albedoMap = restOfLine(ss); + } else if (tag == "normal_map") { + surface.normalMap = restOfLine(ss); + } else if (tag == "orm_map") { + surface.ormMap = restOfLine(ss); + } else if (tag == "emission_map") { + surface.emissionMap = restOfLine(ss); + } else if (tag == "uv_tiling") { + ss >> surface.uvTiling.x >> surface.uvTiling.y; + } else if (tag == "uv_offset") { + ss >> surface.uvOffset.x >> surface.uvOffset.y; + } else if (tag == "normal_strength") { + ss >> surface.normalStrength; + } else if (tag == "ao_strength") { + ss >> surface.aoStrength; + } else if (tag == "alpha_mode") { + std::string mode; + ss >> mode; + surface.alphaMode = parseAlphaMode(mode); + } else if (tag == "alpha_cutoff") { + ss >> surface.alphaCutoff; + } else if (tag == "transmission") { + ss >> surface.transmission; + } else if (tag == "ior") { + ss >> surface.ior; + } else if (tag == "clearcoat") { + ss >> surface.clearcoat; + } else if (tag == "clearcoat_roughness") { + ss >> surface.clearcoatRoughness; + } else if (tag == "sheen") { + ss >> surface.sheenColor.x >> surface.sheenColor.y >> surface.sheenColor.z; + } else if (tag == "sheen_roughness") { + ss >> surface.sheenRoughness; + } else if (tag == "iridescence") { + ss >> surface.iridescence; + } else if (tag == "iridescence_thickness") { + ss >> surface.iridescenceThickness; + } else if (tag == "iridescence_ior") { + ss >> surface.iridescenceIor; + } + } + + sanitizeMaterialSurface(surface); + surface.valid = true; + out = std::move(surface); + return true; +} + +void sanitizeMaterialSurface(MaterialSurface& surface) { + surface.albedo.w = clamp01(surface.albedo.w); + surface.roughness = clamp01(surface.roughness); + surface.metallic = clamp01(surface.metallic); + surface.reflectance = clamp01(surface.reflectance); + surface.emissionStrength = std::max(surface.emissionStrength, 0.0f); + surface.normalStrength = std::clamp(surface.normalStrength, 0.0f, 4.0f); + surface.aoStrength = clamp01(surface.aoStrength); + surface.alphaCutoff = clamp01(surface.alphaCutoff); + surface.transmission = clamp01(surface.transmission); + surface.ior = std::clamp(surface.ior, 1.0f, 3.0f); + surface.clearcoat = clamp01(surface.clearcoat); + surface.clearcoatRoughness = clamp01(surface.clearcoatRoughness); + surface.sheenColor = Vec3(clamp01(surface.sheenColor.x), clamp01(surface.sheenColor.y), + clamp01(surface.sheenColor.z)); + surface.sheenRoughness = clamp01(surface.sheenRoughness); + surface.iridescence = clamp01(surface.iridescence); + surface.iridescenceThickness = std::clamp(surface.iridescenceThickness, 50.0f, 1500.0f); + surface.iridescenceIor = std::clamp(surface.iridescenceIor, 1.0f, 2.5f); +} + +bool saveMaterialFile(const std::filesystem::path& path, const MaterialSurface& material) { + std::ofstream out(path); + if (!out.is_open()) return false; + out << "CAFMAT3\n"; + out << "name " << material.name << '\n'; + out << "albedo " << material.albedo.x << ' ' << material.albedo.y << ' ' << material.albedo.z << ' ' + << material.albedo.w << '\n'; + out << "metallic " << material.metallic << '\n'; + out << "roughness " << material.roughness << '\n'; + out << "reflectance " << material.reflectance << '\n'; + out << "emission " << material.emission.x << ' ' << material.emission.y << ' ' << material.emission.z << '\n'; + out << "emission_strength " << material.emissionStrength << '\n'; + out << "albedo_map " << material.albedoMap << '\n'; + out << "normal_map " << material.normalMap << '\n'; + out << "orm_map " << material.ormMap << '\n'; + out << "emission_map " << material.emissionMap << '\n'; + out << "uv_tiling " << material.uvTiling.x << ' ' << material.uvTiling.y << '\n'; + out << "uv_offset " << material.uvOffset.x << ' ' << material.uvOffset.y << '\n'; + out << "normal_strength " << material.normalStrength << '\n'; + out << "ao_strength " << material.aoStrength << '\n'; + out << "alpha_mode " << alphaModeName(material.alphaMode) << '\n'; + out << "alpha_cutoff " << material.alphaCutoff << '\n'; + out << "transmission " << material.transmission << '\n'; + out << "ior " << material.ior << '\n'; + out << "clearcoat " << material.clearcoat << '\n'; + out << "clearcoat_roughness " << material.clearcoatRoughness << '\n'; + out << "sheen " << material.sheenColor.x << ' ' << material.sheenColor.y << ' ' + << material.sheenColor.z << '\n'; + out << "sheen_roughness " << material.sheenRoughness << '\n'; + out << "iridescence " << material.iridescence << '\n'; + out << "iridescence_thickness " << material.iridescenceThickness << '\n'; + out << "iridescence_ior " << material.iridescenceIor << '\n'; + return static_cast(out); +} + +} // namespace Caffeine::Assets diff --git a/src/assets/MaterialFile.hpp b/src/assets/MaterialFile.hpp new file mode 100644 index 00000000..2c6d446d --- /dev/null +++ b/src/assets/MaterialFile.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "assets/MaterialTypes.hpp" + +#include + +namespace Caffeine::Assets { + +bool loadMaterialFile(const std::filesystem::path& path, MaterialSurface& out); +bool saveMaterialFile(const std::filesystem::path& path, const MaterialSurface& material); +/// Clamps every field to the range the shader expects. +void sanitizeMaterialSurface(MaterialSurface& surface); + +} // namespace Caffeine::Assets diff --git a/src/assets/MaterialPresets.hpp b/src/assets/MaterialPresets.hpp new file mode 100644 index 00000000..2cc562ea --- /dev/null +++ b/src/assets/MaterialPresets.hpp @@ -0,0 +1,173 @@ +#pragma once + +#include "assets/MaterialTypes.hpp" + +#include +#include + +namespace Caffeine::Assets { + +struct MaterialPreset { + std::string_view category; + std::string_view name; + MaterialSurface surface; +}; + +/// Starting points for common real-world surfaces. Colours are sRGB as shown in the editor; +/// metal colours are measured F0 values. Maps are left empty so presets keep existing textures +/// when applied with `applyMaterialPreset`. +inline const std::vector& materialPresets() { + static const std::vector presets = [] { + std::vector list; + auto add = [&list](std::string_view category, std::string_view name, auto&& configure) { + MaterialSurface s; + s.name = std::string(name); + configure(s); + s.valid = true; + list.push_back({category, name, s}); + }; + add("Metal", "Mirror", [](MaterialSurface& s) { + s.albedo = Vec4(0.98f, 0.98f, 0.98f, 1.0f); + s.metallic = 1.0f; + s.roughness = 0.0f; + }); + add("Metal", "Chrome", [](MaterialSurface& s) { + s.albedo = Vec4(0.96f, 0.96f, 0.97f, 1.0f); + s.metallic = 1.0f; + s.roughness = 0.04f; + }); + add("Metal", "Brushed Steel", [](MaterialSurface& s) { + s.albedo = Vec4(0.86f, 0.86f, 0.87f, 1.0f); + s.metallic = 1.0f; + s.roughness = 0.38f; + }); + add("Metal", "Gold", [](MaterialSurface& s) { + s.albedo = Vec4(1.0f, 0.89f, 0.62f, 1.0f); + s.metallic = 1.0f; + s.roughness = 0.12f; + }); + add("Metal", "Copper", [](MaterialSurface& s) { + s.albedo = Vec4(0.98f, 0.82f, 0.76f, 1.0f); + s.metallic = 1.0f; + s.roughness = 0.18f; + }); + add("Metal", "Aluminium", [](MaterialSurface& s) { + s.albedo = Vec4(0.96f, 0.96f, 0.97f, 1.0f); + s.metallic = 1.0f; + s.roughness = 0.28f; + }); + add("Metal", "Rust", [](MaterialSurface& s) { + s.albedo = Vec4(0.47f, 0.22f, 0.11f, 1.0f); + s.metallic = 0.25f; + s.roughness = 0.88f; + }); + add("Metal", "Holographic Foil", [](MaterialSurface& s) { + s.albedo = Vec4(0.92f, 0.92f, 0.94f, 1.0f); + s.metallic = 1.0f; + s.roughness = 0.1f; + s.iridescence = 1.0f; + s.iridescenceThickness = 560.0f; + s.iridescenceIor = 1.6f; + }); + add("Glass", "Clear Glass", [](MaterialSurface& s) { + s.albedo = Vec4(1.0f, 1.0f, 1.0f, 1.0f); + s.roughness = 0.0f; + s.transmission = 1.0f; + s.ior = 1.5f; + }); + add("Glass", "Frosted Glass", [](MaterialSurface& s) { + s.albedo = Vec4(0.95f, 0.97f, 1.0f, 1.0f); + s.roughness = 0.35f; + s.transmission = 1.0f; + s.ior = 1.5f; + }); + add("Glass", "Ice", [](MaterialSurface& s) { + s.albedo = Vec4(0.82f, 0.93f, 1.0f, 1.0f); + s.roughness = 0.1f; + s.transmission = 0.85f; + s.ior = 1.31f; + s.clearcoat = 0.5f; + s.clearcoatRoughness = 0.02f; + }); + add("Glass", "Water", [](MaterialSurface& s) { + s.albedo = Vec4(0.8f, 0.93f, 0.95f, 1.0f); + s.roughness = 0.02f; + s.transmission = 1.0f; + s.ior = 1.33f; + }); + add("Glass", "Soap Bubble", [](MaterialSurface& s) { + s.albedo = Vec4(1.0f, 1.0f, 1.0f, 1.0f); + s.roughness = 0.0f; + s.transmission = 1.0f; + s.ior = 1.05f; + s.iridescence = 1.0f; + s.iridescenceThickness = 380.0f; + s.iridescenceIor = 1.33f; + }); + add("Dielectric", "Glossy Plastic", [](MaterialSurface& s) { + s.albedo = Vec4(0.8f, 0.12f, 0.1f, 1.0f); + s.roughness = 0.22f; + s.reflectance = 0.045f; + }); + add("Dielectric", "Matte Plastic", [](MaterialSurface& s) { + s.albedo = Vec4(0.75f, 0.75f, 0.72f, 1.0f); + s.roughness = 0.7f; + }); + add("Dielectric", "Rubber", [](MaterialSurface& s) { + s.albedo = Vec4(0.08f, 0.08f, 0.08f, 1.0f); + s.roughness = 0.95f; + s.reflectance = 0.03f; + }); + add("Dielectric", "Car Paint", [](MaterialSurface& s) { + s.albedo = Vec4(0.62f, 0.03f, 0.04f, 1.0f); + s.metallic = 0.45f; + s.roughness = 0.4f; + s.clearcoat = 1.0f; + s.clearcoatRoughness = 0.03f; + }); + add("Dielectric", "Ceramic", [](MaterialSurface& s) { + s.albedo = Vec4(0.92f, 0.92f, 0.9f, 1.0f); + s.roughness = 0.3f; + s.clearcoat = 0.8f; + s.clearcoatRoughness = 0.05f; + }); + add("Fabric", "Velvet", [](MaterialSurface& s) { + s.albedo = Vec4(0.36f, 0.03f, 0.12f, 1.0f); + s.roughness = 0.9f; + s.sheenColor = Vec3(0.9f, 0.55f, 0.65f); + s.sheenRoughness = 0.35f; + }); + add("Fabric", "Cotton", [](MaterialSurface& s) { + s.albedo = Vec4(0.7f, 0.72f, 0.78f, 1.0f); + s.roughness = 0.95f; + s.sheenColor = Vec3(0.4f, 0.4f, 0.45f); + s.sheenRoughness = 0.6f; + }); + add("Emissive", "Neon", [](MaterialSurface& s) { + s.albedo = Vec4(0.05f, 0.05f, 0.05f, 1.0f); + s.roughness = 0.3f; + s.emission = Vec3(1.0f, 0.2f, 0.8f); + s.emissionStrength = 6.0f; + }); + return list; + }(); + return presets; +} + +/// Copies the look of `preset` onto `target`, keeping its name, texture maps and UV layout. +inline void applyMaterialPreset(const MaterialSurface& preset, MaterialSurface& target) { + MaterialSurface result = preset; + result.name = target.name; + result.albedoMap = target.albedoMap; + result.normalMap = target.normalMap; + result.ormMap = target.ormMap; + result.emissionMap = target.emissionMap; + result.uvTiling = target.uvTiling; + result.uvOffset = target.uvOffset; + result.normalStrength = target.normalStrength; + result.aoStrength = target.aoStrength; + result.valid = true; + target = std::move(result); +} + +} // namespace Caffeine::Assets diff --git a/src/assets/MaterialTypes.hpp b/src/assets/MaterialTypes.hpp index 7abbf769..3071a1da 100644 --- a/src/assets/MaterialTypes.hpp +++ b/src/assets/MaterialTypes.hpp @@ -1,13 +1,58 @@ #pragma once +#include "math/Vec2.hpp" +#include "math/Vec3.hpp" #include "math/Vec4.hpp" +#include + namespace Caffeine::Assets { +/// Opaque writes depth; Cutout discards below `alphaCutoff`; Blend is sorted and drawn after +/// the opaque pass. +enum class MaterialAlphaMode : u8 { Opaque = 0, Cutout = 1, Blend = 2 }; + +/// Surface the forward shader consumes. A `.mat` file is this struct, not a generated shader. struct MaterialSurface { + std::string name; + /// Base colour in sRGB as picked in the editor (the renderer linearises it); `w` is opacity. Vec4 albedo{1.0f, 1.0f, 1.0f, 1.0f}; f32 metallic = 0.0f; f32 roughness = 0.5f; + /// Dielectric Fresnel reflectance (F0). Metals replace this with albedo. 0.04 matches plastic. + f32 reflectance = 0.04f; + Vec3 emission{0.0f, 0.0f, 0.0f}; + f32 emissionStrength = 0.0f; + std::string albedoMap; + std::string normalMap; + std::string ormMap; + std::string emissionMap; + + Vec2 uvTiling{1.0f, 1.0f}; + Vec2 uvOffset{0.0f, 0.0f}; + f32 normalStrength = 1.0f; + f32 aoStrength = 1.0f; + + MaterialAlphaMode alphaMode = MaterialAlphaMode::Opaque; + f32 alphaCutoff = 0.5f; + + /// Light passing through the surface (glass, water, ice). Refracts the opaque scene. + f32 transmission = 0.0f; + f32 ior = 1.5f; + + /// Second specular layer on top of the base (car paint, varnish, lacquer). + f32 clearcoat = 0.0f; + f32 clearcoatRoughness = 0.03f; + + /// Soft retro-reflective rim for cloth and velvet. + Vec3 sheenColor{0.0f, 0.0f, 0.0f}; + f32 sheenRoughness = 0.5f; + + /// Thin-film interference (soap bubbles, oil, holographic foil). Thickness in nanometres. + f32 iridescence = 0.0f; + f32 iridescenceThickness = 400.0f; + f32 iridescenceIor = 1.3f; + bool valid = false; }; diff --git a/src/assets/MeshLOD.cpp b/src/assets/MeshLOD.cpp index 670b21a4..57925f8d 100644 --- a/src/assets/MeshLOD.cpp +++ b/src/assets/MeshLOD.cpp @@ -1,31 +1,126 @@ #include "assets/MeshLOD.hpp" + #include +#include +#include namespace Caffeine::Assets { +namespace { + +struct CellKey { + i32 x = 0; + i32 y = 0; + i32 z = 0; + bool operator==(const CellKey& other) const { + return x == other.x && y == other.y && z == other.z; + } +}; + +struct CellKeyHash { + usize operator()(const CellKey& key) const { + usize h = static_cast(key.x) * 73856093u; + h ^= static_cast(key.y) * 19349663u; + h ^= static_cast(key.z) * 83492791u; + return h; + } +}; + +} // namespace + +bool MeshLOD::buildClusteredLod(const Mesh3D& source, Mesh3D& target, f32 cellSize) { + target = Mesh3D{}; + if (source.vertices.empty() || source.indices.size() < 3 || cellSize <= 0.0f) return false; + + auto quantize = [](f32 v, f32 cell) { + return static_cast(std::floor(v / cell)); + }; + + struct Accum { + u32 index = 0; + u32 count = 0; + Vec3 position{}; + Vec3 normal{}; + Vec2 uv{}; + Vec4 tangent{}; + }; + std::unordered_map cells; + cells.reserve(source.vertices.size() / 2); + std::vector remap(source.vertices.size(), 0); + + for (u32 i = 0; i < source.vertices.size(); ++i) { + const Vertex3D& v = source.vertices[i]; + const CellKey key{quantize(v.position.x, cellSize), quantize(v.position.y, cellSize), + quantize(v.position.z, cellSize)}; + auto [it, inserted] = cells.try_emplace(key); + Accum& acc = it->second; + if (inserted) acc.index = static_cast(cells.size() - 1); + acc.count++; + acc.position += v.position; + acc.normal += v.normal; + acc.uv += v.texcoord; + acc.tangent = acc.tangent + v.tangent; + remap[i] = acc.index; + } + + target.vertices.resize(cells.size()); + for (auto& [_, acc] : cells) { + const f32 inv = 1.0f / static_cast(std::max(acc.count, 1u)); + Vertex3D& out = target.vertices[acc.index]; + out.position = acc.position * inv; + Vec3 n = acc.normal * inv; + const f32 len = n.length(); + out.normal = (len > 1e-6f) ? n / len : Vec3(0.0f, 1.0f, 0.0f); + out.texcoord = acc.uv * inv; + out.tangent = acc.tangent * inv; + } + + target.indices.reserve(source.indices.size()); + for (u32 i = 0; i + 2 < source.indices.size(); i += 3) { + const u32 i0 = source.indices[i]; + const u32 i1 = source.indices[i + 1]; + const u32 i2 = source.indices[i + 2]; + if (i0 >= remap.size() || i1 >= remap.size() || i2 >= remap.size()) continue; + const u32 a = remap[i0]; + const u32 b = remap[i1]; + const u32 c = remap[i2]; + if (a == b || b == c || c == a) continue; + target.indices.push_back(a); + target.indices.push_back(b); + target.indices.push_back(c); + } + + if (target.indices.size() < 3 || target.indices.size() >= source.indices.size()) { + target = Mesh3D{}; + return false; + } + + target.bounds = source.bounds; + target.flipTextureV = source.flipTextureV; + target.lodCount = 1; + return true; +} + void MeshLOD::generateLODs(Mesh3D* mesh, int lodCount, f32 reductionRatio) { if (!mesh || mesh->vertices.empty() || lodCount < 1) return; - - mesh->lodCount = lodCount; + mesh->lodCount = static_cast(lodCount); + if (reductionRatio <= 0.0f || reductionRatio >= 1.0f) return; + + const Vec3 extent = mesh->bounds.max - mesh->bounds.min; + const f32 diagonal = std::max(extent.length(), 0.001f); + Mesh3D simplified; + if (buildClusteredLod(*mesh, simplified, diagonal * (1.0f - reductionRatio) * 0.05f)) { + mesh->lodCount = std::max(mesh->lodCount, 2u); + } } void MeshLOD::simplifyMesh(const Mesh3D& source, Mesh3D& target, f32 targetRatio) { - u32 targetVertexCount = (u32)(source.vertices.size() * targetRatio); - if (targetVertexCount < 3) targetVertexCount = 3; - - target.vertices.resize(targetVertexCount); - for (u32 i = 0; i < targetVertexCount; ++i) { - target.vertices[i] = source.vertices[i * source.vertices.size() / targetVertexCount]; - } - - target.indices.clear(); - for (u32 i = 0; i + 2 < target.vertices.size(); i += 3) { - target.indices.push_back(i); - target.indices.push_back(i + 1); - target.indices.push_back(i + 2); - } - - target.bounds = source.bounds; + const Vec3 extent = source.bounds.max - source.bounds.min; + const f32 diagonal = std::max(extent.length(), 0.001f); + const f32 cell = diagonal * std::clamp(1.0f - targetRatio, 0.01f, 0.5f); + if (!buildClusteredLod(source, target, cell)) { + target = source; + } } } // namespace Caffeine::Assets diff --git a/src/assets/MeshLOD.hpp b/src/assets/MeshLOD.hpp index 886b38e4..39b74f99 100644 --- a/src/assets/MeshLOD.hpp +++ b/src/assets/MeshLOD.hpp @@ -6,7 +6,11 @@ namespace Caffeine::Assets { class MeshLOD { public: static void generateLODs(Mesh3D* mesh, int lodCount = 3, f32 reductionRatio = 0.5f); - + + // Rossignac vertex clustering. Writes a new mesh; does not modify source. + // Returns false when the result is empty or not actually smaller. + static bool buildClusteredLod(const Mesh3D& source, Mesh3D& target, f32 cellSize); + private: static void simplifyMesh(const Mesh3D& source, Mesh3D& target, f32 targetRatio); }; diff --git a/src/ecs/ForwardRenderComponents.hpp b/src/ecs/ForwardRenderComponents.hpp new file mode 100644 index 00000000..984087f3 --- /dev/null +++ b/src/ecs/ForwardRenderComponents.hpp @@ -0,0 +1,61 @@ +#pragma once + +#include "core/Types.hpp" +#include "render/RenderFeatures.hpp" + +namespace Caffeine::ECS { + +/// Per-scene forward-pass capabilities (instancing, IBL, occlusion, reflections, volumetrics). +/// Attach to an environment entity; the GPU renderer resolves these instead of editor settings. +struct ForwardInstancingProfile { + bool enabled = true; + u32 maxInstancesPerBatch = 256; +}; + +struct ForwardIblProfile { + bool enabled = true; + f32 diffuse = 1.0f; + f32 specular = 1.0f; +}; + +struct ForwardOcclusionProfile { + bool enabled = false; + u32 maxOccluders = 8; + f32 minRadius = 0.75f; +}; + +struct ForwardReflectionProfile { + bool enabled = true; + Render::ReflectionMode mode = Render::ReflectionMode::Probe; + f32 planeY = 0.0f; + f32 intensity = 0.45f; + f32 resolutionScale = 0.5f; + bool screenSpaceTrace = true; + f32 ssrIntensity = 1.0f; + f32 ssrMaxRoughness = 0.6f; + u32 ssrMaxSteps = 24; + f32 ssrMaxDistance = 30.0f; + u32 probeResolution = 128; + u32 maxProbes = 6; + bool expensiveOnlyWhenSettled = true; +}; + +struct ForwardVolumetricProfile { + bool enabled = false; + Render::VolumetricQuality quality = Render::VolumetricQuality::Off; + f32 density = 0.012f; + f32 height = 12.0f; + f32 anisotropy = 0.3f; + bool sampleShadows = false; +}; + +struct ForwardRenderFeaturesComponent { + bool enabled = true; + ForwardInstancingProfile instancing{}; + ForwardIblProfile ibl{}; + ForwardOcclusionProfile occlusion{}; + ForwardReflectionProfile reflections{}; + ForwardVolumetricProfile volumetrics{}; +}; + +} // namespace Caffeine::ECS diff --git a/src/ecs/PostProcessComponents.hpp b/src/ecs/PostProcessComponents.hpp index 882d0847..2a80602e 100644 --- a/src/ecs/PostProcessComponents.hpp +++ b/src/ecs/PostProcessComponents.hpp @@ -6,7 +6,8 @@ namespace Caffeine::ECS { /// Modular post-processing stack — each effect can be toggled and tuned independently. -/// GPU passes are planned; editor preview uses ImGui overlays until the render graph is wired. +/// Executed on the GPU by Render::PostProcessStack (see docs/rendering/post-processing.md). +/// Attach to a camera entity; a scene without one uses PostProcessStack::defaults(). struct PostProcessAmbientOcclusion { bool enabled = false; @@ -16,9 +17,9 @@ struct PostProcessAmbientOcclusion { }; struct PostProcessAntiAliasing { - bool enabled = false; - /// 0 = FXAA, 1 = TAA (placeholder indices for future GPU path) - u32 mode = 0; + bool enabled = true; + /// 0 = FXAA, 1 = TAA (temporal, jittered projection + history reprojection) + u32 mode = 1; f32 sharpness = 0.5f; }; diff --git a/src/ecs/PostProcessFields.hpp b/src/ecs/PostProcessFields.hpp new file mode 100644 index 00000000..41b67314 --- /dev/null +++ b/src/ecs/PostProcessFields.hpp @@ -0,0 +1,176 @@ +#pragma once + +#include "ecs/PostProcessComponents.hpp" + +#include +#include +#include +#include + +namespace Caffeine::ECS { + +/// Reflection table over PostProcessComponent, addressed as "effect.field" +/// (e.g. "bloom.intensity", "antiAliasing.mode"). Shared by the Lua API, serialisation +/// helpers and tools so every tunable is reachable without per-field glue. +struct PostProcessField { + enum class Kind : u8 { Bool, Float, UInt }; + std::string_view effect; + std::string_view name; + Kind kind; + std::size_t offset; + f32 minValue; + f32 maxValue; +}; + +#define CF_PP_FIELD(effect, field, kind, lo, hi) \ + PostProcessField { \ + #effect, #field, PostProcessField::Kind::kind, offsetof(PostProcessComponent, effect.field), \ + lo, hi \ + } + +inline std::span postProcessFields() { + static const PostProcessField kFields[] = { + CF_PP_FIELD(ambientOcclusion, enabled, Bool, 0, 1), + CF_PP_FIELD(ambientOcclusion, intensity, Float, 0, 4), + CF_PP_FIELD(ambientOcclusion, radius, Float, 0.01f, 8), + CF_PP_FIELD(ambientOcclusion, bias, Float, 0, 0.5f), + CF_PP_FIELD(antiAliasing, enabled, Bool, 0, 1), + CF_PP_FIELD(antiAliasing, mode, UInt, 0, 1), + CF_PP_FIELD(antiAliasing, sharpness, Float, 0, 1), + CF_PP_FIELD(autoExposure, enabled, Bool, 0, 1), + CF_PP_FIELD(autoExposure, minExposure, Float, 0.01f, 16), + CF_PP_FIELD(autoExposure, maxExposure, Float, 0.01f, 64), + CF_PP_FIELD(autoExposure, adaptationSpeed, Float, 0.01f, 20), + CF_PP_FIELD(autoExposure, compensation, Float, -8, 8), + CF_PP_FIELD(bloom, enabled, Bool, 0, 1), + CF_PP_FIELD(bloom, intensity, Float, 0, 4), + CF_PP_FIELD(bloom, threshold, Float, 0, 16), + CF_PP_FIELD(bloom, scatter, Float, 0, 1), + CF_PP_FIELD(chromaticAberration, enabled, Bool, 0, 1), + CF_PP_FIELD(chromaticAberration, intensity, Float, 0, 1), + CF_PP_FIELD(colorGrading, enabled, Bool, 0, 1), + CF_PP_FIELD(colorGrading, exposure, Float, 0, 16), + CF_PP_FIELD(colorGrading, contrast, Float, 0, 4), + CF_PP_FIELD(colorGrading, saturation, Float, 0, 4), + CF_PP_FIELD(colorGrading, temperature, Float, -1, 1), + CF_PP_FIELD(colorGrading, tint, Float, -1, 1), + CF_PP_FIELD(deferredFog, enabled, Bool, 0, 1), + CF_PP_FIELD(deferredFog, density, Float, 0, 1), + CF_PP_FIELD(deferredFog, start, Float, 0, 100000), + CF_PP_FIELD(deferredFog, end, Float, 0, 100000), + CF_PP_FIELD(deferredFog, colorR, Float, 0, 1), + CF_PP_FIELD(deferredFog, colorG, Float, 0, 1), + CF_PP_FIELD(deferredFog, colorB, Float, 0, 1), + CF_PP_FIELD(depthOfField, enabled, Bool, 0, 1), + CF_PP_FIELD(depthOfField, focusDistance, Float, 0.01f, 100000), + CF_PP_FIELD(depthOfField, aperture, Float, 0, 4), + CF_PP_FIELD(depthOfField, focalLength, Float, 1, 600), + CF_PP_FIELD(depthOfField, maxBlur, Float, 0, 4), + CF_PP_FIELD(grain, enabled, Bool, 0, 1), + CF_PP_FIELD(grain, intensity, Float, 0, 1), + CF_PP_FIELD(grain, size, Float, 0.5f, 8), + CF_PP_FIELD(lensDistortion, enabled, Bool, 0, 1), + CF_PP_FIELD(lensDistortion, intensity, Float, -1, 1), + CF_PP_FIELD(motionBlur, enabled, Bool, 0, 1), + CF_PP_FIELD(motionBlur, intensity, Float, 0, 1), + CF_PP_FIELD(motionBlur, maxVelocity, Float, 0, 4), + CF_PP_FIELD(screenSpaceReflections, enabled, Bool, 0, 1), + CF_PP_FIELD(screenSpaceReflections, intensity, Float, 0, 1), + CF_PP_FIELD(screenSpaceReflections, maxRoughness, Float, 0, 1), + CF_PP_FIELD(screenSpaceReflections, maxSteps, UInt, 4, 256), + CF_PP_FIELD(vignette, enabled, Bool, 0, 1), + CF_PP_FIELD(vignette, intensity, Float, 0, 1), + CF_PP_FIELD(vignette, smoothness, Float, 0, 1), + }; + return kFields; +} + +#undef CF_PP_FIELD + +inline const PostProcessField* findPostProcessField(std::string_view path) { + const std::size_t dot = path.find('.'); + if (dot == std::string_view::npos) return nullptr; + const std::string_view effect = path.substr(0, dot); + const std::string_view name = path.substr(dot + 1); + for (const PostProcessField& field : postProcessFields()) { + if (field.effect == effect && field.name == name) return &field; + } + return nullptr; +} + +/// Short aliases accepted wherever an effect name is expected. +inline std::string_view canonicalPostProcessEffect(std::string_view effect) { + if (effect == "ao" || effect == "ssao") return "ambientOcclusion"; + if (effect == "aa") return "antiAliasing"; + if (effect == "chromatic") return "chromaticAberration"; + if (effect == "fog") return "deferredFog"; + if (effect == "dof") return "depthOfField"; + if (effect == "ssr") return "screenSpaceReflections"; + if (effect == "exposure") return "autoExposure"; + return effect; +} + +inline std::optional getPostProcessValue(const PostProcessComponent& fx, const PostProcessField& field) { + const auto* base = reinterpret_cast(&fx) + field.offset; + switch (field.kind) { + case PostProcessField::Kind::Bool: return *reinterpret_cast(base) ? 1.0f : 0.0f; + case PostProcessField::Kind::Float: return *reinterpret_cast(base); + case PostProcessField::Kind::UInt: return static_cast(*reinterpret_cast(base)); + } + return std::nullopt; +} + +inline std::optional getPostProcessValue(const PostProcessComponent& fx, std::string_view path) { + const PostProcessField* field = findPostProcessField(path); + if (!field) return std::nullopt; + return getPostProcessValue(fx, *field); +} + +/// Writes a value clamped to the field range. Returns false for unknown paths. +inline bool setPostProcessValue(PostProcessComponent& fx, const PostProcessField& field, f32 value) { + auto* base = reinterpret_cast(&fx) + field.offset; + const f32 v = value < field.minValue ? field.minValue : (value > field.maxValue ? field.maxValue : value); + switch (field.kind) { + case PostProcessField::Kind::Bool: *reinterpret_cast(base) = value != 0.0f; break; + case PostProcessField::Kind::Float: *reinterpret_cast(base) = v; break; + case PostProcessField::Kind::UInt: *reinterpret_cast(base) = static_cast(v + 0.5f); break; + } + return true; +} + +inline bool setPostProcessValue(PostProcessComponent& fx, std::string_view path, f32 value) { + const PostProcessField* field = findPostProcessField(path); + return field && setPostProcessValue(fx, *field, value); +} + +inline bool setPostProcessEffectEnabled(PostProcessComponent& fx, std::string_view effect, bool enabled) { + const std::string_view name = canonicalPostProcessEffect(effect); + for (const PostProcessField& field : postProcessFields()) { + if (field.effect == name && field.name == "enabled") { + return setPostProcessValue(fx, field, enabled ? 1.0f : 0.0f); + } + } + return false; +} + +inline std::optional isPostProcessEffectEnabled(const PostProcessComponent& fx, std::string_view effect) { + const std::string_view name = canonicalPostProcessEffect(effect); + for (const PostProcessField& field : postProcessFields()) { + if (field.effect == name && field.name == "enabled") return *getPostProcessValue(fx, field) != 0.0f; + } + return std::nullopt; +} + +/// Linear blend of every float field (bools/ints snap at t >= 0.5) — for volume-style transitions. +inline PostProcessComponent lerpPostProcess(const PostProcessComponent& a, const PostProcessComponent& b, f32 t) { + PostProcessComponent out = t < 0.5f ? a : b; + for (const PostProcessField& field : postProcessFields()) { + if (field.kind != PostProcessField::Kind::Float) continue; + const f32 va = *getPostProcessValue(a, field); + const f32 vb = *getPostProcessValue(b, field); + setPostProcessValue(out, field, va + (vb - va) * t); + } + return out; +} + +} // namespace Caffeine::ECS diff --git a/src/editor/AssetBrowser.cpp b/src/editor/AssetBrowser.cpp index 7f0ad77b..6a8e1057 100644 --- a/src/editor/AssetBrowser.cpp +++ b/src/editor/AssetBrowser.cpp @@ -16,6 +16,7 @@ #include #include +#include // ═════════════════════════════════════════════════════════════════════════════ // Data layer — always compiled (no ImGui dependency) @@ -34,6 +35,30 @@ AssetType readCafAssetType(const std::filesystem::path& path) { return header.type; } +std::string toLower(std::string value) { + std::transform(value.begin(), value.end(), value.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + return value; +} + +bool extensionMatchesFilter(const std::filesystem::path& path, const std::string& filter) { + if (filter.empty()) return true; + const std::string ext = toLower(path.extension().string()); + size_t start = 0; + while (start < filter.size()) { + const size_t sep = filter.find(';', start); + std::string token = filter.substr(start, sep == std::string::npos ? std::string::npos : sep - start); + token = toLower(token); + while (!token.empty() && token.front() == ' ') token.erase(token.begin()); + while (!token.empty() && token.back() == ' ') token.pop_back(); + if (!token.empty() && token.front() != '.') token.insert(token.begin(), '.'); + if (!token.empty() && ext == token) return true; + if (sep == std::string::npos) break; + start = sep + 1; + } + return false; +} + bool needsMeshBundleImport(const std::filesystem::path& path) { std::string ext = path.extension().string(); std::transform(ext.begin(), ext.end(), ext.begin(), @@ -172,6 +197,142 @@ void AssetBrowser::loadCapFile(const std::filesystem::path& capPath) { applySearchFilter(); } +void AssetBrowser::beginAssetPicker(const char* extensionFilter, const char* fieldLabel) { + m_assetPickerActive = true; + m_pickerFilter = extensionFilter ? extensionFilter : ""; + m_pickerLabel = fieldLabel ? fieldLabel : "asset"; + m_pickerResult.reset(); + m_pickerCancelled = false; + setAssetScope(AssetScope::Raw); + if (!m_rawRoot.empty()) { + navigateToAssets(); + } else if (!m_projectRoot.empty()) { + navigateToProjectRoot(); + } +} + +void AssetBrowser::cancelAssetPicker() { + m_assetPickerActive = false; + m_pickerCancelled = false; + m_pickerResult.reset(); +} + +AssetBrowser::AssetPickerPoll AssetBrowser::pollAssetPicker(std::string& outRelativePath) { + if (m_pickerCancelled) { + m_pickerCancelled = false; + m_assetPickerActive = false; + m_pickerResult.reset(); + return AssetPickerPoll::Cancelled; + } + if (m_pickerResult.has_value()) { + outRelativePath = *m_pickerResult; + m_pickerResult.reset(); + m_assetPickerActive = false; + return AssetPickerPoll::Selected; + } + return AssetPickerPoll::Idle; +} + +bool AssetBrowser::pickerAcceptsPath(const std::filesystem::path& path) const { + return !path.empty() && extensionMatchesFilter(path, m_pickerFilter); +} + +std::string AssetBrowser::pathRelativeToProject(const std::filesystem::path& absolute) const { + if (!m_projectRoot.empty()) { + std::error_code ec; + const auto rel = std::filesystem::relative(absolute, m_projectRoot, ec); + if (!ec && !rel.empty() && rel.generic_string().rfind("..") != 0) { + return rel.generic_string(); + } + } + return absolute.string(); +} + +void AssetBrowser::commitAssetPicker(const std::filesystem::path& absolutePath) { + if (!m_assetPickerActive || !pickerAcceptsPath(absolutePath)) return; + m_pickerResult = pathRelativeToProject(absolutePath); +} + +void AssetBrowser::presentPickerModal() { +#ifdef CF_HAS_IMGUI + if (!m_assetPickerActive) return; + + ImGui::OpenPopup("Select Asset"); + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); + ImGui::SetNextWindowSize(ImVec2(560.0f, 420.0f), ImGuiCond_Appearing); + ImGui::SetNextWindowFocus(); + + bool open = true; + if (!ImGui::BeginPopupModal("Select Asset", &open, + ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoSavedSettings)) { + return; + } + if (!open) { + m_pickerCancelled = true; + m_assetPickerActive = false; + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + return; + } + + ImGui::Text("Choose %s", m_pickerLabel.c_str()); + ImGui::TextDisabled("%s", m_currentDir.string().c_str()); + if (!m_pickerFilter.empty()) { + ImGui::SameLine(); + ImGui::TextDisabled("(%s)", m_pickerFilter.c_str()); + } + + if (ImGui::Button("Up") && m_currentDir.has_parent_path()) { + navigateUp(); + } + + ImGui::BeginChild("asset_pick_list", ImVec2(0.0f, -ImGui::GetFrameHeightWithSpacing() - 8.0f), true); + for (usize i = 0; i < m_filteredEntries.size(); ++i) { + const Entry& entry = m_filteredEntries[i]; + if (!entry.isDirectory && !pickerAcceptsPath(entry.path)) continue; + + ImGui::PushID(static_cast(i)); + const bool selected = m_selectedEntry == static_cast(i); + const std::string row = entry.isDirectory ? (entry.name + "/") : entry.name; + if (ImGui::Selectable(row.c_str(), selected, ImGuiSelectableFlags_AllowDoubleClick)) { + m_selectedEntry = static_cast(i); + if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + if (entry.isDirectory) { + navigateTo(entry.path); + ImGui::PopID(); + break; + } + commitAssetPicker(entry.path); + ImGui::CloseCurrentPopup(); + } + } + ImGui::PopID(); + } + ImGui::EndChild(); + + bool canSelect = false; + if (m_selectedEntry >= 0 && static_cast(m_selectedEntry) < m_filteredEntries.size()) { + const Entry& entry = m_filteredEntries[static_cast(m_selectedEntry)]; + canSelect = !entry.isDirectory && pickerAcceptsPath(entry.path); + } + ImGui::BeginDisabled(!canSelect); + if (ImGui::Button("Select", ImVec2(120.0f, 0.0f)) && canSelect) { + commitAssetPicker(m_filteredEntries[static_cast(m_selectedEntry)].path); + ImGui::CloseCurrentPopup(); + } + ImGui::EndDisabled(); + ImGui::SameLine(); + if (ImGui::Button("Cancel", ImVec2(120.0f, 0.0f))) { + m_pickerCancelled = true; + m_assetPickerActive = false; + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); +#else +#endif +} + void AssetBrowser::setAssetScope(AssetScope scope) { if (scope == m_assetScope && m_browseMode == BrowseMode::Filesystem) { return; @@ -456,6 +617,36 @@ void AssetBrowser::drawTypeIcon(AssetType type, const std::filesystem::path& pat // ── Toolbar ───────────────────────────────────────────────────────────────── +void AssetBrowser::renderAssetPickerBar() { + if (!m_assetPickerActive) return; + + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.12f, 0.22f, 0.38f, 0.55f)); + ImGui::BeginChild("asset_picker_bar", ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 2.4f), true); + ImGui::TextUnformatted("Choosing asset for inspector field:"); + ImGui::SameLine(); + ImGui::Text("%s", m_pickerLabel.c_str()); + ImGui::TextDisabled("Filter: %s", m_pickerFilter.c_str()); + + bool canSelect = false; + if (m_selectedEntry >= 0 && static_cast(m_selectedEntry) < m_filteredEntries.size()) { + const Entry& entry = m_filteredEntries[static_cast(m_selectedEntry)]; + canSelect = !entry.isDirectory && pickerAcceptsPath(entry.path); + } + + ImGui::BeginDisabled(!canSelect); + if (ImGui::Button("Use Selected")) { + commitAssetPicker(m_filteredEntries[static_cast(m_selectedEntry)].path); + } + ImGui::EndDisabled(); + ImGui::SameLine(); + if (ImGui::Button("Cancel")) { + m_pickerCancelled = true; + m_assetPickerActive = false; + } + ImGui::EndChild(); + ImGui::PopStyleColor(); +} + void AssetBrowser::renderToolbar() { if (ImGui::Button("+ Create")) { m_showAssetCreator = true; @@ -623,6 +814,9 @@ void AssetBrowser::renderGridView() { navigateTo(entry.path); ImGui::PopID(); break; + } else if (m_assetPickerActive && !entry.isDirectory && + pickerAcceptsPath(entry.path)) { + commitAssetPicker(entry.path); } else if (entry.path.extension() == ".lua" && m_onScriptOpen) { m_onScriptOpen(entry.path); } else if (entry.path.extension() == ".mat" && m_onMaterialOpen) { @@ -699,6 +893,9 @@ void AssetBrowser::renderListView() { navigateTo(entry.path); ImGui::PopID(); break; + } else if (m_assetPickerActive && !entry.isDirectory && + pickerAcceptsPath(entry.path)) { + commitAssetPicker(entry.path); } else if (entry.path.extension() == ".lua" && m_onScriptOpen) { m_onScriptOpen(entry.path); } else if (entry.path.extension() == ".mat" && m_onMaterialOpen) { @@ -1414,16 +1611,13 @@ void AssetBrowser::renderNamingPopup() { f << "{}"; } else if (m_pendingCreateType == 9) { std::ofstream f(m_currentDir / (nameStr + ".mat")); - f << "CAFMAT1\n" + f << "CAFMAT2\n" "name " << nameStr << "\n" "albedo 1 1 1 1\n" - "roughness 0.5\n" "metallic 0\n" - "node_count 2\n" - "node 1 Color 1 1 1 1\n" - "node 2 OutputPBR\n" - "link_count 1\n" - "link 1 0 2 0\n"; + "roughness 0.5\n" + "emission 0 0 0\n" + "emission_strength 0\n"; } else if (m_pendingCreateType == 10) { std::error_code ec; std::filesystem::path newPath = m_currentDir / nameStr; @@ -1451,6 +1645,7 @@ void AssetBrowser::render(ECS::World& world, [[maybe_unused]] EditorContext& ctx if (ImGui::Begin("Asset Browser", &m_open)) { + renderAssetPickerBar(); renderToolbar(); renderAssetCreatorModal(); renderNamingPopup(); diff --git a/src/editor/AssetBrowser.hpp b/src/editor/AssetBrowser.hpp index b08e09d4..909bf80a 100644 --- a/src/editor/AssetBrowser.hpp +++ b/src/editor/AssetBrowser.hpp @@ -73,6 +73,14 @@ class AssetBrowser { m_onMaterialOpen = std::move(cb); } + enum class AssetPickerPoll : u8 { Idle, Selected, Cancelled }; + void beginAssetPicker(const char* extensionFilter, const char* fieldLabel); + void cancelAssetPicker(); + bool isAssetPickerActive() const { return m_assetPickerActive; } + AssetPickerPoll pollAssetPicker(std::string& outRelativePath); + /// Modal list. Call every frame while a project-asset browse is active. + void presentPickerModal(); + // ── Data layer ───────────────────────────────────────────────────── void init(const char* rootPath); void init(const ProjectConfig& projectConfig); @@ -120,7 +128,11 @@ class AssetBrowser { private: // UI helpers void renderToolbar(); + void renderAssetPickerBar(); void renderBreadcrumbs(); + bool pickerAcceptsPath(const std::filesystem::path& path) const; + void commitAssetPicker(const std::filesystem::path& absolutePath); + std::string pathRelativeToProject(const std::filesystem::path& absolute) const; void renderGridView(); void renderListView(); void renderPreviewPane(); @@ -184,6 +196,11 @@ class AssetBrowser { std::function m_onScriptOpen; std::function m_onMaterialOpen; + bool m_assetPickerActive = false; + std::string m_pickerFilter; + std::string m_pickerLabel; + std::optional m_pickerResult; + bool m_pickerCancelled = false; }; } // namespace Caffeine::Editor diff --git a/src/editor/BrowseSession.cpp b/src/editor/BrowseSession.cpp new file mode 100644 index 00000000..34d5fcfa --- /dev/null +++ b/src/editor/BrowseSession.cpp @@ -0,0 +1,59 @@ +#include "editor/EditorContext.hpp" +#include "editor/AssetBrowser.hpp" +#include "editor/FilePicker.hpp" + +namespace Caffeine::Editor { + +void serviceBrowseSession(EditorContext& ctx, AssetBrowser& browser) { + EditorContext::BrowseSession& session = ctx.browse; + if (session.kind == EditorContext::BrowseSession::Kind::None || session.resultReady) { + return; + } + + if (session.kind == EditorContext::BrowseSession::Kind::ProjectAsset) { + if (!session.started) { + browser.open(); + browser.beginAssetPicker(session.filter.c_str(), session.title.c_str()); + session.started = true; + } + browser.presentPickerModal(); + + std::string picked; + const auto poll = browser.pollAssetPicker(picked); + if (poll == AssetBrowser::AssetPickerPoll::Selected) { + if (session.stringTarget) { + *session.stringTarget = picked; + ctx.isDirty = true; + } + session.clear(); + } else if (poll == AssetBrowser::AssetPickerPoll::Cancelled) { + session.clear(); + } + return; + } + + FilePicker::Mode mode = FilePicker::Mode::PickFile; + if (session.kind == EditorContext::BrowseSession::Kind::PickFolder) { + mode = FilePicker::Mode::PickFolder; + } else if (session.kind == EditorContext::BrowseSession::Kind::SaveFile) { + mode = FilePicker::Mode::SaveFile; + } + + if (auto chosen = FilePicker::pickPath(mode, session.title, session.startPath)) { + if (session.stringTarget) { + *session.stringTarget = chosen->string(); + ctx.isDirty = true; + session.clear(); + return; + } + session.result = *chosen; + session.resultReady = true; + session.kind = EditorContext::BrowseSession::Kind::None; + return; + } + if (FilePicker::consumeCloseEvent(session.title)) { + session.clear(); + } +} + +} // namespace Caffeine::Editor diff --git a/src/editor/CameraPreviewPanel.cpp b/src/editor/CameraPreviewPanel.cpp index f8ac0fb8..ea1359f6 100644 --- a/src/editor/CameraPreviewPanel.cpp +++ b/src/editor/CameraPreviewPanel.cpp @@ -190,15 +190,18 @@ bool renderCameraPreviewGpuOnly(SceneViewport& viewport, ECS::World& world, Edit const bool camChanged = (camPos - cache.lastCamPos).length() > 0.001f || (focus - cache.lastFocus).length() > 0.001f || std::abs(fovRad - cache.lastFov) > 0.001f; - const ImVec2 fbSizeProbe = imguiFramebufferSize(panelSize, 960); + const ImVec2 fbSizeProbe = imguiFramebufferSize(panelSize, 1920); const u32 probeW = static_cast(std::max(fbSizeProbe.x, 8.0f)); const u32 probeH = static_cast(std::max(fbSizeProbe.y, 8.0f)); const bool sizeChanged = probeW != cache.lastW || probeH != cache.lastH; - const u32 gpuInterval = camChanged ? 1u : 2u; - const bool rerunGpu = (camChanged || sizeChanged || !cache.hasFrame) + const u64 sceneStamp = editorSceneContentStamp(world); + const bool sceneChanged = sceneStamp != cache.lastSceneStamp; + const u32 gpuInterval = (camChanged || sceneChanged) ? 1u : 2u; + const bool rerunGpu = (camChanged || sizeChanged || sceneChanged || !cache.hasFrame || + viewport.cameraPreviewNeedsAnotherFrame()) && editorPanelWorthGpuRender(origin, panelSize, gpuInterval); if (rerunGpu) { - const ImVec2 fbSize = imguiFramebufferSize(panelSize, 960); + const ImVec2 fbSize = fbSizeProbe; const bool gpuOk = viewport.renderCameraPreviewGpu( viewport.frameCommandBuffer(), world, ctx, view, proj, camPos, focus, fovRad, nearClip, farClip, @@ -214,18 +217,15 @@ bool renderCameraPreviewGpuOnly(SceneViewport& viewport, ECS::World& world, Edit cache.lastFov = fovRad; cache.lastW = probeW; cache.lastH = probeH; + cache.lastSceneStamp = sceneStamp; cache.hasFrame = true; } if (!preview || !preview->handle) { return false; } - { - const int longest = static_cast(std::max(panelSize.x, panelSize.y)); - const int skyCap = std::clamp(longest, 256, 512); - viewport.drawSkyboxForView(dl, origin, panelSize, world, ctx, skyCamera, false, - &skyboxRenderer, skyCap); - } + (void)skyCamera; + (void)skyboxRenderer; dl->AddImage(reinterpret_cast(preview->handle), origin, ImVec2(origin.x + panelSize.x, origin.y + panelSize.y), ImVec2(0, 0), ImVec2(1, 1)); @@ -378,10 +378,6 @@ void CameraPreviewPanel::onImGuiRender(ECS::World& world, EditorContext& ctx, Sc ImGui::InvisibleButton("##campreview", panelSize); renderCameraView(world, ctx, origin, panelSize, camX, camY, zoom); ImDrawList* previewDl = ImGui::GetWindowDrawList(); - if (const ECS::PostProcessComponent* fx = - Render::findPostProcessForCamera(world, cameraEntity)) { - Render::applyPostProcessOverlay(previewDl, origin, panelSize, *fx); - } if (cameraEntity.isValid()) { const char* camName = getEntityName(world, cameraEntity); ImDrawList* badgeDl = previewDl; diff --git a/src/editor/CameraPreviewPanel.hpp b/src/editor/CameraPreviewPanel.hpp index 8486ec79..30f42a16 100644 --- a/src/editor/CameraPreviewPanel.hpp +++ b/src/editor/CameraPreviewPanel.hpp @@ -25,6 +25,7 @@ struct CameraPreviewGpuCache { f32 lastFov = 0.0f; u32 lastW = 0; u32 lastH = 0; + u64 lastSceneStamp = 0; bool hasFrame = false; }; diff --git a/src/editor/ComponentRegistry.cpp b/src/editor/ComponentRegistry.cpp index 1007e61b..393cab88 100644 --- a/src/editor/ComponentRegistry.cpp +++ b/src/editor/ComponentRegistry.cpp @@ -8,11 +8,13 @@ #include "ecs/ProceduralComponents.hpp" #include "terrain/TerrainCache.hpp" #include "physics/PhysicsComponents2D.hpp" +#include "physics/PhysicsComponents3D.hpp" #include "audio/AudioComponents.hpp" #include "script/ScriptTypes.hpp" #include "ui/UIComponents.hpp" #include "animation/AnimationComponents.hpp" #include "ecs/PostProcessComponents.hpp" +#include "ecs/ForwardRenderComponents.hpp" #include "editor/ComponentTypeRegistry.hpp" #include "ecs/Components3D.hpp" #include "scene/LightingSystem.hpp" @@ -36,6 +38,16 @@ void registerAllComponents(ComponentRegistry& reg) { w.add(e); } }); + reg.registerComponent({ + "Physics 3D", "RigidBody3D", + [](ECS::World& w, ECS::Entity e){ return w.has(e); }, + [](ECS::World& w, ECS::Entity e){ w.add(e); } + }); + reg.registerComponent({ + "Physics 3D", "Collider3D", + [](ECS::World& w, ECS::Entity e){ return w.has(e); }, + [](ECS::World& w, ECS::Entity e){ w.add(e); } + }); reg.registerComponent({ "Physics 2D", "Collider2D", [](ECS::World& w, ECS::Entity e){ return w.has(e); }, @@ -197,6 +209,13 @@ void registerAllComponents(ComponentRegistry& reg) { [](ECS::World& w, ECS::Entity e) { return w.has(e); }, [](ECS::World& w, ECS::Entity e) { w.add(e); } }); + reg.registerComponent({ + "Rendering", "Forward Render Features", + [](ECS::World& w, ECS::Entity e) { + return w.has(e); + }, + [](ECS::World& w, ECS::Entity e) { w.add(e); } + }); reg.registerComponent({ "Procedural", "Procedural World", [](ECS::World& w, ECS::Entity e) { return w.has(e); }, @@ -204,6 +223,8 @@ void registerAllComponents(ComponentRegistry& reg) { }); ComponentTypeRegistry::instance().registerType("PostProcess"); + ComponentTypeRegistry::instance().registerType( + "ForwardRenderFeatures"); ComponentTypeRegistry::instance().registerType( "ProceduralWorld"); } diff --git a/src/editor/DenseOutdoorBenchmark.hpp b/src/editor/DenseOutdoorBenchmark.hpp new file mode 100644 index 00000000..07a2b41b --- /dev/null +++ b/src/editor/DenseOutdoorBenchmark.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include "ecs/Components3D.hpp" +#include "ecs/LightComponents.hpp" +#include "ecs/MeshComponents.hpp" +#include "ecs/TerrainComponents.hpp" +#include "ecs/ForwardRenderComponents.hpp" +#include "ecs/World.hpp" +#include "editor/EditorContext.hpp" + +#include + +namespace Caffeine::Editor { + +/// Tunable size of assets/benchmarks/dense_outdoor.caf. +/// Raise the terrain resolution toward 512 only when the frame budget allows it. +inline constexpr u32 kDenseOutdoorTerrainResolution = 129; +inline constexpr u32 kDenseOutdoorTreeCount = 240; +inline constexpr u32 kDenseOutdoorRockCount = 40; + +inline void populateDenseOutdoorBenchmark(ECS::World& world) { + { + ECS::Entity env = world.create(); + setEntityName(world, env, "RenderEnvironment"); + auto& forward = world.add(env); + forward.instancing.enabled = true; + forward.instancing.maxInstancesPerBatch = 256; + forward.ibl.enabled = true; + // Reflections / volumetrics / occlusion stay off unless you opt in here or via script. + } + { + ECS::Entity sun = world.create(); + setEntityName(world, sun, "Sun"); + world.add(sun).intensity = 1.1f; + world.add(sun).shadowDistance = 80.0f; + } + { + ECS::Entity point = world.create(); + setEntityName(world, point, "Point A"); + world.add(point).position = Vec3(-8.0f, 3.0f, 6.0f); + auto& light = world.add(point); + light.color = Vec4(1.0f, 0.85f, 0.6f, 1.0f); + light.intensity = 2.0f; + world.add(point).radius = 18.0f; + } + { + ECS::Entity point = world.create(); + setEntityName(world, point, "Point B"); + world.add(point).position = Vec3(12.0f, 2.5f, -10.0f); + auto& light = world.add(point); + light.color = Vec4(0.6f, 0.75f, 1.0f, 1.0f); + light.intensity = 1.6f; + world.add(point).radius = 16.0f; + } + { + ECS::Entity spot = world.create(); + setEntityName(world, spot, "Spot"); + world.add(spot).position = Vec3(0.0f, 6.0f, -8.0f); + world.add(spot).intensity = 3.0f; + auto& cone = world.add(spot); + cone.radius = 24.0f; + cone.angle = 40.0f; + } + { + ECS::Entity ground = world.create(); + setEntityName(world, ground, "Water"); + world.add(ground).position = Vec3(0.0f, 0.0f, 0.0f); + world.add(ground).scale = Vec3(80.0f, 1.0f, 80.0f); + world.add(ground).primitive = ECS::MeshPrimitive::Plane; + } + { + ECS::Entity terrain = world.create(); + setEntityName(world, terrain, "Terrain"); + auto& component = world.add(terrain); + component.resolutionX = kDenseOutdoorTerrainResolution; + component.resolutionZ = kDenseOutdoorTerrainResolution; + component.worldSizeX = 128.0f; + component.worldSizeZ = 128.0f; + component.maxHeight = 12.0f; + component.useSplatmap = false; + component.buildCollisionMesh = false; + } + + const int grid = 16; + for (u32 i = 0; i < kDenseOutdoorTreeCount; ++i) { + const int x = static_cast(i % grid) - grid / 2; + const int z = static_cast(i / grid) - grid / 2; + ECS::Entity tree = world.create(); + setEntityName(world, tree, "Tree"); + world.add(tree).position = Vec3(x * 3.2f, 0.5f, z * 3.2f); + world.add(tree).scale = Vec3(0.6f, 1.4f, 0.6f); + world.add(tree).primitive = ECS::MeshPrimitive::Sphere; + } + for (u32 i = 0; i < kDenseOutdoorRockCount; ++i) { + ECS::Entity rock = world.create(); + setEntityName(world, rock, "Rock"); + const f32 angle = static_cast(i) * 0.7f; + world.add(rock).position = + Vec3(std::cos(angle) * 18.0f, 0.4f, std::sin(angle) * 18.0f); + world.add(rock).scale = Vec3(1.4f, 0.8f, 1.2f); + world.add(rock).primitive = ECS::MeshPrimitive::Cube; + } +} + +} // namespace Caffeine::Editor diff --git a/src/editor/EditorContext.hpp b/src/editor/EditorContext.hpp index 224db1a8..4f8822af 100644 --- a/src/editor/EditorContext.hpp +++ b/src/editor/EditorContext.hpp @@ -3,6 +3,7 @@ #include "ecs/Entity.hpp" #include "ecs/World.hpp" #include "math/Vec3.hpp" +#include #include #include #include @@ -94,6 +95,44 @@ class EditorContext { // ── Scene state ──────────────────────────────────────────────────── std::string currentScenePath; bool isDirty = false; + std::string materialToOpen; + std::filesystem::path projectRootPath; + + /// One browse dialog for the whole IDE. Panels only queue it; SceneEditor + /// pumps it every frame until the user picks a path or closes the dialog. + struct BrowseSession { + enum class Kind : u8 { None, ProjectAsset, PickFile, PickFolder, SaveFile }; + + Kind kind = Kind::None; + bool started = false; + bool resultReady = false; + std::string title; + std::string filter; + std::filesystem::path startPath; + std::filesystem::path result; + std::string* stringTarget = nullptr; + u32 tag = 0; + + void clear() { *this = {}; } + + void requestProjectAsset(std::string* target, const char* extensionFilter, const char* fieldLabel) { + clear(); + kind = Kind::ProjectAsset; + stringTarget = target; + filter = extensionFilter ? extensionFilter : ""; + title = fieldLabel ? fieldLabel : "asset"; + } + + void requestFilesystem(Kind filesystemKind, const char* dialogTitle, + const std::filesystem::path& start, u32 userTag = 0) { + clear(); + kind = filesystemKind; + title = dialogTitle ? dialogTitle : "Browse"; + startPath = start; + tag = userTag; + } + }; + BrowseSession browse; // ── Gizmo ────────────────────────────────────────────────────────── enum class GizmoMode : u8 { None, Translate, Rotate, Scale }; @@ -141,9 +180,12 @@ class EditorContext { const f32 orbit = std::abs(camDistance); const f32 reach = std::max({orbit, std::abs(camFocus.x), std::abs(camFocus.y), std::abs(camFocus.z)}); - return std::clamp(reach * 6.0f + 400.0f, 400.0f, 4000.0f); + return std::clamp(reach * 8.0f + 1000.0f, 1000.0f, 20000.0f); } + /// Internal resolution of GPU viewports relative to their pixel size (0.5 – 2.0). + f32 renderScale = 1.0f; + // ── Texture quality (distance-based LOD around viewers) ───────────── bool textureQualityEnabled = true; f32 textureQualityRadius = 35.0f; @@ -244,4 +286,7 @@ class EditorContext { EditorCommand m_pendingCmd; }; +class AssetBrowser; +void serviceBrowseSession(EditorContext& ctx, AssetBrowser& browser); + } // namespace Caffeine::Editor diff --git a/src/editor/EditorPanelUtils.hpp b/src/editor/EditorPanelUtils.hpp index 4318d4dc..c53d38ce 100644 --- a/src/editor/EditorPanelUtils.hpp +++ b/src/editor/EditorPanelUtils.hpp @@ -1,5 +1,18 @@ #pragma once +#include "assets/MaterialCache.hpp" +#include "core/Types.hpp" +#include "ecs/ComponentQuery.hpp" +#include "ecs/MeshComponents.hpp" +#include "ecs/ForwardRenderComponents.hpp" +#include "ecs/PostProcessComponents.hpp" +#include "ecs/SkyboxComponents.hpp" +#include "ecs/TerrainComponents.hpp" +#include "ecs/World.hpp" +#include "scene/SceneComponents.hpp" + +#include + #ifdef CF_HAS_IMGUI #include #include @@ -7,6 +20,88 @@ namespace Caffeine::Editor { +// Changes when entities move, terrain is edited, or the scene membership changes. +// Used so cached GPU frames redraw without waiting for a camera orbit. +inline u64 editorSceneContentStamp(ECS::World& world) { + u64 hash = 1469598103934665603ull; + auto mix = [&](u64 value) { + hash ^= value; + hash *= 1099511628211ull; + }; + + mix(world.entityCount()); + mix(Assets::MaterialCache::instance().revision()); + + ECS::ComponentQuery meshQuery; + meshQuery.with(); + world.forEach(meshQuery, [&](ECS::Entity entity, ECS::MeshFilterComponent& filter) { + mix(entity.id()); + auto mixText = [&](const std::string& text) { + mix(text.size()); + for (unsigned char c : text) mix(c); + }; + mixText(filter.customMaterialPath); + mixText(filter.customTexturePath); + mixText(filter.customNormalPath); + u32 shininessBits = 0; + std::memcpy(&shininessBits, &filter.shininess, sizeof(shininessBits)); + mix(shininessBits); + }); + + ECS::ComponentQuery transformQuery; + transformQuery.with(); + world.forEach(transformQuery, [&](ECS::Entity entity, Scene::WorldTransform& wt) { + mix(entity.id()); + const f32* matrix = wt.matrix.data(); + for (int i = 0; i < 16; ++i) { + u32 bits = 0; + std::memcpy(&bits, &matrix[i], sizeof(bits)); + mix(bits); + } + }); + + ECS::ComponentQuery terrainQuery; + terrainQuery.with(); + world.forEach(terrainQuery, [&](ECS::Entity, ECS::TerrainComponent& terrain) { + mix(terrain.dataRevision); + mix(terrain.meshRevision); + mix(terrain.splatRevision); + }); + + ECS::ComponentQuery forwardQuery; + forwardQuery.with(); + world.forEach( + forwardQuery, [&](ECS::Entity entity, ECS::ForwardRenderFeaturesComponent& fx) { + mix(entity.id()); + mix(fx.enabled ? 1u : 0u); + mix(static_cast(fx.reflections.mode)); + mix(static_cast(fx.volumetrics.quality)); + mix(static_cast(fx.occlusion.enabled)); + }); + + ECS::ComponentQuery skyQuery; + skyQuery.with(); + world.forEach(skyQuery, [&](ECS::Entity entity, ECS::SkyboxComponent& sky) { + mix(entity.id()); + mix(sky.enabled ? 1u : 0u); + mix(static_cast(sky.presetIndex)); + u32 exposureBits = 0; + std::memcpy(&exposureBits, &sky.exposure, sizeof(exposureBits)); + mix(exposureBits); + for (const char* c = sky.customTexturePath; *c; ++c) mix(static_cast(*c)); + }); + + ECS::ComponentQuery postQuery; + postQuery.with(); + world.forEach(postQuery, [&](ECS::Entity entity, ECS::PostProcessComponent& fx) { + mix(entity.id()); + const auto* bytes = reinterpret_cast(&fx); + for (size_t i = 0; i < sizeof(fx); ++i) mix(bytes[i]); + }); + + return hash; +} + #ifdef CF_HAS_IMGUI inline ImGuiID detachedPanelClassId() { diff --git a/src/editor/EditorPreferences.cpp b/src/editor/EditorPreferences.cpp index c70c48df..4ea74daa 100644 --- a/src/editor/EditorPreferences.cpp +++ b/src/editor/EditorPreferences.cpp @@ -1,5 +1,6 @@ #include "editor/EditorPreferences.hpp" +#include #include #include #include @@ -96,6 +97,7 @@ EditorPreferences EditorPreferences::load() { readFloatField(json, "texture_quality_radius", prefs.textureQualityRadius); readFloatField(json, "texture_quality_falloff", prefs.textureQualityFalloff); readFloatField(json, "texture_quality_min_scale", prefs.textureQualityMinScale); + readFloatField(json, "render_scale", prefs.renderScale); readBoolField(json, "show_fps_status_bar", prefs.showFPSInStatusBar); readBoolField(json, "confirm_scene_close", prefs.confirmOnSceneClose); readBoolField(json, "reopen_last_scene", prefs.reopenLastSceneOnStartup); @@ -127,6 +129,7 @@ bool EditorPreferences::save() const { file << " \"texture_quality_radius\": " << textureQualityRadius << ",\n"; file << " \"texture_quality_falloff\": " << textureQualityFalloff << ",\n"; file << " \"texture_quality_min_scale\": " << textureQualityMinScale << ",\n"; + file << " \"render_scale\": " << renderScale << ",\n"; file << " \"show_fps_status_bar\": " << (showFPSInStatusBar ? "true" : "false") << ",\n"; file << " \"confirm_scene_close\": " << (confirmOnSceneClose ? "true" : "false") << ",\n"; file << " \"reopen_last_scene\": " << (reopenLastSceneOnStartup ? "true" : "false") << "\n"; diff --git a/src/editor/EditorPreferences.hpp b/src/editor/EditorPreferences.hpp index bad2abe3..e17cacd1 100644 --- a/src/editor/EditorPreferences.hpp +++ b/src/editor/EditorPreferences.hpp @@ -1,7 +1,6 @@ #pragma once #include "core/Types.hpp" - #include #include @@ -27,6 +26,8 @@ struct EditorPreferences { f32 textureQualityRadius = 35.0f; f32 textureQualityFalloff = 100.0f; f32 textureQualityMinScale = 0.25f; + /// Internal scene resolution multiplier for GPU viewport / previews (0.25–2). + f32 renderScale = 1.0f; bool showFPSInStatusBar = true; bool confirmOnSceneClose = true; bool reopenLastSceneOnStartup = true; diff --git a/src/editor/FilePicker.cpp b/src/editor/FilePicker.cpp index 179dd843..1b6bb609 100644 --- a/src/editor/FilePicker.cpp +++ b/src/editor/FilePicker.cpp @@ -457,8 +457,10 @@ std::optional FilePicker::pickPathImGui( ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); ImGui::SetNextWindowSize(ImVec2(980.0f, 620.0f), ImGuiCond_Appearing); + ImGui::SetNextWindowFocus(); - ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoCollapse; + ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoDocking | + ImGuiWindowFlags_NoSavedSettings; if (!ImGui::Begin(title.c_str(), &state.isOpen, windowFlags)) { ImGui::End(); return result; diff --git a/src/editor/GameplayPreviewPanel.cpp b/src/editor/GameplayPreviewPanel.cpp index e172ae83..ef17019a 100644 --- a/src/editor/GameplayPreviewPanel.cpp +++ b/src/editor/GameplayPreviewPanel.cpp @@ -210,9 +210,9 @@ void GameplayPreviewPanel::render(ECS::World& world, EditorContext& ctx) { } else #ifdef CF_HAS_SDL3 if (found3D && cam && m_ready && m_frameCmd && m_renderer.isReady()) { - const ImVec2 fbSize = imguiFramebufferSize(panelSize, 960); - u32 targetW = std::clamp(static_cast(fbSize.x), 8u, 1280u); - u32 targetH = std::clamp(static_cast(fbSize.y), 8u, 720u); + const ImVec2 fbSize = imguiFramebufferSize(panelSize, 2560); + u32 targetW = std::clamp(static_cast(fbSize.x), 8u, 2560u); + u32 targetH = std::clamp(static_cast(fbSize.y), 8u, 1600u); if (!m_colorTarget || !m_depthTarget || m_width != targetW || m_height != targetH) { resizeCanvas(targetW, targetH); } @@ -253,27 +253,22 @@ void GameplayPreviewPanel::render(ECS::World& world, EditorContext& ctx) { Render::GpuSceneRenderOptions previewOpts; previewOpts.enableShadows = false; previewOpts.wireframeMeshes = false; + previewOpts.environmentPath = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string(); + previewOpts.postProcessCamera = cameraEntity; + previewOpts.renderScale = ctx.renderScale; + previewOpts.deltaTime = ImGui::GetIO().DeltaTime; const bool camChanged = (position - m_lastCamPos).length() > 0.001f || (forward - m_lastCamForward).length() > 0.001f || std::abs(camera.fovRad - m_lastFovRad) > 0.001f; const bool sizeChanged = targetW != m_lastTargetW || targetH != m_lastTargetH; - const u32 gpuInterval = camChanged ? 1u : 2u; - const bool rerunGpu = (camChanged || sizeChanged || !m_hasGpuFrame) + const u64 sceneStamp = editorSceneContentStamp(world); + const bool sceneChanged = sceneStamp != m_lastSceneStamp; + const u32 gpuInterval = (camChanged || sceneChanged) ? 1u : 2u; + const bool rerunGpu = (camChanged || sizeChanged || sceneChanged || !m_hasGpuFrame || + ctx.isPlayMode || m_renderer.needsAnotherFrame()) && editorPanelWorthGpuRender(origin, panelSize, gpuInterval); - { - Render::SkyboxCamera skyCamera; - skyCamera.forward = forward; - skyCamera.right = right; - skyCamera.up = up; - skyCamera.fovY = camera.fovRad; - skyCamera.aspect = aspect; - const int longest = static_cast(std::max(panelSize.x, panelSize.y)); - const int skyCap = std::clamp(longest, 256, 512); - drawSceneSkybox(dl, origin, panelSize, world, ctx, skyCamera, m_skyboxRenderer, skyCap); - } - if (rerunGpu) { m_renderer.renderWithCamera(m_frameCmd, world, camera, m_colorTarget, m_depthTarget, m_width, m_height, projectRootFromContext(ctx), previewOpts); @@ -282,6 +277,7 @@ void GameplayPreviewPanel::render(ECS::World& world, EditorContext& ctx) { m_lastFovRad = camera.fovRad; m_lastTargetW = targetW; m_lastTargetH = targetH; + m_lastSceneStamp = sceneStamp; m_hasGpuFrame = true; } @@ -315,9 +311,6 @@ void GameplayPreviewPanel::render(ECS::World& world, EditorContext& ctx) { if (ctx.isPlayMode) { UI::drawWidgets(world, dl, origin, panelSize); } - if (const ECS::PostProcessComponent* fx = Render::findPostProcessForCamera(world, cameraEntity)) { - Render::applyPostProcessOverlay(dl, origin, panelSize, *fx); - } ImGui::End(); } diff --git a/src/editor/GameplayPreviewPanel.hpp b/src/editor/GameplayPreviewPanel.hpp index dc31d303..465ebf16 100644 --- a/src/editor/GameplayPreviewPanel.hpp +++ b/src/editor/GameplayPreviewPanel.hpp @@ -51,6 +51,7 @@ class GameplayPreviewPanel { u32 m_lastTargetW = 0; u32 m_lastTargetH = 0; bool m_hasGpuFrame = false; + u64 m_lastSceneStamp = 0; #endif #ifdef CF_HAS_IMGUI Render::SkyboxRenderer m_skyboxRenderer; diff --git a/src/editor/InspectorPanel.cpp b/src/editor/InspectorPanel.cpp index 14894fc7..dc986c41 100644 --- a/src/editor/InspectorPanel.cpp +++ b/src/editor/InspectorPanel.cpp @@ -9,11 +9,14 @@ #include "ecs/PrefabComponents.hpp" #include "audio/AudioComponents.hpp" #include "physics/PhysicsComponents2D.hpp" +#include "physics/PhysicsComponents3D.hpp" #include "ecs/MeshComponents.hpp" #include "assets/MeshCache.hpp" #include "editor/EditorPaths.hpp" #include "ecs/CameraComponents.hpp" #include "ecs/PostProcessComponents.hpp" +#include "ecs/ForwardRenderComponents.hpp" +#include "render/RenderFeatures.hpp" #include "editor/ComponentTypeRegistry.hpp" #include "ecs/TerrainComponents.hpp" #include "core/WorldUnits.hpp" @@ -106,14 +109,12 @@ void InspectorPanel::render(ECS::World& world, EditorContext& ctx) { ImGui::Separator(); if (ImGui::Button("Save as Prefab", ImVec2(-1, 0))) { - auto prefabPath = FilePicker::pickPath( - FilePicker::Mode::SaveFile, - "Save Entity as Prefab", - "prefabs/" - ); - if (prefabPath) { - savePrefab(world, e, *prefabPath); - } + ctx.browse.requestFilesystem(EditorContext::BrowseSession::Kind::SaveFile, + "Save Entity as Prefab", "prefabs/", e.id()); + } + if (ctx.browse.resultReady && ctx.browse.tag == e.id()) { + savePrefab(world, e, ctx.browse.result); + ctx.browse.clear(); } ImGui::Separator(); @@ -127,6 +128,8 @@ void InspectorPanel::render(ECS::World& world, EditorContext& ctx) { drawCppScript(world, e, ctx); drawRigidBody2D(world, e, ctx); drawCollider2D(world, e, ctx); + drawRigidBody3D(world, e, ctx); + drawCollider3D(world, e, ctx); drawAudioSource(world, e, ctx); drawPersistent(world, e, ctx); drawMeshFilter(world, e, ctx); @@ -139,6 +142,7 @@ void InspectorPanel::render(ECS::World& world, EditorContext& ctx) { drawSkybox(world, e, ctx); drawTerrain(world, e, ctx); drawPostProcess(world, e, ctx); + drawForwardRenderFeatures(world, e, ctx); ImGui::Separator(); @@ -309,7 +313,7 @@ void InspectorPanel::drawSprite(ECS::World& world, ECS::Entity e, EditorContext& } auto* sprite = world.get(e); - if (Widgets::AssetField("Texture", sprite->name, ".png;.jpg;.bmp", resolveProjectRoot(ctx))) + if (Widgets::AssetField(ctx, "Texture", sprite->name, ".png;.jpg;.bmp")) ctx.isDirty = true; int frame = static_cast(sprite->frameIndex); if (ImGui::DragInt("Frame", &frame, 1, 0, 1000)) { @@ -385,6 +389,66 @@ void InspectorPanel::drawRigidBody2D(ECS::World& world, ECS::Entity e, EditorCon ImGui::Checkbox("Is Sleeping", &rb->isSleeping); if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; } +void InspectorPanel::drawRigidBody3D(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + if (!world.has(e)) return; + + bool enabled = true; + bool removeRequested = false; + if (!Widgets::ComponentHeader("RigidBody3D", enabled, removeRequested, "arrows-vertical")) return; + if (removeRequested) { + world.remove(e); + ctx.isDirty = true; + return; + } + + auto* rb = world.get(e); + ImGui::DragFloat("Mass", &rb->mass, 0.1f, 0.001f, 10000.0f, "%.2f"); + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + ImGui::DragFloat("Friction", &rb->friction, 0.01f, 0.0f, 1.0f, "%.2f"); + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + ImGui::DragFloat("Restitution", &rb->restitution, 0.01f, 0.0f, 1.0f, "%.2f"); + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + + const char* types[] = {"Dynamic", "Kinematic", "Static"}; + int type = static_cast(rb->bodyType); + if (ImGui::Combo("Body Type", &type, types, 3)) { + rb->bodyType = static_cast(type); + ctx.isDirty = true; + } + if (ImGui::Checkbox("Lock Rotation", &rb->lockRotation)) ctx.isDirty = true; +} + +void InspectorPanel::drawCollider3D(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + if (!world.has(e)) return; + + bool enabled = true; + bool removeRequested = false; + if (!Widgets::ComponentHeader("Collider3D", enabled, removeRequested, "box")) return; + if (removeRequested) { + world.remove(e); + ctx.isDirty = true; + return; + } + + auto* col = world.get(e); + const char* shapes[] = {"Box", "Sphere", "Capsule"}; + int shape = static_cast(col->shape); + if (ImGui::Combo("Shape", &shape, shapes, 3)) { + col->shape = static_cast(shape); + ctx.isDirty = true; + } + if (col->shape == Physics3D::ColliderShape3D::Sphere) { + ImGui::DragFloat("Radius", &col->halfExtents.x, 0.01f, 0.01f, 100.0f, "%.2f"); + } else if (col->shape == Physics3D::ColliderShape3D::Capsule) { + ImGui::DragFloat("Radius", &col->halfExtents.x, 0.01f, 0.01f, 100.0f, "%.2f"); + ImGui::DragFloat("Height", &col->halfExtents.y, 0.01f, 0.02f, 100.0f, "%.2f"); + } else { + ImGui::DragFloat3("Half Extents", &col->halfExtents.x, 0.01f, 0.01f, 100.0f, "%.2f"); + } + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::Checkbox("Trigger", &col->isTrigger)) ctx.isDirty = true; +} + void InspectorPanel::drawAudioSource(ECS::World& world, ECS::Entity e, EditorContext& ctx) { if (!world.has(e)) return; @@ -400,7 +464,7 @@ void InspectorPanel::drawAudioSource(ECS::World& world, ECS::Entity e, EditorCon auto* emitter = world.get(e); std::string clipStr(emitter->clipPath.cStr()); - if (Widgets::AssetField("Clip", clipStr, ".wav;.ogg;.mp3", resolveProjectRoot(ctx))) { + if (Widgets::AssetField(ctx, "Clip", clipStr, ".wav;.ogg;.mp3")) { emitter->clipPath = clipStr.c_str(); ctx.isDirty = true; } @@ -609,6 +673,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont static const char* primitiveNames[] = { "Custom", "Cube", "Sphere", "Capsule", "Cylinder", "Plane", "Cone", "Pyramid", "Torus"}; int current = static_cast(mf->primitive); + Widgets::setWidthForLabel("Primitive"); if (ImGui::Combo("Primitive", ¤t, primitiveNames, IM_ARRAYSIZE(primitiveNames))) { mf->primitive = static_cast(current); ctx.isDirty = true; @@ -618,6 +683,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont world.add(e); } if (auto* scale = world.get(e)) { + Widgets::setWidthForLabel("Shape Size"); if (ImGui::DragFloat3("Shape Size", &scale->scale.x, 0.05f, 0.01f, 1000.0f, "%.2f")) { ctx.isDirty = true; } @@ -625,25 +691,21 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont } } if (mf->primitive == ECS::MeshPrimitive::Custom) { - if (Widgets::AssetField("Mesh", mf->customMeshPath, ".obj;.fbx;.gltf;.glb", resolveProjectRoot(ctx))) + if (Widgets::AssetField(ctx, "Mesh", mf->customMeshPath, ".obj;.fbx;.gltf;.glb")) ctx.isDirty = true; if (world.has(e)) { ImGui::TextDisabled("Texture managed by Terrain component"); - } else if (Widgets::AssetField("Albedo Texture", mf->customTexturePath, ".png;.jpg;.jpeg", - resolveProjectRoot(ctx))) { + } else if (Widgets::AssetField(ctx, "Albedo Texture", mf->customTexturePath, ".png;.jpg;.jpeg")) { ctx.isDirty = true; } if (!world.has(e)) { - if (Widgets::AssetField("Normal Map", mf->customNormalPath, ".png;.jpg;.jpeg", - resolveProjectRoot(ctx))) { + if (Widgets::AssetField(ctx, "Normal Map", mf->customNormalPath, ".png;.jpg;.jpeg")) { ctx.isDirty = true; } if (ImGui::SliderFloat("Shininess", &mf->shininess, 1.0f, 128.0f)) { ctx.isDirty = true; } } - if (Widgets::AssetField("Material", mf->customMaterialPath, ".mat", resolveProjectRoot(ctx))) - ctx.isDirty = true; if (!world.has(e) && !mf->customTexturePath.empty()) { std::string projectRoot = resolveProjectRoot(ctx).string(); bool textureFound = false; @@ -685,8 +747,14 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont } } } - } else { - ImGui::TextDisabled("3D renderer pending — mesh data will be loaded when renderer is implemented"); + } + + if (!world.has(e)) { + if (Widgets::AssetField(ctx, "Material", mf->customMaterialPath, ".mat")) + ctx.isDirty = true; + if (!mf->customMaterialPath.empty() && ImGui::Button("Edit Material")) { + ctx.materialToOpen = mf->customMaterialPath; + } } if (!world.has(e)) { @@ -837,6 +905,7 @@ void InspectorPanel::drawUISlider(ECS::World& world, ECS::Entity e, EditorContex } std::filesystem::path InspectorPanel::resolveProjectRoot(const EditorContext& ctx) const { + if (!ctx.projectRootPath.empty()) return ctx.projectRootPath; if (!ctx.currentScenePath.empty()) { return std::filesystem::path(ctx.currentScenePath).parent_path(); } @@ -1195,6 +1264,97 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext ImGui::PopID(); } +void InspectorPanel::drawForwardRenderFeatures(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + if (!world.has(e)) return; + + bool enabled = true; + bool removeRequested = false; + if (!Widgets::ComponentHeader("Forward Render Features", enabled, removeRequested, "sparkles")) return; + if (removeRequested) { + world.remove(e); + ctx.isDirty = true; + return; + } + + auto* fx = world.get(e); + if (!fx) return; + + ImGui::PushID("forwardrender"); + ImGui::TextWrapped( + "Scene-owned forward pass: instancing, IBL, occlusion, reflections, volumetrics. " + "Not stored in editor preferences — use this component, Lua, or C++."); + if (ImGui::Checkbox("Component enabled", &fx->enabled)) ctx.isDirty = true; + + if (ImGui::CollapsingHeader("Instancing", ImGuiTreeNodeFlags_DefaultOpen)) { + if (ImGui::Checkbox("Enabled", &fx->instancing.enabled)) ctx.isDirty = true; + int maxBatch = static_cast(fx->instancing.maxInstancesPerBatch); + if (ImGui::SliderInt("Max / batch", &maxBatch, 2, 256)) { + fx->instancing.maxInstancesPerBatch = static_cast(maxBatch); + ctx.isDirty = true; + } + } + if (ImGui::CollapsingHeader("IBL", ImGuiTreeNodeFlags_DefaultOpen)) { + if (ImGui::Checkbox("Enabled", &fx->ibl.enabled)) ctx.isDirty = true; + if (ImGui::SliderFloat("Diffuse", &fx->ibl.diffuse, 0.0f, 2.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Specular", &fx->ibl.specular, 0.0f, 2.0f)) ctx.isDirty = true; + } + if (ImGui::CollapsingHeader("Occlusion")) { + if (ImGui::Checkbox("Coarse CPU occlusion", &fx->occlusion.enabled)) ctx.isDirty = true; + int maxOcc = static_cast(fx->occlusion.maxOccluders); + if (ImGui::SliderInt("Max occluders", &maxOcc, 1, 16)) { + fx->occlusion.maxOccluders = static_cast(maxOcc); + ctx.isDirty = true; + } + if (ImGui::DragFloat("Min radius", &fx->occlusion.minRadius, 0.05f, 0.1f, 20.0f)) ctx.isDirty = true; + } + if (ImGui::CollapsingHeader("Reflections")) { + if (ImGui::Checkbox("Enabled", &fx->reflections.enabled)) ctx.isDirty = true; + const char* modes[] = {"Off", "Planar", "Screen-space", "Probe"}; + int mode = static_cast(fx->reflections.mode); + if (ImGui::Combo("Mode", &mode, modes, 4)) { + fx->reflections.mode = static_cast(mode); + ctx.isDirty = true; + } + if (ImGui::DragFloat("Plane Y", &fx->reflections.planeY, 0.05f, -50.0f, 50.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Intensity", &fx->reflections.intensity, 0.0f, 1.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Resolution scale", &fx->reflections.resolutionScale, 0.25f, 1.0f)) { + ctx.isDirty = true; + } + int steps = static_cast(fx->reflections.ssrMaxSteps); + if (ImGui::SliderInt("SSR steps", &steps, 1, 12)) { + fx->reflections.ssrMaxSteps = static_cast(steps); + ctx.isDirty = true; + } + if (ImGui::DragFloat("SSR distance", &fx->reflections.ssrMaxDistance, 0.25f, 0.5f, 40.0f)) { + ctx.isDirty = true; + } + int probe = static_cast(fx->reflections.probeResolution); + if (ImGui::SliderInt("Probe resolution", &probe, 16, 128)) { + fx->reflections.probeResolution = static_cast(probe); + ctx.isDirty = true; + } + if (ImGui::Checkbox("Only when camera settled", &fx->reflections.expensiveOnlyWhenSettled)) { + ctx.isDirty = true; + } + } + if (ImGui::CollapsingHeader("Volumetrics")) { + if (ImGui::Checkbox("Enabled", &fx->volumetrics.enabled)) ctx.isDirty = true; + const char* qualities[] = {"Off", "Low", "Medium"}; + int quality = static_cast(fx->volumetrics.quality); + if (ImGui::Combo("Quality", &quality, qualities, 3)) { + fx->volumetrics.quality = static_cast(quality); + ctx.isDirty = true; + } + if (ImGui::DragFloat("Density", &fx->volumetrics.density, 0.001f, 0.0f, 0.2f, "%.3f")) { + ctx.isDirty = true; + } + if (ImGui::DragFloat("Height", &fx->volumetrics.height, 0.1f, 0.5f, 80.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Anisotropy", &fx->volumetrics.anisotropy, 0.0f, 0.9f)) ctx.isDirty = true; + if (ImGui::Checkbox("Sample shadows", &fx->volumetrics.sampleShadows)) ctx.isDirty = true; + } + ImGui::PopID(); +} + void InspectorPanel::drawPostProcess(ECS::World& world, ECS::Entity e, EditorContext& ctx) { if (!world.has(e)) return; diff --git a/src/editor/InspectorPanel.hpp b/src/editor/InspectorPanel.hpp index 17078453..a4079b95 100644 --- a/src/editor/InspectorPanel.hpp +++ b/src/editor/InspectorPanel.hpp @@ -43,6 +43,8 @@ class InspectorPanel { void drawCamera(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawRigidBody2D(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawCollider2D(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawRigidBody3D(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawCollider3D(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawAudioSource(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawScript(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawCppScript(ECS::World& world, ECS::Entity e, EditorContext& ctx); @@ -57,6 +59,7 @@ class InspectorPanel { void drawSkybox(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawTerrain(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawPostProcess(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawForwardRenderFeatures(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawPrefabInstance(ECS::World& world, ECS::Entity e, EditorContext& ctx); void savePrefab(ECS::World& world, ECS::Entity e, const std::filesystem::path& path); diff --git a/src/editor/InspectorWidgets.hpp b/src/editor/InspectorWidgets.hpp index 0dfdea5d..64631c6a 100644 --- a/src/editor/InspectorWidgets.hpp +++ b/src/editor/InspectorWidgets.hpp @@ -1,11 +1,15 @@ #pragma once #include "editor/EditorIcons.hpp" +#include "editor/EditorContext.hpp" +#include "editor/DragDropSystem.hpp" #include "math/Vec2.hpp" #include "math/Vec3.hpp" #include "math/Vec4.hpp" #include #include #include +#include +#include #ifdef CF_HAS_IMGUI #include @@ -99,45 +103,90 @@ inline bool InputText(const char* label, std::string& str) { return false; } -inline bool AssetField(const char* label, std::string& path, - const char* filter, - const std::filesystem::path& projectRoot) { +inline std::string toLowerExt(std::string value) { + std::transform(value.begin(), value.end(), value.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + return value; +} + +inline bool extensionMatchesFilter(const std::filesystem::path& path, const char* filter) { + if (!filter || filter[0] == '\0') return true; + const std::string ext = toLowerExt(path.extension().string()); + std::string filterStr(filter); + size_t start = 0; + while (start < filterStr.size()) { + const size_t sep = filterStr.find(';', start); + std::string token = filterStr.substr(start, sep == std::string::npos ? std::string::npos : sep - start); + token = toLowerExt(token); + while (!token.empty() && token.front() == ' ') token.erase(token.begin()); + while (!token.empty() && token.back() == ' ') token.pop_back(); + if (!token.empty() && token.front() != '.') token.insert(token.begin(), '.'); + if (!token.empty() && ext == token) return true; + if (sep == std::string::npos) break; + start = sep + 1; + } + return false; +} + +inline std::string pathRelativeToProject(const EditorContext& ctx, const std::filesystem::path& absolute) { + if (!ctx.projectRootPath.empty()) { + std::error_code ec; + const auto rel = std::filesystem::relative(absolute, ctx.projectRootPath, ec); + if (!ec && !rel.empty() && rel.generic_string().rfind("..") != 0) { + return rel.generic_string(); + } + } + return absolute.string(); +} + +/// Leaves room for ImGui's right-side label so the control cannot consume the whole row. +inline void setWidthForLabel(const char* label) { + const float avail = ImGui::GetContentRegionAvail().x; + const float labelW = ImGui::CalcTextSize(label).x + ImGui::GetStyle().ItemInnerSpacing.x * 2.0f; + const float controlW = avail - labelW; + ImGui::SetNextItemWidth(controlW > 48.0f ? controlW : std::max(48.0f, avail * 0.5f)); +} + +inline bool AssetField(EditorContext& ctx, const char* label, std::string& path, const char* filter) { bool changed = false; - std::string display = path.empty() ? "(none)" : std::filesystem::path(path).filename().string(); + const std::string display = path.empty() ? "(none)" : std::filesystem::path(path).filename().string(); char dispBuf[256]; strncpy(dispBuf, display.c_str(), sizeof(dispBuf)); dispBuf[sizeof(dispBuf) - 1] = '\0'; - ImGui::InputText(label, dispBuf, sizeof(dispBuf), ImGuiInputTextFlags_ReadOnly); - ImGui::SameLine(); - std::string btnId = std::string("...##") + label; - if (ImGui::Button(btnId.c_str(), ImVec2(28, 0))) { - ImGui::OpenPopup(label); - } - if (ImGui::BeginPopup(label)) { - ImGui::Text("Select asset (%s)", filter); - ImGui::Separator(); - static char search[128] = {}; - ImGui::InputText("##search", search, sizeof(search)); - if (std::filesystem::exists(projectRoot)) { - std::string filterStr(filter); - for (auto& entry : std::filesystem::recursive_directory_iterator( - projectRoot, std::filesystem::directory_options::skip_permission_denied)) { - if (!entry.is_regular_file()) continue; - std::string ext = entry.path().extension().string(); - if (filterStr.find(ext) == std::string::npos) continue; - std::string fname = entry.path().filename().string(); - if (search[0] != '\0' && fname.find(search) == std::string::npos) continue; - if (ImGui::Selectable(fname.c_str())) { - path = entry.path().string(); - changed = true; - ImGui::CloseCurrentPopup(); - } + + ImGui::PushID(label); + const ImGuiStyle& style = ImGui::GetStyle(); + const float spacing = style.ItemInnerSpacing.x; + const float browseW = ImGui::CalcTextSize("Browse").x + style.FramePadding.x * 2.0f + 8.0f; + const float clearW = path.empty() ? 0.0f : 22.0f; + const float buttons = browseW + (clearW > 0.0f ? spacing + clearW : 0.0f); + + ImGui::TextUnformatted(label); + ImGui::SetNextItemWidth(std::max(48.0f, ImGui::GetContentRegionAvail().x - buttons - spacing)); + + ImGui::InputText("##path", dispBuf, sizeof(dispBuf), ImGuiInputTextFlags_ReadOnly); + if (ImGui::BeginDragDropTarget()) { + if (const AssetDropPayload* drop = DragDropManager::AcceptAssetDrop()) { + const std::filesystem::path dropped(drop->path); + if (extensionMatchesFilter(dropped, filter)) { + path = pathRelativeToProject(ctx, dropped); + changed = true; } - } else { - ImGui::TextDisabled("No project root set"); } - ImGui::EndPopup(); + ImGui::EndDragDropTarget(); + } + ImGui::SameLine(0.0f, spacing); + if (ImGui::Button("Browse", ImVec2(browseW, 0.0f))) { + ctx.browse.requestProjectAsset(&path, filter, label); } + if (!path.empty()) { + ImGui::SameLine(0.0f, spacing); + if (ImGui::Button("X", ImVec2(clearW, 0.0f))) { + path.clear(); + changed = true; + } + } + ImGui::PopID(); return changed; } diff --git a/src/editor/MaterialEditorPanel.cpp b/src/editor/MaterialEditorPanel.cpp index 9c058f5e..92054632 100644 --- a/src/editor/MaterialEditorPanel.cpp +++ b/src/editor/MaterialEditorPanel.cpp @@ -1,34 +1,25 @@ #include "editor/MaterialEditorPanel.hpp" -#include "editor/MaterialSerializer.hpp" + #include "assets/MaterialCache.hpp" -#include -#include -#include +#include "assets/MaterialFile.hpp" +#include "assets/MaterialPresets.hpp" +#include "editor/InspectorWidgets.hpp" +#include "scene/EnvironmentSystem.hpp" -namespace Caffeine::Editor { +#include -// Maps (nodeId, pinIndex, isInput) -> global pin attribute ID -// Built each frame in renderGraphCanvas -struct PinAttr { - uint32_t nodeId; - int pinIndex; - bool isInput; -}; +#include +#include +#include -static std::unordered_map s_attrToPin; -static int s_nextAttrId = 1; +namespace Caffeine::Editor { MaterialEditorPanel::MaterialEditorPanel() { - ImNodes::CreateContext(); - m_codeBuffer[0] = '\0'; - m_material = &m_ownedMaterial; - addDefaultNodes(); - recompileShader(); + m_surface.valid = true; + m_surface.name = "Material"; } -MaterialEditorPanel::~MaterialEditorPanel() { - ImNodes::DestroyContext(); -} +MaterialEditorPanel::~MaterialEditorPanel() = default; #ifdef CF_HAS_SDL3 void MaterialEditorPanel::initGpu(RHI::RenderDevice* device) { @@ -40,398 +31,250 @@ void MaterialEditorPanel::shutdownGpu() { } #endif -void MaterialEditorPanel::addDefaultNodes() { - m_graph.clear(); - const uint32_t colorId = m_graph.addNode(NodeType::ColorConstant); - const uint32_t outputId = m_graph.addNode(NodeType::OutputPBR); - m_graph.connect(colorId, 0, outputId, 0); +std::filesystem::path MaterialEditorPanel::resolvedPath(const std::filesystem::path& path) const { + if (path.empty() || path.is_absolute() || m_projectRoot.empty()) return path; + return std::filesystem::path(m_projectRoot) / path; } -void MaterialEditorPanel::onImGuiRender() { - if (!m_open) return; - - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); - ImGui::Begin("Material Editor", &m_open, ImGuiWindowFlags_MenuBar); - - renderMenuBar(); - - ImVec2 avail = ImGui::GetContentRegionAvail(); - float spacing = ImGui::GetStyle().ItemSpacing.x; - float leftW = avail.x * 0.65f; - float rightW = avail.x - leftW - spacing; +void MaterialEditorPanel::publishLive() { + if (m_materialPath.empty()) return; + m_surface.valid = true; + Assets::MaterialCache::instance().publish(m_materialPath.string(), m_projectRoot, m_surface); +} - if (m_mode == EditorMode::Graph) { - renderGraphCanvas(ImVec2(leftW, avail.y)); - } else { - renderTextEditor(ImVec2(leftW, avail.y)); +bool MaterialEditorPanel::saveCurrent() { + if (m_materialPath.empty()) { + m_status = "Create the .mat from the asset browser, then open it."; + return false; } - - ImGui::SameLine(); - - if (ImGui::BeginChild("RightPanel", ImVec2(rightW, avail.y), false)) { - float previewH = avail.y * 0.65f; - float inspectorH = avail.y - previewH - spacing; - renderPreviewWindow(previewH); - renderInspector(inspectorH); + const std::filesystem::path path = resolvedPath(m_materialPath); + if (!Assets::saveMaterialFile(path, m_surface)) { + m_status = "Save failed."; + return false; } - ImGui::EndChild(); + m_materialPath = path; + publishLive(); + m_status.clear(); + return true; +} - ImGui::End(); - ImGui::PopStyleVar(); +bool MaterialEditorPanel::openFromPath(const std::filesystem::path& path) { + const std::filesystem::path resolved = resolvedPath(path); + Assets::MaterialSurface loaded; + if (!Assets::loadMaterialFile(resolved, loaded)) { + m_status = "Could not read material."; + return false; + } + m_surface = std::move(loaded); + m_materialPath = resolved; + m_status.clear(); + publishLive(); + return true; } -void MaterialEditorPanel::renderMenuBar() { - if (ImGui::BeginMenuBar()) { - if (ImGui::BeginMenu("File")) { - if (ImGui::MenuItem("New")) { - m_graph.clear(); - addDefaultNodes(); - m_materialPath.clear(); - m_ownedMaterial = Assets::Material3D{}; - m_material = &m_ownedMaterial; - recompileShader(); - } - if (ImGui::MenuItem("Save", "Ctrl+S")) saveCurrent(); - if (ImGui::MenuItem("Compile", "F5")) recompileShader(); - ImGui::Separator(); - ImGui::MenuItem("Auto-Compile", nullptr, &m_autoCompile); - if (!m_materialPath.empty()) { - ImGui::TextDisabled("%s", m_materialPath.filename().string().c_str()); - } - ImGui::EndMenu(); - } - if (ImGui::BeginMenu("View")) { - ImGui::MenuItem("Show Grid", nullptr, &m_showGrid); - ImGui::Separator(); - if (ImGui::MenuItem("Graph Mode", nullptr, m_mode == EditorMode::Graph)) { - m_mode = EditorMode::Graph; - } - if (ImGui::MenuItem("Text Mode", nullptr, m_mode == EditorMode::Text)) { - m_mode = EditorMode::Text; - } - ImGui::EndMenu(); +void MaterialEditorPanel::renderPresetPicker() { + Widgets::setWidthForLabel("Preset"); + if (!ImGui::BeginCombo("Preset", "Apply a preset...")) return; + std::string_view category; + for (const Assets::MaterialPreset& preset : Assets::materialPresets()) { + if (preset.category != category) { + category = preset.category; + ImGui::SeparatorText(std::string(category).c_str()); } - if (ImGui::BeginMenu("Add Node")) { - if (ImGui::MenuItem("Texture Sample")) m_graph.addNode(NodeType::TextureSample); - if (ImGui::MenuItem("Color Constant")) m_graph.addNode(NodeType::ColorConstant); - if (ImGui::MenuItem("Float Constant")) m_graph.addNode(NodeType::FloatConstant); - if (ImGui::MenuItem("Multiply")) m_graph.addNode(NodeType::Multiply); - if (ImGui::MenuItem("Add")) m_graph.addNode(NodeType::Add); - if (ImGui::MenuItem("Lerp")) m_graph.addNode(NodeType::Lerp); - if (ImGui::MenuItem("Time")) m_graph.addNode(NodeType::Time); - if (ImGui::MenuItem("Vertex Position")) m_graph.addNode(NodeType::VertexPosition); - ImGui::Separator(); - if (ImGui::MenuItem("PBR Output")) m_graph.addNode(NodeType::OutputPBR); - ImGui::EndMenu(); + if (ImGui::Selectable(std::string(preset.name).c_str())) { + Assets::applyMaterialPreset(preset.surface, m_surface); + publishLive(); } - ImGui::EndMenuBar(); } + ImGui::EndCombo(); } -void MaterialEditorPanel::renderGraphCanvas(ImVec2 size) { - ImGui::BeginChild("GraphCanvas", size, true, ImGuiWindowFlags_NoScrollbar); - - if (m_graph.empty()) { - ImVec2 avail = ImGui::GetContentRegionAvail(); - ImGui::SetCursorPos(ImVec2(avail.x * 0.3f, avail.y * 0.4f)); - ImGui::TextUnformatted("Right-click to add nodes, or use Add Node menu"); - ImGui::EndChild(); - return; - } - - ImNodes::BeginNodeEditor(); - - s_attrToPin.clear(); - s_nextAttrId = 1; - - ImNodesStyle& style = ImNodes::GetStyle(); - style.Colors[ImNodesCol_NodeBackground] = IM_COL32(30, 30, 30, 255); - style.Colors[ImNodesCol_NodeBackgroundHovered] = IM_COL32(40, 40, 40, 255); - style.Colors[ImNodesCol_NodeBackgroundSelected] = IM_COL32(50, 50, 50, 255); - - bool graphEdited = false; - for (auto& node : m_graph.nodes()) { - ImNodes::BeginNode(static_cast(node->id())); - - ImNodes::BeginNodeTitleBar(); - ImGui::TextUnformatted(node->title().c_str()); - ImNodes::EndNodeTitleBar(); - - for (int i = 0; i < static_cast(node->inputs().size()); i++) { - int attrId = s_nextAttrId++; - s_attrToPin[attrId] = {node->id(), i, true}; - ImNodes::BeginInputAttribute(attrId); - ImGui::TextUnformatted(node->inputs()[i].name.c_str()); - ImNodes::EndInputAttribute(); +void MaterialEditorPanel::renderProperties(EditorContext& ctx) { + bool changed = false; + auto slider = [&](const char* label, float& value, float lo, float hi, const char* fmt = "%.2f") { + Widgets::setWidthForLabel(label); + if (ImGui::SliderFloat(label, &value, lo, hi, fmt)) changed = true; + }; + auto color3 = [&](const char* label, Vec3& value) { + float rgb[3] = {value.x, value.y, value.z}; + Widgets::setWidthForLabel(label); + if (ImGui::ColorEdit3(label, rgb, ImGuiColorEditFlags_Float)) { + value = Vec3(rgb[0], rgb[1], rgb[2]); + changed = true; } - - ImGui::Spacing(); - node->renderProperties(); - graphEdited |= ImGui::IsItemEdited(); - ImGui::Spacing(); - - for (int i = 0; i < static_cast(node->outputs().size()); i++) { - int attrId = s_nextAttrId++; - s_attrToPin[attrId] = {node->id(), i, false}; - ImNodes::BeginOutputAttribute(attrId); - ImGui::TextUnformatted(node->outputs()[i].name.c_str()); - ImNodes::EndOutputAttribute(); + }; + + char name[128] = {}; + const std::string& currentName = m_surface.name; + const size_t copy = currentName.size() < sizeof(name) - 1 ? currentName.size() : sizeof(name) - 1; + currentName.copy(name, copy); + Widgets::setWidthForLabel("Name"); + if (ImGui::InputText("Name", name, sizeof(name))) { + m_surface.name = name; + changed = true; + } + renderPresetPicker(); + + if (ImGui::CollapsingHeader("Surface", ImGuiTreeNodeFlags_DefaultOpen)) { + float albedo[4] = {m_surface.albedo.x, m_surface.albedo.y, m_surface.albedo.z, m_surface.albedo.w}; + Widgets::setWidthForLabel("Albedo"); + if (ImGui::ColorEdit4("Albedo", albedo)) { + m_surface.albedo = Vec4(albedo[0], albedo[1], albedo[2], albedo[3]); + changed = true; } + slider("Metallic", m_surface.metallic, 0.0f, 1.0f); + slider("Roughness", m_surface.roughness, 0.0f, 1.0f, "%.3f"); + slider("Reflectance", m_surface.reflectance, 0.0f, 1.0f); + ImGui::TextDisabled("Metallic 1 + roughness 0 is a perfect mirror."); + } - ImNodes::EndNode(); + if (ImGui::CollapsingHeader("Maps & UV", ImGuiTreeNodeFlags_DefaultOpen)) { + if (Widgets::AssetField(ctx, "Albedo Map", m_surface.albedoMap, ".png;.jpg;.jpeg")) changed = true; + if (Widgets::AssetField(ctx, "Normal Map", m_surface.normalMap, ".png;.jpg;.jpeg")) changed = true; + slider("Normal Strength", m_surface.normalStrength, 0.0f, 4.0f); + if (Widgets::AssetField(ctx, "ORM Map", m_surface.ormMap, ".png;.jpg;.jpeg")) changed = true; + ImGui::TextDisabled("ORM: occlusion (R), roughness (G), metallic (B)."); + slider("AO Strength", m_surface.aoStrength, 0.0f, 1.0f); + if (Widgets::DragVec2("UV Tiling", m_surface.uvTiling, 0.01f)) changed = true; + if (Widgets::DragVec2("UV Offset", m_surface.uvOffset, 0.01f)) changed = true; } - int linkId = 0; - for (const auto& conn : m_graph.connections()) { - int fromAttr = 0, toAttr = 0; - for (const auto& pair : s_attrToPin) { - int attrId = pair.first; - const PinAttr& pin = pair.second; - if (pin.nodeId == conn.fromNode && pin.pinIndex == conn.fromPin && !pin.isInput) { - fromAttr = attrId; - } - if (pin.nodeId == conn.toNode && pin.pinIndex == conn.toPin && pin.isInput) { - toAttr = attrId; - } + if (ImGui::CollapsingHeader("Transparency")) { + int mode = static_cast(m_surface.alphaMode); + const char* modes[] = {"Opaque", "Cutout", "Blend"}; + Widgets::setWidthForLabel("Alpha Mode"); + if (ImGui::Combo("Alpha Mode", &mode, modes, 3)) { + m_surface.alphaMode = static_cast(mode); + changed = true; } - if (fromAttr > 0 && toAttr > 0) { - ImNodes::Link(linkId++, fromAttr, toAttr); + if (m_surface.alphaMode == Assets::MaterialAlphaMode::Cutout) { + slider("Alpha Cutoff", m_surface.alphaCutoff, 0.0f, 1.0f); } + ImGui::TextDisabled("Opacity is the albedo alpha (and the albedo map alpha)."); + slider("Transmission", m_surface.transmission, 0.0f, 1.0f); + slider("IOR", m_surface.ior, 1.0f, 2.5f, "%.3f"); + ImGui::TextDisabled("Water 1.33, ice 1.31, glass 1.5, diamond 2.42."); } - ImNodes::EndNodeEditor(); - - // Handle new links - int startAttr, endAttr; - if (ImNodes::IsLinkCreated(&startAttr, &endAttr)) { - auto fromIt = s_attrToPin.find(startAttr); - auto toIt = s_attrToPin.find(endAttr); - if (fromIt != s_attrToPin.end() && toIt != s_attrToPin.end()) { - PinAttr& fromPin = fromIt->second; - PinAttr& toPin = toIt->second; - if (!fromPin.isInput && toPin.isInput) { - m_graph.connect(fromPin.nodeId, fromPin.pinIndex, toPin.nodeId, toPin.pinIndex); - } else if (!toPin.isInput && fromPin.isInput) { - m_graph.connect(toPin.nodeId, toPin.pinIndex, fromPin.nodeId, fromPin.pinIndex); - } - if (m_autoCompile) recompileShader(); - } + if (ImGui::CollapsingHeader("Clear Coat")) { + slider("Clear Coat", m_surface.clearcoat, 0.0f, 1.0f); + slider("Coat Roughness", m_surface.clearcoatRoughness, 0.0f, 1.0f, "%.3f"); } - // Handle deleted links - int deletedLinkId; - while (ImNodes::IsLinkDestroyed(&deletedLinkId)) { - (void)deletedLinkId; - // Find and remove from graph - int linkIdx = 0; - for (auto it = m_graph.connections().begin(); it != m_graph.connections().end(); ++it) { - if (linkIdx == deletedLinkId) { - m_graph.disconnect(it->fromNode, it->fromPin); - break; - } - linkIdx++; - } + if (ImGui::CollapsingHeader("Sheen")) { + color3("Sheen Color", m_surface.sheenColor); + slider("Sheen Roughness", m_surface.sheenRoughness, 0.0f, 1.0f); } - int selectedNodeCount = ImNodes::NumSelectedNodes(); - if (selectedNodeCount > 0) { - std::vector selectedNodes(static_cast(selectedNodeCount)); - ImNodes::GetSelectedNodes(selectedNodes.data()); - if (ImGui::IsKeyPressed(ImGuiKey_Delete)) { - for (int nodeId : selectedNodes) { - m_graph.removeNode(static_cast(nodeId)); - } - } + if (ImGui::CollapsingHeader("Iridescence")) { + slider("Iridescence", m_surface.iridescence, 0.0f, 1.0f); + slider("Film Thickness", m_surface.iridescenceThickness, 100.0f, 1200.0f, "%.0f nm"); + slider("Film IOR", m_surface.iridescenceIor, 1.0f, 2.5f, "%.2f"); } - if (ImGui::IsMouseReleased(1) && ImGui::IsWindowHovered()) { - ImGui::OpenPopup("AddNodePopup"); + if (ImGui::CollapsingHeader("Emission")) { + color3("Emission", m_surface.emission); + slider("Emission Strength", m_surface.emissionStrength, 0.0f, 50.0f); + if (Widgets::AssetField(ctx, "Emission Map", m_surface.emissionMap, ".png;.jpg;.jpeg")) changed = true; } - renderNodeContextMenu(); - if (m_autoCompile && graphEdited) { - recompileShader(); + if (changed) { + Assets::sanitizeMaterialSurface(m_surface); + publishLive(); } - ImGui::EndChild(); -} - -void MaterialEditorPanel::renderTextEditor(ImVec2 size) { - ImGui::BeginChild("TextEditor", size, true); - - ImVec2 textSize = ImGui::GetContentRegionAvail(); - textSize.y -= 30; - - ImGui::InputTextMultiline("##code", m_codeBuffer, sizeof(m_codeBuffer), - textSize, ImGuiInputTextFlags_AllowTabInput); - - if (ImGui::Button("Compile")) { - recompileShader(); + if (!m_materialPath.empty()) { + ImGui::TextDisabled("%s", m_materialPath.filename().string().c_str()); } - ImGui::SameLine(); - if (ImGui::Button("Sync to Graph")) { - m_compiledShaderCode = m_codeBuffer; + if (!m_status.empty()) { + ImGui::TextWrapped("%s", m_status.c_str()); } - - ImGui::EndChild(); } -void MaterialEditorPanel::renderPreviewWindow(float height) { - ImGui::BeginChild("Preview", ImVec2(0, height), true); - - ImVec2 avail = ImGui::GetContentRegionAvail(); - avail.y -= 30; - - if (m_autoCompile && m_mode == EditorMode::Graph) { - for (const auto& node : m_graph.nodes()) { - if (node->type() == NodeType::Time) { - m_evaluated = m_graph.evaluateMaterial(static_cast(ImGui::GetTime())); - break; - } - } - } - - if (m_evaluated.valid) { +void MaterialEditorPanel::renderPreview(const EditorContext& ctx, float width, float height) { + const float side = std::max(1.0f, std::min(width, height)); + const ImVec2 start = ImGui::GetCursorPos(); + bool drewImage = false; #ifdef CF_HAS_SDL3 - if (m_frameCmd && m_previewRenderer.gpuReady()) { - m_previewRenderer.render(m_frameCmd, m_compiledShaderCode); - m_previewRenderer.renderGpu(m_frameCmd, m_evaluated.albedo, m_evaluated.metallic, - m_evaluated.roughness, m_previewRotation); + const ImVec2 scale = ImGui::GetIO().DisplayFramebufferScale; + const float dpi = std::max(1.0f, std::max(scale.x, scale.y)); + u32 pixels = std::clamp(static_cast(std::ceil(side * dpi)), 128u, 768u); + pixels = (pixels + 3u) & ~3u; + + Render::MaterialPreviewSettings settings; + settings.yawDegrees = m_previewRotation; + settings.pitchDegrees = m_previewPitch; + settings.showFloor = m_previewFloor; + settings.environmentPath = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string(); + if (ctx.activeWorld) { + const Scene::ActiveSkybox sky = Scene::findActiveSkybox(*ctx.activeWorld); + if (sky.component) { + settings.environmentPath = + Scene::resolveSkyboxTexturePath(*sky.component, m_projectRoot).string(); + settings.environmentExposure = sky.component->exposure; } -#endif - m_previewRenderer.renderMaterial(m_evaluated.albedo, m_evaluated.metallic, - m_evaluated.roughness, m_previewRotation, - avail.x, avail.y); - } else { - m_previewRenderer.renderFallback(m_previewRotation, avail.x, avail.y); } - ImGui::SetCursorPosY(ImGui::GetCursorPosY() + 15); - ImGui::SliderFloat("Rotation", &m_previewRotation, 0.0f, 360.0f, "%.0f deg"); - - if (m_hasError) { - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1, 0, 0, 1)); - ImGui::TextWrapped("%s", m_lastCompileError.c_str()); - ImGui::PopStyleColor(); + if (m_frameCmd && m_previewRenderer.isReady()) { + m_previewRenderer.render(m_frameCmd, m_surface, pixels, settings, m_projectRoot); } - - ImGui::EndChild(); -} - -void MaterialEditorPanel::renderInspector(float height) { - ImGui::BeginChild("Inspector", ImVec2(0, height), true); - - if (m_material) { - ImGui::TextUnformatted("Material Properties"); - ImGui::Separator(); - if (ImGui::ColorEdit4("Albedo", &m_material->albedoColor.r)) { - if (m_autoCompile) recompileShader(); - } - if (ImGui::SliderFloat("Roughness", &m_material->roughness, 0.0f, 1.0f)) { - if (m_autoCompile) recompileShader(); - } - if (ImGui::SliderFloat("Metallic", &m_material->metallic, 0.0f, 1.0f)) { - if (m_autoCompile) recompileShader(); - } - if (m_evaluated.valid) { - ImGui::Separator(); - ImGui::Text("Graph Output"); - ImGui::ColorEdit4("Preview Albedo", &m_evaluated.albedo.x, ImGuiColorEditFlags_NoInputs); - ImGui::Text("Metallic: %.2f Roughness: %.2f", m_evaluated.metallic, m_evaluated.roughness); - } - } else { - ImGui::TextUnformatted("No material selected"); - ImGui::TextDisabled("Double-click a .mat file in Asset Browser"); + if (RHI::Texture* texture = m_previewRenderer.colorTexture(); texture && texture->handle) { + ImGui::SetCursorPos(ImVec2(start.x + (width - side) * 0.5f, start.y + (height - side) * 0.5f)); + ImGui::Image(reinterpret_cast(texture->handle), ImVec2(side, side)); + drewImage = true; } - - if (m_mode == EditorMode::Graph && !m_graph.empty()) { - ImGui::Separator(); - ImGui::Text("Nodes: %zu Connections: %zu", - m_graph.nodeCount(), m_graph.connectionCount()); +#else + (void)ctx; +#endif + ImGui::SetCursorPos(start); + ImGui::Dummy(ImVec2(width, std::max(height, 1.0f))); + if (!drewImage) { + ImGui::SetCursorPos(ImVec2(start.x + 8.0f, start.y + 8.0f)); + ImGui::TextDisabled("GPU preview unavailable"); + ImGui::SetCursorPos(ImVec2(start.x, start.y + height)); } - ImGui::EndChild(); -} - -void MaterialEditorPanel::renderNodeContextMenu() { - if (ImGui::BeginPopup("AddNodePopup")) { - if (ImGui::MenuItem("Texture Sample")) m_graph.addNode(NodeType::TextureSample); - if (ImGui::MenuItem("Color Constant")) m_graph.addNode(NodeType::ColorConstant); - if (ImGui::MenuItem("Float Constant")) m_graph.addNode(NodeType::FloatConstant); - if (ImGui::MenuItem("Multiply")) m_graph.addNode(NodeType::Multiply); - if (ImGui::MenuItem("Add")) m_graph.addNode(NodeType::Add); - if (ImGui::MenuItem("Lerp")) m_graph.addNode(NodeType::Lerp); - if (ImGui::MenuItem("Time")) m_graph.addNode(NodeType::Time); - if (ImGui::MenuItem("Vertex Position")) m_graph.addNode(NodeType::VertexPosition); - ImGui::Separator(); - if (ImGui::MenuItem("PBR Output")) m_graph.addNode(NodeType::OutputPBR); - ImGui::EndPopup(); - } + Widgets::setWidthForLabel("Orbit"); + ImGui::SliderFloat("Orbit", &m_previewRotation, 0.0f, 360.0f, "%.0f deg"); + Widgets::setWidthForLabel("Height"); + ImGui::SliderFloat("Height", &m_previewPitch, -30.0f, 70.0f, "%.0f deg"); + ImGui::Checkbox("Floor", &m_previewFloor); } -void MaterialEditorPanel::recompileShader() { - m_hasError = false; - m_lastCompileError.clear(); - - std::string code; - if (m_mode == EditorMode::Graph) { - code = m_graph.compileGLSL(); - m_evaluated = m_graph.evaluateMaterial(static_cast(ImGui::GetTime())); - } else { - code = m_codeBuffer; - m_evaluated.valid = false; - } - - if (code.empty()) { - m_hasError = true; - m_lastCompileError = "Generated shader code is empty"; - m_evaluated.valid = false; - return; - } +void MaterialEditorPanel::onImGuiRender(EditorContext& ctx) { + if (!m_open) return; - if (code.find("void main()") == std::string::npos) { - m_hasError = true; - m_lastCompileError = "Shader missing main() function"; - m_evaluated.valid = false; - return; + ImGui::Begin("Material Editor", &m_open, ImGuiWindowFlags_MenuBar); + if (ImGui::BeginMenuBar()) { + if (ImGui::BeginMenu("File")) { + if (ImGui::MenuItem("New")) { + m_surface = Assets::MaterialSurface{}; + m_surface.valid = true; + m_surface.name = "Material"; + m_materialPath.clear(); + m_status.clear(); + } + if (ImGui::MenuItem("Save", "Ctrl+S")) saveCurrent(); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); } - m_compiledShaderCode = code; - if (m_material && m_evaluated.valid) { - m_material->albedoColor.r = m_evaluated.albedo.x; - m_material->albedoColor.g = m_evaluated.albedo.y; - m_material->albedoColor.b = m_evaluated.albedo.z; - m_material->albedoColor.a = m_evaluated.albedo.w; - m_material->metallic = m_evaluated.metallic; - m_material->roughness = m_evaluated.roughness; + const ImVec2 avail = ImGui::GetContentRegionAvail(); + const float spacing = ImGui::GetStyle().ItemSpacing.x; + const float leftW = avail.x * 0.58f; + if (ImGui::BeginChild("MaterialProperties", ImVec2(leftW, avail.y), true)) { + renderProperties(ctx); } -} - -MaterialDocument MaterialEditorPanel::buildDocument() const { - MaterialDocument doc; - doc.properties = m_material ? *m_material : m_ownedMaterial; - doc.name = m_materialPath.empty() ? "Material" : m_materialPath.stem().string(); - return doc; -} - -bool MaterialEditorPanel::saveCurrent() { - if (m_materialPath.empty()) return false; - const bool ok = MaterialSerializer::save(m_materialPath, buildDocument(), m_graph); - if (ok) { - Assets::MaterialCache::instance().invalidate(m_materialPath.string()); + ImGui::EndChild(); + ImGui::SameLine(); + if (ImGui::BeginChild("MaterialPreview", ImVec2(avail.x - leftW - spacing, avail.y), true)) { + const ImVec2 previewAvail = ImGui::GetContentRegionAvail(); + const float controlsH = ImGui::GetFrameHeightWithSpacing() * 3.0f; + renderPreview(ctx, previewAvail.x, previewAvail.y - controlsH); } - return ok; -} - -bool MaterialEditorPanel::openFromPath(const std::filesystem::path& path) { - MaterialDocument doc; - if (!MaterialSerializer::load(path, doc, m_graph)) return false; - m_ownedMaterial = doc.properties; - m_material = &m_ownedMaterial; - m_materialPath = path; - m_open = true; - recompileShader(); - return true; + ImGui::EndChild(); + ImGui::End(); } } // namespace Caffeine::Editor diff --git a/src/editor/MaterialEditorPanel.hpp b/src/editor/MaterialEditorPanel.hpp index d6e629a4..c0c18ed7 100644 --- a/src/editor/MaterialEditorPanel.hpp +++ b/src/editor/MaterialEditorPanel.hpp @@ -1,37 +1,30 @@ #pragma once -#include "editor/ShaderGraph.hpp" -#include "editor/MaterialSerializer.hpp" -#include "editor/PreviewRenderer.hpp" -#include "assets/MeshTypes.hpp" +#include "assets/MaterialTypes.hpp" +#include "editor/EditorContext.hpp" +#include +#include + #ifdef CF_HAS_SDL3 +#include "render/MaterialPreviewRenderer.hpp" #include "rhi/CommandBuffer.hpp" #include "rhi/RenderDevice.hpp" #endif -#include -#include -#include namespace Caffeine::Editor { -enum class EditorMode { Graph, Text }; - class MaterialEditorPanel { public: MaterialEditorPanel(); ~MaterialEditorPanel(); - void onImGuiRender(); - - void setMaterial(Assets::Material3D* material) { m_material = material; } - Assets::Material3D* material() const { return m_material; } + void onImGuiRender(EditorContext& ctx); bool openFromPath(const std::filesystem::path& path); + void setProjectRoot(const std::string& projectRoot) { m_projectRoot = projectRoot; } void open() { m_open = true; } void close() { m_open = false; } bool isOpen() const { return m_open; } - ShaderGraph& graph() { return m_graph; } - #ifdef CF_HAS_SDL3 void initGpu(RHI::RenderDevice* device); void shutdownGpu(); @@ -39,38 +32,25 @@ class MaterialEditorPanel { #endif private: - void renderMenuBar(); - void renderGraphCanvas(ImVec2 size); - void renderTextEditor(ImVec2 size); - void renderPreviewWindow(float height); - void renderInspector(float height); - void recompileShader(); - void renderNodeContextMenu(); - void addDefaultNodes(); + void renderProperties(EditorContext& ctx); + void renderPresetPicker(); + void renderPreview(const EditorContext& ctx, float width, float height); bool saveCurrent(); - MaterialDocument buildDocument() const; + void publishLive(); + std::filesystem::path resolvedPath(const std::filesystem::path& path) const; - ShaderGraph m_graph; - EditorMode m_mode = EditorMode::Graph; bool m_open = true; - bool m_showGrid = true; - bool m_autoCompile = true; float m_previewRotation = 0.0f; - PreviewRenderer m_previewRenderer; - - char m_codeBuffer[16 * 1024]; - bool m_textDirty = false; - - Assets::Material3D m_ownedMaterial; - Assets::Material3D* m_material = nullptr; + float m_previewPitch = 12.0f; + bool m_previewFloor = true; + Assets::MaterialSurface m_surface; std::filesystem::path m_materialPath; - EvaluatedMaterial m_evaluated; - std::string m_lastCompileError; - bool m_hasError = false; - std::string m_compiledShaderCode; + std::string m_projectRoot; + std::string m_status; #ifdef CF_HAS_SDL3 RHI::CommandBuffer* m_frameCmd = nullptr; + Render::MaterialPreviewRenderer m_previewRenderer; #endif }; diff --git a/src/editor/PreviewRenderer.cpp b/src/editor/PreviewRenderer.cpp deleted file mode 100644 index 07669470..00000000 --- a/src/editor/PreviewRenderer.cpp +++ /dev/null @@ -1,542 +0,0 @@ -#include "editor/PreviewRenderer.hpp" -#include "editor/ImGuiGpuTexture.hpp" -#include "render/ShaderBytecode.hpp" -#include "math/Mat4.hpp" - -#ifdef CF_HAS_IMGUI -#include -#include -#endif -#include -#include -#include - -namespace { -constexpr int kMaterialPreviewTexSize = 96; -} - -namespace Caffeine::Editor { - -constexpr u32 kSphereStride = 8u * sizeof(float); - -PreviewRenderer::~PreviewRenderer() { - shutdown(); -} - -bool PreviewRenderer::init(RHI::RenderDevice* device) { - m_device = device; - m_hasRHI = m_device && m_device->isInitialized(); - if (!m_hasRHI) { - m_initialized = false; - return false; - } - - m_initialized = createSphereMesh(); - if (!m_initialized) { - return false; - } - - m_gpuReady = ensureGpuResources(); - return m_initialized; -} - -void PreviewRenderer::shutdown() { -#ifdef CF_HAS_IMGUI - destroyImGuiTexture(m_previewTexture); - m_cachedAlbedo = Vec4(-1.0f, -1.0f, -1.0f, -1.0f); - m_cachedMetallic = -1.0f; - m_cachedRoughness = -1.0f; - m_cachedRotation = -10000.0f; - m_lastGpuAlbedo = Vec4(-1.0f, -1.0f, -1.0f, -1.0f); - m_lastGpuMetallic = -1.0f; - m_lastGpuRoughness = -1.0f; - m_lastGpuRotation = -10000.0f; -#endif - if (m_hasRHI && m_device) { - if (m_vertexShader) m_device->destroyShader(m_vertexShader); - if (m_fragmentShader) m_device->destroyShader(m_fragmentShader); - if (m_pipeline) m_device->destroyPipeline(m_pipeline); - if (m_sampler) m_device->destroySampler(m_sampler); - if (m_colorTarget) m_device->destroyTexture(m_colorTarget); - if (m_depthTarget) m_device->destroyTexture(m_depthTarget); - if (m_sphereVertices) m_device->destroyBuffer(m_sphereVertices); - if (m_sphereIndices) m_device->destroyBuffer(m_sphereIndices); - } - m_vertexShader = nullptr; - m_fragmentShader = nullptr; - m_pipeline = nullptr; - m_sampler = nullptr; - m_colorTarget = nullptr; - m_depthTarget = nullptr; - m_sphereVertices = nullptr; - m_sphereIndices = nullptr; - m_sphereVertexData.clear(); - m_sphereIndexData.clear(); - m_gpuReady = false; - m_initialized = false; - m_hasRHI = false; -} - -bool PreviewRenderer::createSphereMesh() { - const int segs = 32; - m_sphereVertexData.clear(); - m_sphereIndexData.clear(); - - for (int lat = 0; lat <= segs; lat++) { - float theta = static_cast(lat) * 3.14159f / static_cast(segs); - for (int lon = 0; lon <= segs; lon++) { - float phi = static_cast(lon) * 2.0f * 3.14159f / static_cast(segs); - float x = sinf(theta) * cosf(phi); - float y = cosf(theta); - float z = sinf(theta) * sinf(phi); - m_sphereVertexData.push_back(x); - m_sphereVertexData.push_back(y); - m_sphereVertexData.push_back(z); - m_sphereVertexData.push_back(x); - m_sphereVertexData.push_back(y); - m_sphereVertexData.push_back(z); - m_sphereVertexData.push_back(static_cast(lon) / static_cast(segs)); - m_sphereVertexData.push_back(static_cast(lat) / static_cast(segs)); - } - } - - for (int lat = 0; lat < segs; lat++) { - for (int lon = 0; lon < segs; lon++) { - int first = lat * (segs + 1) + lon; - int second = first + segs + 1; - m_sphereIndexData.push_back(static_cast(first)); - m_sphereIndexData.push_back(static_cast(second)); - m_sphereIndexData.push_back(static_cast(first + 1)); - m_sphereIndexData.push_back(static_cast(second)); - m_sphereIndexData.push_back(static_cast(second + 1)); - m_sphereIndexData.push_back(static_cast(first + 1)); - } - } - - m_indexCount = static_cast(m_sphereIndexData.size()); - return m_indexCount > 0; -} - -bool PreviewRenderer::uploadSphereMesh() { - if (!m_hasRHI || !m_device || m_sphereVertexData.empty() || m_sphereIndexData.empty()) { - return false; - } - - RHI::BufferDesc vertDesc; - vertDesc.size = m_sphereVertexData.size() * sizeof(float); - vertDesc.name = "SphereVerts"; - m_sphereVertices = m_device->createBuffer(vertDesc, RHI::BufferUsage::Vertex); - if (!m_sphereVertices) { - return false; - } - - RHI::BufferDesc indexDesc; - indexDesc.size = m_sphereIndexData.size() * sizeof(uint32_t); - indexDesc.name = "SphereIndices"; - m_sphereIndices = m_device->createBuffer(indexDesc, RHI::BufferUsage::Index); - if (!m_sphereIndices) { - return false; - } - - if (!m_device->uploadBuffer(m_sphereVertices, m_sphereVertexData.data(), vertDesc.size)) { - return false; - } - return m_device->uploadBuffer(m_sphereIndices, m_sphereIndexData.data(), indexDesc.size); -} - -bool PreviewRenderer::createGraphPipeline(const std::string& fragmentGlsl) { - if (!m_hasRHI || !m_device || fragmentGlsl.empty()) return false; - - const auto format = Render::detectShaderFormat(m_device); - if (format != RHI::ShaderBytecodeFormat::SPIRV) { - return false; - } - -#ifdef CF_HAS_SHADERC - const auto compiled = m_shaderCompiler.compileCached(fragmentGlsl, RHI::ShaderStage::Fragment); - if (!compiled.success) return false; - - if (m_vertexShader) m_device->destroyShader(m_vertexShader); - if (m_fragmentShader) m_device->destroyShader(m_fragmentShader); - if (m_pipeline) m_device->destroyPipeline(m_pipeline); - m_vertexShader = nullptr; - m_fragmentShader = nullptr; - m_pipeline = nullptr; - - const auto vertBytecode = Render::getBuiltinShaderBytecode(Render::BuiltinShader::MeshLitVertex, format); - if (!vertBytecode.data) return false; - - RHI::ShaderDesc vertDesc; - vertDesc.code = vertBytecode.data; - vertDesc.codeSize = vertBytecode.size; - vertDesc.stage = RHI::ShaderStage::Vertex; - vertDesc.format = format; - vertDesc.entryPoint = vertBytecode.entryPoint; - vertDesc.numUniformBuffers = 1; - m_vertexShader = m_device->createShader(vertDesc); - - RHI::ShaderDesc fragDesc; - fragDesc.code = compiled.bytecode.data(); - fragDesc.codeSize = compiled.bytecode.size(); - fragDesc.stage = RHI::ShaderStage::Fragment; - fragDesc.format = format; - fragDesc.numUniformBuffers = 1; - fragDesc.numSamplers = 1; - m_fragmentShader = m_device->createShader(fragDesc); - - RHI::VertexBufferLayoutDesc layout{0, kSphereStride, false}; - RHI::VertexAttributeDesc attributes[3] = { - {0, 0, RHI::VertexFormat::Float3, 0}, - {1, 0, RHI::VertexFormat::Float3, 12}, - {2, 0, RHI::VertexFormat::Float2, 24}, - }; - RHI::GraphicsPipelineDesc pipeDesc; - pipeDesc.vertexBuffers = &layout; - pipeDesc.numVertexBuffers = 1; - pipeDesc.attributes = attributes; - pipeDesc.numAttributes = 3; - pipeDesc.colorFormat = RHI::TextureFormat::R8G8B8A8_UNORM; - pipeDesc.depthFormat = RHI::TextureFormat::D32_FLOAT; - m_pipeline = m_device->createGraphicsPipeline(m_vertexShader, m_fragmentShader, pipeDesc); - m_usingGraphShader = m_pipeline != nullptr; - m_activeFragmentSource = fragmentGlsl; - return m_usingGraphShader; -#else - (void)fragmentGlsl; - return false; -#endif -} - -bool PreviewRenderer::createBuiltinPipeline(const std::string& shaderCode) { - if (!shaderCode.empty() && shaderCode.find("void main()") != std::string::npos) { - if (createGraphPipeline(shaderCode)) { - return true; - } - } - - const auto format = Render::detectShaderFormat(m_device); - const auto vertBytecode = Render::getBuiltinShaderBytecode(Render::BuiltinShader::SphereLitVertex, format); - const auto fragBytecode = Render::getBuiltinShaderBytecode(Render::BuiltinShader::SphereLitFragment, format); - if (!vertBytecode.data || !fragBytecode.data || vertBytecode.size == 0 || fragBytecode.size == 0) { - return false; - } - - RHI::ShaderDesc vertDesc; - vertDesc.code = vertBytecode.data; - vertDesc.codeSize = vertBytecode.size; - vertDesc.stage = RHI::ShaderStage::Vertex; - vertDesc.format = format; - vertDesc.entryPoint = vertBytecode.entryPoint; - vertDesc.numUniformBuffers = 1; - - RHI::ShaderDesc fragDesc; - fragDesc.code = fragBytecode.data; - fragDesc.codeSize = fragBytecode.size; - fragDesc.stage = RHI::ShaderStage::Fragment; - fragDesc.format = format; - fragDesc.entryPoint = fragBytecode.entryPoint; - fragDesc.numUniformBuffers = 1; - - if (m_vertexShader) m_device->destroyShader(m_vertexShader); - if (m_fragmentShader) m_device->destroyShader(m_fragmentShader); - if (m_pipeline) m_device->destroyPipeline(m_pipeline); - - m_vertexShader = m_device->createShader(vertDesc); - m_fragmentShader = m_device->createShader(fragDesc); - if (!m_vertexShader || !m_fragmentShader) { - return false; - } - - RHI::VertexBufferLayoutDesc layout{}; - layout.slot = 0; - layout.stride = kSphereStride; - - RHI::VertexAttributeDesc attributes[3] = { - {0, 0, RHI::VertexFormat::Float3, 0}, - {1, 0, RHI::VertexFormat::Float3, 12}, - {2, 0, RHI::VertexFormat::Float2, 24}, - }; - - RHI::GraphicsPipelineDesc pipeDesc; - pipeDesc.vertexBuffers = &layout; - pipeDesc.numVertexBuffers = 1; - pipeDesc.attributes = attributes; - pipeDesc.numAttributes = 3; - pipeDesc.colorFormat = RHI::TextureFormat::R8G8B8A8_UNORM; - pipeDesc.depthFormat = RHI::TextureFormat::D32_FLOAT; - pipeDesc.depthTest = true; - pipeDesc.depthWrite = true; - pipeDesc.enableBlend = false; - - m_pipeline = m_device->createGraphicsPipeline(m_vertexShader, m_fragmentShader, pipeDesc); - m_usingGraphShader = false; - m_activeFragmentSource.clear(); - return m_pipeline != nullptr; -} - -bool PreviewRenderer::ensureGpuResources() { - if (!m_hasRHI || !m_device) { - return false; - } - - if (!uploadSphereMesh()) { - return false; - } - - RHI::TextureDesc colorDesc; - colorDesc.width = kPreviewSize; - colorDesc.height = kPreviewSize; - colorDesc.format = RHI::TextureFormat::R8G8B8A8_UNORM; - colorDesc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; - m_colorTarget = m_device->createTexture(colorDesc); - - RHI::TextureDesc depthDesc; - depthDesc.width = kPreviewSize; - depthDesc.height = kPreviewSize; - depthDesc.format = RHI::TextureFormat::D32_FLOAT; - depthDesc.usage = RHI::TextureUsage::DepthStencil; - m_depthTarget = m_device->createTexture(depthDesc); - - m_sampler = m_device->createSampler(); - if (!m_colorTarget || !m_depthTarget || !m_sampler) { - return false; - } - - return createBuiltinPipeline({}); -} - -void PreviewRenderer::buildSphereUniforms(SphereUniforms& out, const Vec4& albedo, f32 metallic, - f32 roughness, float rotationDeg) const { - const float rot = rotationDeg * 3.14159f / 180.0f; - const Mat4 model = Mat4::rotationY(rot); - const Mat4 view = Mat4::lookAt(Vec3(0.0f, 0.0f, 2.5f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f)); - const Mat4 proj = Mat4::perspective(45.0f * 3.14159f / 180.0f, 1.0f, 0.1f, 10.0f); - const Mat4 mvp = proj * view * model; - std::memcpy(out.mvp, mvp.data(), sizeof(out.mvp)); - out.albedo[0] = albedo.x; - out.albedo[1] = albedo.y; - out.albedo[2] = albedo.z; - out.albedo[3] = albedo.w; - out.metallic = metallic; - out.roughness = roughness; - out.padding[0] = 0.0f; - out.padding[1] = 0.0f; -} - -void PreviewRenderer::renderGpu(RHI::CommandBuffer* cmd, const Vec4& albedo, f32 metallic, - f32 roughness, float rotationDeg) { - if (!m_gpuReady || !cmd || !m_pipeline || !m_colorTarget || !m_depthTarget) { - return; - } - - SphereUniforms uniforms{}; - buildSphereUniforms(uniforms, albedo, metallic, roughness, rotationDeg); - - cmd->pushUniformData(RHI::ShaderStage::Vertex, 0, &uniforms, sizeof(uniforms)); - cmd->pushUniformData(RHI::ShaderStage::Fragment, 0, &uniforms, sizeof(uniforms)); - - RHI::RenderPassDesc pass; - pass.colorTarget = m_colorTarget; - pass.depthTarget = m_depthTarget; - pass.clearColor[0] = 0.09f; - pass.clearColor[1] = 0.09f; - pass.clearColor[2] = 0.11f; - pass.clearColor[3] = 1.0f; - pass.clearDepth = true; - pass.depthValue = 1.0f; - - cmd->beginRenderPass(pass); - cmd->bindPipeline(m_pipeline); - cmd->bindVertexBuffer(m_sphereVertices, 0); - cmd->bindIndexBuffer(m_sphereIndices); - cmd->setViewport(0.0f, 0.0f, static_cast(kPreviewSize), static_cast(kPreviewSize)); - cmd->setScissor(0, 0, kPreviewSize, kPreviewSize); - cmd->drawIndexed(m_indexCount); - cmd->endRenderPass(); - -#ifdef CF_HAS_IMGUI - m_lastGpuAlbedo = albedo; - m_lastGpuMetallic = metallic; - m_lastGpuRoughness = roughness; - m_lastGpuRotation = rotationDeg; -#endif -} - -void PreviewRenderer::displayGpuPreview(float width, float height) { -#ifdef CF_HAS_IMGUI - if (!m_gpuReady || !m_colorTarget || !m_colorTarget->handle) { - ImGui::Dummy(ImVec2(width, height)); - return; - } - - const float side = std::min(width, height); - const ImVec2 drawSize(side, side); - const ImVec2 offset((width - side) * 0.5f, (height - side) * 0.5f); - const ImVec2 start = ImGui::GetCursorPos(); - ImGui::SetCursorPos(start + offset); - ImGui::Image(reinterpret_cast(m_colorTarget->handle), drawSize); - ImGui::SetCursorPos(start); - ImGui::Dummy(ImVec2(width, height)); -#else - (void)width; - (void)height; -#endif -} - -void PreviewRenderer::render(RHI::CommandBuffer* cmd, const std::string& shaderCode) { - if (!m_hasRHI || shaderCode.empty() || !cmd) { - return; - } - - if (!m_gpuReady) { - m_gpuReady = ensureGpuResources(); - } - if (!m_gpuReady) { - return; - } - - if (!m_pipeline || (m_usingGraphShader && shaderCode != m_activeFragmentSource)) { - createBuiltinPipeline(shaderCode); - } -} - -void PreviewRenderer::rebuildMaterialTexture(const Vec4& albedo, f32 metallic, f32 roughness, - float rotationDeg) { -#ifdef CF_HAS_IMGUI - if (!m_previewTexture) { - m_previewTexture = std::make_unique(); - m_previewTexture->Create(ImTextureFormat_RGBA32, kMaterialPreviewTexSize, kMaterialPreviewTexSize); - } - - u8* pixels = static_cast(m_previewTexture->GetPixels()); - const int renderS = kMaterialPreviewTexSize; - const Vec3 lightDir = Vec3(0.35f, 0.75f, 0.55f).normalized(); - const float rot = rotationDeg * 3.14159f / 180.0f; - const float specPower = std::max(4.0f, (1.0f - roughness) * 96.0f + 8.0f); - - for (int y = 0; y < renderS; ++y) { - for (int x = 0; x < renderS; ++x) { - const float u = (static_cast(x) / static_cast(renderS - 1)) * 2.0f - 1.0f; - const float v = (static_cast(y) / static_cast(renderS - 1)) * 2.0f - 1.0f; - const float lenSq = u * u + v * v; - const size_t idx = static_cast(y * renderS + x) * 4; - if (lenSq > 1.0f) { - pixels[idx + 0] = 24; - pixels[idx + 1] = 24; - pixels[idx + 2] = 28; - pixels[idx + 3] = 255; - continue; - } - - const float z = std::sqrt(std::max(0.0f, 1.0f - lenSq)); - Vec3 normal(u, v, z); - normal = Vec3(normal.x * std::cos(rot) - normal.z * std::sin(rot), - normal.y, - normal.x * std::sin(rot) + normal.z * std::cos(rot)).normalized(); - - const float ndotl = std::max(0.0f, normal.dot(lightDir)); - const Vec3 viewDir(0.0f, 0.0f, 1.0f); - const Vec3 halfVec = (lightDir + viewDir).normalized(); - const float spec = std::pow(std::max(0.0f, normal.dot(halfVec)), specPower) * metallic; - - const float diffuse = 0.25f + ndotl * 0.75f; - pixels[idx + 0] = static_cast(std::clamp((albedo.x * diffuse + spec) * 255.0f, 0.0f, 255.0f)); - pixels[idx + 1] = static_cast(std::clamp((albedo.y * diffuse + spec) * 255.0f, 0.0f, 255.0f)); - pixels[idx + 2] = static_cast(std::clamp((albedo.z * diffuse + spec) * 255.0f, 0.0f, 255.0f)); - pixels[idx + 3] = 255; - } - } - - if (m_previewTexture->Status == ImTextureStatus_WantCreate) { - ImGui_ImplSDLGPU3_UpdateTexture(m_previewTexture.get()); - } else { - m_previewTexture->UpdateRect.x = 0; - m_previewTexture->UpdateRect.y = 0; - m_previewTexture->UpdateRect.w = static_cast(renderS); - m_previewTexture->UpdateRect.h = static_cast(renderS); - m_previewTexture->SetStatus(ImTextureStatus_WantUpdates); - ImGui_ImplSDLGPU3_UpdateTexture(m_previewTexture.get()); - } - - m_cachedAlbedo = albedo; - m_cachedMetallic = metallic; - m_cachedRoughness = roughness; - m_cachedRotation = rotationDeg; -#endif -} - -void PreviewRenderer::renderMaterial(const Vec4& albedo, f32 metallic, f32 roughness, - float rotationDeg, float width, float height) { -#ifdef CF_HAS_IMGUI - if (m_gpuReady && m_colorTarget && m_colorTarget->handle) { - displayGpuPreview(width, height); - return; - } - - const bool cacheHit = - m_previewTexture && - m_cachedAlbedo.x == albedo.x && m_cachedAlbedo.y == albedo.y && - m_cachedAlbedo.z == albedo.z && m_cachedAlbedo.w == albedo.w && - m_cachedMetallic == metallic && m_cachedRoughness == roughness && - m_cachedRotation == rotationDeg; - - if (!cacheHit) { - rebuildMaterialTexture(albedo, metallic, roughness, rotationDeg); - } else if (m_previewTexture->Status == ImTextureStatus_WantCreate) { - ImGui_ImplSDLGPU3_UpdateTexture(m_previewTexture.get()); - } - - const float side = std::min(width, height); - const ImVec2 drawSize(side, side); - const ImVec2 offset((width - side) * 0.5f, (height - side) * 0.5f); - const ImVec2 start = ImGui::GetCursorPos(); - ImGui::SetCursorPos(start + offset); - - if (m_previewTexture && m_previewTexture->GetTexID() != ImTextureID_Invalid) { - ImGui::Image(m_previewTexture->GetTexRef(), drawSize); - } else { - ImGui::Dummy(drawSize); - } - - ImGui::SetCursorPos(start); - ImGui::Dummy(ImVec2(width, height)); -#else - (void)albedo; - (void)metallic; - (void)roughness; - (void)rotationDeg; - (void)width; - (void)height; -#endif -} - -void PreviewRenderer::renderFallback(float rotationDeg, float width, float height) { -#ifdef CF_HAS_IMGUI - (void)rotationDeg; - ImDrawList* dl = ImGui::GetWindowDrawList(); - ImVec2 cursorPos = ImGui::GetCursorScreenPos(); - ImVec2 center; - center.x = cursorPos.x + width * 0.5f; - center.y = cursorPos.y + height * 0.5f; - float radius = (width < height ? width : height) * 0.4f; - - ImU32 col = ImGui::GetColorU32(ImVec4(0.3f, 0.5f, 0.9f, 1.0f)); - ImU32 outline = ImGui::GetColorU32(ImVec4(0.1f, 0.2f, 0.4f, 1.0f)); - - dl->AddCircleFilled(center, radius, col, 32); - dl->AddCircle(center, radius, outline, 32); - - float rad = rotationDeg * 3.14159f / 180.0f; - dl->AddCircleFilled( - ImVec2(center.x + cosf(rad) * radius * 0.3f, - center.y + sinf(rad) * radius * 0.3f), - radius * 0.12f, IM_COL32(255, 255, 255, 60), 16); - ImGui::Dummy(ImVec2(width, height)); -#else - (void)rotationDeg; - (void)width; - (void)height; -#endif -} - -} // namespace Caffeine::Editor diff --git a/src/editor/PreviewRenderer.hpp b/src/editor/PreviewRenderer.hpp deleted file mode 100644 index db1e4dab..00000000 --- a/src/editor/PreviewRenderer.hpp +++ /dev/null @@ -1,91 +0,0 @@ -#pragma once -#include "core/Types.hpp" -#include "math/Vec4.hpp" -#include "render/ShaderCompiler.hpp" -#include -#include -#include - -#ifdef CF_HAS_IMGUI -struct ImTextureData; -#endif - -#ifdef CF_HAS_SDL3 -#include "rhi/RenderDevice.hpp" -#include "rhi/CommandBuffer.hpp" -#include "assets/MeshTypes.hpp" -#endif - -namespace Caffeine::Editor { - -class PreviewRenderer { -public: - PreviewRenderer() = default; - ~PreviewRenderer(); - - bool init(RHI::RenderDevice* device); - void shutdown(); - - bool gpuReady() const { return m_gpuReady; } - - void render(RHI::CommandBuffer* cmd, const std::string& shaderCode); - void renderGpu(RHI::CommandBuffer* cmd, const Vec4& albedo, f32 metallic, f32 roughness, - float rotationDeg); - - void renderFallback(float rotationDeg, float width, float height); - void renderMaterial(const Vec4& albedo, f32 metallic, f32 roughness, - float rotationDeg, float width, float height); - void displayGpuPreview(float width, float height); - -private: - struct SphereUniforms { - float mvp[16]; - float albedo[4]; - float metallic; - float roughness; - float padding[2]; - }; - - bool createSphereMesh(); - bool uploadSphereMesh(); - bool ensureGpuResources(); - bool createBuiltinPipeline(const std::string& shaderCode); - bool createGraphPipeline(const std::string& fragmentGlsl); - void rebuildMaterialTexture(const Vec4& albedo, f32 metallic, f32 roughness, float rotationDeg); - void buildSphereUniforms(SphereUniforms& out, const Vec4& albedo, f32 metallic, f32 roughness, - float rotationDeg) const; - - RHI::RenderDevice* m_device = nullptr; - RHI::Shader* m_vertexShader = nullptr; - RHI::Shader* m_fragmentShader = nullptr; - RHI::Pipeline* m_pipeline = nullptr; - RHI::Sampler* m_sampler = nullptr; - RHI::Texture* m_colorTarget = nullptr; - RHI::Texture* m_depthTarget = nullptr; - RHI::Buffer* m_sphereVertices = nullptr; - RHI::Buffer* m_sphereIndices = nullptr; - std::vector m_sphereVertexData; - std::vector m_sphereIndexData; - u32 m_indexCount = 0; - bool m_initialized = false; - bool m_hasRHI = false; - bool m_gpuReady = false; - bool m_usingGraphShader = false; - std::string m_activeFragmentSource; - Render::ShaderCompiler m_shaderCompiler; - static constexpr u32 kPreviewSize = 96; - -#ifdef CF_HAS_IMGUI - std::unique_ptr m_previewTexture; - Vec4 m_cachedAlbedo{-1.0f, -1.0f, -1.0f, -1.0f}; - f32 m_cachedMetallic = -1.0f; - f32 m_cachedRoughness = -1.0f; - float m_cachedRotation = -10000.0f; - Vec4 m_lastGpuAlbedo{-1.0f, -1.0f, -1.0f, -1.0f}; - f32 m_lastGpuMetallic = -1.0f; - f32 m_lastGpuRoughness = -1.0f; - float m_lastGpuRotation = -10000.0f; -#endif -}; - -} // namespace Caffeine::Editor diff --git a/src/editor/SceneEditor.cpp b/src/editor/SceneEditor.cpp index 604762c7..60ab65c5 100644 --- a/src/editor/SceneEditor.cpp +++ b/src/editor/SceneEditor.cpp @@ -380,6 +380,7 @@ void SceneEditor::enterPlayMode(ECS::World& world) { } void SceneEditor::exitPlayMode(ECS::World& world) { + m_physics3D.reset(); m_isPlaying = false; m_isPaused = false; m_ctx.isPlayMode = false; @@ -542,6 +543,7 @@ void SceneEditor::tickSystems(ECS::World& world, f32 dt) { m_animationSystem.onUpdate(world, dt); m_physicsSystem.onUpdate(world, dt); + m_physics3D.onUpdate(world, dt); #ifdef CF_HAS_SCRIPTING if (m_scriptEngineReady) { m_scriptEngine.setWorld(&world); @@ -611,6 +613,7 @@ void SceneEditor::render(f32 deltaTime) { ECS::World* activeWorld = m_tabManager.activeWorld(); m_ctx.activeWorld = activeWorld; + m_ctx.projectRootPath = m_currentProjectConfig.RootPath; if (!activeWorld) { renderUnsavedChangesPopup(nullptr); return; @@ -744,6 +747,7 @@ void SceneEditor::render(f32 deltaTime) { m_viewport.setFrameCommandBuffer(m_frameCmd); #ifdef CF_HAS_SDL3 m_gameplayPreview.setFrameCommandBuffer(m_frameCmd); + m_materialEditor.setFrameCommandBuffer(m_frameCmd); #endif { CF_PROFILE_SCOPE("SceneEditor::viewport"); @@ -775,7 +779,13 @@ void SceneEditor::render(f32 deltaTime) { } { CF_PROFILE_SCOPE("SceneEditor::materialEditor"); - m_materialEditor.onImGuiRender(); + m_materialEditor.setProjectRoot(m_currentProjectConfig.RootPath.string()); + if (!m_ctx.materialToOpen.empty()) { + m_materialEditor.open(); + m_materialEditor.openFromPath(std::filesystem::path(m_ctx.materialToOpen)); + m_ctx.materialToOpen.clear(); + } + m_materialEditor.onImGuiRender(m_ctx); } { CF_PROFILE_SCOPE("SceneEditor::terrainEditor"); @@ -801,6 +811,7 @@ void SceneEditor::render(f32 deltaTime) { m_viewport.setFrameCommandBuffer(nullptr); #ifdef CF_HAS_SDL3 m_gameplayPreview.setFrameCommandBuffer(nullptr); + m_materialEditor.setFrameCommandBuffer(nullptr); #endif m_animationTimeline.render(deltaTime); m_animatorController.render(); @@ -813,6 +824,8 @@ void SceneEditor::render(f32 deltaTime) { PluginManager::instance().renderManagerUI(); } + serviceBrowseSession(m_ctx, m_assetBrowser); + ImGui::End(); // DockSpace renderUnsavedChangesPopup(activeWorld); diff --git a/src/editor/SceneEditor.hpp b/src/editor/SceneEditor.hpp index dd6716f0..19fb81f8 100644 --- a/src/editor/SceneEditor.hpp +++ b/src/editor/SceneEditor.hpp @@ -34,6 +34,7 @@ #include "core/io/FileWatcher.hpp" #include "physics/PhysicsSystem2D.hpp" +#include "physics/PhysicsSystem3D.hpp" #include "ui/UISystem.hpp" #include "events/EventBus.hpp" #include "animation/AnimationSystem.hpp" @@ -191,6 +192,7 @@ class SceneEditor { Events::EventBus m_eventBus; Physics2D::PhysicsSystem2D m_physicsSystem{&m_eventBus}; + Physics3D::PhysicsSystem3D m_physics3D; UI::UISystem m_uiSystem{&m_eventBus}; Animation::AnimationSystem m_animationSystem; Render::Camera2D m_playCamera2D; diff --git a/src/editor/SceneSerializer.cpp b/src/editor/SceneSerializer.cpp index 00ab271d..76d14b9a 100644 --- a/src/editor/SceneSerializer.cpp +++ b/src/editor/SceneSerializer.cpp @@ -2,12 +2,14 @@ #include "editor/SceneSerializerIO.hpp" #include "ecs/Components.hpp" #include "ecs/CameraComponents.hpp" +#include "ecs/ForwardRenderComponents.hpp" #include "ecs/MeshComponents.hpp" #include "ecs/PrefabComponents.hpp" #include "ecs/TerrainComponents.hpp" #include "audio/AudioComponents.hpp" #include "animation/AnimationComponents.hpp" #include "physics/PhysicsComponents2D.hpp" +#include "physics/PhysicsComponents3D.hpp" #include "script/ScriptTypes.hpp" #include "ui/UIComponents.hpp" #include "editor/EditorContext.hpp" @@ -915,6 +917,8 @@ bool SceneSerializer::serialize(const std::string& filepath) { emitPodComponents(kTypeCamera2D, entityMap); emitPodComponents(kTypeRigidBody2D, entityMap); emitPodComponents(kTypeCollider2D, entityMap); + emitPodComponents(kTypeRigidBody3D, entityMap); + emitPodComponents(kTypeCollider3D, entityMap); emitPodComponents(kTypePersistent, entityMap); emitPodComponents(kTypeWorldTransform, entityMap); emitPodComponents(kTypeEntityLayer, entityMap); @@ -976,6 +980,7 @@ bool SceneSerializer::serialize(const std::string& filepath) { } emitPodComponents(kTypeSkybox, entityMap); + emitPodComponents(kTypeForwardRenderFeatures, entityMap); { std::vector>> entries; @@ -1168,6 +1173,12 @@ bool SceneSerializer::deserialize(const std::string& filepath) { case kTypeCollider2D: applyPODComponent(e, entry.data.data(), static_cast(entry.data.size()), m_world); break; + case kTypeRigidBody3D: + applyPODComponent(e, entry.data.data(), static_cast(entry.data.size()), m_world); + break; + case kTypeCollider3D: + applyPODComponent(e, entry.data.data(), static_cast(entry.data.size()), m_world); + break; case kTypeScript: applyScriptComponent(e, entry.data.data(), static_cast(entry.data.size())); break; @@ -1216,6 +1227,10 @@ bool SceneSerializer::deserialize(const std::string& filepath) { case kTypeSkybox: applyPODComponent(e, entry.data.data(), static_cast(entry.data.size()), m_world); break; + case kTypeForwardRenderFeatures: + applyPODComponent( + e, entry.data.data(), static_cast(entry.data.size()), m_world); + break; case kTypeTerrain: applyTerrainComponent(e, entry.data.data(), static_cast(entry.data.size()), filepath); break; diff --git a/src/editor/SceneSerializer.hpp b/src/editor/SceneSerializer.hpp index 425d3779..4faf3f56 100644 --- a/src/editor/SceneSerializer.hpp +++ b/src/editor/SceneSerializer.hpp @@ -62,7 +62,10 @@ class SceneSerializer { static constexpr u32 kTypeAnimator = 40; static constexpr u32 kTypeSkybox = 41; static constexpr u32 kTypeTerrain = 42; - static constexpr u32 kTypeCount = 43; + static constexpr u32 kTypeRigidBody3D = 43; + static constexpr u32 kTypeCollider3D = 44; + static constexpr u32 kTypeForwardRenderFeatures = 45; + static constexpr u32 kTypeCount = 46; static constexpr u32 kFormatVersion = 7; static constexpr u32 kSignature = 0x46464143; // "CAFF" little-endian diff --git a/src/editor/SceneViewport.cpp b/src/editor/SceneViewport.cpp index 0eff4cf2..92a4452d 100644 --- a/src/editor/SceneViewport.cpp +++ b/src/editor/SceneViewport.cpp @@ -650,10 +650,14 @@ bool SceneViewport::renderCameraPreviewGpu(RHI::CommandBuffer* cmd, ECS::World& previewOpts.textureQuality.falloffDistance = ctx.textureQualityFalloff; previewOpts.textureQuality.minScale = ctx.textureQualityMinScale; previewOpts.textureQualityViewers.push_back(cameraPos); + previewOpts.environmentPath = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string(); + previewOpts.renderScale = ctx.renderScale; + previewOpts.deltaTime = ImGui::GetIO().DeltaTime; + previewOpts.viewId = 2; m_gpuSceneRenderer.renderWithCamera( cmd, world, camera, m_previewColorTarget, m_previewDepthTarget, width, height, projectRoot, previewOpts); - (void)ctx; + m_previewNeedsAnotherFrame = m_gpuSceneRenderer.needsAnotherFrame(); return m_previewColorTarget && m_previewColorTarget->handle != nullptr; } @@ -732,7 +736,7 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { return; } - const ImVec2 framebufferSize = imguiFramebufferSize(viewportSize, 1280); + const ImVec2 framebufferSize = imguiFramebufferSize(viewportSize, 3840); const u32 targetCanvasW = static_cast(framebufferSize.x); const u32 targetCanvasH = static_cast(framebufferSize.y); const bool canvasResized = m_gpuCacheWidth != targetCanvasW || m_gpuCacheHeight != targetCanvasH; @@ -758,8 +762,16 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { m_editorCamMotion = camMotion; const bool editorCameraMoved = camMotion > 0.0001f; const bool previewModeChanged = m_meshPreviewMode != m_lastMeshPreviewMode; - const bool gpuNeedsRedraw = - editorCameraMoved || canvasResized || previewModeChanged || !m_hasValidGpuFrame; + const u64 sceneStamp = editorSceneContentStamp(world) ^ + (static_cast(ctx.skyboxIndex + 1) * 0x9E3779B97F4A7C15ull); + const bool sceneChanged = sceneStamp != m_lastSceneStamp; + // Shadows and reflection probes only run on a settled frame; draw one when the camera stops. + const bool settledFramePending = !m_lastGpuFrameSettled && camMotion < 0.002f; + const bool gpuNeedsRedraw = editorCameraMoved || canvasResized || previewModeChanged + || sceneChanged || settledFramePending || !m_hasValidGpuFrame || ctx.isPlayMode + || m_viewportNeedsAnotherFrame + || std::abs(ctx.renderScale - m_lastRenderScale) > 1e-4f + || m_config.grid != m_lastGridVisible; if (gpuNeedsRedraw) { CF_PROFILE_SCOPE("SceneViewport::gpuPass"); @@ -767,14 +779,38 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { gpuOpts.wireframeMeshes = wireframePreview; // Editor viewport: shadows multiply scene draws (4 cascades × lights). Runtime/gameplay // previews keep their own lighting; shadows belong in play mode / runtime, not edit mode. - gpuOpts.enableShadows = false; + // One cascade, and only after the camera settles. Four cascades while + // orbiting redraw the whole scene and blow the 16 ms budget. + gpuOpts.enableShadows = m_editorCamMotion < 0.002f && m_hasValidGpuFrame; + gpuOpts.directionalCascadeCount = 1; gpuOpts.terrainLodDistanceScale = 2.0f; gpuOpts.textureQuality.enabled = false; + gpuOpts.cameraSettled = m_editorCamMotion < 0.002f && m_hasValidGpuFrame; + gpuOpts.environmentPath = ctx.skyboxEnabled + ? Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string() + : std::string(); + gpuOpts.renderScale = ctx.renderScale; + gpuOpts.deltaTime = ImGui::GetIO().DeltaTime; + gpuOpts.viewId = 1; + if (ctx.selectedEntity.isValid() && world.has(ctx.selectedEntity)) { + gpuOpts.postProcessCamera = ctx.selectedEntity; + } + gpuOpts.grid.enabled = m_config.grid; + { + const f32 visibleRange = std::max(std::abs(ctx.camDistance), std::abs(camPos.y)); + f32 spacing = 1.0f; + while (visibleRange / spacing > 40.0f) spacing *= 2.0f; + while (visibleRange / spacing < 8.0f && spacing > 0.25f) spacing *= 0.5f; + gpuOpts.grid.cellSize = std::max(spacing, 0.25f); + gpuOpts.grid.majorEvery = 10.0f; + gpuOpts.grid.fadeDistance = std::max(visibleRange * 8.0f, 60.0f); + } Caffeine::Debug::setCrashBreadcrumb("SceneViewport::gpuSceneRenderer"); gpuMeshDrawCount = m_gpuSceneRenderer.render(m_frameCmd, world, ctx, m_colorTarget, m_depthTarget, m_lastCanvasWidth, m_lastCanvasHeight, projectRoot, gpuOpts); + m_viewportNeedsAnotherFrame = m_gpuSceneRenderer.needsAnotherFrame(); Caffeine::Debug::setCrashBreadcrumb("SceneViewport::gpuSceneRenderer.done"); m_lastEditorCamYaw = ctx.camYaw; @@ -785,6 +821,10 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { m_lastMeshPreviewMode = m_meshPreviewMode; m_gpuCacheWidth = m_lastCanvasWidth; m_gpuCacheHeight = m_lastCanvasHeight; + m_lastSceneStamp = sceneStamp; + m_lastGpuFrameSettled = gpuOpts.cameraSettled; + m_lastRenderScale = ctx.renderScale; + m_lastGridVisible = m_config.grid; m_hasValidGpuFrame = true; } } @@ -1125,7 +1165,10 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { } const ImVec2 viewportMax(origin.x + viewportSize.x, origin.y + viewportSize.y); - if (ctx.viewMode == EditorContext::ViewMode::Mode3D) { + // The GPU scene draws its own sky and depth-tested grid and is fully opaque. + const bool gpuImageCoversViewport = + ctx.viewMode == EditorContext::ViewMode::Mode3D && m_lastGpuSceneActive; + if (ctx.viewMode == EditorContext::ViewMode::Mode3D && !gpuImageCoversViewport) { CF_PROFILE_SCOPE("SceneViewport::skybox"); if (!drawSkybox(drawList, origin, viewportSize, world, ctx)) { drawList->AddRectFilledMultiColor( @@ -1133,11 +1176,12 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { IM_COL32(26, 26, 31, 255), IM_COL32(26, 26, 31, 255), IM_COL32(42, 48, 62, 255), IM_COL32(42, 48, 62, 255)); } - // Skip CPU grid under the GPU composite — it was fully covered and wasted draw calls. - if (!m_lastGpuSceneActive) { + // Grid is an ImGui overlay with no depth buffer. Draw it before the GPU + // image so opaque pixels (alpha 1) cover it; empty pixels stay transparent. + if (m_config.grid) { drawGrid(drawList, origin, viewportSize, ctx); } - } else { + } else if (!gpuImageCoversViewport) { drawList->AddRectFilled(origin, viewportMax, IM_COL32(26, 26, 31, 255)); } @@ -1145,11 +1189,9 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { // GPU scene is rendered into an offscreen target with transparent clear. // Composite it after the skybox so terrain/meshes sit in front of the sky. if (m_lastGpuSceneActive && m_colorTarget && m_colorTarget->handle) { + CF_PROFILE_SCOPE("SceneViewport::composite"); drawList->AddImage(reinterpret_cast(m_colorTarget->handle), origin, viewportMax, ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), IM_COL32_WHITE); - if (m_config.grid) { - drawGrid(drawList, origin, viewportSize, ctx); - } } #endif @@ -1550,32 +1592,6 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { UI::drawWidgets(world, drawList, origin, viewportSize); } - if (ctx.viewMode == EditorContext::ViewMode::Mode3D) { - ECS::Entity previewCamera = ctx.selectedEntity; - if (!previewCamera.isValid() || - (!world.has(previewCamera) && - !world.has(previewCamera))) { - ECS::ComponentQuery cameraQuery; - cameraQuery.with(); - world.forEach(cameraQuery, [&](ECS::Entity e, ECS::Camera3DComponent&) { - if (!previewCamera.isValid()) previewCamera = e; - }); - if (!previewCamera.isValid()) { - cameraQuery = {}; - cameraQuery.with(); - world.forEach(cameraQuery, [&](ECS::Entity e, ECS::Camera2DComponent&) { - if (!previewCamera.isValid()) previewCamera = e; - }); - } - } - if (const ECS::PostProcessComponent* fx = - Render::findPostProcessForCamera(world, previewCamera)) { - if (fx->enabled) { - Render::applyPostProcessOverlay(drawList, origin, viewportSize, *fx); - } - } - } - ImGui::End(); } diff --git a/src/editor/SceneViewport.hpp b/src/editor/SceneViewport.hpp index 66963e38..f1af6473 100644 --- a/src/editor/SceneViewport.hpp +++ b/src/editor/SceneViewport.hpp @@ -113,6 +113,7 @@ class SceneViewport { bool gpuSceneReady() const { return m_gpuSceneReady; } bool cameraPreviewGpuReady() const { return m_gpuSceneReady && m_useGpuScene; } RHI::Texture* cameraPreviewColorTarget() const { return m_previewColorTarget; } + bool cameraPreviewNeedsAnotherFrame() const { return m_previewNeedsAnotherFrame; } bool renderCameraPreviewGpu(RHI::CommandBuffer* cmd, ECS::World& world, EditorContext& ctx, const Mat4& view, const Mat4& proj, const Vec3& cameraPos, const Vec3& focus, f32 fovRad, f32 nearClip, f32 farClip, @@ -296,7 +297,13 @@ class SceneViewport { MeshPreviewMode m_lastMeshPreviewMode = MeshPreviewMode::Textured; u32 m_gpuCacheWidth = 0; u32 m_gpuCacheHeight = 0; + u64 m_lastSceneStamp = 0; bool m_hasValidGpuFrame = false; + bool m_lastGpuFrameSettled = false; + f32 m_lastRenderScale = 1.0f; + bool m_viewportNeedsAnotherFrame = false; + bool m_previewNeedsAnotherFrame = false; + bool m_lastGridVisible = true; #endif }; diff --git a/src/editor/SettingsPanel.cpp b/src/editor/SettingsPanel.cpp index 44bd48aa..54c886ae 100644 --- a/src/editor/SettingsPanel.cpp +++ b/src/editor/SettingsPanel.cpp @@ -2,6 +2,8 @@ #include "editor/EditorIcons.hpp" #include "editor/EditorTheme.hpp" +#include + #ifdef CF_HAS_IMGUI #include #ifdef CF_HAS_SDL3 @@ -67,6 +69,7 @@ void SettingsPanel::applyPreferencesToContext(EditorContext& ctx) { ctx.textureQualityRadius = m_preferences.textureQualityRadius; ctx.textureQualityFalloff = m_preferences.textureQualityFalloff; ctx.textureQualityMinScale = m_preferences.textureQualityMinScale; + ctx.renderScale = std::clamp(m_preferences.renderScale, 0.25f, 2.0f); } void SettingsPanel::render() { @@ -86,25 +89,37 @@ void SettingsPanel::render() { {"Layout Profiles", "backup-restore"}, }; - if (ImGui::BeginChild("settings_nav", ImVec2(190.0f, -40.0f), true)) { + if (ImGui::BeginChild("settings_nav", ImVec2(220.0f, -40.0f), true)) { ImGui::TextDisabled("Settings"); ImGui::Separator(); + const ImGuiStyle& style = ImGui::GetStyle(); + const float iconSize = ImGui::GetFontSize(); + const float rowH = style.FramePadding.y * 2.0f + iconSize; + ImDrawList* navDraw = ImGui::GetWindowDrawList(); + for (int i = 0; i < IM_ARRAYSIZE(navItems); ++i) { ImGui::PushID(i); const bool selected = (m_settingsSection == i); - if (selected) { - ImGui::PushStyleColor(ImGuiCol_Header, ImGui::GetStyleColorVec4(ImGuiCol_HeaderHovered)); - } - if (EditorIcons::hasIcon(navItems[i].icon)) { - EditorIcons::image(navItems[i].icon, ImGui::GetFontSize()); - ImGui::SameLine(); - } - if (ImGui::Selectable(navItems[i].label, selected, 0, ImVec2(-1, 0))) { + if (ImGui::Selectable("##row", selected, ImGuiSelectableFlags_None, ImVec2(-1.0f, rowH))) { m_settingsSection = i; } - if (selected) { - ImGui::PopStyleColor(); + + const ImVec2 rMin = ImGui::GetItemRectMin(); + const ImVec2 rMax = ImGui::GetItemRectMax(); + const float labelX = + rMin.x + style.FramePadding.x + iconSize + style.ItemInnerSpacing.x; + const float labelY = rMin.y + style.FramePadding.y; + if (EditorIcons::hasIcon(navItems[i].icon)) { + const ImTextureRef iconTex = EditorIcons::get(navItems[i].icon); + if (iconTex._TexData != nullptr || iconTex._TexID != ImTextureID_Invalid) { + const ImVec2 iconPos(rMin.x + style.FramePadding.x, labelY); + navDraw->AddImage(iconTex, iconPos, + ImVec2(iconPos.x + iconSize, iconPos.y + iconSize)); + } } + const ImU32 textCol = ImGui::GetColorU32(ImGuiCol_Text); + navDraw->AddText(ImGui::GetFont(), ImGui::GetFontSize(), ImVec2(labelX, labelY), + textCol, navItems[i].label); ImGui::PopID(); } ImGui::EndChild(); @@ -315,6 +330,18 @@ void SettingsPanel::renderViewportSettings() { savePreferences(); } + ImGui::Spacing(); + ImGui::TextColored(ImVec4(0.7f, 0.7f, 1.0f, 1.0f), "Rendering"); + ImGui::Separator(); + ImGui::TextWrapped( + "Scene viewport and play-mode previews render at viewport size times this scale " + "(HDR + TAA + post stack). Use 1.0 for native resolution, 1.5–2.0 for sharper edges."); + if (ImGui::SliderFloat("Render scale", &m_preferences.renderScale, 0.25f, 2.0f, "%.2fx")) { + m_preferences.renderScale = std::clamp(m_preferences.renderScale, 0.25f, 2.0f); + savePreferences(); + if (m_editorContext) applyPreferencesToContext(*m_editorContext); + } + ImGui::Spacing(); ImGui::TextColored(ImVec4(0.7f, 0.7f, 1.0f, 1.0f), "Texture quality"); ImGui::Separator(); @@ -342,6 +369,7 @@ void SettingsPanel::renderViewportSettings() { if (m_editorContext) applyPreferencesToContext(*m_editorContext); } } + #endif } diff --git a/src/math/Mat4.hpp b/src/math/Mat4.hpp index a99e62ca..585f37e1 100644 --- a/src/math/Mat4.hpp +++ b/src/math/Mat4.hpp @@ -245,10 +245,39 @@ class Mat4 { return result; } + /// Right-handed view basis. If `up` is parallel to the look direction + /// (camera pitched to the sky or the ground), a fallback axis is used so + /// the basis does not collapse and pin geometry to the viewport border. + static void viewBasis(const Vec3& forwardIn, const Vec3& up, Vec3& forward, Vec3& right, + Vec3& newUp) { + forward = forwardIn; + const f32 forwardLenSq = forward.lengthSquared(); + if (forwardLenSq < 1e-12f) { + forward = Vec3(0.0f, 0.0f, -1.0f); + } else { + forward = forward / sqrtf(forwardLenSq); + } + + right = forward.cross(up); + if (right.lengthSquared() < 1e-6f) { + const Vec3 axis = (fabsf(forward.y) > 0.9f) ? Vec3(0.0f, 0.0f, 1.0f) + : Vec3(0.0f, 1.0f, 0.0f); + right = forward.cross(axis); + } + const f32 rightLenSq = right.lengthSquared(); + if (rightLenSq < 1e-12f) { + right = Vec3(1.0f, 0.0f, 0.0f); + } else { + right = right / sqrtf(rightLenSq); + } + newUp = right.cross(forward); + } + static Mat4 lookAt(const Vec3& eye, const Vec3& target, const Vec3& up) { - Vec3 forward = (target - eye).normalized(); - Vec3 right = forward.cross(up).normalized(); - Vec3 newUp = right.cross(forward); + Vec3 forward; + Vec3 right; + Vec3 newUp; + viewBasis(target - eye, up, forward, right, newUp); Mat4 result = identity(); result(0, 0) = right.x; diff --git a/src/physics/PhysicsComponents3D.hpp b/src/physics/PhysicsComponents3D.hpp new file mode 100644 index 00000000..686ae834 --- /dev/null +++ b/src/physics/PhysicsComponents3D.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec3.hpp" +#include "math/Vec4.hpp" + +namespace Caffeine::Physics3D { + +using namespace Caffeine; + +enum class ColliderShape3D : u8 { Box, Sphere, Capsule }; +enum class BodyType3D : u8 { Dynamic, Kinematic, Static }; + +struct RigidBody3D { + f32 mass = 1.0f; + f32 linearDamping = 0.05f; + f32 angularDamping = 0.05f; + f32 friction = 0.5f; + f32 restitution = 0.2f; + BodyType3D bodyType = BodyType3D::Dynamic; + bool lockRotation = false; +}; + +struct Collider3D { + ColliderShape3D shape = ColliderShape3D::Box; + // Box: half extents. Sphere: x = radius. Capsule: x = radius, y = total height. + Vec3 halfExtents = {0.5f, 0.5f, 0.5f}; + Vec3 offset{}; + bool isTrigger = false; +}; + +struct BodyDesc { + u32 entityId = 0; + Vec3 position{}; + Vec4 rotation{0.0f, 0.0f, 0.0f, 1.0f}; + Vec3 scale{1.0f, 1.0f, 1.0f}; + ColliderShape3D shape = ColliderShape3D::Box; + Vec3 halfExtents{0.5f, 0.5f, 0.5f}; + Vec3 offset{}; + f32 mass = 1.0f; + f32 friction = 0.5f; + f32 restitution = 0.2f; + f32 linearDamping = 0.05f; + f32 angularDamping = 0.05f; + BodyType3D bodyType = BodyType3D::Dynamic; + bool lockRotation = false; + bool isTrigger = false; + bool resetPose = true; +}; + +struct BodyState { + Vec3 position{}; + Vec4 rotation{0.0f, 0.0f, 0.0f, 1.0f}; +}; + +} // namespace Caffeine::Physics3D diff --git a/src/physics/PhysicsSystem3D.hpp b/src/physics/PhysicsSystem3D.hpp new file mode 100644 index 00000000..b1f4d655 --- /dev/null +++ b/src/physics/PhysicsSystem3D.hpp @@ -0,0 +1,100 @@ +#pragma once + +#include "ecs/ComponentQuery.hpp" +#include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/ISystem.hpp" +#include "ecs/World.hpp" +#include "math/Quat.hpp" +#include "physics/PhysicsWorld3D.hpp" +#include "scene/HierarchySystem.hpp" + +#include + +namespace Caffeine::Physics3D { + +class PhysicsSystem3D : public ECS::ISystem { +public: + void onUpdate(ECS::World& world, f32 dt) override { + if (!m_world.isAvailable()) return; + + std::vector live; + ECS::ComponentQuery query; + query.with(); + query.with(); + world.forEach(query, [&](ECS::Entity entity, RigidBody3D& body, Collider3D& collider) { + live.push_back(entity.id()); + + BodyDesc desc; + desc.entityId = entity.id(); + desc.shape = collider.shape; + desc.halfExtents = collider.halfExtents; + desc.offset = collider.offset; + desc.isTrigger = collider.isTrigger; + desc.mass = body.mass; + desc.friction = body.friction; + desc.restitution = body.restitution; + desc.linearDamping = body.linearDamping; + desc.angularDamping = body.angularDamping; + desc.bodyType = body.bodyType; + desc.lockRotation = body.lockRotation; + desc.resetPose = body.bodyType != BodyType3D::Dynamic; + + if (auto* position = world.get(entity)) { + desc.position = position->position; + } else if (auto* transform = world.get(entity)) { + desc.position = transform->position; + } + if (auto* rotation = world.get(entity)) { + desc.rotation = rotation->quaternion; + } else if (auto* transform = world.get(entity)) { + constexpr f32 kDegToRad = 3.14159265f / 180.0f; + const Quat q = Quat::fromEuler(transform->rotation.x * kDegToRad, + transform->rotation.y * kDegToRad, + transform->rotation.z * kDegToRad); + desc.rotation = Vec4(q.x, q.y, q.z, q.w); + } + if (auto* scale = world.get(entity)) { + desc.scale = scale->scale; + } else if (auto* transform = world.get(entity)) { + desc.scale = transform->scale; + } + + m_world.upsertBody(desc); + }); + + m_world.removeMissing(live); + m_world.step(dt); + + world.forEach(query, [&](ECS::Entity entity, RigidBody3D& body, Collider3D&) { + if (body.bodyType != BodyType3D::Dynamic) return; + BodyState state; + if (!m_world.stateOf(entity.id(), state)) return; + + if (auto* position = world.get(entity)) { + position->position = state.position; + } + if (auto* transform = world.get(entity)) { + transform->position = state.position; + const Quat q(state.rotation.x, state.rotation.y, state.rotation.z, state.rotation.w); + const Vec3 euler = q.toEuler(); + constexpr f32 kRadToDeg = 180.0f / 3.14159265f; + transform->rotation = euler * kRadToDeg; + } + if (auto* rotation = world.get(entity)) { + rotation->quaternion = state.rotation; + } + if (auto* worldTransform = world.get(entity)) { + worldTransform->matrix = Scene::computeWorldMatrix(world, entity); + } + }); + } + + void reset() { m_world.clear(); } + PhysicsWorld3D& world() { return m_world; } + +private: + PhysicsWorld3D m_world; +}; + +} // namespace Caffeine::Physics3D diff --git a/src/physics/PhysicsWorld3D.cpp b/src/physics/PhysicsWorld3D.cpp new file mode 100644 index 00000000..387720d3 --- /dev/null +++ b/src/physics/PhysicsWorld3D.cpp @@ -0,0 +1,254 @@ +#include "physics/PhysicsWorld3D.hpp" + +#include +#include +#include +#include + +#ifdef CF_HAS_BULLET3 +#include +#endif + +namespace Caffeine::Physics3D { + +namespace { + +u32 fingerprint(const BodyDesc& desc) { + auto mix = [](u32 h, u32 v) { return h * 16777619u ^ v; }; + auto bits = [](f32 v) { + u32 out = 0; + static_assert(sizeof(f32) == sizeof(u32)); + std::memcpy(&out, &v, sizeof(out)); + return out; + }; + u32 h = 2166136261u; + h = mix(h, static_cast(desc.shape)); + h = mix(h, static_cast(desc.bodyType)); + h = mix(h, desc.lockRotation ? 1u : 0u); + h = mix(h, desc.isTrigger ? 1u : 0u); + h = mix(h, bits(desc.mass)); + h = mix(h, bits(desc.linearDamping)); + h = mix(h, bits(desc.angularDamping)); + h = mix(h, bits(desc.friction)); + h = mix(h, bits(desc.restitution)); + h = mix(h, bits(desc.halfExtents.x)); + h = mix(h, bits(desc.halfExtents.y)); + h = mix(h, bits(desc.halfExtents.z)); + h = mix(h, bits(desc.offset.x)); + h = mix(h, bits(desc.offset.y)); + h = mix(h, bits(desc.offset.z)); + h = mix(h, bits(desc.scale.x)); + h = mix(h, bits(desc.scale.y)); + h = mix(h, bits(desc.scale.z)); + return h; +} + +} // namespace + +#ifdef CF_HAS_BULLET3 + +struct PhysicsWorld3D::Impl { + struct Record { + btRigidBody* body = nullptr; + btCollisionShape* shape = nullptr; + btDefaultMotionState* motion = nullptr; + u32 fingerprint = 0; + BodyType3D type = BodyType3D::Dynamic; + Vec3 offset{}; + }; + + btDefaultCollisionConfiguration* config = nullptr; + btCollisionDispatcher* dispatcher = nullptr; + btBroadphaseInterface* broadphase = nullptr; + btSequentialImpulseConstraintSolver* solver = nullptr; + btDiscreteDynamicsWorld* world = nullptr; + std::unordered_map bodies; + + Impl() { + config = new btDefaultCollisionConfiguration(); + dispatcher = new btCollisionDispatcher(config); + broadphase = new btDbvtBroadphase(); + solver = new btSequentialImpulseConstraintSolver(); + world = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, config); + world->setGravity(btVector3(0.0f, -9.81f, 0.0f)); + } + + ~Impl() { + clear(); + delete world; + delete solver; + delete broadphase; + delete dispatcher; + delete config; + } + + void destroyRecord(Record& record) { + if (record.body) { + world->removeRigidBody(record.body); + delete record.body; + } + delete record.motion; + delete record.shape; + record = {}; + } + + void clear() { + for (auto& [_, record] : bodies) { + destroyRecord(record); + } + bodies.clear(); + } + + static btTransform makeTransform(const BodyDesc& desc) { + btQuaternion rotation(desc.rotation.x, desc.rotation.y, desc.rotation.z, desc.rotation.w); + const btVector3 offset = quatRotate(rotation, btVector3(desc.offset.x, desc.offset.y, desc.offset.z)); + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(desc.position.x, desc.position.y, desc.position.z) + offset); + tr.setRotation(rotation); + return tr; + } + + static btCollisionShape* makeShape(const BodyDesc& desc) { + const Vec3 scale(std::max(std::abs(desc.scale.x), 0.001f), + std::max(std::abs(desc.scale.y), 0.001f), + std::max(std::abs(desc.scale.z), 0.001f)); + switch (desc.shape) { + case ColliderShape3D::Sphere: { + const f32 radius = std::max(desc.halfExtents.x, 0.01f) * std::max(scale.x, std::max(scale.y, scale.z)); + return new btSphereShape(radius); + } + case ColliderShape3D::Capsule: { + const f32 radius = std::max(desc.halfExtents.x, 0.01f) * std::max(scale.x, scale.z); + const f32 totalHeight = std::max(desc.halfExtents.y, radius * 2.0f + 0.02f) * scale.y; + const f32 cylinder = std::max(0.01f, totalHeight - radius * 2.0f); + return new btCapsuleShape(radius, cylinder); + } + case ColliderShape3D::Box: + default: { + const Vec3 half(std::max(desc.halfExtents.x * scale.x, 0.01f), + std::max(desc.halfExtents.y * scale.y, 0.01f), + std::max(desc.halfExtents.z * scale.z, 0.01f)); + return new btBoxShape(btVector3(half.x, half.y, half.z)); + } + } + } +}; + +PhysicsWorld3D::PhysicsWorld3D() : m_impl(new Impl()) {} + +PhysicsWorld3D::~PhysicsWorld3D() { delete m_impl; } + +void PhysicsWorld3D::clear() { m_impl->clear(); } + +void PhysicsWorld3D::setGravity(const Vec3& gravity) { + m_impl->world->setGravity(btVector3(gravity.x, gravity.y, gravity.z)); +} + +void PhysicsWorld3D::upsertBody(const BodyDesc& desc) { + const u32 fp = fingerprint(desc); + auto it = m_impl->bodies.find(desc.entityId); + if (it != m_impl->bodies.end() && it->second.fingerprint == fp) { + if (desc.bodyType != BodyType3D::Dynamic || desc.resetPose) { + const btTransform tr = Impl::makeTransform(desc); + it->second.body->setWorldTransform(tr); + it->second.motion->setWorldTransform(tr); + it->second.body->setLinearVelocity(btVector3(0, 0, 0)); + it->second.body->setAngularVelocity(btVector3(0, 0, 0)); + it->second.body->activate(true); + } + return; + } + + if (it != m_impl->bodies.end()) { + m_impl->destroyRecord(it->second); + m_impl->bodies.erase(it); + } + + Impl::Record record; + record.shape = Impl::makeShape(desc); + record.fingerprint = fp; + record.type = desc.bodyType; + record.offset = desc.offset; + const btTransform tr = Impl::makeTransform(desc); + record.motion = new btDefaultMotionState(tr); + + f32 mass = (desc.bodyType == BodyType3D::Dynamic) ? std::max(desc.mass, 0.001f) : 0.0f; + btVector3 inertia(0, 0, 0); + if (mass > 0.0f) record.shape->calculateLocalInertia(mass, inertia); + + btRigidBody::btRigidBodyConstructionInfo info(mass, record.motion, record.shape, inertia); + info.m_friction = desc.friction; + info.m_restitution = desc.restitution; + info.m_linearDamping = desc.linearDamping; + info.m_angularDamping = desc.angularDamping; + record.body = new btRigidBody(info); + record.body->setUserIndex(static_cast(desc.entityId)); + if (desc.isTrigger) { + record.body->setCollisionFlags(record.body->getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE); + } + if (desc.bodyType == BodyType3D::Kinematic) { + record.body->setCollisionFlags(record.body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + record.body->setActivationState(DISABLE_DEACTIVATION); + } + if (desc.lockRotation) record.body->setAngularFactor(btVector3(0, 0, 0)); + + m_impl->world->addRigidBody(record.body); + m_impl->bodies.emplace(desc.entityId, record); +} + +void PhysicsWorld3D::removeBody(u32 entityId) { + auto it = m_impl->bodies.find(entityId); + if (it == m_impl->bodies.end()) return; + m_impl->destroyRecord(it->second); + m_impl->bodies.erase(it); +} + +void PhysicsWorld3D::removeMissing(const std::vector& liveEntityIds) { + std::vector stale; + for (const auto& [id, _] : m_impl->bodies) { + if (std::find(liveEntityIds.begin(), liveEntityIds.end(), id) == liveEntityIds.end()) { + stale.push_back(id); + } + } + for (u32 id : stale) removeBody(id); +} + +void PhysicsWorld3D::step(f32 dt) { + if (dt <= 0.0f) return; + m_impl->world->stepSimulation(dt, 4, 1.0f / 60.0f); +} + +bool PhysicsWorld3D::stateOf(u32 entityId, BodyState& out) const { + auto it = m_impl->bodies.find(entityId); + if (it == m_impl->bodies.end() || it->second.type != BodyType3D::Dynamic) return false; + btTransform tr; + it->second.motion->getWorldTransform(tr); + const btVector3 worldOffset = tr.getBasis() * btVector3(it->second.offset.x, it->second.offset.y, it->second.offset.z); + const btVector3 origin = tr.getOrigin() - worldOffset; + const btQuaternion rot = tr.getRotation(); + out.position = Vec3(origin.x(), origin.y(), origin.z()); + out.rotation = Vec4(rot.x(), rot.y(), rot.z(), rot.w()); + return true; +} + +bool PhysicsWorld3D::isAvailable() const { return true; } + +#else + +struct PhysicsWorld3D::Impl {}; + +PhysicsWorld3D::PhysicsWorld3D() : m_impl(new Impl()) {} +PhysicsWorld3D::~PhysicsWorld3D() { delete m_impl; } +void PhysicsWorld3D::clear() {} +void PhysicsWorld3D::setGravity(const Vec3&) {} +void PhysicsWorld3D::upsertBody(const BodyDesc&) {} +void PhysicsWorld3D::removeBody(u32) {} +void PhysicsWorld3D::removeMissing(const std::vector&) {} +void PhysicsWorld3D::step(f32) {} +bool PhysicsWorld3D::stateOf(u32, BodyState&) const { return false; } +bool PhysicsWorld3D::isAvailable() const { return false; } + +#endif + +} // namespace Caffeine::Physics3D diff --git a/src/physics/PhysicsWorld3D.hpp b/src/physics/PhysicsWorld3D.hpp new file mode 100644 index 00000000..ab1981e4 --- /dev/null +++ b/src/physics/PhysicsWorld3D.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include "physics/PhysicsComponents3D.hpp" + +#include + +namespace Caffeine::Physics3D { + +// Bullet3 backend. ECS never includes bt* headers; bodies live here, keyed by entity id. +class PhysicsWorld3D { +public: + PhysicsWorld3D(); + ~PhysicsWorld3D(); + + PhysicsWorld3D(const PhysicsWorld3D&) = delete; + PhysicsWorld3D& operator=(const PhysicsWorld3D&) = delete; + + void clear(); + void setGravity(const Vec3& gravity); + void upsertBody(const BodyDesc& desc); + void removeBody(u32 entityId); + void removeMissing(const std::vector& liveEntityIds); + void step(f32 dt); + bool stateOf(u32 entityId, BodyState& out) const; + bool isAvailable() const; + +private: + struct Impl; + Impl* m_impl = nullptr; +}; + +} // namespace Caffeine::Physics3D diff --git a/src/render/CoarseOcclusion.hpp b/src/render/CoarseOcclusion.hpp new file mode 100644 index 00000000..da6bcd03 --- /dev/null +++ b/src/render/CoarseOcclusion.hpp @@ -0,0 +1,133 @@ +#pragma once + +#include "math/Mat4.hpp" +#include "math/Vec3.hpp" + +#include +#include + +namespace Caffeine::Render { + +struct OcclusionPrimitive { + Vec3 aabbMin{}; + Vec3 aabbMax{}; + bool canOcclude = false; + bool canBeOccluded = false; +}; + +struct ScreenOccluder { + f32 minX = 0.0f; + f32 minY = 0.0f; + f32 maxX = 0.0f; + f32 maxY = 0.0f; + f32 maxDepth = 0.0f; + f32 area = 0.0f; +}; + +/// Project an AABB. Returns false when a corner is behind the camera. +inline bool projectAabb(const Mat4& vp, const Vec3& cameraPos, const Vec3& cameraForward, + const Vec3& aabbMin, const Vec3& aabbMax, ScreenOccluder& out) { + const Vec3 corners[8] = { + {aabbMin.x, aabbMin.y, aabbMin.z}, {aabbMax.x, aabbMin.y, aabbMin.z}, + {aabbMin.x, aabbMax.y, aabbMin.z}, {aabbMax.x, aabbMax.y, aabbMin.z}, + {aabbMin.x, aabbMin.y, aabbMax.z}, {aabbMax.x, aabbMin.y, aabbMax.z}, + {aabbMin.x, aabbMax.y, aabbMax.z}, {aabbMax.x, aabbMax.y, aabbMax.z}, + }; + f32 minX = 1e9f, minY = 1e9f, maxX = -1e9f, maxY = -1e9f; + f32 minDepth = 1e9f, maxDepth = -1e9f; + for (const Vec3& corner : corners) { + const Vec4 clip = vp.transformVec4(Vec4(corner.x, corner.y, corner.z, 1.0f)); + if (clip.w <= 0.1f) return false; + const f32 ndcX = clip.x / clip.w; + const f32 ndcY = clip.y / clip.w; + minX = std::min(minX, ndcX); + minY = std::min(minY, ndcY); + maxX = std::max(maxX, ndcX); + maxY = std::max(maxY, ndcY); + const f32 depth = (corner - cameraPos).dot(cameraForward); + minDepth = std::min(minDepth, depth); + maxDepth = std::max(maxDepth, depth); + } + if (maxDepth <= 0.05f) return false; + out.minX = minX; + out.minY = minY; + out.maxX = maxX; + out.maxY = maxY; + out.maxDepth = maxDepth; + out.area = std::max(0.0f, maxX - minX) * std::max(0.0f, maxY - minY); + (void)minDepth; + return true; +} + +/// Drops primitives fully behind a closer occluder AABB. The screen test uses +/// the occluder box, so a thin mesh can hide neighbors inside that box. +inline std::vector visibleAfterCoarseOcclusion(const std::vector& prims, + const Mat4& vp, const Vec3& cameraPos, + const Vec3& cameraForward, + u32 maxOccluders) { + std::vector visible; + visible.reserve(prims.size()); + if (maxOccluders == 0) { + for (u32 i = 0; i < prims.size(); ++i) visible.push_back(i); + return visible; + } + + struct Projected { + bool ok = false; + ScreenOccluder screen{}; + f32 minDepth = 0.0f; + }; + std::vector projected(prims.size()); + std::vector occluderOrder; + for (u32 i = 0; i < prims.size(); ++i) { + const OcclusionPrimitive& prim = prims[i]; + Projected& proj = projected[i]; + proj.ok = projectAabb(vp, cameraPos, cameraForward, prim.aabbMin, prim.aabbMax, proj.screen); + if (!proj.ok) continue; + f32 minDepth = 1e9f; + const Vec3 corners[8] = { + {prim.aabbMin.x, prim.aabbMin.y, prim.aabbMin.z}, + {prim.aabbMax.x, prim.aabbMin.y, prim.aabbMin.z}, + {prim.aabbMin.x, prim.aabbMax.y, prim.aabbMin.z}, + {prim.aabbMax.x, prim.aabbMax.y, prim.aabbMin.z}, + {prim.aabbMin.x, prim.aabbMin.y, prim.aabbMax.z}, + {prim.aabbMax.x, prim.aabbMin.y, prim.aabbMax.z}, + {prim.aabbMin.x, prim.aabbMax.y, prim.aabbMax.z}, + {prim.aabbMax.x, prim.aabbMax.y, prim.aabbMax.z}, + }; + for (const Vec3& corner : corners) { + minDepth = std::min(minDepth, (corner - cameraPos).dot(cameraForward)); + } + proj.minDepth = minDepth; + if (prim.canOcclude && proj.screen.area > 0.02f) occluderOrder.push_back(i); + } + + std::sort(occluderOrder.begin(), occluderOrder.end(), [&](u32 a, u32 b) { + return projected[a].screen.area > projected[b].screen.area; + }); + if (occluderOrder.size() > maxOccluders) occluderOrder.resize(maxOccluders); + + for (u32 i = 0; i < prims.size(); ++i) { + const Projected& obj = projected[i]; + bool hidden = false; + if (prims[i].canBeOccluded && obj.ok) { + for (u32 occIndex : occluderOrder) { + if (occIndex == i) continue; + const Projected& occ = projected[occIndex]; + if (!occ.ok) continue; + const bool inside = obj.screen.minX >= occ.screen.minX && + obj.screen.maxX <= occ.screen.maxX && + obj.screen.minY >= occ.screen.minY && + obj.screen.maxY <= occ.screen.maxY; + if (inside && obj.minDepth > occ.screen.maxDepth + 0.15f) { + hidden = true; + break; + } + } + } + if (!hidden) visible.push_back(i); + } + return visible; +} + +} // namespace Caffeine::Render diff --git a/src/render/ForwardRenderFeatures.cpp b/src/render/ForwardRenderFeatures.cpp new file mode 100644 index 00000000..4fba1e0e --- /dev/null +++ b/src/render/ForwardRenderFeatures.cpp @@ -0,0 +1,71 @@ +#include "render/ForwardRenderFeatures.hpp" + +#include "ecs/ComponentQuery.hpp" + +namespace Caffeine::Render { + +RenderFeatureSettings budgetSafeForwardDefaults() { + return RenderFeatureSettings{}; +} + +void applyForwardRenderComponent(const ECS::ForwardRenderFeaturesComponent& source, + RenderFeatureSettings& target) { + if (!source.enabled) return; + + target.instancingEnabled = source.instancing.enabled; + target.maxInstancesPerBatch = source.instancing.maxInstancesPerBatch; + + target.iblEnabled = source.ibl.enabled; + target.iblDiffuse = source.ibl.diffuse; + target.iblSpecular = source.ibl.specular; + + target.occlusion = + source.occlusion.enabled ? OcclusionMode::Coarse : OcclusionMode::Off; + target.occlusionMaxOccluders = source.occlusion.maxOccluders; + target.occlusionMinRadius = source.occlusion.minRadius; + + if (source.reflections.enabled) { + target.reflections = source.reflections.mode; + target.reflectionPlaneY = source.reflections.planeY; + target.reflectionIntensity = source.reflections.intensity; + target.reflectionResolutionScale = source.reflections.resolutionScale; + target.screenSpaceTrace = source.reflections.screenSpaceTrace; + target.ssrIntensity = source.reflections.ssrIntensity; + target.ssrMaxRoughness = source.reflections.ssrMaxRoughness; + target.ssrMaxSteps = source.reflections.ssrMaxSteps; + target.ssrMaxDistance = source.reflections.ssrMaxDistance; + target.probeResolution = source.reflections.probeResolution; + target.maxReflectionProbes = source.reflections.maxProbes; + target.expensiveEffectsOnlyWhenSettled = source.reflections.expensiveOnlyWhenSettled; + } else { + target.reflections = ReflectionMode::Off; + target.screenSpaceTrace = false; + } + + if (source.volumetrics.enabled) { + target.volumetrics = source.volumetrics.quality; + target.volumetricDensity = source.volumetrics.density; + target.volumetricHeight = source.volumetrics.height; + target.volumetricAnisotropy = source.volumetrics.anisotropy; + target.volumetricShadows = source.volumetrics.sampleShadows; + } else { + target.volumetrics = VolumetricQuality::Off; + } +} + +RenderFeatureSettings resolveForwardRenderFeatures(ECS::World& world) { + RenderFeatureSettings resolved = budgetSafeForwardDefaults(); + const ECS::ForwardRenderFeaturesComponent* last = nullptr; + + ECS::ComponentQuery query; + query.with(); + world.forEach( + query, [&](ECS::Entity, ECS::ForwardRenderFeaturesComponent& component) { + if (component.enabled) last = &component; + }); + + if (last) applyForwardRenderComponent(*last, resolved); + return resolved; +} + +} // namespace Caffeine::Render diff --git a/src/render/ForwardRenderFeatures.hpp b/src/render/ForwardRenderFeatures.hpp new file mode 100644 index 00000000..1c27b670 --- /dev/null +++ b/src/render/ForwardRenderFeatures.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "ecs/ForwardRenderComponents.hpp" +#include "ecs/World.hpp" +#include "render/RenderFeatures.hpp" + +namespace Caffeine::Render { + +/// Budget-safe defaults when no scene component is present. +RenderFeatureSettings budgetSafeForwardDefaults(); + +void applyForwardRenderComponent(const ECS::ForwardRenderFeaturesComponent& source, + RenderFeatureSettings& target); + +/// Merges enabled ForwardRenderFeaturesComponent entities (last entity wins). +RenderFeatureSettings resolveForwardRenderFeatures(ECS::World& world); + +} // namespace Caffeine::Render diff --git a/src/render/GpuDirectionalShadowMap.hpp b/src/render/GpuDirectionalShadowMap.hpp index da72eecb..06405ebf 100644 --- a/src/render/GpuDirectionalShadowMap.hpp +++ b/src/render/GpuDirectionalShadowMap.hpp @@ -11,8 +11,8 @@ class GpuDirectionalShadowMap { public: static constexpr u32 kMaxDirectionalShadowLights = 2; static constexpr u32 kMaxCascades = 4; - static constexpr u32 kCascadeResolution = 512; - static constexpr u32 kAtlasResolution = 1024; + static constexpr u32 kCascadeResolution = 2048; + static constexpr u32 kAtlasResolution = 4096; bool init(RHI::RenderDevice* device); void shutdown(); diff --git a/src/render/GpuEnvironmentMap.cpp b/src/render/GpuEnvironmentMap.cpp new file mode 100644 index 00000000..a0599225 --- /dev/null +++ b/src/render/GpuEnvironmentMap.cpp @@ -0,0 +1,125 @@ +#include "render/GpuEnvironmentMap.hpp" + +#include + +#include +#include + +namespace Caffeine::Render { +namespace { + +EnvironmentMipLevel halveLevel(const EnvironmentMipLevel& src) { + EnvironmentMipLevel dst; + dst.width = std::max(1u, src.width / 2); + dst.height = std::max(1u, src.height / 2); + dst.rgba.resize(static_cast(dst.width) * dst.height * 4); + for (u32 y = 0; y < dst.height; ++y) { + const u32 y0 = std::min(y * 2, src.height - 1); + const u32 y1 = std::min(y * 2 + 1, src.height - 1); + for (u32 x = 0; x < dst.width; ++x) { + // Equirect wraps horizontally, so odd widths borrow the first column. + const u32 x0 = (x * 2) % src.width; + const u32 x1 = (x * 2 + 1) % src.width; + const u8* p00 = &src.rgba[(static_cast(y0) * src.width + x0) * 4]; + const u8* p01 = &src.rgba[(static_cast(y0) * src.width + x1) * 4]; + const u8* p10 = &src.rgba[(static_cast(y1) * src.width + x0) * 4]; + const u8* p11 = &src.rgba[(static_cast(y1) * src.width + x1) * 4]; + u8* out = &dst.rgba[(static_cast(y) * dst.width + x) * 4]; + for (int c = 0; c < 4; ++c) { + const u32 sum = static_cast(p00[c]) + p01[c] + p10[c] + p11[c]; + out[c] = static_cast((sum + 2) / 4); + } + } + } + return dst; +} + +} // namespace + +std::vector buildEnvironmentMipChain(const u8* rgba, u32 width, u32 height, + u32 maxWidth, u32 minWidth) { + std::vector chain; + if (!rgba || width == 0 || height == 0) return chain; + + EnvironmentMipLevel level; + level.width = width; + level.height = height; + level.rgba.assign(rgba, rgba + static_cast(width) * height * 4); + while (level.width > std::max(maxWidth, 1u)) { + level = halveLevel(level); + } + + chain.push_back(std::move(level)); + while (chain.back().width > std::max(minWidth, 1u) && chain.back().height > 1) { + chain.push_back(halveLevel(chain.back())); + } + return chain; +} + +Vec3 averageEnvironmentColor(const EnvironmentMipLevel& level) { + const size_t pixels = static_cast(level.width) * level.height; + if (pixels == 0 || level.rgba.size() < pixels * 4) return Vec3(0.0f, 0.0f, 0.0f); + f64 sum[3] = {0.0, 0.0, 0.0}; + for (size_t i = 0; i < pixels; ++i) { + for (int c = 0; c < 3; ++c) sum[c] += level.rgba[i * 4 + c]; + } + const f64 scale = 1.0 / (255.0 * static_cast(pixels)); + return Vec3(static_cast(sum[0] * scale), static_cast(sum[1] * scale), + static_cast(sum[2] * scale)); +} + +bool GpuEnvironmentMap::load(RHI::RenderDevice* device, const std::string& path) { + if (path == m_path) return m_texture != nullptr; + release(device); + m_path = path; + if (!device || path.empty()) return false; + + int width = 0; + int height = 0; + int channels = 0; + u8* pixels = stbi_load(path.c_str(), &width, &height, &channels, 4); + if (!pixels || width <= 0 || height <= 0) { + if (pixels) stbi_image_free(pixels); + return false; + } + const std::vector chain = + buildEnvironmentMipChain(pixels, static_cast(width), static_cast(height), 4096); + stbi_image_free(pixels); + if (chain.empty()) return false; + + RHI::TextureDesc desc; + desc.width = chain.front().width; + desc.height = chain.front().height; + // Sky images are sRGB; the sampler decodes them so lighting happens in linear space. + desc.format = RHI::TextureFormat::R8G8B8A8_UNORM_SRGB; + desc.usage = RHI::TextureUsage::Sampler; + desc.mipLevels = static_cast(chain.size()); + m_texture = device->createTexture(desc); + if (!m_texture) return false; + + for (u32 mip = 0; mip < chain.size(); ++mip) { + const EnvironmentMipLevel& level = chain[mip]; + if (!device->uploadTexture(m_texture, level.rgba.data(), level.width, level.height, 4, mip)) { + device->destroyTexture(m_texture); + m_texture = nullptr; + return false; + } + } + m_mipCount = static_cast(chain.size()); + const Vec3 average = averageEnvironmentColor(chain.back()); + auto toLinear = [](f32 c) { + return c <= 0.04045f ? c / 12.92f : std::pow((c + 0.055f) / 1.055f, 2.4f); + }; + m_average = Vec3(toLinear(average.x), toLinear(average.y), toLinear(average.z)); + return true; +} + +void GpuEnvironmentMap::release(RHI::RenderDevice* device) { + if (m_texture && device) device->destroyTexture(m_texture); + m_texture = nullptr; + m_mipCount = 0; + m_average = Vec3(0.0f, 0.0f, 0.0f); + m_path.clear(); +} + +} // namespace Caffeine::Render diff --git a/src/render/GpuEnvironmentMap.hpp b/src/render/GpuEnvironmentMap.hpp new file mode 100644 index 00000000..391bffdd --- /dev/null +++ b/src/render/GpuEnvironmentMap.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec3.hpp" +#include "rhi/RenderDevice.hpp" + +#include +#include +#include +#include + +namespace Caffeine::Render { + +struct EnvironmentMipLevel { + u32 width = 0; + u32 height = 0; + std::vector rgba; +}; + +/// Box-filtered equirect mip chain. Level 0 is at most `maxWidth` wide; the chain stops once a +/// level is `minWidth` wide so the last level still carries a directional sky/ground gradient. +std::vector buildEnvironmentMipChain(const u8* rgba, u32 width, u32 height, + u32 maxWidth = 1024, u32 minWidth = 4); + +/// Mean RGB (0..1) of one mip level. +Vec3 averageEnvironmentColor(const EnvironmentMipLevel& level); + +/// Equirect UV for a world direction; matches SkyboxRenderer's mapping. +inline void directionToEnvironmentUV(const Vec3& dir, f32& u, f32& v); + +/// Sky texture used by the scene renderer for IBL and reflection fallback. +class GpuEnvironmentMap { +public: + /// Loads `path` once; repeated calls with the same path are free. Empty path releases. + bool load(RHI::RenderDevice* device, const std::string& path); + void release(RHI::RenderDevice* device); + + RHI::Texture* texture() const { return m_texture; } + u32 mipCount() const { return m_mipCount; } + const Vec3& averageColor() const { return m_average; } + const std::string& path() const { return m_path; } + +private: + RHI::Texture* m_texture = nullptr; + u32 m_mipCount = 0; + Vec3 m_average{}; + std::string m_path; +}; + +inline void directionToEnvironmentUV(const Vec3& dir, f32& u, f32& v) { + constexpr f32 kPi = 3.14159265f; + const f32 len = dir.length(); + const Vec3 d = len > 1e-6f ? dir / len : Vec3(0.0f, 0.0f, 1.0f); + u = std::atan2(d.x, d.z) / (2.0f * kPi) + 0.5f; + v = 0.5f - std::asin(std::clamp(d.y, -1.0f, 1.0f)) / kPi; +} + +} // namespace Caffeine::Render diff --git a/src/render/GpuPointShadowMap.hpp b/src/render/GpuPointShadowMap.hpp index 04b9e63c..ce0ae632 100644 --- a/src/render/GpuPointShadowMap.hpp +++ b/src/render/GpuPointShadowMap.hpp @@ -10,7 +10,7 @@ namespace Caffeine::Render { class GpuPointShadowMap { public: - static constexpr u32 kFaceSize = 256; + static constexpr u32 kFaceSize = 512; static constexpr u32 kMaxPointShadowLights = 2; bool init(RHI::RenderDevice* device); diff --git a/src/render/GpuProceduralMeshes.cpp b/src/render/GpuProceduralMeshes.cpp index d48f3d83..0b93c925 100644 --- a/src/render/GpuProceduralMeshes.cpp +++ b/src/render/GpuProceduralMeshes.cpp @@ -430,7 +430,7 @@ void GpuProceduralMeshes::ensureBuilt() { buildCube(g_cube); buildPlane(g_plane); - buildSphere(g_sphere); + buildSphere(g_sphere, 48); buildCylinder(g_cylinder); buildCapsule(g_capsule); buildCone(g_cone); diff --git a/src/render/GpuSceneRenderer.cpp b/src/render/GpuSceneRenderer.cpp index 4f88a5ce..e0f211ec 100644 --- a/src/render/GpuSceneRenderer.cpp +++ b/src/render/GpuSceneRenderer.cpp @@ -1,4 +1,8 @@ #include "render/GpuSceneRenderer.hpp" +#include "render/PostProcessRenderer.hpp" +#include "render/CoarseOcclusion.hpp" +#include "render/InstanceBatch.hpp" +#include "render/ForwardRenderFeatures.hpp" #include "debug/Profiler.hpp" #include "render/ShaderBytecode.hpp" #include "render/GpuProceduralMeshes.hpp" @@ -8,8 +12,11 @@ #include "ecs/ComponentQuery.hpp" #include "scene/HierarchySystem.hpp" #include "scene/SceneComponents.hpp" +#include "scene/EnvironmentSystem.hpp" #include "scene/CpuDirectionalShadowMap.hpp" +#include "assets/MaterialCache.hpp" #include "assets/MeshCache.hpp" +#include "assets/MeshLOD.hpp" #include "assets/MeshImportValidator.hpp" #include #include "ecs/TerrainComponents.hpp" @@ -25,6 +32,7 @@ #include #include #include +#include #include namespace Caffeine::Render { @@ -43,7 +51,7 @@ struct LightingUBO { float albedo[4]; float metallic; float roughness; - float shininess; + float reflectance; // std140 slot shared with legacy uShininess name in terrain_lit float padFlags; // std140: vec4 uFlags must start at offset 64 float flags[4]; int dirCount; @@ -58,8 +66,65 @@ struct LightingUBO { float spotDir[16]; float spotColor[16]; float spotAngle[16]; + float iblColor[4]; + float iblParams[4]; + float volParams[4]; + float reflectParams[4]; + float extra[4]; + float reflectVP[16]; + float emission[4]; + float uvTransform[4]; + float materialParams[4]; + float coat[4]; + float sheen[4]; + float iridescence[4]; + float materialFlags[4]; + float ssrParams[4]; + float projParams[4]; + float prevViewProj[16]; + float prevView[16]; + float screen[4]; + float viewProj[16]; }; +static_assert(offsetof(LightingUBO, iblColor) == 608, "LightingUBO.iblColor must match GLSL std140"); +static_assert(offsetof(LightingUBO, reflectVP) == 688, "LightingUBO.reflectVP must match GLSL std140"); +static_assert(offsetof(LightingUBO, emission) == 752, "LightingUBO.emission must match GLSL std140"); +static_assert(offsetof(LightingUBO, prevViewProj) == 896, "LightingUBO.prevViewProj must match GLSL std140"); +static_assert(offsetof(LightingUBO, viewProj) == 1040, "LightingUBO.viewProj must match GLSL std140"); + +struct SkyUBO { + float invViewProj[16]; + float params[4]; + float zenith[4]; + float horizon[4]; + float ground[4]; +}; + +struct GridUBO { + float invViewProj[16]; + float viewProj[16]; + float camera[4]; + float params[4]; + float minor[4]; + float major[4]; + float axisX[4]; + float axisZ[4]; +}; + +constexpr RHI::TextureFormat kHdrFormat = RHI::TextureFormat::R16G16B16A16_FLOAT; +constexpr u32 kMaxViewTargets = 4; + +f32 srgbToLinear(f32 c) { + c = std::max(c, 0.0f); + if (c > 1.0f) return std::pow(c, 2.2f); + return c <= 0.04045f ? c / 12.92f : std::pow((c + 0.055f) / 1.055f, 2.4f); +} + +Vec3 srgbToLinear(const Vec3& c) { + return Vec3(srgbToLinear(c.x), srgbToLinear(c.y), srgbToLinear(c.z)); +} + static_assert(offsetof(LightingUBO, flags) == 64, "LightingUBO.flags must match GLSL std140 vec4"); static_assert(offsetof(LightingUBO, dirCount) == 80, "LightingUBO.dirCount must match GLSL std140"); static_assert(offsetof(LightingUBO, dirData) == 96, "LightingUBO.dirData must match GLSL std140"); @@ -118,6 +183,42 @@ Mat4 entityMatrix(ECS::World& world, ECS::Entity entity) { return buildLocalMatrix3D(p3, r3, s3); } +/// Changes whenever something a probe would see changes: placement, mesh or material. +template +u64 hashProbeScene(const Draws& draws, const std::string& environmentPath) { + u64 h = 1469598103934665603ull; + auto mix = [&h](const void* data, size_t size) { + const auto* bytes = static_cast(data); + for (size_t i = 0; i < size; ++i) { + h ^= bytes[i]; + h *= 1099511628211ull; + } + }; + mix(environmentPath.data(), environmentPath.size()); + for (const auto& draw : draws) { + const u32 id = draw.entity.id(); + mix(&id, sizeof(id)); + mix(&draw.mesh, sizeof(draw.mesh)); + mix(draw.worldMatrix.data(), sizeof(float) * 16); + mix(&draw.albedo, sizeof(draw.albedo)); + mix(&draw.emission, sizeof(draw.emission)); + mix(&draw.metallic, sizeof(draw.metallic)); + mix(&draw.roughness, sizeof(draw.roughness)); + mix(&draw.reflectance, sizeof(draw.reflectance)); + mix(draw.customTexturePath.data(), draw.customTexturePath.size()); + } + return h; +} + +/// Mat4::ortho / perspective produce GL depth (-1..1) but SDL GPU clips z < 0, which would cut +/// away the half of the light volume nearest the light. Remap shadow projections to 0..1. +Mat4 shadowDepthRange(const Mat4& proj) { + Mat4 remap = Mat4::identity(); + remap(2, 2) = 0.5f; + remap(2, 3) = 0.5f; + return remap * proj; +} + Mat4 buildDirectionalLightVP(const Vec3& lightDirection, const Vec3& focus, f32 shadowDistance) { Vec3 lightDir = lightDirection; const f32 len = lightDir.length(); @@ -132,7 +233,8 @@ Mat4 buildDirectionalLightVP(const Vec3& lightDirection, const Vec3& focus, f32 } const Mat4 view = Mat4::lookAt(eye, focus, up); - const Mat4 proj = Mat4::ortho(-extent, extent, -extent, extent, 0.1f, extent * 4.0f); + const Mat4 proj = + shadowDepthRange(Mat4::ortho(-extent, extent, -extent, extent, 0.1f, extent * 4.0f)); return proj * view; } @@ -181,7 +283,8 @@ void buildDirectionalCascadeVPs(const GpuSceneCamera& camera, const Vec3& lightD up = Vec3(0.0f, 0.0f, 1.0f); } const Mat4 view = Mat4::lookAt(eye, focus, up); - const Mat4 proj = Mat4::ortho(-extent, extent, -extent, extent, 0.1f, extent * 4.0f); + const Mat4 proj = + shadowDepthRange(Mat4::ortho(-extent, extent, -extent, extent, 0.1f, extent * 4.0f)); outVP[c] = proj * view; } } @@ -200,29 +303,11 @@ Mat4 buildSpotLightVP(const Vec3& position, const Vec3& direction, f32 radius, f up = Vec3(0.0f, 0.0f, 1.0f); } const Mat4 view = Mat4::lookAt(position, target, up); - const Mat4 proj = - Mat4::perspective(angleDegrees * 3.14159265f / 180.0f, 1.0f, 0.1f, radius); + const Mat4 proj = shadowDepthRange( + Mat4::perspective(angleDegrees * 3.14159265f / 180.0f, 1.0f, 0.1f, radius)); return proj * view; } -RHI::Shader* createShaderFromBuiltin(RHI::RenderDevice* device, BuiltinShader shader, - RHI::ShaderStage stage, u32 numUniformBuffers, - u32 numSamplers = 0) { - const auto format = detectShaderFormat(device); - const auto bytecode = getBuiltinShaderBytecode(shader, format); - if (!bytecode.data || bytecode.size == 0) return nullptr; - - RHI::ShaderDesc desc; - desc.code = bytecode.data; - desc.codeSize = bytecode.size; - desc.stage = stage; - desc.format = format; - desc.entryPoint = bytecode.entryPoint; - desc.numUniformBuffers = numUniformBuffers; - desc.numSamplers = numSamplers; - return device->createShader(desc); -} - struct ResolvedMeshAlbedo { RHI::Texture* texture = nullptr; Vec4 factor{1.0f, 1.0f, 1.0f, 1.0f}; @@ -244,7 +329,7 @@ ResolvedMeshAlbedo resolveMeshAlbedo(RHI::RenderDevice* device, const Assets::Me auto& cache = GpuTextureCache::instance(); if (!customTexturePath.empty()) { - result.texture = cache.acquire(device, customTexturePath, projectRoot, qualityTier); + result.texture = cache.acquire(device, customTexturePath, projectRoot, qualityTier, true); if (result.texture) return result; } @@ -256,14 +341,14 @@ ResolvedMeshAlbedo resolveMeshAlbedo(RHI::RenderDevice* device, const Assets::Me result.roughness = mat.roughness; if (!mat.albedoPath.empty()) { - result.texture = cache.acquire(device, mat.albedoPath, projectRoot, qualityTier); + result.texture = cache.acquire(device, mat.albedoPath, projectRoot, qualityTier, true); if (result.texture) return result; } if (!mat.albedoPixels.empty() && mat.albedoWidth > 0 && mat.albedoHeight > 0) { const std::string key = meshPath + "#mat" + std::to_string(materialIndex); result.texture = cache.acquireFromPixels(device, key, mat.albedoPixels.data(), mat.albedoWidth, mat.albedoHeight, - mat.albedoChannels, qualityTier); + mat.albedoChannels, qualityTier, true); if (result.texture) return result; } return result; @@ -272,13 +357,13 @@ ResolvedMeshAlbedo resolveMeshAlbedo(RHI::RenderDevice* device, const Assets::Me if (!meshPath.empty()) { const std::string pngPath = std::filesystem::path(meshPath).replace_extension(".png").string(); - result.texture = cache.acquire(device, pngPath, projectRoot, qualityTier); + result.texture = cache.acquire(device, pngPath, projectRoot, qualityTier, true); if (result.texture) return result; for (const std::string& uri : Assets::MeshImportValidator::listGltfExternalUris(meshPath)) { const std::string texPath = (std::filesystem::path(meshPath).parent_path() / uri).string(); - result.texture = cache.acquire(device, texPath, projectRoot, qualityTier); + result.texture = cache.acquire(device, texPath, projectRoot, qualityTier, true); if (result.texture) return result; } } @@ -287,7 +372,7 @@ ResolvedMeshAlbedo resolveMeshAlbedo(RHI::RenderDevice* device, const Assets::Me const std::string key = meshPath + "#embedded"; result.texture = cache.acquireFromPixels(device, key, mesh->baseColorTexture.data(), mesh->textureWidth, mesh->textureHeight, - mesh->textureChannels, qualityTier); + mesh->textureChannels, qualityTier, true); } return result; @@ -331,36 +416,129 @@ bool GpuSceneRenderer::init(RHI::RenderDevice* device) { RHI::SamplerDesc repeatDesc; repeatDesc.linearFilter = true; repeatDesc.clampToEdge = false; + repeatDesc.maxAnisotropy = 8.0f; m_repeatSampler = m_device->createSampler(repeatDesc); - m_ready = m_sampler && m_repeatSampler; + RHI::SamplerDesc pointDesc; + pointDesc.linearFilter = false; + pointDesc.clampToEdge = true; + m_pointSampler = m_device->createSampler(pointDesc); + RHI::TextureDesc cubeDesc; + cubeDesc.width = 4; + cubeDesc.height = 4; + cubeDesc.format = RHI::TextureFormat::R8G8B8A8_UNORM; + cubeDesc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; + cubeDesc.type = RHI::TextureType::Cube; + m_fallbackCube = m_device->createTexture(cubeDesc); + m_views.reserve(kMaxViewTargets); + m_post.init(device); + m_ready = m_sampler && m_repeatSampler && m_pointSampler && m_post.ready(); return m_ready; } +void GpuSceneRenderer::destroyMeshGpu(Assets::Mesh3D& mesh) { + if (m_device) { + if (mesh.vertexBuffer) m_device->destroyBuffer(mesh.vertexBuffer); + if (mesh.indexBuffer) m_device->destroyBuffer(mesh.indexBuffer); + } + mesh.vertexBuffer = nullptr; + mesh.indexBuffer = nullptr; +} + +Assets::Mesh3D* GpuSceneRenderer::selectMeshLod(const Assets::Mesh3D* source, ECS::Entity entity, + f32 distance) { + if (!source || source->indices.size() < 600) return const_cast(source); + + u32& level = m_entityLod[entity.id()]; + constexpr f32 kNear = 120.0f; + constexpr f32 kFar = 350.0f; + if (level == 0 && distance > kNear * 1.12f) level = 1; + else if (level == 1 && distance > kFar * 1.12f) level = 2; + else if (level >= 1 && distance < kNear * 0.88f) level = 0; + else if (level == 2 && distance < kFar * 0.88f) level = 1; + if (level == 0) return const_cast(source); + + MeshLodCache& cache = m_meshLods[source]; + if (!cache.built) { + const Vec3 extent = source->bounds.max - source->bounds.min; + const f32 diagonal = std::max(extent.length(), 0.25f); + Assets::MeshLOD::buildClusteredLod(*source, cache.medium, diagonal * 0.03f); + Assets::MeshLOD::buildClusteredLod(*source, cache.far, diagonal * 0.08f); + cache.built = true; + } + Assets::Mesh3D* chosen = (level == 1) ? &cache.medium : &cache.far; + if (!chosen || chosen->indices.size() < 3) return const_cast(source); + return chosen; +} + void GpuSceneRenderer::shutdown() { + for (auto& [_, cache] : m_meshLods) { + destroyMeshGpu(cache.medium); + destroyMeshGpu(cache.far); + } + m_meshLods.clear(); + m_entityLod.clear(); + m_post.shutdown(); if (m_device) { + for (ViewTargets& view : m_views) releaseViewTargets(view); + for (ReflectionProbe& probe : m_probes) releaseProbe(probe); if (m_sceneVert) m_device->destroyShader(m_sceneVert); if (m_sceneFrag) m_device->destroyShader(m_sceneFrag); if (m_terrainFrag) m_device->destroyShader(m_terrainFrag); if (m_shadowVert) m_device->destroyShader(m_shadowVert); if (m_shadowFrag) m_device->destroyShader(m_shadowFrag); + if (m_fullscreenVert) m_device->destroyShader(m_fullscreenVert); + if (m_skyFrag) m_device->destroyShader(m_skyFrag); + if (m_gridFrag) m_device->destroyShader(m_gridFrag); if (m_scenePipeline) m_device->destroyPipeline(m_scenePipeline); if (m_wireframePipeline) m_device->destroyPipeline(m_wireframePipeline); if (m_terrainPipeline) m_device->destroyPipeline(m_terrainPipeline); if (m_shadowPipeline) m_device->destroyPipeline(m_shadowPipeline); + if (m_instancedPipeline) m_device->destroyPipeline(m_instancedPipeline); + if (m_blendPipeline) m_device->destroyPipeline(m_blendPipeline); + if (m_skyPipeline) m_device->destroyPipeline(m_skyPipeline); + if (m_gridPipeline) m_device->destroyPipeline(m_gridPipeline); + if (m_instancedVert) m_device->destroyShader(m_instancedVert); + if (m_instanceBuffer) m_device->destroyBuffer(m_instanceBuffer); + if (m_reflectionColor) m_device->destroyTexture(m_reflectionColor); + if (m_reflectionDepth) m_device->destroyTexture(m_reflectionDepth); + if (m_fallbackCube) m_device->destroyTexture(m_fallbackCube); + m_environment.release(m_device); if (m_sampler) m_device->destroySampler(m_sampler); if (m_repeatSampler) m_device->destroySampler(m_repeatSampler); + if (m_pointSampler) m_device->destroySampler(m_pointSampler); } + m_views.clear(); + m_probes.clear(); m_sceneVert = nullptr; m_sceneFrag = nullptr; m_terrainFrag = nullptr; m_shadowVert = nullptr; m_shadowFrag = nullptr; + m_fullscreenVert = nullptr; + m_skyFrag = nullptr; + m_gridFrag = nullptr; m_scenePipeline = nullptr; m_wireframePipeline = nullptr; m_terrainPipeline = nullptr; m_shadowPipeline = nullptr; + m_instancedPipeline = nullptr; + m_blendPipeline = nullptr; + m_skyPipeline = nullptr; + m_gridPipeline = nullptr; + m_instancedVert = nullptr; + m_instanceBuffer = nullptr; + m_reflectionColor = nullptr; + m_reflectionDepth = nullptr; + m_fallbackCube = nullptr; + m_reflectionWidth = 0; + m_reflectionHeight = 0; + m_reflectionValid = false; + m_probesPending = false; + m_needsAnotherFrame = false; + m_inReflectionPass = false; m_sampler = nullptr; m_repeatSampler = nullptr; + m_pointSampler = nullptr; m_pointShadows.shutdown(); m_directionalShadows.shutdown(); m_spotShadows.shutdown(); @@ -382,16 +560,24 @@ bool GpuSceneRenderer::createPipelines() { return false; } - m_sceneVert = createShaderFromBuiltin(m_device, BuiltinShader::SceneLitVertex, + m_sceneVert = createBuiltinShader(m_device, BuiltinShader::SceneLitVertex, + RHI::ShaderStage::Vertex, 1); + m_sceneFrag = createBuiltinShader(m_device, BuiltinShader::SceneLitFragment, + RHI::ShaderStage::Fragment, 2, 16); + m_instancedVert = createBuiltinShader(m_device, BuiltinShader::SceneInstancedVertex, RHI::ShaderStage::Vertex, 1); - m_sceneFrag = createShaderFromBuiltin(m_device, BuiltinShader::SceneLitFragment, - RHI::ShaderStage::Fragment, 2, 8); - m_terrainFrag = createShaderFromBuiltin(m_device, BuiltinShader::TerrainLitFragment, - RHI::ShaderStage::Fragment, 3, 12); - m_shadowVert = createShaderFromBuiltin(m_device, BuiltinShader::ShadowDepthVertex, - RHI::ShaderStage::Vertex, 1); - m_shadowFrag = createShaderFromBuiltin(m_device, BuiltinShader::ShadowDepthFragment, - RHI::ShaderStage::Fragment, 0); + m_terrainFrag = createBuiltinShader(m_device, BuiltinShader::TerrainLitFragment, + RHI::ShaderStage::Fragment, 3, 12); + m_shadowVert = createBuiltinShader(m_device, BuiltinShader::ShadowDepthVertex, + RHI::ShaderStage::Vertex, 1); + m_shadowFrag = createBuiltinShader(m_device, BuiltinShader::ShadowDepthFragment, + RHI::ShaderStage::Fragment, 0); + m_fullscreenVert = createBuiltinShader(m_device, BuiltinShader::FullscreenVertex, + RHI::ShaderStage::Vertex, 0); + m_skyFrag = createBuiltinShader(m_device, BuiltinShader::SkyFragment, + RHI::ShaderStage::Fragment, 1, 1); + m_gridFrag = createBuiltinShader(m_device, BuiltinShader::GridFragment, + RHI::ShaderStage::Fragment, 1, 0); if (!m_sceneVert || !m_sceneFrag || !m_terrainFrag || !m_shadowVert || !m_shadowFrag) { return false; @@ -400,19 +586,70 @@ bool GpuSceneRenderer::createPipelines() { RHI::VertexBufferLayoutDesc layout{}; RHI::VertexAttributeDesc attrs[4]{}; RHI::GraphicsPipelineDesc sceneDesc{}; - fillMeshPipelineDesc(sceneDesc, layout, attrs, RHI::TextureFormat::R8G8B8A8_UNORM, true, true); + fillMeshPipelineDesc(sceneDesc, layout, attrs, kHdrFormat, true, true); m_scenePipeline = m_device->createGraphicsPipeline(m_sceneVert, m_sceneFrag, sceneDesc); RHI::GraphicsPipelineDesc wireDesc = sceneDesc; wireDesc.fillMode = RHI::FillMode::Line; m_wireframePipeline = m_device->createGraphicsPipeline(m_sceneVert, m_sceneFrag, wireDesc); m_terrainPipeline = m_device->createGraphicsPipeline(m_sceneVert, m_terrainFrag, sceneDesc); + RHI::GraphicsPipelineDesc blendDesc = sceneDesc; + blendDesc.depthWrite = false; + blendDesc.blendMode = RHI::BlendMode::Premultiplied; + m_blendPipeline = m_device->createGraphicsPipeline(m_sceneVert, m_sceneFrag, blendDesc); + + if (m_fullscreenVert && m_skyFrag) { + RHI::GraphicsPipelineDesc skyDesc{}; + skyDesc.colorFormat = kHdrFormat; + skyDesc.depthFormat = RHI::TextureFormat::D32_FLOAT; + skyDesc.depthTest = true; + skyDesc.depthWrite = false; + m_skyPipeline = m_device->createGraphicsPipeline(m_fullscreenVert, m_skyFrag, skyDesc); + } + if (m_fullscreenVert && m_gridFrag) { + RHI::GraphicsPipelineDesc gridDesc{}; + gridDesc.colorFormat = kHdrFormat; + gridDesc.depthFormat = RHI::TextureFormat::D32_FLOAT; + gridDesc.depthTest = true; + gridDesc.depthWrite = false; + gridDesc.blendMode = RHI::BlendMode::Alpha; + m_gridPipeline = m_device->createGraphicsPipeline(m_fullscreenVert, m_gridFrag, gridDesc); + } // Color-only shadow pass (no depth attachment) for cubemap / 2D shadow maps. RHI::GraphicsPipelineDesc shadowDesc{}; fillMeshPipelineDesc(shadowDesc, layout, attrs, RHI::TextureFormat::R16_FLOAT, false, false); m_shadowPipeline = m_device->createGraphicsPipeline(m_shadowVert, m_shadowFrag, shadowDesc); - return m_scenePipeline && m_wireframePipeline && m_terrainPipeline && m_shadowPipeline; + if (m_instancedVert && m_sceneFrag) { + RHI::VertexBufferLayoutDesc instancedLayouts[2]{}; + instancedLayouts[0] = {0, kVertexStride, false}; + instancedLayouts[1] = {1, sizeof(float) * 16, true}; + RHI::VertexAttributeDesc instancedAttrs[8]{}; + instancedAttrs[0] = {0, 0, RHI::VertexFormat::Float3, 0}; + instancedAttrs[1] = {1, 0, RHI::VertexFormat::Float3, 12}; + instancedAttrs[2] = {2, 0, RHI::VertexFormat::Float2, 24}; + instancedAttrs[3] = {3, 0, RHI::VertexFormat::Float4, 32}; + instancedAttrs[4] = {4, 1, RHI::VertexFormat::Float4, 0}; + instancedAttrs[5] = {5, 1, RHI::VertexFormat::Float4, 16}; + instancedAttrs[6] = {6, 1, RHI::VertexFormat::Float4, 32}; + instancedAttrs[7] = {7, 1, RHI::VertexFormat::Float4, 48}; + RHI::GraphicsPipelineDesc instancedDesc = sceneDesc; + instancedDesc.vertexBuffers = instancedLayouts; + instancedDesc.numVertexBuffers = 2; + instancedDesc.attributes = instancedAttrs; + instancedDesc.numAttributes = 8; + m_instancedPipeline = m_device->createGraphicsPipeline(m_instancedVert, m_sceneFrag, instancedDesc); + } + + if (m_instancedPipeline) { + RHI::BufferDesc instanceDesc; + instanceDesc.size = 256ull * sizeof(float) * 16ull; + instanceDesc.name = "SceneInstances"; + m_instanceBuffer = m_device->createBuffer(instanceDesc, RHI::BufferUsage::Vertex); + } + + return m_scenePipeline && m_wireframePipeline && m_terrainPipeline && m_shadowPipeline && + m_blendPipeline; } void GpuSceneRenderer::pushShadowDraw(RHI::CommandBuffer* cmd, const MeshDraw& draw, @@ -487,8 +724,9 @@ void GpuSceneRenderer::renderDirectionalShadows(RHI::CommandBuffer* cmd, ECS::Wo RHI::Texture* map = m_directionalShadows.texture(shadowSlot); if (!map) continue; - const u32 cascadeCount = - shadowSlot == 0 ? GpuDirectionalShadowMap::kMaxCascades : 1u; + const u32 cascadeCount = shadowSlot == 0 + ? std::clamp(m_activeCascadeCount, 1u, GpuDirectionalShadowMap::kMaxCascades) + : 1u; Mat4 cascadeVPs[GpuDirectionalShadowMap::kMaxCascades]{}; f32 splits[GpuDirectionalShadowMap::kMaxCascades + 1]{}; buildDirectionalCascadeVPs(camera, dir.direction, dir.shadowDistance, cascadeCount, @@ -566,6 +804,43 @@ void GpuSceneRenderer::renderSpotShadows(RHI::CommandBuffer* cmd, ECS::World& wo } } +namespace { + +constexpr f32 kPi = 3.14159265f; + +/// Camera for cube face `face` (+X, -X, +Y, -Y, +Z, -Z). Render targets have a top-left origin +/// with y-up NDC, so the projection is flipped vertically to match cube-map addressing. +void cubeFaceCamera(const Vec3& origin, u32 face, f32 nearClip, f32 farClip, Mat4& view, + Mat4& proj, Vec3& focus) { + static const Vec3 kDirs[6] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}}; + static const Vec3 kUps[6] = {{0, -1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}, {0, -1, 0}, {0, -1, 0}}; + focus = origin + kDirs[face]; + view = Mat4::lookAt(origin, focus, kUps[face]); + proj = Mat4::perspective(kPi * 0.5f, 1.0f, nearClip, farClip); + proj(1, 1) = -proj(1, 1); +} + +void setVec4(float* out, f32 x, f32 y, f32 z, f32 w) { + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; +} + +/// Linear-space fallback sky used when the scene has no environment map. +const Vec3 kSkyZenith{0.16f, 0.30f, 0.62f}; +const Vec3 kSkyHorizon{0.58f, 0.66f, 0.76f}; +const Vec3 kSkyGround{0.16f, 0.15f, 0.14f}; +const Vec3 kFallbackAmbient{0.34f, 0.38f, 0.45f}; + +u32 probeMipCount(u32 resolution) { + u32 mips = 1; + while ((resolution >> mips) >= 4u) ++mips; + return mips; +} + +} // namespace + void GpuSceneRenderer::renderPointShadows(RHI::CommandBuffer* cmd, ECS::World& world, const Scene::SceneLighting& lighting, const std::vector& draws) { @@ -579,16 +854,11 @@ void GpuSceneRenderer::renderPointShadows(RHI::CommandBuffer* cmd, ECS::World& w RHI::Texture* cube = m_pointShadows.cubemap(shadowSlot); if (!cube) continue; - const Vec3 faceDirs[6] = { - {1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1} - }; - const Vec3 faceUps[6] = { - {0, -1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}, {0, -1, 0}, {0, -1, 0} - }; - for (u32 face = 0; face < 6; ++face) { - const Mat4 view = Mat4::lookAt(point.position, point.position + faceDirs[face], faceUps[face]); - const Mat4 proj = Mat4::perspective(90.0f * 3.14159265f / 180.0f, 1.0f, 0.1f, point.radius); + Mat4 view; + Mat4 proj; + Vec3 focus; + cubeFaceCamera(point.position, face, 0.1f, point.radius, view, proj, focus); RHI::RenderPassDesc pass; pass.colorTarget = cube; @@ -616,205 +886,226 @@ void GpuSceneRenderer::renderPointShadows(RHI::CommandBuffer* cmd, ECS::World& w } } -u32 GpuSceneRenderer::renderMeshes(RHI::CommandBuffer* cmd, const std::vector& draws, - const Mat4& vp, const Vec3& cameraPos, const Mat4& cameraView, - const Scene::SceneLighting& lighting, - RHI::Texture* colorTarget, RHI::Texture* depthTarget, - u32 width, u32 height, const std::string& projectRoot, - const GpuSceneRenderOptions& options) { - Caffeine::Debug::setCrashBreadcrumb("GpuSceneRenderer::renderMeshes"); - const bool wireframeMeshes = options.wireframeMeshes; - if ((!wireframeMeshes && !m_scenePipeline) || - (wireframeMeshes && !m_wireframePipeline) || draws.empty()) { - return 0; - } - - u32 drawnMeshes = 0; - - RHI::RenderPassDesc pass; - pass.colorTarget = colorTarget; - pass.depthTarget = depthTarget; - pass.clearColor[0] = 0.0f; - pass.clearColor[1] = 0.0f; - pass.clearColor[2] = 0.0f; - pass.clearColor[3] = 0.0f; - pass.clearDepth = true; - pass.cycle = true; - SceneShadowUBO shadowUbo{}; - std::memcpy(shadowUbo.cameraView, cameraView.data(), sizeof(shadowUbo.cameraView)); - for (u32 slot = 0; slot < GpuDirectionalShadowMap::kMaxDirectionalShadowLights; ++slot) { - if (m_directionalShadows.valid(slot)) { - const u32 cascades = m_directionalShadows.cascadeCount(slot); - for (u32 c = 0; c < cascades; ++c) { - std::memcpy(shadowUbo.dirShadowVP + (slot * 4 + c) * 16, - m_directionalShadows.cascadeVP(slot, c).data(), sizeof(float) * 16); - } - const f32* splits = m_directionalShadows.cascadeSplits(slot); - shadowUbo.dirCascadeSplits[slot * 4 + 0] = splits[1]; - shadowUbo.dirCascadeSplits[slot * 4 + 1] = splits[2]; - shadowUbo.dirCascadeSplits[slot * 4 + 2] = splits[3]; - shadowUbo.dirCascadeSplits[slot * 4 + 3] = static_cast(cascades); - shadowUbo.dirShadowValid[slot] = 1.0f; - } - } - for (u32 slot = 0; slot < GpuPointShadowMap::kMaxPointShadowLights; ++slot) { - if (m_pointShadows.valid(slot)) { - const Vec3 pos = m_pointShadows.lightPosition(slot); - shadowUbo.pointShadowPos[slot * 4 + 0] = pos.x; - shadowUbo.pointShadowPos[slot * 4 + 1] = pos.y; - shadowUbo.pointShadowPos[slot * 4 + 2] = pos.z; - shadowUbo.pointShadowRadius[slot] = m_pointShadows.radius(slot); - shadowUbo.pointShadowValid[slot] = 1.0f; - } - } - for (u32 slot = 0; slot < GpuSpotShadowMap::kMaxSpotShadowLights; ++slot) { - if (m_spotShadows.valid(slot)) { - const Vec3 pos = m_spotShadows.lightPosition(slot); - std::memcpy(shadowUbo.spotShadowVP + slot * 16, m_spotShadows.lightVP(slot).data(), - sizeof(float) * 16); - shadowUbo.spotShadowPos[slot * 4 + 0] = pos.x; - shadowUbo.spotShadowPos[slot * 4 + 1] = pos.y; - shadowUbo.spotShadowPos[slot * 4 + 2] = pos.z; - shadowUbo.spotShadowParams[slot * 4 + 0] = m_spotShadows.radius(slot); - shadowUbo.spotShadowParams[slot * 4 + 1] = m_spotShadows.cosHalfAngle(slot); - shadowUbo.spotShadowValid[slot] = 1.0f; - } +void GpuSceneRenderer::drawSky(RHI::CommandBuffer* cmd, const GpuSceneCamera& camera, + u32 targetHeight) { + if (!m_skyPipeline) return; + SkyUBO ubo{}; + const Mat4 inv = (camera.proj * camera.view).inverted(); + std::memcpy(ubo.invViewProj, inv.data(), sizeof(ubo.invViewProj)); + RHI::Texture* env = m_environment.texture(); + if (env) { + // Match the environment's texel density to the target's so distant detail doesn't alias. + const f32 envTexelsPerRadian = static_cast(env->width) / (2.0f * kPi); + const f32 screenTexelsPerRadian = + static_cast(std::max(targetHeight, 1u)) / std::max(camera.fovRad, 0.01f); + const f32 maxLod = static_cast(m_environment.mipCount() > 0 ? m_environment.mipCount() - 1 : 0); + const f32 lod = std::clamp(std::log2(std::max(envTexelsPerRadian / screenTexelsPerRadian, 1.0f)), + 0.0f, maxLod); + setVec4(ubo.params, std::max(m_environmentExposure, 1e-4f), lod, 0.0f, 0.0f); } + setVec4(ubo.zenith, kSkyZenith.x, kSkyZenith.y, kSkyZenith.z, 1.0f); + setVec4(ubo.horizon, kSkyHorizon.x, kSkyHorizon.y, kSkyHorizon.z, 1.0f); + setVec4(ubo.ground, kSkyGround.x, kSkyGround.y, kSkyGround.z, 1.0f); + + RHI::Texture* bound = env ? env : GpuTextureCache::instance().whiteTexture(m_device); + cmd->bindPipeline(m_skyPipeline); + if (bound) cmd->bindTexture(bound, 0, m_repeatSampler); + cmd->pushUniformData(RHI::ShaderStage::Fragment, 0, &ubo, sizeof(ubo)); + cmd->draw(3); +} - RHI::Texture* whiteTex = GpuTextureCache::instance().whiteTexture(m_device); +void GpuSceneRenderer::drawGrid(RHI::CommandBuffer* cmd, const GpuSceneCamera& camera, + const GpuGridOverlay& grid) { + if (!m_gridPipeline || grid.opacity <= 0.0f) return; + GridUBO ubo{}; + const Mat4 vp = camera.proj * camera.view; + const Mat4 inv = vp.inverted(); + std::memcpy(ubo.invViewProj, inv.data(), sizeof(ubo.invViewProj)); + std::memcpy(ubo.viewProj, vp.data(), sizeof(ubo.viewProj)); + setVec4(ubo.camera, camera.position.x, camera.position.y, camera.position.z, + std::max(grid.fadeDistance, 1.0f)); + setVec4(ubo.params, std::max(grid.cellSize, 1e-3f), std::max(grid.majorEvery, 2.0f), + std::clamp(grid.opacity, 0.0f, 1.0f), 1.0f); + setVec4(ubo.minor, 0.20f, 0.20f, 0.22f, 0.45f); + setVec4(ubo.major, 0.34f, 0.34f, 0.37f, 0.75f); + setVec4(ubo.axisX, 0.75f, 0.10f, 0.10f, 0.95f); + setVec4(ubo.axisZ, 0.10f, 0.22f, 0.80f, 0.95f); + cmd->bindPipeline(m_gridPipeline); + cmd->pushUniformData(RHI::ShaderStage::Fragment, 0, &ubo, sizeof(ubo)); + cmd->draw(3); +} - cmd->beginRenderPass(pass); - cmd->bindPipeline(wireframeMeshes ? m_wireframePipeline : m_scenePipeline); - cmd->setViewport(0, 0, static_cast(width), static_cast(height)); - if (!wireframeMeshes) { - cmd->pushUniformData(RHI::ShaderStage::Fragment, 1, &shadowUbo, sizeof(shadowUbo)); - } +void GpuSceneRenderer::drawMeshList(RHI::CommandBuffer* cmd, + const std::vector& draws, + const GpuSceneCamera& camera, + const Scene::SceneLighting& lighting, + const std::string& projectRoot, + const GpuSceneRenderOptions& options, + const ScenePassContext& pass, RHI::Pipeline* basePipeline) { + if (draws.empty()) return; + const bool wireframe = options.wireframeMeshes; + const RenderFeatureSettings& features = options.features; + RHI::Texture* whiteTex = GpuTextureCache::instance().whiteTexture(m_device); + RHI::Texture* fallbackCube = m_fallbackCube ? m_fallbackCube : whiteTex; + auto& texCache = GpuTextureCache::instance(); auto bindShadowTextures = [&](u32 dirBase, u32 pointBase, u32 spotBase) { for (u32 slot = 0; slot < GpuDirectionalShadowMap::kMaxDirectionalShadowLights; ++slot) { - RHI::Texture* shadowTex = m_directionalShadows.texture(slot); - if (shadowTex) { - cmd->bindTexture(shadowTex, dirBase + slot, m_sampler); - } else if (whiteTex) { - cmd->bindTexture(whiteTex, dirBase + slot, m_sampler); - } + RHI::Texture* tex = m_directionalShadows.texture(slot); + if (!tex) tex = whiteTex; + if (tex) cmd->bindTexture(tex, dirBase + slot, m_sampler); } for (u32 slot = 0; slot < GpuPointShadowMap::kMaxPointShadowLights; ++slot) { RHI::Texture* cube = m_pointShadows.cubemap(slot); - if (cube) { - cmd->bindTexture(cube, pointBase + slot, m_sampler); - } else if (whiteTex) { - cmd->bindTexture(whiteTex, pointBase + slot, m_sampler); - } + if (!cube) cube = fallbackCube; + if (cube) cmd->bindTexture(cube, pointBase + slot, m_sampler); } for (u32 slot = 0; slot < GpuSpotShadowMap::kMaxSpotShadowLights; ++slot) { - RHI::Texture* spotTex = m_spotShadows.texture(slot); - if (spotTex) { - cmd->bindTexture(spotTex, spotBase + slot, m_sampler); - } else if (whiteTex) { - cmd->bindTexture(whiteTex, spotBase + slot, m_sampler); - } + RHI::Texture* tex = m_spotShadows.texture(slot); + if (!tex) tex = whiteTex; + if (tex) cmd->bindTexture(tex, spotBase + slot, m_sampler); } }; - // Shaders always declare shadow samplers — bind fallbacks even when shadow passes are skipped. - bindShadowTextures(2, 4, 6); + + // Everything that is the same for every draw of the pass. + LightingUBO base{}; + setVec4(base.cameraPos, camera.position.x, camera.position.y, camera.position.z, 0.0f); + setVec4(base.ambient, kFallbackAmbient.x, kFallbackAmbient.y, kFallbackAmbient.z, 0.0f); + base.dirCount = static_cast(std::min(lighting.lights.directionals.size(), size_t{4})); + for (int i = 0; i < base.dirCount; ++i) { + const auto& d = lighting.lights.directionals[i]; + const Vec3 c = srgbToLinear(Vec3(d.color.x, d.color.y, d.color.z)); + setVec4(base.dirData + i * 4, d.direction.x, d.direction.y, d.direction.z, d.intensity); + setVec4(base.dirColor + i * 4, c.x, c.y, c.z, 0.0f); + } + base.pointCount = static_cast(std::min(lighting.lights.points.size(), size_t{4})); + for (int i = 0; i < base.pointCount; ++i) { + const auto& p = lighting.lights.points[i]; + const Vec3 c = srgbToLinear(Vec3(p.color.x, p.color.y, p.color.z)); + setVec4(base.pointData + i * 4, p.position.x, p.position.y, p.position.z, p.radius); + setVec4(base.pointColor + i * 4, c.x, c.y, c.z, p.intensity); + } + base.spotCount = static_cast(std::min(lighting.lights.spots.size(), size_t{4})); + for (int i = 0; i < base.spotCount; ++i) { + const auto& s = lighting.lights.spots[i]; + const Vec3 c = srgbToLinear(Vec3(s.color.x, s.color.y, s.color.z)); + setVec4(base.spotData + i * 4, s.position.x, s.position.y, s.position.z, s.radius); + setVec4(base.spotDir + i * 4, s.direction.x, s.direction.y, s.direction.z, s.intensity); + setVec4(base.spotColor + i * 4, c.x, c.y, c.z, 0.0f); + const f32 halfAngle = std::clamp(s.angle * kPi / 180.0f * 0.5f, 0.01f, 1.5533f); + base.spotAngle[i * 4] = std::cos(halfAngle); + } + + const bool environmentOn = m_environment.texture() != nullptr && !wireframe; + const Vec3 irradiance = + environmentOn ? m_environment.averageColor() * m_environmentExposure : kFallbackAmbient; + setVec4(base.iblColor, irradiance.x, irradiance.y, irradiance.z, features.iblSpecular); + base.iblParams[0] = features.iblDiffuse; + base.iblParams[1] = (features.iblEnabled && !wireframe) ? 1.0f : 0.0f; + base.iblParams[3] = features.volumetricAnisotropy; + base.extra[0] = features.volumetricShadows ? 1.0f : 0.0f; + base.extra[1] = 6.0f; + base.extra[2] = environmentOn ? std::max(m_environmentExposure, 0.0f) : 0.0f; + base.extra[3] = environmentOn + ? static_cast(m_environment.mipCount() > 0 ? m_environment.mipCount() - 1 : 0) + : 0.0f; + base.volParams[0] = features.volumetrics == VolumetricQuality::Off ? 0.0f : 1.0f; + base.volParams[1] = features.volumetricDensity; + base.volParams[2] = features.volumetricHeight; + base.volParams[3] = features.volumetrics == VolumetricQuality::Medium ? 12.0f + : features.volumetrics == VolumetricQuality::Low ? 6.0f + : 0.0f; + const bool planarOn = m_reflectionValid && m_reflectionColor && !m_inReflectionPass && + !options.clipBelowEnabled && + features.reflections == ReflectionMode::Planar; + base.reflectParams[0] = planarOn ? features.reflectionIntensity : 0.0f; + base.reflectParams[1] = options.clipBelowEnabled ? options.clipBelowY : features.reflectionPlaneY; + base.reflectParams[2] = options.clipBelowEnabled ? 1.0f : 0.0f; + base.reflectParams[3] = 0.5f; + std::memcpy(base.reflectVP, m_reflectionVP.data(), sizeof(base.reflectVP)); + + ViewTargets* view = pass.view; + const bool historyOn = view && view->hasPrevious && !m_inReflectionPass; + const bool ssrOn = historyOn && pass.ssrSteps > 0 && !wireframe; + setVec4(base.ssrParams, pass.ssrIntensity, pass.ssrMaxRoughness, + static_cast(pass.ssrSteps), pass.ssrMaxDistance); + if (historyOn) { + base.projParams[0] = view->prevProj(2, 2); + base.projParams[1] = view->prevProj(2, 3); + std::memcpy(base.prevViewProj, view->prevViewProj.data(), sizeof(base.prevViewProj)); + std::memcpy(base.prevView, view->prevView.data(), sizeof(base.prevView)); + } + base.screen[0] = 1.0f / static_cast(std::max(view ? view->width : 1u, 1u)); + base.screen[1] = 1.0f / static_cast(std::max(view ? view->height : 1u, 1u)); + base.screen[2] = static_cast(view ? view->frameIndex % 64u : 0u); + std::memcpy(base.viewProj, pass.viewProj.data(), sizeof(base.viewProj)); + + RHI::Texture* prevColor = historyOn ? view->color[view->current ^ 1u] : whiteTex; + RHI::Texture* prevDepth = historyOn ? view->depth[view->current ^ 1u] : whiteTex; + RHI::Texture* opaqueScene = + (pass.opaqueCopyBound && view && view->opaqueCopy) ? view->opaqueCopy : whiteTex; + RHI::Texture* reflectionTex = planarOn ? m_reflectionColor : whiteTex; + RHI::Texture* envTex = m_environment.texture() ? m_environment.texture() : whiteTex; ECS::Entity lastTerrainTexEntity = ECS::Entity::INVALID; u32 lastTerrainTexTier = ~0u; - for (const auto& draw : draws) { - if (!draw.mesh || draw.mesh->indices.empty()) continue; + for (const MeshDraw* drawPtr : draws) { + const MeshDraw& draw = *drawPtr; + if (draw.skipColorDraw || !draw.mesh || draw.mesh->indices.empty()) continue; if (!draw.mesh->vertexBuffer || !draw.mesh->indexBuffer) continue; - if (wireframeMeshes) { - cmd->bindPipeline(m_wireframePipeline); - } else if (draw.isTerrain && m_terrainPipeline) { - cmd->bindPipeline(m_terrainPipeline); - } else { - cmd->bindPipeline(m_scenePipeline); - } - - LightingUBO lights{}; - lights.cameraPos[0] = cameraPos.x; - lights.cameraPos[1] = cameraPos.y; - lights.cameraPos[2] = cameraPos.z; - if (wireframeMeshes) { - lights.ambient[0] = 0.72f; - lights.ambient[1] = 0.78f; - lights.ambient[2] = 0.88f; - lights.albedo[0] = 0.55f; - lights.albedo[1] = 0.62f; - lights.albedo[2] = 0.74f; - lights.metallic = 0.0f; + CF_PROFILE_SCOPE(draw.isTerrain ? "GpuSceneRenderer::terrain" : "GpuSceneRenderer::mesh"); + RHI::Pipeline* pipeline = basePipeline; + if (wireframe) pipeline = m_wireframePipeline; + else if (draw.isTerrain && m_terrainPipeline) pipeline = m_terrainPipeline; + cmd->bindPipeline(pipeline); + + LightingUBO lights = base; + const u32 texTier = textureQualityTier(draw.viewerDistance, options.textureQuality); + if (wireframe) { + setVec4(lights.ambient, 0.45f, 0.52f, 0.66f, 0.0f); + setVec4(lights.albedo, 0.30f, 0.36f, 0.48f, 1.0f); lights.roughness = 1.0f; - lights.shininess = 1.0f; - lights.flags[0] = 0.0f; - lights.flags[1] = 0.0f; + lights.reflectance = 0.04f; lights.dirCount = 0; lights.pointCount = 0; lights.spotCount = 0; + setVec4(lights.uvTransform, 1.0f, 1.0f, 0.0f, 0.0f); + setVec4(lights.materialParams, 1.0f, 1.0f, 0.0f, 0.5f); } else { - lights.ambient[0] = draw.isTerrain ? 0.28f : 0.32f; - lights.ambient[1] = draw.isTerrain ? 0.28f : 0.32f; - lights.ambient[2] = draw.isTerrain ? 0.30f : 0.34f; - lights.albedo[0] = draw.albedo.x; - lights.albedo[1] = draw.albedo.y; - lights.albedo[2] = draw.albedo.z; + setVec4(lights.albedo, draw.albedo.x, draw.albedo.y, draw.albedo.z, draw.albedo.w); lights.metallic = draw.metallic; lights.roughness = draw.roughness; - lights.shininess = draw.shininess; + lights.reflectance = draw.reflectance; lights.flags[0] = draw.receiveShadows ? 1.0f : 0.0f; lights.flags[1] = draw.customNormalPath.empty() ? 0.0f : 1.0f; - - lights.dirCount = static_cast(std::min(lighting.lights.directionals.size(), size_t{4})); - for (int i = 0; i < lights.dirCount; ++i) { - const auto& d = lighting.lights.directionals[i]; - lights.dirData[i * 4 + 0] = d.direction.x; - lights.dirData[i * 4 + 1] = d.direction.y; - lights.dirData[i * 4 + 2] = d.direction.z; - lights.dirData[i * 4 + 3] = d.intensity; - lights.dirColor[i * 4 + 0] = d.color.x; - lights.dirColor[i * 4 + 1] = d.color.y; - lights.dirColor[i * 4 + 2] = d.color.z; - } - - lights.pointCount = static_cast(std::min(lighting.lights.points.size(), size_t{4})); - for (int i = 0; i < lights.pointCount; ++i) { - const auto& p = lighting.lights.points[i]; - lights.pointData[i * 4 + 0] = p.position.x; - lights.pointData[i * 4 + 1] = p.position.y; - lights.pointData[i * 4 + 2] = p.position.z; - lights.pointData[i * 4 + 3] = p.radius; - lights.pointColor[i * 4 + 0] = p.color.x; - lights.pointColor[i * 4 + 1] = p.color.y; - lights.pointColor[i * 4 + 2] = p.color.z; - lights.pointColor[i * 4 + 3] = p.intensity; - } - - lights.spotCount = static_cast(std::min(lighting.lights.spots.size(), size_t{4})); - for (int i = 0; i < lights.spotCount; ++i) { - const auto& s = lighting.lights.spots[i]; - lights.spotData[i * 4 + 0] = s.position.x; - lights.spotData[i * 4 + 1] = s.position.y; - lights.spotData[i * 4 + 2] = s.position.z; - lights.spotData[i * 4 + 3] = s.radius; - lights.spotDir[i * 4 + 0] = s.direction.x; - lights.spotDir[i * 4 + 1] = s.direction.y; - lights.spotDir[i * 4 + 2] = s.direction.z; - lights.spotDir[i * 4 + 3] = s.intensity; - lights.spotColor[i * 4 + 0] = s.color.x; - lights.spotColor[i * 4 + 1] = s.color.y; - lights.spotColor[i * 4 + 2] = s.color.z; - const f32 halfAngle = - std::clamp(s.angle * 3.14159265f / 180.0f * 0.5f, 0.01f, 1.5533f); - lights.spotAngle[i * 4 + 0] = std::cos(halfAngle); + lights.flags[2] = (planarOn && draw.planarReceiver) ? 1.0f : 0.0f; + lights.flags[3] = draw.ormMapPath.empty() ? 0.0f : 1.0f; + setVec4(lights.emission, draw.emission.x, draw.emission.y, draw.emission.z, 0.0f); + setVec4(lights.uvTransform, draw.uvTiling.x, draw.uvTiling.y, draw.uvOffset.x, + draw.uvOffset.y); + f32 thickness = 0.5f; + if (draw.hasAabb) { + const Vec3 extent = draw.aabbMax - draw.aabbMin; + thickness = std::max(0.01f, std::min(extent.x, std::min(extent.y, extent.z)) * 0.5f); } + setVec4(lights.materialParams, draw.normalStrength, draw.aoStrength, thickness, + draw.alphaCutoff); + setVec4(lights.coat, draw.clearcoat, draw.clearcoatRoughness, draw.ior, + draw.transmission); + setVec4(lights.sheen, draw.sheenColor.x, draw.sheenColor.y, draw.sheenColor.z, + draw.sheenRoughness); + setVec4(lights.iridescence, draw.iridescence, draw.iridescenceThickness, + draw.iridescenceIor, 0.0f); + setVec4(lights.materialFlags, static_cast(draw.alphaMode), + draw.emissionMapPath.empty() ? 0.0f : 1.0f, pass.opaqueCopyBound ? 1.0f : 0.0f, + ssrOn ? 1.0f : 0.0f); } - if (!wireframeMeshes && draw.isTerrain) { - // Terrain is matte: no Phong specular (shininess is ignored in terrain_lit.frag). + if (!wireframe && draw.isTerrain) { lights.roughness = 1.0f; - lights.shininess = 1.0f; + lights.reflectance = 0.04f; TerrainMaterialUBO mat{}; if (draw.terrainSettings) { mat.worldSize[0] = draw.terrainSettings->worldSizeX; @@ -827,8 +1118,6 @@ u32 GpuSceneRenderer::renderMeshes(RHI::CommandBuffer* cmd, const std::vectoruseSplatmap) { mat.flags[0] = 1.0f; } else if (gpu && (!gpu->cachedAlbedoPath.empty() || gpu->albedo)) { @@ -838,54 +1127,43 @@ u32 GpuSceneRenderer::renderMeshes(RHI::CommandBuffer* cmd, const std::vectorbindTexture(whiteTex, slot, m_repeatSampler); } if (gpu && gpu->useSplatmap) { - if (gpu->splatMap) { - cmd->bindTexture(gpu->splatMap, 0, m_sampler); - } + if (gpu->splatMap) cmd->bindTexture(gpu->splatMap, 0, m_sampler); for (u32 i = 0; i < ECS::kTerrainSplatLayerCount; ++i) { RHI::Texture* layerTex = whiteTex; if (!gpu->cachedLayerPaths[i].empty()) { layerTex = texCache.acquire(m_device, gpu->cachedLayerPaths[i], - projectRoot, texTier); + projectRoot, texTier, true); } else if (gpu->layers[i]) { layerTex = gpu->layers[i]; } - if (layerTex) { - cmd->bindTexture(layerTex, 1 + i, m_repeatSampler); - } + if (layerTex) cmd->bindTexture(layerTex, 1 + i, m_repeatSampler); } } else if (gpu) { RHI::Texture* albedoTex = whiteTex; if (!gpu->cachedAlbedoPath.empty()) { - albedoTex = - texCache.acquire(m_device, gpu->cachedAlbedoPath, projectRoot, texTier); + albedoTex = texCache.acquire(m_device, gpu->cachedAlbedoPath, projectRoot, + texTier, true); } else if (gpu->albedo) { albedoTex = gpu->albedo; } - if (albedoTex) { - cmd->bindTexture(albedoTex, 4, m_repeatSampler); - } + if (albedoTex) cmd->bindTexture(albedoTex, 4, m_repeatSampler); } if (gpu) { RHI::Texture* normalTex = nullptr; if (!gpu->cachedNormalPath.empty()) { - normalTex = - texCache.acquire(m_device, gpu->cachedNormalPath, projectRoot, texTier); + normalTex = texCache.acquire(m_device, gpu->cachedNormalPath, projectRoot, + texTier); } else if (gpu->normalMap) { normalTex = gpu->normalMap; } - if (normalTex) { - cmd->bindTexture(normalTex, 5, m_repeatSampler); - } + if (normalTex) cmd->bindTexture(normalTex, 5, m_repeatSampler); } } bindShadowTextures(6, 8, 10); @@ -893,64 +1171,109 @@ u32 GpuSceneRenderer::renderMeshes(RHI::CommandBuffer* cmd, const std::vectorpushUniformData(RHI::ShaderStage::Vertex, 0, &vubo, sizeof(vubo)); cmd->bindVertexBuffer(draw.mesh->vertexBuffer); cmd->bindIndexBuffer(draw.mesh->indexBuffer); - auto drawMeshRange = [&](u32 firstIndex, u32 indexCount, u32 materialIndex) { - if (indexCount == 0) return; + if (draw.isTerrain) { + if (wireframe) { + for (u32 slot = 0; slot < 6; ++slot) { + if (whiteTex) cmd->bindTexture(whiteTex, slot, m_repeatSampler); + } + bindShadowTextures(6, 8, 10); + } + cmd->pushUniformData(RHI::ShaderStage::Fragment, 0, &lights, sizeof(lights)); + cmd->drawIndexed(static_cast(draw.mesh->indices.size())); + continue; + } - if (wireframeMeshes) { - bindShadowTextures(2, 4, 6); - if (whiteTex) { - cmd->bindTexture(whiteTex, 0, m_sampler); - cmd->bindTexture(whiteTex, 1, m_sampler); + // Per-object probe, else sky. + RHI::Texture* probeTex = fallbackCube; + if (!m_inReflectionPass && !wireframe && draw.probeIndex >= 0 && + static_cast(draw.probeIndex) < m_probes.size()) { + const ReflectionProbe& probe = m_probes[static_cast(draw.probeIndex)]; + if (probe.valid && probe.cube) { + probeTex = probe.cube; + lights.iblParams[2] = 1.0f; + lights.projParams[2] = static_cast(probe.mipLevels > 0 ? probe.mipLevels - 1 : 0); + } + } + + bindShadowTextures(2, 4, 6); + if (reflectionTex) cmd->bindTexture(reflectionTex, 8, m_sampler); + if (probeTex) cmd->bindTexture(probeTex, 9, m_sampler); + if (envTex) cmd->bindTexture(envTex, 11, m_repeatSampler); + if (prevColor) cmd->bindTexture(prevColor, 12, m_sampler); + if (prevDepth) cmd->bindTexture(prevDepth, 13, m_pointSampler); + if (opaqueScene) cmd->bindTexture(opaqueScene, 15, m_sampler); + + RHI::Texture* normalTex = whiteTex; + RHI::Texture* ormTex = whiteTex; + RHI::Texture* emissionTex = whiteTex; + if (!wireframe) { + if (!draw.customNormalPath.empty()) { + if (RHI::Texture* t = texCache.acquire(m_device, draw.customNormalPath, projectRoot, texTier)) { + normalTex = t; + } + } + if (!draw.ormMapPath.empty()) { + if (RHI::Texture* t = texCache.acquire(m_device, draw.ormMapPath, projectRoot, texTier)) { + ormTex = t; } - } else if (!draw.isTerrain) { - bindShadowTextures(2, 4, 6); - const u32 texTier = - textureQualityTier(draw.viewerDistance, options.textureQuality); + } + if (!draw.emissionMapPath.empty()) { + if (RHI::Texture* t = texCache.acquire(m_device, draw.emissionMapPath, projectRoot, + texTier, true)) { + emissionTex = t; + } + } + } + if (normalTex) cmd->bindTexture(normalTex, 1, m_repeatSampler); + if (ormTex) cmd->bindTexture(ormTex, 10, m_repeatSampler); + if (emissionTex) cmd->bindTexture(emissionTex, 14, m_repeatSampler); + + auto drawMeshRange = [&](u32 firstIndex, u32 indexCount, u32 materialIndex) { + if (indexCount == 0) return; + LightingUBO rangeLights = lights; + RHI::Texture* albedoTex = whiteTex; + if (!wireframe) { const ResolvedMeshAlbedo albedo = resolveMeshAlbedo(m_device, draw.mesh, draw.meshPath, projectRoot, draw.customTexturePath, materialIndex, texTier); - lights.albedo[0] = draw.albedo.x * albedo.factor.x; - lights.albedo[1] = draw.albedo.y * albedo.factor.y; - lights.albedo[2] = draw.albedo.z * albedo.factor.z; - if (!draw.mesh->materials.empty() && - materialIndex < draw.mesh->materials.size()) { - lights.metallic = albedo.metallic; - lights.roughness = albedo.roughness; - } - - RHI::Texture* albedoTex = albedo.texture ? albedo.texture : whiteTex; - if (albedoTex) cmd->bindTexture(albedoTex, 0, m_repeatSampler); - RHI::Texture* normalTex = whiteTex; - if (!draw.customNormalPath.empty()) { - normalTex = GpuTextureCache::instance().acquire( - m_device, draw.customNormalPath, projectRoot, texTier); - } - if (normalTex) { - cmd->bindTexture(normalTex, 1, m_repeatSampler); + const Vec4 factor = draw.hasAuthoredMaterial ? Vec4(1.0f, 1.0f, 1.0f, 1.0f) : albedo.factor; + rangeLights.albedo[0] = draw.albedo.x * factor.x; + rangeLights.albedo[1] = draw.albedo.y * factor.y; + rangeLights.albedo[2] = draw.albedo.z * factor.z; + rangeLights.albedo[3] = draw.albedo.w * factor.w; + if (!draw.hasAuthoredMaterial && materialIndex < draw.mesh->materials.size()) { + rangeLights.metallic = albedo.metallic; + rangeLights.roughness = albedo.roughness; } + if (albedo.texture) albedoTex = albedo.texture; + } + if (albedoTex) cmd->bindTexture(albedoTex, 0, m_repeatSampler); + cmd->pushUniformData(RHI::ShaderStage::Fragment, 0, &rangeLights, sizeof(rangeLights)); + + const bool instanced = !wireframe && draw.batchCount > 1 && m_instancedPipeline && + m_instanceBuffer; + if (instanced) { + VertexUBO instUbo{}; + std::memcpy(instUbo.mvp, pass.viewProj.data(), sizeof(instUbo.mvp)); + cmd->bindPipeline(m_instancedPipeline); + cmd->pushUniformData(RHI::ShaderStage::Vertex, 0, &instUbo, sizeof(instUbo)); + cmd->bindVertexBuffer(draw.mesh->vertexBuffer, 0); + cmd->bindVertexBuffer(m_instanceBuffer, 1, draw.batchByteOffset); + cmd->bindIndexBuffer(draw.mesh->indexBuffer); + cmd->drawIndexedInstanced(indexCount, draw.batchCount, firstIndex, 0, 0); + } else { + cmd->drawIndexed(indexCount, firstIndex, 0); } - - cmd->pushUniformData(RHI::ShaderStage::Fragment, 0, &lights, sizeof(lights)); - cmd->drawIndexed(indexCount, firstIndex, 0); }; - if (draw.isTerrain) { - if (wireframeMeshes) { - for (u32 slot = 0; slot < 6; ++slot) { - if (whiteTex) cmd->bindTexture(whiteTex, slot, m_repeatSampler); - } - bindShadowTextures(6, 8, 10); - } - cmd->pushUniformData(RHI::ShaderStage::Fragment, 0, &lights, sizeof(lights)); - cmd->drawIndexed(static_cast(draw.mesh->indices.size())); - } else if (draw.mesh->subMeshes.size() > 1) { + if (draw.mesh->subMeshes.size() > 1) { for (const Assets::SubMesh& submesh : draw.mesh->subMeshes) { drawMeshRange(submesh.indexOffset, submesh.indexCount, submesh.materialIndex); } @@ -959,11 +1282,139 @@ u32 GpuSceneRenderer::renderMeshes(RHI::CommandBuffer* cmd, const std::vectorsubMeshes.empty() ? 0u : draw.mesh->subMeshes[0].materialIndex; drawMeshRange(0, static_cast(draw.mesh->indices.size()), materialIndex); } - ++drawnMeshes; } +} + +u32 GpuSceneRenderer::renderMeshes(RHI::CommandBuffer* cmd, const std::vector& draws, + const GpuSceneCamera& camera, + const Scene::SceneLighting& lighting, + RHI::Texture* colorTarget, RHI::Texture* depthTarget, + u32 width, u32 height, const std::string& projectRoot, + const GpuSceneRenderOptions& options, ScenePassContext& pass) { + Caffeine::Debug::setCrashBreadcrumb("GpuSceneRenderer::renderMeshes"); + if (!m_scenePipeline || !m_wireframePipeline || !colorTarget || !depthTarget) return 0; + const bool wireframe = options.wireframeMeshes; - cmd->endRenderPass(); - return drawnMeshes; + SceneShadowUBO shadowUbo{}; + std::memcpy(shadowUbo.cameraView, camera.view.data(), sizeof(shadowUbo.cameraView)); + for (u32 slot = 0; slot < GpuDirectionalShadowMap::kMaxDirectionalShadowLights; ++slot) { + if (!m_directionalShadows.valid(slot)) continue; + const u32 cascades = m_directionalShadows.cascadeCount(slot); + for (u32 c = 0; c < cascades; ++c) { + std::memcpy(shadowUbo.dirShadowVP + (slot * 4 + c) * 16, + m_directionalShadows.cascadeVP(slot, c).data(), sizeof(float) * 16); + } + const f32* splits = m_directionalShadows.cascadeSplits(slot); + shadowUbo.dirCascadeSplits[slot * 4 + 0] = splits[1]; + shadowUbo.dirCascadeSplits[slot * 4 + 1] = splits[2]; + shadowUbo.dirCascadeSplits[slot * 4 + 2] = splits[3]; + shadowUbo.dirCascadeSplits[slot * 4 + 3] = static_cast(cascades); + shadowUbo.dirShadowValid[slot] = 1.0f; + } + for (u32 slot = 0; slot < GpuPointShadowMap::kMaxPointShadowLights; ++slot) { + if (!m_pointShadows.valid(slot)) continue; + const Vec3 pos = m_pointShadows.lightPosition(slot); + shadowUbo.pointShadowPos[slot * 4 + 0] = pos.x; + shadowUbo.pointShadowPos[slot * 4 + 1] = pos.y; + shadowUbo.pointShadowPos[slot * 4 + 2] = pos.z; + shadowUbo.pointShadowRadius[slot] = m_pointShadows.radius(slot); + shadowUbo.pointShadowValid[slot] = 1.0f; + } + for (u32 slot = 0; slot < GpuSpotShadowMap::kMaxSpotShadowLights; ++slot) { + if (!m_spotShadows.valid(slot)) continue; + const Vec3 pos = m_spotShadows.lightPosition(slot); + std::memcpy(shadowUbo.spotShadowVP + slot * 16, m_spotShadows.lightVP(slot).data(), + sizeof(float) * 16); + shadowUbo.spotShadowPos[slot * 4 + 0] = pos.x; + shadowUbo.spotShadowPos[slot * 4 + 1] = pos.y; + shadowUbo.spotShadowPos[slot * 4 + 2] = pos.z; + shadowUbo.spotShadowParams[slot * 4 + 0] = m_spotShadows.radius(slot); + shadowUbo.spotShadowParams[slot * 4 + 1] = m_spotShadows.cosHalfAngle(slot); + shadowUbo.spotShadowValid[slot] = 1.0f; + } + + std::vector opaque; + std::vector translucent; + opaque.reserve(draws.size()); + bool anyTransmission = false; + for (const MeshDraw& draw : draws) { + if (draw.skipColorDraw) continue; + if (!wireframe && draw.isTranslucent()) { + translucent.push_back(&draw); + anyTransmission = anyTransmission || draw.transmission > 0.0f; + } else { + opaque.push_back(&draw); + } + } + + RHI::RenderPassDesc rp; + rp.colorTarget = colorTarget; + rp.depthTarget = depthTarget; + rp.colorLayer = options.colorLayer; + rp.clearColor[0] = 0.0f; + rp.clearColor[1] = 0.0f; + rp.clearColor[2] = 0.0f; + rp.clearColor[3] = 0.0f; + rp.clearDepth = true; + rp.cycle = pass.cycleTargets; + + { + CF_PROFILE_SCOPE("GpuSceneRenderer::opaque"); + cmd->beginRenderPass(rp); + cmd->setViewport(0, 0, static_cast(width), static_cast(height)); + cmd->pushUniformData(RHI::ShaderStage::Fragment, 1, &shadowUbo, sizeof(shadowUbo)); + drawMeshList(cmd, opaque, camera, lighting, projectRoot, options, pass, + wireframe ? m_wireframePipeline : m_scenePipeline); + if (options.drawSky) drawSky(cmd, camera, height); + if (options.grid.enabled) drawGrid(cmd, camera, options.grid); + cmd->endRenderPass(); + } + + if (!translucent.empty()) { + CF_PROFILE_SCOPE("GpuSceneRenderer::translucent"); + auto distanceSq = [&](const MeshDraw* d) { + const Vec3 center = d->hasAabb ? (d->aabbMin + d->aabbMax) * 0.5f + : d->worldMatrix.transformPoint(Vec3(0.0f, 0.0f, 0.0f)); + return (center - camera.position).lengthSquared(); + }; + std::sort(translucent.begin(), translucent.end(), + [&](const MeshDraw* a, const MeshDraw* b) { return distanceSq(a) > distanceSq(b); }); + + if (anyTransmission && pass.view && pass.view->opaqueCopy && options.colorLayer == 0 && + colorTarget == pass.view->color[pass.view->current]) { + cmd->copyTexture(colorTarget, pass.view->opaqueCopy, width, height); + pass.opaqueCopyBound = true; + } + + RHI::RenderPassDesc rp2 = rp; + rp2.loadColor = true; + rp2.clearDepth = false; + rp2.cycle = false; + cmd->beginRenderPass(rp2); + cmd->setViewport(0, 0, static_cast(width), static_cast(height)); + cmd->pushUniformData(RHI::ShaderStage::Fragment, 1, &shadowUbo, sizeof(shadowUbo)); + // Back to front; transmissive surfaces write depth and composite the copied scene, + // alpha-blended ones are premultiplied over what is already there. + std::vector run; + bool runTransmissive = false; + auto flush = [&]() { + if (run.empty()) return; + drawMeshList(cmd, run, camera, lighting, projectRoot, options, pass, + runTransmissive ? m_scenePipeline : m_blendPipeline); + run.clear(); + }; + for (const MeshDraw* d : translucent) { + const bool transmissive = d->transmission > 0.0f; + if (!run.empty() && transmissive != runTransmissive) flush(); + runTransmissive = transmissive; + run.push_back(d); + } + flush(); + cmd->endRenderPass(); + pass.opaqueCopyBound = false; + } + + return static_cast(opaque.size() + translucent.size()); } std::vector GpuSceneRenderer::gatherMeshDraws( @@ -982,6 +1433,7 @@ std::vector GpuSceneRenderer::gatherMeshDraws( q.with(); world.forEach(q, [&](ECS::Entity entity, ECS::MeshFilterComponent& filter) { if (Scene::isEffectivelyDisabled(world, entity)) return; + if (options.excludeEntity.isValid() && entity == options.excludeEntity) return; const Mat4 worldMatrix = entityMatrix(world, entity); if (auto* terrain = world.get(entity)) { @@ -1002,6 +1454,7 @@ std::vector GpuSceneRenderer::gatherMeshDraws( draw.castShadows = terrain->castShadows; draw.receiveShadows = terrain->receiveShadows; draw.shininess = terrain->shininess; + draw.roughness = 1.0f; if (auto* renderer = world.get(entity)) { draw.receiveShadows = renderer->receiveShadows; } @@ -1025,8 +1478,9 @@ std::vector GpuSceneRenderer::gatherMeshDraws( if (!mesh || mesh->vertices.empty()) return; const Vec3 bsz = mesh->bounds.max - mesh->bounds.min; + Spatial::AABB3D aabb; + bool hasAabb = false; if (bsz.lengthSquared() > 1e-6f) { - Spatial::AABB3D aabb; const Vec3 c[2] = {mesh->bounds.min, mesh->bounds.max}; aabb.min = Vec3(1e30f, 1e30f, 1e30f); aabb.max = Vec3(-1e30f, -1e30f, -1e30f); @@ -1043,12 +1497,19 @@ std::vector GpuSceneRenderer::gatherMeshDraws( } } } + hasAabb = true; if (!frustum.intersects(aabb)) return; } + const f32 sx = Vec3(worldMatrix(0, 0), worldMatrix(1, 0), worldMatrix(2, 0)).length(); + const f32 sy = Vec3(worldMatrix(0, 1), worldMatrix(1, 1), worldMatrix(2, 1)).length(); + const f32 sz = Vec3(worldMatrix(0, 2), worldMatrix(1, 2), worldMatrix(2, 2)).length(); + const f32 scale = std::max(sx, std::max(sy, sz)); + const f32 lodDistance = viewerDistanceFor(meshWorldCenter(worldMatrix, mesh)) / std::max(scale, 0.001f); + MeshDraw draw; draw.entity = entity; - draw.mesh = mesh; + draw.mesh = selectMeshLod(mesh, entity, lodDistance); draw.worldMatrix = worldMatrix; draw.castShadows = Scene::meshCastsShadows(world, entity); draw.receiveShadows = Scene::meshReceivesShadows(world, entity); @@ -1059,28 +1520,493 @@ std::vector GpuSceneRenderer::gatherMeshDraws( draw.shininess = filter.shininess; draw.customTexturePath = filter.customTexturePath; draw.customNormalPath = filter.customNormalPath; + if (!filter.customMaterialPath.empty()) { + const Assets::MaterialSurface surface = + Assets::MaterialCache::instance().resolve(filter.customMaterialPath, projectRoot); + if (surface.valid) { + draw.hasAuthoredMaterial = true; + const Vec3 albedo = srgbToLinear(Vec3(surface.albedo.x, surface.albedo.y, surface.albedo.z)); + draw.albedo = Vec4(albedo.x, albedo.y, albedo.z, std::clamp(surface.albedo.w, 0.0f, 1.0f)); + draw.metallic = std::clamp(surface.metallic, 0.0f, 1.0f); + draw.roughness = std::clamp(surface.roughness, 0.02f, 1.0f); + draw.reflectance = std::clamp(surface.reflectance, 0.0f, 1.0f); + draw.emission = srgbToLinear(surface.emission) * std::max(surface.emissionStrength, 0.0f); + if (draw.customTexturePath.empty()) draw.customTexturePath = surface.albedoMap; + if (draw.customNormalPath.empty()) draw.customNormalPath = surface.normalMap; + draw.ormMapPath = surface.ormMap; + draw.emissionMapPath = surface.emissionMap; + draw.uvTiling = surface.uvTiling; + draw.uvOffset = surface.uvOffset; + draw.normalStrength = surface.normalStrength; + draw.aoStrength = surface.aoStrength; + draw.alphaMode = static_cast(surface.alphaMode); + draw.alphaCutoff = surface.alphaCutoff; + draw.transmission = std::clamp(surface.transmission, 0.0f, 1.0f); + draw.ior = std::max(surface.ior, 1.0f); + draw.clearcoat = std::clamp(surface.clearcoat, 0.0f, 1.0f); + draw.clearcoatRoughness = std::clamp(surface.clearcoatRoughness, 0.02f, 1.0f); + draw.sheenColor = srgbToLinear(surface.sheenColor); + draw.sheenRoughness = surface.sheenRoughness; + draw.iridescence = std::clamp(surface.iridescence, 0.0f, 1.0f); + draw.iridescenceThickness = surface.iridescenceThickness; + draw.iridescenceIor = surface.iridescenceIor; + if (draw.alphaMode == 0 && draw.albedo.w < 1.0f) draw.albedo.w = 1.0f; + } + } if (filter.primitive == ECS::MeshPrimitive::Custom) { const std::string& resolved = Assets::MeshCache::getInstance().getResolvedPath(); draw.meshPath = resolved.empty() ? filter.customMeshPath : resolved; } - draw.viewerDistance = viewerDistanceFor(meshWorldCenter(worldMatrix, mesh)); + draw.viewerDistance = lodDistance * std::max(scale, 0.001f); + draw.hasAabb = hasAabb; + if (hasAabb) { + draw.aabbMin = aabb.min; + draw.aabbMax = aabb.max; + } + const bool flat = (mesh->bounds.max.y - mesh->bounds.min.y) < 0.08f; + const f32 midY = (mesh->bounds.min.y + mesh->bounds.max.y) * 0.5f; + const f32 worldY = worldMatrix.transformPoint(Vec3(0.0f, midY, 0.0f)).y; + draw.planarReceiver = flat && options.features.reflections == ReflectionMode::Planar && + std::abs(worldY - options.features.reflectionPlaneY) < 0.4f; draws.push_back(draw); }); return draws; } -u32 GpuSceneRenderer::renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& world, - const GpuSceneCamera& camera, RHI::Texture* colorTarget, - RHI::Texture* depthTarget, u32 width, u32 height, - const std::string& projectRoot, - const GpuSceneRenderOptions& options) { - CF_PROFILE_SCOPE("GpuSceneRenderer::renderWithCamera"); - Caffeine::Debug::setCrashBreadcrumb("GpuSceneRenderer::renderWithCamera"); - if (!m_ready || !cmd || !colorTarget || !depthTarget || width < 1 || height < 1) return 0; +void GpuSceneRenderer::applyCoarseOcclusion(std::vector& draws, const GpuSceneCamera& camera, + const GpuSceneRenderOptions& options) const { + if (options.features.occlusion != OcclusionMode::Coarse || draws.size() < 2) return; + CF_PROFILE_SCOPE("GpuSceneRenderer::occlusion"); + std::vector prims(draws.size()); + for (u32 i = 0; i < draws.size(); ++i) { + prims[i].aabbMin = draws[i].aabbMin; + prims[i].aabbMax = draws[i].aabbMax; + if (!draws[i].hasAabb || draws[i].isTerrain) continue; + const f32 radius = (draws[i].aabbMax - draws[i].aabbMin).length() * 0.5f; + prims[i].canBeOccluded = true; + prims[i].canOcclude = radius >= options.features.occlusionMinRadius && !draws[i].isTranslucent(); + } + Vec3 forward = camera.focus - camera.position; + if (forward.lengthSquared() < 1e-8f) return; + forward = forward.normalized(); + const u32 maxOccluders = std::min(options.features.occlusionMaxOccluders, 16u); + const std::vector visible = visibleAfterCoarseOcclusion( + prims, camera.proj * camera.view, camera.position, forward, maxOccluders); + if (visible.size() == draws.size()) return; + std::vector kept; + kept.reserve(visible.size()); + for (u32 index : visible) kept.push_back(std::move(draws[index])); + draws.swap(kept); +} + +void GpuSceneRenderer::assignInstanceBatches(std::vector& draws, + const GpuSceneRenderOptions& options, + std::vector& instanceMatrices) const { + instanceMatrices.clear(); + for (MeshDraw& draw : draws) { + draw.batchCount = 1; + draw.skipColorDraw = false; + draw.batchByteOffset = 0; + } + if (!options.features.instancingEnabled || options.wireframeMeshes || !m_instancedPipeline) return; + + std::vector items(draws.size()); + for (u32 i = 0; i < draws.size(); ++i) { + const MeshDraw& draw = draws[i]; + const bool singleSubmesh = draw.mesh && draw.mesh->subMeshes.size() <= 1; + // Probed and translucent draws need per-object data (cube map, sort order). + items[i].allow = singleSubmesh && !draw.isTerrain && draw.probeIndex < 0 && + !draw.isTranslucent(); + u64 key = static_cast(reinterpret_cast(draw.mesh)); + auto mixBytes = [&](const std::string& text) { + for (unsigned char c : text) key = key * 131u + c; + }; + auto mixFloat = [&](f32 value) { + u32 bits = 0; + std::memcpy(&bits, &value, sizeof(bits)); + key = key * 131u + bits; + }; + mixBytes(draw.customTexturePath); + mixBytes(draw.customNormalPath); + mixBytes(draw.ormMapPath); + mixBytes(draw.emissionMapPath); + mixFloat(draw.albedo.x); + mixFloat(draw.albedo.y); + mixFloat(draw.albedo.z); + mixFloat(draw.albedo.w); + mixFloat(draw.metallic); + mixFloat(draw.roughness); + mixFloat(draw.reflectance); + mixFloat(draw.emission.x); + mixFloat(draw.emission.y); + mixFloat(draw.emission.z); + mixFloat(draw.uvTiling.x); + mixFloat(draw.uvTiling.y); + mixFloat(draw.uvOffset.x); + mixFloat(draw.uvOffset.y); + mixFloat(draw.normalStrength); + mixFloat(draw.aoStrength); + mixFloat(draw.clearcoat); + mixFloat(draw.clearcoatRoughness); + mixFloat(draw.sheenColor.x); + mixFloat(draw.sheenColor.y); + mixFloat(draw.sheenColor.z); + mixFloat(draw.sheenRoughness); + mixFloat(draw.iridescence); + mixFloat(draw.iridescenceThickness); + key = key * 131u + draw.alphaMode; + if (draw.receiveShadows) key ^= 0x9e3779b97f4a7c15ull; + items[i].key = key == 0 ? 1 : key; + } + const u32 limit = std::clamp(options.features.maxInstancesPerBatch, 2u, 256u); + const std::vector groups = buildInstanceBatches(items, limit); + for (const InstanceBatchGroup& group : groups) { + if (group.members.size() < 2) continue; + MeshDraw& head = draws[group.members.front()]; + head.batchCount = static_cast(group.members.size()); + head.batchByteOffset = static_cast(instanceMatrices.size() * sizeof(float)); + for (u32 n = 0; n < group.members.size(); ++n) { + const float* matrix = draws[group.members[n]].worldMatrix.data(); + instanceMatrices.insert(instanceMatrices.end(), matrix, matrix + 16); + if (n > 0) draws[group.members[n]].skipColorDraw = true; + } + } +} + +bool GpuSceneRenderer::ensureReflectionTargets(u32 width, u32 height) { + if (m_reflectionColor && m_reflectionDepth && m_reflectionWidth == width && + m_reflectionHeight == height) { + return true; + } + if (m_reflectionColor) m_device->destroyTexture(m_reflectionColor); + if (m_reflectionDepth) m_device->destroyTexture(m_reflectionDepth); + m_reflectionColor = nullptr; + m_reflectionDepth = nullptr; + RHI::TextureDesc colorDesc; + colorDesc.width = width; + colorDesc.height = height; + colorDesc.format = kHdrFormat; + colorDesc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; + RHI::TextureDesc depthDesc; + depthDesc.width = width; + depthDesc.height = height; + depthDesc.format = RHI::TextureFormat::D32_FLOAT; + depthDesc.usage = RHI::TextureUsage::DepthStencil; + m_reflectionColor = m_device->createTexture(colorDesc); + m_reflectionDepth = m_device->createTexture(depthDesc); + m_reflectionWidth = width; + m_reflectionHeight = height; + m_reflectionValid = false; + return m_reflectionColor && m_reflectionDepth; +} + +void GpuSceneRenderer::renderPlanarReflection(RHI::CommandBuffer* cmd, ECS::World& world, + const GpuSceneCamera& camera, u32 width, u32 height, + const std::string& projectRoot, + const GpuSceneRenderOptions& options) { + const f32 scale = std::clamp(options.features.reflectionResolutionScale, 0.25f, 1.0f); + const u32 rw = std::max(64u, static_cast(static_cast(width) * scale)); + const u32 rh = std::max(64u, static_cast(static_cast(height) * scale)); + if (!ensureReflectionTargets(rw, rh)) return; + + const f32 planeY = options.features.reflectionPlaneY; + auto mirrorY = [&](Vec3 p) { + p.y = planeY * 2.0f - p.y; + return p; + }; + GpuSceneCamera reflected = camera; + reflected.position = mirrorY(camera.position); + reflected.focus = mirrorY(camera.focus); + reflected.view = Mat4::lookAt(reflected.position, reflected.focus, Vec3(0.0f, -1.0f, 0.0f)); + const f32 aspect = static_cast(rw) / static_cast(std::max(rh, 1u)); + reflected.proj = Mat4::perspective(camera.fovRad, aspect, camera.nearClip, camera.farClip); + m_reflectionVP = reflected.proj * reflected.view; + + GpuSceneRenderOptions inner = options; + inner.features.reflections = ReflectionMode::Off; + inner.features.volumetrics = VolumetricQuality::Off; + inner.features.instancingEnabled = false; + inner.enableShadows = false; + inner.clipBelowEnabled = true; + inner.clipBelowY = planeY; + inner.cameraSettled = true; + inner.resolveFeaturesFromScene = false; + inner.resolveEnvironmentFromScene = false; + inner.colorLayer = 0; + inner.grid.enabled = false; + CF_PROFILE_SCOPE("GpuSceneRenderer::planarReflection"); + const bool wasInReflection = m_inReflectionPass; + m_inReflectionPass = true; + ScenePassContext innerPass; + renderSceneHdr(cmd, world, reflected, m_reflectionColor, m_reflectionDepth, rw, rh, projectRoot, + inner, innerPass); + m_inReflectionPass = wasInReflection; + m_reflectionValid = true; +} + +void GpuSceneRenderer::resolveEnvironment(ECS::World& world, const std::string& projectRoot, + const GpuSceneRenderOptions& options) { + std::string path = options.environmentPath; + f32 exposure = options.environmentExposure; + if (options.resolveEnvironmentFromScene) { + const Scene::ActiveSkybox sky = Scene::findActiveSkybox(world); + if (sky.component) { + path = Scene::resolveSkyboxTexturePath(*sky.component, projectRoot).string(); + exposure = sky.component->exposure; + } + } + m_environment.load(m_device, path); + m_environmentExposure = std::clamp(exposure, 0.0f, 8.0f); +} + +void GpuSceneRenderer::releaseProbe(ReflectionProbe& probe) { + if (m_device) { + if (probe.cube) m_device->destroyTexture(probe.cube); + if (probe.depth) m_device->destroyTexture(probe.depth); + } + probe = ReflectionProbe{}; +} + +bool GpuSceneRenderer::captureProbe(RHI::CommandBuffer* cmd, ECS::World& world, + ReflectionProbe& probe, const GpuSceneCamera& camera, + const std::string& projectRoot, + const GpuSceneRenderOptions& options) { + u32 resolution = 32; + while (resolution < std::clamp(options.features.probeResolution, 32u, 512u)) resolution <<= 1; + if (!probe.cube || !probe.depth || probe.resolution != resolution) { + if (probe.cube) m_device->destroyTexture(probe.cube); + if (probe.depth) m_device->destroyTexture(probe.depth); + RHI::TextureDesc cubeDesc; + cubeDesc.width = resolution; + cubeDesc.height = resolution; + cubeDesc.format = kHdrFormat; + cubeDesc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; + cubeDesc.type = RHI::TextureType::Cube; + cubeDesc.mipLevels = probeMipCount(resolution); + probe.cube = m_device->createTexture(cubeDesc); + RHI::TextureDesc depthDesc; + depthDesc.width = resolution; + depthDesc.height = resolution; + depthDesc.format = RHI::TextureFormat::D32_FLOAT; + depthDesc.usage = RHI::TextureUsage::DepthStencil; + probe.depth = m_device->createTexture(depthDesc); + probe.resolution = resolution; + probe.mipLevels = cubeDesc.mipLevels; + probe.valid = false; + if (!probe.cube || !probe.depth) return false; + } + + GpuSceneRenderOptions inner = options; + inner.features.reflections = ReflectionMode::Off; + inner.features.volumetrics = VolumetricQuality::Off; + inner.features.occlusion = OcclusionMode::Off; + inner.features.instancingEnabled = false; + inner.resolveFeaturesFromScene = false; + inner.resolveEnvironmentFromScene = false; + inner.enableShadows = false; + inner.cameraSettled = true; + inner.clipBelowEnabled = false; + inner.excludeEntity = probe.entity; + inner.grid.enabled = false; + inner.drawSky = true; + inner.textureQualityViewers.clear(); + + CF_PROFILE_SCOPE("GpuSceneRenderer::probe"); + const bool wasInReflection = m_inReflectionPass; + m_inReflectionPass = true; + for (u32 face = 0; face < 6; ++face) { + GpuSceneCamera faceCam; + faceCam.position = probe.origin; + faceCam.fovRad = kPi * 0.5f; + faceCam.nearClip = 0.05f; + faceCam.farClip = camera.farClip; + cubeFaceCamera(probe.origin, face, faceCam.nearClip, faceCam.farClip, faceCam.view, + faceCam.proj, faceCam.focus); + inner.colorLayer = face; + ScenePassContext innerPass; + innerPass.cycleTargets = false; + renderSceneHdr(cmd, world, faceCam, probe.cube, probe.depth, resolution, resolution, + projectRoot, inner, innerPass); + } + m_inReflectionPass = wasInReflection; + if (probe.mipLevels > 1) cmd->generateMipmaps(probe.cube); + probe.valid = true; + return true; +} + +void GpuSceneRenderer::updateReflectionProbes(RHI::CommandBuffer* cmd, ECS::World& world, + std::vector& draws, + const GpuSceneCamera& camera, + const std::string& projectRoot, + const GpuSceneRenderOptions& options, + u64 sceneHash, bool allowCapture) { + for (MeshDraw& draw : draws) draw.probeIndex = -1; + const RenderFeatureSettings& features = options.features; + const u32 maxProbes = std::min(features.maxReflectionProbes, 16u); + if (features.reflections != ReflectionMode::Probe || maxProbes == 0 || options.wireframeMeshes) { + return; + } + + struct Candidate { + ECS::Entity entity; + Vec3 center; + f32 distanceSq = 0.0f; + }; + std::vector candidates; + for (const MeshDraw& draw : draws) { + if (!draw.isGlossy() || !draw.hasAabb) continue; + const bool seen = std::any_of(candidates.begin(), candidates.end(), + [&](const Candidate& c) { return c.entity == draw.entity; }); + if (seen) continue; + const Vec3 center = (draw.aabbMin + draw.aabbMax) * 0.5f; + candidates.push_back({draw.entity, center, (center - camera.position).lengthSquared()}); + } + std::sort(candidates.begin(), candidates.end(), + [](const Candidate& a, const Candidate& b) { return a.distanceSq < b.distanceSq; }); + if (candidates.size() > maxProbes) candidates.resize(maxProbes); + + constexpr usize kMaxProbeSlots = 16; + std::vector selected; + for (const Candidate& candidate : candidates) { + i32 index = -1; + for (usize i = 0; i < m_probes.size(); ++i) { + if (m_probes[i].world == &world && m_probes[i].entity == candidate.entity) { + index = static_cast(i); + break; + } + } + if (index < 0) { + for (usize i = 0; i < m_probes.size(); ++i) { + if (!m_probes[i].entity.isValid()) { + index = static_cast(i); + break; + } + } + } + if (index < 0 && m_probes.size() < kMaxProbeSlots) { + m_probes.emplace_back(); + index = static_cast(m_probes.size() - 1); + } + if (index < 0) { + u64 oldest = m_frameCounter; + for (usize i = 0; i < m_probes.size(); ++i) { + if (m_probes[i].lastUsed < oldest) { + oldest = m_probes[i].lastUsed; + index = static_cast(i); + } + } + if (index < 0) break; + } + ReflectionProbe& probe = m_probes[static_cast(index)]; + if (probe.world != &world || probe.entity != candidate.entity) { + probe.world = &world; + probe.entity = candidate.entity; + probe.valid = false; + } + if ((probe.origin - candidate.center).lengthSquared() > 1e-4f) { + probe.origin = candidate.center; + probe.valid = false; + } + probe.lastUsed = m_frameCounter; + selected.push_back(index); + for (MeshDraw& draw : draws) { + if (draw.entity == candidate.entity) draw.probeIndex = index; + } + } + // Capture at most one probe per frame, nearest stale one first. + u32 stale = 0; + for (i32 index : selected) { + ReflectionProbe& probe = m_probes[static_cast(index)]; + if (probe.valid && probe.sceneHash == sceneHash) continue; + if (allowCapture && stale == 0 && captureProbe(cmd, world, probe, camera, projectRoot, options)) { + probe.sceneHash = sceneHash; + continue; + } + ++stale; + } + m_probesPending = m_probesPending || stale > 0; + + for (ReflectionProbe& probe : m_probes) { + if (probe.entity.isValid() && probe.lastUsed + 600 < m_frameCounter) releaseProbe(probe); + } +} + +GpuSceneRenderer::ViewTargets* GpuSceneRenderer::acquireViewTargets(u64 viewId, u32 width, + u32 height) { + auto create = [&](ViewTargets& view) -> bool { + view = ViewTargets{}; + view.viewId = viewId; + view.width = width; + view.height = height; + RHI::TextureDesc colorDesc; + colorDesc.width = width; + colorDesc.height = height; + colorDesc.format = kHdrFormat; + colorDesc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; + RHI::TextureDesc depthDesc; + depthDesc.width = width; + depthDesc.height = height; + depthDesc.format = RHI::TextureFormat::D32_FLOAT; + depthDesc.usage = RHI::TextureUsage::DepthStencil | RHI::TextureUsage::Sampler; + for (u32 i = 0; i < 2; ++i) { + view.color[i] = m_device->createTexture(colorDesc); + view.depth[i] = m_device->createTexture(depthDesc); + } + view.opaqueCopy = m_device->createTexture(colorDesc); + return view.color[0] && view.color[1] && view.depth[0] && view.depth[1] && view.opaqueCopy; + }; + + for (ViewTargets& view : m_views) { + if (view.viewId != viewId) continue; + if (view.width != width || view.height != height) { + releaseViewTargets(view); + if (!create(view)) return nullptr; + } + view.lastUsed = m_frameCounter; + return &view; + } + + ViewTargets* slot = nullptr; + if (m_views.size() < kMaxViewTargets) { + m_views.emplace_back(); + slot = &m_views.back(); + } else { + slot = &m_views.front(); + for (ViewTargets& view : m_views) { + if (view.lastUsed < slot->lastUsed) slot = &view; + } + releaseViewTargets(*slot); + } + if (!create(*slot)) { + releaseViewTargets(*slot); + return nullptr; + } + slot->lastUsed = m_frameCounter; + return slot; +} + +void GpuSceneRenderer::releaseViewTargets(ViewTargets& view) { + if (m_device) { + for (u32 i = 0; i < 2; ++i) { + if (view.color[i]) m_device->destroyTexture(view.color[i]); + if (view.depth[i]) m_device->destroyTexture(view.depth[i]); + } + if (view.opaqueCopy) m_device->destroyTexture(view.opaqueCopy); + } + const u64 id = view.viewId; + view = ViewTargets{}; + view.viewId = id; +} + +u32 GpuSceneRenderer::renderSceneHdr(RHI::CommandBuffer* cmd, ECS::World& world, + const GpuSceneCamera& camera, RHI::Texture* colorTarget, + RHI::Texture* depthTarget, u32 width, u32 height, + const std::string& projectRoot, + const GpuSceneRenderOptions& opts, ScenePassContext& pass) { const f32 aspect = static_cast(width) / static_cast(std::max(height, 1u)); - const Mat4 vp = camera.proj * camera.view; + pass.viewProj = camera.proj * camera.view; const Spatial::Frustum frustum = Spatial::Frustum::fromCamera( camera.position, camera.focus, Vec3(0.0f, 1.0f, 0.0f), camera.fovRad, aspect, camera.nearClip, camera.farClip); @@ -1088,9 +2014,8 @@ u32 GpuSceneRenderer::renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& worl std::vector draws; { CF_PROFILE_SCOPE("GpuSceneRenderer::gather"); - draws = gatherMeshDraws(world, camera.position, frustum, projectRoot, options); + draws = gatherMeshDraws(world, camera.position, frustum, projectRoot, opts); } - // Upload GPU buffers before any render pass. Creating/uploading buffers // while a pass is recording is a common NVIDIA driver SIGSEGV. draws.erase(std::remove_if(draws.begin(), draws.end(), @@ -1099,31 +2024,174 @@ u32 GpuSceneRenderer::renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& worl !draw.mesh->vertexBuffer || !draw.mesh->indexBuffer; }), draws.end()); - if (draws.empty()) return 0; + applyCoarseOcclusion(draws, camera, opts); + + if (pass.view) { + pass.sceneHash = hashProbeScene(draws, m_environment.path()); + const bool allowExpensive = + !opts.features.expensiveEffectsOnlyWhenSettled || opts.cameraSettled; + if (opts.features.reflections == ReflectionMode::Planar && !opts.wireframeMeshes) { + if (allowExpensive && !opts.clipBelowEnabled) { + renderPlanarReflection(cmd, world, camera, width, height, projectRoot, opts); + } + } else { + m_reflectionValid = false; + } + updateReflectionProbes(cmd, world, draws, camera, projectRoot, opts, pass.sceneHash, + allowExpensive); + } + + std::vector instanceMatrices; + assignInstanceBatches(draws, opts, instanceMatrices); + if (!instanceMatrices.empty() && m_instanceBuffer) { + m_device->uploadBuffer(m_instanceBuffer, instanceMatrices.data(), + instanceMatrices.size() * sizeof(float)); + } Scene::SceneLighting lighting; lighting.clear(); Scene::collectSceneLights(world, lighting.lights); - if (!options.wireframeMeshes && options.enableShadows) { + m_activeCascadeCount = opts.directionalCascadeCount; + if (!opts.wireframeMeshes && opts.enableShadows && !draws.empty()) { CF_PROFILE_SCOPE("GpuSceneRenderer::shadows"); renderDirectionalShadows(cmd, world, lighting, draws, camera); renderPointShadows(cmd, world, lighting, draws); renderSpotShadows(cmd, world, lighting, draws); } + CF_PROFILE_SCOPE("GpuSceneRenderer::draw"); + return renderMeshes(cmd, draws, camera, lighting, colorTarget, depthTarget, width, height, + projectRoot, opts, pass); +} + +ECS::PostProcessComponent GpuSceneRenderer::resolvePostProcess( + ECS::World& world, ECS::Entity camera, const ECS::PostProcessComponent& fallback) { + if (const ECS::PostProcessComponent* fx = findPostProcessForCamera(world, camera)) return *fx; + return fallback; +} + +u32 GpuSceneRenderer::renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& world, + const GpuSceneCamera& cameraIn, RHI::Texture* colorTarget, + RHI::Texture* depthTarget, u32 width, u32 height, + const std::string& projectRoot, + const GpuSceneRenderOptions& options) { + CF_PROFILE_SCOPE("GpuSceneRenderer::renderWithCamera"); + Caffeine::Debug::setCrashBreadcrumb("GpuSceneRenderer::renderWithCamera"); + (void)depthTarget; + if (!m_ready || !cmd || !colorTarget || width < 1 || height < 1) return 0; + ++m_frameCounter; + m_probesPending = false; + + GpuSceneRenderOptions opts = options; + if (options.resolveFeaturesFromScene) opts.features = resolveForwardRenderFeatures(world); + resolveEnvironment(world, projectRoot, opts); + const ECS::PostProcessComponent post = + opts.resolvePostProcessFromScene + ? resolvePostProcess(world, opts.postProcessCamera, opts.postProcess) + : opts.postProcess; + + const f32 scale = std::clamp(opts.renderScale, 0.25f, 2.0f); + const u32 sceneW = std::max(1u, static_cast(std::lround(static_cast(width) * scale))); + const u32 sceneH = std::max(1u, static_cast(std::lround(static_cast(height) * scale))); + const u64 viewId = opts.viewId ? opts.viewId : static_cast(reinterpret_cast(colorTarget)); + ViewTargets* view = acquireViewTargets(viewId, sceneW, sceneH); + if (!view) return 0; + + // A large jump between frames is a camera cut: history would smear. + if (view->hasPrevious && (cameraIn.position - view->prevCameraPos).lengthSquared() > 25.0f) { + view->hasPrevious = false; + } + + GpuSceneCamera camera = cameraIn; + const Mat4 unjitteredViewProj = cameraIn.proj * cameraIn.view; + const bool taa = PostProcessStack::usesTaa(post) && !opts.wireframeMeshes; + Vec2 jitter(0.0f, 0.0f); + if (taa) { + jitter = PostProcessStack::taaJitter(view->frameIndex); + camera.proj(0, 2) += jitter.x * 2.0f / static_cast(sceneW); + camera.proj(1, 2) += jitter.y * 2.0f / static_cast(sceneH); + } + + ScenePassContext pass; + pass.view = view; + const bool ssrFromPost = post.enabled && post.screenSpaceReflections.enabled; + const bool ssrFromFeatures = + opts.features.reflections == ReflectionMode::ScreenSpace || + (opts.features.reflections != ReflectionMode::Off && opts.features.screenSpaceTrace); + if ((ssrFromPost || ssrFromFeatures) && !opts.wireframeMeshes) { + pass.ssrIntensity = ssrFromPost ? post.screenSpaceReflections.intensity : opts.features.ssrIntensity; + pass.ssrMaxRoughness = + ssrFromPost ? post.screenSpaceReflections.maxRoughness : opts.features.ssrMaxRoughness; + pass.ssrSteps = std::clamp(ssrFromPost ? post.screenSpaceReflections.maxSteps + : opts.features.ssrMaxSteps, + 4u, 64u); + pass.ssrMaxDistance = std::max(opts.features.ssrMaxDistance, 1.0f); + } + + RHI::Texture* hdr = view->color[view->current]; + RHI::Texture* depth = view->depth[view->current]; + const u32 drawn = renderSceneHdr(cmd, world, camera, hdr, depth, sceneW, sceneH, projectRoot, + opts, pass); + { - CF_PROFILE_SCOPE("GpuSceneRenderer::draw"); - return renderMeshes(cmd, draws, vp, camera.position, camera.view, lighting, colorTarget, - depthTarget, width, height, projectRoot, options); + CF_PROFILE_SCOPE("GpuSceneRenderer::post"); + PostProcessInputs in; + in.sceneColor = hdr; + in.sceneDepth = depth; + in.sceneWidth = sceneW; + in.sceneHeight = sceneH; + in.output = colorTarget; + in.outputWidth = width; + in.outputHeight = height; + in.proj = camera.proj; + in.viewProj = camera.proj * camera.view; + in.prevViewProj = view->hasPrevious ? view->prevViewProj : unjitteredViewProj; + in.cameraPos = camera.position; + in.deltaTime = std::clamp(opts.deltaTime, 1e-4f, 0.25f); + in.time = static_cast(m_frameCounter) * (1.0f / 60.0f); + in.frameIndex = view->frameIndex; + in.historyValid = view->hasPrevious; + in.jitterPixels = jitter; + in.viewId = viewId; + m_post.execute(cmd, post, in); + } + + // Keep redrawing until temporal effects converge after anything changes. + u64 changeHash = pass.sceneHash; + for (u32 i = 0; i < 16; ++i) { + u32 bits = 0; + std::memcpy(&bits, unjitteredViewProj.data() + i, sizeof(bits)); + changeHash = (changeHash ^ bits) * 1099511628211ull; + } + if (changeHash != view->prevSceneHash) { + u32 settle = 2; + if (taa) settle = 16; + view->settleFrames = std::max(view->settleFrames, settle); + } else if (view->settleFrames > 0) { + --view->settleFrames; } + view->prevSceneHash = changeHash; + + view->prevViewProj = unjitteredViewProj; + view->prevView = cameraIn.view; + view->prevProj = cameraIn.proj; + view->prevCameraPos = cameraIn.position; + view->hasPrevious = true; + view->current ^= 1u; + ++view->frameIndex; + + const bool continuous = post.enabled && (post.autoExposure.enabled || + (post.grain.enabled && post.grain.intensity > 0.0f)); + m_needsAnotherFrame = continuous || m_probesPending || view->settleFrames > 0; + return drawn; } u32 GpuSceneRenderer::render(RHI::CommandBuffer* cmd, ECS::World& world, const Editor::EditorContext& ctx, RHI::Texture* colorTarget, RHI::Texture* depthTarget, u32 width, u32 height, const std::string& projectRoot, const GpuSceneRenderOptions& options) { - if (!m_ready || !cmd || !colorTarget || !depthTarget || width < 1 || height < 1) return 0; + if (!m_ready || !cmd || !colorTarget || width < 1 || height < 1) return 0; if (ctx.viewMode != Editor::EditorContext::ViewMode::Mode3D) return 0; const Vec3 cameraPos = @@ -1135,8 +2203,8 @@ u32 GpuSceneRenderer::render(RHI::CommandBuffer* cmd, ECS::World& world, camera.position = cameraPos; camera.focus = ctx.camFocus; camera.view = Mat4::lookAt(cameraPos, ctx.camFocus, Vec3(0, 1, 0)); - camera.proj = Mat4::perspective(60.0f * 3.14159265f / 180.0f, aspect, 0.1f, farPlane); - camera.fovRad = 60.0f * 3.14159265f / 180.0f; + camera.proj = Mat4::perspective(60.0f * kPi / 180.0f, aspect, 0.1f, farPlane); + camera.fovRad = 60.0f * kPi / 180.0f; camera.nearClip = 0.1f; camera.farClip = farPlane; diff --git a/src/render/GpuSceneRenderer.hpp b/src/render/GpuSceneRenderer.hpp index d1d2857c..0b1f72a1 100644 --- a/src/render/GpuSceneRenderer.hpp +++ b/src/render/GpuSceneRenderer.hpp @@ -12,10 +12,15 @@ #include "render/GpuPointShadowMap.hpp" #include "render/GpuDirectionalShadowMap.hpp" #include "render/GpuSpotShadowMap.hpp" +#include "render/GpuEnvironmentMap.hpp" +#include "render/PostProcessStack.hpp" #include "render/TextureQuality.hpp" +#include "ecs/PostProcessComponents.hpp" +#include "render/RenderFeatures.hpp" #include "spatial/Octree.hpp" #include +#include #include namespace Caffeine::Editor { @@ -34,13 +39,53 @@ struct GpuSceneCamera { f32 farClip = 10000.0f; }; +/// Editor ground grid drawn by the GPU on y = 0 (depth-tested, anti-aliased, fades out). +struct GpuGridOverlay { + bool enabled = false; + f32 cellSize = 1.0f; + f32 majorEvery = 10.0f; + f32 fadeDistance = 200.0f; + f32 opacity = 1.0f; +}; + struct GpuSceneRenderOptions { bool wireframeMeshes = false; bool enableShadows = true; + /// Directional CSM count for the primary sun. Editor uses 1 to stay inside 16 ms. + u32 directionalCascadeCount = 4; /// Values > 1 bias terrain toward coarser LOD (editor preview). f32 terrainLodDistanceScale = 1.0f; TextureQualitySettings textureQuality{}; std::vector textureQualityViewers; + RenderFeatureSettings features{}; + /// When true, `features` is replaced each frame from ForwardRenderFeaturesComponent. + bool resolveFeaturesFromScene = true; + /// False while the editor camera is moving, so planar/probe passes stay off. + bool cameraSettled = true; + bool clipBelowEnabled = false; + f32 clipBelowY = 0.0f; + u32 colorLayer = 0; + /// Sky used for IBL and as the reflection fallback. An enabled SkyboxComponent in the + /// world wins when `resolveEnvironmentFromScene` is set. + std::string environmentPath; + f32 environmentExposure = 1.0f; + bool resolveEnvironmentFromScene = true; + /// Skips this entity (a probe never captures the object it belongs to). + ECS::Entity excludeEntity = ECS::Entity::INVALID; + + /// Post-processing: the PostProcessComponent on `postProcessCamera`, else the first enabled + /// one in the world, else `postProcess` (defaults: ACES + TAA). + bool resolvePostProcessFromScene = true; + ECS::Entity postProcessCamera = ECS::Entity::INVALID; + ECS::PostProcessComponent postProcess = PostProcessStack::defaults(); + /// Internal resolution multiplier (0.5 = faster, 2 = supersampled). + f32 renderScale = 1.0f; + /// Keeps temporal history (TAA, eye adaptation, SSR) apart per viewport. 0 = derive from + /// the colour target. + u64 viewId = 0; + f32 deltaTime = 1.0f / 60.0f; + bool drawSky = true; + GpuGridOverlay grid{}; }; class GpuSceneRenderer { @@ -55,11 +100,21 @@ class GpuSceneRenderer { const std::string& projectRoot, const GpuSceneRenderOptions& options = {}); + /// Renders the scene in linear HDR, then runs the post-processing stack into `colorTarget` + /// (RGBA8). `depthTarget` is optional; depth lives in internal, sampleable targets. u32 renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& world, const GpuSceneCamera& camera, RHI::Texture* colorTarget, RHI::Texture* depthTarget, u32 width, u32 height, const std::string& projectRoot, const GpuSceneRenderOptions& options = {}); + /// True while the image is still converging (TAA, eye adaptation, SSR feedback, probes + /// waiting for capture). Callers that redraw on demand should keep drawing. + bool needsAnotherFrame() const { return m_needsAnotherFrame; } + + /// Effective post-processing for a camera: its component, the scene's, or the defaults. + static ECS::PostProcessComponent resolvePostProcess(ECS::World& world, ECS::Entity camera, + const ECS::PostProcessComponent& fallback); + private: struct MeshDraw { ECS::Entity entity; @@ -67,16 +122,99 @@ class GpuSceneRenderer { const ECS::TerrainComponent* terrainSettings = nullptr; Mat4 worldMatrix = Mat4::identity(); Vec4 albedo{1, 1, 1, 1}; + Vec3 emission{0, 0, 0}; f32 metallic = 0.0f; f32 roughness = 0.5f; + f32 reflectance = 0.04f; f32 shininess = 32.0f; std::string meshPath; std::string customTexturePath; std::string customNormalPath; + std::string ormMapPath; + std::string emissionMapPath; + bool hasAuthoredMaterial = false; + Vec2 uvTiling{1.0f, 1.0f}; + Vec2 uvOffset{0.0f, 0.0f}; + f32 normalStrength = 1.0f; + f32 aoStrength = 1.0f; + u8 alphaMode = 0; + f32 alphaCutoff = 0.5f; + f32 transmission = 0.0f; + f32 ior = 1.5f; + f32 clearcoat = 0.0f; + f32 clearcoatRoughness = 0.03f; + Vec3 sheenColor{0.0f, 0.0f, 0.0f}; + f32 sheenRoughness = 0.5f; + f32 iridescence = 0.0f; + f32 iridescenceThickness = 400.0f; + f32 iridescenceIor = 1.3f; + i32 probeIndex = -1; bool castShadows = true; bool receiveShadows = true; bool isTerrain = false; + bool planarReceiver = false; + bool skipColorDraw = false; + u32 batchCount = 1; + u32 batchByteOffset = 0; + Vec3 aabbMin{}; + Vec3 aabbMax{}; + bool hasAabb = false; f32 viewerDistance = 0.0f; + + bool isTranslucent() const { return transmission > 0.0f || alphaMode == 2; } + bool isGlossy() const { + return !isTerrain && (metallic >= 0.5f || roughness <= 0.35f || transmission > 0.0f || + clearcoat > 0.0f); + } + }; + + /// Per-viewport HDR targets. Colour/depth ping-pong so this frame can read the last one + /// (screen-space reflections). + struct ViewTargets { + u64 viewId = 0; + u32 width = 0; + u32 height = 0; + u64 lastUsed = 0; + RHI::Texture* color[2] = {nullptr, nullptr}; + RHI::Texture* depth[2] = {nullptr, nullptr}; + RHI::Texture* opaqueCopy = nullptr; + u32 current = 0; + bool hasPrevious = false; + Mat4 prevViewProj = Mat4::identity(); + Mat4 prevView = Mat4::identity(); + Mat4 prevProj = Mat4::identity(); + Vec3 prevCameraPos{}; + u64 prevSceneHash = 0; + u32 frameIndex = 0; + u32 settleFrames = 0; + }; + + /// Cubemap captured around one glossy object. + struct ReflectionProbe { + const ECS::World* world = nullptr; + ECS::Entity entity = ECS::Entity::INVALID; + Vec3 origin{}; + RHI::Texture* cube = nullptr; + RHI::Texture* depth = nullptr; + u32 resolution = 0; + u32 mipLevels = 1; + u64 sceneHash = 0; + bool valid = false; + u64 lastUsed = 0; + }; + + /// State shared by every draw of one scene pass. + struct ScenePassContext { + ViewTargets* view = nullptr; ///< null for probe / planar passes + Mat4 viewProj = Mat4::identity(); + f32 ssrIntensity = 0.0f; + f32 ssrMaxRoughness = 0.0f; + u32 ssrSteps = 0; + f32 ssrMaxDistance = 0.0f; + bool opaqueCopyBound = false; + /// Cube faces must not cycle: that would discard the faces already rendered. + bool cycleTargets = true; + u64 sceneHash = 0; }; bool createPipelines(); @@ -92,11 +230,32 @@ class GpuSceneRenderer { const Scene::SceneLighting& lighting, const std::vector& draws); u32 renderMeshes(RHI::CommandBuffer* cmd, const std::vector& draws, - const Mat4& vp, const Vec3& cameraPos, const Mat4& cameraView, - const Scene::SceneLighting& lighting, + const GpuSceneCamera& camera, const Scene::SceneLighting& lighting, RHI::Texture* colorTarget, RHI::Texture* depthTarget, u32 width, u32 height, const std::string& projectRoot, - const GpuSceneRenderOptions& options); + const GpuSceneRenderOptions& options, ScenePassContext& pass); + void drawMeshList(RHI::CommandBuffer* cmd, const std::vector& draws, + const GpuSceneCamera& camera, const Scene::SceneLighting& lighting, + const std::string& projectRoot, const GpuSceneRenderOptions& options, + const ScenePassContext& pass, RHI::Pipeline* basePipeline); + void drawSky(RHI::CommandBuffer* cmd, const GpuSceneCamera& camera, u32 targetHeight); + void drawGrid(RHI::CommandBuffer* cmd, const GpuSceneCamera& camera, const GpuGridOverlay& grid); + /// Scene into an HDR target: gather, shadows, opaque, sky, grid, translucent. + u32 renderSceneHdr(RHI::CommandBuffer* cmd, ECS::World& world, const GpuSceneCamera& camera, + RHI::Texture* colorTarget, RHI::Texture* depthTarget, u32 width, + u32 height, const std::string& projectRoot, + const GpuSceneRenderOptions& options, ScenePassContext& pass); + ViewTargets* acquireViewTargets(u64 viewId, u32 width, u32 height); + void releaseViewTargets(ViewTargets& view); + void updateReflectionProbes(RHI::CommandBuffer* cmd, ECS::World& world, + std::vector& draws, const GpuSceneCamera& camera, + const std::string& projectRoot, + const GpuSceneRenderOptions& options, u64 sceneHash, + bool allowCapture); + bool captureProbe(RHI::CommandBuffer* cmd, ECS::World& world, ReflectionProbe& probe, + const GpuSceneCamera& camera, const std::string& projectRoot, + const GpuSceneRenderOptions& options); + void releaseProbe(ReflectionProbe& probe); void pushShadowDraw(RHI::CommandBuffer* cmd, const MeshDraw& draw, const Mat4& mvp, const Vec3& lightPos, int mode, u32 indexCount, u32 firstIndex = 0); void pushShadowDrawsForMesh(RHI::CommandBuffer* cmd, const MeshDraw& draw, const Mat4& mvp, @@ -105,6 +264,16 @@ class GpuSceneRenderer { const Spatial::Frustum& frustum, const std::string& projectRoot, const GpuSceneRenderOptions& options); + void applyCoarseOcclusion(std::vector& draws, const GpuSceneCamera& camera, + const GpuSceneRenderOptions& options) const; + void assignInstanceBatches(std::vector& draws, const GpuSceneRenderOptions& options, + std::vector& instanceMatrices) const; + bool ensureReflectionTargets(u32 width, u32 height); + void renderPlanarReflection(RHI::CommandBuffer* cmd, ECS::World& world, + const GpuSceneCamera& camera, u32 width, u32 height, + const std::string& projectRoot, const GpuSceneRenderOptions& options); + void resolveEnvironment(ECS::World& world, const std::string& projectRoot, + const GpuSceneRenderOptions& options); RHI::RenderDevice* m_device = nullptr; RHI::Shader* m_sceneVert = nullptr; @@ -116,11 +285,52 @@ class GpuSceneRenderer { RHI::Pipeline* m_wireframePipeline = nullptr; RHI::Pipeline* m_terrainPipeline = nullptr; RHI::Pipeline* m_shadowPipeline = nullptr; + RHI::Shader* m_instancedVert = nullptr; + RHI::Pipeline* m_instancedPipeline = nullptr; + RHI::Buffer* m_instanceBuffer = nullptr; + RHI::Pipeline* m_blendPipeline = nullptr; + RHI::Shader* m_fullscreenVert = nullptr; + RHI::Shader* m_skyFrag = nullptr; + RHI::Shader* m_gridFrag = nullptr; + RHI::Pipeline* m_skyPipeline = nullptr; + RHI::Pipeline* m_gridPipeline = nullptr; + /// Bound to cube sampler slots that have nothing to sample (a 2D texture there is invalid). + RHI::Texture* m_fallbackCube = nullptr; + RHI::Texture* m_reflectionColor = nullptr; + RHI::Texture* m_reflectionDepth = nullptr; + u32 m_reflectionWidth = 0; + u32 m_reflectionHeight = 0; + Mat4 m_reflectionVP = Mat4::identity(); + bool m_reflectionValid = false; + std::vector m_probes; + bool m_probesPending = false; + std::vector m_views; + u64 m_frameCounter = 0; + bool m_needsAnotherFrame = false; + PostProcessStack m_post; + /// True while rendering into the planar target or probe faces; those passes must not + /// sample the textures they write to. + bool m_inReflectionPass = false; + GpuEnvironmentMap m_environment; + f32 m_environmentExposure = 1.0f; RHI::Sampler* m_sampler = nullptr; RHI::Sampler* m_repeatSampler = nullptr; + RHI::Sampler* m_pointSampler = nullptr; GpuPointShadowMap m_pointShadows; GpuDirectionalShadowMap m_directionalShadows; + struct MeshLodCache { + Assets::Mesh3D medium; + Assets::Mesh3D far; + bool built = false; + }; + + Assets::Mesh3D* selectMeshLod(const Assets::Mesh3D* source, ECS::Entity entity, f32 distance); + void destroyMeshGpu(Assets::Mesh3D& mesh); + GpuSpotShadowMap m_spotShadows; + u32 m_activeCascadeCount = 4; + std::unordered_map m_meshLods; + std::unordered_map m_entityLod; bool m_ready = false; }; diff --git a/src/render/GpuSpotShadowMap.hpp b/src/render/GpuSpotShadowMap.hpp index 4dbbfdb8..677c168f 100644 --- a/src/render/GpuSpotShadowMap.hpp +++ b/src/render/GpuSpotShadowMap.hpp @@ -10,7 +10,7 @@ namespace Caffeine::Render { class GpuSpotShadowMap { public: static constexpr u32 kMaxSpotShadowLights = 2; - static constexpr u32 kResolution = 512; + static constexpr u32 kResolution = 1024; bool init(RHI::RenderDevice* device); void shutdown(); diff --git a/src/render/GpuTextureCache.cpp b/src/render/GpuTextureCache.cpp index e65eef03..467b604c 100644 --- a/src/render/GpuTextureCache.cpp +++ b/src/render/GpuTextureCache.cpp @@ -50,6 +50,44 @@ void halveRgbaImage(const u8* src, u32 srcW, u32 srcH, std::vector& dst, u32 } } +/// Uploads `rgba` with a full box-filtered mip chain so minified textures don't shimmer. +RHI::Texture* createMippedTexture(RHI::RenderDevice* device, std::vector rgba, u32 width, + u32 height, bool srgb) { + u32 mipLevels = 1; + for (u32 size = std::max(width, height); size > 1; size >>= 1) ++mipLevels; + + RHI::TextureDesc desc; + desc.width = width; + desc.height = height; + desc.format = srgb ? RHI::TextureFormat::R8G8B8A8_UNORM_SRGB : RHI::TextureFormat::R8G8B8A8_UNORM; + desc.usage = RHI::TextureUsage::Sampler; + desc.mipLevels = mipLevels; + RHI::Texture* texture = device->createTexture(desc); + if (!texture) return nullptr; + + u32 levelW = width; + u32 levelH = height; + for (u32 level = 0; level < mipLevels; ++level) { + if (!device->uploadTexture(texture, rgba.data(), levelW, levelH, 4, level)) { + device->destroyTexture(texture); + return nullptr; + } + if (level + 1 == mipLevels) break; + std::vector next; + u32 nextW = 0; + u32 nextH = 0; + halveRgbaImage(rgba.data(), levelW, levelH, next, nextW, nextH); + rgba = std::move(next); + levelW = nextW; + levelH = nextH; + } + return texture; +} + +std::string colorSpaceKey(const std::string& key, bool srgb) { + return srgb ? key + "#srgb" : key; +} + } // namespace GpuTextureCache& GpuTextureCache::instance() { @@ -99,7 +137,7 @@ void GpuTextureCache::destroyEntry(RHI::RenderDevice* device, Entry& entry) { } RHI::Texture* GpuTextureCache::loadTexture(RHI::RenderDevice* device, const std::string& resolved, - u32 qualityTier) { + u32 qualityTier, bool srgb) { int width = 0; int height = 0; int channels = 0; @@ -111,46 +149,19 @@ RHI::Texture* GpuTextureCache::loadTexture(RHI::RenderDevice* device, const std: u32 uploadW = static_cast(width); u32 uploadH = static_cast(height); - std::vector rgba; - if (qualityTier > 0) { - rgba.assign(pixels, pixels + static_cast(width) * static_cast(height) * 4); - stbi_image_free(pixels); - pixels = nullptr; - downscaleRgba(rgba, uploadW, uploadH, qualityTier); - } - - RHI::TextureDesc desc; - desc.width = uploadW; - desc.height = uploadH; - desc.format = RHI::TextureFormat::R8G8B8A8_UNORM; - desc.usage = RHI::TextureUsage::Sampler; - desc.mipLevels = 1; - - RHI::Texture* texture = device->createTexture(desc); - if (!texture) { - if (pixels) stbi_image_free(pixels); - return nullptr; - } - - const bool uploaded = pixels - ? device->uploadTexture(texture, pixels, uploadW, uploadH, 4, 0) - : device->uploadTexture(texture, rgba.data(), uploadW, uploadH, 4, 0); - if (pixels) stbi_image_free(pixels); - if (!uploaded) { - device->destroyTexture(texture); - return nullptr; - } - - return texture; + std::vector rgba(pixels, pixels + static_cast(width) * static_cast(height) * 4); + stbi_image_free(pixels); + downscaleRgba(rgba, uploadW, uploadH, qualityTier); + return createMippedTexture(device, std::move(rgba), uploadW, uploadH, srgb); } RHI::Texture* GpuTextureCache::acquireFromPixels(RHI::RenderDevice* device, const std::string& cacheKey, const u8* pixels, u32 width, u32 height, int channels, - u32 qualityTier) { + u32 qualityTier, bool srgb) { if (!device || !pixels || width < 1 || height < 1 || cacheKey.empty()) return nullptr; - const std::string tieredKey = textureCacheKeyForTier(cacheKey, qualityTier); + const std::string tieredKey = colorSpaceKey(textureCacheKeyForTier(cacheKey, qualityTier), srgb); auto it = m_cache.find(tieredKey); if (it != m_cache.end() && it->second.texture) { it->second.refCount++; @@ -185,39 +196,27 @@ RHI::Texture* GpuTextureCache::acquireFromPixels(RHI::RenderDevice* device, u32 uploadH = height; downscaleRgba(rgba, uploadW, uploadH, qualityTier); - RHI::TextureDesc desc; - desc.width = uploadW; - desc.height = uploadH; - desc.format = RHI::TextureFormat::R8G8B8A8_UNORM; - desc.usage = RHI::TextureUsage::Sampler; - desc.mipLevels = 1; - - RHI::Texture* texture = device->createTexture(desc); + RHI::Texture* texture = createMippedTexture(device, std::move(rgba), uploadW, uploadH, srgb); if (!texture) return nullptr; - if (!device->uploadTexture(texture, rgba.data(), uploadW, uploadH, 4, 0)) { - device->destroyTexture(texture); - return nullptr; - } - Entry entry; entry.texture = texture; entry.refCount = 1; entry.width = uploadW; entry.height = uploadH; - entry.mipLevels = 1; m_cache[tieredKey] = entry; return texture; } RHI::Texture* GpuTextureCache::acquire(RHI::RenderDevice* device, const std::string& path, - const std::string& projectRoot, u32 qualityTier) { + const std::string& projectRoot, u32 qualityTier, + bool srgb) { if (!device || path.empty()) return nullptr; const std::string resolved = resolvePath(path, projectRoot); if (resolved.empty()) return nullptr; - const std::string cacheKey = textureCacheKeyForTier(resolved, qualityTier); + const std::string cacheKey = colorSpaceKey(textureCacheKeyForTier(resolved, qualityTier), srgb); const u64 stamp = fileTimestamp(resolved); auto it = m_cache.find(cacheKey); if (it != m_cache.end() && it->second.texture) { @@ -231,7 +230,7 @@ RHI::Texture* GpuTextureCache::acquire(RHI::RenderDevice* device, const std::str } } - RHI::Texture* texture = loadTexture(device, resolved, qualityTier); + RHI::Texture* texture = loadTexture(device, resolved, qualityTier, srgb); if (!texture) return nullptr; Entry entry; @@ -240,7 +239,6 @@ RHI::Texture* GpuTextureCache::acquire(RHI::RenderDevice* device, const std::str entry.fileStamp = stamp; entry.width = texture->width; entry.height = texture->height; - entry.mipLevels = 1; m_cache[cacheKey] = entry; return texture; } @@ -248,14 +246,16 @@ RHI::Texture* GpuTextureCache::acquire(RHI::RenderDevice* device, const std::str void GpuTextureCache::release(RHI::RenderDevice* device, const std::string& resolvedPath) { if (resolvedPath.empty()) return; for (u32 tier = 0; tier <= kTextureQualityMaxTier; ++tier) { - const std::string key = textureCacheKeyForTier(resolvedPath, tier); - auto it = m_cache.find(key); - if (it == m_cache.end()) continue; - Entry& entry = it->second; - if (entry.refCount > 0) entry.refCount--; - if (entry.refCount == 0) { - destroyEntry(device, entry); - m_cache.erase(it); + for (bool srgb : {false, true}) { + const std::string key = colorSpaceKey(textureCacheKeyForTier(resolvedPath, tier), srgb); + auto it = m_cache.find(key); + if (it == m_cache.end()) continue; + Entry& entry = it->second; + if (entry.refCount > 0) entry.refCount--; + if (entry.refCount == 0) { + destroyEntry(device, entry); + m_cache.erase(it); + } } } } @@ -295,10 +295,12 @@ RHI::Texture* GpuTextureCache::whiteTexture(RHI::RenderDevice* device) { void GpuTextureCache::invalidate(const std::string& resolvedPath) { for (u32 tier = 0; tier <= kTextureQualityMaxTier; ++tier) { - const std::string key = textureCacheKeyForTier(resolvedPath, tier); - auto it = m_cache.find(key); - if (it != m_cache.end()) { - it->second.fileStamp = 0; + for (bool srgb : {false, true}) { + const std::string key = colorSpaceKey(textureCacheKeyForTier(resolvedPath, tier), srgb); + auto it = m_cache.find(key); + if (it != m_cache.end()) { + it->second.fileStamp = 0; + } } } auto it = m_cache.find(resolvedPath); diff --git a/src/render/GpuTextureCache.hpp b/src/render/GpuTextureCache.hpp index 87efec3b..92b64a14 100644 --- a/src/render/GpuTextureCache.hpp +++ b/src/render/GpuTextureCache.hpp @@ -18,15 +18,17 @@ class GpuTextureCache { public: static GpuTextureCache& instance(); - /// Returns a cached 2D texture (RGBA8). Increments refcount. + /// Returns a cached, fully mip-mapped 2D texture. Increments refcount. /// qualityTier: 0=full, 1=half, 2=quarter, 3=eighth resolution. + /// `srgb` = colour data (albedo, emission) decoded to linear by the sampler; leave it off + /// for normals, ORM and splat weights. RHI::Texture* acquire(RHI::RenderDevice* device, const std::string& path, - const std::string& projectRoot, u32 qualityTier = 0); + const std::string& projectRoot, u32 qualityTier = 0, bool srgb = false); /// Uploads pixel data under a stable cache key (embedded glTF images, etc.). RHI::Texture* acquireFromPixels(RHI::RenderDevice* device, const std::string& cacheKey, const u8* pixels, u32 width, u32 height, int channels, - u32 qualityTier = 0); + u32 qualityTier = 0, bool srgb = false); /// Decrement refcount for a resolved filesystem path. void release(RHI::RenderDevice* device, const std::string& resolvedPath); @@ -50,14 +52,13 @@ class GpuTextureCache { u64 fileStamp = 0; u32 width = 0; u32 height = 0; - u32 mipLevels = 1; }; std::string resolvePath(const std::string& path, const std::string& projectRoot) const; u64 fileTimestamp(const std::string& path) const; Entry* findByTexture(RHI::Texture* texture); RHI::Texture* loadTexture(RHI::RenderDevice* device, const std::string& resolved, - u32 qualityTier); + u32 qualityTier, bool srgb); static void downscaleRgba(std::vector& rgba, u32& width, u32& height, u32 qualityTier); void destroyEntry(RHI::RenderDevice* device, Entry& entry); diff --git a/src/render/InstanceBatch.hpp b/src/render/InstanceBatch.hpp new file mode 100644 index 00000000..8d1e9318 --- /dev/null +++ b/src/render/InstanceBatch.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include "core/Types.hpp" + +#include + +namespace Caffeine::Render { + +struct InstanceBatchItem { + u64 key = 0; + bool allow = false; +}; + +struct InstanceBatchGroup { + std::vector members; +}; + +/// Groups items that share `key`. Items with allow=false stay as single draws. +/// Groups are split at `maxPerBatch`. +inline std::vector buildInstanceBatches(const std::vector& items, + u32 maxPerBatch) { + std::vector groups; + const u32 limit = maxPerBatch < 2 ? 2 : maxPerBatch; + for (u32 i = 0; i < items.size(); ++i) { + if (!items[i].allow || items[i].key == 0) continue; + InstanceBatchGroup* found = nullptr; + for (InstanceBatchGroup& group : groups) { + if (group.members.empty()) continue; + const u32 head = group.members.front(); + if (items[head].key == items[i].key && group.members.size() < limit) { + found = &group; + break; + } + } + if (!found) { + groups.push_back({}); + found = &groups.back(); + } + found->members.push_back(i); + } + return groups; +} + +} // namespace Caffeine::Render diff --git a/src/render/MaterialPreviewRenderer.cpp b/src/render/MaterialPreviewRenderer.cpp new file mode 100644 index 00000000..f8a65a09 --- /dev/null +++ b/src/render/MaterialPreviewRenderer.cpp @@ -0,0 +1,250 @@ +#include "render/MaterialPreviewRenderer.hpp" + +#include "assets/MaterialCache.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/LightComponents.hpp" +#include "ecs/MeshComponents.hpp" +#include "math/Quat.hpp" + +#include +#include + +namespace Caffeine::Render { +namespace { + +constexpr f32 kDegToRad = 3.14159265f / 180.0f; +constexpr f32 kCameraDistance = 1.9f; +constexpr f32 kFovDegrees = 40.0f; +constexpr f32 kFloorY = -0.5f; + +struct Fnv { + u64 h = 1469598103934665603ull; + void bytes(const void* data, size_t size) { + const auto* p = static_cast(data); + for (size_t i = 0; i < size; ++i) { + h ^= p[i]; + h *= 1099511628211ull; + } + } + template + void value(const T& v) { bytes(&v, sizeof(v)); } + void text(const std::string& s) { + bytes(s.data(), s.size()); + value(s.size()); + } +}; + +u64 hashPreviewInputs(const Assets::MaterialSurface& s, u32 pixelSize, + const MaterialPreviewSettings& settings) { + Fnv f; + f.value(s.albedo); + f.value(s.metallic); + f.value(s.roughness); + f.value(s.reflectance); + f.value(s.emission); + f.value(s.emissionStrength); + f.text(s.albedoMap); + f.text(s.normalMap); + f.text(s.ormMap); + f.text(s.emissionMap); + f.value(s.uvTiling); + f.value(s.uvOffset); + f.value(s.normalStrength); + f.value(s.aoStrength); + f.value(s.alphaMode); + f.value(s.alphaCutoff); + f.value(s.transmission); + f.value(s.ior); + f.value(s.clearcoat); + f.value(s.clearcoatRoughness); + f.value(s.sheenColor); + f.value(s.sheenRoughness); + f.value(s.iridescence); + f.value(s.iridescenceThickness); + f.value(s.iridescenceIor); + f.value(pixelSize); + f.value(settings.yawDegrees); + f.value(settings.pitchDegrees); + f.text(settings.environmentPath); + f.value(settings.environmentExposure); + f.value(settings.showFloor); + f.value(settings.probeResolution); + return f.h; +} + +u64 hashWithRoot(u64 h, const std::string& projectRoot) { + Fnv f; + f.h = h; + f.text(projectRoot); + return f.h; +} + +} // namespace + +MaterialPreviewRenderer::~MaterialPreviewRenderer() { + shutdown(); +} + +bool MaterialPreviewRenderer::init(RHI::RenderDevice* device) { + shutdown(); + if (!device || !device->isInitialized()) return false; + m_device = device; + if (!m_renderer.init(device)) { + m_device = nullptr; + return false; + } + + buildScene(); + m_ready = true; + return true; +} + +void MaterialPreviewRenderer::shutdown() { + if (m_device) { + if (m_color) m_device->destroyTexture(m_color); + if (m_depth) m_device->destroyTexture(m_depth); + } + m_renderer.shutdown(); + m_world.destroyAll(); + m_sphere = ECS::Entity::INVALID; + m_floor = ECS::Entity::INVALID; + m_color = nullptr; + m_depth = nullptr; + m_pixelSize = 0; + m_lastHash = 0; + m_hasImage = false; + m_ready = false; + m_device = nullptr; +} + +void MaterialPreviewRenderer::buildScene() { + m_world.destroyAll(); + + m_sphere = m_world.create("Preview Sphere"); + m_world.add(m_sphere); + m_world.add(m_sphere); + m_world.add(m_sphere); + ECS::MeshFilterComponent sphereFilter; + sphereFilter.primitive = ECS::MeshPrimitive::Sphere; + sphereFilter.customMaterialPath = kPreviewMaterialKey; + m_world.add(m_sphere, sphereFilter); + m_world.add(m_sphere); + + m_floor = m_world.create("Preview Floor"); + ECS::Position3D floorPos; + floorPos.position = Vec3(0.0f, kFloorY, 0.0f); + m_world.add(m_floor, floorPos); + m_world.add(m_floor); + ECS::Scale3D floorScale; + floorScale.scale = Vec3(8.0f, 1.0f, 8.0f); + m_world.add(m_floor, floorScale); + ECS::MeshFilterComponent floorFilter; + floorFilter.primitive = ECS::MeshPrimitive::Plane; + floorFilter.customMaterialPath = kFloorMaterialKey; + m_world.add(m_floor, floorFilter); + m_world.add(m_floor); + + const ECS::Entity sun = m_world.create("Preview Sun"); + m_world.add(sun); + const Vec3 sunTravel = Vec3(-0.45f, -0.72f, -0.52f).normalized(); + const Quat aim = Quat::lookAt(-1.0f * sunTravel, Vec3(0.0f, 1.0f, 0.0f)); + ECS::Rotation3D sunRotation; + sunRotation.quaternion = Vec4(aim.x, aim.y, aim.z, aim.w); + m_world.add(sun, sunRotation); + ECS::LightComponent light; + light.intensity = 1.6f; + m_world.add(sun, light); + ECS::DirectionalLightComponent directional; + directional.shadowDistance = 6.0f; + m_world.add(sun, directional); +} + +bool MaterialPreviewRenderer::ensureTargets(u32 pixelSize) { + if (m_color && m_depth && m_pixelSize == pixelSize) return true; + if (m_color) m_device->destroyTexture(m_color); + if (m_depth) m_device->destroyTexture(m_depth); + m_color = nullptr; + m_depth = nullptr; + m_hasImage = false; + + RHI::TextureDesc colorDesc; + colorDesc.width = pixelSize; + colorDesc.height = pixelSize; + colorDesc.format = RHI::TextureFormat::R8G8B8A8_UNORM; + colorDesc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; + m_color = m_device->createTexture(colorDesc); + + RHI::TextureDesc depthDesc; + depthDesc.width = pixelSize; + depthDesc.height = pixelSize; + depthDesc.format = RHI::TextureFormat::D32_FLOAT; + depthDesc.usage = RHI::TextureUsage::DepthStencil; + m_depth = m_device->createTexture(depthDesc); + + m_pixelSize = (m_color && m_depth) ? pixelSize : 0; + return m_color && m_depth; +} + +void MaterialPreviewRenderer::applySettings(const MaterialPreviewSettings& settings) { + if (auto* filter = m_world.get(m_floor)) { + filter->primitive = settings.showFloor ? ECS::MeshPrimitive::Plane : ECS::MeshPrimitive::Custom; + } +} + +bool MaterialPreviewRenderer::render(RHI::CommandBuffer* cmd, const Assets::MaterialSurface& surface, + u32 pixelSize, const MaterialPreviewSettings& settings, + const std::string& projectRoot) { + if (!m_ready || !cmd || pixelSize < 16) return false; + if (!ensureTargets(pixelSize)) return false; + + const u64 hash = hashWithRoot(hashPreviewInputs(surface, pixelSize, settings), projectRoot); + // Probes, SSR and TAA converge over a few frames; keep drawing until they settle. + if (m_hasImage && hash == m_lastHash && !m_renderer.needsAnotherFrame()) return true; + + // Keys are resolved against the same project root the renderer receives. + Assets::MaterialSurface published = surface; + published.valid = true; + Assets::MaterialCache::instance().publish(kPreviewMaterialKey, projectRoot, published); + Assets::MaterialSurface floor; + floor.valid = true; + floor.name = "Preview Floor"; + floor.albedo = Vec4(0.42f, 0.42f, 0.44f, 1.0f); + floor.roughness = 0.85f; + Assets::MaterialCache::instance().publish(kFloorMaterialKey, projectRoot, floor); + applySettings(settings); + + const f32 yaw = settings.yawDegrees * kDegToRad; + const f32 pitch = std::clamp(settings.pitchDegrees, -80.0f, 80.0f) * kDegToRad; + GpuSceneCamera camera; + camera.focus = Vec3(0.0f, 0.0f, 0.0f); + camera.position = Vec3(std::sin(yaw) * std::cos(pitch), std::sin(pitch), + std::cos(yaw) * std::cos(pitch)) * + kCameraDistance; + camera.fovRad = kFovDegrees * kDegToRad; + camera.nearClip = 0.05f; + camera.farClip = 200.0f; + camera.view = Mat4::lookAt(camera.position, camera.focus, Vec3(0.0f, 1.0f, 0.0f)); + camera.proj = Mat4::perspective(camera.fovRad, 1.0f, camera.nearClip, camera.farClip); + + GpuSceneRenderOptions options; + options.resolveFeaturesFromScene = false; + options.resolveEnvironmentFromScene = false; + options.environmentPath = settings.environmentPath; + options.environmentExposure = settings.environmentExposure; + options.enableShadows = true; + options.directionalCascadeCount = 1; + options.cameraSettled = true; + options.features.reflections = ReflectionMode::Probe; + options.features.probeResolution = std::clamp(settings.probeResolution, 32u, 256u); + options.features.maxReflectionProbes = 1; + options.features.occlusion = OcclusionMode::Off; + options.features.volumetrics = VolumetricQuality::Off; + + m_renderer.renderWithCamera(cmd, m_world, camera, m_color, m_depth, pixelSize, pixelSize, + projectRoot, options); + m_lastHash = hash; + m_hasImage = true; + return true; +} + +} // namespace Caffeine::Render diff --git a/src/render/MaterialPreviewRenderer.hpp b/src/render/MaterialPreviewRenderer.hpp new file mode 100644 index 00000000..4ae67867 --- /dev/null +++ b/src/render/MaterialPreviewRenderer.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include "assets/MaterialTypes.hpp" +#include "core/Types.hpp" +#include "ecs/World.hpp" +#include "render/GpuSceneRenderer.hpp" +#include "rhi/CommandBuffer.hpp" +#include "rhi/RenderDevice.hpp" + +#include + +namespace Caffeine::Render { + +struct MaterialPreviewSettings { + /// Camera orbit around the sphere, in degrees. + f32 yawDegrees = 0.0f; + f32 pitchDegrees = 12.0f; + std::string environmentPath; + f32 environmentExposure = 1.0f; + bool showFloor = true; + u32 probeResolution = 128; +}; + +/// Material preview drawn by the scene renderer: a sphere wearing the material, a floor, a sun +/// and the sky, with a reflection probe so metals mirror their surroundings exactly as in a scene. +class MaterialPreviewRenderer { +public: + static constexpr const char* kPreviewMaterialKey = "__caffeine_material_preview__.mat"; + static constexpr const char* kFloorMaterialKey = "__caffeine_material_preview_floor__.mat"; + + MaterialPreviewRenderer() = default; + ~MaterialPreviewRenderer(); + MaterialPreviewRenderer(const MaterialPreviewRenderer&) = delete; + MaterialPreviewRenderer& operator=(const MaterialPreviewRenderer&) = delete; + + bool init(RHI::RenderDevice* device); + void shutdown(); + bool isReady() const { return m_ready; } + + /// Renders when the material, settings or size changed; otherwise keeps the last image. + bool render(RHI::CommandBuffer* cmd, const Assets::MaterialSurface& surface, u32 pixelSize, + const MaterialPreviewSettings& settings, const std::string& projectRoot = ""); + + RHI::Texture* colorTexture() const { return m_hasImage ? m_color : nullptr; } + u32 pixelSize() const { return m_pixelSize; } + +private: + void buildScene(); + bool ensureTargets(u32 pixelSize); + void applySettings(const MaterialPreviewSettings& settings); + + RHI::RenderDevice* m_device = nullptr; + GpuSceneRenderer m_renderer; + ECS::World m_world; + ECS::Entity m_sphere = ECS::Entity::INVALID; + ECS::Entity m_floor = ECS::Entity::INVALID; + RHI::Texture* m_color = nullptr; + RHI::Texture* m_depth = nullptr; + u32 m_pixelSize = 0; + u64 m_lastHash = 0; + bool m_hasImage = false; + bool m_ready = false; +}; + +} // namespace Caffeine::Render diff --git a/src/render/PostProcessRenderer.hpp b/src/render/PostProcessRenderer.hpp index aa8172f6..eb97f460 100644 --- a/src/render/PostProcessRenderer.hpp +++ b/src/render/PostProcessRenderer.hpp @@ -4,132 +4,12 @@ #include "ecs/World.hpp" #include "ecs/ComponentQuery.hpp" -#include -#include - -#ifdef CF_HAS_IMGUI -#include -#endif - namespace Caffeine::Render { -#ifdef CF_HAS_IMGUI - -inline void applyPostProcessOverlay(ImDrawList* dl, ImVec2 origin, ImVec2 size, - const ECS::PostProcessComponent& fx) { - if (!dl || !fx.enabled || size.x < 1.0f || size.y < 1.0f) return; - - const ImVec2 p0 = origin; - const ImVec2 p1(origin.x + size.x, origin.y + size.y); - - f32 exposure = fx.colorGrading.exposure; - if (fx.autoExposure.enabled) { - exposure = std::clamp(exposure + fx.autoExposure.compensation, fx.autoExposure.minExposure, - fx.autoExposure.maxExposure); - } - - if (fx.colorGrading.enabled) { - const f32 tint = std::clamp(exposure, 0.2f, 4.0f); - const f32 contrastDelta = std::abs(fx.colorGrading.contrast - 1.0f); - const f32 satDelta = std::abs(fx.colorGrading.saturation - 1.0f); - const u8 alpha = static_cast( - std::clamp((tint - 1.0f) * 40.0f + contrastDelta * 30.0f + satDelta * 24.0f + 10.0f, 8.0f, - 56.0f)); - if (tint >= 1.0f) { - dl->AddRectFilled(p0, p1, IM_COL32(255, 255, 240, alpha)); - } else { - dl->AddRectFilled(p0, p1, IM_COL32(0, 0, 20, alpha)); - } - if (fx.colorGrading.temperature < -0.05f) { - dl->AddRectFilled(p0, p1, IM_COL32(0, 20, 40, 20)); - } else if (fx.colorGrading.temperature > 0.05f) { - dl->AddRectFilled(p0, p1, IM_COL32(40, 20, 0, 20)); - } - } - - if (fx.deferredFog.enabled && fx.deferredFog.density > 0.001f) { - const u8 fogA = static_cast(std::clamp(fx.deferredFog.density * 400.0f, 0.0f, 120.0f)); - const u8 r = static_cast(fx.deferredFog.colorR * 255.0f); - const u8 g = static_cast(fx.deferredFog.colorG * 255.0f); - const u8 b = static_cast(fx.deferredFog.colorB * 255.0f); - dl->AddRectFilledMultiColor(p0, p1, IM_COL32(r, g, b, 0), IM_COL32(r, g, b, 0), - IM_COL32(r, g, b, fogA), IM_COL32(r, g, b, fogA)); - } - - if (fx.ambientOcclusion.enabled && fx.ambientOcclusion.intensity > 0.001f) { - const u8 ao = static_cast( - std::clamp(fx.ambientOcclusion.intensity * 35.0f, 0.0f, 80.0f)); - dl->AddRectFilled(p0, p1, IM_COL32(0, 0, 0, ao / 2)); - dl->AddRectFilledMultiColor(p0, p1, IM_COL32(0, 0, 0, ao), IM_COL32(0, 0, 0, ao), - IM_COL32(0, 0, 0, 0), IM_COL32(0, 0, 0, 0)); - } - - if (fx.screenSpaceReflections.enabled && fx.screenSpaceReflections.intensity > 0.001f) { - const u8 ssr = static_cast( - std::clamp(fx.screenSpaceReflections.intensity * 40.0f, 0.0f, 60.0f)); - const f32 h = size.y * 0.35f; - dl->AddRectFilled(ImVec2(p0.x, p1.y - h), p1, IM_COL32(200, 220, 255, ssr)); - } - - if (fx.depthOfField.enabled && fx.depthOfField.maxBlur > 0.001f) { - const f32 blur = std::clamp(fx.depthOfField.maxBlur, 0.0f, 2.0f); - const u8 edge = static_cast(blur * 60.0f); - dl->AddRectFilledMultiColor(p0, p1, IM_COL32(0, 0, 0, edge), IM_COL32(0, 0, 0, edge), - IM_COL32(0, 0, 0, 0), IM_COL32(0, 0, 0, 0)); - } - - if (fx.vignette.enabled && fx.vignette.intensity > 0.001f) { - const f32 v = std::clamp(fx.vignette.intensity, 0.0f, 1.0f); - const u8 edge = static_cast(v * 180.0f); - dl->AddRectFilledMultiColor(p0, p1, IM_COL32(0, 0, 0, edge), IM_COL32(0, 0, 0, edge), - IM_COL32(0, 0, 0, 0), IM_COL32(0, 0, 0, 0)); - dl->AddRectFilledMultiColor(p0, p1, IM_COL32(0, 0, 0, 0), IM_COL32(0, 0, 0, 0), - IM_COL32(0, 0, 0, edge), IM_COL32(0, 0, 0, edge)); - } - - if (fx.bloom.enabled && fx.bloom.intensity > 0.001f) { - const u8 bloomA = static_cast(std::clamp(fx.bloom.intensity, 0.0f, 1.0f) * 50.0f); - dl->AddRectFilled(p0, p1, IM_COL32(255, 245, 220, bloomA)); - } - - if (fx.chromaticAberration.enabled && fx.chromaticAberration.intensity > 0.001f) { - const f32 ca = std::clamp(fx.chromaticAberration.intensity, 0.0f, 1.0f); - const f32 offset = ca * 3.0f; - dl->AddRect(ImVec2(p0.x - offset, p0.y), ImVec2(p1.x - offset, p1.y), - IM_COL32(255, 0, 0, 40), 0.0f, 0, 2.0f); - dl->AddRect(ImVec2(p0.x + offset, p0.y), ImVec2(p1.x + offset, p1.y), - IM_COL32(0, 0, 255, 40), 0.0f, 0, 2.0f); - } - - if (fx.lensDistortion.enabled && std::abs(fx.lensDistortion.intensity) > 0.001f) { - const u8 d = static_cast(std::clamp(std::abs(fx.lensDistortion.intensity) * 50.0f, 0.0f, 70.0f)); - dl->AddRectFilledMultiColor(p0, p1, IM_COL32(0, 0, 0, d), IM_COL32(0, 0, 0, d), - IM_COL32(0, 0, 0, d), IM_COL32(0, 0, 0, d)); - } - - if (fx.motionBlur.enabled && fx.motionBlur.intensity > 0.001f) { - const u8 mb = static_cast(std::clamp(fx.motionBlur.intensity, 0.0f, 1.0f) * 35.0f); - const f32 stripe = size.x * 0.15f; - dl->AddRectFilled(ImVec2(p0.x, p0.y + size.y * 0.45f), - ImVec2(p0.x + stripe, p0.y + size.y * 0.55f), - IM_COL32(255, 255, 255, mb)); - } - - if (fx.grain.enabled && fx.grain.intensity > 0.001f) { - const u8 grain = static_cast(std::clamp(fx.grain.intensity, 0.0f, 1.0f) * 28.0f); - dl->AddRectFilled(p0, p1, IM_COL32(128, 128, 128, grain)); - } - - if (fx.antiAliasing.enabled) { - const u8 aa = - static_cast(std::clamp(fx.antiAliasing.sharpness * 18.0f + 8.0f, 8.0f, 28.0f)); - dl->AddRect(p0, p1, IM_COL32(180, 220, 255, aa), 0.0f, 0, 1.0f); - } -} - +/// Post-process settings for a camera: its own component, otherwise the first one in the scene. inline const ECS::PostProcessComponent* findPostProcessForCamera(ECS::World& world, ECS::Entity cameraEntity) { - if (cameraEntity.isValid()) { + if (cameraEntity.isValid() && world.isEntityAlive(cameraEntity)) { if (auto* fx = world.get(cameraEntity)) return fx; } ECS::ComponentQuery q; @@ -141,6 +21,4 @@ inline const ECS::PostProcessComponent* findPostProcessForCamera(ECS::World& wor return fallback; } -#endif - } // namespace Caffeine::Render diff --git a/src/render/PostProcessStack.cpp b/src/render/PostProcessStack.cpp new file mode 100644 index 00000000..f76e4f9e --- /dev/null +++ b/src/render/PostProcessStack.cpp @@ -0,0 +1,551 @@ +#include "render/PostProcessStack.hpp" + +#include "debug/Profiler.hpp" +#include "render/ShaderBytecode.hpp" +#include "rhi/CommandBuffer.hpp" +#include "rhi/RenderDevice.hpp" + +#include +#include +#include + +namespace Caffeine::Render { +namespace { + +constexpr u32 kLuminanceSize = 256; +constexpr u32 kMaxBloomLevels = 6; +constexpr u32 kMaxViews = 4; + +struct Vec4f { + float x = 0.0f, y = 0.0f, z = 0.0f, w = 0.0f; +}; + +struct AdaptUBO { + Vec4f params; +}; + +struct BloomUBO { + Vec4f texel; + Vec4f params; +}; + +struct SsaoUBO { + Vec4f proj; + Vec4f texel; + Vec4f params; +}; + +struct BlurUBO { + Vec4f texel; +}; + +struct DofUBO { + Vec4f proj; + Vec4f texel; + Vec4f params; +}; + +struct MotionUBO { + float invViewProj[16]; + float prevViewProj[16]; + Vec4f params; +}; + +struct TaaUBO { + float invViewProj[16]; + float prevViewProj[16]; + Vec4f texel; + Vec4f params; +}; + +struct CompositeUBO { + float invViewProj[16]; + Vec4f camera; + Vec4f proj; + Vec4f texel; + Vec4f exposure; + Vec4f exposureRange; + Vec4f grading; + Vec4f bloom; + Vec4f fog; + Vec4f fogColor; + Vec4f ao; + Vec4f lens; + Vec4f grain; + Vec4f flags; +}; + +struct FxaaUBO { + Vec4f texel; + Vec4f params; +}; + +f32 halton(u32 index, u32 base) { + f32 f = 1.0f; + f32 r = 0.0f; + while (index > 0) { + f /= static_cast(base); + r += f * static_cast(index % base); + index /= base; + } + return r; +} + +f32 srgbToLinear(f32 c) { + c = std::clamp(c, 0.0f, 1.0f); + return c <= 0.04045f ? c / 12.92f : std::pow((c + 0.055f) / 1.055f, 2.4f); +} + +Vec4f projParams(const Mat4& proj) { + return {proj(0, 0), proj(1, 1), proj(2, 2), proj(2, 3)}; +} + +} // namespace + +PostProcessStack::~PostProcessStack() { + shutdown(); +} + +ECS::PostProcessComponent PostProcessStack::defaults() { + ECS::PostProcessComponent settings; + settings.colorGrading.enabled = true; + settings.antiAliasing.enabled = true; + settings.antiAliasing.mode = 1; + settings.ambientOcclusion.enabled = true; + settings.ambientOcclusion.intensity = 0.85f; + settings.ambientOcclusion.radius = 0.45f; + settings.ambientOcclusion.bias = 0.02f; + return settings; +} + +Vec2 PostProcessStack::taaJitter(u32 frameIndex) { + const u32 i = (frameIndex % 8u) + 1u; + return Vec2(halton(i, 2) - 0.5f, halton(i, 3) - 0.5f); +} + +bool PostProcessStack::usesTaa(const ECS::PostProcessComponent& settings) { + return settings.enabled && settings.antiAliasing.enabled && settings.antiAliasing.mode == 1; +} + +bool PostProcessStack::isTemporal(const ECS::PostProcessComponent& settings) { + if (!settings.enabled) return false; + return usesTaa(settings) || settings.autoExposure.enabled || + (settings.grain.enabled && settings.grain.intensity > 0.0f); +} + +bool PostProcessStack::init(RHI::RenderDevice* device) { + shutdown(); + if (!device || !device->isInitialized()) return false; + m_device = device; + + m_vertex = createBuiltinShader(device, BuiltinShader::FullscreenVertex, RHI::ShaderStage::Vertex, 0); + if (!m_vertex) { + shutdown(); + return false; + } + auto frag = [&](BuiltinShader shader, u32 samplers) { + RHI::Shader* s = + createBuiltinShader(device, shader, RHI::ShaderStage::Fragment, 1, samplers); + if (s) m_shaders.push_back(s); + return s; + }; + constexpr u32 kR16F = static_cast(RHI::TextureFormat::R16_FLOAT); + constexpr u32 kHdr = static_cast(RHI::TextureFormat::R16G16B16A16_FLOAT); + constexpr u32 kLdr = static_cast(RHI::TextureFormat::R8G8B8A8_UNORM); + + m_luminance = createPass(frag(BuiltinShader::PostLuminanceFragment, 1), kR16F, false); + m_adapt = createPass(frag(BuiltinShader::PostAdaptFragment, 2), kR16F, false); + m_bloomPrefilter = createPass(frag(BuiltinShader::PostBloomPrefilterFragment, 1), kHdr, false); + RHI::Shader* down = frag(BuiltinShader::PostBloomDownFragment, 1); + m_bloomDown = createPass(down, kHdr, false); + m_bloomUp = createPass(frag(BuiltinShader::PostBloomUpFragment, 1), kHdr, true); + m_ssao = createPass(frag(BuiltinShader::PostSsaoFragment, 1), kHdr, false); + m_ssaoBlur = createPass(frag(BuiltinShader::PostSsaoBlurFragment, 1), kHdr, false); + m_dof = createPass(frag(BuiltinShader::PostDofFragment, 2), kHdr, false); + m_motionBlur = createPass(frag(BuiltinShader::PostMotionBlurFragment, 2), kHdr, false); + m_taa = createPass(frag(BuiltinShader::PostTaaFragment, 3), kHdr, false); + m_composite = createPass(frag(BuiltinShader::PostCompositeFragment, 5), kLdr, false); + m_fxaa = createPass(frag(BuiltinShader::PostFxaaFragment, 1), kLdr, false); + + RHI::SamplerDesc linear; + linear.linearFilter = true; + linear.clampToEdge = true; + m_linear = device->createSampler(linear); + RHI::SamplerDesc point; + point.linearFilter = false; + point.clampToEdge = true; + m_point = device->createSampler(point); + + m_ready = m_composite && m_linear && m_point; + return m_ready; +} + +void PostProcessStack::shutdown() { + if (m_device) { + for (ViewResources& view : m_views) releaseView(view); + RHI::Pipeline* pipelines[] = {m_luminance, m_adapt, m_bloomPrefilter, m_bloomDown, + m_bloomUp, m_ssao, m_ssaoBlur, m_dof, m_motionBlur, + m_taa, m_composite, m_fxaa}; + for (RHI::Pipeline* p : pipelines) { + if (p) m_device->destroyPipeline(p); + } + for (RHI::Shader* s : m_shaders) m_device->destroyShader(s); + if (m_vertex) m_device->destroyShader(m_vertex); + if (m_linear) m_device->destroySampler(m_linear); + if (m_point) m_device->destroySampler(m_point); + } + m_views.clear(); + m_shaders.clear(); + m_vertex = nullptr; + m_luminance = m_adapt = m_bloomPrefilter = m_bloomDown = m_bloomUp = nullptr; + m_ssao = m_ssaoBlur = m_dof = m_motionBlur = m_taa = m_composite = m_fxaa = nullptr; + m_linear = nullptr; + m_point = nullptr; + m_device = nullptr; + m_ready = false; +} + +RHI::Pipeline* PostProcessStack::createPass(RHI::Shader* fragment, u32 colorFormat, bool additive) { + if (!m_device || !m_vertex || !fragment) return nullptr; + RHI::GraphicsPipelineDesc desc{}; + desc.colorFormat = static_cast(colorFormat); + desc.depthTest = false; + desc.depthWrite = false; + desc.blendMode = additive ? RHI::BlendMode::Additive : RHI::BlendMode::None; + return m_device->createGraphicsPipeline(m_vertex, fragment, desc); +} + +RHI::Texture* PostProcessStack::createTarget(u32 width, u32 height, u32 format, u32 mipLevels) { + RHI::TextureDesc desc; + desc.width = std::max(width, 1u); + desc.height = std::max(height, 1u); + desc.format = static_cast(format); + desc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; + desc.mipLevels = std::max(mipLevels, 1u); + return m_device->createTexture(desc); +} + +void PostProcessStack::releaseView(ViewResources& view) { + if (!m_device) return; + auto drop = [&](RHI::Texture*& t) { + if (t) m_device->destroyTexture(t); + t = nullptr; + }; + drop(view.history[0]); + drop(view.history[1]); + drop(view.temp[0]); + drop(view.temp[1]); + drop(view.ao); + drop(view.aoBlur); + drop(view.luminance); + drop(view.adapted[0]); + drop(view.adapted[1]); + drop(view.ldr); + for (RHI::Texture*& t : view.bloom) drop(t); + view.bloom.clear(); + view.bloomWidths.clear(); + view.bloomHeights.clear(); + view.historyValid = false; + view.adaptedValid = false; +} + +PostProcessStack::ViewResources* PostProcessStack::acquireView(const PostProcessInputs& inputs) { + ++m_frameCounter; + for (ViewResources& view : m_views) { + if (view.viewId != inputs.viewId) continue; + if (view.width != inputs.sceneWidth || view.height != inputs.sceneHeight || + view.outWidth != inputs.outputWidth || view.outHeight != inputs.outputHeight) { + releaseView(view); + view.width = inputs.sceneWidth; + view.height = inputs.sceneHeight; + view.outWidth = inputs.outputWidth; + view.outHeight = inputs.outputHeight; + } + view.lastUsed = m_frameCounter; + return &view; + } + if (m_views.size() >= kMaxViews) { + auto oldest = std::min_element(m_views.begin(), m_views.end(), + [](const ViewResources& a, const ViewResources& b) { + return a.lastUsed < b.lastUsed; + }); + releaseView(*oldest); + m_views.erase(oldest); + } + ViewResources view; + view.viewId = inputs.viewId; + view.width = inputs.sceneWidth; + view.height = inputs.sceneHeight; + view.outWidth = inputs.outputWidth; + view.outHeight = inputs.outputHeight; + view.lastUsed = m_frameCounter; + m_views.push_back(view); + return &m_views.back(); +} + +void PostProcessStack::runPass(RHI::CommandBuffer* cmd, RHI::Pipeline* pipeline, + RHI::Texture* target, u32 width, u32 height, + const PassTexture* textures, u32 textureCount, const void* ubo, + u32 uboSize, bool loadColor) { + if (!pipeline || !target) return; + RHI::RenderPassDesc pass; + pass.colorTarget = target; + pass.loadColor = loadColor; + pass.cycle = !loadColor; + pass.clearColor[0] = pass.clearColor[1] = pass.clearColor[2] = 0.0f; + pass.clearColor[3] = 1.0f; + cmd->beginRenderPass(pass); + cmd->bindPipeline(pipeline); + cmd->setViewport(0.0f, 0.0f, static_cast(width), static_cast(height)); + for (u32 i = 0; i < textureCount; ++i) { + cmd->bindTexture(textures[i].texture, i, textures[i].point ? m_point : m_linear); + } + if (ubo && uboSize > 0) { + cmd->pushUniformData(RHI::ShaderStage::Fragment, 0, ubo, uboSize); + } + cmd->draw(3); + cmd->endRenderPass(); +} + +void PostProcessStack::execute(RHI::CommandBuffer* cmd, const ECS::PostProcessComponent& in, + const PostProcessInputs& inputs) { + if (!m_ready || !cmd || !inputs.sceneColor || !inputs.sceneDepth || !inputs.output || + inputs.sceneWidth == 0 || inputs.sceneHeight == 0 || inputs.outputWidth == 0 || + inputs.outputHeight == 0) { + return; + } + CF_PROFILE_SCOPE("PostProcessStack::execute"); + ViewResources* view = acquireView(inputs); + if (!view) return; + + const bool on = in.enabled; + const u32 w = inputs.sceneWidth; + const u32 h = inputs.sceneHeight; + constexpr u32 kHdr = static_cast(RHI::TextureFormat::R16G16B16A16_FLOAT); + constexpr u32 kR16F = static_cast(RHI::TextureFormat::R16_FLOAT); + constexpr u32 kLdr = static_cast(RHI::TextureFormat::R8G8B8A8_UNORM); + const Vec4f texel{1.0f / static_cast(w), 1.0f / static_cast(h), + static_cast(inputs.frameIndex % 64u), 0.0f}; + const Mat4 invViewProj = inputs.viewProj.inverted(); + + RHI::Texture* source = inputs.sceneColor; + auto ensure = [&](RHI::Texture*& t, u32 tw, u32 th, u32 format) { + if (!t) t = createTarget(tw, th, format); + return t != nullptr; + }; + + // Temporal AA resolves the jittered scene against last frame's history. + if (on && usesTaa(in) && m_taa && ensure(view->history[0], w, h, kHdr) && + ensure(view->history[1], w, h, kHdr)) { + CF_PROFILE_SCOPE("Post::taa"); + const u32 writeIndex = view->historyIndex ^ 1u; + TaaUBO ubo{}; + std::memcpy(ubo.invViewProj, invViewProj.data(), sizeof(ubo.invViewProj)); + std::memcpy(ubo.prevViewProj, inputs.prevViewProj.data(), sizeof(ubo.prevViewProj)); + ubo.texel = texel; + ubo.params = {(view->historyValid && inputs.historyValid) ? 1.0f : 0.0f, 0.9f, 0.0f, 0.0f}; + const PassTexture tex[3] = {{source, false}, {view->history[view->historyIndex], false}, + {inputs.sceneDepth, true}}; + runPass(cmd, m_taa, view->history[writeIndex], w, h, tex, 3, &ubo, sizeof(ubo)); + view->historyIndex = writeIndex; + view->historyValid = true; + source = view->history[writeIndex]; + } else { + view->historyValid = false; + } + + u32 tempIndex = 0; + auto nextTemp = [&]() -> RHI::Texture* { + RHI::Texture*& t = view->temp[tempIndex]; + tempIndex ^= 1u; + ensure(t, w, h, kHdr); + return t; + }; + + if (on && in.motionBlur.enabled && in.motionBlur.intensity > 0.0f && m_motionBlur && + inputs.historyValid) { + CF_PROFILE_SCOPE("Post::motionBlur"); + RHI::Texture* target = nextTemp(); + MotionUBO ubo{}; + std::memcpy(ubo.invViewProj, invViewProj.data(), sizeof(ubo.invViewProj)); + std::memcpy(ubo.prevViewProj, inputs.prevViewProj.data(), sizeof(ubo.prevViewProj)); + ubo.params = {std::clamp(in.motionBlur.intensity, 0.0f, 1.0f), 12.0f, + std::clamp(in.motionBlur.maxVelocity, 0.0f, 4.0f) * 0.05f, 0.0f}; + const PassTexture tex[2] = {{source, false}, {inputs.sceneDepth, true}}; + runPass(cmd, m_motionBlur, target, w, h, tex, 2, &ubo, sizeof(ubo)); + source = target; + } + + if (on && in.depthOfField.enabled && in.depthOfField.maxBlur > 0.0f && m_dof) { + CF_PROFILE_SCOPE("Post::depthOfField"); + RHI::Texture* target = nextTemp(); + DofUBO ubo{}; + ubo.proj = projParams(inputs.proj); + ubo.texel = texel; + ubo.params = {in.depthOfField.focusDistance, in.depthOfField.aperture, + in.depthOfField.focalLength, + std::clamp(in.depthOfField.maxBlur, 0.0f, 2.0f) * 12.0f * + (static_cast(h) / 1080.0f)}; + const PassTexture tex[2] = {{source, false}, {inputs.sceneDepth, true}}; + runPass(cmd, m_dof, target, w, h, tex, 2, &ubo, sizeof(ubo)); + source = target; + } + + RHI::Texture* aoTexture = nullptr; + if (on && in.ambientOcclusion.enabled && in.ambientOcclusion.intensity > 0.0f && m_ssao && + m_ssaoBlur && ensure(view->ao, w, h, kHdr) && ensure(view->aoBlur, w, h, kHdr)) { + CF_PROFILE_SCOPE("Post::ssao"); + SsaoUBO ubo{}; + ubo.proj = projParams(inputs.proj); + ubo.texel = texel; + ubo.params = {std::max(in.ambientOcclusion.radius, 0.05f), + std::max(in.ambientOcclusion.bias, 0.0f), + std::clamp(in.ambientOcclusion.intensity, 0.0f, 4.0f), 16.0f}; + const PassTexture depthTex[1] = {{inputs.sceneDepth, true}}; + runPass(cmd, m_ssao, view->ao, w, h, depthTex, 1, &ubo, sizeof(ubo)); + BlurUBO blur{}; + blur.texel = texel; + const PassTexture aoTex[1] = {{view->ao, true}}; + runPass(cmd, m_ssaoBlur, view->aoBlur, w, h, aoTex, 1, &blur, sizeof(blur)); + aoTexture = view->aoBlur; + } + + RHI::Texture* adaptedTexture = nullptr; + if (on && in.autoExposure.enabled && m_luminance && m_adapt) { + CF_PROFILE_SCOPE("Post::autoExposure"); + if (!view->luminance) { + view->luminanceMips = 1; + for (u32 s = kLuminanceSize; s > 1; s >>= 1) ++view->luminanceMips; + view->luminance = createTarget(kLuminanceSize, kLuminanceSize, kR16F, view->luminanceMips); + } + ensure(view->adapted[0], 1, 1, kR16F); + ensure(view->adapted[1], 1, 1, kR16F); + if (view->luminance && view->adapted[0] && view->adapted[1]) { + const PassTexture lumIn[1] = {{source, false}}; + runPass(cmd, m_luminance, view->luminance, kLuminanceSize, kLuminanceSize, lumIn, 1, + nullptr, 0); + cmd->generateMipmaps(view->luminance); + const f32 speed = std::max(in.autoExposure.adaptationSpeed, 0.01f); + const f32 blend = view->adaptedValid + ? 1.0f - std::exp(-std::clamp(inputs.deltaTime, 0.0f, 0.25f) * speed) + : 1.0f; + AdaptUBO ubo{}; + ubo.params = {blend, static_cast(view->luminanceMips - 1), -12.0f, 12.0f}; + const u32 writeIndex = view->adaptedIndex ^ 1u; + const PassTexture adaptIn[2] = {{view->luminance, false}, + {view->adapted[view->adaptedIndex], true}}; + runPass(cmd, m_adapt, view->adapted[writeIndex], 1, 1, adaptIn, 2, &ubo, sizeof(ubo)); + view->adaptedIndex = writeIndex; + view->adaptedValid = true; + adaptedTexture = view->adapted[writeIndex]; + } + } else { + view->adaptedValid = false; + } + + RHI::Texture* bloomTexture = nullptr; + if (on && in.bloom.enabled && in.bloom.intensity > 0.0f && m_bloomPrefilter && m_bloomDown && + m_bloomUp) { + CF_PROFILE_SCOPE("Post::bloom"); + if (view->bloom.empty()) { + u32 bw = std::max(w / 2, 1u); + u32 bh = std::max(h / 2, 1u); + for (u32 level = 0; level < kMaxBloomLevels; ++level) { + RHI::Texture* t = createTarget(bw, bh, kHdr); + if (!t) break; + view->bloom.push_back(t); + view->bloomWidths.push_back(bw); + view->bloomHeights.push_back(bh); + if (bw <= 8 || bh <= 8) break; + bw = std::max(bw / 2, 1u); + bh = std::max(bh / 2, 1u); + } + } + if (!view->bloom.empty()) { + BloomUBO ubo{}; + ubo.texel = {1.0f / static_cast(w), 1.0f / static_cast(h), 0.0f, 0.0f}; + ubo.params = {std::max(in.bloom.threshold, 0.0f), 0.5f, 64.0f, 0.0f}; + const PassTexture first[1] = {{source, false}}; + runPass(cmd, m_bloomPrefilter, view->bloom[0], view->bloomWidths[0], + view->bloomHeights[0], first, 1, &ubo, sizeof(ubo)); + for (size_t i = 1; i < view->bloom.size(); ++i) { + ubo.texel = {1.0f / static_cast(view->bloomWidths[i - 1]), + 1.0f / static_cast(view->bloomHeights[i - 1]), 0.0f, 0.0f}; + const PassTexture down[1] = {{view->bloom[i - 1], false}}; + runPass(cmd, m_bloomDown, view->bloom[i], view->bloomWidths[i], + view->bloomHeights[i], down, 1, &ubo, sizeof(ubo)); + } + const f32 scatter = std::clamp(in.bloom.scatter, 0.0f, 1.0f); + for (size_t i = view->bloom.size() - 1; i > 0; --i) { + ubo.texel = {1.0f / static_cast(view->bloomWidths[i]), + 1.0f / static_cast(view->bloomHeights[i]), 0.0f, 0.0f}; + ubo.params = {1.0f, scatter, 0.0f, 0.0f}; + const PassTexture up[1] = {{view->bloom[i], false}}; + runPass(cmd, m_bloomUp, view->bloom[i - 1], view->bloomWidths[i - 1], + view->bloomHeights[i - 1], up, 1, &ubo, sizeof(ubo), true); + } + bloomTexture = view->bloom[0]; + } + } + + const bool fxaa = on && in.antiAliasing.enabled && in.antiAliasing.mode == 0 && m_fxaa && + ensure(view->ldr, inputs.outputWidth, inputs.outputHeight, kLdr); + RHI::Texture* compositeTarget = fxaa ? view->ldr : inputs.output; + + { + CF_PROFILE_SCOPE("Post::composite"); + CompositeUBO ubo{}; + std::memcpy(ubo.invViewProj, invViewProj.data(), sizeof(ubo.invViewProj)); + ubo.camera = {inputs.cameraPos.x, inputs.cameraPos.y, inputs.cameraPos.z, inputs.time}; + ubo.proj = projParams(inputs.proj); + ubo.texel = {1.0f / static_cast(w), 1.0f / static_cast(h), + 1.0f / static_cast(inputs.outputWidth), + 1.0f / static_cast(inputs.outputHeight)}; + const bool grading = on && in.colorGrading.enabled; + ubo.exposure = {grading ? std::max(in.colorGrading.exposure, 0.0f) : 1.0f, + adaptedTexture ? 1.0f : 0.0f, + adaptedTexture ? in.autoExposure.compensation : 0.0f, + static_cast(inputs.frameIndex)}; + ubo.exposureRange = {std::max(in.autoExposure.minExposure, 0.001f), + std::max(in.autoExposure.maxExposure, in.autoExposure.minExposure), 0.0f, + 0.0f}; + ubo.grading = {in.colorGrading.contrast, in.colorGrading.saturation, + in.colorGrading.temperature, in.colorGrading.tint}; + ubo.bloom = {bloomTexture ? in.bloom.intensity : 0.0f, 0.0f, 0.0f, 0.0f}; + const bool fog = on && in.deferredFog.enabled; + ubo.fog = {std::max(in.deferredFog.density, 0.0f), std::max(in.deferredFog.start, 0.0f), + std::max(in.deferredFog.end, in.deferredFog.start + 0.01f), fog ? 1.0f : 0.0f}; + ubo.fogColor = {srgbToLinear(in.deferredFog.colorR), srgbToLinear(in.deferredFog.colorG), + srgbToLinear(in.deferredFog.colorB), 1.0f}; + ubo.ao = {aoTexture ? 1.0f : 0.0f, 0.0f, 0.0f, 0.0f}; + ubo.lens = {(on && in.chromaticAberration.enabled) ? in.chromaticAberration.intensity : 0.0f, + (on && in.lensDistortion.enabled) ? in.lensDistortion.intensity : 0.0f, + (on && in.vignette.enabled) ? in.vignette.intensity : 0.0f, + in.vignette.smoothness}; + ubo.grain = {(on && in.grain.enabled) ? in.grain.intensity : 0.0f, + std::max(in.grain.size, 0.5f), 0.0f, 0.0f}; + const f32 sharpen = (on && usesTaa(in)) ? std::clamp(in.antiAliasing.sharpness, 0.0f, 1.0f) : 0.0f; + ubo.flags = {fxaa ? 1.0f : 0.0f, grading ? 1.0f : 0.0f, sharpen, 0.0f}; + + const PassTexture tex[5] = {{source, false}, + {bloomTexture ? bloomTexture : source, false}, + {inputs.sceneDepth, true}, + {aoTexture ? aoTexture : source, false}, + {adaptedTexture ? adaptedTexture : source, true}}; + runPass(cmd, m_composite, compositeTarget, inputs.outputWidth, inputs.outputHeight, tex, 5, + &ubo, sizeof(ubo)); + } + + if (fxaa) { + CF_PROFILE_SCOPE("Post::fxaa"); + FxaaUBO ubo{}; + ubo.texel = {1.0f / static_cast(inputs.outputWidth), + 1.0f / static_cast(inputs.outputHeight), 0.0f, 0.0f}; + ubo.params = {0.75f, 0.125f, 0.0312f, 0.0f}; + const PassTexture tex[1] = {{view->ldr, false}}; + runPass(cmd, m_fxaa, inputs.output, inputs.outputWidth, inputs.outputHeight, tex, 1, &ubo, + sizeof(ubo)); + } +} + +} // namespace Caffeine::Render diff --git a/src/render/PostProcessStack.hpp b/src/render/PostProcessStack.hpp new file mode 100644 index 00000000..cc1a0091 --- /dev/null +++ b/src/render/PostProcessStack.hpp @@ -0,0 +1,132 @@ +#pragma once + +#include "core/Types.hpp" +#include "ecs/PostProcessComponents.hpp" +#include "math/Mat4.hpp" +#include "math/Vec2.hpp" +#include "math/Vec3.hpp" + +#include + +namespace Caffeine::RHI { +class RenderDevice; +class CommandBuffer; +struct Texture; +struct Pipeline; +struct Sampler; +struct Shader; +} // namespace Caffeine::RHI + +namespace Caffeine::Render { + +/// What the scene pass produced for one view, plus where the display image goes. +struct PostProcessInputs { + RHI::Texture* sceneColor = nullptr; ///< RGBA16F linear HDR + RHI::Texture* sceneDepth = nullptr; ///< D32, created with Sampler usage + u32 sceneWidth = 0; + u32 sceneHeight = 0; + RHI::Texture* output = nullptr; ///< RGBA8 display target + u32 outputWidth = 0; + u32 outputHeight = 0; + Mat4 proj; ///< projection used for the scene (P22/P23 linearise depth) + Mat4 viewProj; ///< as rendered (jittered when TAA is on) + Mat4 prevViewProj; ///< last frame of the same view, unjittered + Vec3 cameraPos; + f32 deltaTime = 1.0f / 60.0f; + f32 time = 0.0f; + u32 frameIndex = 0; + bool historyValid = false; ///< false after a camera cut or resize + Vec2 jitterPixels; ///< TAA sub-pixel offset applied to `proj` + u64 viewId = 0; ///< separates TAA / eye-adaptation history per view +}; + +/// GPU post-processing driven by ECS::PostProcessComponent: TAA, motion blur, depth of field, +/// SSAO, auto exposure, bloom, fog, colour grading, ACES tone mapping, lens effects, grain, FXAA. +/// Screen-space reflections run in the forward scene shader (it needs material data); the +/// stack only reports whether they are requested. +class PostProcessStack { +public: + PostProcessStack() = default; + ~PostProcessStack(); + PostProcessStack(const PostProcessStack&) = delete; + PostProcessStack& operator=(const PostProcessStack&) = delete; + + bool init(RHI::RenderDevice* device); + void shutdown(); + bool ready() const { return m_ready; } + + /// Tone maps `inputs.sceneColor` into `inputs.output`. Call outside a render pass. + void execute(RHI::CommandBuffer* cmd, const ECS::PostProcessComponent& settings, + const PostProcessInputs& inputs); + + /// Settings used when the camera has no PostProcessComponent: ACES + TAA. + static ECS::PostProcessComponent defaults(); + /// Halton(2,3) sub-pixel offset in [-0.5, 0.5] pixels. + static Vec2 taaJitter(u32 frameIndex); + /// Effects whose result depends on previous frames (keep rendering while active). + static bool isTemporal(const ECS::PostProcessComponent& settings); + static bool usesTaa(const ECS::PostProcessComponent& settings); + +private: + struct ViewResources { + u64 viewId = 0; + u32 width = 0; + u32 height = 0; + u32 outWidth = 0; + u32 outHeight = 0; + u64 lastUsed = 0; + RHI::Texture* history[2] = {nullptr, nullptr}; + u32 historyIndex = 0; + bool historyValid = false; + RHI::Texture* temp[2] = {nullptr, nullptr}; + RHI::Texture* ao = nullptr; + RHI::Texture* aoBlur = nullptr; + RHI::Texture* luminance = nullptr; + u32 luminanceMips = 0; + RHI::Texture* adapted[2] = {nullptr, nullptr}; + u32 adaptedIndex = 0; + bool adaptedValid = false; + std::vector bloom; + std::vector bloomWidths; + std::vector bloomHeights; + RHI::Texture* ldr = nullptr; + }; + + ViewResources* acquireView(const PostProcessInputs& inputs); + void releaseView(ViewResources& view); + RHI::Texture* createTarget(u32 width, u32 height, u32 format, u32 mipLevels = 1); + RHI::Pipeline* createPass(RHI::Shader* fragment, u32 colorFormat, bool additive); + + struct PassTexture { + RHI::Texture* texture = nullptr; + bool point = false; + }; + void runPass(RHI::CommandBuffer* cmd, RHI::Pipeline* pipeline, RHI::Texture* target, + u32 width, u32 height, const PassTexture* textures, u32 textureCount, + const void* ubo, u32 uboSize, bool loadColor = false); + + RHI::RenderDevice* m_device = nullptr; + bool m_ready = false; + u64 m_frameCounter = 0; + + RHI::Shader* m_vertex = nullptr; + std::vector m_shaders; + RHI::Pipeline* m_luminance = nullptr; + RHI::Pipeline* m_adapt = nullptr; + RHI::Pipeline* m_bloomPrefilter = nullptr; + RHI::Pipeline* m_bloomDown = nullptr; + RHI::Pipeline* m_bloomUp = nullptr; + RHI::Pipeline* m_ssao = nullptr; + RHI::Pipeline* m_ssaoBlur = nullptr; + RHI::Pipeline* m_dof = nullptr; + RHI::Pipeline* m_motionBlur = nullptr; + RHI::Pipeline* m_taa = nullptr; + RHI::Pipeline* m_composite = nullptr; + RHI::Pipeline* m_fxaa = nullptr; + RHI::Sampler* m_linear = nullptr; + RHI::Sampler* m_point = nullptr; + + std::vector m_views; +}; + +} // namespace Caffeine::Render diff --git a/src/render/RenderFeatures.hpp b/src/render/RenderFeatures.hpp new file mode 100644 index 00000000..9296d096 --- /dev/null +++ b/src/render/RenderFeatures.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include "core/Types.hpp" + +namespace Caffeine::Render { + +/// Resolved at runtime from ForwardRenderFeaturesComponent (see ForwardRenderFeatures.hpp). +/// Coarse CPU occlusion is conservative on AABBs and can hide objects beside a large box. +enum class OcclusionMode : u8 { Off = 0, Coarse = 1 }; + +/// How glossy surfaces find what they reflect. +/// Off: sky only. Planar: a mirrored redraw for one flat floor. ScreenSpace: SSR only. +/// Probe (default): every glossy object gets its own cubemap of the scene around it, refined +/// by screen-space tracing where the reflected object is on screen. +enum class ReflectionMode : u8 { Off = 0, Planar = 1, ScreenSpace = 2, Probe = 3 }; + +/// Analytical height fog in the forward shader. It does not redraw the scene. +/// Low is 6 steps, Medium is 12. Shadow samples along the ray are optional. +enum class VolumetricQuality : u8 { Off = 0, Low = 1, Medium = 2 }; + +struct RenderFeatureSettings { + bool instancingEnabled = true; + u32 maxInstancesPerBatch = 256; + + OcclusionMode occlusion = OcclusionMode::Off; + u32 occlusionMaxOccluders = 8; + f32 occlusionMinRadius = 0.75f; + + bool iblEnabled = true; + f32 iblDiffuse = 1.0f; + f32 iblSpecular = 1.0f; + + ReflectionMode reflections = ReflectionMode::Probe; + f32 reflectionPlaneY = 0.0f; + f32 reflectionIntensity = 0.45f; + f32 reflectionResolutionScale = 0.5f; + /// Screen-space tracing on top of probes / planar (ScreenSpace mode always traces). + bool screenSpaceTrace = true; + f32 ssrIntensity = 1.0f; + f32 ssrMaxRoughness = 0.6f; + u32 ssrMaxSteps = 24; + f32 ssrMaxDistance = 30.0f; + u32 probeResolution = 128; + /// Glossy objects closest to the camera that get their own probe. + u32 maxReflectionProbes = 6; + bool expensiveEffectsOnlyWhenSettled = true; + + VolumetricQuality volumetrics = VolumetricQuality::Off; + f32 volumetricDensity = 0.012f; + f32 volumetricHeight = 12.0f; + f32 volumetricAnisotropy = 0.3f; + bool volumetricShadows = false; +}; + +} // namespace Caffeine::Render diff --git a/src/render/ShaderBytecode.cpp b/src/render/ShaderBytecode.cpp index f16d4478..77b0953e 100644 --- a/src/render/ShaderBytecode.cpp +++ b/src/render/ShaderBytecode.cpp @@ -23,10 +23,26 @@ ShaderBytecodeView lookupSpirv(BuiltinShader shader) { case BuiltinShader::SphereLitFragment: return {Shaders::sphere_lit_frag_spirv, Shaders::sphere_lit_frag_spirvSize}; case BuiltinShader::MeshLitVertex: return {Shaders::mesh_lit_vert_spirv, Shaders::mesh_lit_vert_spirvSize}; case BuiltinShader::SceneLitVertex: return {Shaders::scene_lit_vert_spirv, Shaders::scene_lit_vert_spirvSize}; + case BuiltinShader::SceneInstancedVertex: return {Shaders::scene_instanced_vert_spirv, Shaders::scene_instanced_vert_spirvSize}; case BuiltinShader::SceneLitFragment: return {Shaders::scene_lit_frag_spirv, Shaders::scene_lit_frag_spirvSize}; case BuiltinShader::TerrainLitFragment: return {Shaders::terrain_lit_frag_spirv, Shaders::terrain_lit_frag_spirvSize}; case BuiltinShader::ShadowDepthVertex: return {Shaders::shadow_depth_vert_spirv, Shaders::shadow_depth_vert_spirvSize}; case BuiltinShader::ShadowDepthFragment: return {Shaders::shadow_depth_frag_spirv, Shaders::shadow_depth_frag_spirvSize}; + case BuiltinShader::FullscreenVertex: return {Shaders::fullscreen_vert_spirv, Shaders::fullscreen_vert_spirvSize}; + case BuiltinShader::SkyFragment: return {Shaders::sky_frag_spirv, Shaders::sky_frag_spirvSize}; + case BuiltinShader::GridFragment: return {Shaders::grid_frag_spirv, Shaders::grid_frag_spirvSize}; + case BuiltinShader::PostLuminanceFragment: return {Shaders::post_luminance_frag_spirv, Shaders::post_luminance_frag_spirvSize}; + case BuiltinShader::PostAdaptFragment: return {Shaders::post_adapt_frag_spirv, Shaders::post_adapt_frag_spirvSize}; + case BuiltinShader::PostBloomPrefilterFragment: return {Shaders::post_bloom_prefilter_frag_spirv, Shaders::post_bloom_prefilter_frag_spirvSize}; + case BuiltinShader::PostBloomDownFragment: return {Shaders::post_bloom_down_frag_spirv, Shaders::post_bloom_down_frag_spirvSize}; + case BuiltinShader::PostBloomUpFragment: return {Shaders::post_bloom_up_frag_spirv, Shaders::post_bloom_up_frag_spirvSize}; + case BuiltinShader::PostSsaoFragment: return {Shaders::post_ssao_frag_spirv, Shaders::post_ssao_frag_spirvSize}; + case BuiltinShader::PostSsaoBlurFragment: return {Shaders::post_ssao_blur_frag_spirv, Shaders::post_ssao_blur_frag_spirvSize}; + case BuiltinShader::PostDofFragment: return {Shaders::post_dof_frag_spirv, Shaders::post_dof_frag_spirvSize}; + case BuiltinShader::PostMotionBlurFragment: return {Shaders::post_motion_blur_frag_spirv, Shaders::post_motion_blur_frag_spirvSize}; + case BuiltinShader::PostCompositeFragment: return {Shaders::post_composite_frag_spirv, Shaders::post_composite_frag_spirvSize}; + case BuiltinShader::PostFxaaFragment: return {Shaders::post_fxaa_frag_spirv, Shaders::post_fxaa_frag_spirvSize}; + case BuiltinShader::PostTaaFragment: return {Shaders::post_taa_frag_spirv, Shaders::post_taa_frag_spirvSize}; } #endif (void)shader; @@ -40,10 +56,12 @@ ShaderBytecodeView lookupDxbc(BuiltinShader shader) { case BuiltinShader::SphereLitFragment: return {Shaders::sphere_lit_frag_dxbc, Shaders::sphere_lit_frag_dxbcSize}; case BuiltinShader::MeshLitVertex: return {Shaders::mesh_lit_vert_dxbc, Shaders::mesh_lit_vert_dxbcSize}; case BuiltinShader::SceneLitVertex: return {Shaders::scene_lit_vert_dxbc, Shaders::scene_lit_vert_dxbcSize}; + case BuiltinShader::SceneInstancedVertex: return {Shaders::scene_instanced_vert_dxbc, Shaders::scene_instanced_vert_dxbcSize}; case BuiltinShader::SceneLitFragment: return {Shaders::scene_lit_frag_dxbc, Shaders::scene_lit_frag_dxbcSize}; case BuiltinShader::TerrainLitFragment: return {Shaders::terrain_lit_frag_dxbc, Shaders::terrain_lit_frag_dxbcSize}; case BuiltinShader::ShadowDepthVertex: return {Shaders::shadow_depth_vert_dxbc, Shaders::shadow_depth_vert_dxbcSize}; case BuiltinShader::ShadowDepthFragment: return {Shaders::shadow_depth_frag_dxbc, Shaders::shadow_depth_frag_dxbcSize}; + default: break; } #endif (void)shader; @@ -57,10 +75,12 @@ ShaderBytecodeView lookupMsl(BuiltinShader shader) { case BuiltinShader::SphereLitFragment: return {Shaders::sphere_lit_frag_msl, Shaders::sphere_lit_frag_mslSize, "main0"}; case BuiltinShader::MeshLitVertex: return {Shaders::mesh_lit_vert_msl, Shaders::mesh_lit_vert_mslSize, "main0"}; case BuiltinShader::SceneLitVertex: return {Shaders::scene_lit_vert_msl, Shaders::scene_lit_vert_mslSize, "main0"}; + case BuiltinShader::SceneInstancedVertex: return {Shaders::scene_instanced_vert_msl, Shaders::scene_instanced_vert_mslSize, "main0"}; case BuiltinShader::SceneLitFragment: return {Shaders::scene_lit_frag_msl, Shaders::scene_lit_frag_mslSize, "main0"}; case BuiltinShader::TerrainLitFragment: return {Shaders::terrain_lit_frag_msl, Shaders::terrain_lit_frag_mslSize, "main0"}; case BuiltinShader::ShadowDepthVertex: return {Shaders::shadow_depth_vert_msl, Shaders::shadow_depth_vert_mslSize, "main0"}; case BuiltinShader::ShadowDepthFragment: return {Shaders::shadow_depth_frag_msl, Shaders::shadow_depth_frag_mslSize, "main0"}; + default: break; } #endif (void)shader; @@ -79,6 +99,24 @@ ShaderBytecodeView getBuiltinShaderBytecode(BuiltinShader shader, RHI::ShaderByt } } +RHI::Shader* createBuiltinShader(RHI::RenderDevice* device, BuiltinShader shader, + RHI::ShaderStage stage, u32 numUniformBuffers, u32 numSamplers) { + if (!device) return nullptr; + const auto format = detectShaderFormat(device); + const auto bytecode = getBuiltinShaderBytecode(shader, format); + if (!bytecode.data || bytecode.size == 0) return nullptr; + + RHI::ShaderDesc desc; + desc.code = bytecode.data; + desc.codeSize = bytecode.size; + desc.stage = stage; + desc.format = format; + desc.entryPoint = bytecode.entryPoint; + desc.numUniformBuffers = numUniformBuffers; + desc.numSamplers = numSamplers; + return device->createShader(desc); +} + RHI::ShaderBytecodeFormat detectShaderFormat(RHI::RenderDevice* device) { if (!device || !device->isInitialized()) { return RHI::ShaderBytecodeFormat::SPIRV; diff --git a/src/render/ShaderBytecode.hpp b/src/render/ShaderBytecode.hpp index edc482c2..d2b6311f 100644 --- a/src/render/ShaderBytecode.hpp +++ b/src/render/ShaderBytecode.hpp @@ -10,10 +10,26 @@ enum class BuiltinShader : u8 { SphereLitFragment, MeshLitVertex, SceneLitVertex, + SceneInstancedVertex, SceneLitFragment, TerrainLitFragment, ShadowDepthVertex, ShadowDepthFragment, + FullscreenVertex, + SkyFragment, + GridFragment, + PostLuminanceFragment, + PostAdaptFragment, + PostBloomPrefilterFragment, + PostBloomDownFragment, + PostBloomUpFragment, + PostSsaoFragment, + PostSsaoBlurFragment, + PostDofFragment, + PostMotionBlurFragment, + PostCompositeFragment, + PostFxaaFragment, + PostTaaFragment, }; struct ShaderBytecodeView { @@ -26,4 +42,9 @@ ShaderBytecodeView getBuiltinShaderBytecode(BuiltinShader shader, RHI::ShaderBytecodeFormat format); RHI::ShaderBytecodeFormat detectShaderFormat(RHI::RenderDevice* device); +/// Creates a GPU shader from the embedded bytecode; nullptr when the format isn't bundled. +RHI::Shader* createBuiltinShader(RHI::RenderDevice* device, BuiltinShader shader, + RHI::ShaderStage stage, u32 numUniformBuffers, + u32 numSamplers = 0); + } // namespace Caffeine::Render diff --git a/src/render/shaders/fullscreen.vert b/src/render/shaders/fullscreen.vert new file mode 100644 index 00000000..b5220cc9 --- /dev/null +++ b/src/render/shaders/fullscreen.vert @@ -0,0 +1,11 @@ +#version 450 + +// One triangle covering the viewport; no vertex buffer. Depth sits on the far plane so the +// sky pass only fills pixels the scene left empty (LESS_OR_EQUAL against a cleared 1.0). +layout(location = 0) out vec2 v_uv; + +void main() { + vec2 p = vec2(float((gl_VertexIndex << 1) & 2), float(gl_VertexIndex & 2)); + v_uv = vec2(p.x, 1.0 - p.y); + gl_Position = vec4(p * 2.0 - 1.0, 1.0, 1.0); +} diff --git a/src/render/shaders/grid.frag b/src/render/shaders/grid.frag new file mode 100644 index 00000000..5f5817c2 --- /dev/null +++ b/src/render/shaders/grid.frag @@ -0,0 +1,75 @@ +#version 450 + +// Infinite ground grid on y = 0, anti-aliased with screen-space derivatives. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform GridUBO { + mat4 uInvViewProj; + mat4 uViewProj; + vec4 uCamera; // xyz position, w fade distance + vec4 uParams; // x cell size, y major every, z opacity, w line width (px) + vec4 uMinor; // rgb minor line color (linear) + vec4 uMajor; + vec4 uAxisX; + vec4 uAxisZ; +} grid; + +float gridCoverage(vec2 coord, float widthPx) { + vec2 deriv = max(fwidth(coord), vec2(1e-6)); + vec2 dist = abs(fract(coord - 0.5) - 0.5) / deriv; + float line = min(dist.x, dist.y); + // Lines thinner than a pixel fade instead of shimmering. + float density = max(deriv.x, deriv.y); + float fadeDense = 1.0 - smoothstep(0.25, 0.6, density); + return (1.0 - smoothstep(widthPx * 0.5, widthPx * 0.5 + 1.0, line)) * fadeDense; +} + +float axisCoverage(float coord, float widthPx) { + float deriv = max(fwidth(coord), 1e-6); + return 1.0 - smoothstep(widthPx * 0.5, widthPx * 0.5 + 1.0, abs(coord) / deriv); +} + +void main() { + vec2 ndc = vec2(v_uv.x * 2.0 - 1.0, (1.0 - v_uv.y) * 2.0 - 1.0); + vec4 nearH = grid.uInvViewProj * vec4(ndc, 0.0, 1.0); + vec4 farH = grid.uInvViewProj * vec4(ndc, 1.0, 1.0); + vec3 nearP = nearH.xyz / nearH.w; + vec3 farP = farH.xyz / farH.w; + vec3 dir = farP - nearP; + if (abs(dir.y) < 1e-6) discard; + float t = -nearP.y / dir.y; + if (t <= 0.0) discard; + vec3 pos = nearP + dir * t; + + vec4 clip = grid.uViewProj * vec4(pos, 1.0); + float depth = clip.z / clip.w; + if (depth > 1.0) discard; + gl_FragDepth = max(depth, 0.0); + + float cell = max(grid.uParams.x, 1e-4); + float major = max(grid.uParams.y, 2.0); + float widthPx = max(grid.uParams.w, 0.5); + float minorA = gridCoverage(pos.xz / cell, widthPx); + float majorA = gridCoverage(pos.xz / (cell * major), widthPx * 1.6); + float axisX = axisCoverage(pos.z, widthPx * 2.4); // X axis runs along z = 0 + float axisZ = axisCoverage(pos.x, widthPx * 2.4); + + vec3 color = grid.uMinor.rgb; + float alpha = minorA * grid.uMinor.a; + color = mix(color, grid.uMajor.rgb, majorA); + alpha = max(alpha, majorA * grid.uMajor.a); + color = mix(color, grid.uAxisX.rgb, axisX); + alpha = max(alpha, axisX * grid.uAxisX.a); + color = mix(color, grid.uAxisZ.rgb, axisZ); + alpha = max(alpha, axisZ * grid.uAxisZ.a); + + float dist = length(pos - grid.uCamera.xyz); + float fade = 1.0 - smoothstep(grid.uCamera.w * 0.35, grid.uCamera.w, dist); + // Grazing angles alias no matter what; fade them out. + vec3 viewDir = normalize(dir); + fade *= smoothstep(0.02, 0.15, abs(viewDir.y)); + alpha *= fade * grid.uParams.z; + if (alpha <= 0.002) discard; + outColor = vec4(color, alpha); +} diff --git a/src/render/shaders/post_adapt.frag b/src/render/shaders/post_adapt.frag new file mode 100644 index 00000000..14b5d09b --- /dev/null +++ b/src/render/shaders/post_adapt.frag @@ -0,0 +1,20 @@ +#version 450 + +// Eye adaptation: blends last frame's adapted log-luminance toward the current average. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform AdaptUBO { + vec4 uParams; // x blend factor (1 = snap), y average mip, z min log2, w max log2 +} adapt; + +layout(set = 2, binding = 0) uniform sampler2D uLuminance; +layout(set = 2, binding = 1) uniform sampler2D uPrevious; + +void main() { + float current = textureLod(uLuminance, vec2(0.5), adapt.uParams.y).r; + current = clamp(current, adapt.uParams.z, adapt.uParams.w); + float previous = texture(uPrevious, vec2(0.5)).r; + float value = mix(previous, current, clamp(adapt.uParams.x, 0.0, 1.0)); + outColor = vec4(value, 0.0, 0.0, 1.0); +} diff --git a/src/render/shaders/post_bloom_down.frag b/src/render/shaders/post_bloom_down.frag new file mode 100644 index 00000000..4d2a03b7 --- /dev/null +++ b/src/render/shaders/post_bloom_down.frag @@ -0,0 +1,29 @@ +#version 450 + +// 13-tap downsample (Call of Duty: Advanced Warfare bloom). +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform BloomUBO { + vec4 uTexel; // xy source texel size + vec4 uParams; +} bloom; + +layout(set = 2, binding = 0) uniform sampler2D uSource; + +vec3 tap(vec2 offset) { + return texture(uSource, v_uv + offset * bloom.uTexel.xy).rgb; +} + +void main() { + vec3 a = tap(vec2(-2, -2)), b = tap(vec2(0, -2)), c = tap(vec2(2, -2)); + vec3 d = tap(vec2(-1, -1)), e = tap(vec2(1, -1)); + vec3 f = tap(vec2(-2, 0)), g = tap(vec2(0, 0)), h = tap(vec2(2, 0)); + vec3 i = tap(vec2(-1, 1)), j = tap(vec2(1, 1)); + vec3 k = tap(vec2(-2, 2)), l = tap(vec2(0, 2)), m = tap(vec2(2, 2)); + + vec3 color = (d + e + i + j) * 0.125 + + (a + b + f + g) * 0.03125 + (b + c + g + h) * 0.03125 + + (f + g + k + l) * 0.03125 + (g + h + l + m) * 0.03125; + outColor = vec4(color, 1.0); +} diff --git a/src/render/shaders/post_bloom_prefilter.frag b/src/render/shaders/post_bloom_prefilter.frag new file mode 100644 index 00000000..fb0bb1ce --- /dev/null +++ b/src/render/shaders/post_bloom_prefilter.frag @@ -0,0 +1,47 @@ +#version 450 + +// First bloom level: 13-tap downsample of the HDR scene with a soft-knee threshold. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform BloomUBO { + vec4 uTexel; // xy source texel size + vec4 uParams; // x threshold, y knee, z clamp +} bloom; + +layout(set = 2, binding = 0) uniform sampler2D uSource; + +vec3 tap(vec2 offset) { + return min(texture(uSource, v_uv + offset * bloom.uTexel.xy).rgb, vec3(bloom.uParams.z)); +} + +float luma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); } + +// Karis average on the first downsample keeps single bright pixels from flickering. +vec3 karis(vec3 a, vec3 b, vec3 c, vec3 d) { + float wa = 1.0 / (1.0 + luma(a)); + float wb = 1.0 / (1.0 + luma(b)); + float wc = 1.0 / (1.0 + luma(c)); + float wd = 1.0 / (1.0 + luma(d)); + return (a * wa + b * wb + c * wc + d * wd) / (wa + wb + wc + wd); +} + +void main() { + vec3 a = tap(vec2(-2, -2)), b = tap(vec2(0, -2)), c = tap(vec2(2, -2)); + vec3 d = tap(vec2(-1, -1)), e = tap(vec2(1, -1)); + vec3 f = tap(vec2(-2, 0)), g = tap(vec2(0, 0)), h = tap(vec2(2, 0)); + vec3 i = tap(vec2(-1, 1)), j = tap(vec2(1, 1)); + vec3 k = tap(vec2(-2, 2)), l = tap(vec2(0, 2)), m = tap(vec2(2, 2)); + + vec3 color = karis(d, e, i, j) * 0.5 + + karis(a, b, f, g) * 0.125 + karis(b, c, g, h) * 0.125 + + karis(f, g, k, l) * 0.125 + karis(g, h, l, m) * 0.125; + + float threshold = bloom.uParams.x; + float knee = max(threshold * bloom.uParams.y, 1e-4); + float brightness = max(color.r, max(color.g, color.b)); + float soft = clamp(brightness - threshold + knee, 0.0, 2.0 * knee); + soft = soft * soft / (4.0 * knee); + float contribution = max(soft, brightness - threshold) / max(brightness, 1e-4); + outColor = vec4(color * contribution, 1.0); +} diff --git a/src/render/shaders/post_bloom_up.frag b/src/render/shaders/post_bloom_up.frag new file mode 100644 index 00000000..895efed3 --- /dev/null +++ b/src/render/shaders/post_bloom_up.frag @@ -0,0 +1,26 @@ +#version 450 + +// 3x3 tent upsample, added onto the next larger level (additive blend). +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform BloomUBO { + vec4 uTexel; // xy source texel size + vec4 uParams; // x radius scale, y weight +} bloom; + +layout(set = 2, binding = 0) uniform sampler2D uSource; + +void main() { + vec2 t = bloom.uTexel.xy * max(bloom.uParams.x, 0.25); + vec3 c = texture(uSource, v_uv + vec2(-t.x, -t.y)).rgb + + texture(uSource, v_uv + vec2(0.0, -t.y)).rgb * 2.0 + + texture(uSource, v_uv + vec2(t.x, -t.y)).rgb + + texture(uSource, v_uv + vec2(-t.x, 0.0)).rgb * 2.0 + + texture(uSource, v_uv).rgb * 4.0 + + texture(uSource, v_uv + vec2(t.x, 0.0)).rgb * 2.0 + + texture(uSource, v_uv + vec2(-t.x, t.y)).rgb + + texture(uSource, v_uv + vec2(0.0, t.y)).rgb * 2.0 + + texture(uSource, v_uv + vec2(t.x, t.y)).rgb; + outColor = vec4(c * (1.0 / 16.0) * bloom.uParams.y, 1.0); +} diff --git a/src/render/shaders/post_composite.frag b/src/render/shaders/post_composite.frag new file mode 100644 index 00000000..1c6fc88a --- /dev/null +++ b/src/render/shaders/post_composite.frag @@ -0,0 +1,170 @@ +#version 450 + +// Final HDR -> display pass: lens effects, AO, fog, bloom, exposure, grading, ACES, sRGB, film. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform CompositeUBO { + mat4 uInvViewProj; + vec4 uCamera; // xyz position, w time (s) + vec4 uProj; // z P22, w P23 + vec4 uTexel; // xy source texel, zw output texel + vec4 uExposure; // x manual multiplier, y auto on, z compensation (EV), w frame index + vec4 uExposureRange; // x min, y max + vec4 uGrading; // x contrast, y saturation, z temperature, w tint + vec4 uBloom; // x intensity (0 = off) + vec4 uFog; // x density, y start, z end, w enabled + vec4 uFogColor; // rgb linear + vec4 uAo; // x enabled + vec4 uLens; // x chromatic aberration, y distortion, z vignette intensity, w vignette smoothness + vec4 uGrain; // x intensity, y size + vec4 uFlags; // x luma in alpha, y grading on, z sharpen amount +} post; + +layout(set = 2, binding = 0) uniform sampler2D uScene; +layout(set = 2, binding = 1) uniform sampler2D uBloomTex; +layout(set = 2, binding = 2) uniform sampler2D uDepth; +layout(set = 2, binding = 3) uniform sampler2D uAoTex; +layout(set = 2, binding = 4) uniform sampler2D uAdapted; + +// ACES fitted (Stephen Hill): sRGB -> AP1, RRT + ODT fit, AP1 -> sRGB. +const mat3 kAcesInput = mat3( + 0.59719, 0.07600, 0.02840, + 0.35458, 0.90834, 0.13383, + 0.04823, 0.01566, 0.83777); +const mat3 kAcesOutput = mat3( + 1.60475, -0.10208, -0.00327, + -0.53108, 1.10813, -0.07276, + -0.07367, -0.00605, 1.07602); + +vec3 rrtAndOdtFit(vec3 v) { + vec3 a = v * (v + 0.0245786) - 0.000090537; + vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081; + return a / b; +} + +vec3 acesFitted(vec3 color) { + color = kAcesInput * color; + color = rrtAndOdtFit(color); + color = kAcesOutput * color; + return clamp(color, 0.0, 1.0); +} + +vec3 linearToSrgb(vec3 c) { + c = clamp(c, 0.0, 1.0); + vec3 lo = c * 12.92; + vec3 hi = 1.055 * pow(c, vec3(1.0 / 2.4)) - 0.055; + return mix(lo, hi, step(vec3(0.0031308), c)); +} + +float luma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); } + +float hash12(vec2 p) { + vec3 p3 = fract(vec3(p.xyx) * 0.1031); + p3 += dot(p3, p3.yzx + 33.33); + return fract((p3.x + p3.y) * p3.z); +} + +vec2 distort(vec2 uv, float k) { + vec2 d = uv - 0.5; + float r2 = dot(d, d); + return 0.5 + d * (1.0 + k * r2) / (1.0 + k * 0.25); +} + +vec3 sampleScene(vec2 uv) { + float ca = post.uLens.x; + if (ca <= 0.0001) return texture(uScene, uv).rgb; + vec2 d = uv - 0.5; + float amount = ca * 0.015 * dot(d, d) * 4.0; + return vec3(texture(uScene, uv - d * amount).r, + texture(uScene, uv).g, + texture(uScene, uv + d * amount).b); +} + +void main() { + vec2 uv = v_uv; + if (abs(post.uLens.y) > 0.0001) { + uv = distort(uv, post.uLens.y * 0.6); + } + vec3 color = sampleScene(uv); + + if (post.uFlags.z > 0.0) { + vec3 n = texture(uScene, uv + vec2(0.0, -post.uTexel.y)).rgb; + vec3 s = texture(uScene, uv + vec2(0.0, post.uTexel.y)).rgb; + vec3 e = texture(uScene, uv + vec2(post.uTexel.x, 0.0)).rgb; + vec3 w = texture(uScene, uv + vec2(-post.uTexel.x, 0.0)).rgb; + vec3 sharpened = color + (color * 4.0 - n - s - e - w) * post.uFlags.z * 0.25; + color = max(sharpened, vec3(0.0)); + } + + float depth = textureLod(uDepth, uv, 0.0).r; + if (post.uAo.x > 0.5) { + color *= texture(uAoTex, uv).r; + } + + if (post.uFog.w > 0.5) { + vec2 ndc = vec2(uv.x * 2.0 - 1.0, (1.0 - uv.y) * 2.0 - 1.0); + vec4 world = post.uInvViewProj * vec4(ndc, depth, 1.0); + world /= world.w; + vec3 toPixel = world.xyz - post.uCamera.xyz; + float dist = length(toPixel); + float fog; + if (depth >= 0.99999) { + // Sky: only the band near the horizon takes fog, so the ground fades into it. + vec3 dir = toPixel / max(dist, 1e-4); + fog = pow(1.0 - clamp(abs(dir.y), 0.0, 1.0), 6.0); + } else { + float d = max(dist - post.uFog.y, 0.0); + fog = 1.0 - exp(-post.uFog.x * d); + float endT = clamp((dist - post.uFog.y) / max(post.uFog.z - post.uFog.y, 1e-3), 0.0, 1.0); + fog = max(fog, endT * endT); + } + color = mix(color, post.uFogColor.rgb, clamp(fog, 0.0, 1.0)); + } + + if (post.uBloom.x > 0.0) { + color += texture(uBloomTex, uv).rgb * post.uBloom.x; + } + + float exposure = max(post.uExposure.x, 0.0); + if (post.uExposure.y > 0.5) { + float avgLog = texture(uAdapted, vec2(0.5)).r; + float autoExposure = 0.18 / max(exp2(avgLog), 1e-4); + autoExposure = clamp(autoExposure, post.uExposureRange.x, post.uExposureRange.y); + exposure *= autoExposure; + } + color *= exposure * exp2(post.uExposure.z); + + if (post.uFlags.y > 0.5) { + float temp = post.uGrading.z; + float tint = post.uGrading.w; + color *= vec3(1.0 + temp * 0.18, 1.0 - tint * 0.12, 1.0 - temp * 0.18); + // Contrast pivots on mid grey in log space so it never clips shadows to black. + vec3 logC = log2(max(color, vec3(1e-5)) / 0.18); + color = 0.18 * exp2(logC * post.uGrading.x); + color = max(mix(vec3(luma(color)), color, post.uGrading.y), vec3(0.0)); + } + + vec3 display = linearToSrgb(acesFitted(color)); + + if (post.uLens.z > 0.0) { + vec2 d = (v_uv - 0.5) * vec2(post.uTexel.w / post.uTexel.z, 1.0); + float radius = length(d); + float softness = max(post.uLens.w, 0.01); + float inner = mix(0.55, 0.15, softness); + float outer = inner + mix(0.15, 0.65, softness); + float vignette = smoothstep(inner, outer, radius); + display *= 1.0 - post.uLens.z * vignette; + } + + if (post.uGrain.x > 0.0) { + vec2 cell = floor(gl_FragCoord.xy / max(post.uGrain.y, 0.5)); + float n = hash12(cell + fract(post.uCamera.w * 7.13) * 917.0) - 0.5; + float response = 1.0 - luma(display) * 0.6; + display += n * post.uGrain.x * 0.18 * response; + } + + display = clamp(display, 0.0, 1.0); + float alpha = post.uFlags.x > 0.5 ? dot(display, vec3(0.299, 0.587, 0.114)) : 1.0; + outColor = vec4(display, alpha); +} diff --git a/src/render/shaders/post_dof.frag b/src/render/shaders/post_dof.frag new file mode 100644 index 00000000..93e19693 --- /dev/null +++ b/src/render/shaders/post_dof.frag @@ -0,0 +1,55 @@ +#version 450 + +// Gather depth of field: thin-lens circle of confusion from depth, golden-spiral bokeh. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform DofUBO { + vec4 uProj; // z P22, w P23 + vec4 uTexel; // xy texel size, z aspect + vec4 uParams; // x focus distance (m), y aperture (0..1 lens opening), z focal length (mm), w max blur (px) +} dof; + +layout(set = 2, binding = 0) uniform sampler2D uScene; +layout(set = 2, binding = 1) uniform sampler2D uDepth; + +float linearDepth(float d) { + return dof.uProj.w / (d + dof.uProj.z); +} + +// Circle of confusion in pixels (signed: < 0 in front of the focus plane). +float cocPixels(vec2 uv) { + float z = linearDepth(textureLod(uDepth, uv, 0.0).r); + float focus = max(dof.uParams.x, 0.05); + // Thin lens: CoC grows with (z - focus) / z, scaled by opening and focal length. + float lens = max(dof.uParams.y, 0.0) * (max(dof.uParams.z, 1.0) / 50.0); + float pixels = lens * 120.0 * (z - focus) / max(z, 1e-3) * (1.0 / dof.uTexel.y) / 1080.0; + return clamp(pixels, -dof.uParams.w, dof.uParams.w); +} + +void main() { + float centerCoc = cocPixels(v_uv); + vec3 centerColor = texture(uScene, v_uv).rgb; + float radius = abs(centerCoc); + const int kSamples = 40; + vec3 sum = centerColor; + float weight = 1.0; + float maxRadius = dof.uParams.w; + for (int i = 1; i < kSamples; ++i) { + float fi = float(i) / float(kSamples); + float r = sqrt(fi) * maxRadius; + float a = float(i) * 2.39996323; + vec2 offset = vec2(cos(a), sin(a)) * r * dof.uTexel.xy; + vec2 uv = v_uv + offset; + float sampleCoc = cocPixels(uv); + // A sample contributes if its own blur reaches us; background can't bleed over + // a sharper foreground pixel. + float reach = abs(sampleCoc); + if (sampleCoc > centerCoc) reach = min(reach, radius * 2.0); + float w = smoothstep(r - 1.0, r + 1.0, reach); + sum += texture(uScene, uv).rgb * w; + weight += w; + } + vec3 blurred = sum / weight; + outColor = vec4(mix(centerColor, blurred, smoothstep(0.5, 2.0, radius)), 1.0); +} diff --git a/src/render/shaders/post_fxaa.frag b/src/render/shaders/post_fxaa.frag new file mode 100644 index 00000000..bf0a244c --- /dev/null +++ b/src/render/shaders/post_fxaa.frag @@ -0,0 +1,108 @@ +#version 450 + +// FXAA 3.11 (quality preset ~12), luma in alpha written by the composite pass. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform FxaaUBO { + vec4 uTexel; // xy texel size + vec4 uParams; // x subpixel quality, y edge threshold, z edge threshold min +} fxaa; + +layout(set = 2, binding = 0) uniform sampler2D uInput; + +float lumaAt(vec2 uv) { return textureLod(uInput, uv, 0.0).a; } + +void main() { + vec2 t = fxaa.uTexel.xy; + vec4 center = textureLod(uInput, v_uv, 0.0); + float lumaM = center.a; + float lumaS = lumaAt(v_uv + vec2(0.0, t.y)); + float lumaN = lumaAt(v_uv + vec2(0.0, -t.y)); + float lumaE = lumaAt(v_uv + vec2(t.x, 0.0)); + float lumaW = lumaAt(v_uv + vec2(-t.x, 0.0)); + + float maxLuma = max(lumaM, max(max(lumaS, lumaN), max(lumaE, lumaW))); + float minLuma = min(lumaM, min(min(lumaS, lumaN), min(lumaE, lumaW))); + float range = maxLuma - minLuma; + if (range < max(fxaa.uParams.z, maxLuma * fxaa.uParams.y)) { + outColor = vec4(center.rgb, 1.0); + return; + } + + float lumaNW = lumaAt(v_uv + vec2(-t.x, -t.y)); + float lumaNE = lumaAt(v_uv + vec2(t.x, -t.y)); + float lumaSW = lumaAt(v_uv + vec2(-t.x, t.y)); + float lumaSE = lumaAt(v_uv + vec2(t.x, t.y)); + + float lumaNS = lumaN + lumaS; + float lumaWE = lumaW + lumaE; + float subpixNSWE = lumaNS + lumaWE; + float lumaNWNE = lumaNW + lumaNE; + float lumaSWSE = lumaSW + lumaSE; + float lumaNWSW = lumaNW + lumaSW; + float lumaNESE = lumaNE + lumaSE; + + float edgeHorz = abs(-2.0 * lumaW + lumaNWSW) + abs(-2.0 * lumaM + lumaNS) * 2.0 + + abs(-2.0 * lumaE + lumaNESE); + float edgeVert = abs(-2.0 * lumaS + lumaSWSE) + abs(-2.0 * lumaM + lumaWE) * 2.0 + + abs(-2.0 * lumaN + lumaNWNE); + bool horzSpan = edgeHorz >= edgeVert; + + float subpixA = subpixNSWE * 2.0 + lumaNWNE + lumaSWSE; + float lengthSign = horzSpan ? t.y : t.x; + float luma1 = horzSpan ? lumaN : lumaW; + float luma2 = horzSpan ? lumaS : lumaE; + float gradient1 = abs(luma1 - lumaM); + float gradient2 = abs(luma2 - lumaM); + bool steeper1 = gradient1 >= gradient2; + float gradientScaled = 0.25 * max(gradient1, gradient2); + if (steeper1) lengthSign = -lengthSign; + float lumaLocalAvg = steeper1 ? 0.5 * (luma1 + lumaM) : 0.5 * (luma2 + lumaM); + + vec2 posB = v_uv; + if (horzSpan) posB.y += lengthSign * 0.5; + else posB.x += lengthSign * 0.5; + vec2 offNP = horzSpan ? vec2(t.x, 0.0) : vec2(0.0, t.y); + + vec2 posN = posB - offNP; + vec2 posP = posB + offNP; + float lumaEndN = lumaAt(posN) - lumaLocalAvg; + float lumaEndP = lumaAt(posP) - lumaLocalAvg; + bool doneN = abs(lumaEndN) >= gradientScaled; + bool doneP = abs(lumaEndP) >= gradientScaled; + const float kSteps[10] = float[10](1.5, 2.0, 2.0, 2.0, 2.0, 4.0, 4.0, 8.0, 8.0, 12.0); + for (int i = 0; i < 10 && !(doneN && doneP); ++i) { + if (!doneN) { + posN -= offNP * kSteps[i]; + lumaEndN = lumaAt(posN) - lumaLocalAvg; + doneN = abs(lumaEndN) >= gradientScaled; + } + if (!doneP) { + posP += offNP * kSteps[i]; + lumaEndP = lumaAt(posP) - lumaLocalAvg; + doneP = abs(lumaEndP) >= gradientScaled; + } + } + + float dstN = horzSpan ? v_uv.x - posN.x : v_uv.y - posN.y; + float dstP = horzSpan ? posP.x - v_uv.x : posP.y - v_uv.y; + bool lumaMLTZero = (lumaM - lumaLocalAvg) < 0.0; + bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; + bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; + float spanLength = dstP + dstN; + bool directionN = dstN < dstP; + float dst = min(dstN, dstP); + bool goodSpan = directionN ? goodSpanN : goodSpanP; + float pixelOffset = goodSpan ? (-dst / spanLength + 0.5) : 0.0; + + float subpixC = clamp(abs(subpixA * (1.0 / 12.0) - lumaM) / range, 0.0, 1.0); + float subpixH = (-2.0 * subpixC + 3.0) * subpixC * subpixC; + float subpix = subpixH * subpixH * fxaa.uParams.x; + float offset = max(pixelOffset, subpix); + + vec2 finalUv = v_uv; + if (horzSpan) finalUv.y += offset * lengthSign; + else finalUv.x += offset * lengthSign; + outColor = vec4(textureLod(uInput, finalUv, 0.0).rgb, 1.0); +} diff --git a/src/render/shaders/post_luminance.frag b/src/render/shaders/post_luminance.frag new file mode 100644 index 00000000..e42c66b8 --- /dev/null +++ b/src/render/shaders/post_luminance.frag @@ -0,0 +1,13 @@ +#version 450 + +// Log-luminance of the HDR scene; mip-mapped afterwards to get the scene average. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 2, binding = 0) uniform sampler2D uScene; + +void main() { + vec3 c = texture(uScene, v_uv).rgb; + float lum = dot(c, vec3(0.2126, 0.7152, 0.0722)); + outColor = vec4(log2(max(lum, 1e-4)), 0.0, 0.0, 1.0); +} diff --git a/src/render/shaders/post_motion_blur.frag b/src/render/shaders/post_motion_blur.frag new file mode 100644 index 00000000..3ef3d156 --- /dev/null +++ b/src/render/shaders/post_motion_blur.frag @@ -0,0 +1,39 @@ +#version 450 + +// Camera motion blur: per-pixel velocity from depth reprojection with last frame's view-projection. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform MotionUBO { + mat4 uInvViewProj; + mat4 uPrevViewProj; + vec4 uParams; // x intensity (shutter fraction), y sample count, z max length (uv) +} motion; + +layout(set = 2, binding = 0) uniform sampler2D uScene; +layout(set = 2, binding = 1) uniform sampler2D uDepth; + +void main() { + float d = textureLod(uDepth, v_uv, 0.0).r; + vec2 ndc = vec2(v_uv.x * 2.0 - 1.0, (1.0 - v_uv.y) * 2.0 - 1.0); + vec4 world = motion.uInvViewProj * vec4(ndc, d, 1.0); + world /= world.w; + vec4 prev = motion.uPrevViewProj * world; + vec3 color = texture(uScene, v_uv).rgb; + if (prev.w <= 1e-4) { + outColor = vec4(color, 1.0); + return; + } + vec2 prevUv = vec2(prev.x / prev.w * 0.5 + 0.5, 1.0 - (prev.y / prev.w * 0.5 + 0.5)); + vec2 velocity = (v_uv - prevUv) * motion.uParams.x; + float len = length(velocity); + if (len > motion.uParams.z) velocity *= motion.uParams.z / len; + int samples = int(clamp(motion.uParams.y, 2.0, 32.0)); + vec3 sum = color; + for (int i = 1; i < 32; ++i) { + if (i >= samples) break; + float t = float(i) / float(samples - 1) - 0.5; + sum += texture(uScene, v_uv + velocity * t).rgb; + } + outColor = vec4(sum / float(samples), 1.0); +} diff --git a/src/render/shaders/post_ssao.frag b/src/render/shaders/post_ssao.frag new file mode 100644 index 00000000..0683fd78 --- /dev/null +++ b/src/render/shaders/post_ssao.frag @@ -0,0 +1,86 @@ +#version 450 + +// Screen-space ambient occlusion from the depth buffer only (normals are reconstructed). +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform SsaoUBO { + vec4 uProj; // x P00, y P11, z P22, w P23 + vec4 uTexel; // xy depth texel size, z frame index + vec4 uParams; // x radius (m), y bias, z intensity, w sample count +} ao; + +layout(set = 2, binding = 0) uniform sampler2D uDepth; + +float linearDepth(float d) { + return ao.uProj.w / (d + ao.uProj.z); +} + +vec3 viewPosition(vec2 uv) { + float d = textureLod(uDepth, uv, 0.0).r; + float z = linearDepth(d); + vec2 ndc = vec2(uv.x * 2.0 - 1.0, (1.0 - uv.y) * 2.0 - 1.0); + return vec3(ndc.x / ao.uProj.x * z, ndc.y / ao.uProj.y * z, -z); +} + +vec3 reconstructNormal(vec3 center) { + vec2 tx = vec2(ao.uTexel.x, 0.0); + vec2 ty = vec2(0.0, ao.uTexel.y); + vec3 l = viewPosition(v_uv - tx), r = viewPosition(v_uv + tx); + vec3 u = viewPosition(v_uv - ty), d = viewPosition(v_uv + ty); + // Pick the neighbour closer in depth on each axis so silhouettes don't smear normals. + vec3 dx = abs(l.z - center.z) < abs(r.z - center.z) ? center - l : r - center; + vec3 dy = abs(u.z - center.z) < abs(d.z - center.z) ? center - u : d - center; + return normalize(cross(dy, dx)); +} + +float interleavedGradientNoise(vec2 p) { + return fract(52.9829189 * fract(dot(p, vec2(0.06711056, 0.00583715)))); +} + +void main() { + float rawDepth = textureLod(uDepth, v_uv, 0.0).r; + if (rawDepth >= 0.99999) { + outColor = vec4(1.0); + return; + } + vec3 P = viewPosition(v_uv); + vec3 N = reconstructNormal(P); + if (dot(N, -P) < 0.0) N = -N; + + float radius = max(ao.uParams.x, 0.01); + float bias = ao.uParams.y; + int samples = int(clamp(ao.uParams.w, 4.0, 32.0)); + vec2 pixel = v_uv / ao.uTexel.xy; + float noise = interleavedGradientNoise(pixel + ao.uTexel.z * 5.588238); + float angleOffset = noise * 6.28318530; + + vec3 up = abs(N.y) < 0.99 ? vec3(0.0, 1.0, 0.0) : vec3(1.0, 0.0, 0.0); + vec3 T = normalize(cross(up, N)); + vec3 B = cross(N, T); + + float occlusion = 0.0; + for (int i = 0; i < 32; ++i) { + if (i >= samples) break; + float fi = (float(i) + 0.5) / float(samples); + // Golden-angle spiral over the hemisphere, denser near the centre. + float phi = float(i) * 2.39996323 + angleOffset; + float cosTheta = sqrt(1.0 - fi); + float sinTheta = sqrt(fi); + vec3 h = vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta); + float scale = mix(0.15, 1.0, fract(fi * 7.31 + noise)); + vec3 S = P + (T * h.x + B * h.y + N * h.z) * radius * scale; + + float sz = -S.z; + if (sz <= 0.0) continue; + vec2 suv = vec2(S.x * ao.uProj.x / sz, S.y * ao.uProj.y / sz); + suv = vec2(suv.x * 0.5 + 0.5, 1.0 - (suv.y * 0.5 + 0.5)); + if (suv.x < 0.0 || suv.x > 1.0 || suv.y < 0.0 || suv.y > 1.0) continue; + float sceneZ = linearDepth(textureLod(uDepth, suv, 0.0).r); + float range = smoothstep(0.0, 1.0, radius / max(abs(-P.z - sceneZ), 1e-4)); + occlusion += (sceneZ <= sz - bias ? 1.0 : 0.0) * range; + } + float visibility = 1.0 - occlusion / float(samples); + visibility = pow(clamp(visibility, 0.0, 1.0), max(ao.uParams.z, 0.0)); + outColor = vec4(visibility, P.z, 0.0, 1.0); +} diff --git a/src/render/shaders/post_ssao_blur.frag b/src/render/shaders/post_ssao_blur.frag new file mode 100644 index 00000000..9bebd85c --- /dev/null +++ b/src/render/shaders/post_ssao_blur.frag @@ -0,0 +1,26 @@ +#version 450 + +// Depth-aware 4x4 blur for the SSAO noise pattern. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform BlurUBO { + vec4 uTexel; // xy texel size +} blur; + +layout(set = 2, binding = 0) uniform sampler2D uAo; + +void main() { + vec2 center = texture(uAo, v_uv).rg; + float sum = 0.0; + float weight = 0.0; + for (int y = -2; y < 2; ++y) { + for (int x = -2; x < 2; ++x) { + vec2 s = texture(uAo, v_uv + (vec2(x, y) + 0.5) * blur.uTexel.xy).rg; + float w = 1.0 / (1e-3 + abs(s.g - center.g) * 8.0); + sum += s.r * w; + weight += w; + } + } + outColor = vec4(sum / max(weight, 1e-4), center.g, 0.0, 1.0); +} diff --git a/src/render/shaders/post_taa.frag b/src/render/shaders/post_taa.frag new file mode 100644 index 00000000..407fffb8 --- /dev/null +++ b/src/render/shaders/post_taa.frag @@ -0,0 +1,86 @@ +#version 450 + +// Temporal anti-aliasing on the HDR scene: depth reprojection + YCoCg neighbourhood clamp. +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform TaaUBO { + mat4 uInvViewProj; + mat4 uPrevViewProj; + vec4 uTexel; // xy texel size + vec4 uParams; // x history valid, y feedback (history weight), z jitter x (uv), w jitter y (uv) +} taa; + +layout(set = 2, binding = 0) uniform sampler2D uCurrent; +layout(set = 2, binding = 1) uniform sampler2D uHistory; +layout(set = 2, binding = 2) uniform sampler2D uDepth; + +vec3 toYCoCg(vec3 c) { + return vec3(0.25 * c.r + 0.5 * c.g + 0.25 * c.b, + 0.5 * c.r - 0.5 * c.b, + -0.25 * c.r + 0.5 * c.g - 0.25 * c.b); +} + +vec3 fromYCoCg(vec3 c) { + return vec3(c.x + c.y - c.z, c.x + c.z, c.x - c.y - c.z); +} + +// Tonemapped weights stop bright pixels from dominating the resolve. +vec3 compress(vec3 c) { return c / (1.0 + max(c.r, max(c.g, c.b))); } +vec3 uncompress(vec3 c) { return c / max(1.0 - max(c.r, max(c.g, c.b)), 1e-4); } + +void main() { + vec2 uv = v_uv; + vec3 current = compress(texture(uCurrent, uv).rgb); + if (taa.uParams.x < 0.5) { + outColor = vec4(uncompress(current), 1.0); + return; + } + + // Closest depth in 3x3 keeps edges of foreground objects attached to their history. + float closest = 1.0; + vec2 closestUv = uv; + vec3 m1 = vec3(0.0); + vec3 m2 = vec3(0.0); + for (int y = -1; y <= 1; ++y) { + for (int x = -1; x <= 1; ++x) { + vec2 o = vec2(x, y) * taa.uTexel.xy; + float d = textureLod(uDepth, uv + o, 0.0).r; + if (d < closest) { + closest = d; + closestUv = uv + o; + } + vec3 s = toYCoCg(compress(texture(uCurrent, uv + o).rgb)); + m1 += s; + m2 += s * s; + } + } + + vec2 ndc = vec2(closestUv.x * 2.0 - 1.0, (1.0 - closestUv.y) * 2.0 - 1.0); + vec4 world = taa.uInvViewProj * vec4(ndc, closest, 1.0); + world /= world.w; + vec4 prevClip = taa.uPrevViewProj * world; + vec2 velocity = vec2(0.0); + if (prevClip.w > 1e-4) { + vec2 prevUv = vec2(prevClip.x / prevClip.w * 0.5 + 0.5, + 1.0 - (prevClip.y / prevClip.w * 0.5 + 0.5)); + velocity = closestUv - prevUv; + } + vec2 historyUv = uv - velocity; + if (historyUv.x < 0.0 || historyUv.x > 1.0 || historyUv.y < 0.0 || historyUv.y > 1.0) { + outColor = vec4(uncompress(current), 1.0); + return; + } + + vec3 history = toYCoCg(compress(texture(uHistory, historyUv).rgb)); + vec3 mean = m1 / 9.0; + vec3 sigma = sqrt(max(m2 / 9.0 - mean * mean, vec3(0.0))); + vec3 lo = mean - sigma * 1.25; + vec3 hi = mean + sigma * 1.25; + history = clamp(history, lo, hi); + + float motionPx = length(velocity / taa.uTexel.xy); + float feedback = mix(taa.uParams.y, 0.75, clamp(motionPx / 8.0, 0.0, 1.0)); + vec3 resolved = mix(toYCoCg(current), history, feedback); + outColor = vec4(uncompress(fromYCoCg(resolved)), 1.0); +} diff --git a/src/render/shaders/scene_instanced.vert b/src/render/shaders/scene_instanced.vert new file mode 100644 index 00000000..ed3c0a2e --- /dev/null +++ b/src/render/shaders/scene_instanced.vert @@ -0,0 +1,37 @@ +#version 450 + +layout(location = 0) in vec3 aPosition; +layout(location = 1) in vec3 aNormal; +layout(location = 2) in vec2 aTexCoord; +layout(location = 3) in vec4 aTangent; +layout(location = 4) in vec4 aModel0; +layout(location = 5) in vec4 aModel1; +layout(location = 6) in vec4 aModel2; +layout(location = 7) in vec4 aModel3; + +layout(set = 1, binding = 0) uniform VertexUBO { + mat4 uMVP; + mat4 uModel; +} ubo; + +layout(location = 0) out vec3 v_worldPos; +layout(location = 1) out vec3 v_normal; +layout(location = 2) out vec2 v_texCoord; +layout(location = 3) out vec3 v_tangent; +layout(location = 4) out vec3 v_bitangent; + +void main() { + mat4 model = mat4(aModel0, aModel1, aModel2, aModel3); + vec4 worldPos = model * vec4(aPosition, 1.0); + v_worldPos = worldPos.xyz; + + vec3 N = normalize(mat3(model) * aNormal); + vec3 T = normalize(mat3(model) * aTangent.xyz); + vec3 B = cross(N, T) * aTangent.w; + + v_normal = N; + v_tangent = T; + v_bitangent = B; + v_texCoord = aTexCoord; + gl_Position = ubo.uMVP * worldPos + ubo.uModel[3] * 0.0; +} diff --git a/src/render/shaders/scene_lit.frag b/src/render/shaders/scene_lit.frag index fce24d9d..2503a8bd 100644 --- a/src/render/shaders/scene_lit.frag +++ b/src/render/shaders/scene_lit.frag @@ -9,11 +9,11 @@ layout(location = 4) in vec3 v_bitangent; layout(set = 3, binding = 0) uniform LightingUBO { vec4 uCameraPos; vec4 uAmbient; - vec4 uAlbedo; + vec4 uAlbedo; // linear rgb, a = opacity float uMetallic; float uRoughness; - float uShininess; - vec4 uFlags; // x=receiveShadows, y=useNormalMap + float uReflectance; // dielectric F0, from MaterialSurface::reflectance + vec4 uFlags; // x=receiveShadows, y=useNormalMap, z=planar receiver, w=orm map int uDirCount; int uPointCount; int uSpotCount; @@ -26,6 +26,25 @@ layout(set = 3, binding = 0) uniform LightingUBO { vec4 uSpotDir[4]; vec4 uSpotColor[4]; vec4 uSpotAngle[4]; + vec4 uIblColor; // rgb irradiance, a = specular strength + vec4 uIblParams; // x diffuse, y enabled, z probe, w anisotropy + vec4 uVolParams; // x enabled, y density, z height, w steps + vec4 uReflectParams; // x intensity, y planeY, z clip below, w steps + vec4 uExtra; // x volumetric shadow samples, y planar steps, z env exposure (0 = no env), w env max mip + mat4 uReflectVP; + vec4 uEmission; // rgb already scaled by strength (linear) + vec4 uUvTransform; // xy tiling, zw offset + vec4 uMaterialParams; // x normal strength, y AO strength, z unused, w alpha cutoff + vec4 uCoat; // x clearcoat, y clearcoat roughness, z ior, w transmission + vec4 uSheen; // rgb sheen colour (linear), a sheen roughness + vec4 uIridescence; // x strength, y thickness (nm), z film ior + vec4 uMaterialFlags; // x alpha mode (0 opaque, 1 cutout, 2 blend), y emission map, z opaque scene copy bound, w SSR on + vec4 uSsrParams; // x intensity, y max roughness, z steps, w max distance + vec4 uProjParams; // x prev P22, y prev P23, z probe max mip, w unused + mat4 uPrevViewProj; + mat4 uPrevView; + vec4 uScreen; // xy 1 / target size, z frame index + mat4 uViewProj; } lights; layout(set = 3, binding = 1) uniform ShadowUBO { @@ -50,40 +69,66 @@ layout(set = 2, binding = 4) uniform samplerCube uPointShadow0; layout(set = 2, binding = 5) uniform samplerCube uPointShadow1; layout(set = 2, binding = 6) uniform sampler2D uSpotShadow0; layout(set = 2, binding = 7) uniform sampler2D uSpotShadow1; +layout(set = 2, binding = 8) uniform sampler2D uReflection; +layout(set = 2, binding = 9) uniform samplerCube uProbe; +layout(set = 2, binding = 10) uniform sampler2D uOrm; +layout(set = 2, binding = 11) uniform sampler2D uEnvironment; +layout(set = 2, binding = 12) uniform sampler2D uPrevColor; +layout(set = 2, binding = 13) uniform sampler2D uPrevDepth; +layout(set = 2, binding = 14) uniform sampler2D uEmissionMap; +layout(set = 2, binding = 15) uniform sampler2D uOpaqueScene; layout(location = 0) out vec4 outColor; -float sampleShadowMapAtlas(sampler2D shadowMap, mat4 lightVP, vec3 worldPos, int cascade, - int cascadeCount) { - vec4 clip = lightVP * vec4(worldPos, 1.0); +const vec2 kShadowPoisson[12] = vec2[]( + vec2(-0.326, -0.406), vec2(-0.840, -0.074), vec2(-0.696, 0.457), vec2(-0.203, 0.621), + vec2(0.962, -0.195), vec2(0.473, -0.480), vec2(0.519, 0.767), vec2(0.185, -0.893), + vec2(0.507, 0.064), vec2(0.896, 0.412), vec2(-0.322, -0.933), vec2(-0.792, -0.598)); + +// Normal-offset, texel-scaled bias and a rotated Poisson PCF (TAA averages the rotation). +float sampleShadowMapAtlas(sampler2D shadowMap, mat4 lightVP, vec3 worldPos, vec3 normal, + int cascade, int cascadeCount) { + vec2 atlasSize = vec2(textureSize(shadowMap, 0)); + float res = cascadeCount > 1 ? atlasSize.x * 0.5 : atlasSize.x; + float scaleX = length(vec3(lightVP[0][0], lightVP[1][0], lightVP[2][0])); + float depthPerMeter = length(vec3(lightVP[0][2], lightVP[1][2], lightVP[2][2])); + vec4 probe = lightVP * vec4(worldPos, 1.0); + if (probe.w <= 1e-5) return 1.0; + float texelWorld = 2.0 * probe.w / max(scaleX * res, 1e-5); + + vec3 lightAxis = normalize(vec3(lightVP[0][2], lightVP[1][2], lightVP[2][2])); + float NoL = abs(dot(normal, lightAxis)); + vec3 offsetPos = worldPos + normal * texelWorld * (0.6 + 1.6 * (1.0 - NoL)); + + vec4 clip = lightVP * vec4(offsetPos, 1.0); if (clip.w <= 1e-5) return 1.0; vec3 ndc = clip.xyz / clip.w; - if (abs(ndc.x) > 1.0 || abs(ndc.y) > 1.0 || ndc.z < -1.0 || ndc.z > 1.0) { - return 1.0; - } + if (abs(ndc.x) > 1.0 || abs(ndc.y) > 1.0 || ndc.z < 0.0 || ndc.z > 1.0) return 1.0; vec2 uv = vec2(ndc.x * 0.5 + 0.5, 1.0 - (ndc.y * 0.5 + 0.5)); + vec2 tileMin = vec2(0.0); + vec2 tileMax = vec2(1.0); if (cascadeCount > 1) { vec2 offset = vec2(float(cascade % 2) * 0.5, float(cascade / 2) * 0.5); uv = uv * 0.5 + offset; + tileMin = offset; + tileMax = offset + 0.5; } - - const float bias = 0.005; - float depth = ndc.z; - float shadow = 0.0; - vec2 atlasSize = vec2(textureSize(shadowMap, 0)); - vec2 texel = vec2(0.5 / atlasSize.x, 0.5 / atlasSize.y); - if (cascadeCount > 1) { - texel *= 0.5; - } - for (int y = -1; y <= 1; ++y) { - for (int x = -1; x <= 1; ++x) { - vec2 offset = vec2(float(x), float(y)) * texel; - float stored = texture(shadowMap, uv + offset).r; - shadow += (depth - bias > stored) ? 0.0 : 1.0; - } + vec2 texel = 1.0 / atlasSize; + tileMin += texel; + tileMax -= texel; + + float bias = depthPerMeter * texelWorld * 0.75 / max(probe.w, 1e-5) + 0.0004; + float depth = ndc.z - bias; + float angle = 6.2831853 * fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715)))); + mat2 rot = mat2(cos(angle), sin(angle), -sin(angle), cos(angle)); + float lit = 0.0; + for (int i = 0; i < 12; ++i) { + vec2 o = rot * kShadowPoisson[i] * texel * 1.75; + float stored = textureLod(shadowMap, clamp(uv + o, tileMin, tileMax), 0.0).r; + lit += depth > stored ? 0.0 : 1.0; } - return shadow / 9.0; + return lit / 12.0; } int selectDirCascade(float viewDepth, vec4 splitData) { @@ -95,13 +140,13 @@ int selectDirCascade(float viewDepth, vec4 splitData) { return 3; } -float sampleDirShadow(sampler2D shadowMap, int lightIndex, vec3 worldPos) { +float sampleDirShadow(sampler2D shadowMap, int lightIndex, vec3 worldPos, vec3 normal) { vec4 splitData = shadows.uDirCascadeSplits[lightIndex]; float viewDepth = (shadows.uCameraView * vec4(worldPos, 1.0)).z; if (viewDepth < 0.0) viewDepth = -viewDepth; int cascade = selectDirCascade(viewDepth, splitData); mat4 lightVP = shadows.uDirShadowVP[lightIndex * 4 + cascade]; - return sampleShadowMapAtlas(shadowMap, lightVP, worldPos, cascade, int(splitData.w)); + return sampleShadowMapAtlas(shadowMap, lightVP, worldPos, normal, cascade, int(splitData.w)); } float samplePointShadow(samplerCube shadowCube, vec3 worldPos, vec3 lightPos, float radius) { @@ -113,49 +158,400 @@ float samplePointShadow(samplerCube shadowCube, vec3 worldPos, vec3 lightPos, fl return (dist - bias > stored) ? 0.0 : 1.0; } -float sampleSpotShadow(sampler2D shadowMap, mat4 lightVP, vec3 worldPos) { - return sampleShadowMapAtlas(shadowMap, lightVP, worldPos, 0, 1); +float sampleSpotShadow(sampler2D shadowMap, mat4 lightVP, vec3 worldPos, vec3 normal) { + return sampleShadowMapAtlas(shadowMap, lightVP, worldPos, normal, 0, 1); +} + +const float PI = 3.14159265; + +struct Surface { + vec3 n; + vec3 v; + vec3 albedo; + vec3 F0; + float metallic; + float roughness; + float ao; + float clearcoat; + float clearcoatRoughness; + vec3 sheen; + float sheenRoughness; + float transmission; + vec3 film; // thin-film reflectance per channel + float iridescence; +}; + +vec2 materialUv() { + return v_texCoord * lights.uUvTransform.xy + lights.uUvTransform.zw; } -vec3 surfaceNormal() { +vec3 surfaceNormal(vec2 uv) { vec3 N = normalize(v_normal); if (lights.uFlags.y < 0.5) return N; vec3 T = normalize(v_tangent); vec3 B = normalize(v_bitangent); - vec3 map = texture(uNormalMap, v_texCoord).xyz * 2.0 - 1.0; - mat3 tbn = mat3(T, B, N); - return normalize(tbn * map); + vec3 map = texture(uNormalMap, uv).xyz * 2.0 - 1.0; + map.xy *= lights.uMaterialParams.x; + return normalize(mat3(T, B, N) * map); } -void main() { - vec3 n = surfaceNormal(); - vec3 viewDir = normalize(lights.uCameraPos.xyz - v_worldPos); - vec3 surfaceAlbedo = texture(uAlbedoMap, v_texCoord).rgb * lights.uAlbedo.rgb; - vec3 ambient = lights.uAmbient.rgb * surfaceAlbedo; - vec3 color = ambient; +float maxComponent(vec3 v) { return max(v.r, max(v.g, v.b)); } - for (int i = 0; i < lights.uDirCount; ++i) { - vec3 dir = normalize(-lights.uDirData[i].xyz); - float ndotl = max(dot(n, dir), 0.0); +float D_GGX(float NoH, float a) { + float a2 = a * a; + float d = (NoH * a2 - NoH) * NoH + 1.0; + return a2 / max(PI * d * d, 1e-7); +} + +float V_SmithGGXCorrelated(float NoV, float NoL, float a) { + float a2 = a * a; + float gv = NoL * sqrt(NoV * NoV * (1.0 - a2) + a2); + float gl = NoV * sqrt(NoL * NoL * (1.0 - a2) + a2); + return 0.5 / max(gv + gl, 1e-5); +} + +vec3 F_Schlick(vec3 F0, float VoH) { + return F0 + (1.0 - F0) * pow(1.0 - VoH, 5.0); +} - vec3 diffuse = lights.uDirColor[i].rgb * lights.uDirData[i].w * ndotl; +float D_Charlie(float roughness, float NoH) { + float a = max(roughness * roughness, 0.01); + float invA = 1.0 / a; + float sin2h = max(1.0 - NoH * NoH, 0.0078125); + return (2.0 + invA) * pow(sin2h, invA * 0.5) / (2.0 * PI); +} + +float V_Neubelt(float NoV, float NoL) { + return clamp(1.0 / (4.0 * (NoL + NoV - NoL * NoV)), 0.0, 1.0); +} - vec3 halfVec = normalize(dir + viewDir); - float ndoth = max(dot(n, halfVec), 0.0); - float spec = pow(ndoth, max(lights.uShininess, 1.0)); - vec3 specular = lights.uDirColor[i].rgb * spec * (1.0 - lights.uRoughness); +// Split-sum DFG approximation (Karis, mobile): scale/bias on F0 for image-based specular. +vec3 envBrdfApprox(vec3 F0, float roughness, float NoV) { + const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022); + const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04); + vec4 r = roughness * c0 + c1; + float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y; + vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw; + return F0 * AB.x + AB.y; +} + +// Thin-film interference: reflectance of a film of `thickness` nm at three wavelengths. +vec3 thinFilm(float cosTheta, float thickness, float filmIor) { + float sinT2 = (1.0 - cosTheta * cosTheta) / max(filmIor * filmIor, 1.0); + float cosT = sqrt(max(1.0 - sinT2, 0.0)); + float opd = 2.0 * filmIor * thickness * cosT; + vec3 phase = 2.0 * PI * opd / vec3(650.0, 532.0, 450.0); + return 0.5 + 0.5 * cos(phase); +} + +vec3 iridescentWeight(Surface s, vec3 weight) { + if (s.iridescence <= 0.0) return weight; + vec3 film = clamp(s.film * max(maxComponent(weight), 0.15) * 1.6, 0.0, 1.0); + return mix(weight, film, s.iridescence); +} + +// Direct light, returning diffuse and specular separately so blended surfaces can keep their +// highlights at full strength. +void shadeLight(Surface s, vec3 l, vec3 radiance, inout vec3 diffuseOut, inout vec3 specularOut) { + float NoL = max(dot(s.n, l), 0.0); + if (NoL <= 0.0) return; + vec3 h = normalize(s.v + l); + float NoV = max(dot(s.n, s.v), 1e-4); + float NoH = max(dot(s.n, h), 0.0); + float VoH = max(dot(s.v, h), 0.0); + + float a = max(s.roughness * s.roughness, 0.002); + vec3 F = iridescentWeight(s, F_Schlick(s.F0, VoH)); + vec3 spec = D_GGX(NoH, a) * V_SmithGGXCorrelated(NoV, NoL, a) * F * PI; + vec3 kd = (1.0 - F) * (1.0 - s.metallic) * (1.0 - s.transmission); + vec3 diffuse = kd * s.albedo * s.ao; + + if (maxComponent(s.sheen) > 0.0) { + diffuse += s.sheen * D_Charlie(s.sheenRoughness, NoH) * V_Neubelt(NoV, NoL) * PI; + } + if (s.clearcoat > 0.0) { + float ac = max(s.clearcoatRoughness * s.clearcoatRoughness, 0.002); + float Fc = (0.04 + 0.96 * pow(1.0 - VoH, 5.0)) * s.clearcoat; + float coat = D_GGX(NoH, ac) * V_SmithGGXCorrelated(NoV, NoL, ac) * Fc * PI; + diffuse *= 1.0 - Fc; + spec = spec * (1.0 - Fc) + vec3(coat); + } + diffuseOut += diffuse * radiance * NoL; + specularOut += spec * radiance * NoL; +} + +bool environmentAvailable() { + return lights.uExtra.z > 0.0; +} + +// Same mapping as SkyboxRenderer::directionToEquirectUV. +vec2 directionToEquirect(vec3 d) { + d = normalize(d); + float u = atan(d.x, d.z) / 6.28318530 + 0.5; + float v = 0.5 - asin(clamp(d.y, -1.0, 1.0)) / 3.14159265; + return vec2(u, v); +} + +// Sky radiance along `dir`; `blur` 0 = mirror, 1 = fully diffuse (smallest mip). +vec3 sampleEnvironment(vec3 dir, float blur) { + if (!environmentAvailable()) return lights.uIblColor.rgb; + float lod = clamp(blur, 0.0, 1.0) * lights.uExtra.w; + return textureLod(uEnvironment, directionToEquirect(dir), lod).rgb * lights.uExtra.z; +} + +float interleavedGradientNoise(vec2 p) { + return fract(52.9829189 * fract(dot(p, vec2(0.06711056, 0.00583715)))); +} + +float prevLinearDepth(float d) { + return lights.uProjParams.y / (d + lights.uProjParams.x); +} + +bool prevScreenUv(vec3 p, out vec2 uv, out float rayDist) { + vec4 clip = lights.uPrevViewProj * vec4(p, 1.0); + if (clip.w <= 0.01) return false; + uv = vec2(clip.x / clip.w * 0.5 + 0.5, 1.0 - (clip.y / clip.w * 0.5 + 0.5)); + rayDist = -(lights.uPrevView * vec4(p, 1.0)).z; + return uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0; +} + +// Screen-space reflection: marches the reflected ray in world space against last frame's depth +// and returns last frame's colour at the hit (rgb) with a confidence (a). +vec4 traceScreenSpace(vec3 origin, vec3 dir, float roughness) { + if (lights.uMaterialFlags.w < 0.5 || roughness > lights.uSsrParams.y) return vec4(0.0); + int steps = int(clamp(lights.uSsrParams.z, 4.0, 64.0)); + float maxDist = max(lights.uSsrParams.w, 1.0); + float jitter = interleavedGradientNoise(gl_FragCoord.xy + lights.uScreen.z * 5.588238); + float prevT = 0.0; + for (int i = 1; i <= 64; ++i) { + if (i > steps) break; + float s = (float(i) - 1.0 + jitter) / float(steps); + float t = maxDist * s * s + 0.02; + vec2 uv; + float rayDist; + if (!prevScreenUv(origin + dir * t, uv, rayDist)) break; + float sceneDist = prevLinearDepth(textureLod(uPrevDepth, uv, 0.0).r); + float diff = rayDist - sceneDist; + float thickness = max(0.25, (t - prevT) * 1.5 + t * 0.03); + if (diff > 0.0 && diff < thickness) { + float lo = prevT; + float hi = t; + for (int k = 0; k < 5; ++k) { + float mid = 0.5 * (lo + hi); + vec2 muv; + float mDist; + if (!prevScreenUv(origin + dir * mid, muv, mDist)) break; + float mScene = prevLinearDepth(textureLod(uPrevDepth, muv, 0.0).r); + if (mDist > mScene) hi = mid; else lo = mid; + } + vec2 hitUv; + float hitDist; + if (!prevScreenUv(origin + dir * hi, hitUv, hitDist)) break; + vec3 hit = textureLod(uPrevColor, hitUv, 0.0).rgb; + vec2 edge = min(hitUv, 1.0 - hitUv); + float fade = smoothstep(0.0, 0.08, min(edge.x, edge.y)); + fade *= 1.0 - smoothstep(0.7, 1.0, hi / maxDist); + float maxRough = max(lights.uSsrParams.y, 0.01); + fade *= 1.0 - smoothstep(maxRough * 0.6, maxRough, roughness); + return vec4(hit, clamp(fade * lights.uSsrParams.x, 0.0, 1.0)); + } + prevT = t; + } + return vec4(0.0); +} +vec3 sampleProbeOrSky(vec3 dir, float roughness) { + float blur = sqrt(clamp(roughness, 0.0, 1.0)); + if (lights.uIblParams.z > 0.5) { + return textureLod(uProbe, dir, blur * lights.uProjParams.z).rgb; + } + return sampleEnvironment(dir, blur); +} + +vec3 specularRadiance(vec3 R, float roughness) { + vec3 radiance = sampleProbeOrSky(R, roughness); + vec4 ssr = traceScreenSpace(v_worldPos + normalize(v_normal) * 0.02, R, roughness); + return mix(radiance, ssr.rgb, ssr.a); +} + +void applyIbl(Surface s, inout vec3 diffuseOut, inout vec3 specularOut) { + if (lights.uIblParams.y < 0.5) return; + float NoV = max(dot(s.n, s.v), 1e-4); + vec3 R = reflect(-s.v, s.n); + vec3 specWeight = iridescentWeight(s, envBrdfApprox(s.F0, s.roughness, NoV)); + vec3 kd = (1.0 - specWeight) * (1.0 - s.metallic) * (1.0 - s.transmission); + + vec3 irradiance = sampleEnvironment(s.n, 1.0); + vec3 diffuse = kd * irradiance * s.albedo * max(lights.uIblParams.x, 0.0) * s.ao; + if (maxComponent(s.sheen) > 0.0) { + diffuse += s.sheen * irradiance * s.ao * mix(0.08, 0.5, pow(1.0 - NoV, 3.0)); + } + + float specOcclusion = + clamp(pow(NoV + s.ao, exp2(-16.0 * s.roughness - 1.0)) - 1.0 + s.ao, 0.0, 1.0); + vec3 spec = specWeight * specularRadiance(R, s.roughness) * max(lights.uIblColor.a, 0.0) * + specOcclusion; + + if (s.clearcoat > 0.0) { + float Fc = (0.04 + 0.96 * pow(1.0 - NoV, 5.0)) * s.clearcoat; + vec3 Rc = reflect(-s.v, normalize(v_normal)); + diffuse *= 1.0 - Fc; + spec = spec * (1.0 - Fc) + Fc * specularRadiance(Rc, s.clearcoatRoughness) * + max(lights.uIblColor.a, 0.0) * specOcclusion; + } + diffuseOut += diffuse; + specularOut += spec; +} + +// What shows through a transmissive surface: the opaque scene behind it, bent by refraction. +vec3 transmittedLight(Surface s) { + float ior = max(lights.uCoat.z, 1.0); + vec3 T = refract(-s.v, s.n, 1.0 / ior); + if (dot(T, T) < 1e-6) T = -s.v; + if (lights.uMaterialFlags.z > 0.5) { + float thickness = max(lights.uMaterialParams.z, 0.01); + vec3 bent = v_worldPos + T * thickness; + vec4 clip = lights.uViewProj * vec4(bent, 1.0); + if (clip.w > 0.01) { + vec2 uv = vec2(clip.x / clip.w * 0.5 + 0.5, 1.0 - (clip.y / clip.w * 0.5 + 0.5)); + uv = clamp(uv, vec2(0.001), vec2(0.999)); + float r = s.roughness * s.roughness * 0.04; + if (r < 0.0005) return textureLod(uOpaqueScene, uv, 0.0).rgb; + vec3 sum = vec3(0.0); + for (int i = 0; i < 8; ++i) { + float a = float(i) * 2.39996323; + vec2 o = vec2(cos(a), sin(a)) * r * sqrt((float(i) + 0.5) / 8.0); + sum += textureLod(uOpaqueScene, clamp(uv + o, vec2(0.001), vec2(0.999)), 0.0).rgb; + } + return sum / 8.0; + } + } + return sampleProbeOrSky(T, s.roughness); +} + +vec3 applyVolumetrics(vec3 color) { + if (lights.uVolParams.x < 0.5 || lights.uVolParams.y <= 0.0001) return color; + vec3 ray = v_worldPos - lights.uCameraPos.xyz; + float rayLen = length(ray); + if (rayLen < 0.05) return color; + vec3 rd = ray / rayLen; + float steps = clamp(lights.uVolParams.w, 1.0, 12.0); + float stepLen = rayLen / steps; + vec3 lightDir = vec3(0.0, 1.0, 0.0); + if (lights.uDirCount > 0) lightDir = normalize(-lights.uDirData[0].xyz); + float phase = clamp(1.0 + lights.uIblParams.w * dot(rd, lightDir), 0.15, 2.0); + vec3 accum = vec3(0.0); + float transmittance = 1.0; + for (int i = 0; i < 12; ++i) { + if (float(i) >= steps) break; + vec3 p = lights.uCameraPos.xyz + rd * (stepLen * (float(i) + 0.5)); + float heightFog = exp(-max(p.y, 0.0) / max(lights.uVolParams.z, 0.5)); + float density = lights.uVolParams.y * heightFog; + float shadow = 1.0; + if (lights.uExtra.x > 0.5 && shadows.uDirShadowValid.x > 0.5) { + shadow = sampleDirShadow(uShadowMap0, 0, p, vec3(0.0)); + } + float absorb = density * stepLen; + vec3 fogColor = lights.uIblColor.rgb * phase * shadow; + accum += transmittance * fogColor * absorb; + transmittance *= exp(-absorb); + } + return color * transmittance + accum; +} + +vec3 applyReflection(vec3 n, vec3 viewDir, vec3 color, float roughness) { + if (lights.uFlags.z < 0.5 || lights.uReflectParams.x <= 0.01) return color; + vec3 R = reflect(-viewDir, n); + float dist = max(lights.uReflectParams.w, 0.5); + vec4 startC = lights.uReflectVP * vec4(v_worldPos, 1.0); + vec4 endC = lights.uReflectVP * vec4(v_worldPos + R * dist, 1.0); + if (startC.w <= 0.05) return color; + vec2 startUv = vec2(startC.x / startC.w * 0.5 + 0.5, 1.0 - (startC.y / startC.w * 0.5 + 0.5)); + vec2 endUv = startUv; + if (endC.w > 0.05) { + endUv = vec2(endC.x / endC.w * 0.5 + 0.5, 1.0 - (endC.y / endC.w * 0.5 + 0.5)); + } + float steps = clamp(dist > 0.6 ? lights.uExtra.y : 1.0, 1.0, 12.0); + vec2 duv = (endUv - startUv) / steps; + vec3 accum = vec3(0.0); + float wsum = 0.0; + for (int s = 0; s < 12; ++s) { + if (float(s) >= steps) break; + vec2 uv = startUv + duv * float(s); + if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) break; + float w = 1.0 - float(s) / steps; + vec4 hit = texture(uReflection, uv); + accum += mix(sampleEnvironment(R, roughness), hit.rgb, hit.a) * w; + wsum += w; + } + if (wsum <= 0.001) return color; + float rough = clamp(roughness, 0.0, 1.0); + float amount = lights.uReflectParams.x * (1.0 - rough * 0.65); + return mix(color, accum / wsum, clamp(amount, 0.0, 1.0)); +} + +void main() { + if (lights.uReflectParams.z > 0.5 && v_worldPos.y < lights.uReflectParams.y - 0.02) { + discard; + } + + vec2 uv = materialUv(); + vec4 albedoSample = texture(uAlbedoMap, uv); + float opacity = clamp(albedoSample.a * lights.uAlbedo.a, 0.0, 1.0); + int alphaMode = int(lights.uMaterialFlags.x + 0.5); + if (alphaMode == 1 && opacity < lights.uMaterialParams.w) discard; + + Surface s; + s.n = surfaceNormal(uv); + s.v = normalize(lights.uCameraPos.xyz - v_worldPos); + s.metallic = clamp(lights.uMetallic, 0.0, 1.0); + s.roughness = clamp(lights.uRoughness, 0.0, 1.0); + s.ao = 1.0; + if (lights.uFlags.w > 0.5) { + vec3 orm = texture(uOrm, uv).rgb; + s.ao = mix(1.0, clamp(orm.r, 0.0, 1.0), clamp(lights.uMaterialParams.y, 0.0, 1.0)); + s.roughness = clamp(orm.g, 0.0, 1.0); + s.metallic = clamp(orm.b, 0.0, 1.0); + } + s.albedo = albedoSample.rgb * lights.uAlbedo.rgb; + float reflectance = clamp(lights.uReflectance, 0.0, 1.0); + s.F0 = mix(vec3(reflectance), s.albedo, s.metallic); + s.clearcoat = clamp(lights.uCoat.x, 0.0, 1.0); + s.clearcoatRoughness = clamp(lights.uCoat.y, 0.0, 1.0); + s.transmission = clamp(lights.uCoat.w, 0.0, 1.0) * (1.0 - s.metallic); + s.sheen = max(lights.uSheen.rgb, vec3(0.0)); + s.sheenRoughness = clamp(lights.uSheen.a, 0.0, 1.0); + s.iridescence = clamp(lights.uIridescence.x, 0.0, 1.0); + s.film = vec3(1.0); + if (s.iridescence > 0.0) { + s.film = thinFilm(max(dot(s.n, s.v), 0.0), lights.uIridescence.y, lights.uIridescence.z); + } + if (s.transmission > 0.0) { + // Dielectric F0 from the index of refraction. + float ior = max(lights.uCoat.z, 1.0); + float f0 = (ior - 1.0) / (ior + 1.0); + s.F0 = mix(s.F0, vec3(f0 * f0), s.transmission); + } + + vec3 diffuse = vec3(0.0); + vec3 specular = vec3(0.0); + vec3 shadowNormal = normalize(v_normal); + if (lights.uIblParams.y < 0.5) { + diffuse += lights.uAmbient.rgb * s.albedo * s.ao * (1.0 - s.transmission); + } + + for (int i = 0; i < lights.uDirCount; ++i) { + vec3 dir = normalize(-lights.uDirData[i].xyz); float shadow = 1.0; if (lights.uFlags.x > 0.5 && lights.uDirData[i].w > 0.0) { if (i == 0 && shadows.uDirShadowValid.x > 0.5) { - shadow = sampleDirShadow(uShadowMap0, 0, v_worldPos); + shadow = sampleDirShadow(uShadowMap0, 0, v_worldPos, shadowNormal); } else if (i == 1 && shadows.uDirShadowValid.y > 0.5) { - shadow = sampleDirShadow(uShadowMap1, 1, v_worldPos); + shadow = sampleDirShadow(uShadowMap1, 1, v_worldPos, shadowNormal); } } - - color += (diffuse * surfaceAlbedo + specular) * shadow; + shadeLight(s, dir, lights.uDirColor[i].rgb * lights.uDirData[i].w * shadow, diffuse, specular); } for (int i = 0; i < lights.uPointCount; ++i) { @@ -166,14 +562,6 @@ void main() { vec3 ldir = toLight / dist; float atten = 1.0 - smoothstep(radius * 0.75, radius, dist); - float ndotl = max(dot(n, ldir), 0.0); - vec3 diffuse = lights.uPointColor[i].rgb * lights.uPointColor[i].a * ndotl * atten; - - vec3 halfVec = normalize(ldir + viewDir); - float ndoth = max(dot(n, halfVec), 0.0); - float spec = pow(ndoth, max(lights.uShininess, 1.0)); - vec3 specular = lights.uPointColor[i].rgb * spec * (1.0 - lights.uRoughness); - float shadow = 1.0; if (lights.uFlags.x > 0.5) { if (i == 0 && shadows.uPointShadowValid.x > 0.5) { @@ -184,8 +572,8 @@ void main() { shadows.uPointShadowPos[1].xyz, shadows.uPointShadowRadius.y); } } - - color += (diffuse * surfaceAlbedo + specular) * shadow; + shadeLight(s, ldir, lights.uPointColor[i].rgb * lights.uPointColor[i].a * atten * shadow, + diffuse, specular); } for (int i = 0; i < lights.uSpotCount; ++i) { @@ -202,27 +590,42 @@ void main() { float spotAtten = (cone - cosHalfAngle) / max(0.0001, 1.0 - cosHalfAngle); float rangeAtten = 1.0 - (dist / radius); - vec3 ldir = -fromLight; - float ndotl = max(dot(n, ldir), 0.0); - vec3 diffuse = lights.uSpotColor[i].rgb * lights.uSpotDir[i].w * ndotl * spotAtten * - rangeAtten * rangeAtten; - - vec3 halfVec = normalize(ldir + viewDir); - float ndoth = max(dot(n, halfVec), 0.0); - float spec = pow(ndoth, max(lights.uShininess, 1.0)); - vec3 specular = lights.uSpotColor[i].rgb * spec * (1.0 - lights.uRoughness); - float shadow = 1.0; if (lights.uFlags.x > 0.5) { if (i == 0 && shadows.uSpotShadowValid.x > 0.5) { - shadow = sampleSpotShadow(uSpotShadow0, shadows.uSpotShadowVP[0], v_worldPos); + shadow = sampleSpotShadow(uSpotShadow0, shadows.uSpotShadowVP[0], v_worldPos, shadowNormal); } else if (i == 1 && shadows.uSpotShadowValid.y > 0.5) { - shadow = sampleSpotShadow(uSpotShadow1, shadows.uSpotShadowVP[1], v_worldPos); + shadow = sampleSpotShadow(uSpotShadow1, shadows.uSpotShadowVP[1], v_worldPos, shadowNormal); } } + shadeLight(s, -fromLight, + lights.uSpotColor[i].rgb * lights.uSpotDir[i].w * spotAtten * rangeAtten * + rangeAtten * shadow, + diffuse, specular); + } + + applyIbl(s, diffuse, specular); + + if (s.transmission > 0.0) { + float NoV = max(dot(s.n, s.v), 1e-4); + vec3 through = 1.0 - envBrdfApprox(s.F0, s.roughness, NoV); + diffuse += transmittedLight(s) * s.albedo * through * s.transmission; + } + + vec3 emission = lights.uEmission.rgb; + if (lights.uMaterialFlags.y > 0.5) emission *= texture(uEmissionMap, uv).rgb; - color += (diffuse * surfaceAlbedo + specular) * shadow; + if (alphaMode == 2 && s.transmission <= 0.0) { + // Premultiplied: highlights and reflections stay visible on faint surfaces. + vec3 color = diffuse * opacity + specular + emission; + color = applyVolumetrics(color); + outColor = vec4(color, opacity); + return; } + vec3 color = diffuse + specular; + color = applyReflection(s.n, s.v, color, s.roughness); + color += emission; + color = applyVolumetrics(color); outColor = vec4(color, 1.0); } diff --git a/src/render/shaders/sky.frag b/src/render/shaders/sky.frag new file mode 100644 index 00000000..14198f88 --- /dev/null +++ b/src/render/shaders/sky.frag @@ -0,0 +1,39 @@ +#version 450 + +layout(location = 0) in vec2 v_uv; +layout(location = 0) out vec4 outColor; + +layout(set = 3, binding = 0) uniform SkyUBO { + mat4 uInvViewProj; + vec4 uParams; // x exposure (0 = no environment), y lod + vec4 uZenith; // fallback gradient (linear) + vec4 uHorizon; + vec4 uGround; +} sky; + +layout(set = 2, binding = 0) uniform sampler2D uEnvironment; + +vec2 directionToEquirect(vec3 d) { + float u = atan(d.x, d.z) / 6.28318530 + 0.5; + float v = 0.5 - asin(clamp(d.y, -1.0, 1.0)) / 3.14159265; + return vec2(u, v); +} + +void main() { + vec2 ndc = vec2(v_uv.x * 2.0 - 1.0, (1.0 - v_uv.y) * 2.0 - 1.0); + vec4 nearP = sky.uInvViewProj * vec4(ndc, 0.0, 1.0); + vec4 farP = sky.uInvViewProj * vec4(ndc, 1.0, 1.0); + vec3 dir = normalize(farP.xyz / farP.w - nearP.xyz / nearP.w); + + vec3 color; + if (sky.uParams.x > 0.0) { + // Explicit LOD: implicit derivatives jump at the u = 0/1 seam and pick the smallest mip. + color = textureLod(uEnvironment, directionToEquirect(dir), sky.uParams.y).rgb * sky.uParams.x; + } else { + float up = clamp(dir.y, -1.0, 1.0); + color = up >= 0.0 + ? mix(sky.uHorizon.rgb, sky.uZenith.rgb, pow(up, 0.6)) + : mix(sky.uHorizon.rgb, sky.uGround.rgb, pow(-up, 0.4)); + } + outColor = vec4(color, 1.0); +} diff --git a/src/render/shaders/sphere_lit.frag b/src/render/shaders/sphere_lit.frag index 551b1e93..5f48ee12 100644 --- a/src/render/shaders/sphere_lit.frag +++ b/src/render/shaders/sphere_lit.frag @@ -8,6 +8,8 @@ layout(set = 3, binding = 0) uniform Uniforms { vec4 uAlbedo; float uMetallic; float uRoughness; + float uReflectance; + float uPad; } ubo; layout(location = 0) out vec4 outColor; @@ -21,8 +23,8 @@ void main() { float specPower = max(4.0, (1.0 - ubo.uRoughness) * 96.0 + 8.0); vec3 viewDir = vec3(0.0, 0.0, 1.0); vec3 halfVec = normalize(lightDir + viewDir); - float spec = pow(max(dot(n, halfVec), 0.0), specPower) * ubo.uMetallic; - - vec3 color = ubo.uAlbedo.rgb * diffuse + vec3(spec); + vec3 F0 = mix(vec3(clamp(ubo.uReflectance, 0.0, 1.0)), ubo.uAlbedo.rgb, clamp(ubo.uMetallic, 0.0, 1.0)); + float spec = pow(max(dot(n, halfVec), 0.0), specPower); + vec3 color = ubo.uAlbedo.rgb * diffuse * (1.0 - F0) + F0 * spec; outColor = vec4(color, 1.0); } diff --git a/src/render/shaders/terrain_lit.frag b/src/render/shaders/terrain_lit.frag index 5351b7bd..54bb93cd 100644 --- a/src/render/shaders/terrain_lit.frag +++ b/src/render/shaders/terrain_lit.frag @@ -26,6 +26,13 @@ layout(set = 3, binding = 0) uniform LightingUBO { vec4 uSpotDir[4]; vec4 uSpotColor[4]; vec4 uSpotAngle[4]; + vec4 uIblColor; + vec4 uIblParams; + vec4 uVolParams; + vec4 uReflectParams; + vec4 uExtra; + mat4 uReflectVP; + vec4 uEmission; } lights; layout(set = 3, binding = 1) uniform ShadowUBO { @@ -63,33 +70,55 @@ layout(set = 2, binding = 11) uniform sampler2D uSpotShadow1; layout(location = 0) out vec4 outColor; -float sampleShadowMapAtlas(sampler2D shadowMap, mat4 lightVP, vec3 worldPos, int cascade, - int cascadeCount) { - vec4 clip = lightVP * vec4(worldPos, 1.0); +const vec2 kShadowPoisson[12] = vec2[]( + vec2(-0.326, -0.406), vec2(-0.840, -0.074), vec2(-0.696, 0.457), vec2(-0.203, 0.621), + vec2(0.962, -0.195), vec2(0.473, -0.480), vec2(0.519, 0.767), vec2(0.185, -0.893), + vec2(0.507, 0.064), vec2(0.896, 0.412), vec2(-0.322, -0.933), vec2(-0.792, -0.598)); + +// Normal-offset, texel-scaled bias and a rotated Poisson PCF (TAA averages the rotation). +float sampleShadowMapAtlas(sampler2D shadowMap, mat4 lightVP, vec3 worldPos, vec3 normal, + int cascade, int cascadeCount) { + vec2 atlasSize = vec2(textureSize(shadowMap, 0)); + float res = cascadeCount > 1 ? atlasSize.x * 0.5 : atlasSize.x; + float scaleX = length(vec3(lightVP[0][0], lightVP[1][0], lightVP[2][0])); + float depthPerMeter = length(vec3(lightVP[0][2], lightVP[1][2], lightVP[2][2])); + vec4 probe = lightVP * vec4(worldPos, 1.0); + if (probe.w <= 1e-5) return 1.0; + float texelWorld = 2.0 * probe.w / max(scaleX * res, 1e-5); + + vec3 lightAxis = normalize(vec3(lightVP[0][2], lightVP[1][2], lightVP[2][2])); + float NoL = abs(dot(normal, lightAxis)); + vec3 offsetPos = worldPos + normal * texelWorld * (0.6 + 1.6 * (1.0 - NoL)); + + vec4 clip = lightVP * vec4(offsetPos, 1.0); if (clip.w <= 1e-5) return 1.0; vec3 ndc = clip.xyz / clip.w; - if (abs(ndc.x) > 1.0 || abs(ndc.y) > 1.0 || ndc.z < -1.0 || ndc.z > 1.0) return 1.0; + if (abs(ndc.x) > 1.0 || abs(ndc.y) > 1.0 || ndc.z < 0.0 || ndc.z > 1.0) return 1.0; + vec2 uv = vec2(ndc.x * 0.5 + 0.5, 1.0 - (ndc.y * 0.5 + 0.5)); + vec2 tileMin = vec2(0.0); + vec2 tileMax = vec2(1.0); if (cascadeCount > 1) { vec2 offset = vec2(float(cascade % 2) * 0.5, float(cascade / 2) * 0.5); uv = uv * 0.5 + offset; + tileMin = offset; + tileMax = offset + 0.5; } - const float bias = 0.005; - float depth = ndc.z; - float shadow = 0.0; - vec2 atlasSize = vec2(textureSize(shadowMap, 0)); - vec2 texel = vec2(0.5 / atlasSize.x, 0.5 / atlasSize.y); - if (cascadeCount > 1) { - texel *= 0.5; - } - for (int y = -1; y <= 1; ++y) { - for (int x = -1; x <= 1; ++x) { - vec2 offset = vec2(float(x), float(y)) * texel; - float stored = texture(shadowMap, uv + offset).r; - shadow += (depth - bias > stored) ? 0.0 : 1.0; - } + vec2 texel = 1.0 / atlasSize; + tileMin += texel; + tileMax -= texel; + + float bias = depthPerMeter * texelWorld * 0.75 / max(probe.w, 1e-5) + 0.0004; + float depth = ndc.z - bias; + float angle = 6.2831853 * fract(52.9829189 * fract(dot(gl_FragCoord.xy, vec2(0.06711056, 0.00583715)))); + mat2 rot = mat2(cos(angle), sin(angle), -sin(angle), cos(angle)); + float lit = 0.0; + for (int i = 0; i < 12; ++i) { + vec2 o = rot * kShadowPoisson[i] * texel * 1.75; + float stored = textureLod(shadowMap, clamp(uv + o, tileMin, tileMax), 0.0).r; + lit += depth > stored ? 0.0 : 1.0; } - return shadow / 9.0; + return lit / 12.0; } int selectDirCascade(float viewDepth, vec4 splitData) { @@ -101,17 +130,17 @@ int selectDirCascade(float viewDepth, vec4 splitData) { return 3; } -float sampleDirShadow(sampler2D shadowMap, int lightIndex, vec3 worldPos) { +float sampleDirShadow(sampler2D shadowMap, int lightIndex, vec3 worldPos, vec3 normal) { vec4 splitData = shadows.uDirCascadeSplits[lightIndex]; float viewDepth = (shadows.uCameraView * vec4(worldPos, 1.0)).z; if (viewDepth < 0.0) viewDepth = -viewDepth; int cascade = selectDirCascade(viewDepth, splitData); mat4 lightVP = shadows.uDirShadowVP[lightIndex * 4 + cascade]; - return sampleShadowMapAtlas(shadowMap, lightVP, worldPos, cascade, int(splitData.w)); + return sampleShadowMapAtlas(shadowMap, lightVP, worldPos, normal, cascade, int(splitData.w)); } -float sampleSpotShadow(sampler2D shadowMap, mat4 lightVP, vec3 worldPos) { - return sampleShadowMapAtlas(shadowMap, lightVP, worldPos, 0, 1); +float sampleSpotShadow(sampler2D shadowMap, mat4 lightVP, vec3 worldPos, vec3 normal) { + return sampleShadowMapAtlas(shadowMap, lightVP, worldPos, normal, 0, 1); } float samplePointShadow(samplerCube shadowCube, vec3 worldPos, vec3 lightPos, float radius) { @@ -176,8 +205,12 @@ vec3 sampleTerrainNormal(vec3 n) { void main() { vec3 n = sampleTerrainNormal(v_normal); + vec3 shadowNormal = normalize(v_normal); vec3 surfaceAlbedo = sampleTerrainAlbedo(n) * lights.uAlbedo.rgb; - vec3 color = lights.uAmbient.rgb * surfaceAlbedo; + // Sky irradiance replaces the flat ambient once IBL is on, matching scene_lit. + vec3 ambient = lights.uIblParams.y > 0.5 ? lights.uIblColor.rgb * max(lights.uIblParams.x, 0.0) + : lights.uAmbient.rgb; + vec3 color = ambient * surfaceAlbedo; const float kDiffuseScale = 0.65; for (int i = 0; i < lights.uDirCount; ++i) { @@ -188,9 +221,9 @@ void main() { float shadow = 1.0; if (lights.uFlags.x > 0.5) { if (i == 0 && shadows.uDirShadowValid.x > 0.5) { - shadow = sampleDirShadow(uShadowMap0, 0, v_worldPos); + shadow = sampleDirShadow(uShadowMap0, 0, v_worldPos, shadowNormal); } else if (i == 1 && shadows.uDirShadowValid.y > 0.5) { - shadow = sampleDirShadow(uShadowMap1, 1, v_worldPos); + shadow = sampleDirShadow(uShadowMap1, 1, v_worldPos, shadowNormal); } } color += diffuse * surfaceAlbedo * shadow; @@ -239,13 +272,14 @@ void main() { float shadow = 1.0; if (lights.uFlags.x > 0.5) { if (i == 0 && shadows.uSpotShadowValid.x > 0.5) { - shadow = sampleSpotShadow(uSpotShadow0, shadows.uSpotShadowVP[0], v_worldPos); + shadow = sampleSpotShadow(uSpotShadow0, shadows.uSpotShadowVP[0], v_worldPos, shadowNormal); } else if (i == 1 && shadows.uSpotShadowValid.y > 0.5) { - shadow = sampleSpotShadow(uSpotShadow1, shadows.uSpotShadowVP[1], v_worldPos); + shadow = sampleSpotShadow(uSpotShadow1, shadows.uSpotShadowVP[1], v_worldPos, shadowNormal); } } color += diffuse * surfaceAlbedo * shadow; } - outColor = vec4(clamp(color, 0.0, 1.0), 1.0); + color += vec3(0.0) * (lights.uReflectVP[0][0] + lights.uExtra.x + lights.uEmission.x); + outColor = vec4(max(color, vec3(0.0)), 1.0); } diff --git a/src/rhi/CommandBuffer.cpp b/src/rhi/CommandBuffer.cpp index 4f5dccc8..7ac96da1 100644 --- a/src/rhi/CommandBuffer.cpp +++ b/src/rhi/CommandBuffer.cpp @@ -72,8 +72,9 @@ void CommandBuffer::beginRenderPass(const RenderPassDesc& desc) { colorTarget.texture = colorTexture; colorTarget.mip_level = desc.colorMipLevel; colorTarget.layer_or_depth_plane = desc.colorLayer; - colorTarget.cycle = desc.cycle; - colorTarget.load_op = SDL_GPU_LOADOP_CLEAR; + // Cycling hands back a fresh backing texture, so it can't be combined with LOAD. + colorTarget.cycle = desc.cycle && !desc.loadColor; + colorTarget.load_op = desc.loadColor ? SDL_GPU_LOADOP_LOAD : SDL_GPU_LOADOP_CLEAR; colorTarget.store_op = SDL_GPU_STOREOP_STORE; colorTarget.clear_color.r = desc.clearColor[0]; colorTarget.clear_color.g = desc.clearColor[1]; @@ -84,7 +85,7 @@ void CommandBuffer::beginRenderPass(const RenderPassDesc& desc) { SDL_GPUDepthStencilTargetInfo* depthPtr = nullptr; if (desc.depthTarget && desc.depthTarget->handle) { depthTarget.texture = desc.depthTarget->handle; - depthTarget.cycle = desc.cycle; + depthTarget.cycle = desc.cycle && desc.clearDepth; depthTarget.load_op = desc.clearDepth ? SDL_GPU_LOADOP_CLEAR : SDL_GPU_LOADOP_LOAD; depthTarget.store_op = SDL_GPU_STOREOP_STORE; depthTarget.stencil_load_op = SDL_GPU_LOADOP_DONT_CARE; @@ -118,13 +119,13 @@ void CommandBuffer::bindPipeline(Pipeline* pipeline) { SDL_BindGPUGraphicsPipeline(m_renderPass, pipeline->handle); } -void CommandBuffer::bindVertexBuffer(Buffer* buf, u32 slot) { +void CommandBuffer::bindVertexBuffer(Buffer* buf, u32 slot, u32 offset) { if (!m_renderPass || !buf || !buf->handle) { return; } SDL_GPUBufferBinding binding{}; binding.buffer = buf->handle; - binding.offset = 0; + binding.offset = offset; SDL_BindGPUVertexBuffers(m_renderPass, slot, &binding, 1); } @@ -188,6 +189,15 @@ void CommandBuffer::drawIndexed(u32 indexCount, u32 firstIndex, i32 vertexOffset SDL_DrawGPUIndexedPrimitives(m_renderPass, indexCount, 1, firstIndex, vertexOffset, 0); } +void CommandBuffer::drawIndexedInstanced(u32 indexCount, u32 instanceCount, u32 firstIndex, + i32 vertexOffset, u32 firstInstance) { + if (!m_renderPass || indexCount == 0 || instanceCount == 0) { + return; + } + SDL_DrawGPUIndexedPrimitives(m_renderPass, indexCount, instanceCount, firstIndex, vertexOffset, + firstInstance); +} + void CommandBuffer::drawInstanced(u32 vertexCount, u32 instanceCount, u32 firstVertex, u32 firstInstance) { if (!m_renderPass) { @@ -197,6 +207,26 @@ void CommandBuffer::drawInstanced(u32 vertexCount, u32 instanceCount, firstVertex, firstInstance); } +void CommandBuffer::copyTexture(Texture* src, Texture* dst, u32 width, u32 height) { + if (!m_cmdBuffer || m_inRenderPass || !src || !dst || !src->handle || !dst->handle || + width == 0 || height == 0) { + return; + } + SDL_GPUCopyPass* copyPass = SDL_BeginGPUCopyPass(m_cmdBuffer); + if (!copyPass) return; + SDL_GPUTextureLocation from{}; + from.texture = src->handle; + SDL_GPUTextureLocation to{}; + to.texture = dst->handle; + SDL_CopyGPUTextureToTexture(copyPass, &from, &to, width, height, 1, false); + SDL_EndGPUCopyPass(copyPass); +} + +void CommandBuffer::generateMipmaps(Texture* texture) { + if (!m_cmdBuffer || m_inRenderPass || !texture || !texture->handle) return; + SDL_GenerateMipmapsForGPUTexture(m_cmdBuffer, texture->handle); +} + void CommandBuffer::pushUniformData(ShaderStage stage, u32 slot, const void* data, u32 size) { if (!m_cmdBuffer || !data || size == 0) { diff --git a/src/rhi/CommandBuffer.hpp b/src/rhi/CommandBuffer.hpp index 21f5a939..b6e62291 100644 --- a/src/rhi/CommandBuffer.hpp +++ b/src/rhi/CommandBuffer.hpp @@ -35,7 +35,7 @@ class CommandBuffer { void endRenderPass(); void bindPipeline(Pipeline* pipeline); - void bindVertexBuffer(Buffer* buf, u32 slot = 0); + void bindVertexBuffer(Buffer* buf, u32 slot = 0, u32 offset = 0); void bindIndexBuffer(Buffer* buf); void bindTexture(Texture* tex, u32 slot = 0, Sampler* sampler = nullptr); void setViewport(f32 x, f32 y, f32 w, f32 h); @@ -43,11 +43,19 @@ class CommandBuffer { void draw(u32 vertexCount, u32 firstVertex = 0); void drawIndexed(u32 indexCount, u32 firstIndex = 0, i32 vertexOffset = 0); + void drawIndexedInstanced(u32 indexCount, u32 instanceCount, u32 firstIndex = 0, + i32 vertexOffset = 0, u32 firstInstance = 0); void drawInstanced(u32 vertexCount, u32 instanceCount, u32 firstVertex = 0, u32 firstInstance = 0); void pushUniformData(ShaderStage stage, u32 slot, const void* data, u32 size); + /// GPU-side copy of mip 0 / layer 0. Must be called outside a render pass; formats must match. + void copyTexture(Texture* src, Texture* dst, u32 width, u32 height); + + /// Fills mips 1..N from mip 0. Outside a render pass; texture needs Sampler | ColorTarget. + void generateMipmaps(Texture* texture); + bool isInRenderPass() const { return m_inRenderPass; } SDL_GPUCommandBuffer* nativeHandle() const { return m_cmdBuffer; } diff --git a/src/rhi/RenderDevice.cpp b/src/rhi/RenderDevice.cpp index f549f1f1..92da1a33 100644 --- a/src/rhi/RenderDevice.cpp +++ b/src/rhi/RenderDevice.cpp @@ -123,6 +123,76 @@ void RenderDevice::releasePendingTransfers(u32 slot) { m_pendingTransferCounts[slot] = 0; } +CommandBuffer* RenderDevice::beginOffscreen() { + if (!m_device) return nullptr; + auto* cmd = new CommandBuffer(); + cmd->acquire(m_device); + if (!cmd->nativeHandle()) { + delete cmd; + return nullptr; + } + m_activeFrameCmd = cmd; + return cmd; +} + +void RenderDevice::endOffscreen(CommandBuffer* cmd) { + if (!cmd) return; + if (cmd->isInRenderPass()) cmd->endRenderPass(); + cmd->submit(); + if (m_activeFrameCmd == cmd) m_activeFrameCmd = nullptr; + delete cmd; + SDL_WaitForGPUIdle(m_device); + for (u32 slot = 0; slot < MAX_FRAMES_IN_FLIGHT; ++slot) releasePendingTransfers(slot); +} + +bool RenderDevice::readTexture(Texture* texture, std::vector& outPixels) { + if (!m_device || !texture || !texture->handle || texture->width == 0 || texture->height == 0) { + return false; + } + const u32 size = texture->width * texture->height * 4u; + SDL_GPUTransferBufferCreateInfo info{}; + info.usage = SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD; + info.size = size; + SDL_GPUTransferBuffer* transfer = SDL_CreateGPUTransferBuffer(m_device, &info); + if (!transfer) return false; + + SDL_GPUCommandBuffer* cmd = SDL_AcquireGPUCommandBuffer(m_device); + if (!cmd) { + SDL_ReleaseGPUTransferBuffer(m_device, transfer); + return false; + } + SDL_GPUCopyPass* copy = SDL_BeginGPUCopyPass(cmd); + SDL_GPUTextureRegion src{}; + src.texture = texture->handle; + src.w = texture->width; + src.h = texture->height; + src.d = 1; + SDL_GPUTextureTransferInfo dst{}; + dst.transfer_buffer = transfer; + dst.pixels_per_row = texture->width; + dst.rows_per_layer = texture->height; + SDL_DownloadFromGPUTexture(copy, &src, &dst); + SDL_EndGPUCopyPass(copy); + SDL_GPUFence* fence = SDL_SubmitGPUCommandBufferAndAcquireFence(cmd); + if (fence) { + SDL_WaitForGPUFences(m_device, true, &fence, 1); + SDL_ReleaseGPUFence(m_device, fence); + } else { + SDL_WaitForGPUIdle(m_device); + } + + const void* mapped = SDL_MapGPUTransferBuffer(m_device, transfer, false); + if (!mapped) { + SDL_ReleaseGPUTransferBuffer(m_device, transfer); + return false; + } + outPixels.resize(size); + std::memcpy(outPixels.data(), mapped, size); + SDL_UnmapGPUTransferBuffer(m_device, transfer); + SDL_ReleaseGPUTransferBuffer(m_device, transfer); + return true; +} + void RenderDevice::endFrame(CommandBuffer* cmd) { if (!cmd) { return; @@ -280,9 +350,11 @@ static SDL_GPUVertexElementFormat toSDLVertexFormat(VertexFormat format) { Pipeline* RenderDevice::createGraphicsPipeline(Shader* vertexShader, Shader* fragmentShader, const GraphicsPipelineDesc& desc) { if (!m_device || !vertexShader || !fragmentShader || - !vertexShader->handle || !fragmentShader->handle || - !desc.vertexBuffers || desc.numVertexBuffers == 0 || - !desc.attributes || desc.numAttributes == 0) { + !vertexShader->handle || !fragmentShader->handle) { + return nullptr; + } + if (desc.numVertexBuffers > 0 && + (!desc.vertexBuffers || !desc.attributes || desc.numAttributes == 0)) { return nullptr; } @@ -329,14 +401,24 @@ Pipeline* RenderDevice::createGraphicsPipeline(Shader* vertexShader, Shader* fra depthStencil.enable_stencil_test = false; depthStencil.compare_op = SDL_GPU_COMPAREOP_LESS_OR_EQUAL; + const BlendMode blendMode = + (desc.blendMode == BlendMode::None && desc.enableBlend) ? BlendMode::Alpha : desc.blendMode; SDL_GPUColorTargetBlendState blend{}; - blend.enable_blend = desc.enableBlend; + blend.enable_blend = blendMode != BlendMode::None; blend.src_color_blendfactor = SDL_GPU_BLENDFACTOR_SRC_ALPHA; blend.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blend.color_blend_op = SDL_GPU_BLENDOP_ADD; blend.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blend.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blend.alpha_blend_op = SDL_GPU_BLENDOP_ADD; + if (blendMode == BlendMode::Premultiplied) { + blend.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; + } else if (blendMode == BlendMode::Additive) { + blend.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; + blend.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; + blend.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; + blend.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; + } blend.color_write_mask = SDL_GPU_COLORCOMPONENT_R | SDL_GPU_COLORCOMPONENT_G | SDL_GPU_COLORCOMPONENT_B | SDL_GPU_COLORCOMPONENT_A; blend.enable_color_write_mask = true; @@ -390,8 +472,10 @@ Sampler* RenderDevice::createSampler(const SamplerDesc& desc) { samplerInfo.mip_lod_bias = 0.0f; samplerInfo.min_lod = -1000.0f; samplerInfo.max_lod = 1000.0f; - samplerInfo.enable_anisotropy = false; - samplerInfo.max_anisotropy = 1.0f; + samplerInfo.enable_anisotropy = desc.linearFilter && desc.maxAnisotropy > 1.0f; + samplerInfo.max_anisotropy = samplerInfo.enable_anisotropy + ? (desc.maxAnisotropy > 16.0f ? 16.0f : desc.maxAnisotropy) + : 1.0f; samplerInfo.enable_compare = false; SDL_GPUSampler* gpuSampler = SDL_CreateGPUSampler(m_device, &samplerInfo); diff --git a/src/rhi/RenderDevice.hpp b/src/rhi/RenderDevice.hpp index 92831263..0a3700f0 100644 --- a/src/rhi/RenderDevice.hpp +++ b/src/rhi/RenderDevice.hpp @@ -5,6 +5,8 @@ // ============================================================================ #pragma once +#include + #include "../core/Types.hpp" #include "../math/Mat4.hpp" #include "../math/Vec4.hpp" @@ -101,7 +103,15 @@ struct VertexBufferLayoutDesc { bool perInstance = false; }; +enum class BlendMode : u8 { + None, + Alpha, // src.a, 1 - src.a + Premultiplied, // 1, 1 - src.a + Additive, // 1, 1 +}; + struct GraphicsPipelineDesc { + /// Zero vertex buffers is valid: the vertex shader builds positions from gl_VertexIndex. const VertexBufferLayoutDesc* vertexBuffers = nullptr; u32 numVertexBuffers = 0; const VertexAttributeDesc* attributes = nullptr; @@ -110,13 +120,17 @@ struct GraphicsPipelineDesc { TextureFormat depthFormat = TextureFormat::D32_FLOAT; bool depthTest = true; bool depthWrite = true; + /// Legacy flag; equivalent to blendMode = Alpha. bool enableBlend = false; + BlendMode blendMode = BlendMode::None; FillMode fillMode = FillMode::Fill; }; struct SamplerDesc { bool linearFilter = true; bool clampToEdge = true; + /// > 1 enables anisotropic filtering (clamped to 16). + f32 maxAnisotropy = 1.0f; }; struct Texture { @@ -195,6 +209,8 @@ struct RenderPassDesc { u32 colorMipLevel = 0; u32 colorLayer = 0; // cubemap face / array layer f32 clearColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + /// Keep the existing color contents instead of clearing them. + bool loadColor = false; bool clearDepth = false; f32 depthValue = 1.0f; bool cycle = false; @@ -220,6 +236,14 @@ class RenderDevice { CommandBuffer* beginFrame(); void endFrame(CommandBuffer* cmd); + /// Command buffer with no swapchain image (thumbnails, captures, tests). Uploads issued + /// while it is active are recorded into it. + CommandBuffer* beginOffscreen(); + /// Submits `cmd` and waits for the GPU to finish it. + void endOffscreen(CommandBuffer* cmd); + /// Reads mip 0 of a 4-byte-per-pixel colour texture back to the CPU. Blocks. + bool readTexture(Texture* texture, std::vector& outPixels); + Texture* createTexture(const TextureDesc& desc); Shader* createShader(const ShaderDesc& desc); Buffer* createBuffer(const BufferDesc& desc, BufferUsage usage); diff --git a/src/script/ForwardRenderBindings.cpp b/src/script/ForwardRenderBindings.cpp new file mode 100644 index 00000000..38f3dc67 --- /dev/null +++ b/src/script/ForwardRenderBindings.cpp @@ -0,0 +1,83 @@ +#include "ecs/ForwardRenderComponents.hpp" +#include "ecs/World.hpp" +#include "render/RenderFeatures.hpp" + +#include + +#include + +namespace Caffeine::Script { +namespace { + +ECS::ForwardRenderFeaturesComponent* forwardFeaturesForEntity(ECS::World* world, u32 entityId) { + if (!world) return nullptr; + ECS::Entity entity(entityId, world); + if (!entity.isValid()) return nullptr; + return entity.get(); +} + +void registerForwardRenderBindings(sol::state& lua, ECS::World** worldPtr) { + lua["caffeine"]["forwardrender"] = lua.create_table(); + sol::table api = lua["caffeine"]["forwardrender"]; + + api["ensure"] = [worldPtr](u32 entityId) -> bool { + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!world) return false; + ECS::Entity entity(entityId, world); + if (!entity.isValid()) return false; + if (!entity.has()) { + world->add(entity); + } + return true; + }; + + api["setInstancing"] = [worldPtr](u32 entityId, bool enabled, sol::optional maxBatch) { + if (auto* fx = forwardFeaturesForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { + fx->instancing.enabled = enabled; + if (maxBatch) fx->instancing.maxInstancesPerBatch = *maxBatch; + } + }; + + api["setIbl"] = [worldPtr](u32 entityId, bool enabled, sol::optional diffuse, + sol::optional specular) { + if (auto* fx = forwardFeaturesForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { + fx->ibl.enabled = enabled; + if (diffuse) fx->ibl.diffuse = *diffuse; + if (specular) fx->ibl.specular = *specular; + } + }; + + api["setOcclusion"] = [worldPtr](u32 entityId, bool enabled) { + if (auto* fx = forwardFeaturesForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { + fx->occlusion.enabled = enabled; + } + }; + + api["setReflections"] = [worldPtr](u32 entityId, bool enabled, sol::optional mode) { + if (auto* fx = forwardFeaturesForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { + fx->reflections.enabled = enabled; + if (mode) { + fx->reflections.mode = + static_cast(std::clamp(*mode, 0, 3)); + } + } + }; + + api["setVolumetrics"] = [worldPtr](u32 entityId, bool enabled, sol::optional quality) { + if (auto* fx = forwardFeaturesForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { + fx->volumetrics.enabled = enabled; + if (quality) { + fx->volumetrics.quality = + static_cast(std::clamp(*quality, 0, 2)); + } + } + }; +} + +} // namespace + +void registerForwardRenderScriptBindings(sol::state& lua, ECS::World** worldPtr) { + registerForwardRenderBindings(lua, worldPtr); +} + +} // namespace Caffeine::Script diff --git a/src/script/PostProcessBindings.cpp b/src/script/PostProcessBindings.cpp index d9244661..a5f282a7 100644 --- a/src/script/PostProcessBindings.cpp +++ b/src/script/PostProcessBindings.cpp @@ -1,109 +1,341 @@ +#include "caffeine/postprocess/PostProcessPresets.hpp" #include "ecs/PostProcessComponents.hpp" +#include "ecs/PostProcessFields.hpp" #include "ecs/World.hpp" #include +#include +#include #include +#include namespace Caffeine::Script { namespace { -ECS::PostProcessComponent* postProcessForEntity(ECS::World* world, u32 entityId) { - if (!world) return nullptr; +using ECS::PostProcessComponent; +using ECS::PostProcessField; + +ECS::World* currentWorld(ECS::World** worldPtr) { + return worldPtr ? *worldPtr : nullptr; +} + +PostProcessComponent* postProcessForEntity(ECS::World* world, u32 entityId) { + if (!world || !world->isEntityAlive(ECS::Entity(entityId, world))) return nullptr; ECS::Entity entity(entityId, world); - if (!entity.isValid()) return nullptr; - return entity.get(); + return entity.get(); +} + +sol::object fieldToLua(sol::state_view lua, const PostProcessComponent& fx, const PostProcessField& field) { + const f32 value = *ECS::getPostProcessValue(fx, field); + switch (field.kind) { + case PostProcessField::Kind::Bool: return sol::make_object(lua, value != 0.0f); + case PostProcessField::Kind::UInt: return sol::make_object(lua, static_cast(value)); + case PostProcessField::Kind::Float: break; + } + return sol::make_object(lua, value); +} + +bool luaToFieldValue(const sol::object& value, f32& out) { + if (value.is()) { + out = value.as() ? 1.0f : 0.0f; + return true; + } + if (value.is()) { + out = static_cast(value.as()); + return true; + } + return false; +} + +sol::table componentToTable(sol::state_view lua, const PostProcessComponent& fx) { + sol::table t = lua.create_table(); + t["enabled"] = fx.enabled; + t["customEffectScript"] = std::string(fx.customEffectScript); + for (const PostProcessField& field : ECS::postProcessFields()) { + const std::string effect(field.effect); + sol::optional group = t[effect]; + if (!group) t[effect] = lua.create_table(); + sol::table g = t[effect]; + g[std::string(field.name)] = fieldToLua(lua, fx, field); + } + return t; +} + +void setCustomScript(PostProcessComponent& fx, const std::string& path) { + std::strncpy(fx.customEffectScript, path.c_str(), sizeof(fx.customEffectScript) - 1); + fx.customEffectScript[sizeof(fx.customEffectScript) - 1] = '\0'; +} + +/// Deep-merges a Lua table shaped like componentToTable() into the component. +void applyTable(PostProcessComponent& fx, const sol::table& t) { + if (sol::optional enabled = t["enabled"]) fx.enabled = *enabled; + if (sol::optional script = t["customEffectScript"]) setCustomScript(fx, *script); + for (const PostProcessField& field : ECS::postProcessFields()) { + sol::optional group = t[std::string(field.effect)]; + if (!group) continue; + sol::object value = (*group)[std::string(field.name)]; + f32 v = 0.0f; + if (luaToFieldValue(value, v)) ECS::setPostProcessValue(fx, field, v); + } +} + +bool applyPreset(PostProcessComponent& fx, const std::string& name) { + if (name == "cinematic") PostProcess::applyBenchmarkCinematic(fx); + else if (name == "horror") PostProcess::applyBenchmarkHorror(fx); + else if (name == "arcade") PostProcess::applyBenchmarkArcade(fx); + else if (name == "reset" || name == "default") PostProcess::resetAllEffects(fx); + else return false; + return true; +} + +/// Sets an intensity-like field and toggles the effect on when it becomes visible. +void setIntensity(PostProcessComponent* fx, const char* path, const char* effect, f32 value) { + if (!fx) return; + ECS::setPostProcessValue(*fx, path, value); + ECS::setPostProcessEffectEnabled(*fx, effect, value > 0.001f); +} + +/// Per-entity handle given to onPostProcess(entityId, dt, api): api.get/set/enable/... without ids. +sol::table makeHandle(sol::state_view lua, ECS::World** worldPtr, u32 entityId) { + sol::table api = lua.create_table(); + api["entity"] = entityId; + api["get"] = [worldPtr, entityId](const std::string& path, sol::this_state s) -> sol::object { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + const PostProcessField* field = ECS::findPostProcessField(path); + if (!fx || !field) return sol::lua_nil; + return fieldToLua(s, *fx, *field); + }; + api["set"] = [worldPtr, entityId](const std::string& path, sol::object value) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + f32 v = 0.0f; + return fx && luaToFieldValue(value, v) && ECS::setPostProcessValue(*fx, path, v); + }; + api["enable"] = [worldPtr, entityId](const std::string& effect, sol::optional enabled) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + return fx && ECS::setPostProcessEffectEnabled(*fx, effect, enabled.value_or(true)); + }; + api["isEnabled"] = [worldPtr, entityId](const std::string& effect) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + return fx && ECS::isPostProcessEffectEnabled(*fx, effect).value_or(false); + }; + api["snapshot"] = [worldPtr, entityId](sol::this_state s) -> sol::object { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + if (!fx) return sol::lua_nil; + return componentToTable(s, *fx); + }; + api["apply"] = [worldPtr, entityId](const sol::table& values) { + if (auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId)) applyTable(*fx, values); + }; + api["preset"] = [worldPtr, entityId](const std::string& name) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + return fx && applyPreset(*fx, name); + }; + return api; } void registerPostProcessBindings(sol::state& lua, ECS::World** worldPtr) { lua["caffeine"]["postprocess"] = lua.create_table(); sol::table pp = lua["caffeine"]["postprocess"]; - pp["get"] = [&lua, worldPtr](u32 entityId) -> sol::table { - sol::table t = lua.create_table(); - ECS::World* world = worldPtr ? *worldPtr : nullptr; - auto* fx = postProcessForEntity(world, entityId); - if (!fx) return t; - t["enabled"] = fx->enabled; + pp["has"] = [worldPtr](u32 entityId) { + return postProcessForEntity(currentWorld(worldPtr), entityId) != nullptr; + }; + pp["add"] = [worldPtr](u32 entityId) -> bool { + ECS::World* world = currentWorld(worldPtr); + if (!world || !world->isEntityAlive(ECS::Entity(entityId, world))) return false; + ECS::Entity(entityId, world).getOrAdd(); + return true; + }; + pp["remove"] = [worldPtr](u32 entityId) { + ECS::World* world = currentWorld(worldPtr); + if (!postProcessForEntity(world, entityId)) return; + ECS::Entity(entityId, world).remove(); + }; + + pp["get"] = [worldPtr](u32 entityId, sol::this_state s) -> sol::table { + sol::state_view view(s); + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + if (!fx) return view.create_table(); + sol::table t = componentToTable(view, *fx); + // Flat aliases kept for older scripts. t["exposure"] = fx->colorGrading.exposure; - t["bloom"] = fx->bloom.intensity; - t["vignette"] = fx->vignette.intensity; + t["vignetteIntensity"] = fx->vignette.intensity; + t["bloomIntensity"] = fx->bloom.intensity; return t; }; + pp["set"] = [worldPtr](u32 entityId, const sol::table& values) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + if (!fx) return false; + applyTable(*fx, values); + return true; + }; + pp["getValue"] = [worldPtr](u32 entityId, const std::string& path, sol::this_state s) -> sol::object { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + const PostProcessField* field = ECS::findPostProcessField(path); + if (!fx || !field) return sol::lua_nil; + return fieldToLua(s, *fx, *field); + }; + pp["setValue"] = [worldPtr](u32 entityId, const std::string& path, sol::object value) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + f32 v = 0.0f; + return fx && luaToFieldValue(value, v) && ECS::setPostProcessValue(*fx, path, v); + }; - pp["setEnabled"] = [worldPtr](u32 entityId, bool enabled) { - if (auto* fx = postProcessForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { - fx->enabled = enabled; + pp["effects"] = [](sol::this_state s) { + sol::state_view view(s); + sol::table out = view.create_table(); + std::string_view last; + int i = 1; + for (const PostProcessField& field : ECS::postProcessFields()) { + if (field.effect == last) continue; + last = field.effect; + out[i++] = std::string(field.effect); + } + return out; + }; + pp["fields"] = [](const std::string& effect, sol::this_state s) { + sol::state_view view(s); + sol::table out = view.create_table(); + const std::string_view name = ECS::canonicalPostProcessEffect(effect); + int i = 1; + for (const PostProcessField& field : ECS::postProcessFields()) { + if (field.effect != name) continue; + sol::table f = view.create_table(); + f["name"] = std::string(field.name); + f["min"] = field.minValue; + f["max"] = field.maxValue; + f["type"] = field.kind == PostProcessField::Kind::Bool ? "bool" + : field.kind == PostProcessField::Kind::UInt ? "int" + : "number"; + out[i++] = f; } + return out; }; - pp["setExposure"] = [worldPtr](u32 entityId, float exposure) { - if (auto* fx = postProcessForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { + pp["setEnabled"] = [worldPtr](u32 entityId, bool enabled) { + if (auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId)) fx->enabled = enabled; + }; + pp["enableEffect"] = [worldPtr](u32 entityId, const std::string& effect, bool enabled) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + return fx && ECS::setPostProcessEffectEnabled(*fx, effect, enabled); + }; + pp["isEffectEnabled"] = [worldPtr](u32 entityId, const std::string& effect) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + return fx && ECS::isPostProcessEffectEnabled(*fx, effect).value_or(false); + }; + pp["applyPreset"] = [worldPtr](u32 entityId, const std::string& name) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + return fx && applyPreset(*fx, name); + }; + pp["blend"] = [worldPtr](u32 entityId, const sol::table& from, const sol::table& to, f32 t) -> bool { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + if (!fx) return false; + PostProcessComponent a = *fx; + PostProcessComponent b = *fx; + applyTable(a, from); + applyTable(b, to); + const std::string script = fx->customEffectScript; + *fx = ECS::lerpPostProcess(a, b, std::clamp(t, 0.0f, 1.0f)); + setCustomScript(*fx, script); + return true; + }; + + // Convenience setters (each enables its effect when the value becomes visible). + pp["setExposure"] = [worldPtr](u32 entityId, f32 exposure) { + if (auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId)) { fx->colorGrading.exposure = exposure; fx->colorGrading.enabled = true; } }; - - pp["setBloom"] = [worldPtr](u32 entityId, float intensity) { - if (auto* fx = postProcessForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { - fx->bloom.intensity = intensity; - fx->bloom.enabled = intensity > 0.001f; + pp["setColorGrading"] = [worldPtr](u32 entityId, f32 contrast, f32 saturation, sol::optional temperature, + sol::optional tint) { + if (auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId)) { + ECS::setPostProcessValue(*fx, "colorGrading.contrast", contrast); + ECS::setPostProcessValue(*fx, "colorGrading.saturation", saturation); + if (temperature) ECS::setPostProcessValue(*fx, "colorGrading.temperature", *temperature); + if (tint) ECS::setPostProcessValue(*fx, "colorGrading.tint", *tint); + fx->colorGrading.enabled = true; } }; - - pp["setVignette"] = [worldPtr](u32 entityId, float intensity) { - if (auto* fx = postProcessForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { - fx->vignette.intensity = intensity; - fx->vignette.enabled = intensity > 0.001f; + pp["setBloom"] = [worldPtr](u32 entityId, f32 intensity, sol::optional threshold) { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + setIntensity(fx, "bloom.intensity", "bloom", intensity); + if (fx && threshold) ECS::setPostProcessValue(*fx, "bloom.threshold", *threshold); + }; + pp["setVignette"] = [worldPtr](u32 entityId, f32 intensity) { + setIntensity(postProcessForEntity(currentWorld(worldPtr), entityId), "vignette.intensity", "vignette", + intensity); + }; + pp["setChromaticAberration"] = [worldPtr](u32 entityId, f32 intensity) { + setIntensity(postProcessForEntity(currentWorld(worldPtr), entityId), "chromaticAberration.intensity", + "chromaticAberration", intensity); + }; + pp["setGrain"] = [worldPtr](u32 entityId, f32 intensity) { + setIntensity(postProcessForEntity(currentWorld(worldPtr), entityId), "grain.intensity", "grain", intensity); + }; + pp["setLensDistortion"] = [worldPtr](u32 entityId, f32 intensity) { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + if (!fx) return; + ECS::setPostProcessValue(*fx, "lensDistortion.intensity", intensity); + fx->lensDistortion.enabled = std::abs(intensity) > 0.001f; + }; + pp["setMotionBlur"] = [worldPtr](u32 entityId, f32 intensity) { + setIntensity(postProcessForEntity(currentWorld(worldPtr), entityId), "motionBlur.intensity", "motionBlur", + intensity); + }; + pp["setDepthOfField"] = [worldPtr](u32 entityId, f32 focusDistance, f32 aperture) { + if (auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId)) { + ECS::setPostProcessValue(*fx, "depthOfField.focusDistance", focusDistance); + ECS::setPostProcessValue(*fx, "depthOfField.aperture", aperture); + fx->depthOfField.enabled = true; } }; - - pp["enableEffect"] = [worldPtr](u32 entityId, const std::string& effectName, bool enabled) { - auto* fx = postProcessForEntity(worldPtr ? *worldPtr : nullptr, entityId); + pp["setFog"] = [worldPtr](u32 entityId, f32 density, sol::optional r, sol::optional g, + sol::optional b) { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + setIntensity(fx, "deferredFog.density", "deferredFog", density); + if (fx && r && g && b) { + ECS::setPostProcessValue(*fx, "deferredFog.colorR", *r); + ECS::setPostProcessValue(*fx, "deferredFog.colorG", *g); + ECS::setPostProcessValue(*fx, "deferredFog.colorB", *b); + } + }; + pp["setAmbientOcclusion"] = [worldPtr](u32 entityId, f32 intensity, sol::optional radius) { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); + setIntensity(fx, "ambientOcclusion.intensity", "ambientOcclusion", intensity); + if (fx && radius) ECS::setPostProcessValue(*fx, "ambientOcclusion.radius", *radius); + }; + pp["setAntiAliasing"] = [worldPtr](u32 entityId, const std::string& mode) { + auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId); if (!fx) return; - if (effectName == "ambientOcclusion" || effectName == "ao") { - fx->ambientOcclusion.enabled = enabled; - } else if (effectName == "antiAliasing" || effectName == "aa") { - fx->antiAliasing.enabled = enabled; - } else if (effectName == "autoExposure") { + fx->antiAliasing.enabled = mode != "off" && mode != "none"; + fx->antiAliasing.mode = mode == "fxaa" ? 0u : 1u; + }; + pp["setAutoExposure"] = [worldPtr](u32 entityId, bool enabled, sol::optional compensation) { + if (auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId)) { fx->autoExposure.enabled = enabled; - } else if (effectName == "bloom") { - fx->bloom.enabled = enabled; - } else if (effectName == "chromaticAberration" || effectName == "chromatic") { - fx->chromaticAberration.enabled = enabled; - } else if (effectName == "colorGrading") { - fx->colorGrading.enabled = enabled; - } else if (effectName == "deferredFog" || effectName == "fog") { - fx->deferredFog.enabled = enabled; - } else if (effectName == "depthOfField" || effectName == "dof") { - fx->depthOfField.enabled = enabled; - } else if (effectName == "grain") { - fx->grain.enabled = enabled; - } else if (effectName == "lensDistortion") { - fx->lensDistortion.enabled = enabled; - } else if (effectName == "motionBlur") { - fx->motionBlur.enabled = enabled; - } else if (effectName == "screenSpaceReflections" || effectName == "ssr") { - fx->screenSpaceReflections.enabled = enabled; - } else if (effectName == "vignette") { - fx->vignette.enabled = enabled; + if (compensation) ECS::setPostProcessValue(*fx, "autoExposure.compensation", *compensation); } }; pp["setCustomScript"] = [worldPtr](u32 entityId, const std::string& path) { - if (auto* fx = postProcessForEntity(worldPtr ? *worldPtr : nullptr, entityId)) { - std::strncpy(fx->customEffectScript, path.c_str(), sizeof(fx->customEffectScript) - 1); - fx->customEffectScript[sizeof(fx->customEffectScript) - 1] = '\0'; - } + if (auto* fx = postProcessForEntity(currentWorld(worldPtr), entityId)) setCustomScript(*fx, path); }; + pp["handle"] = [worldPtr](u32 entityId, sol::this_state s) { return makeHandle(s, worldPtr, entityId); }; } } // namespace void registerPostProcessScriptBindings(sol::state& lua, ECS::World** worldPtr); +sol::table makePostProcessScriptHandle(sol::state_view lua, ECS::World** worldPtr, u32 entityId); void registerPostProcessScriptBindings(sol::state& lua, ECS::World** worldPtr) { registerPostProcessBindings(lua, worldPtr); } +sol::table makePostProcessScriptHandle(sol::state_view lua, ECS::World** worldPtr, u32 entityId) { + return makeHandle(lua, worldPtr, entityId); +} + } // namespace Caffeine::Script diff --git a/src/script/ScriptEngine.cpp b/src/script/ScriptEngine.cpp index 968f3aeb..30b81a91 100644 --- a/src/script/ScriptEngine.cpp +++ b/src/script/ScriptEngine.cpp @@ -20,6 +20,8 @@ namespace Caffeine::Script { void registerProceduralScriptBindings(sol::state& lua, ECS::World** worldPtr); void registerPostProcessScriptBindings(sol::state& lua, ECS::World** worldPtr); +void registerForwardRenderScriptBindings(sol::state& lua, ECS::World** worldPtr); +sol::table makePostProcessScriptHandle(sol::state_view lua, ECS::World** worldPtr, u32 entityId); // ============================================================================ // Internal implementation (Pimpl) — all sol2 types are here @@ -621,6 +623,7 @@ bool ScriptEngine::init(const InitParams& params) { registerMathBindings(lua); registerProceduralScriptBindings(lua, &m_impl->m_world); registerPostProcessScriptBindings(lua, &m_impl->m_world); + registerForwardRenderScriptBindings(lua, &m_impl->m_world); { sol::table pt = lua["caffeine"]["particles"]; @@ -738,6 +741,10 @@ bool ScriptEngine::setExposedVar(const std::string& path, const ExposedVar& var) } bool ScriptEngine::loadScript(const std::string& path, std::string* outError) { + return loadScriptAs(path, path, outError); +} + +bool ScriptEngine::loadScriptAs(const std::string& key, const std::string& path, std::string* outError) { auto& lua = m_impl->m_lua; std::string file = path; @@ -788,7 +795,7 @@ bool ScriptEngine::loadScript(const std::string& path, std::string* outError) { return false; } - m_impl->m_envs.set(path, std::move(env)); + m_impl->m_envs.set(key, std::move(env)); CF_INFO("Script", "Loaded script: %s", file.c_str()); return true; } @@ -883,4 +890,25 @@ bool ScriptEngine::callOnCollision(const std::string& path, ECS::Entity entity, return true; } +bool ScriptEngine::callOnPostProcess(const std::string& path, ECS::Entity entity, f32 dt) { + auto* envPtr = m_impl->m_envs.get(path); + if (!envPtr) return false; + const u32 id = static_cast(entity.id()); + sol::protected_function fn = (*envPtr)["onPostProcess"]; + sol::protected_function_result result; + if (fn.valid()) { + result = fn(id, dt, makePostProcessScriptHandle(m_impl->m_lua, &m_impl->m_world, id)); + } else { + fn = (*envPtr)["onUpdate"]; + if (!fn.valid()) return false; + result = fn(id, dt); + } + if (!result.valid()) { + sol::error err = result; + CF_ERROR("Lua", "onPostProcess error: %s", err.what()); + return false; + } + return true; +} + } // namespace Caffeine::Script diff --git a/src/script/ScriptEngine.hpp b/src/script/ScriptEngine.hpp index 81127179..47ffe582 100644 --- a/src/script/ScriptEngine.hpp +++ b/src/script/ScriptEngine.hpp @@ -44,6 +44,9 @@ class ScriptEngine { bool setExposedVar(const std::string& path, const ExposedVar& var); bool loadScript(const std::string& path, std::string* outError = nullptr); + /// Loads `path` into its own environment stored under `key`, so one file can back + /// several roles (e.g. a gameplay script and a post-process driver) without sharing state. + bool loadScriptAs(const std::string& key, const std::string& path, std::string* outError = nullptr); bool loadString(const std::string& code, const std::string& virtualPath, std::string* outError = nullptr); bool reloadScript(const std::string& path, std::string* outError = nullptr); @@ -55,6 +58,8 @@ class ScriptEngine { bool callOnDestroy(const std::string& path, ECS::Entity entity); bool callOnCollision(const std::string& path, ECS::Entity entity, ECS::Entity other); + /// Post-process driver: onPostProcess(entityId, dt, api), falling back to onUpdate(entityId, dt). + bool callOnPostProcess(const std::string& path, ECS::Entity entity, f32 dt); private: struct Impl; diff --git a/src/script/ScriptSystem.cpp b/src/script/ScriptSystem.cpp index fc615797..0bc18560 100644 --- a/src/script/ScriptSystem.cpp +++ b/src/script/ScriptSystem.cpp @@ -2,6 +2,7 @@ #include "script/ScriptTypes.hpp" #include "script/CppScript.hpp" #include "ecs/World.hpp" +#include "ecs/PostProcessComponents.hpp" #include "ecs/ComponentQuery.hpp" #include "debug/LogSystem.hpp" @@ -13,6 +14,7 @@ ScriptSystem::ScriptSystem(ScriptEngine* engine) void ScriptSystem::resetPlayState() { m_initializedLua.clear(); m_initializedNative.clear(); + m_initializedPostProcess.clear(); m_warnedNoLua = false; } @@ -21,6 +23,7 @@ void ScriptSystem::onUpdate(ECS::World& world, f32 dt) { processLuaScripts(world, dt); processNativeScripts(world, dt); processCppScripts(world, dt); + processPostProcessScripts(world, dt); } void ScriptSystem::processLuaScripts(ECS::World& world, f32 dt) { @@ -161,4 +164,48 @@ void ScriptSystem::processCppScripts(ECS::World& world, f32 dt) { } } +void ScriptSystem::processPostProcessScripts(ECS::World& world, f32 dt) { + ECS::ComponentQuery q; + q.with(); + + struct Entry { + u32 entityId; + std::string scriptPath; + }; + Vector entries; + world.forEach(q, [&entries](ECS::Entity entity, ECS::PostProcessComponent& fx) { + if (fx.customEffectScript[0] != '\0') entries.pushBack({entity.id(), fx.customEffectScript}); + }); + + for (auto& entry : entries) { + ECS::Entity entity(entry.entityId, &world); + if (!entity.isValid()) continue; + + const std::string key = "postprocess:" + entry.scriptPath; + if (!m_engine->isLoaded(key)) { + std::string err; + if (!m_engine->loadScriptAs(key, entry.scriptPath, &err)) { + CF_ERROR("Script", "Failed to load post-process script %s: %s", entry.scriptPath.c_str(), + err.c_str()); + ECS::PostProcessComponent* fx = entity.get(); + if (fx) fx->customEffectScript[0] = '\0'; + continue; + } + } + + bool isNew = true; + for (usize i = 0; i < m_initializedPostProcess.size(); ++i) { + if (m_initializedPostProcess[i].id() == entity.id()) { + isNew = false; + break; + } + } + if (isNew) { + m_engine->callOnCreate(key, entity); + m_initializedPostProcess.pushBack(entity); + } + m_engine->callOnPostProcess(key, entity, dt); + } +} + } diff --git a/src/script/ScriptSystem.hpp b/src/script/ScriptSystem.hpp index 1c397b19..885e92d0 100644 --- a/src/script/ScriptSystem.hpp +++ b/src/script/ScriptSystem.hpp @@ -19,10 +19,12 @@ class ScriptSystem : public ECS::ISystem { void processLuaScripts(ECS::World& world, f32 dt); void processNativeScripts(ECS::World& world, f32 dt); void processCppScripts(ECS::World& world, f32 dt); + void processPostProcessScripts(ECS::World& world, f32 dt); ScriptEngine* m_engine; Vector m_initializedLua; Vector m_initializedNative; + Vector m_initializedPostProcess; bool m_warnedNoLua = false; }; diff --git a/src/spatial/Octree.hpp b/src/spatial/Octree.hpp index de79520b..2a474f73 100644 --- a/src/spatial/Octree.hpp +++ b/src/spatial/Octree.hpp @@ -117,9 +117,10 @@ struct Frustum { f32 fovY, f32 aspect, f32 nearZ, f32 farZ) { Frustum f; - Vec3 forward = (target - eye).normalized(); - Vec3 right = forward.cross(up).normalized(); - Vec3 upDir = right.cross(forward); + Vec3 forward; + Vec3 right; + Vec3 upDir; + Mat4::viewBasis(target - eye, up, forward, right, upDir); f32 tanHalf = tanf(fovY * 0.5f); f32 tanH = tanHalf * aspect; // horizontal half-tan diff --git a/src/terrain/TerrainGpuTextures.cpp b/src/terrain/TerrainGpuTextures.cpp index 02032e01..472d2ad2 100644 --- a/src/terrain/TerrainGpuTextures.cpp +++ b/src/terrain/TerrainGpuTextures.cpp @@ -87,7 +87,7 @@ void TerrainGpuTextureCache::sync(RHI::RenderDevice* device, ECS::Entity entity, } if (!gpu.layers[i] || gpu.layers[i] == fallback) { if (gpu.layers[i] == fallback) gpu.layers[i] = nullptr; - gpu.layers[i] = loadTexture(device, path, projectRoot); + gpu.layers[i] = Render::GpuTextureCache::instance().acquire(device, path, projectRoot, 0, true); } } @@ -129,7 +129,7 @@ void TerrainGpuTextureCache::sync(RHI::RenderDevice* device, ECS::Entity entity, } if (!gpu.albedo || gpu.albedo == fallback) { if (gpu.albedo == fallback) gpu.albedo = nullptr; - gpu.albedo = loadTexture(device, albedoPath, projectRoot); + gpu.albedo = Render::GpuTextureCache::instance().acquire(device, albedoPath, projectRoot, 0, true); } } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9e807096..4ab59651 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -18,6 +18,11 @@ set(CAFFEINE_TEST_SOURCES test_textureatlas.cpp test_scenemanager.cpp test_physics2d.cpp + test_physics3d.cpp + test_mesh_lod.cpp + test_render_features.cpp + test_forward_render_features.cpp + test_material.cpp test_ui.cpp test_animation.cpp test_mesh.cpp @@ -31,6 +36,7 @@ set(CAFFEINE_TEST_SOURCES ../src/editor/SceneSerializer.cpp ../src/editor/DragDropSystem.cpp ../src/editor/AssetBrowser.cpp + ../src/editor/BrowseSession.cpp ../src/editor/AssetPreviewRenderer.cpp ../src/editor/SceneTabManager.cpp ../src/editor/AnimationTimeline.cpp @@ -78,6 +84,7 @@ set(CAFFEINE_TEST_SOURCES ../src/editor/CameraPreviewPanel.cpp ../src/editor/GameplayPreviewPanel.cpp ../src/assets/MaterialCache.cpp + ../src/assets/MaterialFile.cpp ) if(SDL3_FOUND) @@ -89,7 +96,6 @@ if(SDL3_FOUND) ../src/editor/AudioPreviewPanel.cpp ../src/editor/ShaderGraph.cpp ../src/editor/ShaderNode.cpp - ../src/editor/PreviewRenderer.cpp ) # Build imgui_test_engine library @@ -165,6 +171,7 @@ if(SDL3_FOUND AND NOT CAFFEINE_BUILD_HEADLESS) ${CMAKE_SOURCE_DIR}/src/editor/SceneViewport.cpp ${CMAKE_SOURCE_DIR}/src/editor/HierarchyPanel.cpp ${CMAKE_SOURCE_DIR}/src/editor/AssetBrowser.cpp + ${CMAKE_SOURCE_DIR}/src/editor/BrowseSession.cpp ${CMAKE_SOURCE_DIR}/src/editor/CapLoader.cpp ${CMAKE_SOURCE_DIR}/src/editor/AudioWaveformRenderer.cpp ${CMAKE_SOURCE_DIR}/src/editor/SceneEditor.cpp @@ -180,7 +187,6 @@ if(SDL3_FOUND AND NOT CAFFEINE_BUILD_HEADLESS) ${CMAKE_SOURCE_DIR}/src/editor/MaterialEditorPanel.cpp ${CMAKE_SOURCE_DIR}/src/editor/ShaderGraph.cpp ${CMAKE_SOURCE_DIR}/src/editor/ShaderNode.cpp - ${CMAKE_SOURCE_DIR}/src/editor/PreviewRenderer.cpp ${CMAKE_SOURCE_DIR}/src/editor/ScriptEditorWindow.cpp ${CMAKE_SOURCE_DIR}/src/editor/BuildSystem.cpp ${CMAKE_SOURCE_DIR}/src/editor/BuildDialog.cpp diff --git a/tests/test_forward_render_features.cpp b/tests/test_forward_render_features.cpp new file mode 100644 index 00000000..4f806029 --- /dev/null +++ b/tests/test_forward_render_features.cpp @@ -0,0 +1,76 @@ +#include "catch.hpp" + +#include "ecs/ForwardRenderComponents.hpp" +#include "ecs/World.hpp" +#include "render/ForwardRenderFeatures.hpp" +#include "render/GpuEnvironmentMap.hpp" + +#include + +using namespace Caffeine; +using namespace Caffeine::ECS; +using namespace Caffeine::Render; + +TEST_CASE("Forward render features resolve from scene component", "[forwardrender]") { + World world; + const RenderFeatureSettings defaults = budgetSafeForwardDefaults(); + REQUIRE(defaults.instancingEnabled); + REQUIRE(defaults.maxInstancesPerBatch == 256u); + REQUIRE(defaults.iblEnabled); + REQUIRE(defaults.iblDiffuse == Approx(1.0f)); + REQUIRE(defaults.iblSpecular == Approx(1.0f)); + REQUIRE(defaults.occlusion == OcclusionMode::Off); + REQUIRE(defaults.reflections == ReflectionMode::Probe); + REQUIRE(defaults.screenSpaceTrace); + REQUIRE(defaults.maxReflectionProbes >= 1u); + REQUIRE(defaults.volumetrics == VolumetricQuality::Off); + + Entity env = world.create(); + auto& fx = world.add(env); + fx.reflections.enabled = true; + fx.reflections.mode = ReflectionMode::Planar; + fx.reflections.planeY = 0.0f; + fx.occlusion.enabled = true; + + const RenderFeatureSettings resolved = resolveForwardRenderFeatures(world); + REQUIRE(resolved.reflections == ReflectionMode::Planar); + REQUIRE(resolved.occlusion == OcclusionMode::Coarse); +} + +TEST_CASE("Environment mip chain keeps a directional sky/ground gradient", "[forwardrender]") { + // 16x8 equirect: bright sky on the top half, dark ground on the bottom half. + constexpr u32 w = 16; + constexpr u32 h = 8; + std::vector pixels(w * h * 4); + for (u32 y = 0; y < h; ++y) { + const u8 v = y < h / 2 ? 200 : 40; + for (u32 x = 0; x < w; ++x) { + u8* p = &pixels[(y * w + x) * 4]; + p[0] = v; + p[1] = v; + p[2] = v; + p[3] = 255; + } + } + + const auto chain = buildEnvironmentMipChain(pixels.data(), w, h, 1024, 4); + REQUIRE(chain.size() == 3); + REQUIRE(chain[0].width == 16); + REQUIRE(chain[1].width == 8); + REQUIRE(chain.back().width == 4); + REQUIRE(chain.back().height == 2); + REQUIRE(chain.back().rgba[0] == 200); + REQUIRE(chain.back().rgba[(1 * 4 + 0) * 4] == 40); + REQUIRE(averageEnvironmentColor(chain.back()).x == Approx(120.0f / 255.0f).margin(0.01f)); + + const auto capped = buildEnvironmentMipChain(pixels.data(), w, h, 8, 4); + REQUIRE(capped.front().width == 8); + + f32 u = 0.0f; + f32 v = 0.0f; + directionToEnvironmentUV(Vec3(0.0f, 1.0f, 0.0f), u, v); + REQUIRE(v == Approx(0.0f).margin(1e-4f)); + directionToEnvironmentUV(Vec3(0.0f, 0.0f, 1.0f), u, v); + REQUIRE(u == Approx(0.5f)); + REQUIRE(v == Approx(0.5f)); +} diff --git a/tests/test_material.cpp b/tests/test_material.cpp new file mode 100644 index 00000000..502e0958 --- /dev/null +++ b/tests/test_material.cpp @@ -0,0 +1,91 @@ +#include "catch.hpp" + +#include "assets/MaterialCache.hpp" +#include "assets/MaterialFile.hpp" + +#include +#include + +using namespace Caffeine; +using namespace Caffeine::Assets; + +TEST_CASE("CAFMAT2 roundtrip keeps maps and emission", "[material]") { + const auto dir = std::filesystem::temp_directory_path() / "caffeine-material-test"; + std::filesystem::create_directories(dir); + const auto path = dir / "painted.mat"; + + MaterialSurface written; + written.name = "Painted Metal"; + written.albedo = Vec4(0.2f, 0.4f, 0.8f, 1.0f); + written.metallic = 0.85f; + written.roughness = 0.3f; + written.reflectance = 0.5f; + written.emission = Vec3(1.0f, 0.2f, 0.0f); + written.emissionStrength = 2.5f; + written.albedoMap = "textures/paint.png"; + written.normalMap = "textures/paint_n.png"; + written.ormMap = "textures/paint_orm.png"; + REQUIRE(saveMaterialFile(path, written)); + + MaterialSurface loaded; + REQUIRE(loadMaterialFile(path, loaded)); + REQUIRE(loaded.valid); + REQUIRE(loaded.name == "Painted Metal"); + REQUIRE(loaded.albedo.x == Approx(0.2f)); + REQUIRE(loaded.metallic == Approx(0.85f)); + REQUIRE(loaded.roughness == Approx(0.3f)); + REQUIRE(loaded.reflectance == Approx(0.5f)); + REQUIRE(loaded.emission.y == Approx(0.2f)); + REQUIRE(loaded.emissionStrength == Approx(2.5f)); + REQUIRE(loaded.ormMap == "textures/paint_orm.png"); + + const u64 before = MaterialCache::instance().revision(); + const MaterialSurface resolved = MaterialCache::instance().resolve(path.string()); + REQUIRE(resolved.valid); + REQUIRE(resolved.albedoMap == "textures/paint.png"); + written.roughness = 0.9f; + MaterialCache::instance().publish(path.string(), "", written); + REQUIRE(MaterialCache::instance().revision() != before); + REQUIRE(MaterialCache::instance().resolve(path.string()).roughness == Approx(0.9f)); + MaterialCache::instance().invalidate(path.string()); + std::filesystem::remove_all(dir); +} + +TEST_CASE("CAFMAT1 header still resolves albedo", "[material]") { + const auto dir = std::filesystem::temp_directory_path() / "caffeine-material-legacy"; + std::filesystem::create_directories(dir); + const auto path = dir / "legacy.mat"; + { + std::ofstream out(path); + out << "CAFMAT1\n" + << "name Legacy\n" + << "albedo 0.1 0.2 0.3 1\n" + << "roughness 0.4\n" + << "metallic 0.6\n" + << "node_count 1\n" + << "node 1 OutputPBR\n"; + } + MaterialSurface loaded; + REQUIRE(loadMaterialFile(path, loaded)); + REQUIRE(loaded.name == "Legacy"); + REQUIRE(loaded.albedo.z == Approx(0.3f)); + REQUIRE(loaded.metallic == Approx(0.6f)); + REQUIRE(loaded.roughness == Approx(0.4f)); + std::filesystem::remove_all(dir); +} + +TEST_CASE("Published material without a file still resolves", "[material]") { + const std::string root = (std::filesystem::temp_directory_path() / "caffeine-material-virtual").string(); + const std::string key = "__caffeine_material_preview__.mat"; + REQUIRE_FALSE(MaterialCache::instance().resolve(key, root).valid); + + MaterialSurface surface; + surface.metallic = 1.0f; + surface.reflectance = 0.9f; + MaterialCache::instance().publish(key, root, surface); + const MaterialSurface resolved = MaterialCache::instance().resolve(key, root); + REQUIRE(resolved.valid); + REQUIRE(resolved.metallic == Approx(1.0f)); + REQUIRE(resolved.reflectance == Approx(0.9f)); + MaterialCache::instance().invalidate(); +} diff --git a/tests/test_math.cpp b/tests/test_math.cpp index 20fc12c6..93979d33 100644 --- a/tests/test_math.cpp +++ b/tests/test_math.cpp @@ -490,6 +490,22 @@ TEST_CASE("Mat4::transformVector - Combined Rotation and Scale", "[math][mat4][C REQUIRE(result.z == Approx(0.0f).margin(0.001f)); } +TEST_CASE("Mat4::lookAt looking straight up keeps the target centered", "[math][mat4]") { + const Vec3 eye(0.0f, 0.0f, 0.0f); + const Vec3 target(0.0f, 10.0f, 0.0f); + const Mat4 view = Mat4::lookAt(eye, target, Vec3(0.0f, 1.0f, 0.0f)); + const Vec4 viewPos = view.transformVec4(Vec4(target.x, target.y, target.z, 1.0f)); + REQUIRE(viewPos.x == Approx(0.0f).margin(0.05f)); + REQUIRE(viewPos.y == Approx(0.0f).margin(0.05f)); + REQUIRE(viewPos.z == Approx(-10.0f).margin(0.05f)); + + const Mat4 proj = Mat4::perspective(60.0f * 3.14159265f / 180.0f, 16.0f / 9.0f, 0.1f, 100.0f); + const Vec4 clip = (proj * view).transformVec4(Vec4(target.x, target.y, target.z, 1.0f)); + REQUIRE(clip.w > 0.1f); + REQUIRE(clip.x / clip.w == Approx(0.0f).margin(0.05f)); + REQUIRE(clip.y / clip.w == Approx(0.0f).margin(0.05f)); +} + TEST_CASE("Mat4::transformVector - Ignores Translation", "[math][mat4][CRITICAL]") { Mat4 trans = Mat4::translation(10, 20, 30); Vec3 vector(1, 0, 0); diff --git a/tests/test_mesh_lod.cpp b/tests/test_mesh_lod.cpp new file mode 100644 index 00000000..bea521df --- /dev/null +++ b/tests/test_mesh_lod.cpp @@ -0,0 +1,56 @@ +#include "catch.hpp" +#include "assets/MeshLOD.hpp" + +using namespace Caffeine; +using namespace Caffeine::Assets; + +static Mesh3D makeGrid(u32 n) { + Mesh3D mesh; + for (u32 z = 0; z <= n; ++z) { + for (u32 x = 0; x <= n; ++x) { + Vertex3D v; + v.position = Vec3(static_cast(x), 0.0f, static_cast(z)); + v.normal = Vec3(0.0f, 1.0f, 0.0f); + v.texcoord = Vec2(static_cast(x) / n, static_cast(z) / n); + mesh.vertices.push_back(v); + } + } + const u32 stride = n + 1; + for (u32 z = 0; z < n; ++z) { + for (u32 x = 0; x < n; ++x) { + const u32 i = z * stride + x; + mesh.indices.push_back(i); + mesh.indices.push_back(i + 1); + mesh.indices.push_back(i + stride); + mesh.indices.push_back(i + 1); + mesh.indices.push_back(i + stride + 1); + mesh.indices.push_back(i + stride); + } + } + mesh.bounds.min = Vec3(0, 0, 0); + mesh.bounds.max = Vec3(static_cast(n), 0, static_cast(n)); + return mesh; +} + +TEST_CASE("MeshLOD - clustering reduces triangles and stays manifold", "[render][lod]") { + const Mesh3D source = makeGrid(16); + Mesh3D lod; + REQUIRE(MeshLOD::buildClusteredLod(source, lod, 4.0f)); + REQUIRE(lod.indices.size() < source.indices.size()); + REQUIRE(lod.indices.size() % 3 == 0); + REQUIRE(!lod.vertices.empty()); + for (u32 index : lod.indices) { + REQUIRE(index < lod.vertices.size()); + } + for (u32 i = 0; i + 2 < lod.indices.size(); i += 3) { + REQUIRE(lod.indices[i] != lod.indices[i + 1]); + REQUIRE(lod.indices[i + 1] != lod.indices[i + 2]); + REQUIRE(lod.indices[i + 2] != lod.indices[i]); + } +} + +TEST_CASE("MeshLOD - tiny cell keeps the source triangle count", "[render][lod]") { + const Mesh3D source = makeGrid(2); + Mesh3D lod; + REQUIRE_FALSE(MeshLOD::buildClusteredLod(source, lod, 0.01f)); +} diff --git a/tests/test_octree.cpp b/tests/test_octree.cpp index 29a5f2cb..a072258a 100644 --- a/tests/test_octree.cpp +++ b/tests/test_octree.cpp @@ -108,6 +108,17 @@ TEST_CASE("Frustum - containsSphere", "[spatial][frustum]") { REQUIRE_FALSE(f.containsSphere({0, 0, 200}, 10.0f)); } +TEST_CASE("Frustum - looking straight up does not keep side points", "[spatial][frustum]") { + const f32 aspect = 16.0f / 9.0f; + const Frustum f = Frustum::fromCamera( + {0, 0, 0}, {0, 10, 0}, {0, 1, 0}, + Math::degToRad(60.0f), aspect, 0.1f, 100.0f); + + REQUIRE(f.contains({0, 10, 0})); + REQUIRE_FALSE(f.contains({40, 10, 0})); + REQUIRE_FALSE(f.contains({0, -5, 0})); +} + // ============================================================================ // Octree Tests // ============================================================================ diff --git a/tests/test_physics3d.cpp b/tests/test_physics3d.cpp new file mode 100644 index 00000000..760317c2 --- /dev/null +++ b/tests/test_physics3d.cpp @@ -0,0 +1,78 @@ +#include "catch.hpp" +#include "physics/PhysicsWorld3D.hpp" +#include "physics/PhysicsSystem3D.hpp" + +using namespace Caffeine; +using namespace Caffeine::Physics3D; + +TEST_CASE("Physics3D - dynamic sphere rests on a static box", "[physics][physics3d]") { + PhysicsWorld3D world; + if (!world.isAvailable()) { + WARN("Bullet3 not enabled in this build"); + return; + } + + BodyDesc ground; + ground.entityId = 1; + ground.position = Vec3(0.0f, 0.0f, 0.0f); + ground.shape = ColliderShape3D::Box; + ground.halfExtents = Vec3(2.0f, 0.5f, 2.0f); + ground.bodyType = BodyType3D::Static; + ground.mass = 0.0f; + world.upsertBody(ground); + + BodyDesc sphere; + sphere.entityId = 2; + sphere.position = Vec3(0.0f, 4.0f, 0.0f); + sphere.shape = ColliderShape3D::Sphere; + sphere.halfExtents = Vec3(0.5f, 0.5f, 0.5f); + sphere.bodyType = BodyType3D::Dynamic; + sphere.mass = 1.0f; + sphere.restitution = 0.0f; + sphere.linearDamping = 0.2f; + world.upsertBody(sphere); + + for (int i = 0; i < 180; ++i) { + world.step(1.0f / 60.0f); + } + + BodyState state; + REQUIRE(world.stateOf(2, state)); + REQUIRE(state.position.y > 0.8f); + REQUIRE(state.position.y < 1.6f); +} + +TEST_CASE("Physics3D - ECS system writes Position3D after falling", "[physics][physics3d]") { + PhysicsSystem3D system; + if (!system.world().isAvailable()) { + WARN("Bullet3 not enabled in this build"); + return; + } + + ECS::World world; + ECS::Entity ground = world.create(); + world.add(ground).position = Vec3(0.0f, 0.0f, 0.0f); + Physics3D::RigidBody3D groundBody; + groundBody.bodyType = BodyType3D::Static; + world.add(ground, groundBody); + Physics3D::Collider3D groundCol; + groundCol.halfExtents = Vec3(2.0f, 0.5f, 2.0f); + world.add(ground, groundCol); + + ECS::Entity ball = world.create(); + world.add(ball).position = Vec3(0.0f, 3.0f, 0.0f); + world.add(ball); + Physics3D::Collider3D ballCol; + ballCol.shape = ColliderShape3D::Sphere; + ballCol.halfExtents = Vec3(0.4f, 0.4f, 0.4f); + world.add(ball, ballCol); + + for (int i = 0; i < 180; ++i) { + system.onUpdate(world, 1.0f / 60.0f); + } + + auto* position = world.get(ball); + REQUIRE(position != nullptr); + REQUIRE(position->position.y < 2.5f); + REQUIRE(position->position.y > 0.5f); +} diff --git a/tests/test_render_features.cpp b/tests/test_render_features.cpp new file mode 100644 index 00000000..4b1ff8b5 --- /dev/null +++ b/tests/test_render_features.cpp @@ -0,0 +1,93 @@ +#include "catch.hpp" +#include "editor/DenseOutdoorBenchmark.hpp" +#include "editor/SceneSerializer.hpp" +#include "math/Mat4.hpp" +#include "render/CoarseOcclusion.hpp" +#include "render/InstanceBatch.hpp" + +#include +#include + +using namespace Caffeine; +using namespace Caffeine::Render; +using namespace Caffeine::Editor; + +TEST_CASE("Coarse occlusion hides a box fully behind a closer occluder", "[render][occlusion]") { + const Mat4 view = Mat4::lookAt(Vec3(0, 0, 0), Vec3(0, 0, 10), Vec3(0, 1, 0)); + const Mat4 proj = Mat4::perspective(60.0f * 3.14159265f / 180.0f, 1.0f, 0.1f, 100.0f); + const Mat4 vp = proj * view; + + std::vector prims(3); + prims[0].aabbMin = Vec3(-2, -2, 4); + prims[0].aabbMax = Vec3(2, 2, 6); + prims[0].canOcclude = true; + prims[0].canBeOccluded = true; + prims[1].aabbMin = Vec3(-0.2f, -0.2f, 8); + prims[1].aabbMax = Vec3(0.2f, 0.2f, 9); + prims[1].canOcclude = false; + prims[1].canBeOccluded = true; + prims[2].aabbMin = Vec3(6, -0.2f, 8); + prims[2].aabbMax = Vec3(7, 0.2f, 9); + prims[2].canOcclude = false; + prims[2].canBeOccluded = true; + + const std::vector visible = + visibleAfterCoarseOcclusion(prims, vp, Vec3(0, 0, 0), Vec3(0, 0, 1), 4); + REQUIRE(std::find(visible.begin(), visible.end(), 0u) != visible.end()); + REQUIRE(std::find(visible.begin(), visible.end(), 1u) == visible.end()); + REQUIRE(std::find(visible.begin(), visible.end(), 2u) != visible.end()); +} + +TEST_CASE("Instance batches split repeated meshes and skip unique ones", "[render][instancing]") { + std::vector items(6); + items[0] = {1, true}; + items[1] = {1, true}; + items[2] = {1, true}; + items[3] = {2, true}; + items[4] = {1, false}; + items[5] = {1, true}; + const std::vector groups = buildInstanceBatches(items, 2); + u32 grouped = 0; + u32 pairs = 0; + for (const InstanceBatchGroup& group : groups) { + if (group.members.size() < 2) continue; + grouped += static_cast(group.members.size()); + if (group.members.size() == 2) ++pairs; + REQUIRE(group.members.size() <= 2); + } + REQUIRE(grouped == 4); + REQUIRE(pairs == 2); +} + +TEST_CASE("Dense outdoor benchmark has the planned prop and light counts", "[render][benchmark]") { + ECS::World world; + populateDenseOutdoorBenchmark(world); + + ECS::ComponentQuery meshes; + meshes.with(); + u32 meshCount = 0; + u32 spheres = 0; + u32 cubes = 0; + world.forEach(meshes, [&](ECS::Entity, ECS::MeshFilterComponent& filter) { + ++meshCount; + if (filter.primitive == ECS::MeshPrimitive::Sphere) ++spheres; + if (filter.primitive == ECS::MeshPrimitive::Cube) ++cubes; + }); + REQUIRE(spheres == kDenseOutdoorTreeCount); + REQUIRE(cubes == kDenseOutdoorRockCount); + REQUIRE(meshCount == kDenseOutdoorTreeCount + kDenseOutdoorRockCount + 1); + + ECS::ComponentQuery suns; + suns.with(); + u32 sunCount = 0; + world.forEach(suns, [&](ECS::Entity, ECS::DirectionalLightComponent&) { + ++sunCount; + }); + REQUIRE(sunCount == 1); + + const std::filesystem::path out = + std::filesystem::path(__FILE__).parent_path().parent_path() / "assets/benchmarks/dense_outdoor.caf"; + std::filesystem::create_directories(out.parent_path()); + REQUIRE(SceneSerializer(world).serialize(out.string())); + REQUIRE(std::filesystem::exists(out)); +} diff --git a/tools/render-snapshot/main.cpp b/tools/render-snapshot/main.cpp new file mode 100644 index 00000000..073b370e --- /dev/null +++ b/tools/render-snapshot/main.cpp @@ -0,0 +1,201 @@ +// Renders a reference scene through GpuSceneRenderer (HDR scene, probes, SSR, post stack) and +// writes the display image to a PNG. Used to check rendering changes without the editor. +// +// caffeine-render-snapshot [out.png] [width] [height] [frames] [skyboxIndex] [view 0|1|2] + +#include "assets/MaterialCache.hpp" +#include "assets/MaterialPresets.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/LightComponents.hpp" +#include "ecs/MeshComponents.hpp" +#include "ecs/World.hpp" +#include "math/Quat.hpp" +#include "render/GpuSceneRenderer.hpp" +#include "rhi/CommandBuffer.hpp" +#include "rhi/RenderDevice.hpp" +#include "scene/EnvironmentSystem.hpp" +#include "scene/LightingSystem.hpp" + +#include + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.h" + +#include +#include +#include +#include + +using namespace Caffeine; + +namespace { + +const std::string kRoot = "."; + +Assets::MaterialSurface preset(const char* name) { + for (const auto& p : Assets::materialPresets()) { + if (p.name == name) return p.surface; + } + std::fprintf(stderr, "unknown preset %s\n", name); + Assets::MaterialSurface s; + s.valid = true; + return s; +} + +void addMesh(ECS::World& world, ECS::MeshPrimitive primitive, const Vec3& pos, const Vec3& scale, + const std::string& materialKey, const Assets::MaterialSurface& surface) { + Assets::MaterialSurface published = surface; + published.valid = true; + Assets::MaterialCache::instance().publish(materialKey, kRoot, published); + const ECS::Entity e = world.create(materialKey.c_str()); + ECS::Position3D p; + p.position = pos; + world.add(e, p); + world.add(e); + ECS::Scale3D s; + s.scale = scale; + world.add(e, s); + ECS::MeshFilterComponent filter; + filter.primitive = primitive; + filter.customMaterialPath = materialKey; + world.add(e, filter); + world.add(e); +} + +void buildScene(ECS::World& world) { + Assets::MaterialSurface floor; + floor.albedo = Vec4(0.55f, 0.55f, 0.57f, 1.0f); + floor.roughness = 0.35f; + addMesh(world, ECS::MeshPrimitive::Plane, Vec3(0, 0, 0), Vec3(24, 1, 24), "floor.mat", floor); + + addMesh(world, ECS::MeshPrimitive::Sphere, Vec3(0.0f, 0.75f, 0.0f), Vec3(1.5f, 1.5f, 1.5f), + "mirror.mat", preset("Mirror")); + addMesh(world, ECS::MeshPrimitive::Sphere, Vec3(-1.9f, 0.5f, 0.4f), Vec3(1, 1, 1), "gold.mat", + preset("Gold")); + addMesh(world, ECS::MeshPrimitive::Sphere, Vec3(1.9f, 0.5f, 0.4f), Vec3(1, 1, 1), "glass.mat", + preset("Clear Glass")); + + Assets::MaterialSurface red; + red.albedo = Vec4(0.85f, 0.12f, 0.10f, 1.0f); + red.roughness = 0.5f; + addMesh(world, ECS::MeshPrimitive::Cube, Vec3(0.0f, 0.5f, -2.2f), Vec3(1, 1, 1), "red.mat", red); + Assets::MaterialSurface green; + green.albedo = Vec4(0.15f, 0.7f, 0.2f, 1.0f); + green.roughness = 0.6f; + addMesh(world, ECS::MeshPrimitive::Cube, Vec3(-2.6f, 0.5f, -1.6f), Vec3(1, 1, 1), "green.mat", green); + Assets::MaterialSurface blue; + blue.albedo = Vec4(0.12f, 0.25f, 0.85f, 1.0f); + blue.roughness = 0.4f; + addMesh(world, ECS::MeshPrimitive::Cube, Vec3(2.6f, 0.5f, -1.6f), Vec3(1, 1, 1), "blue.mat", blue); + addMesh(world, ECS::MeshPrimitive::Cube, Vec3(0.0f, 0.4f, 2.6f), Vec3(0.8f, 0.8f, 0.8f), + "plastic.mat", preset("Glossy Plastic")); + + const ECS::Entity sun = world.create("Sun"); + world.add(sun); + const Vec3 travel = Vec3(-0.45f, -0.72f, -0.52f).normalized(); + const Quat aim = Quat::lookAt(-1.0f * travel, Vec3(0.0f, 1.0f, 0.0f)); + ECS::Rotation3D rot; + rot.quaternion = Vec4(aim.x, aim.y, aim.z, aim.w); + world.add(sun, rot); + ECS::LightComponent light; + light.intensity = 2.5f; + world.add(sun, light); + ECS::DirectionalLightComponent directional; + directional.shadowDistance = 20.0f; + world.add(sun, directional); +} + +} // namespace + +int main(int argc, char** argv) { + const std::string outPath = argc > 1 ? argv[1] : "snapshot.png"; + const u32 width = argc > 2 ? static_cast(std::atoi(argv[2])) : 1280; + const u32 height = argc > 3 ? static_cast(std::atoi(argv[3])) : 720; + const int frames = argc > 4 ? std::atoi(argv[4]) : 24; + const int skybox = argc > 5 ? std::atoi(argv[5]) : 0; + const int viewPreset = argc > 6 ? std::atoi(argv[6]) : 0; + + if (!SDL_Init(SDL_INIT_VIDEO)) { + std::fprintf(stderr, "SDL_Init: %s\n", SDL_GetError()); + return 1; + } + SDL_Window* window = SDL_CreateWindow("snapshot", 64, 64, SDL_WINDOW_HIDDEN); + RHI::RenderDevice device; + if (!window || !device.init(window)) { + std::fprintf(stderr, "GPU init failed: %s\n", SDL_GetError()); + return 1; + } + + { + Render::GpuSceneRenderer renderer; + if (!renderer.init(&device)) { + std::fprintf(stderr, "renderer init failed\n"); + return 1; + } + + RHI::TextureDesc colorDesc; + colorDesc.width = width; + colorDesc.height = height; + colorDesc.format = RHI::TextureFormat::R8G8B8A8_UNORM; + colorDesc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; + RHI::Texture* color = device.createTexture(colorDesc); + + ECS::World world; + buildScene(world); + { + Scene::LightingData lights; + Scene::collectSceneLights(world, lights); + for (const auto& d : lights.directionals) { + std::printf("sun dir (%.2f %.2f %.2f) intensity %.2f color (%.2f %.2f %.2f)\n", + d.direction.x, d.direction.y, d.direction.z, d.intensity, d.color.x, + d.color.y, d.color.z); + } + } + + Render::GpuSceneCamera camera; + camera.position = Vec3(0.0f, 1.9f, 5.4f); + camera.focus = Vec3(0.0f, 0.6f, 0.0f); + if (viewPreset == 1) camera.position = Vec3(3.5f, 7.0f, 5.0f); // high, shows shadows + if (viewPreset == 2) camera.position = Vec3(-60.0f, 25.0f, 120.0f); // distance / aliasing + camera.fovRad = 50.0f * 3.14159265f / 180.0f; + camera.nearClip = 0.1f; + camera.farClip = 2000.0f; + camera.view = Mat4::lookAt(camera.position, camera.focus, Vec3(0, 1, 0)); + camera.proj = Mat4::perspective(camera.fovRad, static_cast(width) / static_cast(height), + camera.nearClip, camera.farClip); + + Render::GpuSceneRenderOptions options; + options.environmentPath = Scene::resolveBuiltinSkyboxPath(skybox).string(); + options.directionalCascadeCount = 2; + options.grid.enabled = false; + if (std::getenv("SNAP_NO_IBL")) { + options.resolveFeaturesFromScene = false; + options.features.iblEnabled = false; + } + if (std::getenv("SNAP_NO_SHADOWS")) options.enableShadows = false; + + for (int i = 0; i < frames; ++i) { + RHI::CommandBuffer* cmd = device.beginOffscreen(); + if (!cmd) return 1; + renderer.renderWithCamera(cmd, world, camera, color, nullptr, width, height, kRoot, options); + device.endOffscreen(cmd); + } + + std::vector pixels; + if (!device.readTexture(color, pixels)) { + std::fprintf(stderr, "readback failed\n"); + return 1; + } + stbi_write_png(outPath.c_str(), static_cast(width), static_cast(height), 4, + pixels.data(), static_cast(width * 4)); + std::printf("wrote %s (%ux%u, %d frames, settling=%d)\n", outPath.c_str(), width, height, + frames, renderer.needsAnotherFrame() ? 1 : 0); + + device.destroyTexture(color); + renderer.shutdown(); + } + device.shutdown(); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +} From f2b28cd792d5a7a3b01b9a5fdb97a0de0f7aa023 Mon Sep 17 00:00:00 2001 From: lyeepedro Date: Fri, 2 Oct 2026 18:00:08 +0100 Subject: [PATCH 3/9] Add editor authoring for materials, animation, navigation, and scene effects. Viewport clicks pick objects, and volumetric lights can form window shafts, cones, and boxes so scenes can be built without leaving the view. Co-authored-by: Cursor --- CMakeLists.txt | 36 +- Convoy | 2 +- apps/plugins/ai_development_plugin/main.cpp | 182 ++++++ apps/plugins/post_processing_plugin/main.cpp | 4 +- apps/runtime/main.cpp | 16 + .../2026-10-02-editor-backlog-phase-b.md | 62 ++ include/caffeine/animation/AnimationApi.hpp | 98 ++++ include/caffeine/effects/EffectApi.hpp | 105 ++++ include/caffeine/navigation/NavigationApi.hpp | 78 +++ scripts/build.sh | 0 src/animation/AnimationPlayer.hpp | 78 +++ src/animation/AnimationSystem.hpp | 5 + src/animation/ClipAsset.hpp | 164 ++++++ src/animation/SkeletalAnimation.hpp | 36 +- src/animation/SkinLibrary.cpp | 223 ++++++++ src/animation/SkinLibrary.hpp | 92 +++ src/assets/MaterialFile.cpp | 76 +++ src/assets/MaterialTypes.hpp | 16 + src/assets/MeshLoader.cpp | 266 ++++++++- src/assets/MeshMaterialExport.cpp | 72 +++ src/assets/MeshMaterialExport.hpp | 19 + src/assets/MeshTypes.hpp | 7 + src/editor/AnimationTimeline.cpp | 142 ++++- src/editor/AnimationTimeline.hpp | 15 + src/editor/AssetBrowser.cpp | 91 ++- src/editor/AssetBrowser.hpp | 14 + src/editor/AssetPreviewRenderer.cpp | 395 ++++++++++++- src/editor/AssetPreviewRenderer.hpp | 65 +++ src/editor/ComponentRegistry.cpp | 57 ++ src/editor/EditorContext.hpp | 4 + src/editor/EffectEditorPanel.cpp | 262 +++++++++ src/editor/EffectEditorPanel.hpp | 23 + src/editor/EffectObjectFactory.hpp | 29 + src/editor/HudEditorPanel.cpp | 376 ++++++++++++ src/editor/HudEditorPanel.hpp | 26 + src/editor/ImageManagerPanel.cpp | 249 ++++++++ src/editor/ImageManagerPanel.hpp | 56 ++ src/editor/InspectorPanel.cpp | 333 ++++++++++- src/editor/InspectorPanel.hpp | 5 + src/editor/MaterialEditorPanel.cpp | 193 ++++++- src/editor/MaterialEditorPanel.hpp | 8 + src/editor/ParticleEditorPanel.cpp | 146 +++++ src/editor/ParticleEditorPanel.hpp | 21 + src/editor/SceneEditor.cpp | 58 +- src/editor/SceneEditor.hpp | 8 + src/editor/SceneSerializer.cpp | 217 +++++++ src/editor/SceneSerializer.hpp | 9 +- src/editor/SceneViewport.cpp | 283 +++++---- src/effects/EffectSystem.cpp | 536 ++++++++++++++++++ src/effects/EffectSystem.hpp | 45 ++ src/effects/EffectTypes.hpp | 276 +++++++++ src/navigation/NavVolume.hpp | 153 +++++ src/navigation/NavigationSystem.hpp | 110 ++++ src/render/GpuSceneRenderer.cpp | 180 +++++- src/render/GpuSceneRenderer.hpp | 25 +- src/render/MaterialPreviewRenderer.cpp | 92 ++- src/render/MaterialPreviewRenderer.hpp | 17 + src/render/ReflectionBudget.hpp | 39 ++ src/render/ShaderBytecode.cpp | 2 + src/render/ShaderBytecode.hpp | 2 + src/render/shaders/effect_billboard.frag | 23 + src/render/shaders/effect_billboard.vert | 20 + src/render/shaders/scene_lit.frag | 62 +- src/script/AnimationBindings.cpp | 41 ++ src/script/EffectBindings.cpp | 45 ++ src/script/NavigationBindings.cpp | 34 ++ src/script/ScriptEngine.cpp | 6 + src/ui/UISystem.hpp | 3 + tests/CMakeLists.txt | 40 ++ tests/test_animation.cpp | 39 ++ tests/test_editor_ui/test_assetbrowser.cpp | 36 +- tests/test_effects.cpp | 161 ++++++ tests/test_material.cpp | 96 ++++ tests/test_navigation.cpp | 53 ++ tests/test_skeletal_animation.cpp | 43 ++ 75 files changed, 6691 insertions(+), 210 deletions(-) create mode 100644 apps/plugins/ai_development_plugin/main.cpp create mode 100644 docs/plans/2026-10-02-editor-backlog-phase-b.md create mode 100644 include/caffeine/animation/AnimationApi.hpp create mode 100644 include/caffeine/effects/EffectApi.hpp create mode 100644 include/caffeine/navigation/NavigationApi.hpp mode change 100644 => 100755 scripts/build.sh create mode 100644 src/animation/AnimationPlayer.hpp create mode 100644 src/animation/ClipAsset.hpp create mode 100644 src/animation/SkinLibrary.cpp create mode 100644 src/animation/SkinLibrary.hpp create mode 100644 src/assets/MeshMaterialExport.cpp create mode 100644 src/assets/MeshMaterialExport.hpp create mode 100644 src/editor/EffectEditorPanel.cpp create mode 100644 src/editor/EffectEditorPanel.hpp create mode 100644 src/editor/EffectObjectFactory.hpp create mode 100644 src/editor/HudEditorPanel.cpp create mode 100644 src/editor/HudEditorPanel.hpp create mode 100644 src/editor/ImageManagerPanel.cpp create mode 100644 src/editor/ImageManagerPanel.hpp create mode 100644 src/editor/ParticleEditorPanel.cpp create mode 100644 src/editor/ParticleEditorPanel.hpp create mode 100644 src/effects/EffectSystem.cpp create mode 100644 src/effects/EffectSystem.hpp create mode 100644 src/effects/EffectTypes.hpp create mode 100644 src/navigation/NavVolume.hpp create mode 100644 src/navigation/NavigationSystem.hpp create mode 100644 src/render/ReflectionBudget.hpp create mode 100644 src/render/shaders/effect_billboard.frag create mode 100644 src/render/shaders/effect_billboard.vert create mode 100644 src/script/AnimationBindings.cpp create mode 100644 src/script/EffectBindings.cpp create mode 100644 src/script/NavigationBindings.cpp create mode 100644 tests/test_effects.cpp create mode 100644 tests/test_navigation.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index db7f06cf..816f4954 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,10 @@ add_library(caffeine-core src/assets/AssetPipeline.cpp src/assets/TextureCompiler.cpp src/assets/MeshLoader.cpp + src/animation/SkinLibrary.cpp + src/effects/EffectSystem.cpp + src/ecs/ParticleSystem.cpp + src/ecs/ParticleSystem.cpp src/assets/MeshCache.cpp src/assets/MeshImportValidator.cpp src/assets/MeshLOD.cpp @@ -124,7 +128,8 @@ target_compile_definitions(caffeine-core PUBLIC CAFFEINE_SOURCE_DIR="${CMAKE_SOURCE_DIR}") target_sources(caffeine-core PRIVATE src/assets/MaterialCache.cpp - src/assets/MaterialFile.cpp) + src/assets/MaterialFile.cpp + src/assets/MeshMaterialExport.cpp) if(CAFFEINE_ENABLE_BULLET3) set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE) @@ -187,6 +192,8 @@ else() "fullscreen_vert|vertex|fullscreen.vert" "sky_frag|fragment|sky.frag" "grid_frag|fragment|grid.frag" + "effect_billboard_vert|vertex|effect_billboard.vert" + "effect_billboard_frag|fragment|effect_billboard.frag" "post_luminance_frag|fragment|post_luminance.frag" "post_adapt_frag|fragment|post_adapt.frag" "post_bloom_prefilter_frag|fragment|post_bloom_prefilter.frag" @@ -382,6 +389,9 @@ if(CAFFEINE_ENABLE_SCRIPTING) src/script/ScriptSystem.cpp src/script/ScriptWatcher.cpp src/script/CppScriptRegistry.cpp + src/script/AnimationBindings.cpp + src/script/EffectBindings.cpp + src/script/NavigationBindings.cpp ) endif() @@ -507,6 +517,10 @@ with open(sys.argv[1], 'w') as f: src/editor/ShaderGraph.cpp src/editor/MaterialSerializer.cpp src/editor/MaterialEditorPanel.cpp + src/editor/ImageManagerPanel.cpp + src/editor/HudEditorPanel.cpp + src/editor/ParticleEditorPanel.cpp + src/editor/EffectEditorPanel.cpp src/editor/TerrainEditorPanel.cpp src/editor/EntityPresetTypes.cpp src/editor/EntityPresetRegistry.cpp @@ -637,6 +651,23 @@ with open(sys.argv[1], 'w') as f: if(NOT MSVC) target_compile_options(post_processing_plugin PRIVATE -Wno-macro-redefined -Wno-cpp) endif() + + add_library(ai_development_plugin SHARED + apps/plugins/ai_development_plugin/main.cpp + ) + target_include_directories(ai_development_plugin PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${imgui_SOURCE_DIR}) + target_compile_definitions(ai_development_plugin PRIVATE CF_HAS_IMGUI=1 CAFFEINE_PLUGIN_EXPORTS=1) + target_compile_features(ai_development_plugin PRIVATE cxx_std_20) + set_target_properties(ai_development_plugin PROPERTIES + PREFIX "" + OUTPUT_NAME "ai_development_plugin" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins") + if(NOT MSVC) + target_compile_options(ai_development_plugin PRIVATE -Wno-macro-redefined -Wno-cpp) + endif() add_library(terrain_plugin SHARED apps/plugins/terrain_plugin/main.cpp apps/plugins/terrain_plugin/TerrainBridge.cpp @@ -714,6 +745,9 @@ with open(sys.argv[1], 'w') as f: COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $/plugins/$ + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ + $/plugins/$ COMMAND ${CMAKE_COMMAND} -E copy_if_different $ $/plugins/$ diff --git a/Convoy b/Convoy index 77ffa4cc..2c81b21e 160000 --- a/Convoy +++ b/Convoy @@ -1 +1 @@ -Subproject commit 77ffa4cc711eaac33f4d739ea7750111cc345db4 +Subproject commit 2c81b21e0c6b3091989efc4dc71ec90d03e36a68 diff --git a/apps/plugins/ai_development_plugin/main.cpp b/apps/plugins/ai_development_plugin/main.cpp new file mode 100644 index 00000000..550c694f --- /dev/null +++ b/apps/plugins/ai_development_plugin/main.cpp @@ -0,0 +1,182 @@ +#include "caffeine/navigation/NavigationApi.hpp" +#include "editor/EditorContext.hpp" +#include "editor/PluginAPI.hpp" + +#include +#include + +#ifdef CF_HAS_IMGUI +#include +#endif + +namespace { + +const char* kIdleScript = R"(function onCreate(entity) + caffeine.navigation.setMode(entity, "idle") +end + +function onUpdate(entity, dt) +end +)"; + +const char* kPatrolScript = R"(function onCreate(entity) + caffeine.navigation.setMode(entity, "patrol") +end + +function onUpdate(entity, dt) +end +)"; + +const char* kFollowScript = R"(-- otherEntityId: id of the entity this NPC should follow. +function onCreate(entity) + caffeine.navigation.setMode(entity, "follow") +end + +function onUpdate(entity, dt) +end +)"; + +class AiDevelopmentPlugin : public Caffeine::Editor::IPlugin { +public: + explicit AiDevelopmentPlugin(const Caffeine::Editor::PluginHostApi* host) : m_host(host) {} + + void OnLoad() override { + if (!m_host || !m_host->registerPanel) return; + m_host->registerPanel(m_host->editorContext, GetName(), "AI Development", + &AiDevelopmentPlugin::renderPanel, this); + } + + void OnUnload() override {} + void OnUpdate(float) override {} + + const char* GetName() const override { return "AI Development"; } + const char* GetVersion() const override { return "0.1.0"; } + const char* GetDescription() const override { + return "Author NPC behaviour: idle, patrol, follow, or a Lua script. Not limited to combat."; + } + +private: + static Caffeine::Editor::EditorContext* editorCtx(const Caffeine::Editor::PluginHostApi* host) { + return host ? static_cast(host->editorContext) : nullptr; + } + + static bool writeTemplate(const std::filesystem::path& path, const char* source) { + std::error_code ec; + std::filesystem::create_directories(path.parent_path(), ec); + std::ofstream out(path); + if (!out) return false; + out << source; + return static_cast(out); + } + + static void renderPanel(void* userData) { +#ifdef CF_HAS_IMGUI + auto* self = static_cast(userData); + auto* ctx = editorCtx(self->m_host); + if (!ctx || !ctx->activeWorld) { + ImGui::TextDisabled("No active scene."); + return; + } + Caffeine::ECS::World& world = *ctx->activeWorld; + ImGui::TextWrapped( + "Program any NPC: a villager, a guide, a creature, or an opponent. The grid pathfinder " + "lives in the engine; this panel only authors behaviour."); + + if (!ctx->selectedEntity.isValid()) { + ImGui::TextDisabled("Select an entity to add a nav volume or an agent."); + return; + } + Caffeine::ECS::Entity entity = ctx->selectedEntity; + ImGui::Text("Target: %s (%u)", Caffeine::Editor::getEntityName(world, entity), entity.id()); + + if (!world.has(entity)) { + if (ImGui::Button("Add Nav Volume")) { + Caffeine::Navigation::NavVolume volume; + volume.resize(32, 32); + world.add(entity, volume); + ctx->isDirty = true; + } + } else if (auto* volume = world.get(entity)) { + ImGui::SeparatorText("Nav volume"); + int size[2] = {volume->width, volume->height}; + if (ImGui::DragInt2("Cells", size, 1.0f, 2, 256)) { + volume->resize(size[0], size[1]); + ctx->isDirty = true; + } + if (ImGui::DragFloat("Cell size", &volume->cellSize, 0.05f, 0.1f, 100.0f)) ctx->isDirty = true; + if (ImGui::DragFloat3("Origin", &volume->origin.x, 0.1f)) ctx->isDirty = true; + } + + ImGui::Separator(); + if (!world.has(entity)) { + if (ImGui::Button("Add Nav Agent")) { + world.add(entity); + ctx->isDirty = true; + } + } else if (auto* agent = world.get(entity)) { + ImGui::SeparatorText("Agent"); + int mode = static_cast(agent->mode); + const char* modes[] = {"Idle", "Patrol", "Follow", "Scripted"}; + if (ImGui::Combo("Behaviour", &mode, modes, 4)) { + agent->mode = static_cast(mode); + agent->planDirty = true; + ctx->isDirty = true; + } + if (ImGui::DragFloat("Speed", &agent->speed, 0.05f, 0.0f, 100.0f)) ctx->isDirty = true; + if (ImGui::DragFloat3("Destination", &agent->destination.x, 0.1f)) { + agent->hasDestination = true; + agent->planDirty = true; + ctx->isDirty = true; + } + if (ImGui::Button("Add patrol point from destination")) { + Caffeine::Navigation::addPatrolPoint(world, entity, agent->destination); + ctx->isDirty = true; + } + ImGui::TextDisabled("Patrol points: %u", agent->patrolCount); + if (ImGui::Button("Clear patrol")) { + agent->patrolCount = 0; + agent->patrolIndex = 0; + ctx->isDirty = true; + } + + ImGui::SeparatorText("Behaviour scripts"); + const std::filesystem::path root = ctx->projectRootPath.empty() + ? std::filesystem::path("scripts/ai") + : ctx->projectRootPath / "scripts" / "ai"; + auto save = [&](const char* file, const char* source) { + const std::filesystem::path path = root / file; + if (!writeTemplate(path, source)) return; + Caffeine::Navigation::setBehaviorScript(world, entity, path.generic_string()); + ctx->assetBrowserDirty = true; + ctx->isDirty = true; + }; + if (ImGui::Button("Write idle.lua")) save("idle.lua", kIdleScript); + ImGui::SameLine(); + if (ImGui::Button("Write patrol.lua")) save("patrol.lua", kPatrolScript); + ImGui::SameLine(); + if (ImGui::Button("Write follow.lua")) save("follow.lua", kFollowScript); + if (agent->behaviorScript[0] != '\0') { + ImGui::TextWrapped("Script: %s", agent->behaviorScript); + } + } +#else + (void)userData; +#endif + } + + const Caffeine::Editor::PluginHostApi* m_host = nullptr; +}; + +AiDevelopmentPlugin* g_plugin = nullptr; + +} // namespace + +extern "C" Caffeine::Editor::IPlugin* CreatePlugin(const Caffeine::Editor::PluginHostApi* host) { + if (!g_plugin) g_plugin = new AiDevelopmentPlugin(host); + return g_plugin; +} + +extern "C" void DestroyPlugin(Caffeine::Editor::IPlugin* plugin) { + delete plugin; + g_plugin = nullptr; +} diff --git a/apps/plugins/post_processing_plugin/main.cpp b/apps/plugins/post_processing_plugin/main.cpp index 0d3fb7f6..a2aa18e2 100644 --- a/apps/plugins/post_processing_plugin/main.cpp +++ b/apps/plugins/post_processing_plugin/main.cpp @@ -81,8 +81,8 @@ class PostProcessingPlugin : public Caffeine::Editor::IPlugin { if (!fx) return; ImGui::TextWrapped( - "Modular effect stack — enable and tune each module independently. GPU passes are " - "planned; editor preview uses approximate overlays."); + "The same stack the viewport and gameplay preview run on the GPU. Enable each module " + "on its own; cinematic, horror and arcade are optional looks, not game types."); if (ImGui::CollapsingHeader("Benchmark looks (optional)", ImGuiTreeNodeFlags_DefaultOpen)) { if (Caffeine::PostProcess::EditorUI::drawBenchmarkPresets(*fx)) ctx->isDirty = true; diff --git a/apps/runtime/main.cpp b/apps/runtime/main.cpp index 0f62a92e..dd52f4c3 100644 --- a/apps/runtime/main.cpp +++ b/apps/runtime/main.cpp @@ -1,4 +1,6 @@ #include "animation/AnimationSystem.hpp" +#include "effects/EffectSystem.hpp" +#include "navigation/NavigationSystem.hpp" #include "debug/LogSystem.hpp" #include "events/EventBus.hpp" #include "events/Events.hpp" @@ -15,6 +17,7 @@ #include "ecs/World.hpp" #include "ecs/MeshComponents.hpp" #include "ecs/CameraComponents.hpp" +#include "ecs/Components3D.hpp" #include "ecs/ComponentQuery.hpp" #include "scene/SceneComponents.hpp" #include "scene/HierarchySystem.hpp" @@ -506,6 +509,19 @@ int main(int argc, char** argv) { pumpRuntimeInput(input); if (sceneLoaded) { animation.onUpdate(world, dt); + Caffeine::Vec3 effectCamera{}; + { + Caffeine::ECS::ComponentQuery cameraQuery; + cameraQuery.with(); + cameraQuery.with(); + world.forEach( + cameraQuery, [&](Caffeine::ECS::Entity, Caffeine::ECS::Camera3DComponent&, + Caffeine::ECS::Position3D& position) { + effectCamera = position.position; + }); + } + Caffeine::Effects::tickEffects(world, dt, effectCamera); + Caffeine::Navigation::updateNavigation(world, dt); physics.onUpdate(world, dt); if (scriptsReady) { scriptEngine.setWorld(&world); diff --git a/docs/plans/2026-10-02-editor-backlog-phase-b.md b/docs/plans/2026-10-02-editor-backlog-phase-b.md new file mode 100644 index 00000000..d5ab6a81 --- /dev/null +++ b/docs/plans/2026-10-02-editor-backlog-phase-b.md @@ -0,0 +1,62 @@ +# Editor backlog — Phase B–D (Oct 2026) + +Phase A (materials save, asset previews, ImGui IDs) landed in the same sprint. This document tracks items 4–7 from the product list. + +## 4. Image Manager tab + +**Goal:** Preview, manipulate, and edit 2D images, textures, and related assets. + +**Proposed slices:** + +1. Docked panel `ImageManagerPanel` — open from View/Modules; list recent + project textures. +2. Canvas: zoom/pan, channel view (RGBA), sRGB toggle, metadata (resolution, format). +3. Non-destructive ops first: resize, flip, generate mips preview; export to `.png`/recompile to `.caf` via `TextureCompiler`. +4. Optional: simple paint/rect fill (can delegate heavy work to Convoy Architect long term). + +**Touch points:** `AssetBrowser` (open image here), `TextureCompiler`, `EditorContext`, layout profiles in settings. + +## 5. Animation core + tab + animator + +**Goal:** 2D and 3D animation with state-machine style transitions; scriptable from Lua and C++. + +**Proposed slices:** + +1. **Core (`src/animation/`):** `AnimationClip` (keyframes: transform, sprite frame, morph), `AnimationPlayer` component, clock/evaluator shared by 2D/3D. +2. **Editor tab:** timeline already stubbed (`animationTimeline`, `animatorController`) — wire to core assets (`.anim`, `.controller`). +3. **Animator:** graph nodes (states, transitions, conditions: float/bool/trigger), blend trees for 3D. +4. **API:** C++ public headers in `caffeine-core`; Lua bindings mirroring `AnimationPlayer` + `AnimatorController` setters. + +**Dependencies:** scene serialization, existing skeletal/mesh path for 3D; sprite/tile components for 2D. + +## 6. Post-processing plugin (complete) + +**Goal:** Use HDR forward + `PostProcessStack` end-to-end in editor and runtime. + +**Proposed slices:** + +1. Audit `PostProcessEditorUI` vs runtime stack — ensure same effect order and parameter IDs. +2. Register plugin with editor menu; persist stack per scene or global volume component. +3. Viewport + gameplay preview both route through stack when enabled. +4. Document effect list and Lua/C++ hooks for toggling volumes. + +**Touch points:** recent commit “HDR forward PBR pipeline, GPU post stack”; `doppio-plugins/` if packaged separately. + +## 7. Pathfinding base + AI development plugin + +**Goal:** Engine-level nav/path API; editor plugin to author NPC behaviour (not combat-only). + +**Proposed slices:** + +1. **Core:** nav mesh or grid abstraction (`NavMesh`, `PathQuery`), async request queue, debug draw in viewport. +2. **ECS:** `NavAgent` + `AIController` components; steering along path. +3. **Plugin:** behaviour trees or state scripts (Lua), templates for patrol/chase/interact; visual debugger. +4. **Integration:** use physics/world queries from existing Bullet integration where applicable. + +--- + +## Suggested PR order + +1. Image Manager (vertical slice, user-visible). +2. Animation core + minimal clip playback in viewport. +3. Post-process plugin completion (smaller, builds on recent pipeline work). +4. Pathfinding + AI plugin (largest; split core vs plugin). diff --git a/include/caffeine/animation/AnimationApi.hpp b/include/caffeine/animation/AnimationApi.hpp new file mode 100644 index 00000000..2a3230b7 --- /dev/null +++ b/include/caffeine/animation/AnimationApi.hpp @@ -0,0 +1,98 @@ +#pragma once + +#include "animation/AnimationComponents.hpp" +#include "animation/AnimationPlayer.hpp" +#include "animation/SkinLibrary.hpp" +#include "ecs/Components.hpp" + +#include +#include +#include "ecs/Entity.hpp" +#include "ecs/World.hpp" + +namespace Caffeine::Animation { + +/// C++ entry points. Lua `caffeine.animation.*` calls the same functions. + +inline bool playSkinnedClip(ECS::World& world, ECS::Entity entity, const std::string& meshPath, i32 clipIndex) { + if (!entity.isValid()) return false; + SkinnedPose pose; + if (SkinnedPose* existing = world.get(entity)) pose = *existing; + if (!meshPath.empty()) { + std::memset(pose.meshPath, 0, sizeof(pose.meshPath)); + const size_t count = std::min(meshPath.size(), sizeof(pose.meshPath) - 1); + std::memcpy(pose.meshPath, meshPath.data(), count); + pose.loaded = false; + } + pose.clipIndex = clipIndex; + pose.time = 0.0f; + pose.playing = true; + if (world.has(entity)) *world.get(entity) = pose; + else world.add(entity, pose); + return true; +} + +inline bool setSpriteSheet(ECS::World& world, ECS::Entity entity, u32 columns, u32 rows, u32 frameCount) { + if (!entity.isValid()) return false; + SpriteSheet sheet; + sheet.columns = std::max(1u, columns); + sheet.rows = std::max(1u, rows); + sheet.frameCount = std::max(1u, frameCount); + if (world.has(entity)) *world.get(entity) = sheet; + else world.add(entity, sheet); + if (!world.has(entity)) world.add(entity); + return true; +} + +inline bool playClip(ECS::World& world, ECS::Entity entity, const std::string& path) { + if (!entity.isValid()) return false; + MotionClip clip; + if (!loadMotionClip(path, clip)) return false; + + AnimationPlayer player; + setPlayerPath(player, path); + player.clip = std::move(clip); + player.loaded = true; + player.playing = true; + player.loop = player.clip.loop; + player.time = 0.0f; + if (world.has(entity)) { + *world.get(entity) = std::move(player); + } else { + world.add(entity, std::move(player)); + } + return true; +} + +inline bool setBool(ECS::World& world, ECS::Entity entity, const char* name, bool value) { + Animator* animator = world.get(entity); + if (!animator || !name) return false; + animator->setBool(name, value); + return true; +} + +inline bool setFloat(ECS::World& world, ECS::Entity entity, const char* name, f32 value) { + Animator* animator = world.get(entity); + if (!animator || !name) return false; + animator->setFloat(name, value); + return true; +} + +inline bool setTrigger(ECS::World& world, ECS::Entity entity, const char* name) { + Animator* animator = world.get(entity); + if (!animator || !name) return false; + animator->setTrigger(name); + return true; +} + +inline bool playState(ECS::World& world, ECS::Entity entity, const char* stateName) { + Animator* animator = world.get(entity); + if (!animator || !stateName) return false; + animator->previousState = animator->currentState; + animator->currentState = stateName; + animator->timeInState = 0.0f; + animator->paused = false; + return true; +} + +} // namespace Caffeine::Animation diff --git a/include/caffeine/effects/EffectApi.hpp b/include/caffeine/effects/EffectApi.hpp new file mode 100644 index 00000000..e1beab56 --- /dev/null +++ b/include/caffeine/effects/EffectApi.hpp @@ -0,0 +1,105 @@ +#pragma once + +#include "effects/EffectTypes.hpp" +#include "ecs/Entity.hpp" +#include "ecs/World.hpp" + +#include + +namespace Caffeine::Effects { + +inline bool setEffect(ECS::World& world, ECS::Entity entity, EffectKind kind, EffectQuality quality) { + if (!entity.isValid()) return false; + EffectComponent effect; + if (EffectComponent* existing = world.get(entity)) effect = *existing; + effect.enabled = 1; + effect.kind = static_cast(kind); + effect.quality = static_cast(quality); + if (kind == EffectKind::ReflectiveSurface && effect.reflection <= 0.0f) effect.reflection = 0.85f; + if (kind == EffectKind::VolumetricLight) effect.domain = static_cast(EffectDomain::ThreeD); + if (kind == EffectKind::Fog && effect.radius <= 0.0f) { + configureFog(effect, static_cast(effect.domain), EffectFogStyle::Fog); + } + if (world.has(entity)) *world.get(entity) = effect; + else world.add(entity, effect); + return true; +} + +inline bool setParticleEmitter(ECS::World& world, ECS::Entity entity, EffectDomain domain) { + if (!entity.isValid()) return false; + EffectComponent effect; + const bool fresh = world.get(entity) == nullptr || + world.get(entity)->kind != static_cast(EffectKind::Particles); + if (EffectComponent* existing = world.get(entity)) effect = *existing; + if (fresh) configureParticle(effect, domain); + else { + effect.enabled = 1; + effect.kind = static_cast(EffectKind::Particles); + effect.domain = static_cast(domain); + } + if (world.has(entity)) *world.get(entity) = effect; + else world.add(entity, effect); + return true; +} + +inline bool setParticleParams(ECS::World& world, ECS::Entity entity, f32 rate, f32 lifetime, + i32 maxParticles, f32 startSize, f32 endSize, f32 gravityY) { + if (!entity.isValid()) return false; + if (!world.get(entity)) { + if (!setParticleEmitter(world, entity, EffectDomain::ThreeD)) return false; + } + EffectComponent* effect = world.get(entity); + if (!effect) return false; + if (effect->kind != static_cast(EffectKind::Particles)) { + configureParticle(*effect, static_cast(effect->domain)); + } + effect->rate = std::max(rate, 0.0f); + effect->lifetime = std::max(lifetime, 0.05f); + effect->maxParticles = std::max(maxParticles, 0); + effect->startSize = std::max(startSize, 0.0f); + effect->endSize = std::max(endSize, 0.0f); + effect->gravity.y = gravityY; + return true; +} + +inline bool setVolumetricLight(ECS::World& world, ECS::Entity entity) { + if (!entity.isValid()) return false; + EffectComponent effect; + if (EffectComponent* existing = world.get(entity)) effect = *existing; + if (effect.kind != static_cast(EffectKind::VolumetricLight)) configureVolumetricLight(effect); + else { + effect.enabled = 1; + effect.kind = static_cast(EffectKind::VolumetricLight); + effect.domain = static_cast(EffectDomain::ThreeD); + } + if (world.has(entity)) *world.get(entity) = effect; + else world.add(entity, effect); + return true; +} + +inline bool setVolumetricShape(ECS::World& world, ECS::Entity entity, VolumetricShape shape, + u32 columns = 0, u32 rows = 0) { + if (!entity.isValid()) return false; + EffectComponent effect; + if (EffectComponent* existing = world.get(entity)) effect = *existing; + const Vec3 keptColor = effect.lightColor; + const bool keepColor = effect.kind == static_cast(EffectKind::VolumetricLight); + configureVolumetricLight(effect, shape); + if (keepColor) effect.lightColor = keptColor; + if (shape == VolumetricShape::Window && columns > 0 && rows > 0) setVolumetricGrid(effect, columns, rows); + if (world.has(entity)) *world.get(entity) = effect; + else world.add(entity, effect); + return true; +} + +inline bool setFog(ECS::World& world, ECS::Entity entity, EffectDomain domain, EffectFogStyle style) { + if (!entity.isValid()) return false; + EffectComponent effect; + if (EffectComponent* existing = world.get(entity)) effect = *existing; + configureFog(effect, domain, style); + if (world.has(entity)) *world.get(entity) = effect; + else world.add(entity, effect); + return true; +} + +} // namespace Caffeine::Effects diff --git a/include/caffeine/navigation/NavigationApi.hpp b/include/caffeine/navigation/NavigationApi.hpp new file mode 100644 index 00000000..bb7f02bd --- /dev/null +++ b/include/caffeine/navigation/NavigationApi.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include "navigation/NavigationSystem.hpp" + +#include +#include + +namespace Caffeine::Navigation { + +inline NavAgent* ensureAgent(ECS::World& world, ECS::Entity entity) { + if (!entity.isValid()) return nullptr; + if (!world.has(entity)) world.add(entity); + return world.get(entity); +} + +inline bool setDestination(ECS::World& world, ECS::Entity entity, const Vec3& destination) { + NavAgent* agent = ensureAgent(world, entity); + if (!agent) return false; + agent->destination = destination; + agent->hasDestination = true; + agent->planDirty = true; + if (agent->mode == NavMode::Idle) agent->mode = NavMode::Scripted; + return true; +} + +inline bool setMode(ECS::World& world, ECS::Entity entity, NavMode mode) { + NavAgent* agent = ensureAgent(world, entity); + if (!agent) return false; + agent->mode = mode; + agent->planDirty = true; + return true; +} + +inline NavMode modeFromName(const std::string& name) { + if (name == "patrol") return NavMode::Patrol; + if (name == "follow") return NavMode::Follow; + if (name == "scripted") return NavMode::Scripted; + return NavMode::Idle; +} + +inline const char* modeName(NavMode mode) { + switch (mode) { + case NavMode::Patrol: return "patrol"; + case NavMode::Follow: return "follow"; + case NavMode::Scripted: return "scripted"; + case NavMode::Idle: return "idle"; + } + return "idle"; +} + +inline bool addPatrolPoint(ECS::World& world, ECS::Entity entity, const Vec3& point) { + NavAgent* agent = ensureAgent(world, entity); + if (!agent || agent->patrolCount >= static_cast(kMaxPatrolPoints)) return false; + agent->patrol[agent->patrolCount++] = point; + agent->mode = NavMode::Patrol; + agent->planDirty = true; + return true; +} + +inline bool setFollowTarget(ECS::World& world, ECS::Entity entity, u32 targetId) { + NavAgent* agent = ensureAgent(world, entity); + if (!agent) return false; + agent->followEntity = targetId; + agent->mode = NavMode::Follow; + agent->planDirty = true; + return true; +} + +inline bool setBehaviorScript(ECS::World& world, ECS::Entity entity, const std::string& path) { + NavAgent* agent = ensureAgent(world, entity); + if (!agent) return false; + std::memset(agent->behaviorScript, 0, sizeof(agent->behaviorScript)); + const size_t count = std::min(path.size(), sizeof(agent->behaviorScript) - 1); + if (count > 0) std::memcpy(agent->behaviorScript, path.data(), count); + return true; +} + +} // namespace Caffeine::Navigation diff --git a/scripts/build.sh b/scripts/build.sh old mode 100644 new mode 100755 diff --git a/src/animation/AnimationPlayer.hpp b/src/animation/AnimationPlayer.hpp new file mode 100644 index 00000000..01ec334f --- /dev/null +++ b/src/animation/AnimationPlayer.hpp @@ -0,0 +1,78 @@ +#pragma once + +#include "animation/ClipAsset.hpp" +#include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/ComponentQuery.hpp" +#include "ecs/World.hpp" + +#include +#include + +namespace Caffeine::Animation { + +/// Plays a MotionClip on a sprite (2D) and/or a local transform (2D or 3D). +struct AnimationPlayer { + char clipPath[260] = {}; + f32 time = 0.0f; + f32 speed = 1.0f; + bool playing = true; + bool loop = true; + bool loaded = false; + MotionClip clip; +}; + +inline void tickAnimationPlayers(ECS::World& world, f32 dt) { + ECS::ComponentQuery query; + query.with(); + world.forEach(query, [&](ECS::Entity entity, AnimationPlayer& player) { + if (!player.loaded && player.clipPath[0] != '\0') { + player.loaded = loadMotionClip(player.clipPath, player.clip); + if (player.loaded) player.loop = player.clip.loop; + } + if (!player.loaded || !player.playing) return; + + player.time += dt * player.speed; + const f32 duration = motionClipDuration(player.clip); + if (duration > 0.0f && player.time >= duration) { + if (player.loop) { + player.time = std::fmod(player.time, duration); + } else { + player.time = duration; + player.playing = false; + } + } + + if (!player.clip.spriteFrames.empty()) { + if (ECS::Sprite* sprite = world.get(entity)) { + sprite->frameIndex = sampleSpriteFrame(player.clip, player.time); + } + } + if (!player.clip.rotations.empty()) { + const Quat sampled = sampleRotation(player.clip, player.time); + if (ECS::Rotation3D* rotation = world.get(entity)) { + rotation->quaternion = Vec4(sampled.x, sampled.y, sampled.z, sampled.w); + } + } + if (!player.clip.positions.empty()) { + const Vec3 sampled = samplePosition(player.clip, player.time); + if (ECS::Position3D* position = world.get(entity)) { + position->position = sampled; + } else if (ECS::Transform* transform = world.get(entity)) { + transform->position = sampled; + } else if (ECS::Position2D* position2d = world.get(entity)) { + position2d->x = sampled.x; + position2d->y = sampled.y; + } + } + }); +} + +inline void setPlayerPath(AnimationPlayer& player, const std::string& path) { + std::memset(player.clipPath, 0, sizeof(player.clipPath)); + if (path.empty()) return; + const size_t count = std::min(path.size(), sizeof(player.clipPath) - 1); + std::memcpy(player.clipPath, path.data(), count); +} + +} // namespace Caffeine::Animation diff --git a/src/animation/AnimationSystem.hpp b/src/animation/AnimationSystem.hpp index fdc0b5b7..92e4870d 100644 --- a/src/animation/AnimationSystem.hpp +++ b/src/animation/AnimationSystem.hpp @@ -1,6 +1,8 @@ #pragma once #include "animation/AnimationComponents.hpp" +#include "animation/AnimationPlayer.hpp" +#include "animation/SkinLibrary.hpp" #include "ecs/World.hpp" #include "ecs/Entity.hpp" #include "ecs/ISystem.hpp" @@ -16,6 +18,9 @@ using namespace Caffeine; class AnimationSystem : public ECS::ISystem { public: void onUpdate(ECS::World& world, f32 dt) override { + tickAnimationPlayers(world, dt); + tickSkinnedPoses(world, dt); + ECS::ComponentQuery q; q.with(); q.with(); diff --git a/src/animation/ClipAsset.hpp b/src/animation/ClipAsset.hpp new file mode 100644 index 00000000..1e866189 --- /dev/null +++ b/src/animation/ClipAsset.hpp @@ -0,0 +1,164 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Quat.hpp" +#include "math/Vec3.hpp" + +#include +#include +#include +#include +#include +#include + +namespace Caffeine::Animation { + +struct SpriteFrameKey { + f32 time = 0.0f; + u32 frame = 0; + f32 x = 0.0f; + f32 y = 0.0f; + f32 w = 0.0f; + f32 h = 0.0f; +}; + +struct Vec3Key { + f32 time = 0.0f; + Vec3 value{}; +}; + +struct QuatKey { + f32 time = 0.0f; + Quat value = Quat::identity(); +}; + +/// Shared clip for 2D sprite frames and 3D local positions. +struct MotionClip { + std::string name = "Clip"; + f32 duration = 1.0f; + bool loop = true; + u32 fps = 12; + std::vector spriteFrames; + std::vector positions; + std::vector rotations; +}; + +inline f32 motionClipDuration(const MotionClip& clip) { + f32 end = clip.duration; + for (const SpriteFrameKey& key : clip.spriteFrames) end = std::max(end, key.time); + for (const Vec3Key& key : clip.positions) end = std::max(end, key.time); + for (const QuatKey& key : clip.rotations) end = std::max(end, key.time); + return std::max(end, 0.0f); +} + +inline u32 sampleSpriteFrame(const MotionClip& clip, f32 time) { + if (clip.spriteFrames.empty()) return 0; + u32 frame = clip.spriteFrames.front().frame; + for (const SpriteFrameKey& key : clip.spriteFrames) { + if (key.time > time) break; + frame = key.frame; + } + return frame; +} + +inline Vec3 samplePosition(const MotionClip& clip, f32 time) { + if (clip.positions.empty()) return {}; + if (clip.positions.size() == 1 || time <= clip.positions.front().time) { + return clip.positions.front().value; + } + for (size_t i = 1; i < clip.positions.size(); ++i) { + const Vec3Key& b = clip.positions[i]; + if (time > b.time) continue; + const Vec3Key& a = clip.positions[i - 1]; + const f32 span = b.time - a.time; + const f32 t = span > 0.0f ? (time - a.time) / span : 1.0f; + return a.value + (b.value - a.value) * t; + } + return clip.positions.back().value; +} + +inline Quat sampleRotation(const MotionClip& clip, f32 time) { + if (clip.rotations.empty()) return Quat::identity(); + if (clip.rotations.size() == 1 || time <= clip.rotations.front().time) { + return clip.rotations.front().value; + } + for (size_t i = 1; i < clip.rotations.size(); ++i) { + const QuatKey& b = clip.rotations[i]; + if (time > b.time) continue; + const QuatKey& a = clip.rotations[i - 1]; + const f32 span = b.time - a.time; + const f32 t = span > 0.0f ? (time - a.time) / span : 1.0f; + return Quat::slerp(a.value, b.value, t); + } + return clip.rotations.back().value; +} + +inline bool saveMotionClip(const std::filesystem::path& path, const MotionClip& clip) { + std::error_code ec; + if (path.has_parent_path()) std::filesystem::create_directories(path.parent_path(), ec); + std::ofstream out(path); + if (!out) return false; + out << "CAFANIM1\n"; + out << "name " << clip.name << '\n'; + out << "loop " << (clip.loop ? 1 : 0) << '\n'; + out << "fps " << clip.fps << '\n'; + out << "duration " << clip.duration << '\n'; + for (const SpriteFrameKey& key : clip.spriteFrames) { + out << "sprite " << key.time << ' ' << key.frame << ' ' << key.x << ' ' << key.y << ' ' + << key.w << ' ' << key.h << '\n'; + } + for (const Vec3Key& key : clip.positions) { + out << "pos " << key.time << ' ' << key.value.x << ' ' << key.value.y << ' ' << key.value.z + << '\n'; + } + for (const QuatKey& key : clip.rotations) { + out << "rot " << key.time << ' ' << key.value.x << ' ' << key.value.y << ' ' << key.value.z + << ' ' << key.value.w << '\n'; + } + return static_cast(out); +} + +inline bool loadMotionClip(const std::filesystem::path& path, MotionClip& outClip) { + std::ifstream in(path); + if (!in) return false; + std::string header; + if (!std::getline(in, header) || header != "CAFANIM1") return false; + + MotionClip clip; + std::string line; + while (std::getline(in, line)) { + if (line.empty()) continue; + std::istringstream ss(line); + std::string tag; + ss >> tag; + if (tag == "name") { + std::getline(ss, clip.name); + if (!clip.name.empty() && clip.name[0] == ' ') clip.name.erase(0, 1); + } else if (tag == "loop") { + int loop = 1; + ss >> loop; + clip.loop = loop != 0; + } else if (tag == "fps") { + ss >> clip.fps; + } else if (tag == "duration") { + ss >> clip.duration; + } else if (tag == "sprite") { + SpriteFrameKey key; + ss >> key.time >> key.frame >> key.x >> key.y >> key.w >> key.h; + clip.spriteFrames.push_back(key); + } else if (tag == "pos") { + Vec3Key key; + ss >> key.time >> key.value.x >> key.value.y >> key.value.z; + clip.positions.push_back(key); + } else if (tag == "rot") { + QuatKey key; + ss >> key.time >> key.value.x >> key.value.y >> key.value.z >> key.value.w; + clip.rotations.push_back(key); + } + } + clip.duration = motionClipDuration(clip); + outClip = std::move(clip); + return true; +} + +} // namespace Caffeine::Animation diff --git a/src/animation/SkeletalAnimation.hpp b/src/animation/SkeletalAnimation.hpp index e02d7ff8..c1627870 100644 --- a/src/animation/SkeletalAnimation.hpp +++ b/src/animation/SkeletalAnimation.hpp @@ -34,6 +34,8 @@ struct Bone { // ============================================================================ struct Skeleton { std::vector bones; + /// Inverse of the skinned mesh node. Puts joint matrices back in mesh space. + Mat4 skinSpace; u32 boneCount() const { return static_cast(bones.size()); } @@ -176,10 +178,11 @@ inline void SkeletalClip::sampleAt(f32 time, const Skeleton& skeleton, std::vect } } - // ── Passo 1: amostrar keyframes e montar matrizes locais ── + // Bones without keys keep the bind-pose local transform. std::vector localMatrices(boneCount, Mat4::identity()); for (u32 boneIdx = 0; boneIdx < boneCount; ++boneIdx) { + localMatrices[boneIdx] = skeleton.bones[boneIdx].localTransform; const std::vector* keys = channels.get(boneIdx); if (!keys || keys->empty()) continue; @@ -215,21 +218,30 @@ inline void SkeletalClip::sampleAt(f32 time, const Skeleton& skeleton, std::vect localMatrices[boneIdx] = Detail::buildTRS(pos, rot, s); } - // ── Passo 2: calcular matrizes mundo ── - // Os bones são armazenados em ordem topológica (pais antes dos filhos). - std::vector worldMatrices(boneCount); - for (u32 boneIdx = 0; boneIdx < boneCount; ++boneIdx) { - const Bone& bone = skeleton.bones[boneIdx]; - if (bone.parentIndex >= 0) { - worldMatrices[boneIdx] = worldMatrices[static_cast(bone.parentIndex)] * localMatrices[boneIdx]; - } else { - worldMatrices[boneIdx] = localMatrices[boneIdx]; + // Parents may appear after children in imported joint lists. + std::vector worldMatrices(boneCount, Mat4::identity()); + std::vector resolved(boneCount, 0); + for (u32 pass = 0; pass < boneCount; ++pass) { + bool progressed = false; + for (u32 boneIdx = 0; boneIdx < boneCount; ++boneIdx) { + if (resolved[boneIdx]) continue; + const Bone& bone = skeleton.bones[boneIdx]; + if (bone.parentIndex >= 0 && + (bone.parentIndex >= static_cast(boneCount) || !resolved[static_cast(bone.parentIndex)])) { + continue; + } + worldMatrices[boneIdx] = bone.parentIndex >= 0 + ? worldMatrices[static_cast(bone.parentIndex)] * localMatrices[boneIdx] + : localMatrices[boneIdx]; + resolved[boneIdx] = 1; + progressed = true; } + if (!progressed) break; } - // ── Passo 3: multiplicar por inverseBindPose para skinning ── for (u32 boneIdx = 0; boneIdx < boneCount; ++boneIdx) { - boneTransforms[boneIdx] = worldMatrices[boneIdx] * skeleton.bones[boneIdx].bindPoseInverse; + boneTransforms[boneIdx] = + skeleton.skinSpace * worldMatrices[boneIdx] * skeleton.bones[boneIdx].bindPoseInverse; } } diff --git a/src/animation/SkinLibrary.cpp b/src/animation/SkinLibrary.cpp new file mode 100644 index 00000000..d5ec5a1a --- /dev/null +++ b/src/animation/SkinLibrary.cpp @@ -0,0 +1,223 @@ +#include "animation/SkinLibrary.hpp" + +#include "assets/MeshCache.hpp" +#include "ecs/ComponentQuery.hpp" + +#include +#include +#include +#include + +namespace Caffeine::Animation { +namespace { + +std::unordered_map g_skins; +std::unordered_map> g_posed; + +std::string normalizedBone(const std::string& name) { + const auto cut = name.find_last_of(":|"); + const std::string tail = cut == std::string::npos ? name : name.substr(cut + 1); + std::string out; + out.reserve(tail.size()); + for (unsigned char c : tail) { + if (std::isalnum(c)) out.push_back(static_cast(std::tolower(c))); + } + return out; +} + +struct Alias { + HumanoidBone bone; + const char* token; +}; + +constexpr Alias kAliases[] = { + {HumanoidBone::LeftUpperArm, "leftupperarm"}, {HumanoidBone::RightUpperArm, "rightupperarm"}, + {HumanoidBone::LeftLowerArm, "leftlowerarm"}, {HumanoidBone::RightLowerArm, "rightlowerarm"}, + {HumanoidBone::LeftUpperArm, "lupperarm"}, {HumanoidBone::RightUpperArm, "rupperarm"}, + {HumanoidBone::LeftLowerArm, "lforearm"}, {HumanoidBone::RightLowerArm, "rforearm"}, + {HumanoidBone::LeftUpperArm, "leftarm"}, {HumanoidBone::RightUpperArm, "rightarm"}, + {HumanoidBone::LeftHand, "lefthand"}, {HumanoidBone::RightHand, "righthand"}, + {HumanoidBone::LeftHand, "lhand"}, {HumanoidBone::RightHand, "rhand"}, + {HumanoidBone::LeftUpperLeg, "leftupleg"}, {HumanoidBone::RightUpperLeg, "rightupleg"}, + {HumanoidBone::LeftUpperLeg, "leftthigh"}, {HumanoidBone::RightUpperLeg, "rightthigh"}, + {HumanoidBone::LeftUpperLeg, "lthigh"}, {HumanoidBone::RightUpperLeg, "rthigh"}, + {HumanoidBone::LeftLowerLeg, "leftleg"}, {HumanoidBone::RightLowerLeg, "rightleg"}, + {HumanoidBone::LeftLowerLeg, "lcalf"}, {HumanoidBone::RightLowerLeg, "rcalf"}, + {HumanoidBone::LeftFoot, "leftfoot"}, {HumanoidBone::RightFoot, "rightfoot"}, + {HumanoidBone::LeftFoot, "lfoot"}, {HumanoidBone::RightFoot, "rfoot"}, + {HumanoidBone::Chest, "spine2"}, {HumanoidBone::Chest, "spine1"}, + {HumanoidBone::Chest, "chest"}, {HumanoidBone::Spine, "spine"}, + {HumanoidBone::Neck, "neck"}, {HumanoidBone::Head, "head"}, + {HumanoidBone::Hips, "hips"}, {HumanoidBone::Hips, "pelvis"}, +}; + +bool tokenMatches(const std::string& bone, const char* token) { + const std::string needle(token); + if (bone == needle) return true; + return bone.size() > needle.size() && bone.compare(bone.size() - needle.size(), needle.size(), needle) == 0; +} + +} // namespace + +void registerImportedSkin(const std::string& path, ImportedSkin skin) { + if (path.empty() || skin.skeleton.bones.empty()) return; + g_skins[path] = std::move(skin); +} + +const ImportedSkin* findImportedSkin(const std::string& path) { + if (path.empty()) return nullptr; + const auto exact = g_skins.find(path); + if (exact != g_skins.end()) return &exact->second; + const ImportedSkin* match = nullptr; + for (const auto& entry : g_skins) { + if (entry.first.size() >= path.size() && + entry.first.compare(entry.first.size() - path.size(), path.size(), path) == 0) { + match = &entry.second; + } + } + return match; +} + +const char* humanoidBoneName(HumanoidBone bone) { + switch (bone) { + case HumanoidBone::Hips: return "Hips"; + case HumanoidBone::Spine: return "Spine"; + case HumanoidBone::Chest: return "Chest"; + case HumanoidBone::Neck: return "Neck"; + case HumanoidBone::Head: return "Head"; + case HumanoidBone::LeftUpperArm: return "Left Upper Arm"; + case HumanoidBone::LeftLowerArm: return "Left Lower Arm"; + case HumanoidBone::LeftHand: return "Left Hand"; + case HumanoidBone::RightUpperArm: return "Right Upper Arm"; + case HumanoidBone::RightLowerArm: return "Right Lower Arm"; + case HumanoidBone::RightHand: return "Right Hand"; + case HumanoidBone::LeftUpperLeg: return "Left Upper Leg"; + case HumanoidBone::LeftLowerLeg: return "Left Lower Leg"; + case HumanoidBone::LeftFoot: return "Left Foot"; + case HumanoidBone::RightUpperLeg: return "Right Upper Leg"; + case HumanoidBone::RightLowerLeg: return "Right Lower Leg"; + case HumanoidBone::RightFoot: return "Right Foot"; + case HumanoidBone::Count: break; + } + return ""; +} + +HumanoidRig matchHumanoid(const ImportedSkin& skin) { + HumanoidRig rig; + const u32 count = std::max(skin.skeleton.boneCount(), static_cast(skin.boneNames.size())); + for (u32 i = 0; i < count; ++i) { + const std::string source = i < skin.boneNames.size() ? skin.boneNames[i] : skin.skeleton.bones[i].name.cStr(); + const std::string bone = normalizedBone(source); + for (const Alias& alias : kAliases) { + const int slot = static_cast(alias.bone); + if (rig.bones[slot] >= 0) continue; + if (tokenMatches(bone, alias.token)) { + rig.bones[slot] = static_cast(i); + break; + } + } + } + const bool arm = rig.bones[static_cast(HumanoidBone::LeftUpperArm)] >= 0 || + rig.bones[static_cast(HumanoidBone::RightUpperArm)] >= 0; + const bool leg = rig.bones[static_cast(HumanoidBone::LeftUpperLeg)] >= 0 || + rig.bones[static_cast(HumanoidBone::RightUpperLeg)] >= 0; + rig.matched = rig.bones[static_cast(HumanoidBone::Hips)] >= 0 && + rig.bones[static_cast(HumanoidBone::Head)] >= 0 && arm && leg; + return rig; +} + +void skinVertices(const Assets::Mesh3D& bind, const std::vector& bones, + std::vector& out) { + out = bind.vertices; + if (bind.skin.size() != bind.vertices.size() || bones.empty()) return; + for (size_t i = 0; i < bind.vertices.size(); ++i) { + const Assets::VertexSkin& skin = bind.skin[i]; + f32 weightSum = 0.0f; + for (f32 weight : skin.weights) weightSum += weight; + if (weightSum <= 0.0001f) continue; + Vec3 position{}; + Vec3 normal{}; + for (int influence = 0; influence < 4; ++influence) { + const f32 weight = skin.weights[influence]; + if (weight <= 0.0f) continue; + const u32 joint = skin.joints[influence]; + if (joint >= bones.size()) continue; + position = position + bones[joint].transformPoint(bind.vertices[i].position) * weight; + normal = normal + bones[joint].transformVector(bind.vertices[i].normal) * weight; + } + out[i].position = position; + if (normal.lengthSquared() > 0.0001f) out[i].normal = normal.normalized(); + } +} + +SpriteSheetRect spriteSheetFrame(const SpriteSheet& sheet, u32 frame, f32 textureWidth, f32 textureHeight) { + const u32 columns = std::max(1u, sheet.columns); + const u32 rows = std::max(1u, sheet.rows); + const u32 count = std::max(1u, sheet.frameCount == 0 ? columns * rows : sheet.frameCount); + const u32 index = frame % count; + const u32 column = index % columns; + const u32 row = std::min(index / columns, rows - 1); + SpriteSheetRect rect; + rect.w = textureWidth / static_cast(columns); + rect.h = textureHeight / static_cast(rows); + rect.x = static_cast(column) * rect.w; + rect.y = static_cast(row) * rect.h; + return rect; +} + +const std::vector* skinnedVerticesFor(u32 entityId) { + const auto it = g_posed.find(entityId); + if (it == g_posed.end() || it->second.empty()) return nullptr; + return &it->second; +} + +void tickSkinnedPoses(ECS::World& world, f32 dt) { + ECS::ComponentQuery query; + query.with(); + std::vector live; + world.forEach(query, [&](ECS::Entity entity, SkinnedPose& pose) { + live.push_back(entity.id()); + if (pose.meshPath[0] == '\0') return; + Assets::MeshCache::getInstance().getMesh(pose.meshPath, ""); + const ImportedSkin* skin = findImportedSkin(pose.meshPath); + const Assets::Mesh3D* mesh = skin ? skin->mesh : nullptr; + if (!mesh) mesh = Assets::MeshCache::getInstance().getMesh(pose.meshPath, ""); + if (!skin || !mesh) { + g_posed.erase(entity.id()); + return; + } + if (!pose.loaded) { + pose.humanoid = matchHumanoid(*skin); + pose.loaded = true; + if (pose.clipIndex < 0) pose.clipIndex = 0; + } + if (!skin->clips.empty()) { + if (pose.clipIndex >= static_cast(skin->clips.size())) pose.clipIndex = 0; + const SkeletalClip& clip = skin->clips[static_cast(pose.clipIndex)]; + if (pose.playing) { + pose.time += dt * pose.speed; + const f32 duration = std::max(clip.duration, 0.0f); + if (duration > 0.0f && pose.time >= duration) { + if (pose.loop && clip.loop) pose.time = std::fmod(pose.time, duration); + else { + pose.time = duration; + pose.playing = false; + } + } + } + std::vector bones; + clip.sampleAt(pose.time, skin->skeleton, bones); + skinVertices(*mesh, bones, g_posed[entity.id()]); + } else { + g_posed[entity.id()] = mesh->vertices; + } + }); + + for (auto it = g_posed.begin(); it != g_posed.end();) { + const bool stillLive = std::find(live.begin(), live.end(), it->first) != live.end(); + if (!stillLive) it = g_posed.erase(it); + else ++it; + } +} + +} // namespace Caffeine::Animation diff --git a/src/animation/SkinLibrary.hpp b/src/animation/SkinLibrary.hpp new file mode 100644 index 00000000..d979cece --- /dev/null +++ b/src/animation/SkinLibrary.hpp @@ -0,0 +1,92 @@ +#pragma once + +#include "animation/SkeletalAnimation.hpp" +#include "assets/MeshTypes.hpp" +#include "ecs/Entity.hpp" +#include "ecs/World.hpp" + +#include +#include + +namespace Caffeine::Animation { + +struct ImportedSkin { + Skeleton skeleton; + std::vector boneNames; + std::vector clips; + std::vector clipNames; + const Assets::Mesh3D* mesh = nullptr; +}; + +void registerImportedSkin(const std::string& path, ImportedSkin skin); +const ImportedSkin* findImportedSkin(const std::string& path); + +enum class HumanoidBone : u8 { + Hips, + Spine, + Chest, + Neck, + Head, + LeftUpperArm, + LeftLowerArm, + LeftHand, + RightUpperArm, + RightLowerArm, + RightHand, + LeftUpperLeg, + LeftLowerLeg, + LeftFoot, + RightUpperLeg, + RightLowerLeg, + RightFoot, + Count +}; + +struct HumanoidRig { + i32 bones[static_cast(HumanoidBone::Count)]; + bool matched = false; + + HumanoidRig() { + for (i32& bone : bones) bone = -1; + } +}; + +const char* humanoidBoneName(HumanoidBone bone); +HumanoidRig matchHumanoid(const ImportedSkin& skin); + +/// Writes skinned positions into `out`. Unskinned meshes are copied through. +void skinVertices(const Assets::Mesh3D& bind, const std::vector& bones, + std::vector& out); + +/// Owned playback for a skinned or general 3D mesh. The skeleton stays in the import library. +struct SkinnedPose { + char meshPath[260] = {}; + i32 clipIndex = 0; + f32 time = 0.0f; + f32 speed = 1.0f; + bool playing = true; + bool loop = true; + bool loaded = false; + HumanoidRig humanoid; +}; + +/// Grid of frames on one texture. frameIndex selects the cell. +struct SpriteSheet { + u32 columns = 1; + u32 rows = 1; + u32 frameCount = 1; +}; + +struct SpriteSheetRect { + f32 x = 0.0f; + f32 y = 0.0f; + f32 w = 0.0f; + f32 h = 0.0f; +}; + +SpriteSheetRect spriteSheetFrame(const SpriteSheet& sheet, u32 frame, f32 textureWidth, f32 textureHeight); + +const std::vector* skinnedVerticesFor(u32 entityId); +void tickSkinnedPoses(ECS::World& world, f32 dt); + +} // namespace Caffeine::Animation diff --git a/src/assets/MaterialFile.cpp b/src/assets/MaterialFile.cpp index 67dd6262..77994967 100644 --- a/src/assets/MaterialFile.cpp +++ b/src/assets/MaterialFile.cpp @@ -1,6 +1,7 @@ #include "assets/MaterialFile.hpp" #include +#include #include #include @@ -42,6 +43,7 @@ bool loadMaterialFile(const std::filesystem::path& path, MaterialSurface& out) { if (header != "CAFMAT3" && header != "CAFMAT2" && header != "CAFMAT1") return false; MaterialSurface surface; + bool sawReflectionModules = false; std::string line; while (std::getline(in, line)) { if (line.empty()) continue; @@ -102,6 +104,52 @@ bool loadMaterialFile(const std::filesystem::path& path, MaterialSurface& out) { ss >> surface.iridescenceThickness; } else if (tag == "iridescence_ior") { ss >> surface.iridescenceIor; + } else if (tag == "reflection") { + ss >> surface.reflection; + } else if (tag == "reflection_budget") { + u32 budget = 0; + ss >> budget; + surface.reflectionBudget = static_cast(budget); + } else if (tag == "reflection_performance") { + u32 flag = 0; + ss >> flag; + surface.reflectionPerformance = static_cast(flag); + sawReflectionModules = true; + } else if (tag == "reflection_quality") { + u32 flag = 0; + ss >> flag; + surface.reflectionQuality = static_cast(flag); + sawReflectionModules = true; + } else if (tag == "reflection_planar") { + u32 flag = 0; + ss >> flag; + surface.reflectionPlanar = static_cast(flag); + } else if (tag == "ssr_resolution") { + ss >> surface.ssrResolution; + } else if (tag == "ssr_max_steps") { + ss >> surface.ssrMaxSteps; + } else if (tag == "ssr_temporal") { + ss >> surface.ssrTemporalFrames; + } else if (tag == "ssr_distance") { + ss >> surface.ssrDistance; + } else if (tag == "ssr_samples") { + ss >> surface.ssrSamples; + } else if (tag == "ssr_denoise") { + ss >> surface.ssrDenoise; + } else if (tag == "ssr_probe_blend") { + ss >> surface.ssrProbeBlend; + } else if (tag == "ssr_bounces") { + ss >> surface.ssrBounces; + } + } + + if (!sawReflectionModules) { + if (surface.reflectionBudget == 1) surface.reflectionPerformance = 1; + else if (surface.reflectionBudget == 2) { + surface.reflectionPerformance = 1; + surface.reflectionQuality = 1; + } else if (surface.reflectionBudget >= 3) { + surface.reflectionQuality = 1; } } @@ -130,9 +178,24 @@ void sanitizeMaterialSurface(MaterialSurface& surface) { surface.iridescence = clamp01(surface.iridescence); surface.iridescenceThickness = std::clamp(surface.iridescenceThickness, 50.0f, 1500.0f); surface.iridescenceIor = std::clamp(surface.iridescenceIor, 1.0f, 2.5f); + surface.reflection = clamp01(surface.reflection); + surface.reflectionBudget = static_cast(std::min(surface.reflectionBudget, 3u)); + surface.reflectionPerformance = surface.reflectionPerformance ? 1 : 0; + surface.reflectionQuality = surface.reflectionQuality ? 1 : 0; + surface.reflectionPlanar = surface.reflectionPlanar ? 1 : 0; + surface.ssrResolution = std::clamp(surface.ssrResolution, 0.25f, 1.0f); + surface.ssrMaxSteps = std::clamp(surface.ssrMaxSteps, 4.0f, 64.0f); + surface.ssrTemporalFrames = std::clamp(surface.ssrTemporalFrames, 1.0f, 8.0f); + surface.ssrDistance = std::clamp(surface.ssrDistance, 1.0f, 80.0f); + surface.ssrSamples = std::clamp(surface.ssrSamples, 4.0f, 64.0f); + surface.ssrDenoise = clamp01(surface.ssrDenoise); + surface.ssrProbeBlend = std::clamp(surface.ssrProbeBlend, 1.0f, 8.0f); + surface.ssrBounces = std::clamp(surface.ssrBounces, 0.0f, 2.0f); } bool saveMaterialFile(const std::filesystem::path& path, const MaterialSurface& material) { + std::error_code ec; + if (path.has_parent_path()) std::filesystem::create_directories(path.parent_path(), ec); std::ofstream out(path); if (!out.is_open()) return false; out << "CAFMAT3\n"; @@ -164,6 +227,19 @@ bool saveMaterialFile(const std::filesystem::path& path, const MaterialSurface& out << "iridescence " << material.iridescence << '\n'; out << "iridescence_thickness " << material.iridescenceThickness << '\n'; out << "iridescence_ior " << material.iridescenceIor << '\n'; + out << "reflection " << material.reflection << '\n'; + out << "reflection_budget " << static_cast(material.reflectionBudget) << '\n'; + out << "reflection_performance " << static_cast(material.reflectionPerformance) << '\n'; + out << "reflection_quality " << static_cast(material.reflectionQuality) << '\n'; + out << "reflection_planar " << static_cast(material.reflectionPlanar) << '\n'; + out << "ssr_resolution " << material.ssrResolution << '\n'; + out << "ssr_max_steps " << material.ssrMaxSteps << '\n'; + out << "ssr_temporal " << material.ssrTemporalFrames << '\n'; + out << "ssr_distance " << material.ssrDistance << '\n'; + out << "ssr_samples " << material.ssrSamples << '\n'; + out << "ssr_denoise " << material.ssrDenoise << '\n'; + out << "ssr_probe_blend " << material.ssrProbeBlend << '\n'; + out << "ssr_bounces " << material.ssrBounces << '\n'; return static_cast(out); } diff --git a/src/assets/MaterialTypes.hpp b/src/assets/MaterialTypes.hpp index 3071a1da..eb314fde 100644 --- a/src/assets/MaterialTypes.hpp +++ b/src/assets/MaterialTypes.hpp @@ -53,6 +53,22 @@ struct MaterialSurface { f32 iridescenceThickness = 400.0f; f32 iridescenceIor = 1.3f; + /// How strongly this surface asks for reflections. 0 leaves the base roughness in charge. + f32 reflection = 0.0f; + /// 0 inherit, 1 performance, 2 both, 3 quality. Kept so older .mat files still select a module. + u8 reflectionBudget = 0; + u8 reflectionPerformance = 0; + u8 reflectionQuality = 0; + u8 reflectionPlanar = 0; + f32 ssrResolution = 0.5f; + f32 ssrMaxSteps = 32.0f; + f32 ssrTemporalFrames = 4.0f; + f32 ssrDistance = 15.0f; + f32 ssrSamples = 64.0f; + f32 ssrDenoise = 0.7f; + f32 ssrProbeBlend = 8.0f; + f32 ssrBounces = 1.0f; + bool valid = false; }; diff --git a/src/assets/MeshLoader.cpp b/src/assets/MeshLoader.cpp index 28e6a1aa..e267b12e 100644 --- a/src/assets/MeshLoader.cpp +++ b/src/assets/MeshLoader.cpp @@ -1,6 +1,9 @@ #include "assets/MeshLoader.hpp" #include "assets/MeshLOD.hpp" #include "assets/MeshNormals.hpp" +#include "animation/SkinLibrary.hpp" +#include "math/Mat4.hpp" +#include "math/Quat.hpp" #define TINYGLTF_IMPLEMENTATION #define TINYGLTF_NO_STB_IMAGE_WRITE @@ -8,9 +11,10 @@ #include -#include -#include #include +#include +#include +#include namespace Caffeine::Assets { using namespace Caffeine; @@ -68,6 +72,263 @@ bool extractBaseColorTexture(const tinygltf::Model& model, int materialIndex, Me return assignImageToMesh(model.images[imageIndex], mesh); } +const u8* accessorBytes(const tinygltf::Model& model, int accessorIndex, size_t& stride, size_t& count) { + if (accessorIndex < 0 || accessorIndex >= static_cast(model.accessors.size())) return nullptr; + const tinygltf::Accessor& accessor = model.accessors[accessorIndex]; + if (accessor.bufferView < 0 || accessor.bufferView >= static_cast(model.bufferViews.size())) { + return nullptr; + } + const tinygltf::BufferView& view = model.bufferViews[accessor.bufferView]; + if (view.buffer < 0 || view.buffer >= static_cast(model.buffers.size())) return nullptr; + const int components = tinygltf::GetNumComponentsInType(accessor.type); + const int componentSize = tinygltf::GetComponentSizeInBytes(accessor.componentType); + stride = view.byteStride != 0 ? static_cast(view.byteStride) + : static_cast(components * componentSize); + count = static_cast(accessor.count); + return model.buffers[view.buffer].data.data() + view.byteOffset + accessor.byteOffset; +} + +bool invertMat4(const Mat4& input, Mat4& output) { + f32 row[4][8] = {}; + for (int r = 0; r < 4; ++r) { + for (int c = 0; c < 4; ++c) row[r][c] = input(static_cast(r), static_cast(c)); + row[r][r + 4] = 1.0f; + } + for (int col = 0; col < 4; ++col) { + int pivot = col; + for (int r = col + 1; r < 4; ++r) { + if (std::fabs(row[r][col]) > std::fabs(row[pivot][col])) pivot = r; + } + if (std::fabs(row[pivot][col]) < 1.0e-8f) return false; + if (pivot != col) { + for (int c = 0; c < 8; ++c) std::swap(row[col][c], row[pivot][c]); + } + const f32 scale = row[col][col]; + for (int c = 0; c < 8; ++c) row[col][c] /= scale; + for (int r = 0; r < 4; ++r) { + if (r == col) continue; + const f32 factor = row[r][col]; + for (int c = 0; c < 8; ++c) row[r][c] -= factor * row[col][c]; + } + } + for (int r = 0; r < 4; ++r) { + for (int c = 0; c < 4; ++c) output(static_cast(r), static_cast(c)) = row[r][c + 4]; + } + return true; +} + +Mat4 gltfNodeLocal(const tinygltf::Node& node) { + if (node.matrix.size() == 16) { + Mat4 matrix; + for (int i = 0; i < 16; ++i) matrix.data()[i] = static_cast(node.matrix[static_cast(i)]); + return matrix; + } + Vec3 translation; + Quat rotation = Quat::identity(); + Vec3 scale(1.0f, 1.0f, 1.0f); + if (node.translation.size() == 3) { + translation = Vec3(static_cast(node.translation[0]), static_cast(node.translation[1]), + static_cast(node.translation[2])); + } + if (node.rotation.size() == 4) { + rotation = Quat(static_cast(node.rotation[0]), static_cast(node.rotation[1]), + static_cast(node.rotation[2]), static_cast(node.rotation[3])); + } + if (node.scale.size() == 3) { + scale = Vec3(static_cast(node.scale[0]), static_cast(node.scale[1]), + static_cast(node.scale[2])); + } + return Mat4::translation(translation.x, translation.y, translation.z) * rotation.toMatrix() * + Mat4::scale(scale.x, scale.y, scale.z); +} + +void importGltfSkin(const tinygltf::Model& model, const std::string& path, Mesh3D* mesh) { + if (!mesh || model.skins.empty() || model.nodes.empty()) return; + const tinygltf::Skin& skin = model.skins[0]; + if (skin.joints.empty()) return; + + std::vector parent(model.nodes.size(), -1); + for (size_t nodeIndex = 0; nodeIndex < model.nodes.size(); ++nodeIndex) { + for (int child : model.nodes[nodeIndex].children) { + if (child >= 0 && child < static_cast(parent.size())) parent[static_cast(child)] = static_cast(nodeIndex); + } + } + std::vector boneOfNode(model.nodes.size(), -1); + Animation::ImportedSkin imported; + imported.skeleton.bones.resize(skin.joints.size()); + imported.boneNames.resize(skin.joints.size()); + for (size_t joint = 0; joint < skin.joints.size(); ++joint) { + const int nodeIndex = skin.joints[joint]; + if (nodeIndex < 0 || nodeIndex >= static_cast(model.nodes.size())) continue; + boneOfNode[static_cast(nodeIndex)] = static_cast(joint); + const tinygltf::Node& node = model.nodes[nodeIndex]; + imported.boneNames[joint] = node.name.empty() ? ("bone_" + std::to_string(joint)) : node.name; + imported.skeleton.bones[joint].name = imported.boneNames[joint].c_str(); + imported.skeleton.bones[joint].localTransform = gltfNodeLocal(node); + imported.skeleton.bones[joint].bindPoseInverse = Mat4::identity(); + } + for (size_t joint = 0; joint < skin.joints.size(); ++joint) { + int cursor = parent[static_cast(skin.joints[joint])]; + int parentBone = -1; + while (cursor >= 0) { + if (boneOfNode[static_cast(cursor)] >= 0) { + parentBone = boneOfNode[static_cast(cursor)]; + break; + } + cursor = parent[static_cast(cursor)]; + } + imported.skeleton.bones[joint].parentIndex = parentBone; + } + + std::vector nodeWorld(model.nodes.size(), Mat4::identity()); + std::vector visited(model.nodes.size(), 0); + const auto walkNode = [&](auto&& self, int index, const Mat4& parentWorld) -> void { + if (index < 0 || index >= static_cast(model.nodes.size()) || visited[static_cast(index)]) return; + visited[static_cast(index)] = 1; + nodeWorld[static_cast(index)] = parentWorld * gltfNodeLocal(model.nodes[static_cast(index)]); + for (int child : model.nodes[static_cast(index)].children) self(self, child, nodeWorld[static_cast(index)]); + }; + for (size_t nodeIndex = 0; nodeIndex < model.nodes.size(); ++nodeIndex) { + if (parent[nodeIndex] < 0) walkNode(walkNode, static_cast(nodeIndex), Mat4::identity()); + } + for (size_t nodeIndex = 0; nodeIndex < model.nodes.size(); ++nodeIndex) { + if (model.nodes[nodeIndex].skin != 0) continue; + Mat4 inverse; + if (invertMat4(nodeWorld[nodeIndex], inverse)) imported.skeleton.skinSpace = inverse; + break; + } + + size_t stride = 0; + size_t count = 0; + if (const u8* bytes = accessorBytes(model, skin.inverseBindMatrices, stride, count)) { + const size_t joints = std::min(count, imported.skeleton.bones.size()); + for (size_t joint = 0; joint < joints; ++joint) { + Mat4 inverse; + std::memcpy(inverse.data(), bytes + joint * stride, sizeof(f32) * 16); + imported.skeleton.bones[joint].bindPoseInverse = inverse; + } + } + + mesh->skin.assign(mesh->vertices.size(), {}); + u32 vertexCursor = 0; + for (const tinygltf::Mesh& gltfMesh : model.meshes) { + for (const tinygltf::Primitive& primitive : gltfMesh.primitives) { + const auto position = primitive.attributes.find("POSITION"); + if (position == primitive.attributes.end()) continue; + const u32 vertexCount = static_cast(model.accessors[position->second].count); + const auto joints = primitive.attributes.find("JOINTS_0"); + const auto weights = primitive.attributes.find("WEIGHTS_0"); + size_t jointStride = 0; + size_t jointCount = 0; + size_t weightStride = 0; + size_t weightCount = 0; + const u8* jointBytes = joints == primitive.attributes.end() + ? nullptr + : accessorBytes(model, joints->second, jointStride, jointCount); + const u8* weightBytes = weights == primitive.attributes.end() + ? nullptr + : accessorBytes(model, weights->second, weightStride, weightCount); + const int jointType = jointBytes ? model.accessors[joints->second].componentType : 0; + for (u32 vertex = 0; vertex < vertexCount; ++vertex) { + const size_t index = static_cast(vertexCursor) + vertex; + if (index >= mesh->skin.size()) break; + VertexSkin influence; + if (jointBytes && vertex < jointCount) { + for (int channel = 0; channel < 4; ++channel) { + u16 jointIndex = 0; + if (jointType == TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT) { + std::memcpy(&jointIndex, jointBytes + vertex * jointStride + channel * sizeof(u16), sizeof(u16)); + } else { + jointIndex = jointBytes[vertex * jointStride + static_cast(channel)]; + } + influence.joints[channel] = jointIndex; + } + } + if (weightBytes && vertex < weightCount) { + std::memcpy(influence.weights, weightBytes + vertex * weightStride, sizeof(f32) * 4); + } + mesh->skin[index] = influence; + } + vertexCursor += vertexCount; + } + } + + for (const tinygltf::Animation& animation : model.animations) { + Animation::SkeletalClip clip; + clip.name = animation.name.empty() ? "Clip" : animation.name.c_str(); + clip.loop = true; + f32 duration = 0.0f; + for (const tinygltf::AnimationChannel& channel : animation.channels) { + if (channel.target_node < 0 || channel.target_node >= static_cast(boneOfNode.size())) continue; + const int bone = boneOfNode[static_cast(channel.target_node)]; + if (bone < 0 || channel.sampler < 0 || channel.sampler >= static_cast(animation.samplers.size())) { + continue; + } + const tinygltf::AnimationSampler& sampler = animation.samplers[channel.sampler]; + size_t timeStride = 0; + size_t timeCount = 0; + size_t valueStride = 0; + size_t valueCount = 0; + const u8* times = accessorBytes(model, sampler.input, timeStride, timeCount); + const u8* values = accessorBytes(model, sampler.output, valueStride, valueCount); + if (!times || !values || timeCount == 0) continue; + const bool cubic = sampler.interpolation == "CUBICSPLINE"; + const int valuesPerKey = cubic ? 3 : 1; + if (valueCount < timeCount * static_cast(valuesPerKey)) continue; + if (channel.target_path != "translation" && channel.target_path != "rotation" && + channel.target_path != "scale") { + continue; + } + const int components = channel.target_path == "rotation" ? 4 : 3; + const Mat4& rest = imported.skeleton.bones[static_cast(bone)].localTransform; + const Vec3 restPosition(rest(0, 3), rest(1, 3), rest(2, 3)); + const Vec3 restScale(Vec3(rest(0, 0), rest(1, 0), rest(2, 0)).length(), + Vec3(rest(0, 1), rest(1, 1), rest(2, 1)).length(), + Vec3(rest(0, 2), rest(1, 2), rest(2, 2)).length()); + const Quat restRotation = Quat::fromMatrix(rest); + std::vector keys(timeCount); + for (size_t key = 0; key < timeCount; ++key) { + f32 time = 0.0f; + std::memcpy(&time, times + key * timeStride, sizeof(f32)); + keys[key].time = time; + keys[key].position = restPosition; + keys[key].rotation = restRotation; + keys[key].scale = restScale; + duration = std::max(duration, time); + const u8* value = values + (key * static_cast(valuesPerKey) + (cubic ? 1 : 0)) * valueStride; + f32 raw[4] = {0, 0, 0, 1}; + std::memcpy(raw, value, sizeof(f32) * static_cast(components)); + if (channel.target_path == "translation") keys[key].position = Vec3(raw[0], raw[1], raw[2]); + else if (channel.target_path == "scale") keys[key].scale = Vec3(raw[0], raw[1], raw[2]); + else keys[key].rotation = Quat(raw[0], raw[1], raw[2], raw[3]); + } + const std::vector* existing = clip.channels.get(static_cast(bone)); + std::vector merged = existing ? *existing : std::vector{}; + if (merged.empty()) { + merged = keys; + } else { + for (size_t key = 0; key < keys.size() && key < merged.size(); ++key) { + if (channel.target_path == "translation") merged[key].position = keys[key].position; + else if (channel.target_path == "scale") merged[key].scale = keys[key].scale; + else if (channel.target_path == "rotation") merged[key].rotation = keys[key].rotation; + } + if (keys.size() > merged.size()) { + for (size_t key = merged.size(); key < keys.size(); ++key) merged.push_back(keys[key]); + } + } + (void)rest; + clip.channels.set(static_cast(bone), merged); + } + if (clip.channels.size() == 0) continue; + clip.duration = duration; + imported.clipNames.push_back(animation.name.empty() ? "Clip" : animation.name); + imported.clips.push_back(std::move(clip)); + } + + imported.mesh = mesh; + Animation::registerImportedSkin(path, std::move(imported)); +} + } // namespace Mesh3D* MeshLoader::parseGLTF(const u8* data, usize dataLen, const char* filename, @@ -276,6 +537,7 @@ Mesh3D* MeshLoader::parseGLTF(const u8* data, usize dataLen, const char* filenam mesh->vertices = vertices; mesh->indices = indices; + importGltfSkin(model, filenameStr, mesh); if (mesh->subMeshes.empty()) { SubMesh submesh; diff --git a/src/assets/MeshMaterialExport.cpp b/src/assets/MeshMaterialExport.cpp new file mode 100644 index 00000000..076488fe --- /dev/null +++ b/src/assets/MeshMaterialExport.cpp @@ -0,0 +1,72 @@ +#include "assets/MeshMaterialExport.hpp" + +#include "assets/MaterialFile.hpp" + +#include + +namespace Caffeine::Assets { +namespace { + +std::string sanitizeStem(std::string name) { + if (name.empty()) name = "Material"; + for (char& c : name) { + const unsigned char uc = static_cast(c); + if (std::isalnum(uc) || c == '_' || c == '-') continue; + c = '_'; + } + return name; +} + +std::string relativeToProject(const std::filesystem::path& projectRoot, + const std::filesystem::path& absolute) { + if (projectRoot.empty()) return absolute.generic_string(); + std::error_code ec; + const auto rel = std::filesystem::relative(absolute, projectRoot, ec); + if (ec || rel.empty()) return absolute.generic_string(); + return rel.generic_string(); +} + +std::string relativeTexture(const std::filesystem::path& projectRoot, const std::string& path) { + if (path.empty()) return {}; + std::filesystem::path file(path); + if (!file.is_absolute() || projectRoot.empty()) return file.generic_string(); + return relativeToProject(projectRoot, file); +} + +} // namespace + +std::vector exportMeshMaterials(const Mesh3D& mesh, + const std::filesystem::path& meshFile, + const std::filesystem::path& projectRoot, + bool overwrite) { + std::vector written; + if (mesh.materials.empty() || meshFile.empty()) return written; + + const std::filesystem::path dir = meshFile.parent_path().empty() + ? std::filesystem::path(".") + : meshFile.parent_path(); + const std::string stem = sanitizeStem(meshFile.stem().string()); + + for (size_t i = 0; i < mesh.materials.size(); ++i) { + const MeshSurfaceMaterial& src = mesh.materials[i]; + MaterialSurface surface; + surface.valid = true; + surface.name = mesh.materials.size() == 1 ? stem : stem + "_" + std::to_string(i); + surface.albedo = Vec4(src.albedoColor.r, src.albedoColor.g, src.albedoColor.b, src.albedoColor.a); + surface.metallic = src.metallic; + surface.roughness = src.roughness; + surface.albedoMap = relativeTexture(projectRoot, src.albedoPath); + + const std::string fileStem = + mesh.materials.size() == 1 ? stem : stem + "_" + std::to_string(i); + const std::filesystem::path out = dir / (fileStem + ".mat"); + std::error_code ec; + if (overwrite || !std::filesystem::exists(out, ec)) { + if (!saveMaterialFile(out, surface)) continue; + } + written.push_back(relativeToProject(projectRoot, out)); + } + return written; +} + +} // namespace Caffeine::Assets diff --git a/src/assets/MeshMaterialExport.hpp b/src/assets/MeshMaterialExport.hpp new file mode 100644 index 00000000..aab32d03 --- /dev/null +++ b/src/assets/MeshMaterialExport.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "assets/MeshTypes.hpp" + +#include +#include +#include + +namespace Caffeine::Assets { + +/// Writes one `.mat` per glTF/OBJ surface next to `meshFile`. +/// Existing files are kept unless `overwrite` is set. Returned paths are project-relative +/// when `projectRoot` is set. +std::vector exportMeshMaterials(const Mesh3D& mesh, + const std::filesystem::path& meshFile, + const std::filesystem::path& projectRoot, + bool overwrite = false); + +} // namespace Caffeine::Assets diff --git a/src/assets/MeshTypes.hpp b/src/assets/MeshTypes.hpp index 6d91fd45..c3ee8d4d 100644 --- a/src/assets/MeshTypes.hpp +++ b/src/assets/MeshTypes.hpp @@ -40,6 +40,12 @@ struct Vertex3D { Vec4 tangent; }; +/// Up to four influences. Parallel to Mesh3D::vertices when the mesh is skinned. +struct VertexSkin { + u16 joints[4] = {0, 0, 0, 0}; + f32 weights[4] = {0.0f, 0.0f, 0.0f, 0.0f}; +}; + struct SubMesh { u32 indexOffset = 0; u32 indexCount = 0; @@ -62,6 +68,7 @@ struct MeshSurfaceMaterial { struct Mesh3D { std::vector vertices; + std::vector skin; std::vector indices; std::vector subMeshes; std::vector materials; diff --git a/src/editor/AnimationTimeline.cpp b/src/editor/AnimationTimeline.cpp index a7cbcec1..2e4c149e 100644 --- a/src/editor/AnimationTimeline.cpp +++ b/src/editor/AnimationTimeline.cpp @@ -1,4 +1,6 @@ #include "editor/AnimationTimeline.hpp" +#include "animation/ClipAsset.hpp" +#include "animation/SkinLibrary.hpp" #include "debug/LogSystem.hpp" #include #include @@ -117,10 +119,63 @@ void AnimationTimelinePanel::moveSelectedKeyframe(f32 newTime) { } } +void AnimationTimelinePanel::adoptMotion() { + m_ownedClip = {}; + m_ownedClip.name = m_motion.name.c_str(); + m_ownedClip.fps = m_motion.fps == 0 ? 12 : m_motion.fps; + m_ownedClip.loop = m_motion.loop; + m_ownedClip.frames.clear(); + for (const Animation::SpriteFrameKey& key : m_motion.spriteFrames) { + Animation::FrameRect rect; + rect.x = key.x; + rect.y = key.y; + rect.w = key.w; + rect.h = key.h; + m_ownedClip.frames.push_back(rect); + } + if (m_ownedClip.frames.empty()) m_ownedClip.frames.push_back({}); + setClip(&m_ownedClip); +} + +void AnimationTimelinePanel::newClip() { + m_motion = {}; + m_motion.name = "Clip"; + m_motion.fps = 12; + m_motion.loop = true; + m_motion.duration = 1.0f; + m_motion.spriteFrames.push_back({0.0f, 0, 0, 0, 32, 32}); + m_motion.spriteFrames.push_back({0.5f, 1, 32, 0, 32, 32}); + adoptMotion(); +} + +void AnimationTimelinePanel::loadClipFile(const std::filesystem::path& path) { + if (!Animation::loadMotionClip(path, m_motion)) return; + adoptMotion(); +} + +void AnimationTimelinePanel::saveClipFile(const std::filesystem::path& path) { + m_motion.name = m_ownedClip.name.cStr(); + m_motion.loop = m_ownedClip.loop; + m_motion.fps = m_ownedClip.fps; + m_motion.duration = m_ownedClip.duration(); + if (m_motion.spriteFrames.size() != m_ownedClip.frames.size()) { + m_motion.spriteFrames.clear(); + const f32 step = m_ownedClip.fps > 0 ? 1.0f / static_cast(m_ownedClip.fps) : 0.1f; + for (size_t i = 0; i < m_ownedClip.frames.size(); ++i) { + const Animation::FrameRect& rect = m_ownedClip.frames[i]; + m_motion.spriteFrames.push_back( + {step * static_cast(i), static_cast(i), rect.x, rect.y, rect.w, rect.h}); + } + } + Animation::saveMotionClip(path, m_motion); +} + } #ifdef CF_HAS_IMGUI +#include "editor/FilePicker.hpp" + namespace Caffeine::Editor { static constexpr f32 k_TrackLabelWidth = 110.0f; @@ -141,14 +196,32 @@ static const ImU32 k_ColKeyframeSel = IM_COL32(255,255, 130, 255); static const ImU32 k_ColKeyframeHover = IM_COL32(255,240, 120, 255); static const ImU32 k_ColProgress = IM_COL32(60, 100, 220, 180); +void AnimationTimelinePanel::setScene(ECS::World* world, u32 selectedEntity) { + m_scene = world; + m_selectedEntity = selectedEntity; +} + void AnimationTimelinePanel::render(f32 deltaTime) { if (!m_open) return; - if (m_isPlaying && m_clip) { + f32 drivenDuration = m_clip ? m_clip->duration() : 0.0f; + bool drivenLoop = m_looping; + if (m_scene) { + ECS::Entity selected(m_selectedEntity, m_scene); + if (const Animation::SkinnedPose* pose = m_scene->get(selected)) { + if (const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath)) { + if (pose->clipIndex >= 0 && pose->clipIndex < static_cast(skin->clips.size())) { + drivenDuration = std::max(drivenDuration, skin->clips[static_cast(pose->clipIndex)].duration); + } + } + drivenLoop = drivenLoop || pose->loop; + } + } + if (m_isPlaying && drivenDuration > 0.0f) { m_currentTime += deltaTime; - if (m_currentTime >= m_clip->duration()) { - if (m_looping) m_currentTime = 0.0f; - else m_isPlaying = false; + if (m_currentTime >= drivenDuration) { + if (drivenLoop) m_currentTime = 0.0f; + else m_isPlaying = false; } } @@ -156,7 +229,58 @@ void AnimationTimelinePanel::render(f32 deltaTime) { if (ImGui::Begin("Animation Timeline", &m_open)) { renderHeader(); ImGui::Separator(); + if (m_scene) { + ECS::Entity selected(m_selectedEntity, m_scene); + if (Animation::SkinnedPose* pose = m_scene->get(selected)) { + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + ImGui::TextUnformatted(pose->humanoid.matched ? "3D humanoide" : "3D skeletal"); + if (skin && !skin->clipNames.empty()) { + const int index = std::clamp(pose->clipIndex, 0, static_cast(skin->clipNames.size()) - 1); + if (ImGui::BeginCombo("Bone Clip", skin->clipNames[static_cast(index)].c_str())) { + for (int i = 0; i < static_cast(skin->clipNames.size()); ++i) { + if (ImGui::Selectable(skin->clipNames[static_cast(i)].c_str(), i == index)) { + pose->clipIndex = i; + pose->time = 0.0f; + pose->playing = true; + } + } + ImGui::EndCombo(); + } + if (m_isPlaying) { + pose->playing = false; + pose->time = m_currentTime; + pose->loop = drivenLoop; + } + } + if (skin) { + const int shown = std::min(static_cast(skin->boneNames.size()), 12); + for (int i = 0; i < shown; ++i) { + ImGui::BulletText("%s", skin->boneNames[static_cast(i)].c_str()); + } + if (static_cast(skin->boneNames.size()) > shown) { + ImGui::TextDisabled("%d ossos", static_cast(skin->boneNames.size())); + } + } + ImGui::Separator(); + } + } renderTimeline(); + if (m_pendingLoad) { + if (auto selected = FilePicker::pickPath(FilePicker::Mode::PickFile, "Load Animation", {})) { + loadClipFile(*selected); + m_pendingLoad = false; + } else if (FilePicker::consumeCloseEvent("Load Animation")) { + m_pendingLoad = false; + } + } + if (m_pendingSave) { + if (auto selected = FilePicker::pickPath(FilePicker::Mode::SaveFile, "Save Animation", {})) { + saveClipFile(*selected); + m_pendingSave = false; + } else if (FilePicker::consumeCloseEvent("Save Animation")) { + m_pendingSave = false; + } + } } ImGui::End(); } @@ -186,6 +310,16 @@ void AnimationTimelinePanel::renderHeader() { if (m_clip) m_clip->loop = m_looping; ImGui::SameLine(); ImGui::Checkbox("Onion Skin", &m_onionSkinningEnabled); + ImGui::SameLine(); + if (ImGui::SmallButton("New Clip")) newClip(); + ImGui::SameLine(); + if (ImGui::SmallButton("Load .anim")) m_pendingLoad = true; + ImGui::SameLine(); + if (ImGui::SmallButton("Save .anim")) m_pendingSave = true; + if (!m_motion.positions.empty()) { + ImGui::SameLine(); + ImGui::TextDisabled("pos keys %zu", m_motion.positions.size()); + } if (m_clip) { ImGui::SameLine(0, 16.0f); diff --git a/src/editor/AnimationTimeline.hpp b/src/editor/AnimationTimeline.hpp index e7a706da..c72034cf 100644 --- a/src/editor/AnimationTimeline.hpp +++ b/src/editor/AnimationTimeline.hpp @@ -1,10 +1,13 @@ #pragma once +#include "animation/ClipAsset.hpp" +#include "ecs/World.hpp" #include "core/Types.hpp" #include "math/Vec3.hpp" #include "animation/AnimationComponents.hpp" #include "containers/FixedString.hpp" #include #include +#include #include #include #include @@ -97,7 +100,13 @@ class AnimationTimelinePanel { void close() { m_open = false; } void open() { m_open = true; } + void setScene(ECS::World* world, u32 selectedEntity); + void newClip(); + void loadClipFile(const std::filesystem::path& path); + void saveClipFile(const std::filesystem::path& path); + private: + void adoptMotion(); void addKeyframeToSelectedTrack(f32 time, const std::variant>& value); void deleteSelectedKeyframe(); void moveSelectedKeyframe(f32 newTime); @@ -105,7 +114,13 @@ class AnimationTimelinePanel { std::variant> interpolateValue(AnimationTrack* track, f32 time) const; f32 applyEasing(f32 t, EasingType easing) const; + ECS::World* m_scene = nullptr; + u32 m_selectedEntity = 0xFFFFFFFFu; Animation::AnimationClip* m_clip = nullptr; + Animation::MotionClip m_motion; + Animation::AnimationClip m_ownedClip; + bool m_pendingLoad = false; + bool m_pendingSave = false; std::vector> m_tracks; f32 m_currentTime = 0.0f; diff --git a/src/editor/AssetBrowser.cpp b/src/editor/AssetBrowser.cpp index 6a8e1057..e8a9581f 100644 --- a/src/editor/AssetBrowser.cpp +++ b/src/editor/AssetBrowser.cpp @@ -8,6 +8,8 @@ #include "core/io/CafTypes.hpp" #include "assets/TextureCompiler.hpp" #include "assets/MeshImportValidator.hpp" +#include "assets/MaterialFile.hpp" +#include "scene/EnvironmentSystem.hpp" #ifdef CF_HAS_CAF_PACK #include "caf-pack/Packer.hpp" #include "caf-pack/HeaderGenerator.hpp" @@ -15,6 +17,8 @@ #include "stb/stb_image.h" #include +#include +#include #include #include @@ -101,6 +105,25 @@ void AssetBrowser::shutdownGpu() { #endif } +#ifdef CF_HAS_SDL3 +void AssetBrowser::initGpu(RHI::RenderDevice* device) { +#ifdef CF_HAS_IMGUI + m_previewRenderer.initGpu(device); +#else + (void)device; +#endif +} + +void AssetBrowser::setFrameCommandBuffer(RHI::CommandBuffer* cmd) { +#ifdef CF_HAS_IMGUI + m_frameCmd = cmd; + m_previewRenderer.setFrameCommandBuffer(cmd); +#else + (void)cmd; +#endif +} +#endif + void AssetBrowser::refresh() { if (m_browseMode == BrowseMode::CapFile) { loadCapFile(m_currentCapPath); @@ -521,6 +544,12 @@ std::string lowerExtension(const std::filesystem::path& path) { return ext; } +bool isBrowserImage(const std::filesystem::path& path) { + const std::string ext = lowerExtension(path); + return ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".bmp" || ext == ".tga" || + ext == ".gif" || ext == ".webp"; +} + } // namespace const char* AssetBrowser::iconForType(AssetType type, const std::filesystem::path& path) { @@ -821,6 +850,8 @@ void AssetBrowser::renderGridView() { m_onScriptOpen(entry.path); } else if (entry.path.extension() == ".mat" && m_onMaterialOpen) { m_onMaterialOpen(entry.path); + } else if (isBrowserImage(entry.path) && m_editorContext) { + m_editorContext->imageToOpen = entry.path.string(); } } } @@ -855,8 +886,16 @@ void AssetBrowser::renderGridView() { ImGui::SetCursorPos(cursorPos); ImGui::BeginGroup(); - drawTypeIcon(entry.type, entry.path, entry.isDirectory, - static_cast(std::max(20, static_cast(m_thumbnailSize * 0.45f)))); + const float side = static_cast(std::max(24, static_cast(m_thumbnailSize))); + bool drewThumbnail = false; +#ifdef CF_HAS_SDL3 + if (!entry.isDirectory) { + drewThumbnail = m_previewRenderer.drawThumbnail(entry.path, entry.type, side); + } +#endif + if (!drewThumbnail) { + drawTypeIcon(entry.type, entry.path, entry.isDirectory, side * 0.72f); + } ImGui::TextWrapped("%s", entry.name.c_str()); if (entry.meshImportIncomplete) { ImGui::TextColored(ImVec4(1.0f, 0.55f, 0.2f, 1.0f), "[incompleto]"); @@ -900,6 +939,8 @@ void AssetBrowser::renderListView() { m_onScriptOpen(entry.path); } else if (entry.path.extension() == ".mat" && m_onMaterialOpen) { m_onMaterialOpen(entry.path); + } else if (isBrowserImage(entry.path) && m_editorContext) { + m_editorContext->imageToOpen = entry.path.string(); } } } @@ -1610,14 +1651,13 @@ void AssetBrowser::renderNamingPopup() { std::ofstream f(m_currentDir / (nameStr + ".prefab")); f << "{}"; } else if (m_pendingCreateType == 9) { - std::ofstream f(m_currentDir / (nameStr + ".mat")); - f << "CAFMAT2\n" - "name " << nameStr << "\n" - "albedo 1 1 1 1\n" - "metallic 0\n" - "roughness 0.5\n" - "emission 0 0 0\n" - "emission_strength 0\n"; + const std::filesystem::path matPath = m_currentDir / (nameStr + ".mat"); + Assets::MaterialSurface surface; + surface.valid = true; + surface.name = nameStr; + if (Assets::saveMaterialFile(matPath, surface) && m_onMaterialOpen) { + m_onMaterialOpen(matPath); + } } else if (m_pendingCreateType == 10) { std::error_code ec; std::filesystem::path newPath = m_currentDir / nameStr; @@ -1642,6 +1682,37 @@ void AssetBrowser::renderNamingPopup() { void AssetBrowser::render(ECS::World& world, [[maybe_unused]] EditorContext& ctx) { if (!m_open) return; m_world = &world; + m_editorContext = &ctx; + + if (!ctx.assetBrowserNavigateTo.empty()) { + const std::filesystem::path dir = ctx.assetBrowserNavigateTo; + ctx.assetBrowserNavigateTo.clear(); + ctx.assetBrowserDirty = false; + navigateTo(dir); + } else if (ctx.assetBrowserDirty) { + ctx.assetBrowserDirty = false; + refresh(); + } + +#ifdef CF_HAS_SDL3 + m_previewRenderer.setFrameCommandBuffer(m_frameCmd); + std::string environment = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string(); + f32 exposure = 1.0f; + if (ctx.activeWorld) { + const Scene::ActiveSkybox sky = Scene::findActiveSkybox(*ctx.activeWorld); + if (sky.component) { + environment = Scene::resolveSkyboxTexturePath(*sky.component, m_projectRoot.string()).string(); + exposure = sky.component->exposure; + } + } + m_previewRenderer.setEnvironment(std::move(environment), exposure); + std::vector> thumbnails; + thumbnails.reserve(m_filteredEntries.size()); + for (const Entry& entry : m_filteredEntries) { + if (!entry.isDirectory) thumbnails.emplace_back(entry.path, entry.type); + } + m_previewRenderer.prepareThumbnails(thumbnails, m_projectRoot.string()); +#endif if (ImGui::Begin("Asset Browser", &m_open)) { diff --git a/src/editor/AssetBrowser.hpp b/src/editor/AssetBrowser.hpp index 909bf80a..f392f199 100644 --- a/src/editor/AssetBrowser.hpp +++ b/src/editor/AssetBrowser.hpp @@ -6,6 +6,11 @@ #include "ecs/World.hpp" #include "editor/ProjectManager.hpp" +#ifdef CF_HAS_SDL3 +#include "rhi/CommandBuffer.hpp" +#include "rhi/RenderDevice.hpp" +#endif + #include #include #include @@ -86,6 +91,10 @@ class AssetBrowser { void init(const ProjectConfig& projectConfig); void refresh(); void shutdownGpu(); +#ifdef CF_HAS_SDL3 + void initGpu(RHI::RenderDevice* device); + void setFrameCommandBuffer(RHI::CommandBuffer* cmd); +#endif // Search void setSearchFilter(const char* filter); @@ -99,6 +108,7 @@ class AssetBrowser { void navigateToAssets(); void navigateToScenes(); void navigateToScripts(); + const std::filesystem::path& assetRoot() const { return m_rawRoot; } bool canGoBack() const; const std::filesystem::path& currentPath() const; @@ -160,6 +170,7 @@ class AssetBrowser { std::filesystem::path m_clipboardPath; bool m_clipboardIsCut = false; ECS::World* m_world = nullptr; + EditorContext* m_editorContext = nullptr; int m_renamingEntry = -1; char m_renameBuf[256] = {}; void renderAssetCreatorModal(); @@ -169,6 +180,9 @@ class AssetBrowser { bool m_statusIsError = false; AssetPreviewRenderer m_previewRenderer; std::string m_previewSourceKey; +#ifdef CF_HAS_SDL3 + RHI::CommandBuffer* m_frameCmd = nullptr; +#endif #endif private: diff --git a/src/editor/AssetPreviewRenderer.cpp b/src/editor/AssetPreviewRenderer.cpp index e6d3cb46..ed183cb7 100644 --- a/src/editor/AssetPreviewRenderer.cpp +++ b/src/editor/AssetPreviewRenderer.cpp @@ -1,6 +1,7 @@ #include "editor/AssetPreviewRenderer.hpp" #include "editor/EditorIcons.hpp" #include "editor/ImGuiGpuTexture.hpp" +#include "assets/MaterialFile.hpp" #include "assets/MeshCache.hpp" #include "assets/MeshImportValidator.hpp" #include "math/Vec3.hpp" @@ -31,14 +32,30 @@ Vec3 rotatePreviewPoint(const Vec3& p, f32 yaw, f32 pitch) { return Vec3(yRot.x, yRot.y * cp - yRot.z * sp, yRot.y * sp + yRot.z * cp); } -bool isImagePath(const std::filesystem::path& path) { +std::string lowerExtension(const std::filesystem::path& path) { std::string ext = path.extension().string(); std::transform(ext.begin(), ext.end(), ext.begin(), [](unsigned char c) { return static_cast(std::tolower(c)); }); + return ext; +} + +bool isImagePath(const std::filesystem::path& path) { + const std::string ext = lowerExtension(path); return ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".bmp" || ext == ".tga" || ext == ".webp" || ext == ".gif"; } +bool isMaterialPath(const std::filesystem::path& path) { + const std::string ext = lowerExtension(path); + return ext == ".mat" || ext == ".material"; +} + +bool isMeshPath(const std::filesystem::path& path, AssetType type) { + if (type == AssetType::Mesh) return true; + const std::string ext = lowerExtension(path); + return ext == ".obj" || ext == ".gltf" || ext == ".glb" || ext == ".fbx" || ext == ".dae"; +} + bool loadWavPeaks(const std::filesystem::path& path, std::vector>& peaks, float& durationSec) { std::ifstream file(path, std::ios::binary); @@ -124,6 +141,10 @@ bool loadWavPeaks(const std::filesystem::path& path, std::vectordestroyTexture(entry.second.texture); + } + } + m_gpuThumbs.clear(); + for (auto& entry : m_imageThumbs) { + destroyImGuiTexture(entry.second.texture); + } + m_imageThumbs.clear(); + m_thumbItems.clear(); + m_activeThumbKey.clear(); + m_device = nullptr; + m_frameCmd = nullptr; +#endif +} + +#ifdef CF_HAS_SDL3 + +namespace { + +constexpr u32 kThumbnailPixels = 128; + +void downsampleNearest(const u8* src, int sw, int sh, std::vector& dst, int& dw, int& dh) { + dw = sw; + dh = sh; + if (sw <= 160 && sh <= 160) return; + if (sw >= sh) { + dw = 128; + dh = std::max(1, sh * 128 / sw); + } else { + dh = 128; + dw = std::max(1, sw * 128 / sh); + } + dst.resize(static_cast(dw * dh * 4)); + for (int y = 0; y < dh; ++y) { + const int sy = std::min(sh - 1, y * sh / dh); + for (int x = 0; x < dw; ++x) { + const int sx = std::min(sw - 1, x * sw / dw); + const u8* p = src + (static_cast(sy) * sw + sx) * 4; + u8* o = dst.data() + (static_cast(y) * dw + x) * 4; + o[0] = p[0]; + o[1] = p[1]; + o[2] = p[2]; + o[3] = p[3]; + } + } +} + +} // namespace + +void AssetPreviewRenderer::initGpu(RHI::RenderDevice* device) { + shutdownGpu(); + m_device = device; + m_pane.setMaterialKeys("__caffeine_asset_preview__.mat", "__caffeine_asset_preview_floor__.mat"); + m_thumbs.setMaterialKeys("__caffeine_asset_thumb__.mat", "__caffeine_asset_thumb_floor__.mat"); + if (!device) return; + m_pane.init(device); + m_thumbs.init(device); +} + +void AssetPreviewRenderer::setEnvironment(std::string path, f32 exposure) { + m_envPath = std::move(path); + m_envExposure = exposure; } +Render::MaterialPreviewSettings AssetPreviewRenderer::previewSettings(u32 pixelSize) const { + Render::MaterialPreviewSettings settings; + settings.yawDegrees = 32.0f; + settings.pitchDegrees = 14.0f; + settings.showFloor = true; + settings.environmentPath = m_envPath; + settings.environmentExposure = m_envExposure; + settings.probeResolution = pixelSize >= 256 ? 128u : 64u; + return settings; +} + +bool AssetPreviewRenderer::drawGpuTexture(RHI::Texture* texture, ImVec2 size) { + if (!texture || !texture->handle || size.x < 1.0f || size.y < 1.0f) return false; + const float side = std::min(size.x, size.y); + const ImVec2 origin = ImGui::GetCursorScreenPos(); + const ImVec2 p0(origin.x + (size.x - side) * 0.5f, origin.y + (size.y - side) * 0.5f); + ImGui::GetWindowDrawList()->AddImage(reinterpret_cast(texture->handle), p0, + ImVec2(p0.x + side, p0.y + side)); + ImGui::Dummy(size); + return true; +} + +bool AssetPreviewRenderer::thumbnailReady(const std::string& key) const { + const auto image = m_imageThumbs.find(key); + if (image != m_imageThumbs.end() && image->second.ready) return true; + const auto gpu = m_gpuThumbs.find(key); + return gpu != m_gpuThumbs.end() && gpu->second.ready; +} + +void AssetPreviewRenderer::prepareThumbnails( + const std::vector>& items, const std::string& projectRoot) { + m_thumbItems = items; + if (!m_activeThumbKey.empty()) { + bool stillVisible = false; + for (const auto& item : m_thumbItems) { + if (item.first.string() == m_activeThumbKey) { + stillVisible = true; + break; + } + } + if (!stillVisible) m_activeThumbKey.clear(); + } + pumpThumbnail(projectRoot); +} + +void AssetPreviewRenderer::pumpThumbnail(const std::string& projectRoot) { + if (m_activeThumbKey.empty()) { + for (const auto& item : m_thumbItems) { + const bool image = isImagePath(item.first) || item.second == AssetType::Texture; + const bool mesh = isMeshPath(item.first, item.second); + const bool material = isMaterialPath(item.first); + if (!image && !mesh && !material) continue; + const std::string key = item.first.string(); + if (image) { + const auto it = m_imageThumbs.find(key); + if (it != m_imageThumbs.end() && (it->second.ready || it->second.failed)) continue; + } else { + const auto it = m_gpuThumbs.find(key); + if (it != m_gpuThumbs.end() && (it->second.ready || it->second.failed)) continue; + } + m_activeThumbKey = key; + m_activeThumbIsImage = image; + m_activeThumbIsMesh = mesh; + break; + } + } + if (m_activeThumbKey.empty()) return; + + if (m_activeThumbIsImage) { + ImageThumb& thumb = m_imageThumbs[m_activeThumbKey]; + if (!thumb.texture && !thumb.failed) { + int width = 0; + int height = 0; + int channels = 0; + u8* pixels = stbi_load(m_activeThumbKey.c_str(), &width, &height, &channels, 4); + if (!pixels || width <= 0 || height <= 0) { + thumb.failed = true; + if (pixels) stbi_image_free(pixels); + } else { + std::vector scaled; + int dw = width; + int dh = height; + downsampleNearest(pixels, width, height, scaled, dw, dh); + const u8* src = scaled.empty() ? pixels : scaled.data(); + thumb.texture = std::make_unique(); + thumb.texture->Create(ImTextureFormat_RGBA32, dw, dh); + std::memcpy(thumb.texture->GetPixels(), src, static_cast(dw * dh * 4)); + thumb.texture->SetStatus(ImTextureStatus_WantCreate); + thumb.width = dw; + thumb.height = dh; + stbi_image_free(pixels); + } + } + if (thumb.texture && thumb.texture->Status == ImTextureStatus_WantCreate) { + ImGui_ImplSDLGPU3_UpdateTexture(thumb.texture.get()); + } + if (thumb.failed || (thumb.texture && thumb.texture->Status == ImTextureStatus_OK)) { + thumb.ready = thumb.texture && thumb.texture->Status == ImTextureStatus_OK; + m_activeThumbKey.clear(); + } + return; + } + + if (!m_frameCmd || !m_thumbs.isReady() || !m_device) return; + + const auto settings = previewSettings(kThumbnailPixels); + bool rendered = false; + if (m_activeThumbIsMesh) { + rendered = m_thumbs.renderMesh(m_frameCmd, m_activeThumbKey, kThumbnailPixels, settings, projectRoot); + } else { + Assets::MaterialSurface surface; + if (Assets::loadMaterialFile(m_activeThumbKey, surface)) { + rendered = m_thumbs.render(m_frameCmd, surface, kThumbnailPixels, settings, projectRoot); + } + } + if (!rendered) { + m_gpuThumbs[m_activeThumbKey].failed = true; + m_activeThumbKey.clear(); + return; + } + + RHI::Texture* source = m_thumbs.colorTexture(); + GpuThumb& thumb = m_gpuThumbs[m_activeThumbKey]; + if (source && source->handle) { + if (!thumb.texture || thumb.texture->width != kThumbnailPixels) { + if (thumb.texture) m_device->destroyTexture(thumb.texture); + RHI::TextureDesc desc; + desc.width = kThumbnailPixels; + desc.height = kThumbnailPixels; + desc.format = RHI::TextureFormat::R8G8B8A8_UNORM; + desc.usage = RHI::TextureUsage::Sampler | RHI::TextureUsage::ColorTarget; + thumb.texture = m_device->createTexture(desc); + } + if (thumb.texture && thumb.texture->handle) { + m_frameCmd->copyTexture(source, thumb.texture, kThumbnailPixels, kThumbnailPixels); + thumb.ready = true; + } + } + if (!m_thumbs.wantsMoreFrames()) m_activeThumbKey.clear(); +} + +bool AssetPreviewRenderer::drawThumbnail(const std::filesystem::path& path, AssetType type, float size) { + if (size < 1.0f) return false; + const std::string key = path.string(); + if (isImagePath(path) || type == AssetType::Texture) { + const auto it = m_imageThumbs.find(key); + if (it == m_imageThumbs.end() || !it->second.texture) return false; + if (it->second.texture->Status == ImTextureStatus_WantCreate) { + ImGui_ImplSDLGPU3_UpdateTexture(it->second.texture.get()); + } + const ImTextureRef texRef = it->second.texture->GetTexRef(); + if (it->second.texture->Status != ImTextureStatus_OK || + (texRef._TexData == nullptr && texRef._TexID == ImTextureID_Invalid)) { + return false; + } + ImGui::Image(texRef, ImVec2(size, size)); + return true; + } + if (!isMaterialPath(path) && !isMeshPath(path, type)) return false; + const auto it = m_gpuThumbs.find(key); + if (it == m_gpuThumbs.end() || !it->second.ready || !it->second.texture || !it->second.texture->handle) { + return false; + } + ImGui::Image(reinterpret_cast(it->second.texture->handle), ImVec2(size, size)); + return true; +} + +#endif + void AssetPreviewRenderer::drawPreviewFrame(ImVec2 size) { ImDrawList* dl = ImGui::GetWindowDrawList(); const ImVec2 origin = ImGui::GetCursorScreenPos(); @@ -160,9 +418,21 @@ void AssetPreviewRenderer::renderVisual(const std::filesystem::path& path, Asset if (isImagePath(path) || type == AssetType::Texture) { renderImagePreview(path, innerSize); + ImGui::SetCursorScreenPos(ImVec2(origin.x, origin.y + size.y + 6.0f)); return; } + { + std::string ext = path.extension().string(); + std::transform(ext.begin(), ext.end(), ext.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + if (ext == ".mat" || ext == ".material") { + renderMaterialPreview(path, projectRoot, innerSize); + ImGui::SetCursorScreenPos(ImVec2(origin.x, origin.y + size.y + 6.0f)); + return; + } + } + switch (type) { case AssetType::Mesh: renderMeshPreview(path, projectRoot, innerSize); @@ -224,7 +494,8 @@ void AssetPreviewRenderer::renderImagePreview(const std::filesystem::path& path, } const ImTextureRef texRef = m_image.texture->GetTexRef(); - if (texRef._TexData == nullptr && texRef._TexID == ImTextureID_Invalid) { + if (m_image.texture->Status != ImTextureStatus_OK || + (texRef._TexData == nullptr && texRef._TexID == ImTextureID_Invalid)) { renderFallbackIcon(AssetType::Texture, path, size); return; } @@ -239,9 +510,11 @@ void AssetPreviewRenderer::renderImagePreview(const std::filesystem::path& path, drawSize.x = std::max(1.0f, drawSize.x); drawSize.y = std::max(1.0f, drawSize.y); + const ImVec2 origin = ImGui::GetCursorScreenPos(); const ImVec2 offset((size.x - drawSize.x) * 0.5f, (size.y - drawSize.y) * 0.5f); - ImGui::SetCursorPos(ImGui::GetCursorPos() + offset); - ImGui::Image(texRef, drawSize); + const ImVec2 p0(origin.x + offset.x, origin.y + offset.y); + ImGui::GetWindowDrawList()->AddImage(texRef, p0, ImVec2(p0.x + drawSize.x, p0.y + drawSize.y)); + ImGui::Dummy(size); } void AssetPreviewRenderer::renderMeshPreview(const std::filesystem::path& path, @@ -253,6 +526,19 @@ void AssetPreviewRenderer::renderMeshPreview(const std::filesystem::path& path, return; } +#ifdef CF_HAS_SDL3 + if (m_frameCmd && m_pane.isReady()) { + const ImVec2 scale = ImGui::GetIO().DisplayFramebufferScale; + const float dpi = std::max(1.0f, std::max(scale.x, scale.y)); + u32 pixels = std::clamp(static_cast(std::ceil(std::min(size.x, size.y) * dpi)), 128u, 512u); + pixels = (pixels + 3u) & ~3u; + if (m_pane.renderMesh(m_frameCmd, path.string(), pixels, previewSettings(pixels), projectRoot) && + drawGpuTexture(m_pane.colorTexture(), size)) { + return; + } + } +#endif + if (!mesh->baseColorTexture.empty() && mesh->textureWidth > 0 && mesh->textureHeight > 0) { const std::string key = path.string() + "#embedded"; if (m_cachedKey != key) { @@ -290,7 +576,8 @@ void AssetPreviewRenderer::renderMeshPreview(const std::filesystem::path& path, ImGui_ImplSDLGPU3_UpdateTexture(m_image.texture.get()); } const ImTextureRef texRef = m_image.texture->GetTexRef(); - if (texRef._TexData != nullptr || texRef._TexID != ImTextureID_Invalid) { + if (m_image.texture->Status == ImTextureStatus_OK && + (texRef._TexData != nullptr || texRef._TexID != ImTextureID_Invalid)) { const float aspect = static_cast(m_image.width) / static_cast(m_image.height); ImVec2 drawSize = size; @@ -299,9 +586,10 @@ void AssetPreviewRenderer::renderMeshPreview(const std::filesystem::path& path, } else { drawSize.x = size.y * aspect; } + const ImVec2 origin = ImGui::GetCursorScreenPos(); const ImVec2 offset((size.x - drawSize.x) * 0.5f, (size.y - drawSize.y) * 0.5f); - ImGui::SetCursorPos(ImGui::GetCursorPos() + offset); - ImGui::Image(texRef, drawSize); + const ImVec2 p0(origin.x + offset.x, origin.y + offset.y); + ImGui::GetWindowDrawList()->AddImage(texRef, p0, ImVec2(p0.x + drawSize.x, p0.y + drawSize.y)); ImGui::Dummy(size); return; } @@ -451,6 +739,98 @@ void AssetPreviewRenderer::renderScenePreview(const std::filesystem::path& path, ImGui::Dummy(size); } +bool AssetPreviewRenderer::ensureMaterialLoaded(const std::filesystem::path& path) { + std::error_code ec; + const auto canonical = std::filesystem::weakly_canonical(path, ec); + const std::string key = ec ? path.string() : canonical.string(); + if (m_cachedKey == key && (m_material.loaded || m_material.failed)) { + return m_material.loaded; + } + + invalidate(); + m_cachedKey = key; + m_material.loaded = Assets::loadMaterialFile(path, m_material.surface); + m_material.failed = !m_material.loaded; + return m_material.loaded; +} + +std::filesystem::path resolveProjectRelative(const std::string& projectRoot, + const std::string& relative) { + if (relative.empty()) return {}; + std::filesystem::path p(relative); + if (p.is_absolute()) return p; + if (projectRoot.empty()) return p; + return std::filesystem::path(projectRoot) / p; +} + +void AssetPreviewRenderer::renderMaterialPreview(const std::filesystem::path& path, + const std::string& projectRoot, ImVec2 size) { + if (!ensureMaterialLoaded(path)) { + renderFallbackIcon(AssetType::Unknown, path, size); + return; + } + + const Assets::MaterialSurface& surface = m_material.surface; +#ifdef CF_HAS_SDL3 + if (m_frameCmd && m_pane.isReady()) { + const ImVec2 scale = ImGui::GetIO().DisplayFramebufferScale; + const float dpi = std::max(1.0f, std::max(scale.x, scale.y)); + u32 pixels = std::clamp(static_cast(std::ceil(std::min(size.x, size.y) * dpi)), 128u, 512u); + pixels = (pixels + 3u) & ~3u; + if (m_pane.render(m_frameCmd, surface, pixels, previewSettings(pixels), projectRoot) && + drawGpuTexture(m_pane.colorTexture(), size)) { + return; + } + } +#endif + if (!surface.albedoMap.empty()) { + const std::filesystem::path texPath = resolveProjectRelative(projectRoot, surface.albedoMap); + std::error_code ec; + if (std::filesystem::exists(texPath, ec)) { + renderImagePreview(texPath, size); + return; + } + } + + ImDrawList* dl = ImGui::GetWindowDrawList(); + const ImVec2 origin = ImGui::GetCursorScreenPos(); + const ImVec2 center(origin.x + size.x * 0.5f, origin.y + size.y * 0.52f); + const float radius = std::min(size.x, size.y) * 0.38f; + + const auto toByte = [](f32 v) { + return static_cast(std::clamp(v, 0.0f, 1.0f) * 255.0f); + }; + const ImU32 base = IM_COL32(toByte(surface.albedo.x), toByte(surface.albedo.y), + toByte(surface.albedo.z), 255); + const ImU32 shade = IM_COL32(toByte(surface.albedo.x * 0.55f), toByte(surface.albedo.y * 0.55f), + toByte(surface.albedo.z * 0.55f), 255); + const ImU32 highlight = + IM_COL32(toByte(std::min(surface.albedo.x * 1.25f, 1.0f)), + toByte(std::min(surface.albedo.y * 1.25f, 1.0f)), + toByte(std::min(surface.albedo.z * 1.25f, 1.0f)), 255); + + dl->AddCircleFilled(center, radius, shade); + dl->AddCircleFilled(ImVec2(center.x - radius * 0.28f, center.y - radius * 0.32f), radius * 0.55f, + highlight); + dl->AddCircle(center, radius, base, 0, 2.0f); + + if (surface.metallic > 0.05f) { + dl->AddCircle(center, radius * 0.72f, IM_COL32(220, 230, 255, 90), 0, 1.5f); + } + if (surface.emissionStrength > 0.01f) { + const ImU32 glow = IM_COL32(toByte(surface.emission.x), toByte(surface.emission.y), + toByte(surface.emission.z), 80); + dl->AddCircleFilled(center, radius * 1.05f, glow); + } + + char caption[96]; + std::snprintf(caption, sizeof(caption), "%s M%.2f R%.2f", surface.name.c_str(), + surface.metallic, surface.roughness); + dl->AddText(ImVec2(origin.x + 6.0f, origin.y + size.y - 34.0f), IM_COL32(150, 160, 180, 255), + caption); + ImGui::Dummy(size); +} + void AssetPreviewRenderer::renderFallbackIcon(AssetType type, const std::filesystem::path& path, ImVec2 size) { const char* icon = "alert-circle"; @@ -461,6 +841,7 @@ void AssetPreviewRenderer::renderFallbackIcon(AssetType type, const std::filesys case AssetType::Scene: icon = "account"; break; default: if (path.extension() == ".lua") icon = "at"; + else if (path.extension() == ".mat" || path.extension() == ".material") icon = "beer-alt"; break; } diff --git a/src/editor/AssetPreviewRenderer.hpp b/src/editor/AssetPreviewRenderer.hpp index f08e8f0a..e55ff7ea 100644 --- a/src/editor/AssetPreviewRenderer.hpp +++ b/src/editor/AssetPreviewRenderer.hpp @@ -1,28 +1,50 @@ #pragma once +#include "assets/MaterialTypes.hpp" #include "core/Types.hpp" #include "core/io/CafTypes.hpp" #include #include #include +#include #include #ifdef CF_HAS_IMGUI #include #endif +#ifdef CF_HAS_SDL3 +#include "render/MaterialPreviewRenderer.hpp" +#include "rhi/CommandBuffer.hpp" +#include "rhi/RenderDevice.hpp" +#include +#endif + namespace Caffeine::Editor { #ifdef CF_HAS_IMGUI class AssetPreviewRenderer { public: + ~AssetPreviewRenderer(); + void renderVisual(const std::filesystem::path& path, AssetType type, const std::string& projectRoot, ImVec2 size); void invalidate(); void shutdownGpu(); +#ifdef CF_HAS_SDL3 + void initGpu(RHI::RenderDevice* device); + void setFrameCommandBuffer(RHI::CommandBuffer* cmd) { m_frameCmd = cmd; } + void setEnvironment(std::string path, f32 exposure); + /// Records at most one thumbnail render for items that do not have one yet. + void prepareThumbnails(const std::vector>& items, + const std::string& projectRoot); + /// Draws a GPU or image thumbnail. Returns false when the thumbnail is not ready. + bool drawThumbnail(const std::filesystem::path& path, AssetType type, float size); +#endif + private: struct ImageEntry { std::unique_ptr texture; @@ -37,11 +59,20 @@ class AssetPreviewRenderer { bool failed = false; }; + struct MaterialEntry { + Assets::MaterialSurface surface; + bool loaded = false; + bool failed = false; + }; + std::string m_cachedKey; ImageEntry m_image; WaveformEntry m_waveform; + MaterialEntry m_material; void drawPreviewFrame(ImVec2 size); + void renderMaterialPreview(const std::filesystem::path& path, const std::string& projectRoot, + ImVec2 size); void renderImagePreview(const std::filesystem::path& path, ImVec2 size); void renderMeshPreview(const std::filesystem::path& path, const std::string& projectRoot, ImVec2 size); void renderAudioPreview(const std::filesystem::path& path, ImVec2 size); @@ -50,6 +81,40 @@ class AssetPreviewRenderer { bool ensureImageLoaded(const std::filesystem::path& path); bool ensureWaveformLoaded(const std::filesystem::path& path); + bool ensureMaterialLoaded(const std::filesystem::path& path); + +#ifdef CF_HAS_SDL3 + Render::MaterialPreviewSettings previewSettings(u32 pixelSize) const; + bool drawGpuTexture(RHI::Texture* texture, ImVec2 size); + void pumpThumbnail(const std::string& projectRoot); + bool thumbnailReady(const std::string& key) const; + + struct GpuThumb { + RHI::Texture* texture = nullptr; + bool ready = false; + bool failed = false; + }; + struct ImageThumb { + std::unique_ptr texture; + int width = 0; + int height = 0; + bool ready = false; + bool failed = false; + }; + + RHI::RenderDevice* m_device = nullptr; + RHI::CommandBuffer* m_frameCmd = nullptr; + Render::MaterialPreviewRenderer m_pane; + Render::MaterialPreviewRenderer m_thumbs; + std::string m_envPath; + f32 m_envExposure = 1.0f; + std::unordered_map m_gpuThumbs; + std::unordered_map m_imageThumbs; + std::vector> m_thumbItems; + std::string m_activeThumbKey; + bool m_activeThumbIsImage = false; + bool m_activeThumbIsMesh = false; +#endif }; #endif diff --git a/src/editor/ComponentRegistry.cpp b/src/editor/ComponentRegistry.cpp index 393cab88..7ee7dff3 100644 --- a/src/editor/ComponentRegistry.cpp +++ b/src/editor/ComponentRegistry.cpp @@ -1,4 +1,6 @@ #include "editor/ComponentRegistry.hpp" + +#include #include "ecs/Components.hpp" #include "ecs/MeshComponents.hpp" #include "ecs/PrefabComponents.hpp" @@ -13,6 +15,10 @@ #include "script/ScriptTypes.hpp" #include "ui/UIComponents.hpp" #include "animation/AnimationComponents.hpp" +#include "animation/AnimationPlayer.hpp" +#include "animation/SkinLibrary.hpp" +#include "effects/EffectTypes.hpp" +#include "navigation/NavVolume.hpp" #include "ecs/PostProcessComponents.hpp" #include "ecs/ForwardRenderComponents.hpp" #include "editor/ComponentTypeRegistry.hpp" @@ -142,6 +148,57 @@ void registerAllComponents(ComponentRegistry& reg) { } } }); + reg.registerComponent({ + "Effects", "Effect", + [](ECS::World& w, ECS::Entity e) { return w.has(e); }, + [](ECS::World& w, ECS::Entity e) { + Effects::EffectComponent effect; + effect.kind = static_cast(Effects::EffectKind::Particles); + w.add(e, effect); + } + }); + reg.registerComponent({ + "Animation", "Sprite Sheet", + [](ECS::World& w, ECS::Entity e) { return w.has(e); }, + [](ECS::World& w, ECS::Entity e) { + Animation::SpriteSheet sheet; + sheet.columns = 4; + sheet.rows = 1; + sheet.frameCount = 4; + w.add(e, sheet); + if (!w.has(e)) w.add(e); + } + }); + reg.registerComponent({ + "Animation", "Skinned Mesh", + [](ECS::World& w, ECS::Entity e) { return w.has(e); }, + [](ECS::World& w, ECS::Entity e) { + Animation::SkinnedPose pose; + if (const ECS::MeshFilterComponent* filter = w.get(e)) { + std::strncpy(pose.meshPath, filter->customMeshPath.c_str(), sizeof(pose.meshPath) - 1); + } + w.add(e, std::move(pose)); + } + }); + reg.registerComponent({ + "Animation", "Animation Player", + [](ECS::World& w, ECS::Entity e) { return w.has(e); }, + [](ECS::World& w, ECS::Entity e) { w.add(e); } + }); + reg.registerComponent({ + "AI", "Nav Volume", + [](ECS::World& w, ECS::Entity e) { return w.has(e); }, + [](ECS::World& w, ECS::Entity e) { + Navigation::NavVolume volume; + volume.resize(32, 32); + w.add(e, std::move(volume)); + } + }); + reg.registerComponent({ + "AI", "Nav Agent", + [](ECS::World& w, ECS::Entity e) { return w.has(e); }, + [](ECS::World& w, ECS::Entity e) { w.add(e); } + }); reg.registerComponent({ "Camera", "Camera Active", [](ECS::World& w, ECS::Entity e) { return w.has(e); }, diff --git a/src/editor/EditorContext.hpp b/src/editor/EditorContext.hpp index 4f8822af..4b4adf6b 100644 --- a/src/editor/EditorContext.hpp +++ b/src/editor/EditorContext.hpp @@ -96,7 +96,11 @@ class EditorContext { std::string currentScenePath; bool isDirty = false; std::string materialToOpen; + std::string imageToOpen; std::filesystem::path projectRootPath; + std::filesystem::path assetRootPath; + bool assetBrowserDirty = false; + std::filesystem::path assetBrowserNavigateTo; /// One browse dialog for the whole IDE. Panels only queue it; SceneEditor /// pumps it every frame until the user picks a path or closes the dialog. diff --git a/src/editor/EffectEditorPanel.cpp b/src/editor/EffectEditorPanel.cpp new file mode 100644 index 00000000..a4641511 --- /dev/null +++ b/src/editor/EffectEditorPanel.cpp @@ -0,0 +1,262 @@ +#include "editor/EffectEditorPanel.hpp" + +#include "editor/EffectObjectFactory.hpp" +#include "effects/EffectTypes.hpp" +#include "ecs/ComponentQuery.hpp" + +#ifdef CF_HAS_IMGUI +#include +#endif + +#include +#include + +namespace Caffeine::Editor { +namespace { + +const char* fogStyleName(Effects::EffectFogStyle style) { + switch (style) { + case Effects::EffectFogStyle::Dust: return "Dust"; + case Effects::EffectFogStyle::Mist: return "Mist"; + case Effects::EffectFogStyle::Smoke: return "Smoke"; + case Effects::EffectFogStyle::Fog: break; + } + return "Fog"; +} + +const char* effectLabel(const Effects::EffectComponent& effect) { + switch (static_cast(effect.kind)) { + case Effects::EffectKind::VolumetricLight: { + static char label[64]; + std::snprintf(label, sizeof(label), "Volumetric %s", + Effects::volumetricShapeName(Effects::volumetricShapeOf(effect))); + return label; + } + case Effects::EffectKind::ReflectiveSurface: return "Reflective Surface"; + case Effects::EffectKind::MaterialShade: return "Material Shade"; + case Effects::EffectKind::Fog: { + const bool twoD = static_cast(effect.domain) == Effects::EffectDomain::TwoD; + static char label[64]; + std::snprintf(label, sizeof(label), "%s %s", + twoD ? "2D" : "3D", + fogStyleName(static_cast(effect.pad0 > 3 ? 0 : effect.pad0))); + return label; + } + case Effects::EffectKind::Particles: break; + } + return "Effect"; +} + +bool dragFloat(const char* label, f32& value, f32 speed, f32 lo, f32 hi) { +#ifdef CF_HAS_IMGUI + return ImGui::DragFloat(label, &value, speed, lo, hi); +#else + (void)label; (void)value; (void)speed; (void)lo; (void)hi; + return false; +#endif +} + +} // namespace + +void EffectEditorPanel::onImGuiRender(EditorContext& ctx) { +#ifdef CF_HAS_IMGUI + if (!m_open) return; + ImGui::Begin("Effects", &m_open); + ECS::World* world = ctx.activeWorld; + if (!world) { + ImGui::TextDisabled("Open a scene to edit effects."); + ImGui::End(); + return; + } + + const char* volumeShapes[] = {"Sphere", "Cone", "Box", "Cylinder", "Window"}; + ImGui::SetNextItemWidth(140.0f); + ImGui::Combo("Format##vol_create", &m_volumeShape, volumeShapes, 5); + ImGui::SameLine(); + if (ImGui::Button("Create Volumetric")) { + Effects::EffectComponent effect; + const auto shape = static_cast(m_volumeShape); + Effects::configureVolumetricLight(effect, shape); + char name[64]; + std::snprintf(name, sizeof(name), "Volumetric %s", volumeShapes[m_volumeShape]); + spawnEffectObject(*world, ctx, name, effect, false); + } + ImGui::SameLine(); + const char* styles[] = {"Fog", "Dust", "Mist", "Smoke"}; + ImGui::SetNextItemWidth(110.0f); + ImGui::Combo("Style##effect_fog_style", &m_fogStyle, styles, 4); + if (ImGui::Button("Create 3D Fog")) { + Effects::EffectComponent effect; + const auto style = static_cast(m_fogStyle); + Effects::configureFog(effect, Effects::EffectDomain::ThreeD, style); + char name[64]; + std::snprintf(name, sizeof(name), "3D %s", styles[m_fogStyle]); + spawnEffectObject(*world, ctx, name, effect, false); + } + ImGui::SameLine(); + if (ImGui::Button("Create 2D Fog")) { + Effects::EffectComponent effect; + const auto style = static_cast(m_fogStyle); + Effects::configureFog(effect, Effects::EffectDomain::TwoD, style); + char name[64]; + std::snprintf(name, sizeof(name), "2D %s", styles[m_fogStyle]); + spawnEffectObject(*world, ctx, name, effect, true); + } + if (ImGui::Button("Reflective Surface")) { + Effects::EffectComponent effect; + effect.kind = static_cast(Effects::EffectKind::ReflectiveSurface); + effect.reflection = 0.85f; + effect.roughness = 0.12f; + effect.metallic = 0.85f; + effect.domain = static_cast(Effects::EffectDomain::ThreeD); + spawnEffectObject(*world, ctx, "Reflective Surface", effect, false); + } + ImGui::SameLine(); + if (ImGui::Button("Material Shade")) { + Effects::EffectComponent effect; + effect.kind = static_cast(Effects::EffectKind::MaterialShade); + effect.domain = static_cast(Effects::EffectDomain::Both); + spawnEffectObject(*world, ctx, "Material Shade", effect, false); + } + ImGui::TextDisabled("caffeine.effects.volumetricShape(entity, shape, columns, rows)"); + ImGui::TextDisabled("shape 0 sphere, 1 cone, 2 box, 3 cylinder, 4 window. Shafts follow -Z."); + ImGui::TextDisabled("caffeine.effects.fog(entity, domain, style) style 0 fog, 1 dust, 2 mist, 3 smoke"); + + std::vector effects; + ECS::ComponentQuery query; + query.with(); + world->forEach(query, [&](ECS::Entity entity, Effects::EffectComponent& effect) { + if (static_cast(effect.kind) != Effects::EffectKind::Particles) { + effects.push_back(entity); + } + }); + + ImGui::Separator(); + Effects::EffectComponent* selected = nullptr; + ECS::Entity selectedEntity = ECS::Entity::INVALID; + for (ECS::Entity entity : effects) { + Effects::EffectComponent* effect = world->get(entity); + if (!effect) continue; + char row[160]; + std::snprintf(row, sizeof(row), "%s %s##effect_%u", effectLabel(*effect), + getEntityName(*world, entity), entity.id()); + const bool current = ctx.selectedEntity.isValid() && ctx.selectedEntity.id() == entity.id(); + if (ImGui::Selectable(row, current)) ctx.selectEntity(entity); + if (ctx.selectedEntity.isValid() && ctx.selectedEntity.id() == entity.id()) { + selected = effect; + selectedEntity = entity; + } + } + if (effects.empty()) ImGui::TextDisabled("No effect objects in this scene."); + if (!selected || !selectedEntity.isValid()) { + ImGui::End(); + return; + } + + ImGui::Separator(); + ImGui::TextUnformatted(getEntityName(*world, selectedEntity)); + bool enabled = selected->enabled != 0; + if (ImGui::Checkbox("Enabled", &enabled)) { + selected->enabled = enabled ? 1 : 0; + ctx.isDirty = true; + } + const char* spaces[] = {"World", "Camera"}; + int space = static_cast(selected->space); + if (ImGui::Combo("Space", &space, spaces, 2)) { + selected->space = static_cast(space); + ctx.isDirty = true; + } + const char* qualities[] = {"Performance", "Balanced", "Quality"}; + int quality = static_cast(selected->quality); + if (ImGui::Combo("Quality", &quality, qualities, 3)) { + selected->quality = static_cast(quality); + ctx.isDirty = true; + } + + const Effects::EffectKind kind = static_cast(selected->kind); + if (kind == Effects::EffectKind::VolumetricLight) { + int shape = static_cast(Effects::volumetricShapeOf(*selected)); + if (ImGui::Combo("Format", &shape, volumeShapes, 5)) { + const Vec3 color = selected->lightColor; + Effects::configureVolumetricLight(*selected, static_cast(shape)); + selected->lightColor = color; + ctx.isDirty = true; + } + const Effects::VolumetricShape volume = Effects::volumetricShapeOf(*selected); + if (volume == Effects::VolumetricShape::Sphere) { + if (dragFloat("Radius", selected->radius, 0.05f, 0.1f, 40.0f)) ctx.isDirty = true; + } else { + if (dragFloat("Length", selected->radius, 0.05f, 0.2f, 40.0f)) ctx.isDirty = true; + if (volume == Effects::VolumetricShape::Cone) { + if (dragFloat("Near", selected->startSize, 0.01f, 0.05f, 8.0f)) ctx.isDirty = true; + if (dragFloat("Far", selected->endSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; + } else if (volume == Effects::VolumetricShape::Cylinder) { + if (dragFloat("Diameter", selected->startSize, 0.01f, 0.05f, 8.0f)) { + selected->endSize = selected->startSize; + ctx.isDirty = true; + } + } else { + if (dragFloat("Width", selected->startSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; + if (dragFloat("Height", selected->endSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; + } + if (volume == Effects::VolumetricShape::Window) { + u32 columns = 1; + u32 rows = 1; + Effects::volumetricGridOf(*selected, columns, rows); + int columnCount = static_cast(columns); + int rowCount = static_cast(rows); + if (ImGui::SliderInt("Columns", &columnCount, 1, 8)) { + Effects::setVolumetricGrid(*selected, static_cast(columnCount), rows); + ctx.isDirty = true; + } + if (ImGui::SliderInt("Rows", &rowCount, 1, 8)) { + Effects::setVolumetricGrid(*selected, static_cast(columnCount), static_cast(rowCount)); + ctx.isDirty = true; + } + ImGui::TextDisabled("Aim -Z from the glass toward the floor. Dust in the room makes the shafts read."); + } + } + if (dragFloat("Density", selected->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Anisotropy", &selected->anisotropy, 0.0f, 0.9f)) ctx.isDirty = true; + if (dragFloat("Intensity", selected->intensity, 0.05f, 0.0f, 16.0f)) ctx.isDirty = true; + if (ImGui::ColorEdit3("Light", &selected->lightColor.x)) ctx.isDirty = true; + } else if (kind == Effects::EffectKind::Fog) { + int style = static_cast(selected->pad0 > 3 ? 0 : selected->pad0); + if (ImGui::Combo("Look", &style, styles, 4)) { + const auto domain = static_cast(selected->domain); + Effects::configureFog(*selected, domain, static_cast(style)); + ctx.isDirty = true; + } + int domain = static_cast(selected->domain); + const char* domains[] = {"2D and 3D", "2D", "3D"}; + if (ImGui::Combo("Domain", &domain, domains, 3)) { + selected->domain = static_cast(domain); + ctx.isDirty = true; + } + if (dragFloat("Radius", selected->radius, 0.05f, 0.1f, 40.0f)) ctx.isDirty = true; + if (dragFloat("Density", selected->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; + if (dragFloat("Intensity", selected->intensity, 0.02f, 0.0f, 4.0f)) ctx.isDirty = true; + if (ImGui::ColorEdit3("Color", &selected->lightColor.x)) ctx.isDirty = true; + } else if (kind == Effects::EffectKind::ReflectiveSurface) { + if (ImGui::SliderFloat("Reflection", &selected->reflection, 0.0f, 1.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Roughness", &selected->roughness, 0.02f, 1.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Metallic", &selected->metallic, 0.0f, 1.0f)) ctx.isDirty = true; + } else if (kind == Effects::EffectKind::MaterialShade) { + if (ImGui::ColorEdit3("Tint", &selected->tint.x)) ctx.isDirty = true; + if (dragFloat("Emission", selected->emissionBoost, 0.05f, 0.0f, 8.0f)) ctx.isDirty = true; + if (dragFloat("Roughness Bias", selected->roughnessBias, 0.01f, -1.0f, 1.0f)) ctx.isDirty = true; + } + + if (ImGui::Button("Delete Effect")) { + ctx.beginUndo(EditorCommand::RemoveEntity, selectedEntity.id(), *world); + world->destroy(selectedEntity); + ctx.isDirty = true; + ctx.endUndo(*world); + } + ImGui::End(); +#else + (void)ctx; +#endif +} + +} // namespace Caffeine::Editor diff --git a/src/editor/EffectEditorPanel.hpp b/src/editor/EffectEditorPanel.hpp new file mode 100644 index 00000000..26c37d48 --- /dev/null +++ b/src/editor/EffectEditorPanel.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include "core/Types.hpp" +#include "editor/EditorContext.hpp" + +namespace Caffeine::Editor { + +/// Authors volumetric lights, fog, and the other scene effects. +class EffectEditorPanel { +public: + bool isOpen() const { return m_open; } + void open() { m_open = true; } + void close() { m_open = false; } + + void onImGuiRender(EditorContext& ctx); + +private: + bool m_open = false; + int m_fogStyle = 0; + int m_volumeShape = 0; +}; + +} // namespace Caffeine::Editor diff --git a/src/editor/EffectObjectFactory.hpp b/src/editor/EffectObjectFactory.hpp new file mode 100644 index 00000000..26230643 --- /dev/null +++ b/src/editor/EffectObjectFactory.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "editor/EditorContext.hpp" +#include "effects/EffectTypes.hpp" +#include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" + +namespace Caffeine::Editor { + +inline ECS::Entity spawnEffectObject(ECS::World& world, EditorContext& ctx, const char* name, + const Effects::EffectComponent& effect, bool twoD) { + ctx.beginUndo(EditorCommand::AddEntity, u32_max, world); + ECS::Entity entity = world.create(); + setEntityName(world, entity, name); + if (twoD) { + world.add(entity); + } else { + world.add(entity); + world.add(entity); + world.add(entity); + } + world.add(entity, effect); + ctx.selectEntity(entity); + ctx.isDirty = true; + ctx.endUndo(world); + return entity; +} + +} // namespace Caffeine::Editor diff --git a/src/editor/HudEditorPanel.cpp b/src/editor/HudEditorPanel.cpp new file mode 100644 index 00000000..4d0da926 --- /dev/null +++ b/src/editor/HudEditorPanel.cpp @@ -0,0 +1,376 @@ +#include "editor/HudEditorPanel.hpp" + +#include "scene/SceneComponents.hpp" +#include "ui/UIRenderer.hpp" +#include "ui/UISystem.hpp" + +#ifdef CF_HAS_IMGUI +#include +#endif + +#include +#include +#include + +namespace Caffeine::Editor { +namespace { + +constexpr f32 kRefW = 1280.0f; +constexpr f32 kRefH = 720.0f; + +const char* widgetTypeName(UI::UIWidgetType type) { + switch (type) { + case UI::UIWidgetType::Canvas: return "Canvas"; + case UI::UIWidgetType::Panel: return "Panel"; + case UI::UIWidgetType::Button: return "Button"; + case UI::UIWidgetType::Label: return "Label"; + case UI::UIWidgetType::ProgressBar: return "Progress"; + case UI::UIWidgetType::Checkbox: return "Checkbox"; + case UI::UIWidgetType::Slider: return "Slider"; + } + return "Widget"; +} + +const char* widgetCaption(ECS::World& world, ECS::Entity entity, const UI::UIWidget& widget) { + if (widget.type == UI::UIWidgetType::Button) { + if (const UI::UIButton* button = world.get(entity)) { + if (!button->labelText.empty()) return button->labelText.cStr(); + } + } + if (widget.type == UI::UIWidgetType::Label) { + if (const UI::UILabel* label = world.get(entity)) { + if (!label->text.empty()) return label->text.cStr(); + } + } + return widgetTypeName(widget.type); +} + +ECS::Entity findCanvas(ECS::World& world) { + ECS::Entity found = ECS::Entity::INVALID; + ECS::ComponentQuery query; + query.with(); + world.forEach(query, [&](ECS::Entity entity, UI::UIWidget& widget) { + if (!found.isValid() && widget.type == UI::UIWidgetType::Canvas) found = entity; + }); + return found; +} + +Vec2 canvasSizeOf(ECS::World& world) { + ECS::Entity canvas = findCanvas(world); + if (canvas.isValid()) { + if (const UI::UIWidget* widget = world.get(canvas)) { + if (widget->computedRect.size.x > 1.0f && widget->computedRect.size.y > 1.0f) { + return widget->computedRect.size; + } + } + } + return {kRefW, kRefH}; +} + +void parentWidget(ECS::World& world, ECS::Entity child, ECS::Entity parent) { + if (!child.isValid() || !parent.isValid()) return; + if (UI::UIWidget* widget = world.get(child)) { + widget->parentId = parent.id(); + } + Scene::Parent& link = world.add(child); + link.parent = parent; + link.dirty = true; +} + +ECS::Entity parentForNewWidget(ECS::World& world, const EditorContext& ctx) { + if (ctx.selectedEntity.isValid()) { + if (const UI::UIWidget* widget = world.get(ctx.selectedEntity)) { + if (widget->type == UI::UIWidgetType::Canvas || widget->type == UI::UIWidgetType::Panel) { + return ctx.selectedEntity; + } + if (widget->parentId != UI::kUIInvalidParent) { + ECS::Entity parent(widget->parentId, &world); + if (parent.isValid() && world.get(parent)) return parent; + } + } + } + return findCanvas(world); +} + +void moveWidget(UI::UIWidget& widget, Vec2 delta) { + widget.transform.offsetMin.x += delta.x; + widget.transform.offsetMin.y += delta.y; + widget.transform.offsetMax.x += delta.x; + widget.transform.offsetMax.y += delta.y; +} + +void resizeWidget(UI::UIWidget& widget, Vec2 delta) { + widget.transform.offsetMax.x += delta.x; + widget.transform.offsetMax.y += delta.y; + const f32 minW = widget.transform.offsetMin.x + 8.0f; + const f32 minH = widget.transform.offsetMin.y + 8.0f; + if (widget.transform.offsetMax.x < minW) widget.transform.offsetMax.x = minW; + if (widget.transform.offsetMax.y < minH) widget.transform.offsetMax.y = minH; +} + +ECS::Entity hitWidget(ECS::World& world, Vec2 canvasPoint) { + ECS::Entity result = ECS::Entity::INVALID; + i32 bestOrder = -1000000; + ECS::ComponentQuery query; + query.with(); + world.forEach(query, [&](ECS::Entity entity, UI::UIWidget& widget) { + if (!widget.visible || widget.type == UI::UIWidgetType::Canvas) return; + if (!widget.computedRect.contains(canvasPoint)) return; + if (widget.siblingOrder >= bestOrder) { + bestOrder = widget.siblingOrder; + result = entity; + } + }); + return result; +} + +} // namespace + +void HudEditorPanel::onImGuiRender(EditorContext& ctx) { +#ifdef CF_HAS_IMGUI + if (!m_open) return; + ImGui::Begin("HUD Editor", &m_open); + ECS::World* world = ctx.activeWorld; + if (!world) { + ImGui::TextDisabled("Open a scene to edit the HUD."); + ImGui::End(); + return; + } + + UI::UISystem layout; + layout.layout(*world); + const Vec2 reference = canvasSizeOf(*world); + + UI::UISystem factory; + auto finishCreate = [&](ECS::Entity entity, ECS::Entity parent) { + if (parent.isValid() && entity.isValid() && entity.id() != parent.id()) { + parentWidget(*world, entity, parent); + } + ctx.selectEntity(entity); + ctx.isDirty = true; + ctx.endUndo(*world); + layout.layout(*world); + }; + + if (ImGui::Button("Canvas")) { + ctx.beginUndo(EditorCommand::AddEntity, u32_max, *world); + ECS::Entity canvas = factory.createCanvas(*world, {kRefW, kRefH}); + setEntityName(*world, canvas, "HUD"); + finishCreate(canvas, ECS::Entity::INVALID); + } + ImGui::SameLine(); + if (ImGui::Button("Panel")) { + ctx.beginUndo(EditorCommand::AddEntity, u32_max, *world); + ECS::Entity parent = parentForNewWidget(*world, ctx); + if (!parent.isValid()) { + parent = factory.createCanvas(*world, {kRefW, kRefH}); + setEntityName(*world, parent, "HUD"); + } + ECS::Entity panel = factory.createPanel(*world, parent.id(), {{24.0f, 24.0f}, {280.0f, 120.0f}}); + setEntityName(*world, panel, "Panel"); + finishCreate(panel, parent); + } + ImGui::SameLine(); + if (ImGui::Button("Label")) { + ctx.beginUndo(EditorCommand::AddEntity, u32_max, *world); + ECS::Entity parent = parentForNewWidget(*world, ctx); + if (!parent.isValid()) { + parent = factory.createCanvas(*world, {kRefW, kRefH}); + setEntityName(*world, parent, "HUD"); + } + ECS::Entity label = factory.createLabel(*world, parent.id(), "Label", {32.0f, 32.0f}); + setEntityName(*world, label, "Label"); + finishCreate(label, parent); + } + ImGui::SameLine(); + if (ImGui::Button("Button")) { + ctx.beginUndo(EditorCommand::AddEntity, u32_max, *world); + ECS::Entity parent = parentForNewWidget(*world, ctx); + if (!parent.isValid()) { + parent = factory.createCanvas(*world, {kRefW, kRefH}); + setEntityName(*world, parent, "HUD"); + } + ECS::Entity button = factory.createButton(*world, parent.id(), "Button", {32.0f, 80.0f}); + setEntityName(*world, button, "Button"); + finishCreate(button, parent); + } + ImGui::SameLine(); + if (ImGui::Button("Bar")) { + ctx.beginUndo(EditorCommand::AddEntity, u32_max, *world); + ECS::Entity parent = parentForNewWidget(*world, ctx); + if (!parent.isValid()) { + parent = factory.createCanvas(*world, {kRefW, kRefH}); + setEntityName(*world, parent, "HUD"); + } + ECS::Entity bar = factory.createProgressBar(*world, parent.id(), {32.0f, 140.0f}); + setEntityName(*world, bar, "Health"); + finishCreate(bar, parent); + } + ImGui::SameLine(); + if (ImGui::Button("Slider")) { + ctx.beginUndo(EditorCommand::AddEntity, u32_max, *world); + ECS::Entity parent = parentForNewWidget(*world, ctx); + if (!parent.isValid()) { + parent = factory.createCanvas(*world, {kRefW, kRefH}); + setEntityName(*world, parent, "HUD"); + } + ECS::Entity slider = factory.createSlider(*world, parent.id(), {32.0f, 180.0f}); + setEntityName(*world, slider, "Slider"); + finishCreate(slider, parent); + } + ImGui::SameLine(); + if (ImGui::Button("Check")) { + ctx.beginUndo(EditorCommand::AddEntity, u32_max, *world); + ECS::Entity parent = parentForNewWidget(*world, ctx); + if (!parent.isValid()) { + parent = factory.createCanvas(*world, {kRefW, kRefH}); + setEntityName(*world, parent, "HUD"); + } + ECS::Entity box = factory.createCheckbox(*world, parent.id(), {32.0f, 220.0f}); + setEntityName(*world, box, "Checkbox"); + finishCreate(box, parent); + } + + ImGui::TextDisabled("Arrasta para mover. O canto inferior direito redimensiona. Cores e texto ficam no inspector."); + ImGui::TextDisabled("Cliques e valores continuam em Lua (caffeine.ui) ou em C++ (UISystem)."); + + const float listWidth = 200.0f; + ImGui::BeginChild("hud_list", ImVec2(listWidth, 0.0f), true); + ECS::ComponentQuery query; + query.with(); + world->forEach(query, [&](ECS::Entity entity, UI::UIWidget& widget) { + ImGui::PushID(static_cast(entity.id())); + const bool selected = ctx.selectedEntity.id() == entity.id(); + char row[160]; + std::snprintf(row, sizeof(row), "%s %s", widgetTypeName(widget.type), getEntityName(*world, entity)); + if (ImGui::Selectable(row, selected)) ctx.selectEntity(entity); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", widgetCaption(*world, entity, widget)); + } + ImGui::PopID(); + }); + ImGui::EndChild(); + + ImGui::SameLine(); + ImGui::BeginChild("hud_stage", ImVec2(0.0f, 0.0f), true); + const ImVec2 avail = ImGui::GetContentRegionAvail(); + const float aspect = reference.x / std::max(reference.y, 1.0f); + ImVec2 canvas(avail.x, avail.x / aspect); + if (canvas.y > avail.y) { + canvas.y = avail.y; + canvas.x = canvas.y * aspect; + } + canvas.x = std::max(canvas.x, 64.0f); + canvas.y = std::max(canvas.y, 36.0f); + + const ImVec2 cursor = ImGui::GetCursorScreenPos(); + ImGui::InvisibleButton("hud_surface", canvas); + const bool surfaceHovered = ImGui::IsItemHovered(); + const ImVec2 origin = ImGui::GetItemRectMin(); + const f32 scaleX = canvas.x / reference.x; + const f32 scaleY = canvas.y / reference.y; + auto toCanvas = [&](ImVec2 screen) { + return Vec2{(screen.x - origin.x) / scaleX, (screen.y - origin.y) / scaleY}; + }; + + const Vec2 mouse = toCanvas(ImGui::GetIO().MousePos); + if (surfaceHovered && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { + bool resize = false; + if (UI::UIWidget* selected = world->get(ctx.selectedEntity)) { + if (selected->type != UI::UIWidgetType::Canvas && selected->computedRect.isValid()) { + const float hx = origin.x + (selected->computedRect.position.x + selected->computedRect.size.x) * scaleX; + const float hy = origin.y + (selected->computedRect.position.y + selected->computedRect.size.y) * scaleY; + const ImVec2 pointer = ImGui::GetIO().MousePos; + resize = pointer.x >= hx - 12.0f && pointer.x <= hx + 4.0f && + pointer.y >= hy - 12.0f && pointer.y <= hy + 4.0f; + } + } + if (resize) { + m_resizing = true; + m_dragging = false; + m_dragEntity = ctx.selectedEntity.id(); + } else { + ECS::Entity hit = hitWidget(*world, mouse); + if (hit.isValid()) { + ctx.selectEntity(hit); + m_dragging = true; + m_resizing = false; + m_dragEntity = hit.id(); + } + } + } + + if ((m_dragging || m_resizing) && ImGui::IsMouseDown(ImGuiMouseButton_Left) && + ImGui::IsMouseDragging(ImGuiMouseButton_Left)) { + ECS::Entity entity(m_dragEntity, world); + if (UI::UIWidget* widget = world->get(entity)) { + if (!m_undoOpen) { + ctx.beginUndo(EditorCommand::MoveEntity, m_dragEntity, *world); + m_undoOpen = true; + } + const ImVec2 delta = ImGui::GetIO().MouseDelta; + const Vec2 canvasDelta{delta.x / scaleX, delta.y / scaleY}; + if (m_resizing) resizeWidget(*widget, canvasDelta); + else moveWidget(*widget, canvasDelta); + ctx.isDirty = true; + layout.layout(*world); + } + } + + if ((m_dragging || m_resizing) && ImGui::IsMouseReleased(ImGuiMouseButton_Left)) { + if (m_undoOpen) { + ctx.endUndo(*world); + m_undoOpen = false; + } + m_dragging = false; + m_resizing = false; + m_dragEntity = UI::kUIInvalidParent; + } + + ImDrawList* drawList = ImGui::GetWindowDrawList(); + drawList->AddRectFilled(origin, ImVec2(origin.x + canvas.x, origin.y + canvas.y), IM_COL32(16, 18, 24, 255)); + for (f32 x = 0.0f; x <= reference.x; x += 64.0f) { + const float sx = origin.x + x * scaleX; + drawList->AddLine(ImVec2(sx, origin.y), ImVec2(sx, origin.y + canvas.y), IM_COL32(40, 44, 56, 255)); + } + for (f32 y = 0.0f; y <= reference.y; y += 64.0f) { + const float sy = origin.y + y * scaleY; + drawList->AddLine(ImVec2(origin.x, sy), ImVec2(origin.x + canvas.x, sy), IM_COL32(40, 44, 56, 255)); + } + UI::drawWidgets(*world, drawList, origin, canvas); + drawList->AddRect(origin, ImVec2(origin.x + canvas.x, origin.y + canvas.y), IM_COL32(90, 98, 120, 255)); + + if (ctx.selectedEntity.isValid()) { + if (const UI::UIWidget* selected = world->get(ctx.selectedEntity)) { + if (selected->type != UI::UIWidgetType::Canvas && selected->computedRect.isValid()) { + const ImVec2 p0(origin.x + selected->computedRect.position.x * scaleX, + origin.y + selected->computedRect.position.y * scaleY); + const ImVec2 p1(p0.x + selected->computedRect.size.x * scaleX, + p0.y + selected->computedRect.size.y * scaleY); + drawList->AddRect(p0, p1, IM_COL32(120, 180, 255, 255), 0.0f, 0, 2.0f); + drawList->AddRectFilled(ImVec2(p1.x - 8.0f, p1.y - 8.0f), p1, IM_COL32(120, 180, 255, 255)); + } + } + } + + if (!m_dragging && !m_resizing && ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) && + !ImGui::GetIO().WantTextInput && ImGui::IsKeyPressed(ImGuiKey_Delete) && + ctx.selectedEntity.isValid() && world->get(ctx.selectedEntity)) { + ctx.beginUndo(EditorCommand::RemoveEntity, ctx.selectedEntity.id(), *world); + world->destroy(ctx.selectedEntity); + ctx.selectEntity(ECS::Entity::INVALID); + ctx.isDirty = true; + ctx.endUndo(*world); + } + + ImGui::SetCursorScreenPos(ImVec2(cursor.x, origin.y + canvas.y + 6.0f)); + ImGui::Text("Canvas %.0f x %.0f", reference.x, reference.y); + (void)cursor; + ImGui::EndChild(); + ImGui::End(); +#else + (void)ctx; +#endif +} + +} // namespace Caffeine::Editor diff --git a/src/editor/HudEditorPanel.hpp b/src/editor/HudEditorPanel.hpp new file mode 100644 index 00000000..a651ba6e --- /dev/null +++ b/src/editor/HudEditorPanel.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "core/Types.hpp" +#include "ecs/Entity.hpp" +#include "editor/EditorContext.hpp" + +namespace Caffeine::Editor { + +/// Visual editor for the retained-mode HUD (UIWidget). Behavior stays in Lua and C++. +class HudEditorPanel { +public: + bool isOpen() const { return m_open; } + void open() { m_open = true; } + void close() { m_open = false; } + + void onImGuiRender(EditorContext& ctx); + +private: + bool m_open = false; + bool m_dragging = false; + bool m_resizing = false; + bool m_undoOpen = false; + u32 m_dragEntity = 0xFFFFFFFFu; +}; + +} // namespace Caffeine::Editor diff --git a/src/editor/ImageManagerPanel.cpp b/src/editor/ImageManagerPanel.cpp new file mode 100644 index 00000000..63610fca --- /dev/null +++ b/src/editor/ImageManagerPanel.cpp @@ -0,0 +1,249 @@ +#include "editor/ImageManagerPanel.hpp" + +#include + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include + +#ifdef CF_HAS_IMGUI +#include +#ifdef CF_HAS_SDL3 +#include "editor/ImGuiGpuTexture.hpp" +#endif +#endif + +#include +#include + +namespace Caffeine::Editor { + +ImageManagerPanel::~ImageManagerPanel() { +#ifdef CF_HAS_SDL3 + destroyImGuiTexture(m_texture); +#endif +} + +namespace { + +bool isImageExtension(const std::filesystem::path& path) { + std::string ext = path.extension().string(); + std::transform(ext.begin(), ext.end(), ext.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + return ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".bmp" || ext == ".tga" || + ext == ".gif"; +} + +} // namespace + +void ImageManagerPanel::openPath(const std::filesystem::path& path) { + m_open = true; + m_path = path; + m_pixels.clear(); + m_width = 0; + m_height = 0; + m_status.clear(); + m_zoom = 1.0f; + m_panX = 0.0f; + m_panY = 0.0f; + + int channels = 0; + unsigned char* pixels = stbi_load(path.string().c_str(), &m_width, &m_height, &channels, 4); + if (!pixels || m_width <= 0 || m_height <= 0) { + m_status = "Could not read image."; + if (pixels) stbi_image_free(pixels); + m_width = 0; + m_height = 0; + return; + } + const size_t bytes = static_cast(m_width) * static_cast(m_height) * 4; + m_pixels.assign(pixels, pixels + bytes); + stbi_image_free(pixels); +#ifdef CF_HAS_SDL3 + m_gpuDirty = true; +#endif +} + +void ImageManagerPanel::rebuildGpu() { +#ifdef CF_HAS_SDL3 + if (!m_gpuDirty || m_pixels.empty() || m_width <= 0 || m_height <= 0) return; + destroyImGuiTexture(m_texture); + m_texture = std::make_unique(); + m_texture->Create(ImTextureFormat_RGBA32, m_width, m_height); + auto* dst = static_cast(m_texture->GetPixels()); + const size_t count = static_cast(m_width) * static_cast(m_height); + for (size_t i = 0; i < count; ++i) { + dst[i * 4 + 0] = m_showR ? m_pixels[i * 4 + 0] : 0; + dst[i * 4 + 1] = m_showG ? m_pixels[i * 4 + 1] : 0; + dst[i * 4 + 2] = m_showB ? m_pixels[i * 4 + 2] : 0; + dst[i * 4 + 3] = m_showA ? m_pixels[i * 4 + 3] : 255; + } + m_texture->SetStatus(ImTextureStatus_WantCreate); + ImGui_ImplSDLGPU3_UpdateTexture(m_texture.get()); + m_gpuDirty = false; +#else + (void)this; +#endif +} + +void ImageManagerPanel::flipHorizontal() { + if (m_width <= 1 || m_height <= 0) return; + for (int y = 0; y < m_height; ++y) { + for (int x = 0; x < m_width / 2; ++x) { + const size_t a = static_cast(y * m_width + x) * 4; + const size_t b = static_cast(y * m_width + (m_width - 1 - x)) * 4; + for (int c = 0; c < 4; ++c) std::swap(m_pixels[a + c], m_pixels[b + c]); + } + } +#ifdef CF_HAS_SDL3 + m_gpuDirty = true; +#endif +} + +void ImageManagerPanel::flipVertical() { + if (m_height <= 1 || m_width <= 0) return; + const size_t stride = static_cast(m_width) * 4; + for (int y = 0; y < m_height / 2; ++y) { + unsigned char* rowA = m_pixels.data() + static_cast(y) * stride; + unsigned char* rowB = m_pixels.data() + static_cast(m_height - 1 - y) * stride; + for (size_t i = 0; i < stride; ++i) std::swap(rowA[i], rowB[i]); + } +#ifdef CF_HAS_SDL3 + m_gpuDirty = true; +#endif +} + +bool ImageManagerPanel::savePng(const std::filesystem::path& path) const { + if (m_pixels.empty() || m_width <= 0 || m_height <= 0) return false; + std::filesystem::path target = path; + if (target.extension() != ".png") target += ".png"; + std::error_code ec; + if (target.has_parent_path()) std::filesystem::create_directories(target.parent_path(), ec); + return stbi_write_png(target.string().c_str(), m_width, m_height, 4, m_pixels.data(), m_width * 4) != 0; +} + +void ImageManagerPanel::onImGuiRender(EditorContext& ctx) { +#ifdef CF_HAS_IMGUI + if (!ctx.imageToOpen.empty()) { + openPath(ctx.imageToOpen); + ctx.imageToOpen.clear(); + } + if (!m_open) return; + + ImGui::SetNextWindowSize(ImVec2(860.0f, 520.0f), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Image Manager", &m_open)) { + ImGui::End(); + return; + } + + const std::filesystem::path root = + !ctx.assetRootPath.empty() ? ctx.assetRootPath : ctx.projectRootPath; + if (ImGui::Button("Refresh library") && !root.empty()) { + m_library.clear(); + std::error_code ec; + if (std::filesystem::exists(root, ec)) { + for (const auto& entry : std::filesystem::recursive_directory_iterator(root, ec)) { + if (ec || m_library.size() >= 400) break; + if (!entry.is_regular_file()) continue; + if (isImageExtension(entry.path())) m_library.push_back(entry.path()); + } + } + } + ImGui::SameLine(); + ImGui::TextDisabled("%zu images", m_library.size()); + + const float listW = 220.0f; + ImGui::BeginChild("image_library", ImVec2(listW, 0), true); + for (size_t i = 0; i < m_library.size(); ++i) { + ImGui::PushID(static_cast(i)); + const bool selected = m_library[i] == m_path; + if (ImGui::Selectable(m_library[i].filename().string().c_str(), selected)) { + openPath(m_library[i]); + } + ImGui::PopID(); + } + ImGui::EndChild(); + ImGui::SameLine(); + + ImGui::BeginChild("image_canvas_tools", ImVec2(0, 0), false); + if (m_width > 0) { + ImGui::Text("%s", m_path.filename().string().c_str()); + ImGui::SameLine(); + ImGui::TextDisabled("%d x %d", m_width, m_height); + if (ImGui::Checkbox("R", &m_showR)) { +#ifdef CF_HAS_SDL3 + m_gpuDirty = true; +#endif + } + ImGui::SameLine(); + if (ImGui::Checkbox("G", &m_showG)) { +#ifdef CF_HAS_SDL3 + m_gpuDirty = true; +#endif + } + ImGui::SameLine(); + if (ImGui::Checkbox("B", &m_showB)) { +#ifdef CF_HAS_SDL3 + m_gpuDirty = true; +#endif + } + ImGui::SameLine(); + if (ImGui::Checkbox("A", &m_showA)) { +#ifdef CF_HAS_SDL3 + m_gpuDirty = true; +#endif + } + ImGui::SameLine(); + if (ImGui::Button("Flip H")) flipHorizontal(); + ImGui::SameLine(); + if (ImGui::Button("Flip V")) flipVertical(); + ImGui::SameLine(); + if (ImGui::Button("Save PNG")) { + std::filesystem::path target = m_path; + target.replace_extension(".png"); + m_status = savePng(target) ? "Saved " + target.filename().string() : "Save failed."; + ctx.assetBrowserDirty = true; + } + ImGui::SetNextItemWidth(160.0f); + ImGui::SliderFloat("Zoom", &m_zoom, 0.1f, 8.0f, "%.2f"); + } else { + ImGui::TextDisabled("Open an image from the library or double-click one in the asset browser."); + } + if (!m_status.empty()) ImGui::TextWrapped("%s", m_status.c_str()); + +#ifdef CF_HAS_SDL3 + rebuildGpu(); +#endif + + const ImVec2 canvas = ImGui::GetContentRegionAvail(); + ImGui::InvisibleButton("image_canvas", canvas); + if (ImGui::IsItemHovered()) { + const float wheel = ImGui::GetIO().MouseWheel; + if (wheel != 0.0f) m_zoom = std::clamp(m_zoom + wheel * 0.1f, 0.1f, 8.0f); + if (ImGui::IsMouseDragging(ImGuiMouseButton_Middle) || ImGui::IsMouseDragging(ImGuiMouseButton_Right)) { + m_panX += ImGui::GetIO().MouseDelta.x; + m_panY += ImGui::GetIO().MouseDelta.y; + } + } + const ImVec2 origin = ImGui::GetItemRectMin(); + ImDrawList* draw = ImGui::GetWindowDrawList(); + draw->AddRectFilled(origin, ImVec2(origin.x + canvas.x, origin.y + canvas.y), IM_COL32(22, 24, 30, 255)); + draw->PushClipRect(origin, ImVec2(origin.x + canvas.x, origin.y + canvas.y), true); +#ifdef CF_HAS_SDL3 + if (m_texture && m_texture->Status == ImTextureStatus_OK && m_width > 0) { + const ImTextureRef tex = m_texture->GetTexRef(); + const float drawW = static_cast(m_width) * m_zoom; + const float drawH = static_cast(m_height) * m_zoom; + const ImVec2 p0(origin.x + (canvas.x - drawW) * 0.5f + m_panX, + origin.y + (canvas.y - drawH) * 0.5f + m_panY); + draw->AddImage(tex, p0, ImVec2(p0.x + drawW, p0.y + drawH)); + } +#endif + draw->PopClipRect(); + ImGui::EndChild(); + ImGui::End(); +#else + (void)ctx; +#endif +} + +} // namespace Caffeine::Editor diff --git a/src/editor/ImageManagerPanel.hpp b/src/editor/ImageManagerPanel.hpp new file mode 100644 index 00000000..9b1edfc8 --- /dev/null +++ b/src/editor/ImageManagerPanel.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include "editor/EditorContext.hpp" + +#include +#include +#include + +#ifdef CF_HAS_IMGUI +#ifdef CF_HAS_SDL3 +#include "editor/ImGuiGpuTexture.hpp" +#endif +#endif + +namespace Caffeine::Editor { + +class ImageManagerPanel { +public: + ImageManagerPanel() = default; + ~ImageManagerPanel(); + + bool isOpen() const { return m_open; } + void open() { m_open = true; } + void close() { m_open = false; } + + void openPath(const std::filesystem::path& path); + void onImGuiRender(EditorContext& ctx); + +private: + void rebuildGpu(); + void flipHorizontal(); + void flipVertical(); + bool savePng(const std::filesystem::path& path) const; + + bool m_open = false; + std::filesystem::path m_path; + std::vector m_pixels; + int m_width = 0; + int m_height = 0; + bool m_showR = true; + bool m_showG = true; + bool m_showB = true; + bool m_showA = true; + float m_zoom = 1.0f; + float m_panX = 0.0f; + float m_panY = 0.0f; + std::string m_status; + std::vector m_library; + +#ifdef CF_HAS_SDL3 + std::unique_ptr m_texture; + bool m_gpuDirty = false; +#endif +}; + +} // namespace Caffeine::Editor diff --git a/src/editor/InspectorPanel.cpp b/src/editor/InspectorPanel.cpp index dc986c41..7fe535f5 100644 --- a/src/editor/InspectorPanel.cpp +++ b/src/editor/InspectorPanel.cpp @@ -1,4 +1,7 @@ #include "editor/InspectorPanel.hpp" + +#include +#include #include "editor/EntitySnapshotExport.hpp" #include "editor/EditorPanelUtils.hpp" #include "editor/DragDropSystem.hpp" @@ -11,7 +14,12 @@ #include "physics/PhysicsComponents2D.hpp" #include "physics/PhysicsComponents3D.hpp" #include "ecs/MeshComponents.hpp" +#include "animation/AnimationPlayer.hpp" +#include "animation/SkinLibrary.hpp" +#include "effects/EffectTypes.hpp" +#include "navigation/NavVolume.hpp" #include "assets/MeshCache.hpp" +#include "assets/MeshMaterialExport.hpp" #include "editor/EditorPaths.hpp" #include "ecs/CameraComponents.hpp" #include "ecs/PostProcessComponents.hpp" @@ -143,6 +151,11 @@ void InspectorPanel::render(ECS::World& world, EditorContext& ctx) { drawTerrain(world, e, ctx); drawPostProcess(world, e, ctx); drawForwardRenderFeatures(world, e, ctx); + drawAnimationPlayer(world, e, ctx); + drawSpriteSheet(world, e, ctx); + drawSkinnedPose(world, e, ctx); + drawEffect(world, e, ctx); + drawNavAgent(world, e, ctx); ImGui::Separator(); @@ -670,6 +683,16 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont return; } + auto syncMaterial = [&](const std::string& path) { + mf->customMaterialPath = path; + if (!world.has(e)) world.add(e); + if (auto* renderer = world.get(e)) { + renderer->materialPath = path; + } + ctx.isDirty = true; + ctx.assetBrowserDirty = true; + }; + static const char* primitiveNames[] = { "Custom", "Cube", "Sphere", "Capsule", "Cylinder", "Plane", "Cone", "Pyramid", "Torus"}; int current = static_cast(mf->primitive); @@ -691,8 +714,20 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont } } if (mf->primitive == ECS::MeshPrimitive::Custom) { - if (Widgets::AssetField(ctx, "Mesh", mf->customMeshPath, ".obj;.fbx;.gltf;.glb")) + if (Widgets::AssetField(ctx, "Mesh", mf->customMeshPath, ".obj;.fbx;.gltf;.glb")) { ctx.isDirty = true; + if (mf->customMaterialPath.empty()) { + const std::string projectRoot = resolveProjectRoot(ctx).string(); + if (Assets::Mesh3D* mesh = + Assets::MeshCache::getInstance().getMesh(mf->customMeshPath, projectRoot)) { + std::filesystem::path meshFile(mf->customMeshPath); + const auto root = resolveProjectRoot(ctx); + if (!meshFile.is_absolute() && !root.empty()) meshFile = root / meshFile; + const auto materials = Assets::exportMeshMaterials(*mesh, meshFile, root, false); + if (!materials.empty()) syncMaterial(materials.front()); + } + } + } if (world.has(e)) { ImGui::TextDisabled("Texture managed by Terrain component"); } else if (Widgets::AssetField(ctx, "Albedo Texture", mf->customTexturePath, ".png;.jpg;.jpeg")) { @@ -729,6 +764,17 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont "Textura nao encontrada: %s", mf->customTexturePath.c_str()); } } + if (!mf->customMeshPath.empty() && ImGui::Button("Extract Materials")) { + const std::string projectRoot = resolveProjectRoot(ctx).string(); + if (Assets::Mesh3D* mesh = + Assets::MeshCache::getInstance().getMesh(mf->customMeshPath, projectRoot)) { + std::filesystem::path meshFile(mf->customMeshPath); + const auto root = resolveProjectRoot(ctx); + if (!meshFile.is_absolute() && !root.empty()) meshFile = root / meshFile; + const auto materials = Assets::exportMeshMaterials(*mesh, meshFile, root, true); + if (!materials.empty()) syncMaterial(materials.front()); + } + } if (!mf->customMeshPath.empty()) { const std::string ext = std::filesystem::path(mf->customMeshPath).extension().string(); if (ext == ".fbx" || ext == ".FBX") { @@ -750,8 +796,9 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont } if (!world.has(e)) { - if (Widgets::AssetField(ctx, "Material", mf->customMaterialPath, ".mat")) - ctx.isDirty = true; + if (Widgets::AssetField(ctx, "Material", mf->customMaterialPath, ".mat")) { + syncMaterial(mf->customMaterialPath); + } if (!mf->customMaterialPath.empty() && ImGui::Button("Edit Material")) { ctx.materialToOpen = mf->customMaterialPath; } @@ -1484,6 +1531,286 @@ void InspectorPanel::savePrefab(ECS::World& world, ECS::Entity e, const std::fil } } +void InspectorPanel::drawEffect(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + Effects::EffectComponent* effect = world.get(e); + if (!effect) return; + bool enabled = effect->enabled != 0; + bool removeRequested = false; + const bool open = Widgets::ComponentHeader("Effect", enabled, removeRequested, "beer"); + if (enabled != (effect->enabled != 0)) { + effect->enabled = enabled ? 1 : 0; + ctx.isDirty = true; + } + if (removeRequested) { + world.remove(e); + ctx.isDirty = true; + return; + } + if (!open) return; + const char* kinds[] = {"Particles", "Volumetric Light", "Reflective Surface", "Material Shade", "Fog"}; + int kind = static_cast(effect->kind); + if (ImGui::Combo("Kind", &kind, kinds, 5)) { + effect->kind = static_cast(kind); + if (effect->kind == static_cast(Effects::EffectKind::ReflectiveSurface) && effect->reflection <= 0.0f) { + effect->reflection = 0.85f; + } + if (effect->kind == static_cast(Effects::EffectKind::Fog)) { + Effects::configureFog(*effect, static_cast(effect->domain), + static_cast(effect->pad0 > 3 ? 0 : effect->pad0)); + } + ctx.isDirty = true; + } + const char* spaces[] = {"World", "Camera"}; + int space = static_cast(effect->space); + if (ImGui::Combo("Space", &space, spaces, 2)) { + effect->space = static_cast(space); + ctx.isDirty = true; + } + const char* domains[] = {"2D and 3D", "2D", "3D"}; + int domain = static_cast(effect->domain); + if (ImGui::Combo("Domain", &domain, domains, 3)) { + effect->domain = static_cast(domain); + ctx.isDirty = true; + } + const char* qualities[] = {"Performance", "Balanced", "Quality"}; + int quality = static_cast(effect->quality); + if (ImGui::Combo("Quality", &quality, qualities, 3)) { + effect->quality = static_cast(quality); + ctx.isDirty = true; + } + char path[260] = {}; + std::strncpy(path, effect->materialPath, sizeof(path) - 1); + if (ImGui::InputText("Material", path, sizeof(path))) { + std::memset(effect->materialPath, 0, sizeof(effect->materialPath)); + std::strncpy(effect->materialPath, path, sizeof(effect->materialPath) - 1); + ctx.isDirty = true; + } + if (effect->kind == static_cast(Effects::EffectKind::Particles)) { + if (ImGui::DragFloat("Rate", &effect->rate, 0.5f, 0.0f, 400.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Lifetime", &effect->lifetime, 0.02f, 0.05f, 20.0f)) ctx.isDirty = true; + int cap = effect->maxParticles; + if (ImGui::DragInt("Max", &cap, 1, 1, 2048)) { + effect->maxParticles = cap; + ctx.isDirty = true; + } + if (ImGui::DragFloat("Start Size", &effect->startSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("End Size", &effect->endSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Gravity Y", &effect->gravity.y, 0.05f, -20.0f, 20.0f)) ctx.isDirty = true; + } else if (effect->kind == static_cast(Effects::EffectKind::VolumetricLight)) { + const char* volumeShapes[] = {"Sphere", "Cone", "Box", "Cylinder", "Window"}; + int shape = static_cast(Effects::volumetricShapeOf(*effect)); + if (ImGui::Combo("Format", &shape, volumeShapes, 5)) { + const Vec3 color = effect->lightColor; + Effects::configureVolumetricLight(*effect, static_cast(shape)); + effect->lightColor = color; + ctx.isDirty = true; + } + const Effects::VolumetricShape volume = Effects::volumetricShapeOf(*effect); + if (volume == Effects::VolumetricShape::Sphere) { + if (ImGui::DragFloat("Radius", &effect->radius, 0.05f, 0.1f, 40.0f)) ctx.isDirty = true; + } else { + if (ImGui::DragFloat("Length", &effect->radius, 0.05f, 0.2f, 40.0f)) ctx.isDirty = true; + if (volume == Effects::VolumetricShape::Cone) { + if (ImGui::DragFloat("Near", &effect->startSize, 0.01f, 0.05f, 8.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Far", &effect->endSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; + } else if (volume == Effects::VolumetricShape::Cylinder) { + if (ImGui::DragFloat("Diameter", &effect->startSize, 0.01f, 0.05f, 8.0f)) { + effect->endSize = effect->startSize; + ctx.isDirty = true; + } + } else { + if (ImGui::DragFloat("Width", &effect->startSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Height", &effect->endSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; + } + if (volume == Effects::VolumetricShape::Window) { + u32 columns = 1; + u32 rows = 1; + Effects::volumetricGridOf(*effect, columns, rows); + int columnCount = static_cast(columns); + int rowCount = static_cast(rows); + if (ImGui::SliderInt("Columns", &columnCount, 1, 8)) { + Effects::setVolumetricGrid(*effect, static_cast(columnCount), rows); + ctx.isDirty = true; + } + if (ImGui::SliderInt("Rows", &rowCount, 1, 8)) { + Effects::setVolumetricGrid(*effect, static_cast(columnCount), static_cast(rowCount)); + ctx.isDirty = true; + } + } + } + if (ImGui::DragFloat("Density", &effect->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Anisotropy", &effect->anisotropy, 0.0f, 0.9f)) ctx.isDirty = true; + if (ImGui::DragFloat("Intensity", &effect->intensity, 0.05f, 0.0f, 16.0f)) ctx.isDirty = true; + if (ImGui::ColorEdit3("Light", &effect->lightColor.x)) ctx.isDirty = true; + } else if (effect->kind == static_cast(Effects::EffectKind::Fog)) { + const char* looks[] = {"Fog", "Dust", "Mist", "Smoke"}; + int style = static_cast(effect->pad0 > 3 ? 0 : effect->pad0); + if (ImGui::Combo("Look", &style, looks, 4)) { + Effects::configureFog(*effect, static_cast(effect->domain), + static_cast(style)); + ctx.isDirty = true; + } + if (ImGui::DragFloat("Radius", &effect->radius, 0.05f, 0.1f, 40.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Density", &effect->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Intensity", &effect->intensity, 0.02f, 0.0f, 4.0f)) ctx.isDirty = true; + if (ImGui::ColorEdit3("Color", &effect->lightColor.x)) ctx.isDirty = true; + } else if (effect->kind == static_cast(Effects::EffectKind::ReflectiveSurface)) { + if (ImGui::SliderFloat("Reflection", &effect->reflection, 0.0f, 1.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Roughness", &effect->roughness, 0.02f, 1.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Metallic", &effect->metallic, 0.0f, 1.0f)) ctx.isDirty = true; + const char* modes[] = {"Inherit", "Probe", "Planar", "Screen"}; + int mode = static_cast(effect->reflectMode); + if (ImGui::Combo("Reflect Mode", &mode, modes, 4)) { + effect->reflectMode = static_cast(mode); + ctx.isDirty = true; + } + ImGui::TextDisabled("Performance 8 steps, balanced 24, quality 48. The scene reflection mode still chooses the technique."); + } else { + if (ImGui::ColorEdit3("Tint", &effect->tint.x)) ctx.isDirty = true; + if (ImGui::DragFloat("Emission", &effect->emissionBoost, 0.05f, 0.0f, 8.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Roughness Bias", &effect->roughnessBias, 0.01f, -1.0f, 1.0f)) ctx.isDirty = true; + } +} + +void InspectorPanel::drawSpriteSheet(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + Animation::SpriteSheet* sheet = world.get(e); + if (!sheet) return; + bool enabled = true; + bool removeRequested = false; + if (!Widgets::ComponentHeader("Sprite Sheet", enabled, removeRequested, "beer")) return; + if (removeRequested) { + world.remove(e); + ctx.isDirty = true; + return; + } + int columns = static_cast(sheet->columns); + int rows = static_cast(sheet->rows); + int frames = static_cast(sheet->frameCount); + if (ImGui::DragInt("Columns", &columns, 1, 1, 64)) { + sheet->columns = static_cast(columns); + ctx.isDirty = true; + } + if (ImGui::DragInt("Rows", &rows, 1, 1, 64)) { + sheet->rows = static_cast(rows); + ctx.isDirty = true; + } + if (ImGui::DragInt("Frame Count", &frames, 1, 1, 4096)) { + sheet->frameCount = static_cast(frames); + ctx.isDirty = true; + } + ImGui::TextDisabled("O frame do sprite escolhe a celula. Clipes e o animator avancam esse indice."); +} + +void InspectorPanel::drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + Animation::SkinnedPose* pose = world.get(e); + if (!pose) return; + bool enabled = true; + bool removeRequested = false; + if (!Widgets::ComponentHeader("Skinned Mesh", enabled, removeRequested, "arrows-diagonal")) return; + if (removeRequested) { + world.remove(e); + ctx.isDirty = true; + return; + } + char path[260] = {}; + std::strncpy(path, pose->meshPath, sizeof(path) - 1); + if (ImGui::InputText("Mesh", path, sizeof(path))) { + std::memset(pose->meshPath, 0, sizeof(pose->meshPath)); + std::strncpy(pose->meshPath, path, sizeof(pose->meshPath) - 1); + pose->loaded = false; + ctx.isDirty = true; + } + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + if (!skin || skin->clipNames.empty()) { + ImGui::TextDisabled("Sem clipes esqueleticos. Usa um glTF/GLB com pele."); + } else { + const char* preview = skin->clipNames[static_cast( + std::clamp(pose->clipIndex, 0, static_cast(skin->clipNames.size()) - 1))].c_str(); + if (ImGui::BeginCombo("Clip", preview)) { + for (int i = 0; i < static_cast(skin->clipNames.size()); ++i) { + if (ImGui::Selectable(skin->clipNames[static_cast(i)].c_str(), pose->clipIndex == i)) { + pose->clipIndex = i; + pose->time = 0.0f; + pose->playing = true; + ctx.isDirty = true; + } + } + ImGui::EndCombo(); + } + } + if (ImGui::DragFloat("Time", &pose->time, 0.01f, 0.0f, 1000.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Speed", &pose->speed, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; + if (ImGui::Checkbox("Playing", &pose->playing)) ctx.isDirty = true; + if (ImGui::Checkbox("Loop", &pose->loop)) ctx.isDirty = true; + if (pose->humanoid.matched) { + ImGui::TextDisabled("Humanoide"); + for (int i = 0; i < static_cast(Animation::HumanoidBone::Count); ++i) { + const i32 bone = pose->humanoid.bones[i]; + if (bone < 0 || !skin || bone >= static_cast(skin->boneNames.size())) continue; + ImGui::BulletText("%s: %s", Animation::humanoidBoneName(static_cast(i)), + skin->boneNames[static_cast(bone)].c_str()); + } + } else if (skin && !skin->boneNames.empty()) { + ImGui::TextDisabled("Modelo geral, %d ossos", static_cast(skin->boneNames.size())); + } +} + +void InspectorPanel::drawAnimationPlayer(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + if (!world.has(e)) return; + bool enabled = true; + bool removeRequested = false; + if (!Widgets::ComponentHeader("Animation Player", enabled, removeRequested, "arrows-horizontal")) return; + if (removeRequested) { + world.remove(e); + ctx.isDirty = true; + return; + } + auto* player = world.get(e); + if (!player) return; + ImGui::PushID("anim_player"); + char path[260] = {}; + std::strncpy(path, player->clipPath, sizeof(path) - 1); + if (ImGui::InputText("Clip", path, sizeof(path))) { + Animation::setPlayerPath(*player, path); + player->loaded = false; + ctx.isDirty = true; + } + if (ImGui::DragFloat("Speed", &player->speed, 0.05f, 0.0f, 8.0f)) ctx.isDirty = true; + if (ImGui::Checkbox("Playing", &player->playing)) ctx.isDirty = true; + if (ImGui::Checkbox("Loop", &player->loop)) ctx.isDirty = true; + ImGui::PopID(); +} + +void InspectorPanel::drawNavAgent(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + if (!world.has(e)) return; + bool enabled = true; + bool removeRequested = false; + if (!Widgets::ComponentHeader("Nav Agent", enabled, removeRequested)) return; + if (removeRequested) { + world.remove(e); + ctx.isDirty = true; + return; + } + auto* agent = world.get(e); + if (!agent) return; + ImGui::PushID("nav_agent"); + int mode = static_cast(agent->mode); + const char* modes[] = {"Idle", "Patrol", "Follow", "Scripted"}; + if (ImGui::Combo("Behaviour", &mode, modes, 4)) { + agent->mode = static_cast(mode); + agent->planDirty = true; + ctx.isDirty = true; + } + if (ImGui::DragFloat("Speed", &agent->speed, 0.05f, 0.0f, 40.0f)) ctx.isDirty = true; + if (ImGui::DragFloat3("Destination", &agent->destination.x, 0.1f)) { + agent->hasDestination = true; + agent->planDirty = true; + ctx.isDirty = true; + } + ImGui::TextDisabled("Patrol points %u", agent->patrolCount); + ImGui::PopID(); +} + } // namespace Caffeine::Editor #endif // CF_HAS_IMGUI diff --git a/src/editor/InspectorPanel.hpp b/src/editor/InspectorPanel.hpp index a4079b95..87bbeb9e 100644 --- a/src/editor/InspectorPanel.hpp +++ b/src/editor/InspectorPanel.hpp @@ -60,6 +60,11 @@ class InspectorPanel { void drawTerrain(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawPostProcess(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawForwardRenderFeatures(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawAnimationPlayer(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawSpriteSheet(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawEffect(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawNavAgent(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawPrefabInstance(ECS::World& world, ECS::Entity e, EditorContext& ctx); void savePrefab(ECS::World& world, ECS::Entity e, const std::filesystem::path& path); diff --git a/src/editor/MaterialEditorPanel.cpp b/src/editor/MaterialEditorPanel.cpp index 92054632..8e78fa74 100644 --- a/src/editor/MaterialEditorPanel.cpp +++ b/src/editor/MaterialEditorPanel.cpp @@ -3,12 +3,15 @@ #include "assets/MaterialCache.hpp" #include "assets/MaterialFile.hpp" #include "assets/MaterialPresets.hpp" +#include "ecs/MeshComponents.hpp" +#include "editor/FilePicker.hpp" #include "editor/InspectorWidgets.hpp" #include "scene/EnvironmentSystem.hpp" #include #include +#include #include #include @@ -42,22 +45,89 @@ void MaterialEditorPanel::publishLive() { Assets::MaterialCache::instance().publish(m_materialPath.string(), m_projectRoot, m_surface); } -bool MaterialEditorPanel::saveCurrent() { - if (m_materialPath.empty()) { - m_status = "Create the .mat from the asset browser, then open it."; - return false; +bool MaterialEditorPanel::saveToPath(const std::filesystem::path& path) { + std::filesystem::path target = path; + if (target.extension() != ".mat") { + target += ".mat"; } - const std::filesystem::path path = resolvedPath(m_materialPath); - if (!Assets::saveMaterialFile(path, m_surface)) { + if (!Assets::saveMaterialFile(target, m_surface)) { m_status = "Save failed."; return false; } - m_materialPath = path; + if (!m_projectRoot.empty()) { + std::error_code ec; + const auto relative = std::filesystem::relative(target, m_projectRoot, ec); + if (!ec && !relative.empty() && relative.generic_string().rfind("..") != 0) { + m_materialPath = relative; + } else { + m_materialPath = target; + } + } else { + m_materialPath = target; + } publishLive(); m_status.clear(); + m_refreshAssets = true; + return true; +} + +bool MaterialEditorPanel::saveCurrent() { + if (m_materialPath.empty()) { + m_pendingSaveAs = true; + return false; + } + return saveToPath(resolvedPath(m_materialPath)); +} + +void MaterialEditorPanel::handleSaveShortcut() { + if (m_materialPath.empty()) { + m_pendingSaveAs = true; + return; + } + saveCurrent(); +} + +bool MaterialEditorPanel::createInAssetBrowser(EditorContext& ctx) { + const std::filesystem::path root = !ctx.assetRootPath.empty() + ? ctx.assetRootPath + : (m_projectRoot.empty() ? std::filesystem::path("assets") + : std::filesystem::path(m_projectRoot) / "assets"); + const std::filesystem::path dir = root / "materials"; + std::error_code ec; + std::filesystem::create_directories(dir, ec); + + std::string stem = m_surface.name.empty() ? "Material" : m_surface.name; + for (char& c : stem) { + const unsigned char uc = static_cast(c); + if (!std::isalnum(uc) && c != '_' && c != '-') c = '_'; + } + std::filesystem::path target = dir / (stem + ".mat"); + int suffix = 1; + while (std::filesystem::exists(target, ec)) { + target = dir / (stem + "_" + std::to_string(suffix++) + ".mat"); + } + if (!saveToPath(target)) return false; + ctx.assetBrowserNavigateTo = dir; + applyToSelection(ctx); + m_status = "Created " + target.filename().string(); return true; } +void MaterialEditorPanel::applyToSelection(EditorContext& ctx) { + if (!ctx.activeWorld || !ctx.selectedEntity.isValid() || m_materialPath.empty()) return; + ECS::World& world = *ctx.activeWorld; + ECS::Entity entity = ctx.selectedEntity; + if (!world.has(entity)) return; + ECS::MeshFilterComponent* filter = world.get(entity); + if (!filter) return; + filter->customMaterialPath = m_materialPath.generic_string(); + if (!world.has(entity)) world.add(entity); + if (ECS::MeshRendererComponent* renderer = world.get(entity)) { + renderer->materialPath = filter->customMaterialPath; + } + ctx.isDirty = true; +} + bool MaterialEditorPanel::openFromPath(const std::filesystem::path& path) { const std::filesystem::path resolved = resolvedPath(path); Assets::MaterialSurface loaded; @@ -74,22 +144,27 @@ bool MaterialEditorPanel::openFromPath(const std::filesystem::path& path) { void MaterialEditorPanel::renderPresetPicker() { Widgets::setWidthForLabel("Preset"); - if (!ImGui::BeginCombo("Preset", "Apply a preset...")) return; + if (!ImGui::BeginCombo("##mat_preset", "Apply a preset...")) return; std::string_view category; + int index = 0; for (const Assets::MaterialPreset& preset : Assets::materialPresets()) { if (preset.category != category) { category = preset.category; ImGui::SeparatorText(std::string(category).c_str()); } - if (ImGui::Selectable(std::string(preset.name).c_str())) { + ImGui::PushID(index++); + const std::string label(preset.name); + if (ImGui::Selectable(label.c_str())) { Assets::applyMaterialPreset(preset.surface, m_surface); publishLive(); } + ImGui::PopID(); } ImGui::EndCombo(); } void MaterialEditorPanel::renderProperties(EditorContext& ctx) { + ImGui::PushID("MatProps"); bool changed = false; auto slider = [&](const char* label, float& value, float lo, float hi, const char* fmt = "%.2f") { Widgets::setWidthForLabel(label); @@ -108,14 +183,17 @@ void MaterialEditorPanel::renderProperties(EditorContext& ctx) { const std::string& currentName = m_surface.name; const size_t copy = currentName.size() < sizeof(name) - 1 ? currentName.size() : sizeof(name) - 1; currentName.copy(name, copy); + ImGui::AlignTextToFramePadding(); + ImGui::TextUnformatted("Name"); + ImGui::SameLine(); Widgets::setWidthForLabel("Name"); - if (ImGui::InputText("Name", name, sizeof(name))) { + if (ImGui::InputText("##mat_name", name, sizeof(name))) { m_surface.name = name; changed = true; } renderPresetPicker(); - if (ImGui::CollapsingHeader("Surface", ImGuiTreeNodeFlags_DefaultOpen)) { + if (ImGui::CollapsingHeader("Surface##mat_surface", ImGuiTreeNodeFlags_DefaultOpen)) { float albedo[4] = {m_surface.albedo.x, m_surface.albedo.y, m_surface.albedo.z, m_surface.albedo.w}; Widgets::setWidthForLabel("Albedo"); if (ImGui::ColorEdit4("Albedo", albedo)) { @@ -128,7 +206,7 @@ void MaterialEditorPanel::renderProperties(EditorContext& ctx) { ImGui::TextDisabled("Metallic 1 + roughness 0 is a perfect mirror."); } - if (ImGui::CollapsingHeader("Maps & UV", ImGuiTreeNodeFlags_DefaultOpen)) { + if (ImGui::CollapsingHeader("Maps & UV##mat_maps", ImGuiTreeNodeFlags_DefaultOpen)) { if (Widgets::AssetField(ctx, "Albedo Map", m_surface.albedoMap, ".png;.jpg;.jpeg")) changed = true; if (Widgets::AssetField(ctx, "Normal Map", m_surface.normalMap, ".png;.jpg;.jpeg")) changed = true; slider("Normal Strength", m_surface.normalStrength, 0.0f, 4.0f); @@ -139,7 +217,7 @@ void MaterialEditorPanel::renderProperties(EditorContext& ctx) { if (Widgets::DragVec2("UV Offset", m_surface.uvOffset, 0.01f)) changed = true; } - if (ImGui::CollapsingHeader("Transparency")) { + if (ImGui::CollapsingHeader("Transparency##mat_alpha")) { int mode = static_cast(m_surface.alphaMode); const char* modes[] = {"Opaque", "Cutout", "Blend"}; Widgets::setWidthForLabel("Alpha Mode"); @@ -156,23 +234,59 @@ void MaterialEditorPanel::renderProperties(EditorContext& ctx) { ImGui::TextDisabled("Water 1.33, ice 1.31, glass 1.5, diamond 2.42."); } - if (ImGui::CollapsingHeader("Clear Coat")) { + if (ImGui::CollapsingHeader("Clear Coat##mat_coat")) { slider("Clear Coat", m_surface.clearcoat, 0.0f, 1.0f); slider("Coat Roughness", m_surface.clearcoatRoughness, 0.0f, 1.0f, "%.3f"); } - if (ImGui::CollapsingHeader("Sheen")) { + if (ImGui::CollapsingHeader("Sheen##mat_sheen")) { color3("Sheen Color", m_surface.sheenColor); slider("Sheen Roughness", m_surface.sheenRoughness, 0.0f, 1.0f); } - if (ImGui::CollapsingHeader("Iridescence")) { + if (ImGui::CollapsingHeader("Reflection##mat_reflect")) { + slider("Reflection", m_surface.reflection, 0.0f, 1.0f); + ImGui::TextDisabled("Both modules are optional. Together, quality raises the march and performance still caps it."); + + bool performance = m_surface.reflectionPerformance != 0; + if (ImGui::Checkbox("Performance##mat_ssr_perf", &performance)) { + m_surface.reflectionPerformance = performance ? 1 : 0; + changed = true; + } + if (performance) { + slider("SSR Resolution", m_surface.ssrResolution, 0.25f, 1.0f, "%.2f"); + slider("Max Ray Steps", m_surface.ssrMaxSteps, 4.0f, 64.0f, "%.0f"); + slider("Temporal Reuse", m_surface.ssrTemporalFrames, 1.0f, 8.0f, "%.0f frames"); + slider("Distance Fade", m_surface.ssrDistance, 1.0f, 80.0f, "%.0f m"); + ImGui::TextDisabled("Half resolution, fewer steps on rough surfaces, and a dithered march."); + } + + bool quality = m_surface.reflectionQuality != 0; + if (ImGui::Checkbox("Quality##mat_ssr_quality", &quality)) { + m_surface.reflectionQuality = quality ? 1 : 0; + changed = true; + } + if (quality) { + slider("SSR Samples", m_surface.ssrSamples, 4.0f, 64.0f, "%.0f"); + slider("Denoise Strength", m_surface.ssrDenoise, 0.0f, 1.0f); + bool planar = m_surface.reflectionPlanar != 0; + if (ImGui::Checkbox("Planar##mat_ssr_planar", &planar)) { + m_surface.reflectionPlanar = planar ? 1 : 0; + changed = true; + } + slider("Probe Blend", m_surface.ssrProbeBlend, 1.0f, 8.0f, "%.0f"); + slider("Bounce Count", m_surface.ssrBounces, 0.0f, 2.0f, "%.0f"); + ImGui::TextDisabled("Denoise uses the previous frame. Planar is only this surface. Probes stay cached."); + } + } + + if (ImGui::CollapsingHeader("Iridescence##mat_iri")) { slider("Iridescence", m_surface.iridescence, 0.0f, 1.0f); slider("Film Thickness", m_surface.iridescenceThickness, 100.0f, 1200.0f, "%.0f nm"); slider("Film IOR", m_surface.iridescenceIor, 1.0f, 2.5f, "%.2f"); } - if (ImGui::CollapsingHeader("Emission")) { + if (ImGui::CollapsingHeader("Emission##mat_emit")) { color3("Emission", m_surface.emission); slider("Emission Strength", m_surface.emissionStrength, 0.0f, 50.0f); if (Widgets::AssetField(ctx, "Emission Map", m_surface.emissionMap, ".png;.jpg;.jpeg")) changed = true; @@ -189,9 +303,11 @@ void MaterialEditorPanel::renderProperties(EditorContext& ctx) { if (!m_status.empty()) { ImGui::TextWrapped("%s", m_status.c_str()); } + ImGui::PopID(); } void MaterialEditorPanel::renderPreview(const EditorContext& ctx, float width, float height) { + ImGui::PushID("MatPreview"); const float side = std::max(1.0f, std::min(width, height)); const ImVec2 start = ImGui::GetCursorPos(); bool drewImage = false; @@ -235,18 +351,22 @@ void MaterialEditorPanel::renderPreview(const EditorContext& ctx, float width, f } Widgets::setWidthForLabel("Orbit"); - ImGui::SliderFloat("Orbit", &m_previewRotation, 0.0f, 360.0f, "%.0f deg"); + ImGui::SliderFloat("##preview_orbit", &m_previewRotation, 0.0f, 360.0f, "Orbit %.0f deg"); Widgets::setWidthForLabel("Height"); - ImGui::SliderFloat("Height", &m_previewPitch, -30.0f, 70.0f, "%.0f deg"); + ImGui::SliderFloat("##preview_pitch", &m_previewPitch, -30.0f, 70.0f, "Height %.0f deg"); ImGui::Checkbox("Floor", &m_previewFloor); + ImGui::PopID(); } void MaterialEditorPanel::onImGuiRender(EditorContext& ctx) { if (!m_open) return; ImGui::Begin("Material Editor", &m_open, ImGuiWindowFlags_MenuBar); + if (ImGui::Shortcut(ImGuiMod_Ctrl | ImGuiKey_S, ImGuiInputFlags_RouteFocused)) { + handleSaveShortcut(); + } if (ImGui::BeginMenuBar()) { - if (ImGui::BeginMenu("File")) { + if (ImGui::BeginMenu("File##MaterialEditor")) { if (ImGui::MenuItem("New")) { m_surface = Assets::MaterialSurface{}; m_surface.valid = true; @@ -254,7 +374,10 @@ void MaterialEditorPanel::onImGuiRender(EditorContext& ctx) { m_materialPath.clear(); m_status.clear(); } - if (ImGui::MenuItem("Save", "Ctrl+S")) saveCurrent(); + if (ImGui::MenuItem("Create in Asset Browser")) createInAssetBrowser(ctx); + if (ImGui::MenuItem("Save", "Ctrl+S")) handleSaveShortcut(); + if (ImGui::MenuItem("Save As...")) m_pendingSaveAs = true; + if (ImGui::MenuItem("Apply to Selected")) applyToSelection(ctx); ImGui::EndMenu(); } ImGui::EndMenuBar(); @@ -274,6 +397,34 @@ void MaterialEditorPanel::onImGuiRender(EditorContext& ctx) { renderPreview(ctx, previewAvail.x, previewAvail.y - controlsH); } ImGui::EndChild(); + + m_wasFocusedLastFrame = + ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); + + if (m_pendingSaveAs) { + const std::filesystem::path start = + m_materialPath.empty() + ? (m_projectRoot.empty() ? std::filesystem::path(".") + : std::filesystem::path(m_projectRoot) / "materials") + : m_materialPath.parent_path(); + if (auto selected = + FilePicker::pickPath(FilePicker::Mode::SaveFile, "Save Material", start)) { + if (saveToPath(*selected)) { + ctx.assetBrowserNavigateTo = selected->parent_path(); + applyToSelection(ctx); + } + m_pendingSaveAs = false; + } else if (FilePicker::consumeCloseEvent("Save Material")) { + m_pendingSaveAs = false; + } + } + + if (m_refreshAssets) { + ctx.assetBrowserDirty = true; + applyToSelection(ctx); + m_refreshAssets = false; + } + ImGui::End(); } diff --git a/src/editor/MaterialEditorPanel.hpp b/src/editor/MaterialEditorPanel.hpp index c0c18ed7..6f6fabfe 100644 --- a/src/editor/MaterialEditorPanel.hpp +++ b/src/editor/MaterialEditorPanel.hpp @@ -19,6 +19,8 @@ class MaterialEditorPanel { void onImGuiRender(EditorContext& ctx); bool openFromPath(const std::filesystem::path& path); + bool wasFocusedLastFrame() const { return m_wasFocusedLastFrame; } + void handleSaveShortcut(); void setProjectRoot(const std::string& projectRoot) { m_projectRoot = projectRoot; } void open() { m_open = true; } @@ -36,10 +38,16 @@ class MaterialEditorPanel { void renderPresetPicker(); void renderPreview(const EditorContext& ctx, float width, float height); bool saveCurrent(); + bool saveToPath(const std::filesystem::path& path); + bool createInAssetBrowser(EditorContext& ctx); + void applyToSelection(EditorContext& ctx); void publishLive(); std::filesystem::path resolvedPath(const std::filesystem::path& path) const; bool m_open = true; + bool m_wasFocusedLastFrame = false; + bool m_pendingSaveAs = false; + bool m_refreshAssets = false; float m_previewRotation = 0.0f; float m_previewPitch = 12.0f; bool m_previewFloor = true; diff --git a/src/editor/ParticleEditorPanel.cpp b/src/editor/ParticleEditorPanel.cpp new file mode 100644 index 00000000..dfb0f0c9 --- /dev/null +++ b/src/editor/ParticleEditorPanel.cpp @@ -0,0 +1,146 @@ +#include "editor/ParticleEditorPanel.hpp" + +#include "editor/EffectObjectFactory.hpp" +#include "effects/EffectTypes.hpp" +#include "ecs/ComponentQuery.hpp" + +#ifdef CF_HAS_IMGUI +#include +#endif + +#include +#include + +namespace Caffeine::Editor { +namespace { + +const char* particleLabel(const Effects::EffectComponent& effect) { + switch (static_cast(effect.domain)) { + case Effects::EffectDomain::TwoD: return "2D Particle"; + case Effects::EffectDomain::ThreeD: return "3D Particle"; + case Effects::EffectDomain::Both: break; + } + return "Particle"; +} + +bool dragFloat(const char* label, f32& value, f32 speed, f32 lo, f32 hi) { +#ifdef CF_HAS_IMGUI + return ImGui::DragFloat(label, &value, speed, lo, hi); +#else + (void)label; (void)value; (void)speed; (void)lo; (void)hi; + return false; +#endif +} + +} // namespace + +void ParticleEditorPanel::onImGuiRender(EditorContext& ctx) { +#ifdef CF_HAS_IMGUI + if (!m_open) return; + ImGui::Begin("Particles", &m_open); + ECS::World* world = ctx.activeWorld; + if (!world) { + ImGui::TextDisabled("Open a scene to edit particles."); + ImGui::End(); + return; + } + + if (ImGui::Button("Create 3D Particle")) { + Effects::EffectComponent effect; + Effects::configureParticle(effect, Effects::EffectDomain::ThreeD); + spawnEffectObject(*world, ctx, "Particle 3D", effect, false); + } + ImGui::SameLine(); + if (ImGui::Button("Create 2D Particle")) { + Effects::EffectComponent effect; + Effects::configureParticle(effect, Effects::EffectDomain::TwoD); + spawnEffectObject(*world, ctx, "Particle 2D", effect, true); + } + ImGui::TextDisabled("caffeine.effects.particle(entity, domain) domain 1 = 2D, 2 = 3D"); + ImGui::TextDisabled("caffeine.effects.particleParams(entity, rate, life, max, startSize, endSize, gravityY)"); + + std::vector particles; + ECS::ComponentQuery query; + query.with(); + world->forEach(query, [&](ECS::Entity entity, Effects::EffectComponent& effect) { + if (static_cast(effect.kind) == Effects::EffectKind::Particles) { + particles.push_back(entity); + } + }); + + ImGui::Separator(); + Effects::EffectComponent* selected = nullptr; + ECS::Entity selectedEntity = ECS::Entity::INVALID; + for (ECS::Entity entity : particles) { + Effects::EffectComponent* effect = world->get(entity); + if (!effect) continue; + char row[160]; + std::snprintf(row, sizeof(row), "%s %s##particle_%u", particleLabel(*effect), + getEntityName(*world, entity), entity.id()); + const bool current = ctx.selectedEntity.isValid() && ctx.selectedEntity.id() == entity.id(); + if (ImGui::Selectable(row, current)) ctx.selectEntity(entity); + if (ctx.selectedEntity.isValid() && ctx.selectedEntity.id() == entity.id()) { + selected = effect; + selectedEntity = entity; + } + } + if (particles.empty()) ImGui::TextDisabled("No particle objects in this scene."); + + if (!selected || !selectedEntity.isValid()) { + ImGui::End(); + return; + } + + ImGui::Separator(); + ImGui::TextUnformatted(getEntityName(*world, selectedEntity)); + bool enabled = selected->enabled != 0; + if (ImGui::Checkbox("Enabled", &enabled)) { + selected->enabled = enabled ? 1 : 0; + ctx.isDirty = true; + } + int domain = static_cast(selected->domain); + const char* domains[] = {"2D and 3D", "2D", "3D"}; + if (ImGui::Combo("Domain", &domain, domains, 3)) { + selected->domain = static_cast(domain); + ctx.isDirty = true; + } + const char* spaces[] = {"World", "Camera"}; + int space = static_cast(selected->space); + if (ImGui::Combo("Space", &space, spaces, 2)) { + selected->space = static_cast(space); + ctx.isDirty = true; + } + if (dragFloat("Rate", selected->rate, 0.5f, 0.0f, 400.0f)) ctx.isDirty = true; + if (dragFloat("Lifetime", selected->lifetime, 0.02f, 0.05f, 20.0f)) ctx.isDirty = true; + int cap = selected->maxParticles; + if (ImGui::DragInt("Max", &cap, 1.0f, 1, 2048)) { + selected->maxParticles = cap; + ctx.isDirty = true; + } + if (dragFloat("Start Size", selected->startSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; + if (dragFloat("End Size", selected->endSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; + if (ImGui::ColorEdit4("Start Color", &selected->startColor.x)) ctx.isDirty = true; + if (ImGui::ColorEdit4("End Color", &selected->endColor.x)) ctx.isDirty = true; + if (ImGui::DragFloat3("Velocity Min", &selected->velocityMin.x, 0.02f)) ctx.isDirty = true; + if (ImGui::DragFloat3("Velocity Max", &selected->velocityMax.x, 0.02f)) ctx.isDirty = true; + if (ImGui::DragFloat3("Gravity", &selected->gravity.x, 0.05f)) ctx.isDirty = true; + if (dragFloat("Drag", selected->drag, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; + char path[260] = {}; + std::snprintf(path, sizeof(path), "%s", selected->materialPath); + if (ImGui::InputText("Material", path, sizeof(path))) { + std::snprintf(selected->materialPath, sizeof(selected->materialPath), "%s", path); + ctx.isDirty = true; + } + if (ImGui::Button("Delete Particle")) { + ctx.beginUndo(EditorCommand::RemoveEntity, selectedEntity.id(), *world); + world->destroy(selectedEntity); + ctx.isDirty = true; + ctx.endUndo(*world); + } + ImGui::End(); +#else + (void)ctx; +#endif +} + +} // namespace Caffeine::Editor diff --git a/src/editor/ParticleEditorPanel.hpp b/src/editor/ParticleEditorPanel.hpp new file mode 100644 index 00000000..bf699dc5 --- /dev/null +++ b/src/editor/ParticleEditorPanel.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "core/Types.hpp" +#include "editor/EditorContext.hpp" + +namespace Caffeine::Editor { + +/// Authors basic 2D and 3D particle objects. Simulation stays on EffectComponent. +class ParticleEditorPanel { +public: + bool isOpen() const { return m_open; } + void open() { m_open = true; } + void close() { m_open = false; } + + void onImGuiRender(EditorContext& ctx); + +private: + bool m_open = false; +}; + +} // namespace Caffeine::Editor diff --git a/src/editor/SceneEditor.cpp b/src/editor/SceneEditor.cpp index 60ab65c5..6dfeb45d 100644 --- a/src/editor/SceneEditor.cpp +++ b/src/editor/SceneEditor.cpp @@ -15,6 +15,9 @@ #include "editor/EditorPaths.hpp" #include "scene/HierarchySystem.hpp" #include "scene/PlayMode2D.hpp" +#include "navigation/NavigationSystem.hpp" +#include "effects/EffectSystem.hpp" +#include "editor/EditorCameraMath.hpp" #include "procedural/ProceduralWorldSystem.hpp" #include "script/ScriptTypes.hpp" #include "events/Events.hpp" @@ -42,6 +45,7 @@ bool SceneEditor::init(RHI::RenderDevice* device, Assets::AssetManager* assetMan m_gameplayPreview.init(device); m_materialEditor.initGpu(device); m_assetBrowser.init(projectConfig); + m_assetBrowser.initGpu(device); m_assetBrowser.setOnScriptOpen([this](const std::filesystem::path& path) { m_scriptEditor.open(); m_scriptEditor.openFile(path); @@ -101,6 +105,18 @@ bool SceneEditor::init(RHI::RenderDevice* device, Assets::AssetManager* assetMan m_commandPalette.registerCommand("panel_material_editor", "Material Editor", "Panels", [this]() { m_materialEditor.open(); }); + m_commandPalette.registerCommand("panel_image_manager", "Image Manager", "Panels", [this]() { + m_imageManager.open(); + }); + m_commandPalette.registerCommand("panel_hud_editor", "HUD Editor", "Panels", [this]() { + m_hudEditor.open(); + }); + m_commandPalette.registerCommand("panel_particles", "Particles", "Panels", [this]() { + m_particleEditor.open(); + }); + m_commandPalette.registerCommand("panel_effects", "Effects", "Panels", [this]() { + m_effectEditor.open(); + }); m_commandPalette.registerCommand("panel_terrain_editor", "Terrain Editor", "Panels", [this]() { m_terrainEditor.open(); }); @@ -542,6 +558,8 @@ void SceneEditor::tickSystems(ECS::World& world, f32 dt) { m_input.endFrame(); m_animationSystem.onUpdate(world, dt); + Effects::tickEffects(world, dt, editorCameraPosition(m_ctx.camYaw, m_ctx.camPitch, m_ctx.camDistance, m_ctx.camFocus)); + Navigation::updateNavigation(world, dt); m_physicsSystem.onUpdate(world, dt); m_physics3D.onUpdate(world, dt); #ifdef CF_HAS_SCRIPTING @@ -614,6 +632,7 @@ void SceneEditor::render(f32 deltaTime) { ECS::World* activeWorld = m_tabManager.activeWorld(); m_ctx.activeWorld = activeWorld; m_ctx.projectRootPath = m_currentProjectConfig.RootPath; + m_ctx.assetRootPath = m_assetBrowser.assetRoot(); if (!activeWorld) { renderUnsavedChangesPopup(nullptr); return; @@ -748,6 +767,7 @@ void SceneEditor::render(f32 deltaTime) { #ifdef CF_HAS_SDL3 m_gameplayPreview.setFrameCommandBuffer(m_frameCmd); m_materialEditor.setFrameCommandBuffer(m_frameCmd); + m_assetBrowser.setFrameCommandBuffer(m_frameCmd); #endif { CF_PROFILE_SCOPE("SceneEditor::viewport"); @@ -787,6 +807,22 @@ void SceneEditor::render(f32 deltaTime) { } m_materialEditor.onImGuiRender(m_ctx); } + { + CF_PROFILE_SCOPE("SceneEditor::imageManager"); + m_imageManager.onImGuiRender(m_ctx); + } + { + CF_PROFILE_SCOPE("SceneEditor::hudEditor"); + m_hudEditor.onImGuiRender(m_ctx); + } + { + CF_PROFILE_SCOPE("SceneEditor::particles"); + m_particleEditor.onImGuiRender(m_ctx); + } + { + CF_PROFILE_SCOPE("SceneEditor::effects"); + m_effectEditor.onImGuiRender(m_ctx); + } { CF_PROFILE_SCOPE("SceneEditor::terrainEditor"); m_terrainEditor.render(*activeWorld, m_ctx); @@ -812,7 +848,9 @@ void SceneEditor::render(f32 deltaTime) { #ifdef CF_HAS_SDL3 m_gameplayPreview.setFrameCommandBuffer(nullptr); m_materialEditor.setFrameCommandBuffer(nullptr); + m_assetBrowser.setFrameCommandBuffer(nullptr); #endif + m_animationTimeline.setScene(activeWorld, m_ctx.selectedEntity.id()); m_animationTimeline.render(deltaTime); m_animatorController.render(); m_tilemapEditor.render(); @@ -969,6 +1007,22 @@ void SceneEditor::renderMainMenuBar(ECS::World& world) { if (EditorIcons::menuItem(EditorIcon::Assets, "Assets", nullptr, &assetsOpen)) { assetsOpen ? m_assetBrowser.open() : m_assetBrowser.close(); } + bool imageManagerOpen = m_imageManager.isOpen(); + if (ImGui::MenuItem("Image Manager", nullptr, imageManagerOpen)) { + imageManagerOpen ? m_imageManager.close() : m_imageManager.open(); + } + bool hudEditorOpen = m_hudEditor.isOpen(); + if (ImGui::MenuItem("HUD Editor", nullptr, hudEditorOpen)) { + hudEditorOpen ? m_hudEditor.close() : m_hudEditor.open(); + } + bool particlesOpen = m_particleEditor.isOpen(); + if (ImGui::MenuItem("Particles", nullptr, particlesOpen)) { + particlesOpen ? m_particleEditor.close() : m_particleEditor.open(); + } + bool effectsOpen = m_effectEditor.isOpen(); + if (ImGui::MenuItem("Effects", nullptr, effectsOpen)) { + effectsOpen ? m_effectEditor.close() : m_effectEditor.open(); + } bool consoleOpen = m_console.isOpen(); if (EditorIcons::menuItem(EditorIcon::Console, "Console", nullptr, &consoleOpen)) { consoleOpen ? m_console.open() : m_console.close(); @@ -1138,7 +1192,9 @@ void SceneEditor::handleShortcuts(ECS::World& world) { } if (ctrl && ImGui::IsKeyPressed(ImGuiKey_S)) { - if (m_ctx.currentScenePath.empty()) { + if (m_materialEditor.isOpen() && m_materialEditor.wasFocusedLastFrame()) { + m_materialEditor.handleSaveShortcut(); + } else if (m_ctx.currentScenePath.empty()) { saveSceneAs(world); } else { saveScene(m_ctx.currentScenePath.c_str(), world); diff --git a/src/editor/SceneEditor.hpp b/src/editor/SceneEditor.hpp index 19fb81f8..64f2477b 100644 --- a/src/editor/SceneEditor.hpp +++ b/src/editor/SceneEditor.hpp @@ -17,6 +17,10 @@ #ifdef CF_HAS_IMGUI #include "editor/MaterialEditorPanel.hpp" +#include "editor/ImageManagerPanel.hpp" +#include "editor/HudEditorPanel.hpp" +#include "editor/ParticleEditorPanel.hpp" +#include "editor/EffectEditorPanel.hpp" #include "editor/AudioPreviewPanel.hpp" #include "editor/CameraPreviewPanel.hpp" #include "editor/GameplayPreviewPanel.hpp" @@ -154,6 +158,10 @@ class SceneEditor { #ifdef CF_HAS_IMGUI MaterialEditorPanel m_materialEditor; + ImageManagerPanel m_imageManager; + HudEditorPanel m_hudEditor; + ParticleEditorPanel m_particleEditor; + EffectEditorPanel m_effectEditor; AudioPreviewPanel m_audioPreview; CameraPreviewPanel m_cameraPreview; GameplayPreviewPanel m_gameplayPreview; diff --git a/src/editor/SceneSerializer.cpp b/src/editor/SceneSerializer.cpp index 76d14b9a..1c85e6ce 100644 --- a/src/editor/SceneSerializer.cpp +++ b/src/editor/SceneSerializer.cpp @@ -8,6 +8,11 @@ #include "ecs/TerrainComponents.hpp" #include "audio/AudioComponents.hpp" #include "animation/AnimationComponents.hpp" +#include "animation/AnimationPlayer.hpp" +#include "animation/SkinLibrary.hpp" +#include "effects/EffectTypes.hpp" +#include "navigation/NavVolume.hpp" +#include "ecs/PostProcessComponents.hpp" #include "physics/PhysicsComponents2D.hpp" #include "physics/PhysicsComponents3D.hpp" #include "script/ScriptTypes.hpp" @@ -17,6 +22,7 @@ #include "editor/TerrainGenerationBlobLegacy.hpp" #include "terrain/TerrainCache.hpp" #include +#include #include #include #include @@ -981,6 +987,106 @@ bool SceneSerializer::serialize(const std::string& filepath) { emitPodComponents(kTypeSkybox, entityMap); emitPodComponents(kTypeForwardRenderFeatures, entityMap); + emitPodComponents(kTypePostProcess, entityMap); + + { + ECS::ComponentQuery query; + query.with(); + m_world.forEach(query, [&](ECS::Entity entity, Animation::AnimationPlayer& player) { + const u32 pathLen = static_cast(std::strlen(player.clipPath)); + std::vector data(4 + pathLen + sizeof(f32) * 2 + 2); + u32 offset = 0; + std::memcpy(data.data() + offset, &pathLen, 4); + offset += 4; + if (pathLen > 0) { + std::memcpy(data.data() + offset, player.clipPath, pathLen); + offset += pathLen; + } + std::memcpy(data.data() + offset, &player.time, sizeof(f32)); + offset += sizeof(f32); + std::memcpy(data.data() + offset, &player.speed, sizeof(f32)); + offset += sizeof(f32); + data[offset++] = player.playing ? 1 : 0; + data[offset++] = player.loop ? 1 : 0; + entityMap[entity.id()].emplace_back(kTypeAnimationPlayer, std::move(data)); + }); + } + { + ECS::ComponentQuery query; + query.with(); + m_world.forEach(query, [&](ECS::Entity entity, Animation::SkinnedPose& pose) { + const u32 pathLen = static_cast(std::strlen(pose.meshPath)); + std::vector data(4 + pathLen + sizeof(i32) + sizeof(f32) * 2 + 2); + u32 offset = 0; + std::memcpy(data.data() + offset, &pathLen, 4); + offset += 4; + if (pathLen > 0) std::memcpy(data.data() + offset, pose.meshPath, pathLen); + offset += pathLen; + std::memcpy(data.data() + offset, &pose.clipIndex, sizeof(i32)); + offset += sizeof(i32); + std::memcpy(data.data() + offset, &pose.time, sizeof(f32)); + offset += sizeof(f32); + std::memcpy(data.data() + offset, &pose.speed, sizeof(f32)); + offset += sizeof(f32); + data[offset++] = pose.playing ? 1 : 0; + data[offset++] = pose.loop ? 1 : 0; + entityMap[entity.id()].emplace_back(kTypeSkinnedPose, std::move(data)); + }); + } + emitPodComponents(kTypeSpriteSheet, entityMap); + emitPodComponents(kTypeEffect, entityMap); + { + ECS::ComponentQuery query; + query.with(); + m_world.forEach(query, [&](ECS::Entity entity, Navigation::NavVolume& volume) { + const u32 blockedCount = static_cast(volume.blocked.size()); + std::vector data(4 * 2 + sizeof(f32) + sizeof(f32) * 3 + 4 + blockedCount); + u32 offset = 0; + std::memcpy(data.data() + offset, &volume.width, 4); + offset += 4; + std::memcpy(data.data() + offset, &volume.height, 4); + offset += 4; + std::memcpy(data.data() + offset, &volume.cellSize, sizeof(f32)); + offset += sizeof(f32); + std::memcpy(data.data() + offset, &volume.origin.x, sizeof(f32) * 3); + offset += sizeof(f32) * 3; + std::memcpy(data.data() + offset, &blockedCount, 4); + offset += 4; + if (blockedCount > 0) { + std::memcpy(data.data() + offset, volume.blocked.data(), blockedCount); + } + entityMap[entity.id()].emplace_back(kTypeNavVolume, std::move(data)); + }); + } + { + ECS::ComponentQuery query; + query.with(); + m_world.forEach(query, [&](ECS::Entity entity, Navigation::NavAgent& agent) { + const u32 patrolCount = std::min(agent.patrolCount, static_cast(Navigation::kMaxPatrolPoints)); + std::vector data(sizeof(f32) * 3 + sizeof(f32) * 2 + 1 + 4 + 4 + patrolCount * sizeof(f32) * 3 + 256 + 1); + u32 offset = 0; + std::memcpy(data.data() + offset, &agent.destination.x, sizeof(f32) * 3); + offset += sizeof(f32) * 3; + std::memcpy(data.data() + offset, &agent.speed, sizeof(f32)); + offset += sizeof(f32); + std::memcpy(data.data() + offset, &agent.arriveRadius, sizeof(f32)); + offset += sizeof(f32); + data[offset++] = static_cast(agent.mode); + std::memcpy(data.data() + offset, &agent.followEntity, 4); + offset += 4; + std::memcpy(data.data() + offset, &patrolCount, 4); + offset += 4; + if (patrolCount > 0) { + std::memcpy(data.data() + offset, agent.patrol, patrolCount * sizeof(f32) * 3); + offset += patrolCount * sizeof(f32) * 3; + } + std::memcpy(data.data() + offset, agent.behaviorScript, 256); + offset += 256; + data[offset++] = agent.hasDestination ? 1 : 0; + data.resize(offset); + entityMap[entity.id()].emplace_back(kTypeNavAgent, std::move(data)); + }); + } { std::vector>> entries; @@ -1231,6 +1337,117 @@ bool SceneSerializer::deserialize(const std::string& filepath) { applyPODComponent( e, entry.data.data(), static_cast(entry.data.size()), m_world); break; + case kTypePostProcess: + applyPODComponent( + e, entry.data.data(), static_cast(entry.data.size()), m_world); + break; + case kTypeAnimationPlayer: { + if (entry.data.size() < 6) break; + u32 offset = 0; + u32 pathLen = 0; + std::memcpy(&pathLen, entry.data.data(), 4); + offset += 4; + if (offset + pathLen + sizeof(f32) * 2 + 2 > entry.data.size()) break; + Animation::AnimationPlayer player; + if (pathLen > 0 && pathLen < sizeof(player.clipPath)) { + std::memcpy(player.clipPath, entry.data.data() + offset, pathLen); + } + offset += pathLen; + std::memcpy(&player.time, entry.data.data() + offset, sizeof(f32)); + offset += sizeof(f32); + std::memcpy(&player.speed, entry.data.data() + offset, sizeof(f32)); + offset += sizeof(f32); + player.playing = entry.data[offset++] != 0; + player.loop = entry.data[offset] != 0; + player.loaded = false; + m_world.add(e, std::move(player)); + break; + } + case kTypeSkinnedPose: { + if (entry.data.size() < 6) break; + u32 offset = 0; + u32 pathLen = 0; + std::memcpy(&pathLen, entry.data.data(), 4); + offset += 4; + if (offset + pathLen + sizeof(i32) + sizeof(f32) * 2 + 2 > entry.data.size()) break; + Animation::SkinnedPose pose; + if (pathLen > 0 && pathLen < sizeof(pose.meshPath)) { + std::memcpy(pose.meshPath, entry.data.data() + offset, pathLen); + } + offset += pathLen; + std::memcpy(&pose.clipIndex, entry.data.data() + offset, sizeof(i32)); + offset += sizeof(i32); + std::memcpy(&pose.time, entry.data.data() + offset, sizeof(f32)); + offset += sizeof(f32); + std::memcpy(&pose.speed, entry.data.data() + offset, sizeof(f32)); + offset += sizeof(f32); + pose.playing = entry.data[offset++] != 0; + pose.loop = entry.data[offset] != 0; + pose.loaded = false; + m_world.add(e, std::move(pose)); + break; + } + case kTypeSpriteSheet: + applyPODComponent( + e, entry.data.data(), static_cast(entry.data.size()), m_world); + break; + case kTypeEffect: + applyPODComponent( + e, entry.data.data(), static_cast(entry.data.size()), m_world); + break; + case kTypeNavVolume: { + if (entry.data.size() < 24) break; + Navigation::NavVolume volume; + u32 offset = 0; + std::memcpy(&volume.width, entry.data.data() + offset, 4); + offset += 4; + std::memcpy(&volume.height, entry.data.data() + offset, 4); + offset += 4; + std::memcpy(&volume.cellSize, entry.data.data() + offset, sizeof(f32)); + offset += sizeof(f32); + std::memcpy(&volume.origin.x, entry.data.data() + offset, sizeof(f32) * 3); + offset += sizeof(f32) * 3; + u32 blockedCount = 0; + if (offset + 4 > entry.data.size()) break; + std::memcpy(&blockedCount, entry.data.data() + offset, 4); + offset += 4; + if (offset + blockedCount <= entry.data.size()) { + volume.blocked.assign(entry.data.data() + offset, entry.data.data() + offset + blockedCount); + } + m_world.add(e, std::move(volume)); + break; + } + case kTypeNavAgent: { + if (entry.data.size() < 20) break; + Navigation::NavAgent agent; + u32 offset = 0; + std::memcpy(&agent.destination.x, entry.data.data() + offset, sizeof(f32) * 3); + offset += sizeof(f32) * 3; + std::memcpy(&agent.speed, entry.data.data() + offset, sizeof(f32)); + offset += sizeof(f32); + std::memcpy(&agent.arriveRadius, entry.data.data() + offset, sizeof(f32)); + offset += sizeof(f32); + agent.mode = static_cast(entry.data[offset++]); + std::memcpy(&agent.followEntity, entry.data.data() + offset, 4); + offset += 4; + u32 patrolCount = 0; + std::memcpy(&patrolCount, entry.data.data() + offset, 4); + offset += 4; + agent.patrolCount = std::min(patrolCount, static_cast(Navigation::kMaxPatrolPoints)); + const u32 patrolBytes = agent.patrolCount * static_cast(sizeof(f32) * 3); + if (offset + patrolBytes + 256 <= entry.data.size()) { + if (patrolBytes > 0) { + std::memcpy(agent.patrol, entry.data.data() + offset, patrolBytes); + offset += patrolBytes; + } + std::memcpy(agent.behaviorScript, entry.data.data() + offset, 256); + offset += 256; + if (offset < entry.data.size()) agent.hasDestination = entry.data[offset] != 0; + } + agent.planDirty = true; + m_world.add(e, std::move(agent)); + break; + } case kTypeTerrain: applyTerrainComponent(e, entry.data.data(), static_cast(entry.data.size()), filepath); break; diff --git a/src/editor/SceneSerializer.hpp b/src/editor/SceneSerializer.hpp index 4faf3f56..344d85aa 100644 --- a/src/editor/SceneSerializer.hpp +++ b/src/editor/SceneSerializer.hpp @@ -65,7 +65,14 @@ class SceneSerializer { static constexpr u32 kTypeRigidBody3D = 43; static constexpr u32 kTypeCollider3D = 44; static constexpr u32 kTypeForwardRenderFeatures = 45; - static constexpr u32 kTypeCount = 46; + static constexpr u32 kTypePostProcess = 46; + static constexpr u32 kTypeAnimationPlayer = 47; + static constexpr u32 kTypeNavVolume = 48; + static constexpr u32 kTypeNavAgent = 49; + static constexpr u32 kTypeSkinnedPose = 50; + static constexpr u32 kTypeSpriteSheet = 51; + static constexpr u32 kTypeEffect = 52; + static constexpr u32 kTypeCount = 53; static constexpr u32 kFormatVersion = 7; static constexpr u32 kSignature = 0x46464143; // "CAFF" little-endian diff --git a/src/editor/SceneViewport.cpp b/src/editor/SceneViewport.cpp index 92a4452d..c48114ae 100644 --- a/src/editor/SceneViewport.cpp +++ b/src/editor/SceneViewport.cpp @@ -22,6 +22,8 @@ #include "math/Mat4.hpp" #include "math/Quat.hpp" #include "animation/AnimationComponents.hpp" +#include "animation/SkinLibrary.hpp" +#include "effects/EffectSystem.hpp" #include "scene/SceneComponents.hpp" #include "scene/HierarchySystem.hpp" #include "scene/LightingSystem.hpp" @@ -953,64 +955,29 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { ctx.terrainEditMode == EditorContext::TerrainEditMode::Splat; const bool terrainEditActive = terrainSculptMode || terrainSplatMode; - // Handle entity selection via raycasting (only in 3D mode, not during gizmo drag) - if (ImGui::IsMouseClicked(ImGuiMouseButton_Left) && !m_gizmoDragging && !terrainEditActive && + // Click in the 3D view selects the nearest object. The gizmo keeps the click when an axis is hot. + const bool gizmoClaimsClick = ctx.selectedEntity.isValid() && + ctx.gizmoMode != EditorContext::GizmoMode::None && + m_hoveredAxis != 0; + if (hovered && ImGui::IsMouseClicked(ImGuiMouseButton_Left) && !m_gizmoDragging && + !terrainEditActive && !gizmoClaimsClick && ctx.viewMode == EditorContext::ViewMode::Mode3D) { - - ImVec2 mousePos = ImGui::GetMousePos(); - ImVec2 vpMin = ImGui::GetItemRectMin(); - ImVec2 vpMax = ImGui::GetItemRectMax(); - - bool mouseInViewport = (mousePos.x >= vpMin.x && mousePos.x <= vpMax.x && - mousePos.y >= vpMin.y && mousePos.y <= vpMax.y); - - if (mouseInViewport) { - ImVec2 vpSize = ImGui::GetContentRegionAvail(); - Vec2 screenClick(mousePos.x - vpMin.x, mousePos.y - vpMin.y); - - f32 sinY = std::sin(ctx.camYaw), cosY = std::cos(ctx.camYaw); - f32 sinP = std::sin(ctx.camPitch), cosP = std::cos(ctx.camPitch); - Vec3 camPos = - editorCameraPosition(ctx.camYaw, ctx.camPitch, ctx.camDistance, ctx.camFocus); - Mat4 view = Mat4::lookAt(camPos, ctx.camFocus, Vec3(0.0f, 1.0f, 0.0f)); - f32 aspect = vpSize.x / std::max(vpSize.y, 1.0f); - Mat4 proj = Mat4::perspective(1.0472f, aspect, 0.1f, ctx.cameraFarPlane()); - Mat4 vp = proj * view; - Mat4 vpInverse = vp.inverted(); - - f32 ndcX = (2.0f * screenClick.x) / vpSize.x - 1.0f; - f32 ndcY = 1.0f - (2.0f * screenClick.y) / vpSize.y; - Vec4 ndcNear(ndcX, ndcY, -1.0f, 1.0f); - Vec4 worldNear = vpInverse.transformVec4(ndcNear); - - if (std::abs(worldNear.w) > 0.0001f) { - worldNear.x /= worldNear.w; - worldNear.y /= worldNear.w; - worldNear.z /= worldNear.w; - } - - Vec3 rayOrigin = camPos; - Vec3 rayDirection = (Vec3(worldNear.x, worldNear.y, worldNear.z) - camPos).normalized(); - - std::string projectRoot; - if (!ctx.currentScenePath.empty()) { - projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); - } - ECS::Entity selectedEntity = raycastSelectEntity(rayOrigin, rayDirection, world, projectRoot); - - bool shiftPressed = ImGui::IsKeyDown(ImGuiKey_LeftShift) || ImGui::IsKeyDown(ImGuiKey_RightShift); - - if (selectedEntity.isValid()) { - if (shiftPressed) { - ctx.toggleSelection(selectedEntity); - } else { - ctx.selectEntity(selectedEntity); - } + const ImVec2 mousePos = ImGui::GetMousePos(); + const ImVec2 vpMin = ImGui::GetItemRectMin(); + const ImVec2 vpMax = ImGui::GetItemRectMax(); + const ImVec2 vpSize(vpMax.x - vpMin.x, vpMax.y - vpMin.y); + if (vpSize.x >= 1.0f && vpSize.y >= 1.0f) { + const ViewportRay ray = computeViewportRay(ctx, vpMin, vpSize, mousePos); + const std::string projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); + const ECS::Entity picked = raycastSelectEntity(ray.origin, ray.direction, world, projectRoot); + const bool shiftPressed = ImGui::IsKeyDown(ImGuiKey_LeftShift) || + ImGui::IsKeyDown(ImGuiKey_RightShift); + if (picked.isValid()) { + if (shiftPressed) ctx.toggleSelection(picked); + else ctx.selectEntity(picked); TestInstrumentation::onEntitiesSelected(ctx.selectedEntities); - } else { - if (!shiftPressed) { - ctx.clearSelection(); - } + } else if (!shiftPressed) { + ctx.clearSelection(); } } } @@ -1435,6 +1402,22 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { CF_PROFILE_SCOPE("SceneViewport::sprites"); drawSprites(world, ctx, origin, viewportSize); } + { + std::vector effects; + const bool onlyTwoD = ctx.viewMode == EditorContext::ViewMode::Mode3D; + Effects::collectOverlayEffects(world, onlyTwoD, effects); + const f32 worldToScreen = ctx.viewportZoom * 50.0f; + ImDrawList* effectDraw = ImGui::GetWindowDrawList(); + for (const Effects::EffectSprite& sprite : effects) { + const ImVec2 screen = projectToScreen(sprite.position, origin, viewportSize, ctx); + const f32 radius = std::max(3.0f, 0.5f * worldToScreen * std::max(sprite.size, 0.02f)); + const ImU32 color = IM_COL32(static_cast(std::clamp(sprite.color.x, 0.0f, 1.0f) * 255.0f), + static_cast(std::clamp(sprite.color.y, 0.0f, 1.0f) * 255.0f), + static_cast(std::clamp(sprite.color.z, 0.0f, 1.0f) * 255.0f), + static_cast(std::clamp(sprite.color.w, 0.0f, 1.0f) * 255.0f)); + effectDraw->AddCircleFilled(screen, radius, color, 16); + } + } { CF_PROFILE_SCOPE("SceneViewport::entities"); drawEmptyEntities(world, ctx, origin, viewportSize); @@ -1814,6 +1797,20 @@ void SceneViewport::drawSprites(ECS::World& world, EditorContext& ctx, ImVec2 or } } } + if (!resolved) { + if (const Animation::SpriteSheet* sheet = world.get(entity)) { + const Animation::SpriteSheetRect cell = + Animation::spriteSheetFrame(*sheet, sprite.frameIndex, + static_cast(texWidth), static_cast(texHeight)); + if (cell.w > 0.0f && cell.h > 0.0f) { + uv0x = cell.x * invW; + uv0y = cell.y * invH; + uv1x = (cell.x + cell.w) * invW; + uv1y = (cell.y + cell.h) * invH; + resolved = true; + } + } + } if (!resolved && sprite.frameIndex > 0) { const u32 frameSize = std::max(1u, texHeight); const u32 frameCount = std::max(1u, texWidth / frameSize); @@ -3189,8 +3186,8 @@ f32 SceneViewport::rayIntersectsAABB(const Vec3& rayOrigin, const Vec3& rayDir, } } - if (t_enter <= t_exit && t_enter >= 0.0f) { - return t_enter; + if (t_enter <= t_exit && t_exit >= 0.0f) { + return t_enter >= 0.0f ? t_enter : 0.0f; } return -1.0f; @@ -3247,62 +3244,134 @@ ECS::Entity SceneViewport::raycastSelectEntity(const Vec3& rayOrigin, const Vec3 const std::string& projectRoot) { ECS::Entity closestEntity = ECS::Entity::INVALID; f32 closestT = 1e10f; - - ECS::ComponentQuery query; - query.with(); - - world.forEach(query, [&](ECS::Entity entity, ECS::Transform& transform) { + + auto accept = [&](ECS::Entity entity, f32 t) { + if (t >= 0.0f && t < closestT) { + closestT = t; + closestEntity = entity; + } + }; + + auto padThin = [](Vec3& mn, Vec3& mx) { + const f32 pad = 0.05f; + if (mx.x - mn.x < pad) { const f32 c = (mn.x + mx.x) * 0.5f; mn.x = c - pad; mx.x = c + pad; } + if (mx.y - mn.y < pad) { const f32 c = (mn.y + mx.y) * 0.5f; mn.y = c - pad; mx.y = c + pad; } + if (mx.z - mn.z < pad) { const f32 c = (mn.z + mx.z) * 0.5f; mn.z = c - pad; mx.z = c + pad; } + }; + + auto testWorldAabb = [&](ECS::Entity entity, Vec3 mn, Vec3 mx) { + padThin(mn, mx); + accept(entity, rayIntersectsAABB(rayOrigin, rayDir, mn, mx)); + }; + + auto testLocalAabb = [&](ECS::Entity entity, const Mat4& worldMatrix, Vec3 localMin, Vec3 localMax) { + Vec3 mn(1e30f, 1e30f, 1e30f); + Vec3 mx(-1e30f, -1e30f, -1e30f); + const Vec3 corners[2] = {localMin, localMax}; + for (int ix = 0; ix < 2; ++ix) { + for (int iy = 0; iy < 2; ++iy) { + for (int iz = 0; iz < 2; ++iz) { + const Vec3 p = worldMatrix.transformPoint(Vec3(corners[ix].x, corners[iy].y, corners[iz].z)); + mn.x = std::min(mn.x, p.x); mn.y = std::min(mn.y, p.y); mn.z = std::min(mn.z, p.z); + mx.x = std::max(mx.x, p.x); mx.y = std::max(mx.y, p.y); mx.z = std::max(mx.z, p.z); + } + } + } + testWorldAabb(entity, mn, mx); + }; + + auto testPoint = [&](ECS::Entity entity, const Vec3& point) { + const f32 t = (point - rayOrigin).dot(rayDir); + if (t < 0.0f) return; + const f32 dist = ((rayOrigin + rayDir * t) - point).length(); + const f32 reach = std::max(0.25f, t * 0.03f); + if (dist <= reach) accept(entity, t); + }; + + ECS::ComponentQuery meshes; + meshes.with(); + world.forEach(meshes, [&](ECS::Entity entity, ECS::MeshFilterComponent& filter) { if (Scene::isEffectivelyDisabled(world, entity)) return; - - Vec3 aabbMin = transform.position; - Vec3 aabbMax = transform.position; - - if (auto* meshFilter = world.get(entity)) { - if (!meshFilter->customMeshPath.empty()) { - auto* mesh = Assets::MeshCache::getInstance().getMesh( - meshFilter->customMeshPath, projectRoot); - - if (mesh && !mesh->vertices.empty()) { - Vec3 meshMin = mesh->bounds.min; - Vec3 meshMax = mesh->bounds.max; - - aabbMin = transform.position + Vec3(meshMin.x * transform.scale.x, - meshMin.y * transform.scale.y, - meshMin.z * transform.scale.z); - aabbMax = transform.position + Vec3(meshMax.x * transform.scale.x, - meshMax.y * transform.scale.y, - meshMax.z * transform.scale.z); - - if (aabbMin.x > aabbMax.x) std::swap(aabbMin.x, aabbMax.x); - if (aabbMin.y > aabbMax.y) std::swap(aabbMin.y, aabbMax.y); - if (aabbMin.z > aabbMax.z) std::swap(aabbMin.z, aabbMax.z); + const Mat4 worldMatrix = entityMatrix(world, entity); + if (const ECS::TerrainComponent* terrain = world.get(entity)) { + if (const Terrain::TerrainHeightmap* heightmap = Terrain::TerrainCache::instance().heightmapFor(entity); + heightmap && !heightmap->empty()) { + Vec3 hit; + if (Terrain::TerrainSculptor::raycast(worldMatrix, *heightmap, *terrain, rayOrigin, rayDir, hit)) { + accept(entity, (hit - rayOrigin).dot(rayDir)); + } + return; + } + const f32 halfX = terrain->worldSizeX * 0.5f; + const f32 halfZ = terrain->worldSizeZ * 0.5f; + testLocalAabb(entity, worldMatrix, Vec3(-halfX, -0.25f, -halfZ), Vec3(halfX, 1.0f, halfZ)); + return; + } + + Assets::Mesh3D* mesh = nullptr; + if (filter.primitive == ECS::MeshPrimitive::Custom) { + if (!filter.customMeshPath.empty()) { + mesh = Assets::MeshCache::getInstance().getMesh(filter.customMeshPath, projectRoot); + } + } else { + mesh = Render::GpuProceduralMeshes::get(filter.primitive); + } + if (mesh && (mesh->bounds.max - mesh->bounds.min).lengthSquared() > 1.0e-6f) { + testLocalAabb(entity, worldMatrix, mesh->bounds.min, mesh->bounds.max); + } else { + testLocalAabb(entity, worldMatrix, Vec3(-0.5f, -0.5f, -0.5f), Vec3(0.5f, 0.5f, 0.5f)); + } + }); + + auto testMarker = [&](ECS::Entity entity) { + if (Scene::isEffectivelyDisabled(world, entity)) return; + if (world.has(entity)) return; + Vec3 point; + if (!tryGetEntityPosition(world, entity, point)) return; + if (const Effects::EffectComponent* effect = world.get(entity)) { + const auto kind = static_cast(effect->kind); + if (kind == Effects::EffectKind::VolumetricLight || kind == Effects::EffectKind::Fog) { + const f32 radius = std::max(effect->radius, 0.25f); + if (kind == Effects::EffectKind::VolumetricLight && + Effects::volumetricShapeOf(*effect) != Effects::VolumetricShape::Sphere) { + const Mat4 matrix = entityMatrix(world, entity); + Vec3 forward = matrix.transformVector(Vec3(0.0f, 0.0f, -1.0f)); + if (forward.lengthSquared() < 1.0e-8f) forward = Vec3(0.0f, 0.0f, -1.0f); + else forward = forward.normalized(); + const Vec3 end = point + forward * radius; + const f32 pad = std::max(effect->startSize, effect->endSize) * 0.5f; + const Vec3 padVec(pad, pad, pad); + testWorldAabb(entity, Vec3(std::min(point.x, end.x), std::min(point.y, end.y), std::min(point.z, end.z)) - padVec, + Vec3(std::max(point.x, end.x), std::max(point.y, end.y), std::max(point.z, end.z)) + padVec); } else { - if (aabbMin.x >= aabbMax.x || aabbMin.y >= aabbMax.y || aabbMin.z >= aabbMax.z) { - Vec3 toEntity = transform.position - rayOrigin; - Vec3 proj = rayDir * toEntity.dot(rayDir); - f32 distToRay = (toEntity - proj).length(); - - if (distToRay < 0.1f) { - f32 t = proj.length(); - if (t >= 0.0f && t < closestT) { - closestT = t; - closestEntity = entity; - } - } - return; - } + testWorldAabb(entity, point - Vec3(radius, radius, radius), point + Vec3(radius, radius, radius)); } + return; } } - - f32 t = rayIntersectsAABB(rayOrigin, rayDir, aabbMin, aabbMax); - - if (t >= 0.0f && t < closestT) { - closestT = t; - closestEntity = entity; + if (const ECS::Transform* transform = world.get(entity)) { + if (world.has(entity)) { + const f32 halfW = std::max(0.5f, std::abs(transform->scale.x) * 0.5f); + const f32 halfH = std::max(0.5f, std::abs(transform->scale.y) * 0.5f); + testWorldAabb(entity, point - Vec3(halfW, halfH, 0.05f), point + Vec3(halfW, halfH, 0.05f)); + return; + } } + testPoint(entity, point); + }; + + ECS::ComponentQuery positioned; + positioned.with(); + world.forEach(positioned, [&](ECS::Entity entity, ECS::Position3D&) { + testMarker(entity); }); - + ECS::ComponentQuery transforms; + transforms.with(); + transforms.without(); + world.forEach(transforms, [&](ECS::Entity entity, ECS::Transform&) { + testMarker(entity); + }); + return closestEntity; } diff --git a/src/effects/EffectSystem.cpp b/src/effects/EffectSystem.cpp new file mode 100644 index 00000000..3b30f6b3 --- /dev/null +++ b/src/effects/EffectSystem.cpp @@ -0,0 +1,536 @@ +#include "effects/EffectSystem.hpp" + +#include "assets/MaterialCache.hpp" +#include "ecs/ComponentQuery.hpp" +#include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/ParticleSystem.hpp" +#include "math/Mat4.hpp" +#include "math/Quat.hpp" +#include "scene/HierarchySystem.hpp" +#include "scene/SceneComponents.hpp" + +#include +#include +#include +#include + +namespace Caffeine::Effects { +namespace { + +struct ParticlePool { + u32 rng = 1; + std::vector particles; +}; + +std::unordered_map g_pools; + +u32 rngNext(u32& state) { + state ^= state << 13; + state ^= state >> 17; + state ^= state << 5; + if (state == 0) state = 1; + return state; +} + +f32 rng01(u32& state) { + return static_cast(rngNext(state) & 0xFFFFFFu) / static_cast(0xFFFFFFu); +} + +f32 rngRange(u32& state, f32 minValue, f32 maxValue) { + return minValue + (maxValue - minValue) * rng01(state); +} + +Vec3 effectOrigin(ECS::World& world, ECS::Entity entity, const EffectComponent& effect, + const Vec3& cameraPos) { + if (static_cast(effect.space) == EffectSpace::Camera) return cameraPos; + if (const ECS::Position3D* position = world.get(entity)) return position->position; + if (const ECS::Transform* transform = world.get(entity)) return transform->position; + return {}; +} + +Vec4 materialTint(const EffectComponent& effect) { + if (effect.materialPath[0] == '\0') return Vec4(1.0f, 1.0f, 1.0f, 1.0f); + const Assets::MaterialSurface surface = + Assets::MaterialCache::instance().resolve(effect.materialPath, ""); + if (!surface.valid) return Vec4(1.0f, 1.0f, 1.0f, 1.0f); + Vec4 tint(surface.albedo.x, surface.albedo.y, surface.albedo.z, surface.albedo.w); + if (surface.emissionStrength > 0.0f) { + tint.x = std::clamp(tint.x + surface.emission.x * surface.emissionStrength, 0.0f, 4.0f); + tint.y = std::clamp(tint.y + surface.emission.y * surface.emissionStrength, 0.0f, 4.0f); + tint.z = std::clamp(tint.z + surface.emission.z * surface.emissionStrength, 0.0f, 4.0f); + } + return tint; +} + +constexpr f32 kDegToRad = 3.14159265f / 180.0f; + +Mat4 effectMatrix(ECS::World& world, ECS::Entity entity) { + if (const Scene::WorldTransform* worldTransform = world.get(entity)) { + return worldTransform->matrix; + } + if (const ECS::Transform* transform = world.get(entity)) { + return Mat4::translation(transform->position) * Mat4::rotationZ(transform->rotation.z * kDegToRad) * + Mat4::rotationY(transform->rotation.y * kDegToRad) * + Mat4::rotationX(transform->rotation.x * kDegToRad) * + Mat4::scale(transform->scale.x, transform->scale.y, transform->scale.z); + } + const ECS::Position3D* position = world.get(entity); + const ECS::Rotation3D* rotation = world.get(entity); + const ECS::Scale3D* scale = world.get(entity); + const Mat4 translation = position ? Mat4::translation(position->position) : Mat4::identity(); + const Mat4 orient = rotation ? Quat(rotation->quaternion.x, rotation->quaternion.y, rotation->quaternion.z, + rotation->quaternion.w) + .normalized() + .toMatrix() + : Mat4::identity(); + const Mat4 sized = scale ? Mat4::scale(scale->scale.x, scale->scale.y, scale->scale.z) : Mat4::identity(); + return translation * orient * sized; +} + +struct BeamAxes { + Vec3 forward{0.0f, 0.0f, -1.0f}; + Vec3 right{1.0f, 0.0f, 0.0f}; + Vec3 up{0.0f, 1.0f, 0.0f}; +}; + +BeamAxes beamAxes(ECS::World& world, ECS::Entity entity) { + const Mat4 matrix = effectMatrix(world, entity); + BeamAxes axes; + const Vec3 forward = matrix.transformVector(Vec3(0.0f, 0.0f, -1.0f)); + const Vec3 right = matrix.transformVector(Vec3(1.0f, 0.0f, 0.0f)); + const Vec3 up = matrix.transformVector(Vec3(0.0f, 1.0f, 0.0f)); + if (forward.lengthSquared() > 1.0e-8f) axes.forward = forward.normalized(); + if (right.lengthSquared() > 1.0e-8f) axes.right = right.normalized(); + if (up.lengthSquared() > 1.0e-8f) axes.up = up.normalized(); + return axes; +} + +void pushQuad(Assets::Mesh3D& mesh, const Vec3& center, const Vec3& right, const Vec3& up, f32 size, + const Vec4& color) { + const Vec3 normal = right.cross(up).normalized(); + const Vec3 corners[4] = { + center - right * size - up * size, + center + right * size - up * size, + center + right * size + up * size, + center - right * size + up * size, + }; + const Vec2 uvs[4] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; + const u32 base = static_cast(mesh.vertices.size()); + for (int i = 0; i < 4; ++i) { + Assets::Vertex3D vertex{}; + vertex.position = corners[i]; + vertex.normal = normal; + vertex.texcoord = uvs[i]; + vertex.tangent = color; + mesh.vertices.push_back(vertex); + } + const u32 indices[6] = {0, 1, 2, 0, 2, 3}; + for (u32 index : indices) mesh.indices.push_back(base + index); +} + +void pushColoredQuad(Assets::Mesh3D& mesh, const Vec3 corners[4], const Vec2 uvs[4], const Vec4 colors[4]) { + if (mesh.vertices.size() + 4 > 4096) return; + const Vec3 normal = (corners[1] - corners[0]).cross(corners[2] - corners[0]); + const Vec3 n = normal.lengthSquared() > 1.0e-8f ? normal.normalized() : Vec3(0.0f, 1.0f, 0.0f); + const u32 base = static_cast(mesh.vertices.size()); + for (int i = 0; i < 4; ++i) { + Assets::Vertex3D vertex{}; + vertex.position = corners[i]; + vertex.normal = n; + vertex.texcoord = uvs[i]; + vertex.tangent = colors[i]; + mesh.vertices.push_back(vertex); + } + const u32 indices[6] = {0, 1, 2, 0, 2, 3}; + for (u32 index : indices) mesh.indices.push_back(base + index); +} + +void pushBeam(Assets::Mesh3D& mesh, const Vec3& start, const Vec3& end, const Vec3& side, f32 nearHalf, + f32 farHalf, const Vec4& nearColor, const Vec4& farColor) { + const Vec3 corners[4] = { + start - side * nearHalf, + start + side * nearHalf, + end + side * farHalf, + end - side * farHalf, + }; + const Vec2 uvs[4] = {{0.0f, 2.0f}, {1.0f, 2.0f}, {1.0f, 2.0f}, {0.0f, 2.0f}}; + const Vec4 colors[4] = {nearColor, nearColor, farColor, farColor}; + pushColoredQuad(mesh, corners, uvs, colors); +} + +void pushRect(Assets::Mesh3D& mesh, const Vec3& center, const Vec3& right, const Vec3& up, f32 halfW, + f32 halfH, const Vec4& color) { + const Vec3 corners[4] = { + center - right * halfW - up * halfH, + center + right * halfW - up * halfH, + center + right * halfW + up * halfH, + center - right * halfW + up * halfH, + }; + const Vec2 uvs[4] = {{2.0f, 2.0f}, {3.0f, 2.0f}, {3.0f, 3.0f}, {2.0f, 3.0f}}; + const Vec4 colors[4] = {color, color, color, color}; + pushColoredQuad(mesh, corners, uvs, colors); +} + +u32 shellCount(EffectQuality quality); + +void emitVolumetricShafts(ECS::World& world, ECS::Entity entity, const EffectComponent& effect, + const Vec3& origin, const Vec3& cameraPos, Assets::Mesh3D& mesh) { + const VolumetricShape shape = volumetricShapeOf(effect); + const BeamAxes axes = beamAxes(world, entity); + const f32 length = std::max(effect.radius, 0.2f); + const Vec3 end = origin + axes.forward * length; + const Vec3 toCamera = cameraPos - origin; + Vec3 facing = axes.forward.cross(toCamera); + if (facing.lengthSquared() < 1.0e-8f) facing = axes.right; + else facing = facing.normalized(); + + const f32 cosTheta = toCamera.lengthSquared() > 1.0e-8f + ? toCamera.normalized().dot(axes.forward * -1.0f) + : 0.0f; + const f32 phase = henyeyGreenstein(cosTheta, effect.anisotropy); + const f32 isotropic = henyeyGreenstein(0.0f, 0.0f); + const f32 boost = std::clamp(phase / std::max(isotropic, 0.01f), 0.45f, 3.0f); + const Vec3 rgb = effect.lightColor * effect.intensity; + const f32 nearAlpha = std::clamp((0.1f + 0.7f * effect.density) * boost, 0.05f, 0.8f); + const Vec4 nearColor(rgb.x, rgb.y, rgb.z, nearAlpha); + const Vec4 farColor(rgb.x * 0.7f, rgb.y * 0.65f, rgb.z * 0.55f, nearAlpha * 0.18f); + const Vec4 capColor(rgb.x, rgb.y, rgb.z, nearAlpha * 0.35f); + + u32 columns = 1; + u32 rows = 1; + f32 nearW = std::max(effect.startSize, 0.05f); + f32 nearH = std::max(effect.endSize, 0.05f); + f32 farW = nearW; + f32 farH = nearH; + if (shape == VolumetricShape::Cone) { + nearH = nearW; + farW = std::max(effect.endSize, 0.05f); + farH = farW; + } else if (shape == VolumetricShape::Cylinder) { + nearH = nearW; + farW = nearW; + farH = nearW; + } else if (shape == VolumetricShape::Window) { + volumetricGridOf(effect, columns, rows); + } + + const u32 layers = shellCount(static_cast(effect.quality)); + const f32 gap = shape == VolumetricShape::Window ? 0.22f : 0.0f; + const f32 cellW = nearW / static_cast(columns); + const f32 cellH = nearH / static_cast(rows); + const f32 farCellW = farW / static_cast(columns); + const f32 farCellH = farH / static_cast(rows); + + for (u32 row = 0; row < rows; ++row) { + for (u32 column = 0; column < columns; ++column) { + if (mesh.vertices.size() + 16 > 4096) return; + const f32 offsetX = (static_cast(column) + 0.5f - static_cast(columns) * 0.5f) * cellW; + const f32 offsetY = (static_cast(row) + 0.5f - static_cast(rows) * 0.5f) * cellH; + const Vec3 start = origin + axes.right * offsetX + axes.up * offsetY; + const f32 farOffsetX = (static_cast(column) + 0.5f - static_cast(columns) * 0.5f) * farCellW; + const f32 farOffsetY = (static_cast(row) + 0.5f - static_cast(rows) * 0.5f) * farCellH; + const Vec3 finish = end + axes.right * farOffsetX + axes.up * farOffsetY; + const f32 halfW = cellW * (1.0f - gap) * 0.5f; + const f32 halfH = cellH * (1.0f - gap) * 0.5f; + const f32 farHalfW = farCellW * (1.0f - gap) * 0.5f; + const f32 farHalfH = farCellH * (1.0f - gap) * 0.5f; + const f32 facingNear = std::max(std::abs(axes.right.dot(facing)) * halfW + + std::abs(axes.up.dot(facing)) * halfH, + 0.03f); + const f32 facingFar = std::max(std::abs(axes.right.dot(facing)) * farHalfW + + std::abs(axes.up.dot(facing)) * farHalfH, + 0.03f); + pushBeam(mesh, start, finish, facing, facingNear, facingFar, nearColor, farColor); + if (layers >= 2) { + pushBeam(mesh, start, finish, axes.up, halfW, farHalfW, nearColor, farColor); + } + if (layers >= 3) { + pushBeam(mesh, start, finish, axes.right, halfH, farHalfH, nearColor, farColor); + } + pushRect(mesh, finish, axes.right, axes.up, farHalfW, farHalfH, capColor); + } + } +} + +u32 shellCount(EffectQuality quality) { + switch (quality) { + case EffectQuality::Performance: return 1; + case EffectQuality::Quality: return 3; + case EffectQuality::Balanced: break; + } + return 2; +} + +EffectFogStyle fogStyleOf(const EffectComponent& effect) { + return static_cast(std::min(effect.pad0, 3)); +} + +template +void emitFog(const EffectComponent& effect, const Vec3& center, bool twoD, Emit&& emit) { + const EffectFogStyle style = fogStyleOf(effect); + u32 count = shellCount(static_cast(effect.quality)); + if (style == EffectFogStyle::Dust) count += 2; + else if (style == EffectFogStyle::Smoke) count += 1; + const f32 phase = effect.emitCarry; + const f32 radius = std::max(effect.radius, 0.05f); + for (u32 i = 0; i < count; ++i) { + const f32 angle = phase * (style == EffectFogStyle::Smoke ? 0.4f : 0.18f) + static_cast(i) * 2.1f; + const f32 rise = style == EffectFogStyle::Smoke + ? std::fmod(phase * 0.25f + static_cast(i) * 0.35f, 1.0f) * radius * 0.45f + : std::cos(angle * 0.8f) * radius * 0.18f; + Vec3 offset(std::sin(angle) * radius * 0.28f, rise, + twoD ? 0.0f : std::sin(angle * 1.3f) * radius * 0.22f); + f32 size = radius; + if (style == EffectFogStyle::Dust) size *= 0.42f; + else if (style == EffectFogStyle::Mist) size *= 1.15f; + else size *= 0.85f; + size *= std::max(0.35f, 1.0f - 0.18f * static_cast(i)); + f32 alpha = effect.density * (style == EffectFogStyle::Mist ? 0.55f : 1.0f); + alpha = std::clamp(alpha, 0.0f, 0.85f) / static_cast(i + 1); + const Vec4 color(effect.lightColor.x * effect.intensity, effect.lightColor.y * effect.intensity, + effect.lightColor.z * effect.intensity, alpha); + emit(center + offset, std::max(size, 0.05f), color); + } +} + +} // namespace + +void tickEffects(ECS::World& world, f32 dt, const Vec3& cameraPos) { + ECS::ParticleSystem legacy; + legacy.onUpdate(world, dt); + if (dt < 0.0f) dt = 0.0f; + + ECS::ComponentQuery query; + query.with(); + std::vector live; + world.forEach(query, [&](ECS::Entity entity, EffectComponent& effect) { + live.push_back(entity.id()); + if (!effect.enabled || Scene::isEffectivelyDisabled(world, entity)) return; + if (static_cast(effect.kind) == EffectKind::Fog) { + effect.emitCarry += dt; + if (effect.emitCarry > 10000.0f) effect.emitCarry = 0.0f; + return; + } + if (static_cast(effect.kind) != EffectKind::Particles) return; + + ParticlePool& pool = g_pools[entity.id()]; + if (pool.rng == 1) pool.rng = effect.seed ? effect.seed : entity.id() + 1u; + const bool twoD = static_cast(effect.domain) == EffectDomain::TwoD; + const Vec3 origin = effectOrigin(world, entity, effect, cameraPos); + const Vec4 tint = materialTint(effect); + const i32 cap = std::max(effect.maxParticles, 0); + + effect.emitCarry += std::max(effect.rate, 0.0f) * dt; + while (effect.emitCarry >= 1.0f && static_cast(pool.particles.size()) < cap) { + effect.emitCarry -= 1.0f; + SimParticle particle; + particle.position = origin; + particle.velocity = Vec3(rngRange(pool.rng, effect.velocityMin.x, effect.velocityMax.x), + rngRange(pool.rng, effect.velocityMin.y, effect.velocityMax.y), + twoD ? 0.0f + : rngRange(pool.rng, effect.velocityMin.z, effect.velocityMax.z)); + particle.life = std::max(effect.lifetime, 0.05f); + particle.maxLife = particle.life; + particle.size = effect.startSize; + particle.color = Vec4(effect.startColor.x * tint.x, effect.startColor.y * tint.y, + effect.startColor.z * tint.z, effect.startColor.w * tint.w); + pool.particles.push_back(particle); + } + + const Vec3 gravity = twoD ? Vec3(effect.gravity.x, effect.gravity.y, 0.0f) : effect.gravity; + const f32 drag = std::clamp(1.0f - effect.drag * dt, 0.0f, 1.0f); + for (SimParticle& particle : pool.particles) { + particle.life -= dt; + particle.velocity = particle.velocity * drag + gravity * dt; + particle.position += particle.velocity * dt; + if (twoD) particle.position.z = origin.z; + const f32 t = std::clamp(1.0f - particle.life / particle.maxLife, 0.0f, 1.0f); + particle.size = effect.startSize + (effect.endSize - effect.startSize) * t; + const Vec4 start(effect.startColor.x * tint.x, effect.startColor.y * tint.y, + effect.startColor.z * tint.z, effect.startColor.w * tint.w); + const Vec4 end(effect.endColor.x * tint.x, effect.endColor.y * tint.y, + effect.endColor.z * tint.z, effect.endColor.w * tint.w); + particle.color = Vec4(start.x + (end.x - start.x) * t, start.y + (end.y - start.y) * t, + start.z + (end.z - start.z) * t, start.w + (end.w - start.w) * t); + } + std::erase_if(pool.particles, [](const SimParticle& particle) { return particle.life <= 0.0f; }); + }); + + for (auto it = g_pools.begin(); it != g_pools.end();) { + if (std::find(live.begin(), live.end(), it->first) == live.end()) it = g_pools.erase(it); + else ++it; + } +} + +const std::vector* particlesFor(u32 entityId) { + const auto it = g_pools.find(entityId); + if (it == g_pools.end()) return nullptr; + return &it->second.particles; +} + +void collectOverlayEffects(ECS::World& world, bool onlyTwoD, std::vector& out) { + ECS::ComponentQuery query; + query.with(); + world.forEach(query, [&](ECS::Entity entity, EffectComponent& effect) { + if (!effect.enabled) return; + const EffectDomain domain = static_cast(effect.domain); + if (onlyTwoD && domain != EffectDomain::TwoD) return; + if (static_cast(effect.kind) == EffectKind::Particles) { + const std::vector* particles = particlesFor(entity.id()); + if (!particles) return; + for (const SimParticle& particle : *particles) { + EffectSprite sprite; + sprite.position = particle.position; + sprite.size = particle.size; + sprite.color = particle.color; + out.push_back(sprite); + } + } else if (static_cast(effect.kind) == EffectKind::VolumetricLight && !onlyTwoD) { + const Vec3 origin = effectOrigin(world, entity, effect, {}); + const VolumetricShape shape = volumetricShapeOf(effect); + if (shape == VolumetricShape::Sphere) { + EffectSprite sprite; + sprite.position = origin; + sprite.size = effect.radius; + sprite.color = Vec4(effect.lightColor.x, effect.lightColor.y, effect.lightColor.z, + std::clamp(effect.density, 0.0f, 1.0f)); + out.push_back(sprite); + } else { + const BeamAxes axes = beamAxes(world, entity); + const f32 length = std::max(effect.radius, 0.2f); + for (int step = 0; step < 5; ++step) { + const f32 t = static_cast(step) / 4.0f; + EffectSprite sprite; + sprite.position = origin + axes.forward * length * t; + const f32 width = effect.startSize + (effect.endSize - effect.startSize) * t; + sprite.size = std::max(width, 0.1f); + sprite.color = Vec4(effect.lightColor.x, effect.lightColor.y, effect.lightColor.z, + std::clamp(effect.density * (1.0f - t), 0.0f, 1.0f)); + out.push_back(sprite); + } + } + } else if (static_cast(effect.kind) == EffectKind::Fog) { + const bool twoD = domain == EffectDomain::TwoD; + emitFog(effect, effectOrigin(world, entity, effect, {}), twoD, + [&](const Vec3& position, f32 size, const Vec4& color) { + EffectSprite sprite; + sprite.position = position; + sprite.size = size; + sprite.color = color; + out.push_back(sprite); + }); + } + }); + + if (onlyTwoD) return; + ECS::ComponentQuery legacy; + legacy.with(); + legacy.with(); + world.forEach( + legacy, [&](ECS::Entity, ECS::ParticleEmitterComponent& emitter, ECS::Transform&) { + for (const auto& particle : emitter.activeParticles) { + EffectSprite sprite; + sprite.position = Vec3(particle.position.x, particle.position.y, 0.0f); + sprite.size = particle.size * 0.02f; + const u32 color = particle.color; + sprite.color = Vec4(((color >> 24) & 0xFFu) / 255.0f, ((color >> 16) & 0xFFu) / 255.0f, + ((color >> 8) & 0xFFu) / 255.0f, (color & 0xFFu) / 255.0f); + out.push_back(sprite); + } + }); +} + +void buildEffectMesh(ECS::World& world, const Vec3& cameraPos, const Vec3& cameraRight, + const Vec3& cameraUp, Assets::Mesh3D& mesh) { + mesh.vertices.clear(); + mesh.indices.clear(); + Vec3 right = cameraRight; + Vec3 up = cameraUp; + if (right.lengthSquared() < 1.0e-6f) right = Vec3(1.0f, 0.0f, 0.0f); + else right = right.normalized(); + if (up.lengthSquared() < 1.0e-6f) up = Vec3(0.0f, 1.0f, 0.0f); + else up = up.normalized(); + + ECS::ComponentQuery query; + query.with(); + world.forEach(query, [&](ECS::Entity entity, EffectComponent& effect) { + if (!effect.enabled || mesh.vertices.size() >= 4096) return; + const EffectDomain domain = static_cast(effect.domain); + if (domain == EffectDomain::TwoD) return; + const EffectKind kind = static_cast(effect.kind); + if (kind == EffectKind::Particles) { + const std::vector* particles = particlesFor(entity.id()); + if (!particles) return; + for (const SimParticle& particle : *particles) { + if (mesh.vertices.size() >= 4096) break; + pushQuad(mesh, particle.position, right, up, std::max(particle.size, 0.001f), particle.color); + } + } else if (kind == EffectKind::VolumetricLight) { + const Vec3 center = effectOrigin(world, entity, effect, cameraPos); + if (volumetricShapeOf(effect) == VolumetricShape::Sphere) { + const Vec3 viewDir = cameraPos - center; + const Vec3 view = viewDir.lengthSquared() > 1.0e-6f ? viewDir.normalized() : up; + const f32 scatter = volumetricScatter(center + view * effect.radius * 0.25f, center, view, + effect.radius, effect.density, effect.anisotropy, effect.intensity); + const u32 shells = shellCount(static_cast(effect.quality)); + const f32 scales[3] = {1.0f, 0.62f, 0.34f}; + for (u32 shell = 0; shell < shells; ++shell) { + const f32 alpha = std::clamp(0.35f * effect.density + scatter, 0.0f, 0.8f) / + static_cast(shell + 1); + const Vec4 color(effect.lightColor.x * effect.intensity, effect.lightColor.y * effect.intensity, + effect.lightColor.z * effect.intensity, alpha); + pushQuad(mesh, center, right, up, effect.radius * scales[shell], color); + } + } else { + emitVolumetricShafts(world, entity, effect, center, cameraPos, mesh); + } + } else if (kind == EffectKind::Fog) { + const Vec3 center = effectOrigin(world, entity, effect, cameraPos); + emitFog(effect, center, false, [&](const Vec3& position, f32 size, const Vec4& color) { + if (mesh.vertices.size() >= 4096) return; + pushQuad(mesh, position, right, up, size, color); + }); + } + }); +} + +void applyMaterialReflection(f32 reflection, u8 budget, SurfaceShade& shade) { + reflection = std::clamp(reflection, 0.0f, 1.0f); + if (reflection <= 0.0f) return; + shade.reflection = std::max(shade.reflection, reflection); + shade.roughness = shade.roughness + (std::min(shade.roughness, 0.14f) - shade.roughness) * reflection; + shade.metallic = std::max(shade.metallic, reflection * 0.85f); + shade.reflectance = std::max(shade.reflectance, 0.04f); + if (budget >= 1 && budget <= 3) { + shade.ssrSteps = static_cast(reflectionSteps(budget)); + const EffectQuality quality = budget == 1 ? EffectQuality::Performance + : budget == 3 ? EffectQuality::Quality + : EffectQuality::Balanced; + shade.ssrRoughness = reflectionRoughnessGate(quality); + } +} + +void applyEffectShade(const EffectComponent& effect, SurfaceShade& shade) { + if (!effect.enabled) return; + const EffectKind kind = static_cast(effect.kind); + if (kind == EffectKind::ReflectiveSurface || effect.reflection > 0.0f) { + const f32 strength = std::clamp(effect.reflection > 0.0f ? effect.reflection : 0.85f, 0.0f, 1.0f); + shade.roughness = shade.roughness + (effect.roughness - shade.roughness) * strength; + shade.metallic = shade.metallic + (effect.metallic - shade.metallic) * strength; + shade.reflectance = std::max(shade.reflectance, 0.04f); + shade.reflection = std::max(shade.reflection, strength); + shade.ssrSteps = static_cast(reflectionSteps(static_cast(effect.quality))); + shade.ssrRoughness = reflectionRoughnessGate(static_cast(effect.quality)); + shade.planar = effect.reflectMode == 2; + } + if (kind == EffectKind::MaterialShade) { + shade.albedo.x *= effect.tint.x; + shade.albedo.y *= effect.tint.y; + shade.albedo.z *= effect.tint.z; + shade.emission = shade.emission + effect.tint * std::max(effect.emissionBoost, 0.0f); + shade.roughness = std::clamp(shade.roughness + effect.roughnessBias, 0.02f, 1.0f); + } +} + +} // namespace Caffeine::Effects diff --git a/src/effects/EffectSystem.hpp b/src/effects/EffectSystem.hpp new file mode 100644 index 00000000..561bd07a --- /dev/null +++ b/src/effects/EffectSystem.hpp @@ -0,0 +1,45 @@ +#pragma once + +#include "assets/MeshTypes.hpp" +#include "effects/EffectTypes.hpp" +#include "ecs/World.hpp" +#include "math/Vec3.hpp" +#include "math/Vec4.hpp" + +#include + +namespace Caffeine::Effects { + +struct EffectSprite { + Vec3 position; + f32 size = 0.1f; + Vec4 color{1.0f, 1.0f, 1.0f, 1.0f}; +}; + +struct SurfaceShade { + Vec4 albedo{1.0f, 1.0f, 1.0f, 1.0f}; + Vec3 emission{0.0f, 0.0f, 0.0f}; + f32 metallic = 0.0f; + f32 roughness = 0.5f; + f32 reflectance = 0.04f; + f32 reflection = 0.0f; + i32 ssrSteps = -1; + f32 ssrRoughness = -1.0f; + bool planar = false; +}; + +void tickEffects(ECS::World& world, f32 dt, const Vec3& cameraPos); + +const std::vector* particlesFor(u32 entityId); + +/// Sprites for the 2D overlay. `onlyTwoD` skips billboards the 3D pass already draws. +void collectOverlayEffects(ECS::World& world, bool onlyTwoD, std::vector& out); + +/// Camera-facing quads. Colour is stored in the vertex tangent. +void buildEffectMesh(ECS::World& world, const Vec3& cameraPos, const Vec3& cameraRight, + const Vec3& cameraUp, Assets::Mesh3D& mesh); + +void applyMaterialReflection(f32 reflection, u8 budget, SurfaceShade& shade); +void applyEffectShade(const EffectComponent& effect, SurfaceShade& shade); + +} // namespace Caffeine::Effects diff --git a/src/effects/EffectTypes.hpp b/src/effects/EffectTypes.hpp new file mode 100644 index 00000000..bda48ede --- /dev/null +++ b/src/effects/EffectTypes.hpp @@ -0,0 +1,276 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec3.hpp" +#include "math/Vec4.hpp" + +#include +#include + +namespace Caffeine::Effects { + +/// World effects sit on an entity. Camera effects follow the viewer but are not the post stack. +enum class EffectSpace : u8 { World = 0, Camera = 1 }; + +/// TwoD stays on the sprite plane. ThreeD billboards in the scene. Both does each in its view. +enum class EffectDomain : u8 { Both = 0, TwoD = 1, ThreeD = 2 }; + +enum class EffectKind : u8 { + Particles = 0, + VolumetricLight = 1, + ReflectiveSurface = 2, + MaterialShade = 3, + Fog = 4 +}; + +/// Look of a fog volume. Dust, mist and smoke share the fog simulator. +enum class EffectFogStyle : u8 { Fog = 0, Dust = 1, Mist = 2, Smoke = 3 }; + +/// Volumetric light format. Shafts travel along the entity forward (-Z). +enum class VolumetricShape : u8 { + Sphere = 0, + Cone = 1, + Box = 2, + Cylinder = 3, + Window = 4 +}; + +/// Performance spends fewer reflection steps and a tighter roughness gate. +enum class EffectQuality : u8 { Performance = 0, Balanced = 1, Quality = 2 }; + +struct EffectComponent { + u8 enabled = 1; + u8 space = static_cast(EffectSpace::World); + u8 domain = static_cast(EffectDomain::Both); + u8 kind = static_cast(EffectKind::Particles); + u8 quality = static_cast(EffectQuality::Balanced); + /// 0 inherit the scene mode, 1 probe, 2 planar, 3 screen-space. + u8 reflectMode = 0; + /// Fog style when kind is Fog. See EffectFogStyle. + u8 pad0 = 0; + /// Volumetric light format when kind is VolumetricLight. See VolumetricShape. + u8 pad1 = 0; + char materialPath[260] = {}; + + i32 maxParticles = 128; + f32 rate = 24.0f; + f32 lifetime = 1.4f; + Vec3 velocityMin{-0.35f, 0.2f, -0.35f}; + Vec3 velocityMax{0.35f, 1.6f, 0.35f}; + Vec3 gravity{0.0f, -1.4f, 0.0f}; + f32 drag = 0.2f; + f32 startSize = 0.16f; + f32 endSize = 0.02f; + Vec4 startColor{1.0f, 0.72f, 0.28f, 1.0f}; + Vec4 endColor{0.12f, 0.1f, 0.08f, 0.0f}; + u32 seed = 1; + f32 emitCarry = 0.0f; + + f32 density = 0.18f; + f32 anisotropy = 0.35f; + f32 radius = 3.0f; + Vec3 lightColor{1.0f, 0.93f, 0.78f}; + f32 intensity = 2.5f; + + f32 reflection = 0.0f; + f32 roughness = 0.12f; + f32 metallic = 0.85f; + Vec3 tint{1.0f, 1.0f, 1.0f}; + f32 emissionBoost = 0.0f; + f32 roughnessBias = 0.0f; +}; + +struct SimParticle { + Vec3 position; + Vec3 velocity; + f32 life = 0.0f; + f32 maxLife = 1.0f; + f32 size = 0.1f; + Vec4 color{1.0f, 1.0f, 1.0f, 1.0f}; +}; + +inline u32 reflectionSteps(EffectQuality quality) { + switch (quality) { + case EffectQuality::Performance: return 8; + case EffectQuality::Quality: return 48; + case EffectQuality::Balanced: break; + } + return 24; +} + +inline u32 reflectionSteps(u8 budget) { + if (budget <= 1) return reflectionSteps(EffectQuality::Performance); + if (budget >= 3) return reflectionSteps(EffectQuality::Quality); + return reflectionSteps(EffectQuality::Balanced); +} + +inline f32 reflectionRoughnessGate(EffectQuality quality) { + switch (quality) { + case EffectQuality::Performance: return 0.35f; + case EffectQuality::Quality: return 0.75f; + case EffectQuality::Balanced: break; + } + return 0.55f; +} + +inline void configureParticle(EffectComponent& effect, EffectDomain domain) { + effect.enabled = 1; + effect.kind = static_cast(EffectKind::Particles); + effect.domain = static_cast(domain); + effect.space = static_cast(EffectSpace::World); + if (domain == EffectDomain::TwoD) { + effect.velocityMin = Vec3(-0.4f, 0.15f, 0.0f); + effect.velocityMax = Vec3(0.4f, 1.1f, 0.0f); + effect.gravity = Vec3(0.0f, -2.0f, 0.0f); + effect.startSize = 0.12f; + effect.endSize = 0.02f; + effect.startColor = Vec4(1.0f, 0.86f, 0.42f, 1.0f); + effect.endColor = Vec4(1.0f, 0.42f, 0.12f, 0.0f); + } else { + effect.velocityMin = Vec3(-0.35f, 0.4f, -0.35f); + effect.velocityMax = Vec3(0.35f, 1.8f, 0.35f); + effect.gravity = Vec3(0.0f, -1.4f, 0.0f); + effect.startSize = 0.18f; + effect.endSize = 0.02f; + effect.startColor = Vec4(1.0f, 0.72f, 0.28f, 1.0f); + effect.endColor = Vec4(0.12f, 0.1f, 0.08f, 0.0f); + } +} + +inline VolumetricShape volumetricShapeOf(const EffectComponent& effect) { + return static_cast(std::min(effect.pad1, 4)); +} + +inline void setVolumetricGrid(EffectComponent& effect, u32 columns, u32 rows) { + columns = std::clamp(columns, 1u, 8u); + rows = std::clamp(rows, 1u, 8u); + effect.seed = columns | (rows << 8); +} + +inline void volumetricGridOf(const EffectComponent& effect, u32& columns, u32& rows) { + columns = std::clamp(effect.seed & 0xFFu, 1u, 8u); + const u32 storedRows = (effect.seed >> 8) & 0xFFu; + rows = storedRows == 0 ? 1u : std::clamp(storedRows, 1u, 8u); +} + +inline const char* volumetricShapeName(VolumetricShape shape) { + switch (shape) { + case VolumetricShape::Cone: return "Cone"; + case VolumetricShape::Box: return "Box"; + case VolumetricShape::Cylinder: return "Cylinder"; + case VolumetricShape::Window: return "Window"; + case VolumetricShape::Sphere: break; + } + return "Sphere"; +} + +inline void configureVolumetricLight(EffectComponent& effect, + VolumetricShape shape = VolumetricShape::Sphere) { + effect.enabled = 1; + effect.kind = static_cast(EffectKind::VolumetricLight); + effect.domain = static_cast(EffectDomain::ThreeD); + effect.space = static_cast(EffectSpace::World); + effect.pad1 = static_cast(shape); + effect.seed = 1; + effect.lightColor = Vec3(1.0f, 0.93f, 0.78f); + effect.intensity = 2.5f; + effect.density = 0.22f; + effect.anisotropy = 0.45f; + effect.radius = 3.0f; + effect.startSize = 0.8f; + effect.endSize = 0.8f; + switch (shape) { + case VolumetricShape::Cone: + effect.radius = 8.0f; + effect.startSize = 0.2f; + effect.endSize = 1.6f; + effect.anisotropy = 0.62f; + effect.density = 0.28f; + break; + case VolumetricShape::Box: + effect.radius = 7.0f; + effect.startSize = 1.8f; + effect.endSize = 2.6f; + effect.anisotropy = 0.7f; + effect.density = 0.24f; + effect.intensity = 3.0f; + break; + case VolumetricShape::Cylinder: + effect.radius = 6.0f; + effect.startSize = 0.7f; + effect.endSize = 0.7f; + effect.anisotropy = 0.55f; + break; + case VolumetricShape::Window: + effect.radius = 9.0f; + effect.startSize = 1.8f; + effect.endSize = 3.4f; + setVolumetricGrid(effect, 4, 6); + effect.anisotropy = 0.75f; + effect.density = 0.32f; + effect.intensity = 3.4f; + effect.lightColor = Vec3(1.0f, 0.90f, 0.70f); + break; + case VolumetricShape::Sphere: + break; + } +} + +inline void configureFog(EffectComponent& effect, EffectDomain domain, EffectFogStyle style) { + effect.enabled = 1; + effect.kind = static_cast(EffectKind::Fog); + effect.domain = static_cast(domain); + effect.space = static_cast(EffectSpace::World); + effect.pad0 = static_cast(style); + effect.anisotropy = 0.08f; + switch (style) { + case EffectFogStyle::Dust: + effect.density = 0.28f; + effect.radius = domain == EffectDomain::TwoD ? 1.4f : 2.2f; + effect.lightColor = Vec3(0.62f, 0.50f, 0.34f); + effect.intensity = 0.7f; + effect.anisotropy = 0.2f; + break; + case EffectFogStyle::Mist: + effect.density = 0.08f; + effect.radius = domain == EffectDomain::TwoD ? 3.5f : 8.0f; + effect.lightColor = Vec3(0.84f, 0.88f, 0.92f); + effect.intensity = 0.45f; + break; + case EffectFogStyle::Smoke: + effect.density = 0.4f; + effect.radius = domain == EffectDomain::TwoD ? 1.1f : 2.0f; + effect.lightColor = Vec3(0.22f, 0.22f, 0.24f); + effect.intensity = 0.85f; + effect.anisotropy = 0.45f; + break; + case EffectFogStyle::Fog: + effect.density = 0.14f; + effect.radius = domain == EffectDomain::TwoD ? 2.8f : 6.0f; + effect.lightColor = Vec3(0.72f, 0.78f, 0.84f); + effect.intensity = 0.55f; + break; + } +} + +inline f32 henyeyGreenstein(f32 cosTheta, f32 anisotropy) { + const f32 g = std::clamp(anisotropy, -0.9f, 0.9f); + const f32 g2 = g * g; + const f32 denom = std::max(1.0f + g2 - 2.0f * g * cosTheta, 1.0e-4f); + return (1.0f - g2) / (4.0f * 3.14159265f * std::pow(denom, 1.5f)); +} + +/// One scattering sample inside a spherical volume. Zero outside the radius. +inline f32 volumetricScatter(const Vec3& point, const Vec3& lightPos, const Vec3& viewDir, + f32 radius, f32 density, f32 anisotropy, f32 intensity) { + const Vec3 toLight = lightPos - point; + const f32 dist = toLight.length(); + if (dist > std::max(radius, 0.0f) || dist < 1.0e-4f || density <= 0.0f) return 0.0f; + const f32 falloff = 1.0f - dist / radius; + const Vec3 lightDir = toLight / dist; + const f32 phase = henyeyGreenstein(viewDir.normalized().dot(lightDir), anisotropy); + const f32 transmittance = std::exp(-density * dist); + return std::max(intensity, 0.0f) * density * falloff * falloff * phase * transmittance; +} + +} // namespace Caffeine::Effects diff --git a/src/navigation/NavVolume.hpp b/src/navigation/NavVolume.hpp new file mode 100644 index 00000000..cc335590 --- /dev/null +++ b/src/navigation/NavVolume.hpp @@ -0,0 +1,153 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec3.hpp" + +#include +#include +#include +#include +#include + +namespace Caffeine::Navigation { + +/// Grid navigation volume. The ground plane is XZ (3D) and maps 2D Y onto Z. +struct NavVolume { + i32 width = 16; + i32 height = 16; + f32 cellSize = 1.0f; + Vec3 origin{}; + std::vector blocked; + + void resize(i32 w, i32 h) { + width = std::max(1, w); + height = std::max(1, h); + blocked.assign(static_cast(width * height), 0); + } + + bool inBounds(i32 x, i32 y) const { + return x >= 0 && y >= 0 && x < width && y < height; + } + + bool isBlocked(i32 x, i32 y) const { + if (!inBounds(x, y) || blocked.empty()) return !inBounds(x, y); + return blocked[static_cast(y * width + x)] != 0; + } + + void setBlocked(i32 x, i32 y, bool value) { + if (blocked.size() != static_cast(width * height)) resize(width, height); + if (!inBounds(x, y)) return; + blocked[static_cast(y * width + x)] = value ? 1 : 0; + } + + void worldToCell(const Vec3& world, i32& x, i32& z) const { + const f32 size = cellSize > 0.0f ? cellSize : 1.0f; + x = static_cast(std::floor((world.x - origin.x) / size)); + z = static_cast(std::floor((world.z - origin.z) / size)); + } + + Vec3 cellCenter(i32 x, i32 z) const { + const f32 size = cellSize > 0.0f ? cellSize : 1.0f; + return Vec3(origin.x + (static_cast(x) + 0.5f) * size, origin.y, + origin.z + (static_cast(z) + 0.5f) * size); + } + + /// 4-connected A*. `out` is cleared and filled with cell centers from start to goal. + bool findPath(const Vec3& from, const Vec3& to, std::vector& out) const { + out.clear(); + if (width <= 0 || height <= 0) return false; + i32 sx = 0, sz = 0, gx = 0, gz = 0; + worldToCell(from, sx, sz); + worldToCell(to, gx, gz); + if (!inBounds(sx, sz) || !inBounds(gx, gz)) return false; + if (isBlocked(sx, sz) || isBlocked(gx, gz)) return false; + if (sx == gx && sz == gz) { + out.push_back(cellCenter(gx, gz)); + return true; + } + + const int cellCount = width * height; + std::vector cost(static_cast(cellCount), 1.0e30f); + std::vector parent(static_cast(cellCount), -1); + std::vector closed(static_cast(cellCount), 0); + + auto index = [&](i32 x, i32 y) { return y * width + x; }; + auto heuristic = [&](i32 x, i32 y) { + return static_cast(std::abs(gx - x) + std::abs(gz - y)); + }; + + struct OpenNode { + f32 score; + i32 index; + bool operator<(const OpenNode& other) const { return score > other.score; } + }; + std::priority_queue open; + const i32 start = index(sx, sz); + cost[static_cast(start)] = 0.0f; + open.push({heuristic(sx, sz), start}); + + const i32 neighbors[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; + bool found = false; + while (!open.empty()) { + const i32 current = open.top().index; + open.pop(); + if (closed[static_cast(current)]) continue; + closed[static_cast(current)] = 1; + const i32 cx = current % width; + const i32 cy = current / width; + if (cx == gx && cy == gz) { + found = true; + break; + } + for (const auto& step : neighbors) { + const i32 nx = cx + step[0]; + const i32 ny = cy + step[1]; + if (!inBounds(nx, ny) || isBlocked(nx, ny)) continue; + const i32 next = index(nx, ny); + if (closed[static_cast(next)]) continue; + const f32 nextCost = cost[static_cast(current)] + 1.0f; + if (nextCost >= cost[static_cast(next)]) continue; + cost[static_cast(next)] = nextCost; + parent[static_cast(next)] = current; + open.push({nextCost + heuristic(nx, ny), next}); + } + } + if (!found) return false; + + std::vector chain; + for (i32 cursor = index(gx, gz); cursor >= 0; cursor = parent[static_cast(cursor)]) { + chain.push_back(cursor); + if (cursor == start) break; + } + std::reverse(chain.begin(), chain.end()); + out.reserve(chain.size()); + for (i32 cell : chain) { + out.push_back(cellCenter(cell % width, cell / width)); + } + return !out.empty(); + } +}; + +enum class NavMode : u8 { Idle = 0, Patrol = 1, Follow = 2, Scripted = 3 }; + +static constexpr int kMaxPatrolPoints = 16; + +/// Agent that follows a path. The mode is generic: idle, patrol, follow, or a Lua script. +struct NavAgent { + Vec3 destination{}; + f32 speed = 3.0f; + f32 arriveRadius = 0.25f; + NavMode mode = NavMode::Idle; + u32 followEntity = u32_max; + u32 patrolCount = 0; + u32 patrolIndex = 0; + Vec3 patrol[kMaxPatrolPoints]{}; + char behaviorScript[256] = {}; + bool hasDestination = false; + bool planDirty = true; + Vec3 plannedDestination{}; + std::vector path; + u32 pathCursor = 0; +}; + +} // namespace Caffeine::Navigation diff --git a/src/navigation/NavigationSystem.hpp b/src/navigation/NavigationSystem.hpp new file mode 100644 index 00000000..a1dd5daa --- /dev/null +++ b/src/navigation/NavigationSystem.hpp @@ -0,0 +1,110 @@ +#pragma once + +#include "navigation/NavVolume.hpp" +#include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/ComponentQuery.hpp" +#include "ecs/World.hpp" + +namespace Caffeine::Navigation { + +inline NavVolume* findVolume(ECS::World& world) { + ECS::ComponentQuery query; + query.with(); + NavVolume* found = nullptr; + world.forEach(query, [&](ECS::Entity, NavVolume& volume) { + if (!found) found = &volume; + }); + return found; +} + +inline Vec3 readAgentPosition(ECS::World& world, ECS::Entity entity, bool& is2d) { + is2d = false; + if (const ECS::Position3D* position = world.get(entity)) { + return position->position; + } + if (const ECS::Transform* transform = world.get(entity)) { + return transform->position; + } + if (const ECS::Position2D* position = world.get(entity)) { + is2d = true; + return Vec3(position->x, 0.0f, position->y); + } + return {}; +} + +inline void writeAgentPosition(ECS::World& world, ECS::Entity entity, const Vec3& position, bool is2d) { + if (!is2d) { + if (ECS::Position3D* component = world.get(entity)) { + component->position = position; + return; + } + if (ECS::Transform* transform = world.get(entity)) { + transform->position = position; + return; + } + } + if (ECS::Position2D* component = world.get(entity)) { + component->x = position.x; + component->y = is2d ? position.z : position.y; + } +} + +inline void steerAgent(ECS::World& world, ECS::Entity entity, NavAgent& agent, NavVolume* volume, f32 dt) { + if (agent.mode == NavMode::Follow && agent.followEntity != u32_max) { + ECS::Entity target(agent.followEntity, &world); + if (target.isValid()) { + bool ignored = false; + agent.destination = readAgentPosition(world, target, ignored); + agent.hasDestination = true; + } + } else if (agent.mode == NavMode::Patrol && agent.patrolCount > 0) { + agent.patrolIndex %= agent.patrolCount; + agent.destination = agent.patrol[agent.patrolIndex]; + agent.hasDestination = true; + } + + if (!agent.hasDestination || agent.mode == NavMode::Idle || !volume) return; + + bool is2d = false; + Vec3 position = readAgentPosition(world, entity, is2d); + if (agent.planDirty || (agent.destination - agent.plannedDestination).lengthSquared() > 0.01f) { + agent.path.clear(); + agent.pathCursor = 0; + volume->findPath(position, agent.destination, agent.path); + agent.plannedDestination = agent.destination; + agent.planDirty = false; + } + if (agent.path.empty()) return; + + while (agent.pathCursor < agent.path.size()) { + const Vec3 target = agent.path[agent.pathCursor]; + Vec3 delta = target - position; + if (is2d) delta.y = 0.0f; + const f32 distance = delta.length(); + if (distance <= agent.arriveRadius) { + ++agent.pathCursor; + if (agent.pathCursor >= agent.path.size() && agent.mode == NavMode::Patrol && + agent.patrolCount > 0) { + agent.patrolIndex = (agent.patrolIndex + 1) % agent.patrolCount; + agent.planDirty = true; + } + continue; + } + const f32 step = std::min(distance, std::max(agent.speed, 0.0f) * dt); + position = position + delta * (step / distance); + writeAgentPosition(world, entity, position, is2d); + return; + } +} + +inline void updateNavigation(ECS::World& world, f32 dt) { + NavVolume* volume = findVolume(world); + ECS::ComponentQuery query; + query.with(); + world.forEach(query, [&](ECS::Entity entity, NavAgent& agent) { + steerAgent(world, entity, agent, volume, dt); + }); +} + +} // namespace Caffeine::Navigation diff --git a/src/render/GpuSceneRenderer.cpp b/src/render/GpuSceneRenderer.cpp index e0f211ec..7e9ea0a0 100644 --- a/src/render/GpuSceneRenderer.cpp +++ b/src/render/GpuSceneRenderer.cpp @@ -1,4 +1,6 @@ #include "render/GpuSceneRenderer.hpp" +#include "animation/SkinLibrary.hpp" +#include "effects/EffectSystem.hpp" #include "render/PostProcessRenderer.hpp" #include "render/CoarseOcclusion.hpp" #include "render/InstanceBatch.hpp" @@ -85,6 +87,9 @@ struct LightingUBO { float prevView[16]; float screen[4]; float viewProj[16]; + float reflectPerf[4]; + float reflectQuality[4]; + float reflectExtra[4]; }; static_assert(offsetof(LightingUBO, iblColor) == 608, "LightingUBO.iblColor must match GLSL std140"); @@ -92,6 +97,7 @@ static_assert(offsetof(LightingUBO, reflectVP) == 688, "LightingUBO.reflectVP mu static_assert(offsetof(LightingUBO, emission) == 752, "LightingUBO.emission must match GLSL std140"); static_assert(offsetof(LightingUBO, prevViewProj) == 896, "LightingUBO.prevViewProj must match GLSL std140"); static_assert(offsetof(LightingUBO, viewProj) == 1040, "LightingUBO.viewProj must match GLSL std140"); +static_assert(offsetof(LightingUBO, reflectPerf) == 1104, "LightingUBO.reflectPerf must match GLSL std140"); struct SkyUBO { float invViewProj[16]; @@ -470,7 +476,30 @@ Assets::Mesh3D* GpuSceneRenderer::selectMeshLod(const Assets::Mesh3D* source, EC return chosen; } +RHI::Buffer* GpuSceneRenderer::vertexBufferFor(const MeshDraw& draw) { + if (!draw.mesh) return nullptr; + if (!draw.skinnedVertices || draw.skinnedVertices->empty() || !m_device) { + return draw.mesh->vertexBuffer; + } + const u64 bytes = static_cast(draw.skinnedVertices->size() * sizeof(Assets::Vertex3D)); + RHI::Buffer*& slot = m_skinBuffers[draw.entity.id()]; + if (!slot || slot->size != bytes) { + if (slot) m_device->destroyBuffer(slot); + RHI::BufferDesc desc; + desc.size = bytes; + slot = m_device->createBuffer(desc, RHI::BufferUsage::Vertex); + } + if (slot) m_device->uploadBuffer(slot, draw.skinnedVertices->data(), bytes); + return slot ? slot : draw.mesh->vertexBuffer; +} + void GpuSceneRenderer::shutdown() { + if (m_device) { + for (auto& entry : m_skinBuffers) { + if (entry.second) m_device->destroyBuffer(entry.second); + } + } + m_skinBuffers.clear(); for (auto& [_, cache] : m_meshLods) { destroyMeshGpu(cache.medium); destroyMeshGpu(cache.far); @@ -497,6 +526,10 @@ void GpuSceneRenderer::shutdown() { if (m_blendPipeline) m_device->destroyPipeline(m_blendPipeline); if (m_skyPipeline) m_device->destroyPipeline(m_skyPipeline); if (m_gridPipeline) m_device->destroyPipeline(m_gridPipeline); + if (m_effectPipeline) m_device->destroyPipeline(m_effectPipeline); + if (m_effectVert) m_device->destroyShader(m_effectVert); + if (m_effectFrag) m_device->destroyShader(m_effectFrag); + destroyMeshGpu(m_effectMesh); if (m_instancedVert) m_device->destroyShader(m_instancedVert); if (m_instanceBuffer) m_device->destroyBuffer(m_instanceBuffer); if (m_reflectionColor) m_device->destroyTexture(m_reflectionColor); @@ -517,6 +550,9 @@ void GpuSceneRenderer::shutdown() { m_fullscreenVert = nullptr; m_skyFrag = nullptr; m_gridFrag = nullptr; + m_effectVert = nullptr; + m_effectFrag = nullptr; + m_effectPipeline = nullptr; m_scenePipeline = nullptr; m_wireframePipeline = nullptr; m_terrainPipeline = nullptr; @@ -614,6 +650,17 @@ bool GpuSceneRenderer::createPipelines() { gridDesc.blendMode = RHI::BlendMode::Alpha; m_gridPipeline = m_device->createGraphicsPipeline(m_fullscreenVert, m_gridFrag, gridDesc); } + m_effectVert = createBuiltinShader(m_device, BuiltinShader::EffectBillboardVertex, + RHI::ShaderStage::Vertex, 1); + m_effectFrag = createBuiltinShader(m_device, BuiltinShader::EffectBillboardFragment, + RHI::ShaderStage::Fragment, 0); + if (m_effectVert && m_effectFrag) { + RHI::GraphicsPipelineDesc effectDesc{}; + fillMeshPipelineDesc(effectDesc, layout, attrs, kHdrFormat, true, true); + effectDesc.depthWrite = false; + effectDesc.blendMode = RHI::BlendMode::Premultiplied; + m_effectPipeline = m_device->createGraphicsPipeline(m_effectVert, m_effectFrag, effectDesc); + } // Color-only shadow pass (no depth attachment) for cubemap / 2D shadow maps. RHI::GraphicsPipelineDesc shadowDesc{}; @@ -667,7 +714,7 @@ void GpuSceneRenderer::pushShadowDraw(RHI::CommandBuffer* cmd, const MeshDraw& d cmd->bindPipeline(m_shadowPipeline); cmd->pushUniformData(RHI::ShaderStage::Vertex, 0, &ubo, sizeof(ubo)); - cmd->bindVertexBuffer(draw.mesh->vertexBuffer); + cmd->bindVertexBuffer(vertexBufferFor(draw)); cmd->bindIndexBuffer(draw.mesh->indexBuffer); cmd->drawIndexed(indexCount, firstIndex, 0); } @@ -1017,7 +1064,7 @@ void GpuSceneRenderer::drawMeshList(RHI::CommandBuffer* cmd, : 0.0f; const bool planarOn = m_reflectionValid && m_reflectionColor && !m_inReflectionPass && !options.clipBelowEnabled && - features.reflections == ReflectionMode::Planar; + (features.reflections == ReflectionMode::Planar || m_materialPlanar); base.reflectParams[0] = planarOn ? features.reflectionIntensity : 0.0f; base.reflectParams[1] = options.clipBelowEnabled ? options.clipBelowY : features.reflectionPlaneY; base.reflectParams[2] = options.clipBelowEnabled ? 1.0f : 0.0f; @@ -1101,6 +1148,17 @@ void GpuSceneRenderer::drawMeshList(RHI::CommandBuffer* cmd, setVec4(lights.materialFlags, static_cast(draw.alphaMode), draw.emissionMapPath.empty() ? 0.0f : 1.0f, pass.opaqueCopyBound ? 1.0f : 0.0f, ssrOn ? 1.0f : 0.0f); + if (draw.ssrStepsOverride >= 0) { + lights.ssrParams[1] = draw.ssrRoughnessGate > 0.0f ? draw.ssrRoughnessGate : lights.ssrParams[1]; + lights.ssrParams[2] = static_cast(draw.ssrStepsOverride); + if (draw.ssrStepsOverride == 0) lights.materialFlags[3] = 0.0f; + } + setVec4(lights.reflectPerf, draw.reflectPerformance ? 1.0f : 0.0f, draw.ssrResolution, + draw.ssrMaxSteps, draw.ssrTemporalFrames); + setVec4(lights.reflectQuality, draw.reflectQuality ? 1.0f : 0.0f, draw.ssrSamples, + draw.ssrDenoise, draw.ssrDistance); + setVec4(lights.reflectExtra, draw.planarReceiver ? 1.0f : 0.0f, draw.ssrProbeBlend, + draw.ssrBounces, 0.0f); } if (!wireframe && draw.isTerrain) { @@ -1175,7 +1233,7 @@ void GpuSceneRenderer::drawMeshList(RHI::CommandBuffer* cmd, std::memcpy(vubo.mvp, mvp.data(), sizeof(vubo.mvp)); std::memcpy(vubo.model, draw.worldMatrix.data(), sizeof(vubo.model)); cmd->pushUniformData(RHI::ShaderStage::Vertex, 0, &vubo, sizeof(vubo)); - cmd->bindVertexBuffer(draw.mesh->vertexBuffer); + cmd->bindVertexBuffer(vertexBufferFor(draw)); cmd->bindIndexBuffer(draw.mesh->indexBuffer); if (draw.isTerrain) { @@ -1414,6 +1472,26 @@ u32 GpuSceneRenderer::renderMeshes(RHI::CommandBuffer* cmd, const std::vectorbeginRenderPass(effectPass); + cmd->setViewport(0, 0, static_cast(width), static_cast(height)); + cmd->bindPipeline(m_effectPipeline); + VertexUBO effectUbo{}; + std::memcpy(effectUbo.mvp, pass.viewProj.data(), sizeof(effectUbo.mvp)); + const Mat4 identity = Mat4::identity(); + std::memcpy(effectUbo.model, identity.data(), sizeof(effectUbo.model)); + cmd->pushUniformData(RHI::ShaderStage::Vertex, 0, &effectUbo, sizeof(effectUbo)); + cmd->bindVertexBuffer(m_effectMesh.vertexBuffer); + cmd->bindIndexBuffer(m_effectMesh.indexBuffer); + cmd->drawIndexed(static_cast(m_effectMesh.indices.size())); + cmd->endRenderPass(); + } + return static_cast(opaque.size() + translucent.size()); } @@ -1510,6 +1588,12 @@ std::vector GpuSceneRenderer::gatherMeshDraws( MeshDraw draw; draw.entity = entity; draw.mesh = selectMeshLod(mesh, entity, lodDistance); + if (const std::vector* posed = Animation::skinnedVerticesFor(entity.id())) { + if (posed->size() == mesh->vertices.size()) { + draw.mesh = mesh; + draw.skinnedVertices = posed; + } + } draw.worldMatrix = worldMatrix; draw.castShadows = Scene::meshCastsShadows(world, entity); draw.receiveShadows = Scene::meshReceivesShadows(world, entity); @@ -1551,6 +1635,32 @@ std::vector GpuSceneRenderer::gatherMeshDraws( draw.iridescenceThickness = surface.iridescenceThickness; draw.iridescenceIor = surface.iridescenceIor; if (draw.alphaMode == 0 && draw.albedo.w < 1.0f) draw.albedo.w = 1.0f; + Effects::SurfaceShade shade; + shade.albedo = draw.albedo; + shade.emission = draw.emission; + shade.metallic = draw.metallic; + shade.roughness = draw.roughness; + shade.reflectance = draw.reflectance; + Effects::applyMaterialReflection(surface.reflection, surface.reflectionBudget, shade); + draw.albedo = shade.albedo; + draw.emission = shade.emission; + draw.metallic = shade.metallic; + draw.roughness = shade.roughness; + draw.reflectance = shade.reflectance; + draw.reflection = shade.reflection; + draw.ssrStepsOverride = shade.ssrSteps; + draw.ssrRoughnessGate = shade.ssrRoughness; + draw.reflectPerformance = surface.reflectionPerformance != 0; + draw.reflectQuality = surface.reflectionQuality != 0; + draw.ssrResolution = surface.ssrResolution; + draw.ssrMaxSteps = surface.ssrMaxSteps; + draw.ssrTemporalFrames = surface.ssrTemporalFrames; + draw.ssrDistance = surface.ssrDistance; + draw.ssrSamples = surface.ssrSamples; + draw.ssrDenoise = surface.ssrDenoise; + draw.ssrProbeBlend = surface.ssrProbeBlend; + draw.ssrBounces = surface.ssrBounces; + if (draw.reflectQuality && surface.reflectionPlanar) draw.planarReceiver = true; } } if (filter.primitive == ECS::MeshPrimitive::Custom) { @@ -1563,11 +1673,34 @@ std::vector GpuSceneRenderer::gatherMeshDraws( draw.aabbMin = aabb.min; draw.aabbMax = aabb.max; } + if (const Effects::EffectComponent* effect = world.get(entity)) { + Effects::SurfaceShade shade; + shade.albedo = draw.albedo; + shade.emission = draw.emission; + shade.metallic = draw.metallic; + shade.roughness = draw.roughness; + shade.reflectance = draw.reflectance; + shade.reflection = draw.reflection; + shade.ssrSteps = draw.ssrStepsOverride; + shade.ssrRoughness = draw.ssrRoughnessGate; + Effects::applyEffectShade(*effect, shade); + draw.albedo = shade.albedo; + draw.emission = shade.emission; + draw.metallic = shade.metallic; + draw.roughness = std::clamp(shade.roughness, 0.02f, 1.0f); + draw.reflectance = shade.reflectance; + draw.reflection = shade.reflection; + draw.ssrStepsOverride = shade.ssrSteps; + draw.ssrRoughnessGate = shade.ssrRoughness; + if (shade.planar) draw.planarReceiver = true; + } const bool flat = (mesh->bounds.max.y - mesh->bounds.min.y) < 0.08f; const f32 midY = (mesh->bounds.min.y + mesh->bounds.max.y) * 0.5f; const f32 worldY = worldMatrix.transformPoint(Vec3(0.0f, midY, 0.0f)).y; - draw.planarReceiver = flat && options.features.reflections == ReflectionMode::Planar && - std::abs(worldY - options.features.reflectionPlaneY) < 0.4f; + const bool effectPlanar = draw.planarReceiver; + draw.planarReceiver = effectPlanar || + (flat && options.features.reflections == ReflectionMode::Planar && + std::abs(worldY - options.features.reflectionPlaneY) < 0.4f); draws.push_back(draw); }); @@ -2026,11 +2159,16 @@ u32 GpuSceneRenderer::renderSceneHdr(RHI::CommandBuffer* cmd, ECS::World& world, draws.end()); applyCoarseOcclusion(draws, camera, opts); - if (pass.view) { + if (pass.view) { + m_materialPlanar = false; + for (const MeshDraw& draw : draws) { + if (draw.planarReceiver && draw.reflectQuality) m_materialPlanar = true; + } pass.sceneHash = hashProbeScene(draws, m_environment.path()); const bool allowExpensive = !opts.features.expensiveEffectsOnlyWhenSettled || opts.cameraSettled; - if (opts.features.reflections == ReflectionMode::Planar && !opts.wireframeMeshes) { + if ((opts.features.reflections == ReflectionMode::Planar || m_materialPlanar) && + !opts.wireframeMeshes) { if (allowExpensive && !opts.clipBelowEnabled) { renderPlanarReflection(cmd, world, camera, width, height, projectRoot, opts); } @@ -2060,6 +2198,34 @@ u32 GpuSceneRenderer::renderSceneHdr(RHI::CommandBuffer* cmd, ECS::World& world, renderSpotShadows(cmd, world, lighting, draws); } + { + const Vec3 right(camera.view(0, 0), camera.view(0, 1), camera.view(0, 2)); + const Vec3 up(camera.view(1, 0), camera.view(1, 1), camera.view(1, 2)); + Effects::buildEffectMesh(world, camera.position, right, up, m_effectMesh); + if (!m_device || m_effectMesh.vertices.empty() || m_effectMesh.indices.empty()) { + destroyMeshGpu(m_effectMesh); + } else { + const u64 vertexBytes = m_effectMesh.vertices.size() * sizeof(Assets::Vertex3D); + const u64 indexBytes = m_effectMesh.indices.size() * sizeof(u32); + if (!m_effectMesh.vertexBuffer || m_effectMesh.vertexBuffer->size != vertexBytes || + !m_effectMesh.indexBuffer || m_effectMesh.indexBuffer->size != indexBytes) { + destroyMeshGpu(m_effectMesh); + RHI::BufferDesc vertices; + vertices.size = vertexBytes; + m_effectMesh.vertexBuffer = m_device->createBuffer(vertices, RHI::BufferUsage::Vertex); + RHI::BufferDesc indices; + indices.size = indexBytes; + m_effectMesh.indexBuffer = m_device->createBuffer(indices, RHI::BufferUsage::Index); + } + if (m_effectMesh.vertexBuffer) { + m_device->uploadBuffer(m_effectMesh.vertexBuffer, m_effectMesh.vertices.data(), vertexBytes); + } + if (m_effectMesh.indexBuffer) { + m_device->uploadBuffer(m_effectMesh.indexBuffer, m_effectMesh.indices.data(), indexBytes); + } + } + } + CF_PROFILE_SCOPE("GpuSceneRenderer::draw"); return renderMeshes(cmd, draws, camera, lighting, colorTarget, depthTarget, width, height, projectRoot, opts, pass); diff --git a/src/render/GpuSceneRenderer.hpp b/src/render/GpuSceneRenderer.hpp index 0b1f72a1..aeb7ce85 100644 --- a/src/render/GpuSceneRenderer.hpp +++ b/src/render/GpuSceneRenderer.hpp @@ -119,6 +119,7 @@ class GpuSceneRenderer { struct MeshDraw { ECS::Entity entity; Assets::Mesh3D* mesh = nullptr; + const std::vector* skinnedVertices = nullptr; const ECS::TerrainComponent* terrainSettings = nullptr; Mat4 worldMatrix = Mat4::identity(); Vec4 albedo{1, 1, 1, 1}; @@ -148,6 +149,19 @@ class GpuSceneRenderer { f32 iridescence = 0.0f; f32 iridescenceThickness = 400.0f; f32 iridescenceIor = 1.3f; + f32 reflection = 0.0f; + i32 ssrStepsOverride = -1; + f32 ssrRoughnessGate = -1.0f; + bool reflectPerformance = false; + bool reflectQuality = false; + f32 ssrResolution = 0.5f; + f32 ssrMaxSteps = 32.0f; + f32 ssrTemporalFrames = 4.0f; + f32 ssrDistance = 15.0f; + f32 ssrSamples = 64.0f; + f32 ssrDenoise = 0.7f; + f32 ssrProbeBlend = 8.0f; + f32 ssrBounces = 1.0f; i32 probeIndex = -1; bool castShadows = true; bool receiveShadows = true; @@ -163,8 +177,8 @@ class GpuSceneRenderer { bool isTranslucent() const { return transmission > 0.0f || alphaMode == 2; } bool isGlossy() const { - return !isTerrain && (metallic >= 0.5f || roughness <= 0.35f || transmission > 0.0f || - clearcoat > 0.0f); + return !isTerrain && (reflection >= 0.2f || metallic >= 0.5f || roughness <= 0.35f || + transmission > 0.0f || clearcoat > 0.0f); } }; @@ -288,10 +302,16 @@ class GpuSceneRenderer { RHI::Shader* m_instancedVert = nullptr; RHI::Pipeline* m_instancedPipeline = nullptr; RHI::Buffer* m_instanceBuffer = nullptr; + std::unordered_map m_skinBuffers; + RHI::Buffer* vertexBufferFor(const MeshDraw& draw); RHI::Pipeline* m_blendPipeline = nullptr; RHI::Shader* m_fullscreenVert = nullptr; RHI::Shader* m_skyFrag = nullptr; RHI::Shader* m_gridFrag = nullptr; + RHI::Shader* m_effectVert = nullptr; + RHI::Shader* m_effectFrag = nullptr; + RHI::Pipeline* m_effectPipeline = nullptr; + Assets::Mesh3D m_effectMesh; RHI::Pipeline* m_skyPipeline = nullptr; RHI::Pipeline* m_gridPipeline = nullptr; /// Bound to cube sampler slots that have nothing to sample (a 2D texture there is invalid). @@ -302,6 +322,7 @@ class GpuSceneRenderer { u32 m_reflectionHeight = 0; Mat4 m_reflectionVP = Mat4::identity(); bool m_reflectionValid = false; + bool m_materialPlanar = false; std::vector m_probes; bool m_probesPending = false; std::vector m_views; diff --git a/src/render/MaterialPreviewRenderer.cpp b/src/render/MaterialPreviewRenderer.cpp index f8a65a09..2625b656 100644 --- a/src/render/MaterialPreviewRenderer.cpp +++ b/src/render/MaterialPreviewRenderer.cpp @@ -1,6 +1,7 @@ #include "render/MaterialPreviewRenderer.hpp" #include "assets/MaterialCache.hpp" +#include "assets/MeshCache.hpp" #include "ecs/Components3D.hpp" #include "ecs/LightComponents.hpp" #include "ecs/MeshComponents.hpp" @@ -126,7 +127,7 @@ void MaterialPreviewRenderer::buildScene() { m_world.add(m_sphere); ECS::MeshFilterComponent sphereFilter; sphereFilter.primitive = ECS::MeshPrimitive::Sphere; - sphereFilter.customMaterialPath = kPreviewMaterialKey; + sphereFilter.customMaterialPath = m_previewKey; m_world.add(m_sphere, sphereFilter); m_world.add(m_sphere); @@ -140,7 +141,7 @@ void MaterialPreviewRenderer::buildScene() { m_world.add(m_floor, floorScale); ECS::MeshFilterComponent floorFilter; floorFilter.primitive = ECS::MeshPrimitive::Plane; - floorFilter.customMaterialPath = kFloorMaterialKey; + floorFilter.customMaterialPath = m_floorKey; m_world.add(m_floor, floorFilter); m_world.add(m_floor); @@ -191,35 +192,102 @@ void MaterialPreviewRenderer::applySettings(const MaterialPreviewSettings& setti } } +void MaterialPreviewRenderer::setMaterialKeys(const char* previewKey, const char* floorKey) { + if (previewKey && previewKey[0]) m_previewKey = previewKey; + if (floorKey && floorKey[0]) m_floorKey = floorKey; + m_lastHash = 0; +} + +void MaterialPreviewRenderer::placeSphere() { + auto* filter = m_world.get(m_sphere); + auto* pos = m_world.get(m_sphere); + auto* scale = m_world.get(m_sphere); + if (!filter || !pos || !scale) return; + filter->primitive = ECS::MeshPrimitive::Sphere; + filter->customMeshPath.clear(); + filter->customMaterialPath = m_previewKey; + pos->position = Vec3(0.0f, 0.0f, 0.0f); + scale->scale = Vec3(1.0f, 1.0f, 1.0f); + m_subjectPath.clear(); + m_focusY = 0.0f; +} + +void MaterialPreviewRenderer::placeMesh(const std::string& meshPath, const std::string& projectRoot) { + auto* filter = m_world.get(m_sphere); + auto* pos = m_world.get(m_sphere); + auto* scale = m_world.get(m_sphere); + if (!filter || !pos || !scale) return; + filter->primitive = ECS::MeshPrimitive::Custom; + filter->customMeshPath = meshPath; + filter->customMaterialPath.clear(); + m_subjectPath = meshPath; + + Assets::Mesh3D* mesh = Assets::MeshCache::getInstance().getMesh(meshPath, projectRoot); + if (!mesh || mesh->vertices.empty()) return; + const Vec3 ext = mesh->bounds.extents(); + const f32 radius = std::max({ext.x, ext.y, ext.z, 0.001f}); + const f32 fit = 0.5f / radius; + scale->scale = Vec3(fit, fit, fit); + const Vec3 center = mesh->bounds.center(); + pos->position = Vec3(-center.x * fit, kFloorY - mesh->bounds.min.y * fit, -center.z * fit); + m_focusY = pos->position.y + center.y * fit; +} + bool MaterialPreviewRenderer::render(RHI::CommandBuffer* cmd, const Assets::MaterialSurface& surface, u32 pixelSize, const MaterialPreviewSettings& settings, const std::string& projectRoot) { + placeSphere(); + return renderPlaced(cmd, &surface, pixelSize, settings, projectRoot, true); +} + +bool MaterialPreviewRenderer::renderMesh(RHI::CommandBuffer* cmd, const std::string& meshPath, + u32 pixelSize, const MaterialPreviewSettings& settings, + const std::string& projectRoot) { + if (meshPath.empty()) return false; + Assets::Mesh3D* mesh = Assets::MeshCache::getInstance().getMesh(meshPath, projectRoot); + if (!mesh || mesh->vertices.empty()) return false; + placeMesh(meshPath, projectRoot); + return renderPlaced(cmd, nullptr, pixelSize, settings, projectRoot, false); +} + +bool MaterialPreviewRenderer::renderPlaced(RHI::CommandBuffer* cmd, const Assets::MaterialSurface* surface, + u32 pixelSize, const MaterialPreviewSettings& settings, + const std::string& projectRoot, bool bindPreviewMaterial) { if (!m_ready || !cmd || pixelSize < 16) return false; if (!ensureTargets(pixelSize)) return false; - const u64 hash = hashWithRoot(hashPreviewInputs(surface, pixelSize, settings), projectRoot); + Assets::MaterialSurface hashed; + if (surface) hashed = *surface; + hashed.name = m_subjectPath.empty() ? hashed.name : m_subjectPath; + u64 hash = hashWithRoot(hashPreviewInputs(hashed, pixelSize, settings), projectRoot); + Fnv subject; + subject.h = hash; + subject.text(m_subjectPath); + subject.value(bindPreviewMaterial); + hash = subject.h; // Probes, SSR and TAA converge over a few frames; keep drawing until they settle. if (m_hasImage && hash == m_lastHash && !m_renderer.needsAnotherFrame()) return true; - // Keys are resolved against the same project root the renderer receives. - Assets::MaterialSurface published = surface; - published.valid = true; - Assets::MaterialCache::instance().publish(kPreviewMaterialKey, projectRoot, published); + if (bindPreviewMaterial && surface) { + Assets::MaterialSurface published = *surface; + published.valid = true; + Assets::MaterialCache::instance().publish(m_previewKey, projectRoot, published); + } Assets::MaterialSurface floor; floor.valid = true; floor.name = "Preview Floor"; floor.albedo = Vec4(0.42f, 0.42f, 0.44f, 1.0f); floor.roughness = 0.85f; - Assets::MaterialCache::instance().publish(kFloorMaterialKey, projectRoot, floor); + Assets::MaterialCache::instance().publish(m_floorKey, projectRoot, floor); applySettings(settings); const f32 yaw = settings.yawDegrees * kDegToRad; const f32 pitch = std::clamp(settings.pitchDegrees, -80.0f, 80.0f) * kDegToRad; GpuSceneCamera camera; - camera.focus = Vec3(0.0f, 0.0f, 0.0f); - camera.position = Vec3(std::sin(yaw) * std::cos(pitch), std::sin(pitch), - std::cos(yaw) * std::cos(pitch)) * - kCameraDistance; + camera.focus = Vec3(0.0f, m_focusY, 0.0f); + camera.position = camera.focus + Vec3(std::sin(yaw) * std::cos(pitch), std::sin(pitch), + std::cos(yaw) * std::cos(pitch)) * + kCameraDistance; camera.fovRad = kFovDegrees * kDegToRad; camera.nearClip = 0.05f; camera.farClip = 200.0f; diff --git a/src/render/MaterialPreviewRenderer.hpp b/src/render/MaterialPreviewRenderer.hpp index 4ae67867..210b139f 100644 --- a/src/render/MaterialPreviewRenderer.hpp +++ b/src/render/MaterialPreviewRenderer.hpp @@ -37,10 +37,18 @@ class MaterialPreviewRenderer { void shutdown(); bool isReady() const { return m_ready; } + /// Distinct cache keys so two previews can render in the same frame. + void setMaterialKeys(const char* previewKey, const char* floorKey); + bool wantsMoreFrames() const { return m_renderer.needsAnotherFrame(); } + /// Renders when the material, settings or size changed; otherwise keeps the last image. bool render(RHI::CommandBuffer* cmd, const Assets::MaterialSurface& surface, u32 pixelSize, const MaterialPreviewSettings& settings, const std::string& projectRoot = ""); + /// Renders a mesh framed on the preview floor, using the mesh's own materials. + bool renderMesh(RHI::CommandBuffer* cmd, const std::string& meshPath, u32 pixelSize, + const MaterialPreviewSettings& settings, const std::string& projectRoot = ""); + RHI::Texture* colorTexture() const { return m_hasImage ? m_color : nullptr; } u32 pixelSize() const { return m_pixelSize; } @@ -48,6 +56,11 @@ class MaterialPreviewRenderer { void buildScene(); bool ensureTargets(u32 pixelSize); void applySettings(const MaterialPreviewSettings& settings); + void placeSphere(); + void placeMesh(const std::string& meshPath, const std::string& projectRoot); + bool renderPlaced(RHI::CommandBuffer* cmd, const Assets::MaterialSurface* surface, u32 pixelSize, + const MaterialPreviewSettings& settings, const std::string& projectRoot, + bool bindPreviewMaterial); RHI::RenderDevice* m_device = nullptr; GpuSceneRenderer m_renderer; @@ -60,6 +73,10 @@ class MaterialPreviewRenderer { u64 m_lastHash = 0; bool m_hasImage = false; bool m_ready = false; + std::string m_previewKey = kPreviewMaterialKey; + std::string m_floorKey = kFloorMaterialKey; + std::string m_subjectPath; + f32 m_focusY = 0.0f; }; } // namespace Caffeine::Render diff --git a/src/render/ReflectionBudget.hpp b/src/render/ReflectionBudget.hpp new file mode 100644 index 00000000..542c6d6e --- /dev/null +++ b/src/render/ReflectionBudget.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include "core/Types.hpp" + +#include + +namespace Caffeine::Render { + +/// Optional reflection cost. Off leaves the scene SSR settings untouched. +struct ReflectionModules { + bool performance = false; + bool quality = false; + bool planar = false; + f32 resolution = 0.5f; + f32 maxSteps = 32.0f; + f32 temporalFrames = 4.0f; + f32 distanceFade = 15.0f; + f32 samples = 64.0f; + f32 denoise = 0.7f; + f32 probeBlend = 8.0f; + f32 bounces = 1.0f; +}; + +/// Matches the step count in scene_lit.frag. Performance shortens the march; quality can raise it. +inline i32 reflectionMarchSteps(f32 sceneSteps, f32 roughness, const ReflectionModules& modules) { + f32 steps = sceneSteps; + if (modules.performance) { + const f32 scale = std::clamp(modules.resolution, 0.25f, 1.0f); + const f32 cap = std::clamp(modules.maxSteps, 4.0f, 64.0f); + const f32 roughScale = 1.0f + (0.35f - 1.0f) * std::clamp(roughness, 0.0f, 1.0f); + steps = std::min(steps, cap) * scale * roughScale; + } + if (modules.quality) { + steps = std::max(steps, std::clamp(modules.samples, 4.0f, 64.0f)); + } + return static_cast(std::clamp(steps, 4.0f, 64.0f)); +} + +} // namespace Caffeine::Render diff --git a/src/render/ShaderBytecode.cpp b/src/render/ShaderBytecode.cpp index 77b0953e..d86000a2 100644 --- a/src/render/ShaderBytecode.cpp +++ b/src/render/ShaderBytecode.cpp @@ -31,6 +31,8 @@ ShaderBytecodeView lookupSpirv(BuiltinShader shader) { case BuiltinShader::FullscreenVertex: return {Shaders::fullscreen_vert_spirv, Shaders::fullscreen_vert_spirvSize}; case BuiltinShader::SkyFragment: return {Shaders::sky_frag_spirv, Shaders::sky_frag_spirvSize}; case BuiltinShader::GridFragment: return {Shaders::grid_frag_spirv, Shaders::grid_frag_spirvSize}; + case BuiltinShader::EffectBillboardVertex: return {Shaders::effect_billboard_vert_spirv, Shaders::effect_billboard_vert_spirvSize}; + case BuiltinShader::EffectBillboardFragment: return {Shaders::effect_billboard_frag_spirv, Shaders::effect_billboard_frag_spirvSize}; case BuiltinShader::PostLuminanceFragment: return {Shaders::post_luminance_frag_spirv, Shaders::post_luminance_frag_spirvSize}; case BuiltinShader::PostAdaptFragment: return {Shaders::post_adapt_frag_spirv, Shaders::post_adapt_frag_spirvSize}; case BuiltinShader::PostBloomPrefilterFragment: return {Shaders::post_bloom_prefilter_frag_spirv, Shaders::post_bloom_prefilter_frag_spirvSize}; diff --git a/src/render/ShaderBytecode.hpp b/src/render/ShaderBytecode.hpp index d2b6311f..798557eb 100644 --- a/src/render/ShaderBytecode.hpp +++ b/src/render/ShaderBytecode.hpp @@ -18,6 +18,8 @@ enum class BuiltinShader : u8 { FullscreenVertex, SkyFragment, GridFragment, + EffectBillboardVertex, + EffectBillboardFragment, PostLuminanceFragment, PostAdaptFragment, PostBloomPrefilterFragment, diff --git a/src/render/shaders/effect_billboard.frag b/src/render/shaders/effect_billboard.frag new file mode 100644 index 00000000..b184826a --- /dev/null +++ b/src/render/shaders/effect_billboard.frag @@ -0,0 +1,23 @@ +#version 450 + +layout(location = 0) in vec2 v_uv; +layout(location = 1) in vec4 v_color; +layout(location = 0) out vec4 outColor; + +void main() { + float falloff; + if (v_uv.y > 1.5 && v_uv.x > 1.5) { + float ax = abs(v_uv.x - 2.5) * 2.0; + float ay = abs(v_uv.y - 2.5) * 2.0; + falloff = 1.0 - smoothstep(0.55, 1.0, max(ax, ay)); + } else if (v_uv.y > 1.5) { + float across = abs(v_uv.x * 2.0 - 1.0); + falloff = 1.0 - smoothstep(0.2, 1.0, across); + } else { + vec2 p = v_uv * 2.0 - 1.0; + falloff = 1.0 - smoothstep(0.15, 1.0, length(p)); + } + if (falloff <= 0.001) discard; + float alpha = v_color.a * falloff; + outColor = vec4(v_color.rgb * alpha, alpha); +} diff --git a/src/render/shaders/effect_billboard.vert b/src/render/shaders/effect_billboard.vert new file mode 100644 index 00000000..e831d20a --- /dev/null +++ b/src/render/shaders/effect_billboard.vert @@ -0,0 +1,20 @@ +#version 450 + +layout(location = 0) in vec3 aPosition; +layout(location = 1) in vec3 aNormal; +layout(location = 2) in vec2 aTexCoord; +layout(location = 3) in vec4 aTangent; + +layout(set = 1, binding = 0) uniform EffectVertexUBO { + mat4 uMVP; + mat4 uModel; +} ubo; + +layout(location = 0) out vec2 v_uv; +layout(location = 1) out vec4 v_color; + +void main() { + v_uv = aTexCoord; + v_color = aTangent; + gl_Position = ubo.uMVP * vec4(aPosition, 1.0); +} diff --git a/src/render/shaders/scene_lit.frag b/src/render/shaders/scene_lit.frag index 2503a8bd..10601782 100644 --- a/src/render/shaders/scene_lit.frag +++ b/src/render/shaders/scene_lit.frag @@ -45,6 +45,9 @@ layout(set = 3, binding = 0) uniform LightingUBO { mat4 uPrevView; vec4 uScreen; // xy 1 / target size, z frame index mat4 uViewProj; + vec4 uReflectPerf; // x enabled, y resolution scale, z max steps, w temporal frames + vec4 uReflectQuality; // x enabled, y samples, z denoise, w distance fade + vec4 uReflectExtra; // x planar, y probe blend, z bounces } lights; layout(set = 3, binding = 1) uniform ShadowUBO { @@ -316,12 +319,43 @@ bool prevScreenUv(vec3 p, out vec2 uv, out float rayDist) { return uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0; } +int reflectionStepCount(float roughness) { + float steps = lights.uSsrParams.z; + if (lights.uReflectPerf.x > 0.5) { + float scale = clamp(lights.uReflectPerf.y, 0.25, 1.0); + float cap = clamp(lights.uReflectPerf.z, 4.0, 64.0); + float roughScale = mix(1.0, 0.35, clamp(roughness, 0.0, 1.0)); + steps = min(steps, cap) * scale * roughScale; + } + if (lights.uReflectQuality.x > 0.5) { + steps = max(steps, clamp(lights.uReflectQuality.y, 4.0, 64.0)); + } + return int(clamp(steps, 4.0, 64.0)); +} + +vec3 denoiseReflection(vec2 uv, vec3 hit) { + float amount = lights.uReflectQuality.x > 0.5 ? lights.uReflectQuality.z : 0.0; + if (amount <= 0.001) return hit; + vec2 texel = max(lights.uScreen.xy, vec2(1.0 / 1920.0)) * 2.0; + vec3 sum = hit * 2.0; + sum += textureLod(uPrevColor, uv + vec2(texel.x, 0.0), 0.0).rgb; + sum += textureLod(uPrevColor, uv - vec2(texel.x, 0.0), 0.0).rgb; + sum += textureLod(uPrevColor, uv + vec2(0.0, texel.y), 0.0).rgb; + sum += textureLod(uPrevColor, uv - vec2(0.0, texel.y), 0.0).rgb; + return mix(hit, sum / 6.0, clamp(amount, 0.0, 1.0)); +} + // Screen-space reflection: marches the reflected ray in world space against last frame's depth // and returns last frame's colour at the hit (rgb) with a confidence (a). vec4 traceScreenSpace(vec3 origin, vec3 dir, float roughness) { if (lights.uMaterialFlags.w < 0.5 || roughness > lights.uSsrParams.y) return vec4(0.0); - int steps = int(clamp(lights.uSsrParams.z, 4.0, 64.0)); + int steps = reflectionStepCount(roughness); float maxDist = max(lights.uSsrParams.w, 1.0); + if (lights.uReflectPerf.x > 0.5) { + maxDist = min(maxDist, max(lights.uReflectQuality.w, 1.0)); + float stride = max(lights.uReflectPerf.w, 1.0); + if (stride > 1.5 && mod(lights.uScreen.z, stride) >= 0.5) steps = min(steps, 4); + } float jitter = interleavedGradientNoise(gl_FragCoord.xy + lights.uScreen.z * 5.588238); float prevT = 0.0; for (int i = 1; i <= 64; ++i) { @@ -337,7 +371,9 @@ vec4 traceScreenSpace(vec3 origin, vec3 dir, float roughness) { if (diff > 0.0 && diff < thickness) { float lo = prevT; float hi = t; - for (int k = 0; k < 5; ++k) { + int refine = lights.uReflectQuality.x > 0.5 ? 8 : 5; + for (int k = 0; k < 8; ++k) { + if (k >= refine) break; float mid = 0.5 * (lo + hi); vec2 muv; float mDist; @@ -348,12 +384,16 @@ vec4 traceScreenSpace(vec3 origin, vec3 dir, float roughness) { vec2 hitUv; float hitDist; if (!prevScreenUv(origin + dir * hi, hitUv, hitDist)) break; - vec3 hit = textureLod(uPrevColor, hitUv, 0.0).rgb; + vec3 hit = denoiseReflection(hitUv, textureLod(uPrevColor, hitUv, 0.0).rgb); vec2 edge = min(hitUv, 1.0 - hitUv); float fade = smoothstep(0.0, 0.08, min(edge.x, edge.y)); fade *= 1.0 - smoothstep(0.7, 1.0, hi / maxDist); float maxRough = max(lights.uSsrParams.y, 0.01); fade *= 1.0 - smoothstep(maxRough * 0.6, maxRough, roughness); + if (lights.uReflectPerf.x > 0.5) { + float dither = interleavedGradientNoise(gl_FragCoord.xy + vec2(17.0, 3.0)); + fade = clamp(fade + (dither - 0.5) * 0.12, 0.0, 1.0); + } return vec4(hit, clamp(fade * lights.uSsrParams.x, 0.0, 1.0)); } prevT = t; @@ -364,7 +404,13 @@ vec4 traceScreenSpace(vec3 origin, vec3 dir, float roughness) { vec3 sampleProbeOrSky(vec3 dir, float roughness) { float blur = sqrt(clamp(roughness, 0.0, 1.0)); if (lights.uIblParams.z > 0.5) { - return textureLod(uProbe, dir, blur * lights.uProjParams.z).rgb; + float lod = blur * lights.uProjParams.z; + vec3 probe = textureLod(uProbe, dir, lod).rgb; + if (lights.uReflectQuality.x > 0.5 && lights.uReflectExtra.y > 1.0) { + float lod2 = min(lod + lights.uReflectExtra.y * 0.15, lights.uProjParams.z); + probe = mix(probe, textureLod(uProbe, dir, lod2).rgb, 0.35); + } + return probe; } return sampleEnvironment(dir, blur); } @@ -372,7 +418,13 @@ vec3 sampleProbeOrSky(vec3 dir, float roughness) { vec3 specularRadiance(vec3 R, float roughness) { vec3 radiance = sampleProbeOrSky(R, roughness); vec4 ssr = traceScreenSpace(v_worldPos + normalize(v_normal) * 0.02, R, roughness); - return mix(radiance, ssr.rgb, ssr.a); + radiance = mix(radiance, ssr.rgb, ssr.a); + if (lights.uReflectQuality.x > 0.5 && lights.uReflectExtra.z >= 0.5) { + vec3 bounceDir = normalize(reflect(R, vec3(0.0, 1.0, 0.0))); + float weight = 0.1 * min(lights.uReflectExtra.z, 2.0) * (1.0 - clamp(roughness, 0.0, 1.0)); + radiance += sampleProbeOrSky(bounceDir, max(roughness, 0.25)) * weight; + } + return radiance; } void applyIbl(Surface s, inout vec3 diffuseOut, inout vec3 specularOut) { diff --git a/src/script/AnimationBindings.cpp b/src/script/AnimationBindings.cpp new file mode 100644 index 00000000..1e69dee7 --- /dev/null +++ b/src/script/AnimationBindings.cpp @@ -0,0 +1,41 @@ +#include "caffeine/animation/AnimationApi.hpp" + +#include + +namespace Caffeine::Script { + +void registerAnimationScriptBindings(sol::state& lua, ECS::World** worldPtr) { + lua["caffeine"]["animation"] = lua.create_table(); + sol::table animation = lua["caffeine"]["animation"]; + + animation["playClip"] = [worldPtr](u32 entityId, const std::string& path) { + if (!worldPtr || !*worldPtr) return false; + return Animation::playClip(**worldPtr, ECS::Entity(entityId, *worldPtr), path); + }; + animation["setBool"] = [worldPtr](u32 entityId, const std::string& name, bool value) { + if (!worldPtr || !*worldPtr) return false; + return Animation::setBool(**worldPtr, ECS::Entity(entityId, *worldPtr), name.c_str(), value); + }; + animation["setFloat"] = [worldPtr](u32 entityId, const std::string& name, f32 value) { + if (!worldPtr || !*worldPtr) return false; + return Animation::setFloat(**worldPtr, ECS::Entity(entityId, *worldPtr), name.c_str(), value); + }; + animation["setTrigger"] = [worldPtr](u32 entityId, const std::string& name) { + if (!worldPtr || !*worldPtr) return false; + return Animation::setTrigger(**worldPtr, ECS::Entity(entityId, *worldPtr), name.c_str()); + }; + animation["playSkinnedClip"] = [worldPtr](u32 entityId, const std::string& meshPath, i32 clipIndex) { + if (!worldPtr || !*worldPtr) return false; + return Animation::playSkinnedClip(**worldPtr, ECS::Entity(entityId, *worldPtr), meshPath, clipIndex); + }; + animation["setSpriteSheet"] = [worldPtr](u32 entityId, u32 columns, u32 rows, u32 frameCount) { + if (!worldPtr || !*worldPtr) return false; + return Animation::setSpriteSheet(**worldPtr, ECS::Entity(entityId, *worldPtr), columns, rows, frameCount); + }; + animation["playState"] = [worldPtr](u32 entityId, const std::string& state) { + if (!worldPtr || !*worldPtr) return false; + return Animation::playState(**worldPtr, ECS::Entity(entityId, *worldPtr), state.c_str()); + }; +} + +} // namespace Caffeine::Script diff --git a/src/script/EffectBindings.cpp b/src/script/EffectBindings.cpp new file mode 100644 index 00000000..4a3f1961 --- /dev/null +++ b/src/script/EffectBindings.cpp @@ -0,0 +1,45 @@ +#include "caffeine/effects/EffectApi.hpp" + +#include +#include + +namespace Caffeine::Script { + +void registerEffectScriptBindings(sol::state& lua, ECS::World** worldPtr) { + lua["caffeine"]["effects"] = lua.create_table(); + sol::table effects = lua["caffeine"]["effects"]; + effects["set"] = [worldPtr](u32 entityId, u32 kind, u32 quality) { + if (!worldPtr || !*worldPtr) return false; + const auto effectKind = static_cast(std::min(kind, 4u)); + const auto effectQuality = static_cast(std::min(quality, 2u)); + return Effects::setEffect(**worldPtr, ECS::Entity(entityId, *worldPtr), effectKind, effectQuality); + }; + effects["particle"] = [worldPtr](u32 entityId, u32 domain) { + if (!worldPtr || !*worldPtr) return false; + const auto effectDomain = static_cast(std::min(domain, 2u)); + return Effects::setParticleEmitter(**worldPtr, ECS::Entity(entityId, *worldPtr), effectDomain); + }; + effects["particleParams"] = [worldPtr](u32 entityId, f32 rate, f32 lifetime, i32 maxParticles, + f32 startSize, f32 endSize, f32 gravityY) { + if (!worldPtr || !*worldPtr) return false; + return Effects::setParticleParams(**worldPtr, ECS::Entity(entityId, *worldPtr), rate, lifetime, + maxParticles, startSize, endSize, gravityY); + }; + effects["volumetric"] = [worldPtr](u32 entityId) { + if (!worldPtr || !*worldPtr) return false; + return Effects::setVolumetricLight(**worldPtr, ECS::Entity(entityId, *worldPtr)); + }; + effects["volumetricShape"] = [worldPtr](u32 entityId, u32 shape, u32 columns, u32 rows) { + if (!worldPtr || !*worldPtr) return false; + const auto volumeShape = static_cast(std::min(shape, 4u)); + return Effects::setVolumetricShape(**worldPtr, ECS::Entity(entityId, *worldPtr), volumeShape, columns, rows); + }; + effects["fog"] = [worldPtr](u32 entityId, u32 domain, u32 style) { + if (!worldPtr || !*worldPtr) return false; + const auto effectDomain = static_cast(std::min(domain, 2u)); + const auto fogStyle = static_cast(std::min(style, 3u)); + return Effects::setFog(**worldPtr, ECS::Entity(entityId, *worldPtr), effectDomain, fogStyle); + }; +} + +} // namespace Caffeine::Script diff --git a/src/script/NavigationBindings.cpp b/src/script/NavigationBindings.cpp new file mode 100644 index 00000000..18b23fe2 --- /dev/null +++ b/src/script/NavigationBindings.cpp @@ -0,0 +1,34 @@ +#include "caffeine/navigation/NavigationApi.hpp" + +#include + +namespace Caffeine::Script { + +void registerNavigationScriptBindings(sol::state& lua, ECS::World** worldPtr) { + lua["caffeine"]["navigation"] = lua.create_table(); + sol::table navigation = lua["caffeine"]["navigation"]; + + navigation["setDestination"] = [worldPtr](u32 entityId, f32 x, f32 y, f32 z) { + if (!worldPtr || !*worldPtr) return false; + return Navigation::setDestination(**worldPtr, ECS::Entity(entityId, *worldPtr), Vec3(x, y, z)); + }; + navigation["setMode"] = [worldPtr](u32 entityId, const std::string& mode) { + if (!worldPtr || !*worldPtr) return false; + return Navigation::setMode(**worldPtr, ECS::Entity(entityId, *worldPtr), + Navigation::modeFromName(mode)); + }; + navigation["addPatrolPoint"] = [worldPtr](u32 entityId, f32 x, f32 y, f32 z) { + if (!worldPtr || !*worldPtr) return false; + return Navigation::addPatrolPoint(**worldPtr, ECS::Entity(entityId, *worldPtr), Vec3(x, y, z)); + }; + navigation["setFollowTarget"] = [worldPtr](u32 entityId, u32 targetId) { + if (!worldPtr || !*worldPtr) return false; + return Navigation::setFollowTarget(**worldPtr, ECS::Entity(entityId, *worldPtr), targetId); + }; + navigation["setBehaviorScript"] = [worldPtr](u32 entityId, const std::string& path) { + if (!worldPtr || !*worldPtr) return false; + return Navigation::setBehaviorScript(**worldPtr, ECS::Entity(entityId, *worldPtr), path); + }; +} + +} // namespace Caffeine::Script diff --git a/src/script/ScriptEngine.cpp b/src/script/ScriptEngine.cpp index 30b81a91..02e7e7fe 100644 --- a/src/script/ScriptEngine.cpp +++ b/src/script/ScriptEngine.cpp @@ -21,6 +21,9 @@ namespace Caffeine::Script { void registerProceduralScriptBindings(sol::state& lua, ECS::World** worldPtr); void registerPostProcessScriptBindings(sol::state& lua, ECS::World** worldPtr); void registerForwardRenderScriptBindings(sol::state& lua, ECS::World** worldPtr); +void registerAnimationScriptBindings(sol::state& lua, ECS::World** worldPtr); +void registerEffectScriptBindings(sol::state& lua, ECS::World** worldPtr); +void registerNavigationScriptBindings(sol::state& lua, ECS::World** worldPtr); sol::table makePostProcessScriptHandle(sol::state_view lua, ECS::World** worldPtr, u32 entityId); // ============================================================================ @@ -624,6 +627,9 @@ bool ScriptEngine::init(const InitParams& params) { registerProceduralScriptBindings(lua, &m_impl->m_world); registerPostProcessScriptBindings(lua, &m_impl->m_world); registerForwardRenderScriptBindings(lua, &m_impl->m_world); + registerAnimationScriptBindings(lua, &m_impl->m_world); + registerEffectScriptBindings(lua, &m_impl->m_world); + registerNavigationScriptBindings(lua, &m_impl->m_world); { sol::table pt = lua["caffeine"]["particles"]; diff --git a/src/ui/UISystem.hpp b/src/ui/UISystem.hpp index 94943841..09eac63e 100644 --- a/src/ui/UISystem.hpp +++ b/src/ui/UISystem.hpp @@ -29,6 +29,9 @@ class UISystem : public ECS::ISystem { processInput(world); } + /// Resolves anchor offsets into computedRect without consuming input. + void layout(ECS::World& world) { layoutWidgets(world); } + ECS::Entity createCanvas(ECS::World& world, Vec2 size = {1280.0f, 720.0f}) { ECS::Entity e = world.create(); UIWidget w; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4ab59651..5d10648d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -25,6 +25,8 @@ set(CAFFEINE_TEST_SOURCES test_material.cpp test_ui.cpp test_animation.cpp + test_navigation.cpp + test_effects.cpp test_mesh.cpp test_octree.cpp test_skeletal_animation.cpp @@ -65,6 +67,10 @@ set(CAFFEINE_TEST_SOURCES ../src/editor/InspectorPanel.cpp ../src/editor/ComponentRegistry.cpp ../src/editor/SceneEditor.cpp + ../src/editor/ImageManagerPanel.cpp + ../src/editor/HudEditorPanel.cpp + ../src/editor/ParticleEditorPanel.cpp + ../src/editor/EffectEditorPanel.cpp ../src/editor/TransformGizmo.cpp ../src/editor/PrefabSystem.cpp ../src/editor/MaterialSerializer.cpp @@ -175,6 +181,10 @@ if(SDL3_FOUND AND NOT CAFFEINE_BUILD_HEADLESS) ${CMAKE_SOURCE_DIR}/src/editor/CapLoader.cpp ${CMAKE_SOURCE_DIR}/src/editor/AudioWaveformRenderer.cpp ${CMAKE_SOURCE_DIR}/src/editor/SceneEditor.cpp + ${CMAKE_SOURCE_DIR}/src/editor/ImageManagerPanel.cpp + ${CMAKE_SOURCE_DIR}/src/editor/HudEditorPanel.cpp + ${CMAKE_SOURCE_DIR}/src/editor/ParticleEditorPanel.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EffectEditorPanel.cpp ${CMAKE_SOURCE_DIR}/src/editor/SceneSerializer.cpp ${CMAKE_SOURCE_DIR}/src/editor/DragDropSystem.cpp ${CMAKE_SOURCE_DIR}/src/editor/SceneTabManager.cpp @@ -191,6 +201,33 @@ if(SDL3_FOUND AND NOT CAFFEINE_BUILD_HEADLESS) ${CMAKE_SOURCE_DIR}/src/editor/BuildSystem.cpp ${CMAKE_SOURCE_DIR}/src/editor/BuildDialog.cpp ${CMAKE_SOURCE_DIR}/src/editor/AssetCooker.cpp + ${CMAKE_SOURCE_DIR}/src/editor/BuildLog.cpp + ${CMAKE_SOURCE_DIR}/src/editor/FilePicker.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EditorIcons.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EditorPaths.cpp + ${CMAKE_SOURCE_DIR}/src/editor/ComponentRegistry.cpp + ${CMAKE_SOURCE_DIR}/src/editor/PluginSystem.cpp + ${CMAKE_SOURCE_DIR}/src/editor/PluginSymbolExports.cpp + ${CMAKE_SOURCE_DIR}/src/editor/PluginServiceRegistry.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EntityPresetTypes.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EntityPresetRegistry.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EntityPresetPackages.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EntityPresetFactories.cpp + ${CMAKE_SOURCE_DIR}/src/editor/PrefabSystem.cpp + ${CMAKE_SOURCE_DIR}/src/editor/TransformGizmo.cpp + ${CMAKE_SOURCE_DIR}/src/editor/AssetPreviewRenderer.cpp + ${CMAKE_SOURCE_DIR}/src/editor/AnimatorController.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EditorPreferences.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EditorTheme.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EditorSpinner.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EntityPresetsPanel.cpp + ${CMAKE_SOURCE_DIR}/src/editor/TerrainEditorPanel.cpp + ${CMAKE_SOURCE_DIR}/src/editor/EntityDebugger.cpp + ${CMAKE_SOURCE_DIR}/src/editor/TestUIMapper.cpp + ${CMAKE_SOURCE_DIR}/src/editor/TestRequestHandler.cpp + ${CMAKE_SOURCE_DIR}/src/editor/CameraPreviewPanel.cpp + ${CMAKE_SOURCE_DIR}/src/editor/GameplayPreviewPanel.cpp + ${CMAKE_SOURCE_DIR}/src/editor/MaterialSerializer.cpp ${IMGUI_TEST_ENGINE_SRCS} ) @@ -206,6 +243,9 @@ if(SDL3_FOUND AND NOT CAFFEINE_BUILD_HEADLESS) IMGUI_TEST_ENGINE_ENABLE_COROUTINE_STDTHREAD_IMPL=1 ) target_compile_features(DoppioTest PRIVATE cxx_std_20) + if(DEFINED nanosvg_SOURCE_DIR) + target_include_directories(DoppioTest PRIVATE ${nanosvg_SOURCE_DIR}/src) + endif() add_test(NAME DoppioTest COMMAND DoppioTest) endif() diff --git a/tests/test_animation.cpp b/tests/test_animation.cpp index 5b8d3923..bf8eca93 100644 --- a/tests/test_animation.cpp +++ b/tests/test_animation.cpp @@ -2,8 +2,13 @@ #include "../src/Caffeine.hpp" #include "../src/animation/AnimationComponents.hpp" #include "../src/animation/AnimationSystem.hpp" +#include "../src/animation/ClipAsset.hpp" +#include "../src/animation/AnimationPlayer.hpp" +#include "caffeine/animation/AnimationApi.hpp" +#include "../src/ecs/Components3D.hpp" #include +#include using namespace Caffeine; using namespace Caffeine::ECS; @@ -414,3 +419,37 @@ TEST_CASE("AnimationSystem - play() stores previousState", "[animation]") { REQUIRE(a->previousState == FixedString<32>("idle")); REQUIRE(a->currentState == FixedString<32>("walk")); } + +TEST_CASE("Motion clip roundtrip and player samples position", "[animation]") { + const auto dir = std::filesystem::temp_directory_path() / "caffeine-anim-test"; + std::filesystem::create_directories(dir); + const auto path = dir / "walk.anim"; + + MotionClip written; + written.name = "Walk"; + written.loop = false; + written.fps = 8; + written.duration = 1.0f; + written.spriteFrames.push_back({0.0f, 1, 0, 0, 16, 16}); + written.spriteFrames.push_back({1.0f, 3, 16, 0, 16, 16}); + written.positions.push_back({0.0f, Vec3(0, 0, 0)}); + written.positions.push_back({1.0f, Vec3(4, 0, 0)}); + REQUIRE(saveMotionClip(path, written)); + + MotionClip loaded; + REQUIRE(loadMotionClip(path, loaded)); + REQUIRE(loaded.name == "Walk"); + REQUIRE(sampleSpriteFrame(loaded, 0.0f) == 1u); + REQUIRE(sampleSpriteFrame(loaded, 1.0f) == 3u); + REQUIRE(samplePosition(loaded, 0.5f).x == Approx(2.0f)); + + World world; + AnimationSystem sys; + Entity e = world.create(); + world.add(e, Position3D{Vec3(0, 0, 0)}); + REQUIRE(playClip(world, e, path.string())); + sys.onUpdate(world, 0.5f); + const Position3D* position = world.get(e); + REQUIRE(position != nullptr); + REQUIRE(position->position.x == Approx(2.0f).margin(0.05f)); +} diff --git a/tests/test_editor_ui/test_assetbrowser.cpp b/tests/test_editor_ui/test_assetbrowser.cpp index 372d87b6..6f06c6ae 100644 --- a/tests/test_editor_ui/test_assetbrowser.cpp +++ b/tests/test_editor_ui/test_assetbrowser.cpp @@ -1,6 +1,7 @@ #include "../Catch2/catch.hpp" #include "../../src/editor/AssetBrowser.hpp" #include "../../src/editor/EditorContext.hpp" +#include "../../src/ecs/World.hpp" #include #include @@ -15,8 +16,9 @@ extern bool g_gpuAvailable; using namespace Caffeine; using namespace Caffeine::Editor; +using namespace Caffeine::ECS; -void PumpPanelFrame(AssetBrowser& panel, EditorContext& ctx) { +void PumpPanelFrame(AssetBrowser& panel, World& world, EditorContext& ctx) { SDL_Event event; while (SDL_PollEvent(&event)) { ImGui_ImplSDL3_ProcessEvent(&event); @@ -26,7 +28,7 @@ void PumpPanelFrame(AssetBrowser& panel, EditorContext& ctx) { ImGui_ImplSDL3_NewFrame(); ImGui::NewFrame(); - panel.render(ctx); + panel.render(world, ctx); ImGui::Render(); } @@ -69,11 +71,12 @@ TEST_CASE("AssetBrowser - init and render without crashing", "[editor][ui][asset fixture.createTestFile("test.png"); fixture.createTestFile("test.wav"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); ImGuiWindow* win = ImGui::FindWindowByName("Asset Browser"); REQUIRE(win != nullptr); @@ -92,11 +95,12 @@ TEST_CASE("AssetBrowser - displays files in directory", "[editor][ui][assetbrows fixture.createTestFile("model.obj", "fake obj data"); fixture.createTestDirectory("subdir"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); const auto& entries = browser.entries(); REQUIRE(entries.size() == 4); @@ -116,6 +120,7 @@ TEST_CASE("AssetBrowser - grid view renders entries", "[editor][ui][assetbrowser fixture.createTestFile("image2.jpg"); fixture.createTestFile("audio.ogg"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); @@ -124,7 +129,7 @@ TEST_CASE("AssetBrowser - grid view renders entries", "[editor][ui][assetbrowser REQUIRE(browser.viewMode() == AssetBrowser::ViewMode::Grid); for (int i = 0; i < 3; ++i) { - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); } const auto& entries = browser.entries(); @@ -145,6 +150,7 @@ TEST_CASE("AssetBrowser - list view renders entries", "[editor][ui][assetbrowser fixture.createTestFile("document.txt"); fixture.createTestFile("script.lua"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); @@ -153,7 +159,7 @@ TEST_CASE("AssetBrowser - list view renders entries", "[editor][ui][assetbrowser REQUIRE(browser.viewMode() == AssetBrowser::ViewMode::List); for (int i = 0; i < 3; ++i) { - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); } const auto& entries = browser.entries(); @@ -175,13 +181,14 @@ TEST_CASE("AssetBrowser - search filter works", "[editor][ui][assetbrowser]") { fixture.createTestFile("background.jpg"); fixture.createTestFile("music.wav"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); browser.setSearchFilter("sprite"); - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); const auto& filteredEntries = browser.entries(); REQUIRE(filteredEntries.size() == 2); @@ -205,13 +212,14 @@ TEST_CASE("AssetBrowser - search filter case insensitive", "[editor][ui][assetbr fixture.createTestFile("lowercase.png"); fixture.createTestFile("MixedCase.PNG"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); browser.setSearchFilter("png"); - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); const auto& filteredEntries = browser.entries(); REQUIRE(filteredEntries.size() == 3); @@ -229,6 +237,7 @@ TEST_CASE("AssetBrowser - thumbnail size can be adjusted", "[editor][ui][assetbr AssetBrowserTestFixture fixture; fixture.createTestFile("test.png"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); @@ -239,7 +248,7 @@ TEST_CASE("AssetBrowser - thumbnail size can be adjusted", "[editor][ui][assetbr REQUIRE(browser.thumbnailSize() == 128); - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); ImGuiWindow* win = ImGui::FindWindowByName("Asset Browser"); REQUIRE(win != nullptr); @@ -255,6 +264,7 @@ TEST_CASE("AssetBrowser - navigation to subdirectory", "[editor][ui][assetbrowse fixture.createTestDirectory("textures"); fixture.createTestFile("textures/sprite.png"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); @@ -265,7 +275,7 @@ TEST_CASE("AssetBrowser - navigation to subdirectory", "[editor][ui][assetbrowse REQUIRE(browser.currentPath() == subdir); REQUIRE(browser.canGoBack()); - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); const auto& entries = browser.entries(); REQUIRE(entries.size() == 1); @@ -283,6 +293,7 @@ TEST_CASE("AssetBrowser - navigate back works", "[editor][ui][assetbrowser]") { AssetBrowserTestFixture fixture; fixture.createTestDirectory("subdir"); + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); @@ -298,7 +309,7 @@ TEST_CASE("AssetBrowser - navigate back works", "[editor][ui][assetbrowser]") { REQUIRE(browser.currentPath() == originalPath); REQUIRE(!browser.canGoBack()); - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); ImGuiWindow* win = ImGui::FindWindowByName("Asset Browser"); REQUIRE(win != nullptr); @@ -312,11 +323,12 @@ TEST_CASE("AssetBrowser - empty directory renders", "[editor][ui][assetbrowser]" AssetBrowserTestFixture fixture; + World world; EditorContext ctx; AssetBrowser browser; browser.init(fixture.testDir.string().c_str()); - PumpPanelFrame(browser, ctx); + PumpPanelFrame(browser, world, ctx); const auto& entries = browser.entries(); REQUIRE(entries.size() == 0); diff --git a/tests/test_effects.cpp b/tests/test_effects.cpp new file mode 100644 index 00000000..acea0454 --- /dev/null +++ b/tests/test_effects.cpp @@ -0,0 +1,161 @@ +#include "catch.hpp" +#include "caffeine/effects/EffectApi.hpp" +#include "effects/EffectSystem.hpp" +#include "ecs/Components.hpp" +#include "ecs/World.hpp" + +#include +#include + +using namespace Caffeine; +using namespace Caffeine::Effects; +using namespace Caffeine::ECS; + +TEST_CASE("Henyey-Greenstein is isotropic at zero anisotropy", "[effects]") { + const f32 phase = henyeyGreenstein(0.0f, 0.0f); + REQUIRE(phase == Approx(1.0f / (4.0f * 3.14159265f)).margin(0.001f)); +} + +TEST_CASE("Volumetric scatter is inside the light radius", "[effects]") { + const Vec3 light(0.0f, 2.0f, 0.0f); + const f32 inside = volumetricScatter(Vec3(0.0f, 2.4f, 0.0f), light, Vec3(0.0f, 1.0f, 0.0f), + 3.0f, 0.4f, 0.2f, 2.0f); + const f32 outside = volumetricScatter(Vec3(10.0f, 2.0f, 0.0f), light, Vec3(0.0f, 0.0f, 1.0f), + 3.0f, 0.4f, 0.2f, 2.0f); + REQUIRE(inside > 0.0f); + REQUIRE(outside == Approx(0.0f).margin(0.0001f)); +} + +TEST_CASE("Reflection budgets pick step counts", "[effects]") { + REQUIRE(reflectionSteps(EffectQuality::Performance) == 8u); + REQUIRE(reflectionSteps(EffectQuality::Balanced) == 24u); + REQUIRE(reflectionSteps(EffectQuality::Quality) == 48u); + REQUIRE(reflectionRoughnessGate(EffectQuality::Performance) < + reflectionRoughnessGate(EffectQuality::Quality)); +} + +TEST_CASE("Particles simulate in 3D and stay on the plane in 2D", "[effects]") { + World world; + Entity spark = world.create(); + world.add(spark); + EffectComponent effect; + effect.rate = 40.0f; + effect.maxParticles = 8; + effect.lifetime = 2.0f; + effect.gravity = Vec3(0.0f, -4.0f, 0.0f); + effect.domain = static_cast(EffectDomain::ThreeD); + effect.seed = 7; + world.add(spark, effect); + + tickEffects(world, 0.5f, Vec3(0.0f, 1.0f, 4.0f)); + const std::vector* spawned = particlesFor(spark.id()); + REQUIRE(spawned != nullptr); + REQUIRE(spawned->size() > 0u); + const f32 y0 = spawned->front().position.y; + + tickEffects(world, 0.5f, Vec3(0.0f, 1.0f, 4.0f)); + REQUIRE(particlesFor(spark.id())->front().position.y < y0); + + Entity sheet = world.create(); + world.add(sheet).position = Vec3(1.0f, 2.0f, 3.0f); + EffectComponent flat; + flat.domain = static_cast(EffectDomain::TwoD); + flat.rate = 10.0f; + flat.maxParticles = 4; + flat.velocityMin = Vec3(0.0f, 1.0f, 5.0f); + flat.velocityMax = Vec3(0.0f, 1.0f, 5.0f); + flat.gravity = Vec3(0.0f, 0.0f, 9.0f); + world.add(sheet, flat); + tickEffects(world, 0.2f, {}); + const std::vector* planar = particlesFor(sheet.id()); + REQUIRE(planar != nullptr); + REQUIRE(!planar->empty()); + REQUIRE(planar->front().position.z == Approx(3.0f).margin(0.001f)); + REQUIRE(planar->front().velocity.z == Approx(0.0f).margin(0.001f)); +} + +TEST_CASE("Reflective shade lowers roughness and sets a step budget", "[effects]") { + SurfaceShade shade; + shade.roughness = 0.8f; + shade.metallic = 0.0f; + EffectComponent mirror; + mirror.kind = static_cast(EffectKind::ReflectiveSurface); + mirror.quality = static_cast(EffectQuality::Quality); + mirror.reflection = 1.0f; + mirror.roughness = 0.08f; + mirror.metallic = 1.0f; + applyEffectShade(mirror, shade); + REQUIRE(shade.roughness == Approx(0.08f).margin(0.001f)); + REQUIRE(shade.metallic == Approx(1.0f).margin(0.001f)); + REQUIRE(shade.ssrSteps == 48); + REQUIRE(shade.reflection == Approx(1.0f).margin(0.001f)); +} + +TEST_CASE("Fog fills 3D shells and dust stays on the 2D overlay", "[effects]") { + World world; + Entity volume = world.create(); + world.add(volume); + REQUIRE(setFog(world, volume, EffectDomain::ThreeD, EffectFogStyle::Fog)); + tickEffects(world, 0.2f, {}); + REQUIRE(world.get(volume)->emitCarry > 0.0f); + + Assets::Mesh3D mesh; + buildEffectMesh(world, Vec3(0.0f, 2.0f, 6.0f), Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f), mesh); + const size_t volumeVerts = mesh.vertices.size(); + REQUIRE(volumeVerts >= 4u); + + Entity dust = world.create(); + world.add(dust); + REQUIRE(setFog(world, dust, EffectDomain::TwoD, EffectFogStyle::Dust)); + std::vector overlay; + collectOverlayEffects(world, true, overlay); + REQUIRE(overlay.size() >= 3u); + mesh.vertices.clear(); + buildEffectMesh(world, Vec3(0.0f, 2.0f, 6.0f), Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f), mesh); + REQUIRE(mesh.vertices.size() == volumeVerts); +} + +TEST_CASE("Window and cone volumetric lights build shafts along forward", "[effects]") { + World world; + Entity window = world.create(); + world.add(window); + EffectComponent panes; + configureVolumetricLight(panes, VolumetricShape::Window); + world.add(window, panes); + + Assets::Mesh3D mesh; + buildEffectMesh(world, Vec3(0.0f, 2.0f, 6.0f), Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f), mesh); + REQUIRE(mesh.vertices.size() > 64u); + f32 minZ = 0.0f; + for (const Assets::Vertex3D& vertex : mesh.vertices) minZ = std::min(minZ, vertex.position.z); + REQUIRE(minZ < -4.0f); + + Entity cone = world.create(); + world.add(cone); + EffectComponent shaft; + configureVolumetricLight(shaft, VolumetricShape::Cone); + world.add(cone, shaft); + mesh.vertices.clear(); + buildEffectMesh(world, Vec3(0.0f, 2.0f, 6.0f), Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f), mesh); + f32 nearRadius = 0.0f; + f32 farRadius = 0.0f; + for (const Assets::Vertex3D& vertex : mesh.vertices) { + const f32 radial = std::sqrt(vertex.position.x * vertex.position.x + vertex.position.y * vertex.position.y); + if (vertex.position.z > -0.4f) nearRadius = std::max(nearRadius, radial); + if (vertex.position.z < -shaft.radius + 0.6f) farRadius = std::max(farRadius, radial); + } + REQUIRE(farRadius > nearRadius); +} + +TEST_CASE("Particle params can be set without wiping a 2D emitter", "[effects]") { + World world; + Entity spark = world.create(); + REQUIRE(setParticleEmitter(world, spark, EffectDomain::TwoD)); + REQUIRE(setParticleParams(world, spark, 12.0f, 1.2f, 6, 0.3f, 0.04f, -3.0f)); + const EffectComponent* effect = world.get(spark); + REQUIRE(effect != nullptr); + REQUIRE(effect->domain == static_cast(EffectDomain::TwoD)); + REQUIRE(effect->rate == Approx(12.0f)); + REQUIRE(effect->maxParticles == 6); + REQUIRE(effect->gravity.y == Approx(-3.0f)); +} diff --git a/tests/test_material.cpp b/tests/test_material.cpp index 502e0958..d9dff4d9 100644 --- a/tests/test_material.cpp +++ b/tests/test_material.cpp @@ -2,6 +2,7 @@ #include "assets/MaterialCache.hpp" #include "assets/MaterialFile.hpp" +#include "render/ReflectionBudget.hpp" #include #include @@ -89,3 +90,98 @@ TEST_CASE("Published material without a file still resolves", "[material]") { REQUIRE(resolved.reflectance == Approx(0.9f)); MaterialCache::instance().invalidate(); } + +TEST_CASE("saveMaterialFile creates missing parent directories", "[material]") { + const auto dir = std::filesystem::temp_directory_path() / "caffeine-material-nested" / "materials"; + std::filesystem::remove_all(dir.parent_path()); + const auto path = dir / "new.mat"; + MaterialSurface surface; + surface.name = "New"; + surface.valid = true; + REQUIRE(saveMaterialFile(path, surface)); + REQUIRE(std::filesystem::exists(path)); + MaterialSurface loaded; + REQUIRE(loadMaterialFile(path, loaded)); + REQUIRE(loaded.name == "New"); +} + +TEST_CASE("reflection modules roundtrip and stay off by default", "[material]") { + const auto dir = std::filesystem::temp_directory_path() / "caffeine-material-test"; + std::filesystem::create_directories(dir); + const auto path = dir / "reflect.mat"; + + MaterialSurface written; + written.name = "Mirror"; + written.reflection = 0.8f; + written.reflectionPerformance = 1; + written.reflectionQuality = 1; + written.reflectionPlanar = 1; + written.ssrResolution = 0.5f; + written.ssrMaxSteps = 32.0f; + written.ssrTemporalFrames = 4.0f; + written.ssrDistance = 15.0f; + written.ssrSamples = 64.0f; + written.ssrDenoise = 0.7f; + written.ssrProbeBlend = 8.0f; + written.ssrBounces = 1.0f; + REQUIRE(saveMaterialFile(path, written)); + + MaterialSurface loaded; + REQUIRE(loadMaterialFile(path, loaded)); + REQUIRE(loaded.reflectionPerformance == 1); + REQUIRE(loaded.reflectionQuality == 1); + REQUIRE(loaded.reflectionPlanar == 1); + REQUIRE(loaded.ssrResolution == Approx(0.5f)); + REQUIRE(loaded.ssrMaxSteps == Approx(32.0f)); + REQUIRE(loaded.ssrSamples == Approx(64.0f)); + REQUIRE(loaded.ssrDenoise == Approx(0.7f)); + REQUIRE(loaded.ssrBounces == Approx(1.0f)); + + MaterialSurface plain; + REQUIRE(plain.reflectionPerformance == 0); + REQUIRE(plain.reflectionQuality == 0); +} + +TEST_CASE("legacy reflection budget maps onto optional modules", "[material]") { + const auto dir = std::filesystem::temp_directory_path() / "caffeine-material-test"; + std::filesystem::create_directories(dir); + const auto path = dir / "legacy-budget.mat"; + { + std::ofstream out(path); + out << "CAFMAT3\n" + << "name Legacy\n" + << "reflection 0.4\n" + << "reflection_budget 1\n"; + } + MaterialSurface loaded; + REQUIRE(loadMaterialFile(path, loaded)); + REQUIRE(loaded.reflectionPerformance == 1); + REQUIRE(loaded.reflectionQuality == 0); +} + +TEST_CASE("reflection march steps follow the optional modules", "[material]") { + using Caffeine::Render::ReflectionModules; + using Caffeine::Render::reflectionMarchSteps; + + ReflectionModules off; + REQUIRE(reflectionMarchSteps(24.0f, 0.2f, off) == 24); + + ReflectionModules performance; + performance.performance = true; + performance.resolution = 0.5f; + performance.maxSteps = 32.0f; + const i32 smooth = reflectionMarchSteps(48.0f, 0.0f, performance); + const i32 rough = reflectionMarchSteps(48.0f, 1.0f, performance); + REQUIRE(smooth < 32); + REQUIRE(rough < smooth); + + ReflectionModules quality; + quality.quality = true; + quality.samples = 64.0f; + REQUIRE(reflectionMarchSteps(16.0f, 0.4f, quality) == 64); + + ReflectionModules both = performance; + both.quality = true; + both.samples = 64.0f; + REQUIRE(reflectionMarchSteps(48.0f, 1.0f, both) == 64); +} diff --git a/tests/test_navigation.cpp b/tests/test_navigation.cpp new file mode 100644 index 00000000..d07d6924 --- /dev/null +++ b/tests/test_navigation.cpp @@ -0,0 +1,53 @@ +#include "catch.hpp" + +#include "navigation/NavVolume.hpp" +#include "navigation/NavigationSystem.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/World.hpp" + +using namespace Caffeine; +using namespace Caffeine::ECS; +using namespace Caffeine::Navigation; + +TEST_CASE("NavVolume walks around a blocked column", "[navigation]") { + NavVolume volume; + volume.resize(5, 5); + volume.cellSize = 1.0f; + for (int y = 0; y < 5; ++y) volume.setBlocked(2, y, true); + volume.setBlocked(2, 4, false); + + std::vector path; + REQUIRE(volume.findPath(Vec3(0.5f, 0.0f, 0.5f), Vec3(4.5f, 0.0f, 0.5f), path)); + REQUIRE(path.size() > 2); + REQUIRE(path.front().x == Approx(0.5f)); + REQUIRE(path.back().x == Approx(4.5f)); + for (const Vec3& point : path) { + i32 x = 0, z = 0; + volume.worldToCell(point, x, z); + REQUIRE_FALSE(volume.isBlocked(x, z)); + } +} + +TEST_CASE("Nav agent follows a path on the XZ plane", "[navigation]") { + World world; + Entity ground = world.create(); + NavVolume volume; + volume.resize(8, 4); + volume.cellSize = 1.0f; + world.add(ground, volume); + + Entity agentEntity = world.create(); + world.add(agentEntity, Position3D{Vec3(0.5f, 0.0f, 0.5f)}); + NavAgent agent; + agent.mode = NavMode::Scripted; + agent.destination = Vec3(4.5f, 0.0f, 0.5f); + agent.hasDestination = true; + agent.speed = 10.0f; + agent.arriveRadius = 0.2f; + world.add(agentEntity, agent); + + updateNavigation(world, 1.0f); + const Position3D* position = world.get(agentEntity); + REQUIRE(position != nullptr); + REQUIRE(position->position.x > 0.5f); +} diff --git a/tests/test_skeletal_animation.cpp b/tests/test_skeletal_animation.cpp index fff76ad3..751be8fc 100644 --- a/tests/test_skeletal_animation.cpp +++ b/tests/test_skeletal_animation.cpp @@ -1,5 +1,7 @@ #include "catch.hpp" #include "../src/animation/SkeletalAnimation.hpp" +#include "../src/animation/SkinLibrary.hpp" +#include "../src/assets/MeshTypes.hpp" #include "Caffeine.hpp" using namespace Caffeine; @@ -333,3 +335,44 @@ TEST_CASE("SkeletalClip rotation interpolation via slerp", "[skeletal]") { Vec3 fwd1 = Quat::fromMatrix(boneMatrices[0]).rotate({0, 0, 1}); REQUIRE(fwd1.x == Approx(1.0f).margin(0.1f)); } + +TEST_CASE("Humanoid names map mixamo bones", "[skeletal]") { + ImportedSkin skin; + skin.boneNames = {"mixamorig:Hips", "mixamorig:Spine", "mixamorig:Head", + "mixamorig:LeftArm", "mixamorig:LeftUpLeg"}; + const HumanoidRig rig = matchHumanoid(skin); + REQUIRE(rig.matched); + REQUIRE(rig.bones[static_cast(HumanoidBone::Hips)] == 0); + REQUIRE(rig.bones[static_cast(HumanoidBone::Head)] == 2); + REQUIRE(rig.bones[static_cast(HumanoidBone::LeftUpperArm)] == 3); + REQUIRE(rig.bones[static_cast(HumanoidBone::LeftUpperLeg)] == 4); +} + +TEST_CASE("CPU skin moves a weighted vertex", "[skeletal]") { + Assets::Mesh3D mesh; + Assets::Vertex3D vertex{}; + vertex.position = {0.0f, 1.0f, 0.0f}; + mesh.vertices.push_back(vertex); + Assets::VertexSkin weight{}; + weight.joints[0] = 0; + weight.weights[0] = 1.0f; + mesh.skin.push_back(weight); + + std::vector bones(1, Mat4::translation(2.0f, 0.0f, 0.0f)); + std::vector posed; + skinVertices(mesh, bones, posed); + REQUIRE(posed.size() == 1); + REQUIRE(posed[0].position.x == Approx(2.0f).margin(0.001f)); + REQUIRE(posed[0].position.y == Approx(1.0f).margin(0.001f)); +} + +TEST_CASE("Sprite sheet frame picks a cell", "[animation]") { + SpriteSheet sheet; + sheet.columns = 4; + sheet.rows = 1; + sheet.frameCount = 4; + const SpriteSheetRect cell = spriteSheetFrame(sheet, 1, 128.0f, 32.0f); + REQUIRE(cell.x == Approx(32.0f).margin(0.001f)); + REQUIRE(cell.w == Approx(32.0f).margin(0.001f)); + REQUIRE(cell.h == Approx(32.0f).margin(0.001f)); +} From 40aff6735f16fb0bdc04f38db013d49be2b9ba4c Mon Sep 17 00:00:00 2001 From: LyeZinho Date: Sat, 3 Oct 2026 00:48:52 +0100 Subject: [PATCH 4/9] Changes --- CMakeLists.txt | 2 + Convoy | 2 +- WaveShaper | 2 +- _test_hero.caf | Bin 0 -> 92 bytes _test_multi.caf | Bin 0 -> 260 bytes caf-pack | 2 +- docs/rendering/forward-render-features.md | 4 +- docs/rendering/reflections.md | 2 +- src/animation/SkeletalAnimation.hpp | 14 +- src/animation/SkinLibrary.cpp | 62 +- src/animation/SkinLibrary.hpp | 4 + src/assets/MaterialCache.cpp | 35 +- src/ecs/ForwardRenderComponents.hpp | 6 +- src/ecs/MeshGeometry.cpp | 179 +++++ src/ecs/MeshGeometry.hpp | 27 + src/ecs/SkyboxComponents.hpp | 3 + src/editor/AnimationTimeline.cpp | 46 +- src/editor/AnimationTimeline.hpp | 3 + src/editor/AnimatorController.cpp | 47 ++ src/editor/AnimatorController.hpp | 6 + src/editor/AssetBrowser.cpp | 2 +- src/editor/AssetPreviewRenderer.cpp | 47 +- src/editor/AssetPreviewRenderer.hpp | 5 +- src/editor/BrowseSession.cpp | 9 +- src/editor/CameraPreviewPanel.cpp | 1 + src/editor/CapLoader.cpp | 87 ++- src/editor/CapLoader.hpp | 2 +- src/editor/DefaultScene.hpp | 63 ++ src/editor/EditorContext.cpp | 16 +- src/editor/EditorContext.hpp | 16 +- src/editor/EditorPanelUtils.hpp | 24 +- src/editor/EditorPreferences.cpp | 2 + src/editor/EditorPreferences.hpp | 2 + src/editor/EffectEditorPanel.cpp | 45 +- src/editor/EffectObjectFactory.hpp | 6 + src/editor/GameplayPreviewPanel.cpp | 5 +- src/editor/HierarchyPanel.cpp | 2 + src/editor/ImGuiIntegration.hpp | 4 + src/editor/InspectorPanel.cpp | 133 ++-- src/editor/InspectorWidgets.hpp | 12 +- src/editor/MaterialEditorPanel.cpp | 169 +++- src/editor/MaterialEditorPanel.hpp | 11 + src/editor/ProjectManager.cpp | 6 + src/editor/SceneEditor.cpp | 197 ++++- src/editor/SceneEditor.hpp | 2 + src/editor/SceneSerializer.cpp | 112 ++- src/editor/SceneSerializer.hpp | 8 +- src/editor/SceneTabManager.cpp | 2 + src/editor/SceneViewport.cpp | 896 ++++++++++++---------- src/editor/SceneViewport.hpp | 5 + src/editor/SettingsPanel.cpp | 13 + src/editor/ToolboxPanel.hpp | 150 ++++ src/effects/EffectSystem.cpp | 248 +++++- src/effects/EffectSystem.hpp | 15 + src/effects/EffectTypes.hpp | 1 + src/render/GpuSceneRenderer.cpp | 24 +- src/render/GpuSceneRenderer.hpp | 8 +- src/render/MaterialPreviewRenderer.cpp | 3 + src/render/RenderFeatures.hpp | 5 +- src/render/shaders/effect_billboard.frag | 23 +- src/render/shaders/effect_billboard.vert | 2 + src/render/shaders/scene_lit.frag | 40 +- src/scene/EnvironmentSystem.cpp | 41 +- src/scene/EnvironmentSystem.hpp | 3 + src/script/EffectBindings.cpp | 17 +- tests/cap_test_helpers.hpp | 2 +- tests/test_editor.cpp | 58 ++ tests/test_effects.cpp | 75 +- tests/test_forward_render_features.cpp | 4 +- 69 files changed, 2384 insertions(+), 685 deletions(-) create mode 100644 _test_hero.caf create mode 100644 _test_multi.caf create mode 100644 src/ecs/MeshGeometry.cpp create mode 100644 src/ecs/MeshGeometry.hpp create mode 100644 src/editor/DefaultScene.hpp create mode 100644 src/editor/ToolboxPanel.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 816f4954..d74c28a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,6 +72,7 @@ add_library(caffeine-core src/effects/EffectSystem.cpp src/ecs/ParticleSystem.cpp src/ecs/ParticleSystem.cpp + src/ecs/MeshGeometry.cpp src/assets/MeshCache.cpp src/assets/MeshImportValidator.cpp src/assets/MeshLOD.cpp @@ -571,6 +572,7 @@ with open(sys.argv[1], 'w') as f: ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/assets/scripts + ${CMAKE_CURRENT_SOURCE_DIR}/caf-pack/include ${imgui_test_engine_SOURCE_DIR} ${nanosvg_SOURCE_DIR}/src) add_executable(caffeine-runtime diff --git a/Convoy b/Convoy index 2c81b21e..39addbd2 160000 --- a/Convoy +++ b/Convoy @@ -1 +1 @@ -Subproject commit 2c81b21e0c6b3091989efc4dc71ec90d03e36a68 +Subproject commit 39addbd2e61667b2844442871e87c103157717b7 diff --git a/WaveShaper b/WaveShaper index d70b9465..240eb4b5 160000 --- a/WaveShaper +++ b/WaveShaper @@ -1 +1 @@ -Subproject commit d70b946554f14ef6c912547418ffee69fe88f685 +Subproject commit 240eb4b5d58404f16f5e8396eccbb09e67e4e526 diff --git a/_test_hero.caf b/_test_hero.caf new file mode 100644 index 0000000000000000000000000000000000000000..b581ea0952f4ea3c9f52a4024de9df7956a9a517 GIT binary patch literal 92 fcmZ>EbaP{8U|?VbVi17Q4nVd?YEeE&j9dT!)o%jm literal 0 HcmV?d00001 diff --git a/_test_multi.caf b/_test_multi.caf new file mode 100644 index 0000000000000000000000000000000000000000..4da0224bfa053fc152931e924e82f7508f3e4f4b GIT binary patch literal 260 zcmZ>EbaP{8U|?VdVkRgCQVb42?3|yO2V#>8IG`FCfiwt%fCCV_=B4IVf;bcaWb*=Y L5-U@S$TtiCs%Qt^ literal 0 HcmV?d00001 diff --git a/caf-pack b/caf-pack index d4d859de..677d2024 160000 --- a/caf-pack +++ b/caf-pack @@ -1 +1 @@ -Subproject commit d4d859dea7b462e2a2decf6c92385f34466312fd +Subproject commit 677d202424b1c453f57de1d718b2164b793286c5 diff --git a/docs/rendering/forward-render-features.md b/docs/rendering/forward-render-features.md index 9d6899b6..a7847825 100644 --- a/docs/rendering/forward-render-features.md +++ b/docs/rendering/forward-render-features.md @@ -16,7 +16,7 @@ Sub-blocos: | Bloco | Função | |-------|--------| | Instancing | `drawIndexedInstanced`, até 256 por batch (ligado por defeito) | -| IBL | Difuso e especular a partir do céu da cena (`diffuse` 1.0, `specular` 1.0 por defeito). Com IBL ligado, substitui o ambiente plano | +| IBL | Difuso a partir do céu (**desligado por defeito** — a skybox não ilumina). Especulares (metais) continuam a refletir o céu. | | Occlusion | Oclusão coarse na CPU (off por defeito) | | Reflections | Planar, screen-space, probe | | Volumetrics | Nevoeiro analítico no forward shader | @@ -26,7 +26,7 @@ Sem componente na cena, `budgetSafeForwardDefaults()` devolve `RenderFeatureSett | Capacidade | Default | |------------|---------| | Instancing | ligado (256/batch) | -| IBL | ligado (diffuse/specular 1.0) | +| IBL difuso | desligado (skybox = fundo + reflexões; ligar para o céu iluminar) | | Occlusion | desligado | | Reflections | **Probe** + screen-space trace | | Volumetrics | desligado | diff --git a/docs/rendering/reflections.md b/docs/rendering/reflections.md index 010b613d..c538ad90 100644 --- a/docs/rendering/reflections.md +++ b/docs/rendering/reflections.md @@ -33,7 +33,7 @@ Configura no componente **Forward Render Features** (Inspector) ou via `caffeine `GpuEnvironmentMap` — equirectangular + mips (slot 11): - Fonte: `SkyboxComponent` ativo ou `GpuSceneRenderOptions::environmentPath`. -- Especular: mip por roughness; difuso: mip mais baixo quando IBL ligado. +- Especular: sempre que a skybox está ligada (metais). Difuso: só com IBL difuso ligado. Onde probe/planar não têm geometria, cai para o céu. diff --git a/src/animation/SkeletalAnimation.hpp b/src/animation/SkeletalAnimation.hpp index c1627870..56308da4 100644 --- a/src/animation/SkeletalAnimation.hpp +++ b/src/animation/SkeletalAnimation.hpp @@ -72,7 +72,9 @@ struct SkeletalClip { /// Amostra o clipe no tempo `time` (segundos) e preenche `boneTransforms` /// com as matrizes ósseas finais (world * inverseBindPose). /// `boneTransforms` deve ter tamanho >= skeleton.boneCount(). - void sampleAt(f32 time, const Skeleton& skeleton, std::vector& boneTransforms) const; + /// When `jointPositions` is set, it receives each joint in skeleton space. + void sampleAt(f32 time, const Skeleton& skeleton, std::vector& boneTransforms, + std::vector* jointPositions = nullptr) const; }; // ============================================================================ @@ -161,7 +163,8 @@ inline Mat4 buildTRS(const Vec3& pos, const Quat& rot, const Vec3& scale) { } // namespace Detail -inline void SkeletalClip::sampleAt(f32 time, const Skeleton& skeleton, std::vector& boneTransforms) const { +inline void SkeletalClip::sampleAt(f32 time, const Skeleton& skeleton, std::vector& boneTransforms, + std::vector* jointPositions) const { u32 boneCount = skeleton.boneCount(); if (boneTransforms.size() < boneCount) { boneTransforms.resize(boneCount); @@ -243,6 +246,13 @@ inline void SkeletalClip::sampleAt(f32 time, const Skeleton& skeleton, std::vect boneTransforms[boneIdx] = skeleton.skinSpace * worldMatrices[boneIdx] * skeleton.bones[boneIdx].bindPoseInverse; } + if (jointPositions) { + jointPositions->resize(boneCount); + for (u32 boneIdx = 0; boneIdx < boneCount; ++boneIdx) { + const Mat4& world = worldMatrices[boneIdx]; + (*jointPositions)[boneIdx] = Vec3(world(0, 3), world(1, 3), world(2, 3)); + } + } } // ============================================================================ diff --git a/src/animation/SkinLibrary.cpp b/src/animation/SkinLibrary.cpp index d5ec5a1a..2bc91c8a 100644 --- a/src/animation/SkinLibrary.cpp +++ b/src/animation/SkinLibrary.cpp @@ -13,6 +13,9 @@ namespace { std::unordered_map g_skins; std::unordered_map> g_posed; +std::unordered_map> g_joints; +std::unordered_map> g_jointParents; +std::string g_projectRoot; std::string normalizedBone(const std::string& name) { const auto cut = name.find_last_of(":|"); @@ -171,21 +174,57 @@ const std::vector* skinnedVerticesFor(u32 entityId) { return &it->second; } +const std::vector* jointPositionsFor(u32 entityId) { + const auto it = g_joints.find(entityId); + if (it == g_joints.end() || it->second.empty()) return nullptr; + return &it->second; +} + +const std::vector* jointParentsFor(u32 entityId) { + const auto it = g_jointParents.find(entityId); + if (it == g_jointParents.end() || it->second.empty()) return nullptr; + return &it->second; +} + +void setSkinProjectRoot(const std::string& projectRoot) { + g_projectRoot = projectRoot; +} + void tickSkinnedPoses(ECS::World& world, f32 dt) { ECS::ComponentQuery query; query.with(); std::vector live; world.forEach(query, [&](ECS::Entity entity, SkinnedPose& pose) { live.push_back(entity.id()); - if (pose.meshPath[0] == '\0') return; - Assets::MeshCache::getInstance().getMesh(pose.meshPath, ""); + if (pose.meshPath[0] == '\0') { + g_posed.erase(entity.id()); + g_joints.erase(entity.id()); + g_jointParents.erase(entity.id()); + return; + } + Assets::MeshCache::getInstance().getMesh(pose.meshPath, g_projectRoot); const ImportedSkin* skin = findImportedSkin(pose.meshPath); const Assets::Mesh3D* mesh = skin ? skin->mesh : nullptr; - if (!mesh) mesh = Assets::MeshCache::getInstance().getMesh(pose.meshPath, ""); + if (!mesh) mesh = Assets::MeshCache::getInstance().getMesh(pose.meshPath, g_projectRoot); if (!skin || !mesh) { g_posed.erase(entity.id()); + g_joints.erase(entity.id()); + g_jointParents.erase(entity.id()); return; } + if (const Animator* animator = world.get(entity)) { + const char* stateName = animator->currentState.cStr(); + if (stateName && stateName[0] != '\0') { + for (int clip = 0; clip < static_cast(skin->clipNames.size()); ++clip) { + if (skin->clipNames[static_cast(clip)] == stateName && pose.clipIndex != clip) { + pose.clipIndex = clip; + pose.time = 0.0f; + pose.playing = true; + break; + } + } + } + } if (!pose.loaded) { pose.humanoid = matchHumanoid(*skin); pose.loaded = true; @@ -206,11 +245,18 @@ void tickSkinnedPoses(ECS::World& world, f32 dt) { } } std::vector bones; - clip.sampleAt(pose.time, skin->skeleton, bones); + std::vector joints; + clip.sampleAt(pose.time, skin->skeleton, bones, &joints); skinVertices(*mesh, bones, g_posed[entity.id()]); + g_joints[entity.id()] = std::move(joints); } else { g_posed[entity.id()] = mesh->vertices; + g_joints.erase(entity.id()); } + std::vector parents; + parents.reserve(skin->skeleton.boneCount()); + for (const Bone& bone : skin->skeleton.bones) parents.push_back(bone.parentIndex); + g_jointParents[entity.id()] = std::move(parents); }); for (auto it = g_posed.begin(); it != g_posed.end();) { @@ -218,6 +264,14 @@ void tickSkinnedPoses(ECS::World& world, f32 dt) { if (!stillLive) it = g_posed.erase(it); else ++it; } + for (auto it = g_joints.begin(); it != g_joints.end();) { + if (std::find(live.begin(), live.end(), it->first) == live.end()) it = g_joints.erase(it); + else ++it; + } + for (auto it = g_jointParents.begin(); it != g_jointParents.end();) { + if (std::find(live.begin(), live.end(), it->first) == live.end()) it = g_jointParents.erase(it); + else ++it; + } } } // namespace Caffeine::Animation diff --git a/src/animation/SkinLibrary.hpp b/src/animation/SkinLibrary.hpp index d979cece..f85a5996 100644 --- a/src/animation/SkinLibrary.hpp +++ b/src/animation/SkinLibrary.hpp @@ -87,6 +87,10 @@ struct SpriteSheetRect { SpriteSheetRect spriteSheetFrame(const SpriteSheet& sheet, u32 frame, f32 textureWidth, f32 textureHeight); const std::vector* skinnedVerticesFor(u32 entityId); +const std::vector* jointPositionsFor(u32 entityId); +const std::vector* jointParentsFor(u32 entityId); +/// Editor and runtime pass the project root so `assets/...` paths resolve. +void setSkinProjectRoot(const std::string& projectRoot); void tickSkinnedPoses(ECS::World& world, f32 dt); } // namespace Caffeine::Animation diff --git a/src/assets/MaterialCache.cpp b/src/assets/MaterialCache.cpp index da4c2b82..8b702239 100644 --- a/src/assets/MaterialCache.cpp +++ b/src/assets/MaterialCache.cpp @@ -5,6 +5,35 @@ #include namespace Caffeine::Assets { +namespace { + +bool sameSurface(const MaterialSurface& a, const MaterialSurface& b) { + return a.name == b.name && a.albedo.x == b.albedo.x && a.albedo.y == b.albedo.y && + a.albedo.z == b.albedo.z && a.albedo.w == b.albedo.w && a.metallic == b.metallic && + a.roughness == b.roughness && a.reflectance == b.reflectance && + a.emission.x == b.emission.x && a.emission.y == b.emission.y && + a.emission.z == b.emission.z && a.emissionStrength == b.emissionStrength && + a.albedoMap == b.albedoMap && a.normalMap == b.normalMap && a.ormMap == b.ormMap && + a.emissionMap == b.emissionMap && a.uvTiling.x == b.uvTiling.x && + a.uvTiling.y == b.uvTiling.y && a.uvOffset.x == b.uvOffset.x && + a.uvOffset.y == b.uvOffset.y && a.normalStrength == b.normalStrength && + a.aoStrength == b.aoStrength && a.alphaMode == b.alphaMode && + a.alphaCutoff == b.alphaCutoff && a.transmission == b.transmission && a.ior == b.ior && + a.clearcoat == b.clearcoat && a.clearcoatRoughness == b.clearcoatRoughness && + a.sheenColor.x == b.sheenColor.x && a.sheenColor.y == b.sheenColor.y && + a.sheenColor.z == b.sheenColor.z && a.sheenRoughness == b.sheenRoughness && + a.iridescence == b.iridescence && a.iridescenceThickness == b.iridescenceThickness && + a.iridescenceIor == b.iridescenceIor && a.reflection == b.reflection && + a.reflectionBudget == b.reflectionBudget && + a.reflectionPerformance == b.reflectionPerformance && + a.reflectionQuality == b.reflectionQuality && a.reflectionPlanar == b.reflectionPlanar && + a.ssrResolution == b.ssrResolution && a.ssrMaxSteps == b.ssrMaxSteps && + a.ssrTemporalFrames == b.ssrTemporalFrames && a.ssrDistance == b.ssrDistance && + a.ssrSamples == b.ssrSamples && a.ssrDenoise == b.ssrDenoise && + a.ssrProbeBlend == b.ssrProbeBlend && a.ssrBounces == b.ssrBounces; +} + +} // namespace MaterialCache& MaterialCache::instance() { static MaterialCache cache; @@ -67,8 +96,12 @@ void MaterialCache::publish(const std::string& materialPath, const std::string& entry.stamp = std::filesystem::last_write_time(key, ec); entry.hasStamp = !ec; } + const auto it = m_cache.find(key); + const bool changed = it == m_cache.end() || !it->second.hasStamp != !entry.hasStamp || + (entry.hasStamp && it->second.stamp != entry.stamp) || + !sameSurface(it->second.surface, entry.surface); m_cache[key] = entry; - ++m_revision; + if (changed) ++m_revision; } void MaterialCache::invalidate(const std::string& materialPath) { diff --git a/src/ecs/ForwardRenderComponents.hpp b/src/ecs/ForwardRenderComponents.hpp index 984087f3..e984f159 100644 --- a/src/ecs/ForwardRenderComponents.hpp +++ b/src/ecs/ForwardRenderComponents.hpp @@ -13,8 +13,10 @@ struct ForwardInstancingProfile { }; struct ForwardIblProfile { - bool enabled = true; - f32 diffuse = 1.0f; + /// Diffuse IBL: sky as fill light. Off by default so lights illuminate the scene. + /// Specular IBL (metals reflecting the sky) stays on via `specular` even when this is false. + bool enabled = false; + f32 diffuse = 0.0f; f32 specular = 1.0f; }; diff --git a/src/ecs/MeshGeometry.cpp b/src/ecs/MeshGeometry.cpp new file mode 100644 index 00000000..566a8d9f --- /dev/null +++ b/src/ecs/MeshGeometry.cpp @@ -0,0 +1,179 @@ +#include "ecs/MeshGeometry.hpp" + +#include "assets/MeshCache.hpp" +#include "ecs/ComponentQuery.hpp" +#include "ecs/MeshComponents.hpp" + +#ifdef CF_HAS_SDL3 +#include "render/GpuProceduralMeshes.hpp" +#endif + +#include +#include +#include + +namespace Caffeine::ECS { +namespace { + +struct MeshSlot { + u32 revision = 0; + Assets::Mesh3D mesh; +}; + +std::unordered_map g_edited; + +u32 nextRevision = 1; + +Assets::Mesh3D* sourceMesh(World& world, Entity entity, const std::string& projectRoot) { + const MeshFilterComponent* filter = world.get(entity); + if (!filter) return nullptr; + if (filter->primitive == MeshPrimitive::Custom) { + if (filter->customMeshPath.empty()) return nullptr; + return Assets::MeshCache::getInstance().getMesh(filter->customMeshPath, projectRoot); + } +#ifdef CF_HAS_SDL3 + return Render::GpuProceduralMeshes::get(filter->primitive); +#else + return nullptr; +#endif +} + +void rebuild(MeshSlot& slot, const MeshGeometryComponent& geometry) { + Assets::Mesh3D& mesh = slot.mesh; + mesh.vertices.clear(); + mesh.indices = geometry.indices; + mesh.vertices.reserve(geometry.positions.size()); + Vec3 bmin(1.0e30f, 1.0e30f, 1.0e30f); + Vec3 bmax(-1.0e30f, -1.0e30f, -1.0e30f); + for (const Vec3& position : geometry.positions) { + Assets::Vertex3D vertex{}; + vertex.position = position; + vertex.normal = Vec3(0.0f, 1.0f, 0.0f); + vertex.texcoord = {0.5f, 0.5f}; + vertex.tangent = Vec4(1.0f, 0.0f, 0.0f, 1.0f); + mesh.vertices.push_back(vertex); + bmin.x = std::min(bmin.x, position.x); + bmin.y = std::min(bmin.y, position.y); + bmin.z = std::min(bmin.z, position.z); + bmax.x = std::max(bmax.x, position.x); + bmax.y = std::max(bmax.y, position.y); + bmax.z = std::max(bmax.z, position.z); + } + for (size_t i = 0; i + 2 < mesh.indices.size(); i += 3) { + const u32 i0 = mesh.indices[i]; + const u32 i1 = mesh.indices[i + 1]; + const u32 i2 = mesh.indices[i + 2]; + if (i0 >= mesh.vertices.size() || i1 >= mesh.vertices.size() || i2 >= mesh.vertices.size()) continue; + const Vec3& a = mesh.vertices[i0].position; + const Vec3& b = mesh.vertices[i1].position; + const Vec3& c = mesh.vertices[i2].position; + Vec3 normal = (b - a).cross(c - a); + if (normal.lengthSquared() < 1.0e-10f) continue; + normal = normal.normalized(); + mesh.vertices[i0].normal = normal; + mesh.vertices[i1].normal = normal; + mesh.vertices[i2].normal = normal; + } + if (mesh.vertices.empty()) { + mesh.bounds = {}; + } else { + mesh.bounds = {bmin, bmax}; + } + slot.revision = geometry.revision; +} + +bool samePoint(const Vec3& a, const Vec3& b) { + return (a - b).lengthSquared() < 1.0e-8f; +} + +} // namespace + +bool bakeMeshGeometry(World& world, Entity entity, const std::string& projectRoot) { + if (world.has(entity)) return true; + Assets::Mesh3D* source = sourceMesh(world, entity, projectRoot); + if (!source || source->vertices.empty() || source->indices.empty()) return false; + MeshGeometryComponent geometry; + geometry.positions.reserve(source->vertices.size()); + for (const Assets::Vertex3D& vertex : source->vertices) { + geometry.positions.push_back(vertex.position); + } + geometry.indices = source->indices; + geometry.revision = ++nextRevision; + world.add(entity, std::move(geometry)); + return true; +} + +Assets::Mesh3D* editedMesh(World& world, Entity entity) { + const MeshGeometryComponent* geometry = world.get(entity); + if (!geometry || geometry->positions.empty() || geometry->indices.empty()) return nullptr; + MeshSlot& slot = g_edited[entity.id()]; + bool current = slot.revision == geometry->revision && slot.mesh.vertices.size() == geometry->positions.size(); + if (current) { + for (size_t i = 0; i < geometry->positions.size(); ++i) { + if ((slot.mesh.vertices[i].position - geometry->positions[i]).lengthSquared() > 1.0e-8f) { + current = false; + break; + } + } + } + if (!current) rebuild(slot, *geometry); + return slot.mesh.vertices.empty() ? nullptr : &slot.mesh; +} + +std::vector faceVertexIndices(const MeshGeometryComponent& geometry, u32 triangle) { + std::vector vertices; + const u32 triangleCount = static_cast(geometry.indices.size() / 3); + if (triangle >= triangleCount) return vertices; + std::vector taken(triangleCount, 0); + std::vector stack; + stack.push_back(triangle); + taken[triangle] = 1; + const u32 base = triangle * 3; + const Vec3& a = geometry.positions[geometry.indices[base]]; + const Vec3& b = geometry.positions[geometry.indices[base + 1]]; + const Vec3& c = geometry.positions[geometry.indices[base + 2]]; + Vec3 faceNormal = (b - a).cross(c - a); + if (faceNormal.lengthSquared() < 1.0e-10f) { + vertices.push_back(geometry.indices[base]); + vertices.push_back(geometry.indices[base + 1]); + vertices.push_back(geometry.indices[base + 2]); + return vertices; + } + faceNormal = faceNormal.normalized(); + + std::unordered_set unique; + while (!stack.empty()) { + const u32 current = stack.back(); + stack.pop_back(); + const u32 offset = current * 3; + for (u32 corner = 0; corner < 3; ++corner) unique.insert(geometry.indices[offset + corner]); + for (u32 other = 0; other < triangleCount; ++other) { + if (taken[other]) continue; + const u32 otherOffset = other * 3; + const Vec3& oa = geometry.positions[geometry.indices[otherOffset]]; + const Vec3& ob = geometry.positions[geometry.indices[otherOffset + 1]]; + const Vec3& oc = geometry.positions[geometry.indices[otherOffset + 2]]; + Vec3 otherNormal = (ob - oa).cross(oc - oa); + if (otherNormal.lengthSquared() < 1.0e-10f) continue; + otherNormal = otherNormal.normalized(); + if (otherNormal.dot(faceNormal) < 0.98f) continue; + bool shares = false; + for (u32 corner = 0; corner < 3 && !shares; ++corner) { + const Vec3& point = geometry.positions[geometry.indices[offset + corner]]; + for (u32 otherCorner = 0; otherCorner < 3; ++otherCorner) { + if (samePoint(point, geometry.positions[geometry.indices[otherOffset + otherCorner]])) { + shares = true; + break; + } + } + } + if (!shares) continue; + taken[other] = 1; + stack.push_back(other); + } + } + vertices.assign(unique.begin(), unique.end()); + return vertices; +} + +} // namespace Caffeine::ECS diff --git a/src/ecs/MeshGeometry.hpp b/src/ecs/MeshGeometry.hpp new file mode 100644 index 00000000..340ded65 --- /dev/null +++ b/src/ecs/MeshGeometry.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include "assets/MeshTypes.hpp" +#include "ecs/World.hpp" +#include "math/Vec3.hpp" + +#include + +namespace Caffeine::ECS { + +/// Per-entity mesh. Present only after the viewport edits vertices, edges or faces. +struct MeshGeometryComponent { + std::vector positions; + std::vector indices; + u32 revision = 1; +}; + +/// Copies the current primitive (or custom mesh) into an editable component. +bool bakeMeshGeometry(World& world, Entity entity, const std::string& projectRoot = {}); + +/// Cached mesh for a baked component. Null when the entity still uses the shared primitive. +Assets::Mesh3D* editedMesh(World& world, Entity entity); + +/// Triangles that form the clicked face, including a quad split into two triangles. +std::vector faceVertexIndices(const MeshGeometryComponent& geometry, u32 triangle); + +} // namespace Caffeine::ECS diff --git a/src/ecs/SkyboxComponents.hpp b/src/ecs/SkyboxComponents.hpp index 653fef7a..44a927fd 100644 --- a/src/ecs/SkyboxComponents.hpp +++ b/src/ecs/SkyboxComponents.hpp @@ -41,6 +41,9 @@ inline constexpr const char* kSkyboxPresetLabels[] = { "HDR Night 014", }; +/// Copied into a new project. The clear sky is used when this file is missing. +inline constexpr const char* kDefaultProjectSkyPath = "assets/raw/sky/skybox-day.png"; + struct SkyboxComponent { bool enabled = true; int presetIndex = 0; diff --git a/src/editor/AnimationTimeline.cpp b/src/editor/AnimationTimeline.cpp index 2e4c149e..94fe4da7 100644 --- a/src/editor/AnimationTimeline.cpp +++ b/src/editor/AnimationTimeline.cpp @@ -59,6 +59,7 @@ void AnimationTimelinePanel::play() { void AnimationTimelinePanel::stop() { m_isPlaying = false; m_currentTime = 0.0f; + m_applyTime = true; } void AnimationTimelinePanel::pause() { @@ -206,17 +207,23 @@ void AnimationTimelinePanel::render(f32 deltaTime) { f32 drivenDuration = m_clip ? m_clip->duration() : 0.0f; bool drivenLoop = m_looping; + m_driveName.clear(); if (m_scene) { ECS::Entity selected(m_selectedEntity, m_scene); - if (const Animation::SkinnedPose* pose = m_scene->get(selected)) { + if (Animation::SkinnedPose* pose = m_scene->get(selected)) { if (const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath)) { if (pose->clipIndex >= 0 && pose->clipIndex < static_cast(skin->clips.size())) { - drivenDuration = std::max(drivenDuration, skin->clips[static_cast(pose->clipIndex)].duration); + const Animation::SkeletalClip& boneClip = skin->clips[static_cast(pose->clipIndex)]; + drivenDuration = std::max(drivenDuration, boneClip.duration); + if (pose->clipIndex < static_cast(skin->clipNames.size())) { + m_driveName = skin->clipNames[static_cast(pose->clipIndex)]; + } } } drivenLoop = drivenLoop || pose->loop; } } + m_timelineDuration = drivenDuration; if (m_isPlaying && drivenDuration > 0.0f) { m_currentTime += deltaTime; if (m_currentTime >= drivenDuration) { @@ -224,6 +231,19 @@ void AnimationTimelinePanel::render(f32 deltaTime) { else m_isPlaying = false; } } + if (m_scene) { + ECS::Entity selected(m_selectedEntity, m_scene); + if (Animation::SkinnedPose* pose = m_scene->get(selected)) { + if (m_isPlaying || m_applyTime) { + pose->playing = false; + pose->time = m_currentTime; + pose->loop = drivenLoop; + } else { + m_currentTime = pose->time; + } + } + } + m_applyTime = false; ImGui::SetNextWindowSizeConstraints(ImVec2(400, 200), ImVec2(FLT_MAX, FLT_MAX)); if (ImGui::Begin("Animation Timeline", &m_open)) { @@ -246,11 +266,6 @@ void AnimationTimelinePanel::render(f32 deltaTime) { } ImGui::EndCombo(); } - if (m_isPlaying) { - pose->playing = false; - pose->time = m_currentTime; - pose->loop = drivenLoop; - } } if (skin) { const int shown = std::min(static_cast(skin->boneNames.size()), 12); @@ -292,6 +307,10 @@ void AnimationTimelinePanel::renderHeader() { ImGui::TextColored(ImVec4(0.4f, 0.8f, 1.0f, 1.0f), "%s", m_clip->name.cStr()); ImGui::SameLine(); ImGui::TextDisabled("%.2fs %u fps", m_clip->duration(), m_clip->fps); + } else if (!m_driveName.empty()) { + ImGui::TextColored(ImVec4(0.5f, 0.9f, 0.6f, 1.0f), "%s", m_driveName.c_str()); + ImGui::SameLine(); + ImGui::TextDisabled("%.2fs bones", m_timelineDuration); } else { ImGui::TextDisabled("No clip"); } @@ -321,23 +340,23 @@ void AnimationTimelinePanel::renderHeader() { ImGui::TextDisabled("pos keys %zu", m_motion.positions.size()); } - if (m_clip) { + if (m_timelineDuration > 0.0f) { ImGui::SameLine(0, 16.0f); - ImGui::TextDisabled("Time: %.3f / %.2f", m_currentTime, m_clip->duration()); + ImGui::TextDisabled("Time: %.3f / %.2f", m_currentTime, m_timelineDuration); } } void AnimationTimelinePanel::renderTimeline() { - if (!m_clip) { + f32 duration = m_timelineDuration; + if (duration <= 0.0f && m_clip) duration = m_clip->duration(); + if (duration <= 0.0f && !m_clip) { ImGui::Spacing(); ImGui::TextDisabled(" No animation clip selected."); ImGui::Spacing(); ImGui::TextColored(ImVec4(0.5f,0.5f,0.5f,0.7f), " Tracks"); - ImGui::TextDisabled(" No tracks. Add a clip to create tracks."); + ImGui::TextDisabled(" Select a skinned mesh, or add a clip."); return; } - - f32 duration = m_clip->duration(); if (duration <= 0.0f) duration = 1.0f; ImDrawList* dl = ImGui::GetWindowDrawList(); @@ -396,6 +415,7 @@ void AnimationTimelinePanel::renderTimeline() { f32 clickX = ImGui::GetIO().MousePos.x; f32 t = xToTime(clickX); m_currentTime = std::max(0.0f, std::min(t, duration)); + m_applyTime = true; } ImGui::SetCursorScreenPos(ImVec2(cursor.x, cursor.y + k_RulerHeight + 2.0f)); diff --git a/src/editor/AnimationTimeline.hpp b/src/editor/AnimationTimeline.hpp index c72034cf..7af78b03 100644 --- a/src/editor/AnimationTimeline.hpp +++ b/src/editor/AnimationTimeline.hpp @@ -124,6 +124,9 @@ class AnimationTimelinePanel { std::vector> m_tracks; f32 m_currentTime = 0.0f; + f32 m_timelineDuration = 0.0f; + std::string m_driveName; + bool m_applyTime = false; bool m_isPlaying = false; bool m_looping = true; bool m_onionSkinningEnabled = false; diff --git a/src/editor/AnimatorController.cpp b/src/editor/AnimatorController.cpp index dedd39ad..36a64c0f 100644 --- a/src/editor/AnimatorController.cpp +++ b/src/editor/AnimatorController.cpp @@ -1,4 +1,5 @@ #include "editor/AnimatorController.hpp" +#include "animation/SkinLibrary.hpp" #include #include #include @@ -19,6 +20,16 @@ static const ImU32 k_ColStateText = IM_COL32(220,230,255, 255); static const ImU32 k_ColArrow = IM_COL32(160,180,210, 255); static const ImU32 k_ColArrowActive = IM_COL32(80, 220, 120, 255); +void AnimatorControllerWindow::bindSelection(ECS::World* world, ECS::Entity entity) { + m_world = world; + m_entity = entity; + Animator* animator = nullptr; + if (world && entity.isValid()) animator = world->get(entity); + if (animator == m_bound) return; + m_bound = animator; + setAnimator(animator); +} + void AnimatorControllerWindow::setAnimator(Animator* animator) { m_animator = animator ? animator : &m_internalAnimator; m_nodePositions.clear(); @@ -53,6 +64,40 @@ void AnimatorControllerWindow::render() { return; } + if (!m_bound) { + ImGui::TextDisabled("Add an Animator on the selected entity to keep this graph."); + } + if (m_world && m_entity.isValid()) { + if (const Animation::SkinnedPose* pose = m_world->get(m_entity)) { + if (const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath)) { + if (ImGui::Button("States from bone clips") && m_animator && !skin->clipNames.empty()) { + float column = 0.0f; + float row = 0.0f; + for (const std::string& clipName : skin->clipNames) { + FixedString<32> name(clipName.c_str()); + if (name.empty()) continue; + if (!m_animator->states.get(name)) { + AnimationState state; + state.name = name; + m_animator->states.set(name, state); + } + if (m_nodePositions.find(name.cStr()) == m_nodePositions.end()) { + m_nodePositions[name.cStr()] = StateNodePos{column * 180.0f + 20.0f, row * 70.0f + 20.0f}; + column += 1.0f; + if (column >= 4.0f) { + column = 0.0f; + row += 1.0f; + } + } + if (m_animator->currentState.empty()) m_animator->currentState = name; + } + } + ImGui::SameLine(); + ImGui::TextDisabled("%d bone clips", static_cast(skin->clipNames.size())); + } + } + } + float inspectorWidth = 230.0f; float availW = ImGui::GetContentRegionAvail().x; float canvasW = availW - inspectorWidth - 6.0f; @@ -184,6 +229,8 @@ void AnimatorControllerWindow::renderCanvas() { if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { m_selectedState = name.cStr(); + m_animator->currentState = name; + m_animator->timeInState = 0.0f; } if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left, 4.0f)) { ImVec2 delta = ImGui::GetIO().MouseDelta; diff --git a/src/editor/AnimatorController.hpp b/src/editor/AnimatorController.hpp index 580fb5e9..15cf89dd 100644 --- a/src/editor/AnimatorController.hpp +++ b/src/editor/AnimatorController.hpp @@ -1,6 +1,8 @@ #pragma once #include "core/Types.hpp" #include "animation/AnimationComponents.hpp" +#include "ecs/Entity.hpp" +#include "ecs/World.hpp" #include "math/Vec2.hpp" #include #include @@ -21,6 +23,7 @@ class AnimatorControllerWindow { AnimatorControllerWindow() = default; void setAnimator(Animation::Animator* animator); + void bindSelection(ECS::World* world, ECS::Entity entity); Animation::Animator* getAnimator() const { return m_animator; } void render(); @@ -42,6 +45,9 @@ class AnimatorControllerWindow { Animation::Animator m_internalAnimator; Animation::Animator* m_animator = &m_internalAnimator; + Animation::Animator* m_bound = nullptr; + ECS::World* m_world = nullptr; + ECS::Entity m_entity = ECS::Entity::INVALID; std::unordered_map m_nodePositions; diff --git a/src/editor/AssetBrowser.cpp b/src/editor/AssetBrowser.cpp index e8a9581f..3e184d2c 100644 --- a/src/editor/AssetBrowser.cpp +++ b/src/editor/AssetBrowser.cpp @@ -1696,7 +1696,7 @@ void AssetBrowser::render(ECS::World& world, [[maybe_unused]] EditorContext& ctx #ifdef CF_HAS_SDL3 m_previewRenderer.setFrameCommandBuffer(m_frameCmd); - std::string environment = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string(); + std::string environment; f32 exposure = 1.0f; if (ctx.activeWorld) { const Scene::ActiveSkybox sky = Scene::findActiveSkybox(*ctx.activeWorld); diff --git a/src/editor/AssetPreviewRenderer.cpp b/src/editor/AssetPreviewRenderer.cpp index ed183cb7..09a7a44e 100644 --- a/src/editor/AssetPreviewRenderer.cpp +++ b/src/editor/AssetPreviewRenderer.cpp @@ -1,6 +1,7 @@ #include "editor/AssetPreviewRenderer.hpp" #include "editor/EditorIcons.hpp" #include "editor/ImGuiGpuTexture.hpp" +#include "assets/MaterialCache.hpp" #include "assets/MaterialFile.hpp" #include "assets/MeshCache.hpp" #include "assets/MeshImportValidator.hpp" @@ -255,8 +256,28 @@ bool AssetPreviewRenderer::thumbnailReady(const std::string& key) const { return gpu != m_gpuThumbs.end() && gpu->second.ready; } +void AssetPreviewRenderer::invalidateStaleMaterialThumbs() { + const u64 revision = Assets::MaterialCache::instance().revision(); + if (revision == m_materialCacheRevision) return; + m_materialCacheRevision = revision; + for (auto& [key, thumb] : m_gpuThumbs) { + if (!isMaterialPath(key)) continue; + thumb.failed = false; + thumb.stale = true; + if (!thumb.texture) thumb.ready = false; + } + if (m_material.loaded || m_material.failed) { + m_cachedKey.clear(); + m_material = {}; + } + if (!m_activeThumbKey.empty() && isMaterialPath(m_activeThumbKey)) { + m_activeThumbKey.clear(); + } +} + void AssetPreviewRenderer::prepareThumbnails( const std::vector>& items, const std::string& projectRoot) { + invalidateStaleMaterialThumbs(); m_thumbItems = items; if (!m_activeThumbKey.empty()) { bool stillVisible = false; @@ -284,7 +305,10 @@ void AssetPreviewRenderer::pumpThumbnail(const std::string& projectRoot) { if (it != m_imageThumbs.end() && (it->second.ready || it->second.failed)) continue; } else { const auto it = m_gpuThumbs.find(key); - if (it != m_gpuThumbs.end() && (it->second.ready || it->second.failed)) continue; + if (it != m_gpuThumbs.end() && (it->second.ready || it->second.failed) && + !it->second.stale) { + continue; + } } m_activeThumbKey = key; m_activeThumbIsImage = image; @@ -336,8 +360,9 @@ void AssetPreviewRenderer::pumpThumbnail(const std::string& projectRoot) { if (m_activeThumbIsMesh) { rendered = m_thumbs.renderMesh(m_frameCmd, m_activeThumbKey, kThumbnailPixels, settings, projectRoot); } else { - Assets::MaterialSurface surface; - if (Assets::loadMaterialFile(m_activeThumbKey, surface)) { + Assets::MaterialSurface surface = + Assets::MaterialCache::instance().resolve(m_activeThumbKey, projectRoot); + if (surface.valid) { rendered = m_thumbs.render(m_frameCmd, surface, kThumbnailPixels, settings, projectRoot); } } @@ -362,6 +387,7 @@ void AssetPreviewRenderer::pumpThumbnail(const std::string& projectRoot) { if (thumb.texture && thumb.texture->handle) { m_frameCmd->copyTexture(source, thumb.texture, kThumbnailPixels, kThumbnailPixels); thumb.ready = true; + thumb.stale = false; } } if (!m_thumbs.wantsMoreFrames()) m_activeThumbKey.clear(); @@ -739,17 +765,22 @@ void AssetPreviewRenderer::renderScenePreview(const std::filesystem::path& path, ImGui::Dummy(size); } -bool AssetPreviewRenderer::ensureMaterialLoaded(const std::filesystem::path& path) { +bool AssetPreviewRenderer::ensureMaterialLoaded(const std::filesystem::path& path, + const std::string& projectRoot) { std::error_code ec; const auto canonical = std::filesystem::weakly_canonical(path, ec); const std::string key = ec ? path.string() : canonical.string(); - if (m_cachedKey == key && (m_material.loaded || m_material.failed)) { + const u64 revision = Assets::MaterialCache::instance().revision(); + if (m_cachedKey == key && m_materialCacheRevision == revision && + (m_material.loaded || m_material.failed)) { return m_material.loaded; } - invalidate(); + if (!m_cachedKey.empty() && m_cachedKey != key) invalidate(); m_cachedKey = key; - m_material.loaded = Assets::loadMaterialFile(path, m_material.surface); + m_materialCacheRevision = revision; + m_material.surface = Assets::MaterialCache::instance().resolve(path.string(), projectRoot); + m_material.loaded = m_material.surface.valid; m_material.failed = !m_material.loaded; return m_material.loaded; } @@ -765,7 +796,7 @@ std::filesystem::path resolveProjectRelative(const std::string& projectRoot, void AssetPreviewRenderer::renderMaterialPreview(const std::filesystem::path& path, const std::string& projectRoot, ImVec2 size) { - if (!ensureMaterialLoaded(path)) { + if (!ensureMaterialLoaded(path, projectRoot)) { renderFallbackIcon(AssetType::Unknown, path, size); return; } diff --git a/src/editor/AssetPreviewRenderer.hpp b/src/editor/AssetPreviewRenderer.hpp index e55ff7ea..ff5e7742 100644 --- a/src/editor/AssetPreviewRenderer.hpp +++ b/src/editor/AssetPreviewRenderer.hpp @@ -81,9 +81,10 @@ class AssetPreviewRenderer { bool ensureImageLoaded(const std::filesystem::path& path); bool ensureWaveformLoaded(const std::filesystem::path& path); - bool ensureMaterialLoaded(const std::filesystem::path& path); + bool ensureMaterialLoaded(const std::filesystem::path& path, const std::string& projectRoot); #ifdef CF_HAS_SDL3 + void invalidateStaleMaterialThumbs(); Render::MaterialPreviewSettings previewSettings(u32 pixelSize) const; bool drawGpuTexture(RHI::Texture* texture, ImVec2 size); void pumpThumbnail(const std::string& projectRoot); @@ -93,6 +94,7 @@ class AssetPreviewRenderer { RHI::Texture* texture = nullptr; bool ready = false; bool failed = false; + bool stale = false; }; struct ImageThumb { std::unique_ptr texture; @@ -108,6 +110,7 @@ class AssetPreviewRenderer { Render::MaterialPreviewRenderer m_thumbs; std::string m_envPath; f32 m_envExposure = 1.0f; + u64 m_materialCacheRevision = 0; std::unordered_map m_gpuThumbs; std::unordered_map m_imageThumbs; std::vector> m_thumbItems; diff --git a/src/editor/BrowseSession.cpp b/src/editor/BrowseSession.cpp index 34d5fcfa..e3cf5491 100644 --- a/src/editor/BrowseSession.cpp +++ b/src/editor/BrowseSession.cpp @@ -24,8 +24,15 @@ void serviceBrowseSession(EditorContext& ctx, AssetBrowser& browser) { if (session.stringTarget) { *session.stringTarget = picked; ctx.isDirty = true; + session.clear(); + } else { + const u32 field = session.fieldId; + session.pickedText = std::move(picked); + session.kind = EditorContext::BrowseSession::Kind::None; + session.started = false; + session.stringTarget = nullptr; + session.fieldId = field; } - session.clear(); } else if (poll == AssetBrowser::AssetPickerPoll::Cancelled) { session.clear(); } diff --git a/src/editor/CameraPreviewPanel.cpp b/src/editor/CameraPreviewPanel.cpp index ea1359f6..2d4fd52b 100644 --- a/src/editor/CameraPreviewPanel.cpp +++ b/src/editor/CameraPreviewPanel.cpp @@ -166,6 +166,7 @@ void drawLine3D(ImDrawList* dl, const Mat4& vp, ImVec2 origin, ImVec2 panelSize, } std::string resolveProjectRoot(const EditorContext& ctx) { + if (!ctx.projectRootPath.empty()) return ctx.projectRootPath.string(); if (ctx.currentScenePath.empty()) return {}; const auto sceneDir = std::filesystem::path(ctx.currentScenePath).parent_path(); std::string projectRoot = sceneDir.parent_path().string(); diff --git a/src/editor/CapLoader.cpp b/src/editor/CapLoader.cpp index b770fa72..ebb77a5b 100644 --- a/src/editor/CapLoader.cpp +++ b/src/editor/CapLoader.cpp @@ -2,9 +2,10 @@ #include "debug/LogSystem.hpp" #include +#include #ifdef CF_HAS_CAF_PACK -#include "caf-pack/Reader.hpp" +#include "caffeine/CafTypes.hpp" #endif namespace Caffeine::Editor { @@ -13,30 +14,81 @@ namespace Caffeine::Editor { std::vector CapLoader::loadCap(const std::filesystem::path& path) { std::vector assets; - std::string error; - const auto loaded = CafPack::Reader::loadCap(path, &error); - if (loaded.empty() && !error.empty()) { - Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", "%s", - error.c_str()); + + std::ifstream file(path, std::ios::binary); + if (!file) { + Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", + "Failed to open CAP file: %s", path.string().c_str()); + return assets; + } + + using Caffeine::Assets::CapHeader; + using Caffeine::Assets::CapEntry; + using Caffeine::Assets::CafHeader; + using Caffeine::Assets::CAP_MAGIC; + using Caffeine::Assets::CAP_VERSION; + using Caffeine::Assets::CAF_MAGIC; + + CapHeader cap{}; + file.read(reinterpret_cast(&cap), sizeof(cap)); + if (!file || file.gcount() != static_cast(sizeof(cap))) { + Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", + "CAP header truncated: %s", path.string().c_str()); + return assets; + } + if (cap.magic != CAP_MAGIC) { + Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", + "Invalid CAP magic in %s", path.string().c_str()); + return assets; + } + if (cap.version != CAP_VERSION) { + Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", + "Unsupported CAP version %u in %s", cap.version, + path.string().c_str()); return assets; } - for (const CafPack::CafAsset& caf : loaded) { + if (cap.assetCount == 0) return assets; + + file.seekg(static_cast(cap.tableOffset), std::ios::beg); + if (!file) return assets; + + std::vector entries(cap.assetCount); + file.read(reinterpret_cast(entries.data()), + static_cast(cap.assetCount * sizeof(CapEntry))); + if (!file) { + Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", + "CAP entry table truncated: %s", path.string().c_str()); + return assets; + } + + for (const CapEntry& entry : entries) { + if (entry.size < sizeof(CafHeader)) continue; + + std::vector blob(entry.size); + file.seekg(static_cast(entry.offset), std::ios::beg); + file.read(reinterpret_cast(blob.data()), static_cast(entry.size)); + if (!file) continue; + + CafHeader cafHeader{}; + std::memcpy(&cafHeader, blob.data(), sizeof(CafHeader)); + if (cafHeader.magic != CAF_MAGIC) continue; + CapAssetMetadata metadata{ - .magic = caf.header.magic, - .version = caf.header.version, - .assetType = caf.header.assetType, + .magic = cafHeader.magic, + .version = cafHeader.version, + .assetType = cafHeader.assetType, .reserved = {0}, - .payloadSize = caf.header.payloadSize, - .flags = caf.header.flags, - .crc64 = caf.header.crc64, + .payloadSize = cafHeader.payloadSize, + .flags = cafHeader.flags, + .crc64 = cafHeader.crc64, }; - std::memcpy(metadata.reserved, caf.header.reserved, sizeof(metadata.reserved)); + std::memcpy(metadata.reserved, cafHeader.reserved, sizeof(metadata.reserved)); assets.push_back(LoadedAsset{ - .hashID = caf.hashID, - .type = static_cast(caf.header.assetType), - .cafBlob = caf.blob, + .hashID = entry.hashID, + .type = static_cast(cafHeader.assetType), + .cafBlob = std::move(blob), .metadata = metadata, }); } @@ -51,6 +103,7 @@ Caffeine::Assets::CafAssetType CapLoader::identifyAssetType(const CapAssetMetada #else std::vector CapLoader::loadCap(const std::filesystem::path& path) { + (void)path; Debug::LogSystem::instance().log(Debug::LogLevel::Error, "CapLoader", "CAP loading not available - caf-pack submodule not included"); return {}; diff --git a/src/editor/CapLoader.hpp b/src/editor/CapLoader.hpp index 362cc00d..a62e5229 100644 --- a/src/editor/CapLoader.hpp +++ b/src/editor/CapLoader.hpp @@ -4,7 +4,7 @@ #include #ifdef CF_HAS_CAF_PACK -#include "../caf-pack/include/caffeine/CafTypes.hpp" +#include "caffeine/CafTypes.hpp" #endif namespace Caffeine::Editor { diff --git a/src/editor/DefaultScene.hpp b/src/editor/DefaultScene.hpp new file mode 100644 index 00000000..86ae0e4e --- /dev/null +++ b/src/editor/DefaultScene.hpp @@ -0,0 +1,63 @@ +#pragma once + +#include "editor/EditorContext.hpp" +#include "editor/EntityPresetUtils.hpp" +#include "ecs/ForwardRenderComponents.hpp" +#include "ecs/LightComponents.hpp" +#include "ecs/SkyboxComponents.hpp" +#include "ecs/Components.hpp" +#include "math/Quat.hpp" +#include "scene/LightingSystem.hpp" +#include "scene/SceneComponents.hpp" +#include + +namespace Caffeine::Editor { + +/// Entities every new project / blank scene starts with: +/// Environment → Skybox + Directional Light, and a Camera 3D. +inline void populateDefaultScene(ECS::World& world) { + ECS::Entity environment = world.create(); + setEntityName(world, environment, "Environment"); + world.add(environment); + world.add(environment); + world.add(environment); + world.add(environment); + auto& features = world.add(environment); + features.ibl.enabled = false; + features.ibl.diffuse = 0.0f; + features.ibl.specular = 1.0f; + + ECS::Entity sky = world.create(); + setEntityName(world, sky, "Skybox"); + ECS::SkyboxComponent skybox; + skybox.enabled = true; + skybox.presetIndex = 0; + skybox.exposure = 1.0f; + std::strncpy(skybox.customTexturePath, ECS::kDefaultProjectSkyPath, sizeof(skybox.customTexturePath) - 1); + world.add(sky, skybox); + world.add(sky); + EntityPresetUtils::parentEntity(world, sky, environment); + + ECS::Entity sun = world.create(); + setEntityName(world, sun, "Directional Light"); + auto& light = world.add(sun); + light.intensity = 2.5f; + world.add(sun); + world.add(sun); + world.add(sun); + world.add(sun); + Scene::applyDefaultSunOrientation(world, sun); + EntityPresetUtils::parentEntity(world, sun, environment); + + ECS::Entity camera = world.create(); + setEntityName(world, camera, "Camera"); + world.add(camera); + world.add(camera, ECS::Position3D{Vec3(0.0f, 2.5f, 8.0f)}); + const Vec3 look = Vec3(0.0f, 0.5f, 0.0f) - Vec3(0.0f, 2.5f, 8.0f); + const Quat q = Caffeine::Quat::lookAt(look.normalized(), Vec3(0.0f, 1.0f, 0.0f)); + world.add(camera, ECS::Rotation3D{Vec4(q.x, q.y, q.z, q.w)}); + world.add(camera); + world.add(camera, ECS::CameraActiveComponent{false}); +} + +} // namespace Caffeine::Editor diff --git a/src/editor/EditorContext.cpp b/src/editor/EditorContext.cpp index 0e4adb49..e48ef176 100644 --- a/src/editor/EditorContext.cpp +++ b/src/editor/EditorContext.cpp @@ -1,5 +1,5 @@ #include "editor/EditorContext.hpp" -#include "scene/SceneSerializer.hpp" +#include "editor/SceneSerializer.hpp" #include "core/Assertions.hpp" #include @@ -72,11 +72,11 @@ void UndoStack::clear() { } void UndoStack::applySnapshot(ECS::World& world, const std::vector& snapshot) { - CF_ASSERT(!snapshot.empty(), "UndoStack::applySnapshot — empty snapshot"); - - world.destroyAll(); - - Scene::SceneSerializer serializer(world); + if (snapshot.empty()) { + world.destroyAll(); + return; + } + Editor::SceneSerializer serializer(world); serializer.deserializeFromMemory(snapshot); } @@ -91,7 +91,7 @@ void EditorContext::beginUndo(EditorCommand::Type type, u32 entityId, ECS::World m_pendingCmd.type = type; m_pendingCmd.targetEntity = entityId; - Scene::SceneSerializer serializer(world); + Editor::SceneSerializer serializer(world); serializer.serializeToMemory(m_pendingCmd.beforeState); m_undoPending = true; @@ -100,7 +100,7 @@ void EditorContext::beginUndo(EditorCommand::Type type, u32 entityId, ECS::World void EditorContext::endUndo(ECS::World& world) { CF_ASSERT(m_undoPending, "EditorContext::endUndo — called without matching beginUndo"); - Scene::SceneSerializer serializer(world); + Editor::SceneSerializer serializer(world); serializer.serializeToMemory(m_pendingCmd.afterState); undoStack.push(m_pendingCmd); diff --git a/src/editor/EditorContext.hpp b/src/editor/EditorContext.hpp index 4b4adf6b..adbf3d2f 100644 --- a/src/editor/EditorContext.hpp +++ b/src/editor/EditorContext.hpp @@ -114,15 +114,21 @@ class EditorContext { std::string filter; std::filesystem::path startPath; std::filesystem::path result; + /// Stable storage only. A pointer into a widget-local string is dangling by the + /// time the picker closes, so those fields use fieldId + pickedText instead. std::string* stringTarget = nullptr; + u32 fieldId = 0; + std::string pickedText; u32 tag = 0; void clear() { *this = {}; } - void requestProjectAsset(std::string* target, const char* extensionFilter, const char* fieldLabel) { + void requestProjectAsset(std::string* target, const char* extensionFilter, const char* fieldLabel, + u32 ownerFieldId = 0) { clear(); kind = Kind::ProjectAsset; stringTarget = target; + fieldId = ownerFieldId; filter = extensionFilter ? extensionFilter : ""; title = fieldLabel ? fieldLabel : "asset"; } @@ -145,6 +151,11 @@ class EditorContext { GizmoMode gizmoMode = GizmoMode::Translate; GizmoSpace gizmoSpace = GizmoSpace::World; + /// Object moves the entity. Vertex, edge and face edit the mesh itself. + enum class MeshElementMode : u8 { Object, Vertex, Edge, Face }; + MeshElementMode meshElementMode = MeshElementMode::Object; + std::vector meshElementSelection; + // ── Snap ─────────────────────────────────────────────────────────── bool snapToGrid = false; f32 snapGridSize = 1.0f; @@ -189,6 +200,9 @@ class EditorContext { /// Internal resolution of GPU viewports relative to their pixel size (0.5 – 2.0). f32 renderScale = 1.0f; + /// Editor scene viewport only. Game cameras keep their own post-process anti-aliasing. + enum class ViewportAntiAlias : u8 { Off = 0, Fxaa = 1, Taa = 2 }; + ViewportAntiAlias viewportAntiAlias = ViewportAntiAlias::Taa; // ── Texture quality (distance-based LOD around viewers) ───────────── bool textureQualityEnabled = true; diff --git a/src/editor/EditorPanelUtils.hpp b/src/editor/EditorPanelUtils.hpp index c53d38ce..537925af 100644 --- a/src/editor/EditorPanelUtils.hpp +++ b/src/editor/EditorPanelUtils.hpp @@ -109,6 +109,11 @@ inline ImGuiID detachedPanelClassId() { return id; } +inline int& detachedPanelPlaceFrame() { + static int frame = -1; + return frame; +} + inline void editorPanelApplyDetach(bool detached, ImVec2 detachedSize = ImVec2(0, 0)) { if (!detached) return; @@ -116,16 +121,20 @@ inline void editorPanelApplyDetach(bool detached, ImVec2 detachedSize = ImVec2(0 windowClass.ClassId = detachedPanelClassId(); windowClass.DockingAllowUnclassed = true; windowClass.ViewportFlagsOverrideSet = ImGuiViewportFlags_NoAutoMerge; + windowClass.ViewportFlagsOverrideClear = + ImGuiViewportFlags_NoDecoration | ImGuiViewportFlags_NoTaskBarIcon; ImGui::SetNextWindowClass(&windowClass); ImGui::SetNextWindowDockID(0, ImGuiCond_Always); - if (detachedSize.x > 0.0f && detachedSize.y > 0.0f) { - ImGui::SetNextWindowSize(detachedSize, ImGuiCond_FirstUseEver); + if (detachedSize.x > 0.0f && detachedSize.y > 0.0f && + ImGui::GetFrameCount() == detachedPanelPlaceFrame()) { + ImGui::SetNextWindowSize(detachedSize, ImGuiCond_Always); const ImGuiViewport* mainVp = ImGui::GetMainViewport(); if (mainVp) { - ImGui::SetNextWindowPos( - ImVec2(mainVp->Pos.x + 48.0f, mainVp->Pos.y + 48.0f), - ImGuiCond_FirstUseEver); + // Keep the new window on the current monitor. Wayland drops a toplevel + // whose first position is past the last output. + ImGui::SetNextWindowPos(ImVec2(mainVp->Pos.x + 72.0f, mainVp->Pos.y + 72.0f), + ImGuiCond_Always); } } } @@ -152,11 +161,12 @@ inline void editorPanelDetachTabButton(bool& detached) { const char* label = detached ? "Dock" : "Pop"; if (ImGui::Button(label, ImVec2(btnW, btnH))) { detached = !detached; + if (detached) detachedPanelPlaceFrame() = ImGui::GetFrameCount() + 1; } ImGui::PopStyleVar(); if (ImGui::IsItemHovered()) { - ImGui::SetTooltip(detached ? "Dock back into main window" - : "Pop out to separate window (drag to another monitor)"); + ImGui::SetTooltip(detached ? "Dock back into the main window" + : "Open a system window you can drag to another monitor"); } ImGui::PopID(); } diff --git a/src/editor/EditorPreferences.cpp b/src/editor/EditorPreferences.cpp index 4ea74daa..362a0fa4 100644 --- a/src/editor/EditorPreferences.cpp +++ b/src/editor/EditorPreferences.cpp @@ -98,6 +98,7 @@ EditorPreferences EditorPreferences::load() { readFloatField(json, "texture_quality_falloff", prefs.textureQualityFalloff); readFloatField(json, "texture_quality_min_scale", prefs.textureQualityMinScale); readFloatField(json, "render_scale", prefs.renderScale); + readIntField(json, "viewport_anti_alias", prefs.viewportAntiAlias); readBoolField(json, "show_fps_status_bar", prefs.showFPSInStatusBar); readBoolField(json, "confirm_scene_close", prefs.confirmOnSceneClose); readBoolField(json, "reopen_last_scene", prefs.reopenLastSceneOnStartup); @@ -130,6 +131,7 @@ bool EditorPreferences::save() const { file << " \"texture_quality_falloff\": " << textureQualityFalloff << ",\n"; file << " \"texture_quality_min_scale\": " << textureQualityMinScale << ",\n"; file << " \"render_scale\": " << renderScale << ",\n"; + file << " \"viewport_anti_alias\": " << viewportAntiAlias << ",\n"; file << " \"show_fps_status_bar\": " << (showFPSInStatusBar ? "true" : "false") << ",\n"; file << " \"confirm_scene_close\": " << (confirmOnSceneClose ? "true" : "false") << ",\n"; file << " \"reopen_last_scene\": " << (reopenLastSceneOnStartup ? "true" : "false") << "\n"; diff --git a/src/editor/EditorPreferences.hpp b/src/editor/EditorPreferences.hpp index e17cacd1..67c338d1 100644 --- a/src/editor/EditorPreferences.hpp +++ b/src/editor/EditorPreferences.hpp @@ -28,6 +28,8 @@ struct EditorPreferences { f32 textureQualityMinScale = 0.25f; /// Internal scene resolution multiplier for GPU viewport / previews (0.25–2). f32 renderScale = 1.0f; + /// Scene viewport anti-aliasing only: 0 = off, 1 = FXAA, 2 = TAA. + int viewportAntiAlias = 2; bool showFPSInStatusBar = true; bool confirmOnSceneClose = true; bool reopenLastSceneOnStartup = true; diff --git a/src/editor/EffectEditorPanel.cpp b/src/editor/EffectEditorPanel.cpp index a4641511..dd5547e5 100644 --- a/src/editor/EffectEditorPanel.cpp +++ b/src/editor/EffectEditorPanel.cpp @@ -1,6 +1,7 @@ #include "editor/EffectEditorPanel.hpp" #include "editor/EffectObjectFactory.hpp" +#include "effects/EffectSystem.hpp" #include "effects/EffectTypes.hpp" #include "ecs/ComponentQuery.hpp" @@ -119,7 +120,7 @@ void EffectEditorPanel::onImGuiRender(EditorContext& ctx) { spawnEffectObject(*world, ctx, "Material Shade", effect, false); } ImGui::TextDisabled("caffeine.effects.volumetricShape(entity, shape, columns, rows)"); - ImGui::TextDisabled("shape 0 sphere, 1 cone, 2 box, 3 cylinder, 4 window. Shafts follow -Z."); + ImGui::TextDisabled("shape 0 sphere, 1 cone, 2 box, 3 cylinder, 4 window. The volume is the mesh."); ImGui::TextDisabled("caffeine.effects.fog(entity, domain, style) style 0 fog, 1 dust, 2 mist, 3 smoke"); std::vector effects; @@ -175,45 +176,51 @@ void EffectEditorPanel::onImGuiRender(EditorContext& ctx) { const Effects::EffectKind kind = static_cast(selected->kind); if (kind == Effects::EffectKind::VolumetricLight) { + Effects::ensureVolumetricMesh(*world, selectedEntity, *selected); + Effects::pullVolumetricSizeFromMesh(*world, selectedEntity, *selected); + auto pushSize = [&]() { Effects::pushVolumetricSizeToMesh(*world, selectedEntity, *selected); }; int shape = static_cast(Effects::volumetricShapeOf(*selected)); if (ImGui::Combo("Format", &shape, volumeShapes, 5)) { const Vec3 color = selected->lightColor; Effects::configureVolumetricLight(*selected, static_cast(shape)); selected->lightColor = color; + Effects::adoptVolumetricMesh(*world, selectedEntity, *selected); ctx.isDirty = true; } + ImGui::TextDisabled("The volume is the mesh. Move, rotate and scale it."); const Effects::VolumetricShape volume = Effects::volumetricShapeOf(*selected); if (volume == Effects::VolumetricShape::Sphere) { - if (dragFloat("Radius", selected->radius, 0.05f, 0.1f, 40.0f)) ctx.isDirty = true; + if (dragFloat("Radius", selected->radius, 0.05f, 0.1f, 40.0f)) { + pushSize(); + ctx.isDirty = true; + } } else { - if (dragFloat("Length", selected->radius, 0.05f, 0.2f, 40.0f)) ctx.isDirty = true; + if (dragFloat("Length", selected->radius, 0.05f, 0.2f, 40.0f)) { + pushSize(); + ctx.isDirty = true; + } if (volume == Effects::VolumetricShape::Cone) { - if (dragFloat("Near", selected->startSize, 0.01f, 0.05f, 8.0f)) ctx.isDirty = true; - if (dragFloat("Far", selected->endSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; + f32 baseRadius = selected->endSize * 0.5f; + if (dragFloat("Radius", baseRadius, 0.01f, 0.05f, 12.0f)) { + selected->endSize = baseRadius * 2.0f; + pushSize(); + ctx.isDirty = true; + } } else if (volume == Effects::VolumetricShape::Cylinder) { if (dragFloat("Diameter", selected->startSize, 0.01f, 0.05f, 8.0f)) { selected->endSize = selected->startSize; + pushSize(); ctx.isDirty = true; } } else { - if (dragFloat("Width", selected->startSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; - if (dragFloat("Height", selected->endSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; - } - if (volume == Effects::VolumetricShape::Window) { - u32 columns = 1; - u32 rows = 1; - Effects::volumetricGridOf(*selected, columns, rows); - int columnCount = static_cast(columns); - int rowCount = static_cast(rows); - if (ImGui::SliderInt("Columns", &columnCount, 1, 8)) { - Effects::setVolumetricGrid(*selected, static_cast(columnCount), rows); + if (dragFloat("Width", selected->startSize, 0.01f, 0.05f, 12.0f)) { + pushSize(); ctx.isDirty = true; } - if (ImGui::SliderInt("Rows", &rowCount, 1, 8)) { - Effects::setVolumetricGrid(*selected, static_cast(columnCount), static_cast(rowCount)); + if (dragFloat("Height", selected->endSize, 0.01f, 0.05f, 12.0f)) { + pushSize(); ctx.isDirty = true; } - ImGui::TextDisabled("Aim -Z from the glass toward the floor. Dust in the room makes the shafts read."); } } if (dragFloat("Density", selected->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; diff --git a/src/editor/EffectObjectFactory.hpp b/src/editor/EffectObjectFactory.hpp index 26230643..ddcc3094 100644 --- a/src/editor/EffectObjectFactory.hpp +++ b/src/editor/EffectObjectFactory.hpp @@ -1,6 +1,7 @@ #pragma once #include "editor/EditorContext.hpp" +#include "effects/EffectSystem.hpp" #include "effects/EffectTypes.hpp" #include "ecs/Components.hpp" #include "ecs/Components3D.hpp" @@ -20,6 +21,11 @@ inline ECS::Entity spawnEffectObject(ECS::World& world, EditorContext& ctx, cons world.add(entity); } world.add(entity, effect); + if (Effects::EffectComponent* stored = world.get(entity)) { + if (stored->kind == static_cast(Effects::EffectKind::VolumetricLight)) { + Effects::ensureVolumetricMesh(world, entity, *stored); + } + } ctx.selectEntity(entity); ctx.isDirty = true; ctx.endUndo(world); diff --git a/src/editor/GameplayPreviewPanel.cpp b/src/editor/GameplayPreviewPanel.cpp index ef17019a..41007bbb 100644 --- a/src/editor/GameplayPreviewPanel.cpp +++ b/src/editor/GameplayPreviewPanel.cpp @@ -54,6 +54,7 @@ bool findGameplayCamera(ECS::World& world, ECS::Entity& outEntity, ECS::Camera3D } std::string projectRootFromContext(const EditorContext& ctx) { + if (!ctx.projectRootPath.empty()) return ctx.projectRootPath.string(); if (ctx.currentScenePath.empty()) return {}; const auto sceneDir = std::filesystem::path(ctx.currentScenePath).parent_path(); const std::string root = sceneDir.parent_path().string(); @@ -68,8 +69,6 @@ void drawSceneSkybox(ImDrawList* dl, ImVec2 origin, ImVec2 size, ECS::World& wor const Scene::ActiveSkybox active = Scene::findActiveSkybox(world); if (active.component) { texturePath = Scene::resolveSkyboxTexturePath(*active.component, projectRoot); - } else { - texturePath = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex); } if (texturePath.empty()) return; renderer.draw(dl, origin, size, camera, texturePath.string(), maxRasterDim); @@ -253,7 +252,7 @@ void GameplayPreviewPanel::render(ECS::World& world, EditorContext& ctx) { Render::GpuSceneRenderOptions previewOpts; previewOpts.enableShadows = false; previewOpts.wireframeMeshes = false; - previewOpts.environmentPath = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string(); + previewOpts.environmentPath.clear(); previewOpts.postProcessCamera = cameraEntity; previewOpts.renderScale = ctx.renderScale; previewOpts.deltaTime = ImGui::GetIO().DeltaTime; diff --git a/src/editor/HierarchyPanel.cpp b/src/editor/HierarchyPanel.cpp index 610c8ed2..6517b3d8 100644 --- a/src/editor/HierarchyPanel.cpp +++ b/src/editor/HierarchyPanel.cpp @@ -7,6 +7,7 @@ #include "scene/HierarchySystem.hpp" #include "ecs/TerrainComponents.hpp" #include "ecs/LightComponents.hpp" +#include "ecs/SkyboxComponents.hpp" #include "ecs/CameraComponents.hpp" #include "ecs/Components3D.hpp" #include "scene/LightingSystem.hpp" @@ -466,6 +467,7 @@ void HierarchyPanel::createEntityWithType(ECS::World& world, const char* name, c ECS::SkyboxComponent sky; sky.presetIndex = 0; sky.enabled = true; + std::strncpy(sky.customTexturePath, ECS::kDefaultProjectSkyPath, sizeof(sky.customTexturePath) - 1); world.add(e, sky); world.add(e); } diff --git a/src/editor/ImGuiIntegration.hpp b/src/editor/ImGuiIntegration.hpp index e3209951..cd7f985f 100644 --- a/src/editor/ImGuiIntegration.hpp +++ b/src/editor/ImGuiIntegration.hpp @@ -26,6 +26,10 @@ class ImGuiIntegration { io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; + // Secondary viewports are real OS windows (title bar, task bar, other monitors). + io.ConfigViewportsNoDecoration = false; + io.ConfigViewportsNoDefaultParent = true; + io.ConfigViewportsNoTaskBarIcon = false; ImGui_ImplSDL3_InitForSDLGPU(window); diff --git a/src/editor/InspectorPanel.cpp b/src/editor/InspectorPanel.cpp index 7fe535f5..5ba50a26 100644 --- a/src/editor/InspectorPanel.cpp +++ b/src/editor/InspectorPanel.cpp @@ -14,8 +14,10 @@ #include "physics/PhysicsComponents2D.hpp" #include "physics/PhysicsComponents3D.hpp" #include "ecs/MeshComponents.hpp" +#include "ecs/MeshGeometry.hpp" #include "animation/AnimationPlayer.hpp" #include "animation/SkinLibrary.hpp" +#include "effects/EffectSystem.hpp" #include "effects/EffectTypes.hpp" #include "navigation/NavVolume.hpp" #include "assets/MeshCache.hpp" @@ -477,10 +479,12 @@ void InspectorPanel::drawAudioSource(ECS::World& world, ECS::Entity e, EditorCon auto* emitter = world.get(e); std::string clipStr(emitter->clipPath.cStr()); + ImGui::PushID("audio-clip"); if (Widgets::AssetField(ctx, "Clip", clipStr, ".wav;.ogg;.mp3")) { emitter->clipPath = clipStr.c_str(); ctx.isDirty = true; } + ImGui::PopID(); ImGui::SliderFloat("Volume", &emitter->volume, 0.0f, 1.0f, "%.2f"); if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; @@ -699,6 +703,15 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont Widgets::setWidthForLabel("Primitive"); if (ImGui::Combo("Primitive", ¤t, primitiveNames, IM_ARRAYSIZE(primitiveNames))) { mf->primitive = static_cast(current); + if (world.has(e)) world.remove(e); + ctx.meshElementSelection.clear(); + if (Effects::EffectComponent* effect = world.get(e)) { + Effects::VolumetricShape shape = Effects::VolumetricShape::Sphere; + if (effect->kind == static_cast(Effects::EffectKind::VolumetricLight) && + Effects::volumetricShapeForMesh(mf->primitive, shape)) { + effect->pad1 = static_cast(shape); + } + } ctx.isDirty = true; } if (mf->primitive != ECS::MeshPrimitive::Custom) { @@ -711,6 +724,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont ctx.isDirty = true; } ImGui::TextDisabled("Non-uniform scale stretches the primitive."); + ImGui::TextDisabled("Viewport: Vertex, Edge and Face edit the geometry."); } } if (mf->primitive == ECS::MeshPrimitive::Custom) { @@ -1049,35 +1063,29 @@ void InspectorPanel::drawSkybox(ECS::World& world, ECS::Entity e, EditorContext& ctx.isDirty = true; } - const bool hasCustomTexture = sky->customTexturePath[0] != '\0'; - int preset = std::clamp(sky->presetIndex, 0, ECS::kSkyboxPresetCount - 1); - if (!hasCustomTexture) { - if (ImGui::Combo("Preset", &preset, ECS::kSkyboxPresetLabels, ECS::kSkyboxPresetCount)) { - sky->presetIndex = preset; - ctx.isDirty = true; - } - } else { - ImGui::BeginDisabled(); - ImGui::Combo("Preset", &preset, ECS::kSkyboxPresetLabels, ECS::kSkyboxPresetCount); - ImGui::EndDisabled(); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Clear Custom Texture to use a preset"); - } - } - - if (ImGui::DragFloat("Exposure", &sky->exposure, 0.01f, 0.0f, 8.0f, "%.2f")) { + if (sky->customTexturePath[0] == '\0' && + sky->presetIndex >= 0 && sky->presetIndex < ECS::kSkyboxPresetCount) { + const char* file = ECS::kSkyboxPresetFiles[sky->presetIndex]; + const char* slash = std::strrchr(file, '/'); + const char* name = slash ? slash + 1 : file; + const std::string relative = std::string("assets/raw/sky/") + name; + std::strncpy(sky->customTexturePath, relative.c_str(), sizeof(sky->customTexturePath) - 1); ctx.isDirty = true; } - if (ImGui::InputText("Custom Texture", sky->customTexturePath, sizeof(sky->customTexturePath))) { + std::string texture = sky->customTexturePath; + ImGui::PushID("skybox"); + if (Widgets::AssetField(ctx, "Texture", texture, ".png;.jpg;.jpeg;.hdr")) { + std::memset(sky->customTexturePath, 0, sizeof(sky->customTexturePath)); + std::strncpy(sky->customTexturePath, texture.c_str(), sizeof(sky->customTexturePath) - 1); + sky->customTexturePath[sizeof(sky->customTexturePath) - 1] = '\0'; + if (sky->customTexturePath[0] == '\0') sky->presetIndex = -1; ctx.isDirty = true; } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Optional HDR/PNG path relative to project or absolute. Overrides preset."); - } - ImGui::SameLine(); - if (ImGui::Button("Clear")) { - sky->customTexturePath[0] = '\0'; + ImGui::PopID(); + ImGui::TextDisabled("Empty texture uses the clear sky."); + + if (ImGui::DragFloat("Exposure", &sky->exposure, 0.01f, 0.0f, 8.0f, "%.2f")) { ctx.isDirty = true; } } @@ -1341,7 +1349,8 @@ void InspectorPanel::drawForwardRenderFeatures(ECS::World& world, ECS::Entity e, } } if (ImGui::CollapsingHeader("IBL", ImGuiTreeNodeFlags_DefaultOpen)) { - if (ImGui::Checkbox("Enabled", &fx->ibl.enabled)) ctx.isDirty = true; + if (ImGui::Checkbox("Diffuse IBL", &fx->ibl.enabled)) ctx.isDirty = true; + ImGui::TextDisabled("Sky as fill light. Metals still reflect the sky via Specular."); if (ImGui::SliderFloat("Diffuse", &fx->ibl.diffuse, 0.0f, 2.0f)) ctx.isDirty = true; if (ImGui::SliderFloat("Specular", &fx->ibl.specular, 0.0f, 2.0f)) ctx.isDirty = true; } @@ -1597,43 +1606,50 @@ void InspectorPanel::drawEffect(ECS::World& world, ECS::Entity e, EditorContext& if (ImGui::DragFloat("End Size", &effect->endSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; if (ImGui::DragFloat("Gravity Y", &effect->gravity.y, 0.05f, -20.0f, 20.0f)) ctx.isDirty = true; } else if (effect->kind == static_cast(Effects::EffectKind::VolumetricLight)) { + Effects::ensureVolumetricMesh(world, e, *effect); + Effects::pullVolumetricSizeFromMesh(world, e, *effect); + auto pushSize = [&]() { Effects::pushVolumetricSizeToMesh(world, e, *effect); }; const char* volumeShapes[] = {"Sphere", "Cone", "Box", "Cylinder", "Window"}; int shape = static_cast(Effects::volumetricShapeOf(*effect)); if (ImGui::Combo("Format", &shape, volumeShapes, 5)) { const Vec3 color = effect->lightColor; Effects::configureVolumetricLight(*effect, static_cast(shape)); effect->lightColor = color; + Effects::adoptVolumetricMesh(world, e, *effect); ctx.isDirty = true; } + ImGui::TextDisabled("The volume is the mesh. Move, rotate and scale it."); const Effects::VolumetricShape volume = Effects::volumetricShapeOf(*effect); if (volume == Effects::VolumetricShape::Sphere) { - if (ImGui::DragFloat("Radius", &effect->radius, 0.05f, 0.1f, 40.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Radius", &effect->radius, 0.05f, 0.1f, 40.0f)) { + pushSize(); + ctx.isDirty = true; + } } else { - if (ImGui::DragFloat("Length", &effect->radius, 0.05f, 0.2f, 40.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Length", &effect->radius, 0.05f, 0.2f, 40.0f)) { + pushSize(); + ctx.isDirty = true; + } if (volume == Effects::VolumetricShape::Cone) { - if (ImGui::DragFloat("Near", &effect->startSize, 0.01f, 0.05f, 8.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Far", &effect->endSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; + f32 baseRadius = effect->endSize * 0.5f; + if (ImGui::DragFloat("Radius", &baseRadius, 0.01f, 0.05f, 12.0f)) { + effect->endSize = baseRadius * 2.0f; + pushSize(); + ctx.isDirty = true; + } } else if (volume == Effects::VolumetricShape::Cylinder) { if (ImGui::DragFloat("Diameter", &effect->startSize, 0.01f, 0.05f, 8.0f)) { effect->endSize = effect->startSize; + pushSize(); ctx.isDirty = true; } } else { - if (ImGui::DragFloat("Width", &effect->startSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Height", &effect->endSize, 0.01f, 0.05f, 12.0f)) ctx.isDirty = true; - } - if (volume == Effects::VolumetricShape::Window) { - u32 columns = 1; - u32 rows = 1; - Effects::volumetricGridOf(*effect, columns, rows); - int columnCount = static_cast(columns); - int rowCount = static_cast(rows); - if (ImGui::SliderInt("Columns", &columnCount, 1, 8)) { - Effects::setVolumetricGrid(*effect, static_cast(columnCount), rows); + if (ImGui::DragFloat("Width", &effect->startSize, 0.01f, 0.05f, 12.0f)) { + pushSize(); ctx.isDirty = true; } - if (ImGui::SliderInt("Rows", &rowCount, 1, 8)) { - Effects::setVolumetricGrid(*effect, static_cast(columnCount), static_cast(rowCount)); + if (ImGui::DragFloat("Height", &effect->endSize, 0.01f, 0.05f, 12.0f)) { + pushSize(); ctx.isDirty = true; } } @@ -1712,14 +1728,39 @@ void InspectorPanel::drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorCon ctx.isDirty = true; return; } - char path[260] = {}; - std::strncpy(path, pose->meshPath, sizeof(path) - 1); - if (ImGui::InputText("Mesh", path, sizeof(path))) { + std::string meshPath = pose->meshPath; + ImGui::PushID("skinned-mesh"); + if (Widgets::AssetField(ctx, "Mesh", meshPath, ".gltf;.glb;.fbx;.obj")) { std::memset(pose->meshPath, 0, sizeof(pose->meshPath)); - std::strncpy(pose->meshPath, path, sizeof(pose->meshPath) - 1); + std::strncpy(pose->meshPath, meshPath.c_str(), sizeof(pose->meshPath) - 1); + pose->meshPath[sizeof(pose->meshPath) - 1] = '\0'; pose->loaded = false; + pose->clipIndex = 0; + pose->time = 0.0f; + ECS::MeshFilterComponent* filter = world.get(e); + if (!filter) { + world.add(e); + filter = world.get(e); + } + if (filter) { + filter->primitive = ECS::MeshPrimitive::Custom; + filter->customMeshPath = pose->meshPath; + } + Assets::MeshCache::getInstance().getMesh(pose->meshPath, ctx.projectRootPath.string()); ctx.isDirty = true; } + ImGui::PopID(); + if (pose->meshPath[0] != '\0') { + ECS::MeshFilterComponent* filter = world.get(e); + if (!filter) { + world.add(e); + filter = world.get(e); + } + if (filter && filter->customMeshPath.empty()) { + filter->primitive = ECS::MeshPrimitive::Custom; + filter->customMeshPath = pose->meshPath; + } + } const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); if (!skin || skin->clipNames.empty()) { ImGui::TextDisabled("Sem clipes esqueleticos. Usa um glTF/GLB com pele."); diff --git a/src/editor/InspectorWidgets.hpp b/src/editor/InspectorWidgets.hpp index 64631c6a..57943fc9 100644 --- a/src/editor/InspectorWidgets.hpp +++ b/src/editor/InspectorWidgets.hpp @@ -149,6 +149,16 @@ inline void setWidthForLabel(const char* label) { inline bool AssetField(EditorContext& ctx, const char* label, std::string& path, const char* filter) { bool changed = false; + ImGui::PushID(label); + const u32 fieldId = static_cast(ImGui::GetID("##asset-browse")); + if (ctx.browse.kind == EditorContext::BrowseSession::Kind::None && + ctx.browse.fieldId == fieldId && fieldId != 0 && !ctx.browse.pickedText.empty()) { + path = ctx.browse.pickedText; + changed = true; + ctx.browse.clear(); + } + ImGui::PopID(); + const std::string display = path.empty() ? "(none)" : std::filesystem::path(path).filename().string(); char dispBuf[256]; strncpy(dispBuf, display.c_str(), sizeof(dispBuf)); @@ -177,7 +187,7 @@ inline bool AssetField(EditorContext& ctx, const char* label, std::string& path, } ImGui::SameLine(0.0f, spacing); if (ImGui::Button("Browse", ImVec2(browseW, 0.0f))) { - ctx.browse.requestProjectAsset(&path, filter, label); + ctx.browse.requestProjectAsset(nullptr, filter, label, fieldId); } if (!path.empty()) { ImGui::SameLine(0.0f, spacing); diff --git a/src/editor/MaterialEditorPanel.cpp b/src/editor/MaterialEditorPanel.cpp index 8e78fa74..c879d1a6 100644 --- a/src/editor/MaterialEditorPanel.cpp +++ b/src/editor/MaterialEditorPanel.cpp @@ -66,6 +66,7 @@ bool MaterialEditorPanel::saveToPath(const std::filesystem::path& path) { m_materialPath = target; } publishLive(); + m_dirty = false; m_status.clear(); m_refreshAssets = true; return true; @@ -73,26 +74,21 @@ bool MaterialEditorPanel::saveToPath(const std::filesystem::path& path) { bool MaterialEditorPanel::saveCurrent() { if (m_materialPath.empty()) { - m_pendingSaveAs = true; + m_pendingQuickSave = true; return false; } return saveToPath(resolvedPath(m_materialPath)); } void MaterialEditorPanel::handleSaveShortcut() { - if (m_materialPath.empty()) { - m_pendingSaveAs = true; - return; - } - saveCurrent(); + m_pendingQuickSave = true; } -bool MaterialEditorPanel::createInAssetBrowser(EditorContext& ctx) { - const std::filesystem::path root = !ctx.assetRootPath.empty() - ? ctx.assetRootPath - : (m_projectRoot.empty() ? std::filesystem::path("assets") - : std::filesystem::path(m_projectRoot) / "assets"); - const std::filesystem::path dir = root / "materials"; +std::filesystem::path MaterialEditorPanel::newMaterialPath(const EditorContext& ctx) const { + const std::filesystem::path dir = !ctx.assetRootPath.empty() + ? ctx.assetRootPath + : (m_projectRoot.empty() ? std::filesystem::path("assets") + : std::filesystem::path(m_projectRoot) / "assets" / "raw"); std::error_code ec; std::filesystem::create_directories(dir, ec); @@ -101,31 +97,91 @@ bool MaterialEditorPanel::createInAssetBrowser(EditorContext& ctx) { const unsigned char uc = static_cast(c); if (!std::isalnum(uc) && c != '_' && c != '-') c = '_'; } + if (stem.empty()) stem = "Material"; std::filesystem::path target = dir / (stem + ".mat"); int suffix = 1; while (std::filesystem::exists(target, ec)) { target = dir / (stem + "_" + std::to_string(suffix++) + ".mat"); } - if (!saveToPath(target)) return false; - ctx.assetBrowserNavigateTo = dir; - applyToSelection(ctx); - m_status = "Created " + target.filename().string(); + return target; +} + +bool MaterialEditorPanel::ensureFile(EditorContext& ctx) { + if (!m_materialPath.empty()) return true; + const std::string adopted = materialOnSelection(ctx); + if (!adopted.empty()) { + m_materialPath = adopted; + return true; + } + return saveToPath(newMaterialPath(ctx)); +} + +std::string MaterialEditorPanel::materialOnSelection(const EditorContext& ctx) const { + if (!ctx.activeWorld) return {}; + ECS::World& world = *ctx.activeWorld; + std::vector targets = ctx.selectedEntities; + if (targets.empty() && ctx.selectedEntity.isValid()) targets.push_back(ctx.selectedEntity); + std::string found; + for (ECS::Entity entity : targets) { + if (!entity.isValid() || !world.has(entity)) continue; + const ECS::MeshFilterComponent* filter = world.get(entity); + if (!filter || filter->customMaterialPath.empty()) continue; + if (found.empty()) found = filter->customMaterialPath; + else if (found != filter->customMaterialPath) return {}; + } + return found; +} + +void MaterialEditorPanel::assignToSelection(EditorContext& ctx, bool force) { + if (!ctx.activeWorld || m_materialPath.empty()) return; + ECS::World& world = *ctx.activeWorld; + const std::string path = m_materialPath.generic_string(); + std::vector targets = ctx.selectedEntities; + if (targets.empty() && ctx.selectedEntity.isValid()) targets.push_back(ctx.selectedEntity); + int applied = 0; + for (ECS::Entity entity : targets) { + if (!entity.isValid() || !world.has(entity)) continue; + ECS::MeshFilterComponent* filter = world.get(entity); + if (!filter) continue; + if (!force && !filter->customMaterialPath.empty() && filter->customMaterialPath != path) continue; + filter->customMaterialPath = path; + if (!world.has(entity)) world.add(entity); + if (ECS::MeshRendererComponent* renderer = world.get(entity)) { + renderer->materialPath = path; + } + ++applied; + } + if (applied > 0) ctx.isDirty = true; +} + +bool MaterialEditorPanel::createInAssetBrowser(EditorContext& ctx) { + m_materialPath.clear(); + if (!saveToPath(newMaterialPath(ctx))) return false; + assignToSelection(ctx, true); + ctx.assetBrowserNavigateTo = resolvedPath(m_materialPath).parent_path(); + m_status = "Created " + m_materialPath.filename().string(); return true; } void MaterialEditorPanel::applyToSelection(EditorContext& ctx) { - if (!ctx.activeWorld || !ctx.selectedEntity.isValid() || m_materialPath.empty()) return; - ECS::World& world = *ctx.activeWorld; - ECS::Entity entity = ctx.selectedEntity; - if (!world.has(entity)) return; - ECS::MeshFilterComponent* filter = world.get(entity); - if (!filter) return; - filter->customMaterialPath = m_materialPath.generic_string(); - if (!world.has(entity)) world.add(entity); - if (ECS::MeshRendererComponent* renderer = world.get(entity)) { - renderer->materialPath = filter->customMaterialPath; - } - ctx.isDirty = true; + if (!ensureFile(ctx)) { + m_status = "Could not save material."; + return; + } + if (!saveToPath(resolvedPath(m_materialPath))) { + m_status = "Could not save material."; + return; + } + assignToSelection(ctx, true); + publishLive(); + int meshes = 0; + if (ctx.activeWorld) { + for (ECS::Entity entity : ctx.selectedEntities) { + if (entity.isValid() && ctx.activeWorld->has(entity)) ++meshes; + } + } + if (meshes == 0) m_status = "Saved " + m_materialPath.filename().string() + ". Select a mesh to apply it."; + else m_status = "Applied " + m_materialPath.filename().string(); } bool MaterialEditorPanel::openFromPath(const std::filesystem::path& path) { @@ -138,6 +194,7 @@ bool MaterialEditorPanel::openFromPath(const std::filesystem::path& path) { m_surface = std::move(loaded); m_materialPath = resolved; m_status.clear(); + m_dirty = false; publishLive(); return true; } @@ -163,8 +220,28 @@ void MaterialEditorPanel::renderPresetPicker() { ImGui::EndCombo(); } +void MaterialEditorPanel::requestOpenMaterial(EditorContext& ctx) { + m_pickedMaterialPath.clear(); + m_awaitingMaterialPick = true; + ctx.browse.requestProjectAsset(&m_pickedMaterialPath, ".mat;.material", "Open Material"); +} + +void MaterialEditorPanel::pollOpenedMaterial(EditorContext& ctx) { + if (!m_awaitingMaterialPick) return; + if (ctx.browse.kind != EditorContext::BrowseSession::Kind::None) return; + m_awaitingMaterialPick = false; + if (m_pickedMaterialPath.empty()) return; + const std::string picked = std::move(m_pickedMaterialPath); + m_pickedMaterialPath.clear(); + if (!openFromPath(picked)) m_status = "Could not read material."; +} + void MaterialEditorPanel::renderProperties(EditorContext& ctx) { ImGui::PushID("MatProps"); + if (ImGui::Button("Browse Assets")) requestOpenMaterial(ctx); + ImGui::SameLine(); + if (m_materialPath.empty()) ImGui::TextDisabled("No material file"); + else ImGui::TextDisabled("%s", m_materialPath.generic_string().c_str()); bool changed = false; auto slider = [&](const char* label, float& value, float lo, float hi, const char* fmt = "%.2f") { Widgets::setWidthForLabel(label); @@ -294,6 +371,19 @@ void MaterialEditorPanel::renderProperties(EditorContext& ctx) { if (changed) { Assets::sanitizeMaterialSurface(m_surface); + m_dirty = true; + if (m_materialPath.empty()) { + const std::string adopted = materialOnSelection(ctx); + if (!adopted.empty()) { + m_materialPath = adopted; + m_status = "Editing " + std::filesystem::path(adopted).filename().string(); + } else if (saveToPath(newMaterialPath(ctx))) { + assignToSelection(ctx, true); + m_status = "Saved " + m_materialPath.generic_string(); + } else { + m_status = "Could not save material."; + } + } publishLive(); } @@ -321,7 +411,7 @@ void MaterialEditorPanel::renderPreview(const EditorContext& ctx, float width, f settings.yawDegrees = m_previewRotation; settings.pitchDegrees = m_previewPitch; settings.showFloor = m_previewFloor; - settings.environmentPath = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string(); + settings.environmentPath.clear(); if (ctx.activeWorld) { const Scene::ActiveSkybox sky = Scene::findActiveSkybox(*ctx.activeWorld); if (sky.component) { @@ -360,6 +450,7 @@ void MaterialEditorPanel::renderPreview(const EditorContext& ctx, float width, f void MaterialEditorPanel::onImGuiRender(EditorContext& ctx) { if (!m_open) return; + pollOpenedMaterial(ctx); ImGui::Begin("Material Editor", &m_open, ImGuiWindowFlags_MenuBar); if (ImGui::Shortcut(ImGuiMod_Ctrl | ImGuiKey_S, ImGuiInputFlags_RouteFocused)) { @@ -367,6 +458,9 @@ void MaterialEditorPanel::onImGuiRender(EditorContext& ctx) { } if (ImGui::BeginMenuBar()) { if (ImGui::BeginMenu("File##MaterialEditor")) { + if (ImGui::MenuItem("Open...", nullptr, false, !m_awaitingMaterialPick)) { + requestOpenMaterial(ctx); + } if (ImGui::MenuItem("New")) { m_surface = Assets::MaterialSurface{}; m_surface.valid = true; @@ -419,9 +513,24 @@ void MaterialEditorPanel::onImGuiRender(EditorContext& ctx) { } } + if (m_pendingQuickSave) { + m_pendingQuickSave = false; + if (!ensureFile(ctx) || !saveToPath(resolvedPath(m_materialPath))) { + m_status = "Save failed."; + } else { + assignToSelection(ctx, true); + publishLive(); + m_status = "Saved " + m_materialPath.generic_string(); + ctx.assetBrowserNavigateTo = resolvedPath(m_materialPath).parent_path(); + } + } + + if (m_dirty && !m_materialPath.empty() && !ImGui::IsMouseDown(ImGuiMouseButton_Left)) { + saveToPath(resolvedPath(m_materialPath)); + } + if (m_refreshAssets) { ctx.assetBrowserDirty = true; - applyToSelection(ctx); m_refreshAssets = false; } diff --git a/src/editor/MaterialEditorPanel.hpp b/src/editor/MaterialEditorPanel.hpp index 6f6fabfe..f828407b 100644 --- a/src/editor/MaterialEditorPanel.hpp +++ b/src/editor/MaterialEditorPanel.hpp @@ -21,6 +21,7 @@ class MaterialEditorPanel { bool openFromPath(const std::filesystem::path& path); bool wasFocusedLastFrame() const { return m_wasFocusedLastFrame; } void handleSaveShortcut(); + bool isDirty() const { return m_dirty || m_pendingQuickSave; } void setProjectRoot(const std::string& projectRoot) { m_projectRoot = projectRoot; } void open() { m_open = true; } @@ -39,15 +40,25 @@ class MaterialEditorPanel { void renderPreview(const EditorContext& ctx, float width, float height); bool saveCurrent(); bool saveToPath(const std::filesystem::path& path); + bool ensureFile(EditorContext& ctx); + std::filesystem::path newMaterialPath(const EditorContext& ctx) const; + std::string materialOnSelection(const EditorContext& ctx) const; + void assignToSelection(EditorContext& ctx, bool force); bool createInAssetBrowser(EditorContext& ctx); void applyToSelection(EditorContext& ctx); + void requestOpenMaterial(EditorContext& ctx); + void pollOpenedMaterial(EditorContext& ctx); void publishLive(); std::filesystem::path resolvedPath(const std::filesystem::path& path) const; bool m_open = true; bool m_wasFocusedLastFrame = false; bool m_pendingSaveAs = false; + bool m_pendingQuickSave = false; bool m_refreshAssets = false; + bool m_dirty = false; + bool m_awaitingMaterialPick = false; + std::string m_pickedMaterialPath; float m_previewRotation = 0.0f; float m_previewPitch = 12.0f; bool m_previewFloor = true; diff --git a/src/editor/ProjectManager.cpp b/src/editor/ProjectManager.cpp index 12d1a1e9..7c3bffd2 100644 --- a/src/editor/ProjectManager.cpp +++ b/src/editor/ProjectManager.cpp @@ -1,4 +1,5 @@ #include "editor/ProjectManager.hpp" +#include "scene/EnvironmentSystem.hpp" #include #include @@ -169,6 +170,8 @@ static bool loadProjectConfigFromFile(const std::filesystem::path& path, Project cfg.ScriptsPath = val; if (readJsonString(json, "last_scene", val)) cfg.LastScene = val; + if (readJsonString(json, "template_type", val)) + cfg.TemplateType = val; out = cfg; return true; @@ -185,6 +188,7 @@ static std::string serializeConfig(const ProjectConfig& cfg) { json << " \"assets_processed\": \"" << cfg.AssetProcessedPath.generic_string() << "\",\n"; json << " \"scripts\": \"" << cfg.ScriptsPath.generic_string() << "\"\n"; json << " },\n"; + json << " \"template_type\": \"" << cfg.TemplateType << "\",\n"; json << " \"last_scene\": \"" << cfg.LastScene << "\"\n"; json << "}\n"; return json.str(); @@ -323,6 +327,7 @@ bool ProjectManager::CreateNewProject(const ProjectConfig& config) { std::filesystem::create_directories(config.RootPath / "build", ec); if (ec) return false; if (!SaveProjectFile(config)) return false; + Scene::importDefaultSkyboxes(config.RootPath); m_CurrentConfig = config; UpdateRecentProjects(config.RootPath / "project.caffeine"); @@ -339,6 +344,7 @@ bool ProjectManager::OpenProject(const std::filesystem::path& projectFilePath) { if (IsPackagedBuildRoot(cfg.RootPath, cfg)) return false; m_CurrentConfig = cfg; + Scene::importDefaultSkyboxes(cfg.RootPath); UpdateRecentProjects(resolved); std::filesystem::path capPath = cfg.RootPath / "game.cap"; diff --git a/src/editor/SceneEditor.cpp b/src/editor/SceneEditor.cpp index 6dfeb45d..1c4a24a7 100644 --- a/src/editor/SceneEditor.cpp +++ b/src/editor/SceneEditor.cpp @@ -169,9 +169,15 @@ bool SceneEditor::init(RHI::RenderDevice* device, Assets::AssetManager* assetMan m_settingsPanel.setEditorContext(&m_ctx); m_settingsPanel.applyPreferencesToContext(m_ctx); - // Auto-load last scene if project config has one - if (m_settingsPanel.preferences().reopenLastSceneOnStartup && !projectConfig.LastScene.empty()) { - std::string lastScene = projectConfig.LastScene; + // Always open the project's scene in the viewport, in that project's 2D or 3D mode. + if (projectConfig.TemplateType == "2D") { + m_ctx.viewMode = EditorContext::ViewMode::Mode2D; + } else if (projectConfig.TemplateType == "3D") { + m_ctx.viewMode = EditorContext::ViewMode::Mode3D; + } + { + std::string lastScene = projectConfig.LastScene.empty() ? std::string("scenes/main.caf") + : projectConfig.LastScene; if (lastScene.find("/build/") != std::string::npos || lastScene.find("\\build\\") != std::string::npos || lastScene.rfind("build/", 0) == 0) { @@ -439,7 +445,11 @@ void SceneEditor::exitPlayMode(ECS::World& world) { } void SceneEditor::tickSystems(ECS::World& world, f32 dt) { - if (!m_isPlaying || m_isPaused) return; + Animation::setSkinProjectRoot(m_ctx.projectRootPath.string()); + if (!m_isPlaying || m_isPaused) { + Animation::tickSkinnedPoses(world, m_isPlaying ? 0.0f : dt); + return; + } { auto& io = ImGui::GetIO(); @@ -621,6 +631,126 @@ void SceneEditor::renderPlaybar(ECS::World& world) { } ImGui::End(); } + +namespace { + +ImGuiID g_windowChromeArmed = 0; + +void drawWindowChromeGlyph(ImDrawList* drawList, const ImRect& hit, bool dockBack) { + const ImU32 col = IM_COL32(230, 230, 230, 235); + const float inset = ImMax(2.0f, hit.GetWidth() * 0.22f); + const ImVec2 a = hit.Min + ImVec2(inset, inset + 1.0f); + const ImVec2 b = hit.Max - ImVec2(inset + 1.0f, inset); + drawList->AddRect(a, b, col, 1.0f, 0, 1.0f); + const ImVec2 tip = dockBack + ? ImVec2(a.x + 1.0f, b.y - 1.0f) + : ImVec2(hit.Max.x - inset, hit.Min.y + inset); + const ImVec2 tail = dockBack + ? tip + ImVec2(4.0f, -4.0f) + : tip + ImVec2(-4.0f, 4.0f); + drawList->AddLine(tail, tip, col, 1.0f); + if (dockBack) { + drawList->AddLine(tip, tip + ImVec2(3.0f, 0.0f), col, 1.0f); + drawList->AddLine(tip, tip + ImVec2(0.0f, -3.0f), col, 1.0f); + } else { + drawList->AddLine(tip, tip + ImVec2(-3.0f, 0.0f), col, 1.0f); + drawList->AddLine(tip, tip + ImVec2(0.0f, 3.0f), col, 1.0f); + } +} + +bool windowChromeButton(ImGuiID id, const ImRect& hit, bool dockBack, const char* tip, + ImGuiViewport* viewport) { + ImGuiContext& g = *GImGui; + ImDrawList* drawList = ImGui::GetForegroundDrawList(viewport); + const bool hovered = hit.Contains(g.IO.MousePos); + if (hovered) + drawList->AddRectFilled(hit.Min, hit.Max, IM_COL32(255, 255, 255, 36), 2.0f); + drawWindowChromeGlyph(drawList, hit, dockBack); + if (hovered) + ImGui::SetTooltip("%s", tip); + + if (hovered && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) + g_windowChromeArmed = id; + if (!ImGui::IsMouseReleased(ImGuiMouseButton_Left) || g_windowChromeArmed != id) + return false; + g_windowChromeArmed = 0; + const ImVec2 drag = ImGui::GetMouseDragDelta(ImGuiMouseButton_Left); + return hovered && std::fabs(drag.x) < 4.0f && std::fabs(drag.y) < 4.0f; +} + +bool windowIsOwnOsWindow(const ImGuiWindow* window) { + if (!window || !window->Viewport || window->DockIsActive) return false; + return window->ViewportOwned && window->Viewport->ID != ImGui::GetMainViewport()->ID; +} + +void popWindowToMonitor(ImGuiWindow* window) { + if (!window) return; + window->WindowClass.ViewportFlagsOverrideSet |= ImGuiViewportFlags_NoAutoMerge; + if (window->DockIsActive) + ImGui::DockContextQueueUndockWindow(ImGui::GetCurrentContext(), window); +} + +void dockWindowBack(ImGuiWindow* window, ImGuiID dockspaceId) { + if (!window || dockspaceId == 0) return; + window->WindowClass.ViewportFlagsOverrideSet &= ~ImGuiViewportFlags_NoAutoMerge; + ImGui::SetWindowDock(window, dockspaceId, ImGuiCond_Always); +} + +void renderIndependentWindowButtons(ImGuiID dockspaceId) { + ImGuiContext& g = *GImGui; + const float buttonSz = g.FontSize; + const ImVec2 framePad = g.Style.FramePadding; + + for (int n = 0; n < g.DockContext.Nodes.Data.Size; ++n) { + ImGuiDockNode* node = static_cast(g.DockContext.Nodes.Data[n].val_p); + if (!node || !node->IsVisible || !node->IsLeafNode() || node->LastFrameActive < g.FrameCount) + continue; + ImGuiWindow* window = node->VisibleWindow; + if (!window || window->Flags & ImGuiWindowFlags_NoDocking) + continue; + + ImRect hit; + if (node->TabBar && !node->IsHiddenTabBar()) { + const ImRect tab = window->DC.DockTabItemRect; + if (tab.GetWidth() < buttonSz || tab.GetHeight() < 4.0f) + continue; + const float closeX = ImMax(tab.Min.x, tab.Max.x - framePad.x - buttonSz); + hit = ImRect(ImVec2(closeX - buttonSz - 1.0f, tab.Min.y + framePad.y), + ImVec2(closeX - 1.0f, tab.Min.y + framePad.y + buttonSz)); + if (!node->TabBar->BarRect.Contains(hit.GetCenter())) + continue; + } else { + hit = ImRect(ImVec2(node->Pos.x + node->Size.x - buttonSz - 8.0f, node->Pos.y + 4.0f), + ImVec2(node->Pos.x + node->Size.x - 8.0f, node->Pos.y + 4.0f + buttonSz)); + } + + ImGuiViewport* viewport = node->HostWindow ? node->HostWindow->Viewport + : ImGui::GetMainViewport(); + if (windowChromeButton(window->ID ^ 0x510u, hit, false, + "Abre esta janela noutro monitor. Continua ligada a mesma cena.", viewport)) + popWindowToMonitor(window); + } + + for (ImGuiWindow* window : g.Windows) { + if (!window->WasActive || window->Hidden || !windowIsOwnOsWindow(window)) + continue; + if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip | + ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoDocking)) + continue; + const ImRect title = window->TitleBarRect(); + if (title.GetHeight() < 4.0f) + continue; + const float closeX = title.Max.x - framePad.x - buttonSz; + const ImRect hit(ImVec2(closeX - g.Style.ItemInnerSpacing.x - buttonSz, title.Min.y + framePad.y), + ImVec2(closeX - g.Style.ItemInnerSpacing.x, title.Min.y + framePad.y + buttonSz)); + if (windowChromeButton(window->ID ^ 0xA11u, hit, true, + "Encaixa outra vez na janela principal.", window->Viewport)) + dockWindowBack(window, dockspaceId); + } +} + +} // namespace + #endif // ── Main render ───────────────────────────────────────────────── @@ -645,6 +775,29 @@ void SceneEditor::render(f32 deltaTime) { m_tabManager.activeTab().name = std::filesystem::path(scenePath).stem().string(); m_tabManager.activeTab().path = scenePath; } + if (m_currentProjectConfig.TemplateType != "2D" && + m_currentProjectConfig.TemplateType != "3D") { + bool has3D = false; + bool has2D = false; + ECS::ComponentQuery cameras3D; + cameras3D.with(); + activeWorld->forEach( + cameras3D, [&](ECS::Entity, ECS::Camera3DComponent&) { has3D = true; }); + ECS::ComponentQuery meshes; + meshes.with(); + activeWorld->forEach( + meshes, [&](ECS::Entity, ECS::MeshFilterComponent&) { has3D = true; }); + ECS::ComponentQuery cameras2D; + cameras2D.with(); + activeWorld->forEach( + cameras2D, [&](ECS::Entity, ECS::Camera2DComponent&) { has2D = true; }); + ECS::ComponentQuery sprites; + sprites.with(); + activeWorld->forEach(sprites, [&](ECS::Entity, ECS::Sprite&) { has2D = true; }); + m_ctx.viewMode = (has2D && !has3D) ? EditorContext::ViewMode::Mode2D + : EditorContext::ViewMode::Mode3D; + } + ImGui::SetWindowFocus("Scene Viewport"); } if (m_tabManager.activeTabIndex() >= 0) { @@ -758,6 +911,14 @@ void SceneEditor::render(f32 deltaTime) { CF_PROFILE_SCOPE("SceneEditor::hierarchy"); m_hierarchy.render(*activeWorld, m_ctx); } + { + CF_PROFILE_SCOPE("SceneEditor::toolbox"); + if (ImGuiWindow* hierarchy = ImGui::FindWindowByName("Hierarchy")) { + if (hierarchy->DockId != 0) + ImGui::SetNextWindowDockID(hierarchy->DockId, ImGuiCond_FirstUseEver); + } + m_toolbox.render(*activeWorld, m_ctx, m_viewport); + } { CF_PROFILE_SCOPE("SceneEditor::inspector"); m_inspector.render(*activeWorld, m_ctx); @@ -852,6 +1013,7 @@ void SceneEditor::render(f32 deltaTime) { #endif m_animationTimeline.setScene(activeWorld, m_ctx.selectedEntity.id()); m_animationTimeline.render(deltaTime); + m_animatorController.bindSelection(activeWorld, m_ctx.selectedEntity); m_animatorController.render(); m_tilemapEditor.render(); m_commandPalette.render(); @@ -864,6 +1026,8 @@ void SceneEditor::render(f32 deltaTime) { serviceBrowseSession(m_ctx, m_assetBrowser); + renderIndependentWindowButtons(m_dockspaceId); + ImGui::End(); // DockSpace renderUnsavedChangesPopup(activeWorld); @@ -884,6 +1048,7 @@ void SceneEditor::setupDockspace(ImGuiID dockspaceId) { ImGui::DockBuilderSplitNode(dockCenter, ImGuiDir_Down, 0.25f, &dockBottom, &dockCenter); ImGui::DockBuilderDockWindow("Hierarchy", dockLeft); + ImGui::DockBuilderDockWindow("Toolbox", dockLeft); ImGui::DockBuilderDockWindow("Inspector", dockRight); ImGui::DockBuilderDockWindow("Scene Viewport", dockCenter); ImGui::DockBuilderDockWindow("Camera Preview", dockCenter); @@ -951,9 +1116,11 @@ void SceneEditor::renderMainMenuBar(ECS::World& world) { if (ImGui::BeginMenu("Edit")) { if (EditorIcons::menuItem(EditorIcon::Undo, "Undo", "Ctrl+Z", false, m_ctx.undoStack.canUndo())) { m_ctx.undoStack.undo(world); + if (!world.isEntityAlive(m_ctx.selectedEntity)) m_ctx.selectedEntity = ECS::Entity::INVALID; } if (EditorIcons::menuItem(EditorIcon::Redo, "Redo", "Ctrl+Y", false, m_ctx.undoStack.canRedo())) { m_ctx.undoStack.redo(world); + if (!world.isEntityAlive(m_ctx.selectedEntity)) m_ctx.selectedEntity = ECS::Entity::INVALID; } ImGui::Separator(); if (EditorIcons::menuItem(EditorIcon::Copy, "Copy", "Ctrl+C", false, m_ctx.selectedEntity.isValid())) { @@ -991,6 +1158,10 @@ void SceneEditor::renderMainMenuBar(ECS::World& world) { if (EditorIcons::menuItem(EditorIcon::Hierarchy, "Hierarchy", nullptr, &hierarchyOpen)) { hierarchyOpen ? m_hierarchy.open() : m_hierarchy.close(); } + bool toolboxOpen = m_toolbox.isOpen(); + if (ImGui::MenuItem("Toolbox", nullptr, &toolboxOpen)) { + toolboxOpen ? m_toolbox.open() : m_toolbox.close(); + } bool inspectorOpen = m_inspector.isOpen(); if (EditorIcons::menuItem(EditorIcon::Inspector, "Inspector", nullptr, &inspectorOpen)) { inspectorOpen ? m_inspector.open() : m_inspector.close(); @@ -1192,12 +1363,15 @@ void SceneEditor::handleShortcuts(ECS::World& world) { } if (ctrl && ImGui::IsKeyPressed(ImGuiKey_S)) { - if (m_materialEditor.isOpen() && m_materialEditor.wasFocusedLastFrame()) { - m_materialEditor.handleSaveShortcut(); - } else if (m_ctx.currentScenePath.empty()) { - saveSceneAs(world); - } else { - saveScene(m_ctx.currentScenePath.c_str(), world); + const bool saveMaterial = m_materialEditor.isOpen() && + (m_materialEditor.wasFocusedLastFrame() || m_materialEditor.isDirty()); + if (saveMaterial) m_materialEditor.handleSaveShortcut(); + if (!m_materialEditor.wasFocusedLastFrame()) { + if (m_ctx.currentScenePath.empty()) { + saveSceneAs(world); + } else { + saveScene(m_ctx.currentScenePath.c_str(), world); + } } } if (ctrl && ImGui::IsKeyPressed(ImGuiKey_N)) { @@ -1214,9 +1388,11 @@ void SceneEditor::handleShortcuts(ECS::World& world) { } else { if (m_ctx.undoStack.canUndo()) m_ctx.undoStack.undo(world); } + if (!world.isEntityAlive(m_ctx.selectedEntity)) m_ctx.selectedEntity = ECS::Entity::INVALID; } if (ctrl && ImGui::IsKeyPressed(ImGuiKey_Y)) { if (m_ctx.undoStack.canRedo()) m_ctx.undoStack.redo(world); + if (!world.isEntityAlive(m_ctx.selectedEntity)) m_ctx.selectedEntity = ECS::Entity::INVALID; } if (ctrl && ImGui::IsKeyPressed(ImGuiKey_C)) { @@ -1529,6 +1705,7 @@ void SceneEditor::applyLayoutProfile(ImGuiID dockspaceId, const LayoutProfile& p if (profile.hierarchyOpen) { ImGui::DockBuilderSplitNode(dockspaceId, ImGuiDir_Left, profile.hierarchyWidth, &dockLeft, &dockCenter); ImGui::DockBuilderDockWindow("Hierarchy", dockLeft); + ImGui::DockBuilderDockWindow("Toolbox", dockLeft); } // Right panel (Inspector) - if enabled diff --git a/src/editor/SceneEditor.hpp b/src/editor/SceneEditor.hpp index 64f2477b..2c8d60b6 100644 --- a/src/editor/SceneEditor.hpp +++ b/src/editor/SceneEditor.hpp @@ -26,6 +26,7 @@ #include "editor/GameplayPreviewPanel.hpp" #include "editor/TerrainEditorPanel.hpp" #include "editor/EntityPresetsPanel.hpp" +#include "editor/ToolboxPanel.hpp" #endif #include "editor/AnimationTimeline.hpp" @@ -167,6 +168,7 @@ class SceneEditor { GameplayPreviewPanel m_gameplayPreview; TerrainEditorPanel m_terrainEditor; EntityPresetsPanel m_entityPresets; + ToolboxPanel m_toolbox; #endif AnimationTimelinePanel m_animationTimeline; diff --git a/src/editor/SceneSerializer.cpp b/src/editor/SceneSerializer.cpp index 1c85e6ce..4144c7e1 100644 --- a/src/editor/SceneSerializer.cpp +++ b/src/editor/SceneSerializer.cpp @@ -4,6 +4,7 @@ #include "ecs/CameraComponents.hpp" #include "ecs/ForwardRenderComponents.hpp" #include "ecs/MeshComponents.hpp" +#include "ecs/MeshGeometry.hpp" #include "ecs/PrefabComponents.hpp" #include "ecs/TerrainComponents.hpp" #include "audio/AudioComponents.hpp" @@ -147,6 +148,30 @@ void SceneSerializer::collectSpriteComponents( }); } +void SceneSerializer::collectMeshGeometryComponents( + std::vector>>& entries) +{ + ECS::ComponentQuery q; + q.with(); + m_world.forEach(q, [&](ECS::Entity e, ECS::MeshGeometryComponent& geometry) { + const u32 positionCount = static_cast(geometry.positions.size()); + const u32 indexCount = static_cast(geometry.indices.size()); + std::vector data(12 + positionCount * sizeof(Vec3) + indexCount * sizeof(u32)); + u32 offset = 0; + memcpy(data.data() + offset, &positionCount, 4); offset += 4; + memcpy(data.data() + offset, &indexCount, 4); offset += 4; + memcpy(data.data() + offset, &geometry.revision, 4); offset += 4; + if (positionCount > 0) { + memcpy(data.data() + offset, geometry.positions.data(), positionCount * sizeof(Vec3)); + offset += positionCount * sizeof(Vec3); + } + if (indexCount > 0) { + memcpy(data.data() + offset, geometry.indices.data(), indexCount * sizeof(u32)); + } + entries.push_back({e.id(), std::move(data)}); + }); +} + void SceneSerializer::collectMeshFilterComponents( std::vector>>& entries) { @@ -750,7 +775,7 @@ bool SceneSerializer::deserializeTerrainComponent(const u8* data, u32 size, // ── Serialize ──────────────────────────────────────────────────── -bool SceneSerializer::serialize(const std::string& filepath) { +bool SceneSerializer::serializeToMemory(std::vector& out, const std::string& filepath) { // Collect all components grouped by entity std::unordered_map>>> entityMap; @@ -888,6 +913,14 @@ bool SceneSerializer::serialize(const std::string& filepath) { } } + { + std::vector>> entries; + collectMeshGeometryComponents(entries); + for (auto& [eid, data] : entries) { + entityMap[eid].emplace_back(kTypeMeshGeometry, std::move(data)); + } + } + { std::vector>> entries; collectMeshRendererComponents(entries); @@ -1096,56 +1129,57 @@ bool SceneSerializer::serialize(const std::string& filepath) { } } - // Write binary file - std::ofstream fout(filepath, std::ios::binary); - if (!fout.is_open()) return false; - - // Header + auto push = [&](const void* d, u32 n) { + const u8* p = static_cast(d); + out.insert(out.end(), p, p + n); + }; + out.clear(); u32 signature = kSignature; u32 version = kFormatVersion; u32 count = static_cast(entityMap.size()); - fout.write(reinterpret_cast(&signature), 4); - fout.write(reinterpret_cast(&version), 4); - fout.write(reinterpret_cast(&count), 4); - - // Entity data + push(&signature, 4); + push(&version, 4); + push(&count, 4); for (auto& [eid, components] : entityMap) { u32 compCount = static_cast(components.size()); - fout.write(reinterpret_cast(&eid), 4); - fout.write(reinterpret_cast(&compCount), 4); - + push(&eid, 4); + push(&compCount, 4); for (auto& [typeId, data] : components) { u32 dataSize = static_cast(data.size()); - fout.write(reinterpret_cast(&typeId), 4); - fout.write(reinterpret_cast(&dataSize), 4); - if (dataSize > 0) { - fout.write(reinterpret_cast(data.data()), dataSize); - } + push(&typeId, 4); + push(&dataSize, 4); + if (dataSize > 0) push(data.data(), dataSize); } } - - fout.close(); return true; } +bool SceneSerializer::serialize(const std::string& filepath) { + std::vector buffer; + if (!serializeToMemory(buffer, filepath)) return false; + std::ofstream fout(filepath, std::ios::binary); + if (!fout.is_open()) return false; + fout.write(reinterpret_cast(buffer.data()), static_cast(buffer.size())); + return fout.good(); +} + // ── Deserialize ────────────────────────────────────────────────── bool SceneSerializer::deserialize(const std::string& filepath) { std::ifstream fin(filepath, std::ios::binary | std::ios::ate); if (!fin.is_open()) return false; - - // Read entire file into memory std::streampos fileSize = fin.tellg(); fin.seekg(0, std::ios::beg); - std::vector buffer(static_cast(fileSize)); if (!fin.read(reinterpret_cast(buffer.data()), fileSize)) { fin.close(); return false; } fin.close(); + return deserializeFromMemory(buffer, filepath); +} - // Parse header +bool SceneSerializer::deserializeFromMemory(const std::vector& buffer, const std::string& filepath) { if (buffer.size() < 12) return false; u32 signature, version, entityCount; memcpy(&signature, buffer.data(), 4); @@ -1258,6 +1292,9 @@ bool SceneSerializer::deserialize(const std::string& filepath) { case kTypeMeshFilter: applyMeshFilterComponent(e, entry.data.data(), static_cast(entry.data.size())); break; + case kTypeMeshGeometry: + applyMeshGeometryComponent(e, entry.data.data(), static_cast(entry.data.size())); + break; case kTypeMeshRenderer: applyMeshRendererComponent(e, entry.data.data(), static_cast(entry.data.size())); break; @@ -1482,6 +1519,31 @@ bool SceneSerializer::applySpriteComponent(ECS::Entity e, const u8* data, u32 si return true; } +bool SceneSerializer::applyMeshGeometryComponent(ECS::Entity e, const u8* data, u32 size) { + if (size < 12) return false; + u32 positionCount = 0; + u32 indexCount = 0; + u32 revision = 1; + memcpy(&positionCount, data, 4); + memcpy(&indexCount, data + 4, 4); + memcpy(&revision, data + 8, 4); + const size_t bytes = 12ull + static_cast(positionCount) * sizeof(Vec3) + + static_cast(indexCount) * sizeof(u32); + if (bytes != size || positionCount > 200000u || indexCount > 600000u) return false; + ECS::MeshGeometryComponent geometry; + geometry.revision = revision == 0 ? 1 : revision; + geometry.positions.resize(positionCount); + geometry.indices.resize(indexCount); + if (positionCount > 0) { + memcpy(geometry.positions.data(), data + 12, positionCount * sizeof(Vec3)); + } + if (indexCount > 0) { + memcpy(geometry.indices.data(), data + 12 + positionCount * sizeof(Vec3), indexCount * sizeof(u32)); + } + m_world.add(e, std::move(geometry)); + return true; +} + bool SceneSerializer::applyMeshFilterComponent(ECS::Entity e, const u8* data, u32 size) { if (size < 5) return false; u8 prim; diff --git a/src/editor/SceneSerializer.hpp b/src/editor/SceneSerializer.hpp index 344d85aa..28276fa9 100644 --- a/src/editor/SceneSerializer.hpp +++ b/src/editor/SceneSerializer.hpp @@ -18,6 +18,8 @@ class SceneSerializer { bool serialize(const std::string& filepath); bool deserialize(const std::string& filepath); + bool serializeToMemory(std::vector& out, const std::string& scenePath = {}); + bool deserializeFromMemory(const std::vector& data, const std::string& scenePath = {}); private: ECS::World& m_world; @@ -72,7 +74,8 @@ class SceneSerializer { static constexpr u32 kTypeSkinnedPose = 50; static constexpr u32 kTypeSpriteSheet = 51; static constexpr u32 kTypeEffect = 52; - static constexpr u32 kTypeCount = 53; + static constexpr u32 kTypeMeshGeometry = 53; + static constexpr u32 kTypeCount = 54; static constexpr u32 kFormatVersion = 7; static constexpr u32 kSignature = 0x46464143; // "CAFF" little-endian @@ -99,6 +102,8 @@ class SceneSerializer { void collectMeshFilterComponents( std::vector>>& entries); + void collectMeshGeometryComponents( + std::vector>>& entries); void collectMeshRendererComponents( std::vector>>& entries); @@ -127,6 +132,7 @@ class SceneSerializer { bool applyNameComponent(ECS::Entity e, const u8* data, u32 size); bool applySpriteComponent(ECS::Entity e, const u8* data, u32 size); bool applyMeshFilterComponent(ECS::Entity e, const u8* data, u32 size); + bool applyMeshGeometryComponent(ECS::Entity e, const u8* data, u32 size); bool applyMeshRendererComponent(ECS::Entity e, const u8* data, u32 size); bool applyPrefabInstanceComponent(ECS::Entity e, const u8* data, u32 size); bool applyScriptComponent(ECS::Entity e, const u8* data, u32 size); diff --git a/src/editor/SceneTabManager.cpp b/src/editor/SceneTabManager.cpp index ba8d03ca..1fe81c75 100644 --- a/src/editor/SceneTabManager.cpp +++ b/src/editor/SceneTabManager.cpp @@ -1,4 +1,5 @@ #include "editor/SceneTabManager.hpp" +#include "editor/DefaultScene.hpp" namespace Caffeine::Editor { @@ -6,6 +7,7 @@ int SceneTabManager::newScene(const char* name) { auto tab = std::make_unique(); tab->name = name ? name : "Untitled"; tab->world = std::make_unique(); + populateDefaultScene(*tab->world); m_tabs.push_back(std::move(tab)); int idx = static_cast(m_tabs.size() - 1); if (m_activeTabIndex < 0) m_activeTabIndex = idx; diff --git a/src/editor/SceneViewport.cpp b/src/editor/SceneViewport.cpp index c48114ae..01d69ae7 100644 --- a/src/editor/SceneViewport.cpp +++ b/src/editor/SceneViewport.cpp @@ -19,6 +19,7 @@ #include "ecs/CameraComponents.hpp" #include "ecs/ComponentQuery.hpp" #include "ecs/MeshComponents.hpp" +#include "ecs/MeshGeometry.hpp" #include "math/Mat4.hpp" #include "math/Quat.hpp" #include "animation/AnimationComponents.hpp" @@ -71,6 +72,11 @@ std::string resolveProjectRootFromScenePath(const std::string& scenePath) { return root.empty() ? sceneDir.string() : root; } +std::string resolveEditorProjectRoot(const EditorContext& ctx) { + if (!ctx.projectRootPath.empty()) return ctx.projectRootPath.string(); + return resolveProjectRootFromScenePath(ctx.currentScenePath); +} + Mat4 buildLocalMatrix(const ECS::Transform& t) { return Mat4::translation(t.position) * Mat4::rotationZ(t.rotation.z * kDegToRad) @@ -334,6 +340,191 @@ ImVec2 projectVP(const Mat4& vp, ImVec2 origin, ImVec2 viewportSize, const Vec3& ); } +f32 edgeFunction(f32 ax, f32 ay, f32 bx, f32 by, f32 cx, f32 cy); + +f32 distanceToSegment(ImVec2 p, ImVec2 a, ImVec2 b) { + const f32 abx = b.x - a.x; + const f32 aby = b.y - a.y; + const f32 len2 = abx * abx + aby * aby; + f32 t = 0.0f; + if (len2 > 1.0e-6f) t = std::clamp(((p.x - a.x) * abx + (p.y - a.y) * aby) / len2, 0.0f, 1.0f); + const f32 dx = p.x - (a.x + abx * t); + const f32 dy = p.y - (a.y + aby * t); + return std::sqrt(dx * dx + dy * dy); +} + +bool pointInTriangle(ImVec2 p, ImVec2 a, ImVec2 b, ImVec2 c) { + const f32 c0 = edgeFunction(a.x, a.y, b.x, b.y, p.x, p.y); + const f32 c1 = edgeFunction(b.x, b.y, c.x, c.y, p.x, p.y); + const f32 c2 = edgeFunction(c.x, c.y, a.x, a.y, p.x, p.y); + return (c0 >= 0.0f && c1 >= 0.0f && c2 >= 0.0f) || (c0 <= 0.0f && c1 <= 0.0f && c2 <= 0.0f); +} + +void verticesForSelection(const ECS::MeshGeometryComponent& geometry, const EditorContext& ctx, + std::vector& out) { + out.clear(); + if (ctx.meshElementMode == EditorContext::MeshElementMode::Vertex) { + out = ctx.meshElementSelection; + return; + } + if (ctx.meshElementMode == EditorContext::MeshElementMode::Edge) { + for (u32 packed : ctx.meshElementSelection) { + out.push_back(packed & 0xFFFFu); + out.push_back(packed >> 16); + } + return; + } + for (u32 triangle : ctx.meshElementSelection) { + const std::vector face = ECS::faceVertexIndices(geometry, triangle); + out.insert(out.end(), face.begin(), face.end()); + } +} + +bool pickMeshElement(ECS::World& world, EditorContext& ctx, ImVec2 mouse, ImVec2 origin, + ImVec2 viewportSize, const Mat4& vp) { + if (ctx.meshElementMode == EditorContext::MeshElementMode::Object) return false; + if (!ctx.selectedEntity.isValid() || !world.has(ctx.selectedEntity)) return false; + const ECS::MeshGeometryComponent* geometry = world.get(ctx.selectedEntity); + if (!geometry || geometry->positions.empty()) return false; + const Mat4 worldMatrix = entityMatrix(world, ctx.selectedEntity); + std::vector screen(geometry->positions.size()); + for (size_t i = 0; i < geometry->positions.size(); ++i) { + screen[i] = projectVP(vp, origin, viewportSize, worldMatrix.transformPoint(geometry->positions[i])); + } + + auto toggle = [&](u32 id) { + const bool shift = ImGui::IsKeyDown(ImGuiKey_LeftShift) || ImGui::IsKeyDown(ImGuiKey_RightShift); + auto& selection = ctx.meshElementSelection; + if (!shift) { + selection.clear(); + selection.push_back(id); + return; + } + const auto found = std::find(selection.begin(), selection.end(), id); + if (found == selection.end()) selection.push_back(id); + else selection.erase(found); + }; + + if (ctx.meshElementMode == EditorContext::MeshElementMode::Vertex) { + f32 best = 12.0f; + u32 chosen = u32_max; + for (u32 i = 0; i < screen.size(); ++i) { + if (screen[i].x < -5000.0f) continue; + const f32 dx = screen[i].x - mouse.x; + const f32 dy = screen[i].y - mouse.y; + const f32 dist = std::sqrt(dx * dx + dy * dy); + if (dist < best) { + best = dist; + chosen = i; + } + } + if (chosen == u32_max) return false; + toggle(chosen); + return true; + } + + if (ctx.meshElementMode == EditorContext::MeshElementMode::Edge) { + f32 best = 10.0f; + u32 chosen = u32_max; + for (size_t i = 0; i + 2 < geometry->indices.size(); i += 3) { + const u32 corners[3] = {geometry->indices[i], geometry->indices[i + 1], geometry->indices[i + 2]}; + for (int e = 0; e < 3; ++e) { + u32 a = corners[e]; + u32 b = corners[(e + 1) % 3]; + if (a > b) std::swap(a, b); + if (a >= screen.size() || b >= screen.size()) continue; + const f32 dist = distanceToSegment(mouse, screen[a], screen[b]); + if (dist < best) { + best = dist; + chosen = a | (b << 16); + } + } + } + if (chosen == u32_max) return false; + toggle(chosen); + return true; + } + + f32 best = 1.0e9f; + u32 chosen = u32_max; + const u32 triangleCount = static_cast(geometry->indices.size() / 3); + for (u32 tri = 0; tri < triangleCount; ++tri) { + const u32 i0 = geometry->indices[tri * 3]; + const u32 i1 = geometry->indices[tri * 3 + 1]; + const u32 i2 = geometry->indices[tri * 3 + 2]; + if (i0 >= screen.size() || i1 >= screen.size() || i2 >= screen.size()) continue; + if (!pointInTriangle(mouse, screen[i0], screen[i1], screen[i2])) continue; + const ImVec2 center((screen[i0].x + screen[i1].x + screen[i2].x) / 3.0f, + (screen[i0].y + screen[i1].y + screen[i2].y) / 3.0f); + const f32 dx = center.x - mouse.x; + const f32 dy = center.y - mouse.y; + const f32 dist = dx * dx + dy * dy; + if (dist < best) { + best = dist; + chosen = tri; + } + } + if (chosen == u32_max) return false; + toggle(chosen); + return true; +} + +void drawMeshElements(ImDrawList* dl, ECS::World& world, const EditorContext& ctx, ImVec2 origin, + ImVec2 viewportSize, const Mat4& vp) { + if (ctx.meshElementMode == EditorContext::MeshElementMode::Object) return; + if (!ctx.selectedEntity.isValid()) return; + const ECS::MeshGeometryComponent* geometry = world.get(ctx.selectedEntity); + if (!geometry) return; + const Mat4 worldMatrix = entityMatrix(world, ctx.selectedEntity); + std::vector screen(geometry->positions.size()); + for (size_t i = 0; i < geometry->positions.size(); ++i) { + screen[i] = projectVP(vp, origin, viewportSize, worldMatrix.transformPoint(geometry->positions[i])); + } + std::vector selected; + verticesForSelection(*geometry, ctx, selected); + auto isSelected = [&](u32 index) { + return std::find(selected.begin(), selected.end(), index) != selected.end(); + }; + const ImU32 wire = IM_COL32(180, 220, 255, 160); + const ImU32 hot = IM_COL32(255, 180, 40, 255); + for (size_t i = 0; i + 2 < geometry->indices.size(); i += 3) { + const u32 corners[3] = {geometry->indices[i], geometry->indices[i + 1], geometry->indices[i + 2]}; + for (int e = 0; e < 3; ++e) { + const u32 a = corners[e]; + const u32 b = corners[(e + 1) % 3]; + if (a >= screen.size() || b >= screen.size()) continue; + if (screen[a].x < -5000.0f || screen[b].x < -5000.0f) continue; + const bool marked = isSelected(a) && isSelected(b); + dl->AddLine(screen[a], screen[b], marked ? hot : wire, marked ? 2.5f : 1.0f); + } + } + if (ctx.meshElementMode != EditorContext::MeshElementMode::Vertex && selected.empty()) return; + for (u32 i = 0; i < screen.size(); ++i) { + if (screen[i].x < -5000.0f) continue; + const bool marked = isSelected(i); + if (ctx.meshElementMode != EditorContext::MeshElementMode::Vertex && !marked) continue; + dl->AddCircleFilled(screen[i], marked ? 5.0f : 3.0f, marked ? hot : IM_COL32(230, 240, 255, 220)); + } +} + +bool moveMeshSelection(ECS::World& world, EditorContext& ctx, const Vec3& worldDelta) { + if (ctx.meshElementMode == EditorContext::MeshElementMode::Object || ctx.meshElementSelection.empty()) { + return false; + } + ECS::MeshGeometryComponent* geometry = world.get(ctx.selectedEntity); + if (!geometry) return false; + std::vector vertices; + verticesForSelection(*geometry, ctx, vertices); + if (vertices.empty()) return false; + const Mat4 inverse = entityMatrix(world, ctx.selectedEntity).inverted(); + const Vec3 localDelta = inverse.transformVector(worldDelta); + for (u32 index : vertices) { + if (index < geometry->positions.size()) geometry->positions[index] = geometry->positions[index] + localDelta; + } + geometry->revision++; + return true; +} + f32 edgeFunction(f32 ax, f32 ay, f32 bx, f32 by, f32 cx, f32 cy) { return (cx - ax) * (by - ay) - (cy - ay) * (bx - ax); } @@ -652,7 +843,7 @@ bool SceneViewport::renderCameraPreviewGpu(RHI::CommandBuffer* cmd, ECS::World& previewOpts.textureQuality.falloffDistance = ctx.textureQualityFalloff; previewOpts.textureQuality.minScale = ctx.textureQualityMinScale; previewOpts.textureQualityViewers.push_back(cameraPos); - previewOpts.environmentPath = Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string(); + previewOpts.environmentPath.clear(); previewOpts.renderScale = ctx.renderScale; previewOpts.deltaTime = ImGui::GetIO().DeltaTime; previewOpts.viewId = 2; @@ -748,7 +939,7 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { Scene::syncTerrainMeshes(world); } - const std::string projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); + const std::string projectRoot = resolveEditorProjectRoot(ctx); u32 gpuMeshDrawCount = 0; const bool wireframePreview = (m_meshPreviewMode == MeshPreviewMode::Wireframe); const bool gpuSceneActive = m_frameCmd && m_gpuSceneReady && m_useGpuScene && m_colorTarget && @@ -788,10 +979,14 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { gpuOpts.terrainLodDistanceScale = 2.0f; gpuOpts.textureQuality.enabled = false; gpuOpts.cameraSettled = m_editorCamMotion < 0.002f && m_hasValidGpuFrame; - gpuOpts.environmentPath = ctx.skyboxEnabled - ? Scene::resolveBuiltinSkyboxPath(ctx.skyboxIndex).string() - : std::string(); + gpuOpts.environmentPath.clear(); gpuOpts.renderScale = ctx.renderScale; + gpuOpts.overrideAntiAliasing = true; + gpuOpts.antiAliasingOverride.enabled = + ctx.viewportAntiAlias != EditorContext::ViewportAntiAlias::Off; + gpuOpts.antiAliasingOverride.mode = + ctx.viewportAntiAlias == EditorContext::ViewportAntiAlias::Fxaa ? 0u : 1u; + gpuOpts.antiAliasingOverride.sharpness = 0.5f; gpuOpts.deltaTime = ImGui::GetIO().DeltaTime; gpuOpts.viewId = 1; if (ctx.selectedEntity.isValid() && world.has(ctx.selectedEntity)) { @@ -968,16 +1163,27 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { const ImVec2 vpSize(vpMax.x - vpMin.x, vpMax.y - vpMin.y); if (vpSize.x >= 1.0f && vpSize.y >= 1.0f) { const ViewportRay ray = computeViewportRay(ctx, vpMin, vpSize, mousePos); - const std::string projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); + const std::string projectRoot = resolveEditorProjectRoot(ctx); + bool pickedElement = false; + if (ctx.meshElementMode != EditorContext::MeshElementMode::Object && + ctx.selectedEntity.isValid()) { + ECS::bakeMeshGeometry(world, ctx.selectedEntity, projectRoot); + const Mat4 elementVp = computeVP3D(vpSize, ctx); + pickedElement = pickMeshElement(world, ctx, mousePos, vpMin, vpSize, elementVp); + } + if (!pickedElement) { const ECS::Entity picked = raycastSelectEntity(ray.origin, ray.direction, world, projectRoot); const bool shiftPressed = ImGui::IsKeyDown(ImGuiKey_LeftShift) || ImGui::IsKeyDown(ImGuiKey_RightShift); if (picked.isValid()) { if (shiftPressed) ctx.toggleSelection(picked); else ctx.selectEntity(picked); + ctx.meshElementSelection.clear(); TestInstrumentation::onEntitiesSelected(ctx.selectedEntities); } else if (!shiftPressed) { ctx.clearSelection(); + ctx.meshElementSelection.clear(); + } } } } @@ -1155,245 +1361,22 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { #ifdef CF_HAS_SDL3 // GPU scene is rendered into an offscreen target with transparent clear. // Composite it after the skybox so terrain/meshes sit in front of the sky. - if (m_lastGpuSceneActive && m_colorTarget && m_colorTarget->handle) { + if (ctx.viewMode == EditorContext::ViewMode::Mode3D && + m_lastGpuSceneActive && m_colorTarget && m_colorTarget->handle) { CF_PROFILE_SCOPE("SceneViewport::composite"); drawList->AddImage(reinterpret_cast(m_colorTarget->handle), origin, viewportMax, ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), IM_COL32_WHITE); } -#endif - - if (m_config.grid) { - char modeStr[16]; - switch (ctx.gizmoMode) { - case EditorContext::GizmoMode::Translate: strcpy(modeStr, "Translate"); break; - case EditorContext::GizmoMode::Rotate: strcpy(modeStr, "Rotate"); break; - case EditorContext::GizmoMode::Scale: strcpy(modeStr, "Scale"); break; - default: strcpy(modeStr, "Select"); break; - } - char buf[80]; - snprintf(buf, sizeof(buf), "%sGizmo: %s [T/E/R] Grid: %s 1 u = 1 m", - ctx.isPlayMode ? "PLAY " : "", - modeStr, m_config.grid ? "ON" : "OFF"); - drawList->AddText(ImVec2(origin.x + 8, origin.y + 8), IM_COL32(200, 200, 200, 200), buf); - } - - { - ImVec2 btnPos(origin.x + 8, origin.y + 28); - ImGui::SetCursorScreenPos(btnPos); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4, 2)); - if (ctx.physicsDebugVisible) { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.2f, 0.7f, 0.3f, 0.85f)); - } else { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.35f, 0.35f, 0.35f, 0.75f)); - } - if (ImGui::Button("Physics")) { - ctx.physicsDebugVisible = !ctx.physicsDebugVisible; - } - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Toggle physics collider debug overlay"); - ImGui::PopStyleColor(); - - ImGui::SameLine(); - if (ctx.snapToGrid) { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.7f, 0.5f, 0.1f, 0.85f)); - } else { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.35f, 0.35f, 0.35f, 0.75f)); - } - if (ImGui::Button("Snap")) { - ctx.snapToGrid = !ctx.snapToGrid; - } - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Toggle snap to grid (%.1f units)", ctx.snapGridSize); - ImGui::PopStyleColor(); - - ImGui::SameLine(); - const bool texturedPreview = (m_meshPreviewMode == MeshPreviewMode::Textured); - if (texturedPreview) { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.75f, 0.75f, 0.78f, 0.92f)); - ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.05f, 0.05f, 0.05f, 1.0f)); - } else { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.35f, 0.35f, 0.35f, 0.75f)); - } - if (ImGui::Button(texturedPreview ? "Textured" : "Wireframe")) { - m_meshPreviewMode = texturedPreview ? MeshPreviewMode::Wireframe : MeshPreviewMode::Textured; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip(texturedPreview - ? "GPU-lit meshes (fast with many objects)" - : "GPU wireframe with depth (fast with many objects)"); - } - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Toggle 3D preview style (white/gray textured vs wireframe)"); - if (texturedPreview) { - ImGui::PopStyleColor(2); - } else { - ImGui::PopStyleColor(); - } - - ImGui::SameLine(); - const char* densityLabels[] = {"Low", "Medium", "High"}; - int wireDensity = static_cast(m_wireframeDensity); - ImGui::BeginDisabled(texturedPreview); - ImGui::SetNextItemWidth(88.0f); - if (ImGui::SliderInt("##wire_density", &wireDensity, 0, 2, densityLabels[wireDensity])) { - m_wireframeDensity = static_cast(wireDensity); - } - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Wireframe polygon density"); - ImGui::EndDisabled(); - - if (ctx.viewMode == EditorContext::ViewMode::Mode3D) { - ImGui::SameLine(); - if (ctx.skyboxEnabled) { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.25f, 0.45f, 0.75f, 0.85f)); - } else { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.35f, 0.35f, 0.35f, 0.75f)); - } - if (ImGui::Button("Sky")) { - ctx.skyboxEnabled = !ctx.skyboxEnabled; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Toggle 3D skybox background"); - } - ImGui::PopStyleColor(); - - if (!Scene::hasSceneSkybox(world)) { - ImGui::SameLine(); - ImGui::SetNextItemWidth(88.0f); - int skyIdx = std::clamp(ctx.skyboxIndex, 0, ECS::kSkyboxPresetCount - 1); - if (ImGui::Combo("##skybox", &skyIdx, ECS::kSkyboxPresetLabels, ECS::kSkyboxPresetCount)) { - ctx.skyboxIndex = skyIdx; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Fallback skybox preset (create a Skybox entity to save in scene)"); - } - } else { - ImGui::SameLine(); - ImGui::BeginDisabled(); - ImGui::Button("Scene Sky"); - ImGui::EndDisabled(); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip("Skybox is controlled by a Skybox entity in the scene"); - } - } - } - - ImGui::PopStyleVar(); + if (ctx.viewMode == EditorContext::ViewMode::Mode3D) { + const Mat4 elementVp = computeVP3D(viewportSize, ctx); + drawMeshElements(drawList, world, ctx, origin, viewportSize, elementVp); } +#endif - if (ctx.viewMode == EditorContext::ViewMode::Mode3D && - ctx.selectedEntity.isValid() && - world.has(ctx.selectedEntity)) { - ImGui::SetCursorScreenPos(ImVec2(origin.x + 8, origin.y + 52)); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(6, 2)); - - auto terrainToolButton = [&](const char* label, bool active) -> bool { - if (active) { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.2f, 0.65f, 0.35f, 0.9f)); - } else { - ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.35f, 0.35f, 0.35f, 0.75f)); - } - const bool pressed = ImGui::Button(label); - ImGui::PopStyleColor(); - return pressed; - }; - - if (terrainToolButton("Sculpt", - ctx.terrainEditMode == EditorContext::TerrainEditMode::Sculpt)) { - ctx.terrainEditMode = (ctx.terrainEditMode == EditorContext::TerrainEditMode::Sculpt) - ? EditorContext::TerrainEditMode::None - : EditorContext::TerrainEditMode::Sculpt; - if (ctx.terrainEditMode != EditorContext::TerrainEditMode::None) { - ctx.gizmoMode = EditorContext::GizmoMode::None; - } - } - ImGui::SameLine(); - if (terrainToolButton("Splat", - ctx.terrainEditMode == EditorContext::TerrainEditMode::Splat)) { - ctx.terrainEditMode = (ctx.terrainEditMode == EditorContext::TerrainEditMode::Splat) - ? EditorContext::TerrainEditMode::None - : EditorContext::TerrainEditMode::Splat; - if (ctx.terrainEditMode != EditorContext::TerrainEditMode::None) { - ctx.gizmoMode = EditorContext::GizmoMode::None; - } - } - ImGui::SameLine(); - - if (ctx.terrainEditMode == EditorContext::TerrainEditMode::Sculpt) { - if (terrainToolButton("Raise", - ctx.terrainBrushMode == EditorContext::TerrainBrushMode::Raise)) { - ctx.terrainBrushMode = EditorContext::TerrainBrushMode::Raise; - } - ImGui::SameLine(); - if (terrainToolButton("Lower", - ctx.terrainBrushMode == EditorContext::TerrainBrushMode::Lower)) { - ctx.terrainBrushMode = EditorContext::TerrainBrushMode::Lower; - } - ImGui::SameLine(); - if (terrainToolButton("Smooth", - ctx.terrainBrushMode == EditorContext::TerrainBrushMode::Smooth)) { - ctx.terrainBrushMode = EditorContext::TerrainBrushMode::Smooth; - } - ImGui::SameLine(); - } else if (ctx.terrainEditMode == EditorContext::TerrainEditMode::Splat) { - const char* layerNames[] = {"Grass", "Rock", "Sand", "Dirt"}; - for (u32 layer = 0; layer < ECS::kTerrainSplatLayerCount; ++layer) { - if (layer > 0) ImGui::SameLine(); - if (terrainToolButton(layerNames[layer], ctx.terrainSplatLayer == layer)) { - ctx.terrainSplatLayer = layer; - } - } - ImGui::SameLine(); - } - - if (ctx.terrainEditMode != EditorContext::TerrainEditMode::None) { - ImGui::SetNextItemWidth(72.0f); - ImGui::SliderFloat("##brush_radius", &ctx.terrainBrushRadius, 0.5f, 64.0f, "R %.0f"); - ImGui::SameLine(); - ImGui::SetNextItemWidth(72.0f); - ImGui::SliderFloat("##brush_strength", &ctx.terrainBrushStrength, 0.01f, 1.0f, "S %.2f"); - ImGui::SameLine(); - } - - if (ImGui::Button("Chunks")) { - ctx.terrainShowChunkDebug = !ctx.terrainShowChunkDebug; - } - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Toggle chunk bounds debug overlay"); - - ImGui::SameLine(); - if (ImGui::Button("Flatten")) { - if (auto* heightmap = Terrain::TerrainCache::instance().heightmapFor(ctx.selectedEntity)) { - if (auto* terrain = world.get(ctx.selectedEntity)) { - ctx.beginUndo(EditorCommand::SetField, ctx.selectedEntity.id(), world); - heightmap->fill(0.0f); - terrain->dataRevision++; - ctx.isDirty = true; - ctx.endUndo(world); - } - } - } - if (ImGui::IsItemHovered()) ImGui::SetTooltip("Reset terrain height to flat"); - - ImGui::PopStyleVar(); + if (ctx.isPlayMode) { + drawList->AddText(ImVec2(origin.x + 8, origin.y + 8), IM_COL32(220, 80, 80, 230), "PLAY"); } - { - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4, 2)); - f32 btnW = 32.0f; - f32 margin = 8.0f; - ImVec2 btnPos(origin.x + viewportSize.x - margin - btnW * 3.0f - 4.0f, origin.y + 8.0f); - - auto viewBtn = [&](const char* label, EditorContext::ViewMode mode) { - bool active = (ctx.viewMode == mode); - if (active) ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.2f, 0.5f, 0.9f, 0.9f)); - else ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.3f, 0.3f, 0.3f, 0.75f)); - ImGui::SetCursorScreenPos(btnPos); - if (ImGui::Button(label, ImVec2(btnW, 22.0f))) ctx.viewMode = mode; - ImGui::PopStyleColor(); - btnPos.x += btnW + 2.0f; - }; - - viewBtn("2D", EditorContext::ViewMode::Mode2D); - viewBtn("3D", EditorContext::ViewMode::Mode3D); - viewBtn("Iso", EditorContext::ViewMode::Isometric); - ImGui::PopStyleVar(); - } if (ctx.viewMode != EditorContext::ViewMode::Mode3D) { drawGrid(drawList, origin, viewportSize, ctx); @@ -1425,6 +1408,7 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { drawPhysicsDebug(world, ctx, origin, viewportSize); drawCameraFrustums(world, ctx, origin, viewportSize); drawLightGizmos(world, ctx, origin, viewportSize); + drawSkeletons(world, ctx, origin, viewportSize); if (ctx.selectedEntity.isValid() && !terrainEditActive && !ctx.isPlayMode) { drawGizmo(world, ctx, origin, viewportSize); @@ -1860,10 +1844,7 @@ void SceneViewport::drawEmptyEntities(ECS::World& world, EditorContext& ctx, ImV ImDrawList* dl = ImGui::GetWindowDrawList(); const float r = 7.0f; - std::string projectRoot; - if (!ctx.currentScenePath.empty()) { - projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); - } + const std::string projectRoot = resolveEditorProjectRoot(ctx); const bool wireMode = (m_meshPreviewMode == MeshPreviewMode::Wireframe); const bool gpuTextured3D = (ctx.viewMode == EditorContext::ViewMode::Mode3D && !wireMode && m_gpuSceneReady && m_useGpuScene && m_lastGpuSceneActive); @@ -2102,10 +2083,7 @@ void SceneViewport::drawEmptyEntities(ECS::World& world, EditorContext& ctx, ImV } case ECS::MeshPrimitive::Custom: { if (!mesh->customMeshPath.empty() || world.has(entity)) { - std::string projectRoot; - if (!ctx.currentScenePath.empty()) { - projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); - } + const std::string projectRoot = resolveEditorProjectRoot(ctx); auto& meshCache = Assets::MeshCache::getInstance(); Assets::Mesh3D* loadedMesh = Terrain::TerrainCache::instance().meshFor(entity); @@ -2114,6 +2092,34 @@ void SceneViewport::drawEmptyEntities(ECS::World& world, EditorContext& ctx, ImV } const std::string& loadError = meshCache.getLastError(); + if (loadedMesh && !loadedMesh->vertices.empty() && + ctx.viewMode != EditorContext::ViewMode::Mode3D) { + Vec3 bMin = loadedMesh->bounds.min; + Vec3 bMax = loadedMesh->bounds.max; + if (!(bMin.x <= bMax.x && bMin.y <= bMax.y && bMin.z <= bMax.z)) { + bMin = Vec3(-0.5f, -0.5f, -0.5f); + bMax = Vec3(0.5f, 0.5f, 0.5f); + } + const Vec3 bbCorners[8] = { + {bMin.x, bMin.y, bMin.z}, {bMax.x, bMin.y, bMin.z}, + {bMin.x, bMax.y, bMin.z}, {bMax.x, bMax.y, bMin.z}, + {bMin.x, bMin.y, bMax.z}, {bMax.x, bMin.y, bMax.z}, + {bMin.x, bMax.y, bMax.z}, {bMax.x, bMax.y, bMax.z} + }; + const int bbEdges[][2] = { + {0, 1}, {1, 3}, {3, 2}, {2, 0}, + {4, 5}, {5, 7}, {7, 6}, {6, 4}, + {0, 4}, {1, 5}, {3, 7}, {2, 6} + }; + const ImU32 boxCol = selected ? IM_COL32(110, 210, 255, 255) + : IM_COL32(170, 190, 230, 180); + for (const auto& edge : bbEdges) { + drawSegment(worldMatrix.transformPoint(bbCorners[edge[0]]), + worldMatrix.transformPoint(bbCorners[edge[1]]), boxCol, thickness); + } + break; + } + if (!loadedMesh || loadedMesh->vertices.empty() || loadedMesh->indices.empty()) { const std::array corners = {{ {-0.5f, -0.5f, -0.5f}, { 0.5f, -0.5f, -0.5f}, @@ -2454,6 +2460,39 @@ void SceneViewport::drawEmptyEntities(ECS::World& world, EditorContext& ctx, ImV } } +void SceneViewport::drawSkeletons(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize) { + if (ctx.viewMode != EditorContext::ViewMode::Mode3D && + ctx.viewMode != EditorContext::ViewMode::Isometric) { + return; + } + ImDrawList* dl = ImGui::GetWindowDrawList(); + if (!dl) return; + + ECS::ComponentQuery query; + query.with(); + world.forEach(query, [&](ECS::Entity entity, Animation::SkinnedPose&) { + const std::vector* joints = Animation::jointPositionsFor(entity.id()); + const std::vector* parents = Animation::jointParentsFor(entity.id()); + if (!joints || !parents || joints->size() != parents->size()) return; + const Mat4 worldMatrix = entityMatrix(world, entity); + const bool selected = ctx.selectedEntity == entity; + const ImU32 color = selected ? IM_COL32(255, 196, 64, 230) : IM_COL32(120, 190, 255, 160); + const int count = std::min(static_cast(joints->size()), 256); + for (int i = 0; i < count; ++i) { + const i32 parent = (*parents)[static_cast(i)]; + const Vec3 joint = worldMatrix.transformPoint((*joints)[static_cast(i)]); + const ImVec2 screen = projectToScreen(joint, origin, viewportSize, ctx); + if (screen.x < -5000.0f) continue; + dl->AddCircleFilled(screen, selected ? 3.0f : 2.0f, color, 8); + if (parent < 0 || parent >= count) continue; + const Vec3 parentJoint = worldMatrix.transformPoint((*joints)[static_cast(parent)]); + const ImVec2 parentScreen = projectToScreen(parentJoint, origin, viewportSize, ctx); + if (parentScreen.x < -5000.0f) continue; + dl->AddLine(parentScreen, screen, color, selected ? 1.8f : 1.2f); + } + }); +} + void SceneViewport::drawLightGizmos(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize) { ImDrawList* dl = ImGui::GetWindowDrawList(); @@ -2464,6 +2503,9 @@ void SceneViewport::drawLightGizmos(ECS::World& world, EditorContext& ctx, ImVec ? projectToScreenVP(p, origin, viewportSize, vpCache3D) : projectToScreen(p, origin, viewportSize, ctx); }; + auto onScreen = [](ImVec2 p) { + return p.x > -4000.0f && p.y > -4000.0f && p.x < 20000.0f && p.y < 20000.0f; + }; { ECS::ComponentQuery q; @@ -2505,8 +2547,10 @@ void SceneViewport::drawLightGizmos(ECS::World& world, EditorContext& ctx, ImVec ImVec2(screenPos.x + x2, screenPos.y + y2), color, 2.0f); } - dl->AddLine(screenPos, tipPos, color, selected ? 2.5f : 1.5f); - dl->AddCircleFilled(tipPos, 3.0f, color, 10); + if (onScreen(screenPos) && onScreen(tipPos)) { + dl->AddLine(screenPos, tipPos, color, selected ? 2.5f : 1.5f); + dl->AddCircleFilled(tipPos, 3.0f, color, 10); + } dl->AddText(ImVec2(screenPos.x + 12, screenPos.y - 8), IM_COL32(220, 220, 230, 230), "Dir"); }); @@ -2570,14 +2614,21 @@ void SceneViewport::drawLightGizmos(ECS::World& world, EditorContext& ctx, ImVec Vec3 baseUp = coneEnd + up * coneRadius; Vec3 baseDown = coneEnd - up * coneRadius; - dl->AddLine(screenPos, proj3D(baseRight), color, selected ? 2.5f : 1.5f); - dl->AddLine(screenPos, proj3D(baseLeft), color, selected ? 2.5f : 1.5f); - dl->AddLine(screenPos, proj3D(baseUp), color, selected ? 2.0f : 1.25f); - dl->AddLine(screenPos, proj3D(baseDown), color, selected ? 2.0f : 1.25f); - dl->AddLine(proj3D(baseRight), proj3D(baseUp), color, 1.25f); - dl->AddLine(proj3D(baseUp), proj3D(baseLeft), color, 1.25f); - dl->AddLine(proj3D(baseLeft), proj3D(baseDown), color, 1.25f); - dl->AddLine(proj3D(baseDown), proj3D(baseRight), color, 1.25f); + const ImVec2 sRight = proj3D(baseRight); + const ImVec2 sLeft = proj3D(baseLeft); + const ImVec2 sUp = proj3D(baseUp); + const ImVec2 sDown = proj3D(baseDown); + if (onScreen(screenPos) && onScreen(sRight) && onScreen(sLeft) && + onScreen(sUp) && onScreen(sDown)) { + dl->AddLine(screenPos, sRight, color, selected ? 2.5f : 1.5f); + dl->AddLine(screenPos, sLeft, color, selected ? 2.5f : 1.5f); + dl->AddLine(screenPos, sUp, color, selected ? 2.0f : 1.25f); + dl->AddLine(screenPos, sDown, color, selected ? 2.0f : 1.25f); + dl->AddLine(sRight, sUp, color, 1.25f); + dl->AddLine(sUp, sLeft, color, 1.25f); + dl->AddLine(sLeft, sDown, color, 1.25f); + dl->AddLine(sDown, sRight, color, 1.25f); + } dl->AddCircleFilled(screenPos, 5.0f, color, 12); dl->AddText(ImVec2(screenPos.x + 8, screenPos.y - 8), IM_COL32(220, 220, 230, 230), "Sp"); }); @@ -2598,10 +2649,12 @@ void SceneViewport::drawGizmo(ECS::World& world, EditorContext& ctx, ImVec2 orig Vec3 worldPos; if (!tryGetEntityPosition(world, ctx.selectedEntity, worldPos)) return; ImVec2 screenPos = projectToScreen(worldPos, origin, viewportSize, ctx); - ImDrawList* dl = ImGui::GetWindowDrawList(); - const float HL = 30.0f * ctx.viewportZoom; - const bool is3D = (ctx.viewMode == EditorContext::ViewMode::Mode3D); + ImDrawList* dl = ImGui::GetForegroundDrawList(); + dl->PushClipRect(origin, ImVec2(origin.x + viewportSize.x, origin.y + viewportSize.y), true); + const bool is3D = (ctx.viewMode == EditorContext::ViewMode::Mode3D || + ctx.viewMode == EditorContext::ViewMode::Isometric); const bool zDimmed = (ctx.viewMode == EditorContext::ViewMode::Mode2D); + const float HL = is3D ? 72.0f : std::max(64.0f, 30.0f * ctx.viewportZoom); float sinY = 0, cosY = 1, sinP = 0, cosP = 1; if (is3D) { sinY=std::sin(ctx.camYaw); cosY=std::cos(ctx.camYaw); sinP=std::sin(ctx.camPitch); cosP=std::cos(ctx.camPitch); } @@ -2708,46 +2761,26 @@ void SceneViewport::drawGizmo(ECS::World& world, EditorContext& ctx, ImVec2 orig if (cdist < 9.f) { m_hoveredAxis = 4; } else if (ctx.gizmoMode == EditorContext::GizmoMode::Rotate) { - auto screenScaleForAxis = [&](const Vec3& axis) -> float { - Vec3 dir = axis; - const float len = dir.length(); - if (len < 1e-6f) return 0.f; - dir = dir / len; - ImVec2 s0 = projectToScreen(worldPos, origin, viewportSize, ctx); - ImVec2 s1 = projectToScreen(worldPos + dir, origin, viewportSize, ctx); - const float dx = s1.x - s0.x; - const float dy = s1.y - s0.y; - return std::sqrt(dx * dx + dy * dy); - }; - auto worldRadiusForRing = [&](const Vec3& axisA, const Vec3& axisB) -> float { - const float scaleA = screenScaleForAxis(axisA); - const float scaleB = screenScaleForAxis(axisB); - const float pxPerUnit = std::max(0.01f, 0.5f * (scaleA + scaleB)); - return HL / pxPerUnit; - }; - auto ringHit = [&](const Vec3& axisA, const Vec3& axisB) -> bool { - Vec3 a = axisA; - Vec3 b = axisB; - const float aLen = a.length(); - const float bLen = b.length(); - if (aLen < 1e-6f || bLen < 1e-6f) return false; - a = a / aLen; - b = b / bLen; - const float worldRadius = worldRadiusForRing(a, b); - const int N = 48; + auto ringHit = [&](ImVec2 a, ImVec2 b) -> bool { + const float la = std::sqrt(a.x * a.x + a.y * a.y); + const float lb = std::sqrt(b.x * b.x + b.y * b.y); + const float major = std::max(la, lb); + if (major < 1.0f) return false; + const float s = HL / major; + constexpr int N = 40; for (int i = 0; i < N; ++i) { const float ang = 6.28318f * static_cast(i) / static_cast(N); - const Vec3 wp = worldPos + (a * std::cos(ang) + b * std::sin(ang)) * worldRadius; - const ImVec2 sp = projectToScreen(wp, origin, viewportSize, ctx); - const float dx = mouse.x - sp.x; - const float dy = mouse.y - sp.y; - if (dx * dx + dy * dy < 64.f) return true; + const float px = screenPos.x + (a.x * std::cos(ang) + b.x * std::sin(ang)) * s; + const float py = screenPos.y + (a.y * std::cos(ang) + b.y * std::sin(ang)) * s; + const float dx = mouse.x - px; + const float dy = mouse.y - py; + if (dx * dx + dy * dy < 100.0f) return true; } return false; }; - if (ringHit(worldAxisY, worldAxisZ)) m_hoveredAxis = 1; - else if (ringHit(worldAxisX, worldAxisZ)) m_hoveredAxis = 2; - else if (ringHit(worldAxisX, worldAxisY)) m_hoveredAxis = 3; + if (ringHit(rawY, rawZ)) m_hoveredAxis = 1; + else if (ringHit(rawX, rawZ)) m_hoveredAxis = 2; + else if (ringHit(rawX, rawY)) m_hoveredAxis = 3; } else { auto ptLineDist = [&](ImVec2 b, ImVec2 e) -> float { float dx=e.x-b.x, dy=e.y-b.y, l2=dx*dx+dy*dy; @@ -2775,7 +2808,7 @@ void SceneViewport::drawGizmo(ECS::World& world, EditorContext& ctx, ImVec2 orig auto drawArrow = [&](ImVec2 from, ImVec2 to, u32 col) { float dx=to.x-from.x, dy=to.y-from.y, d=std::sqrt(dx*dx+dy*dy); - dl->AddLine(from, to, col, 3.f); + dl->AddLine(from, to, col, 4.f); if (d < 1.f) { dl->AddCircleFilled(from, 4.f, col, 12); return; } float ux=dx/d, uy=dy/d; ImVec2 tip(to.x+ux*8.f, to.y+uy*8.f); @@ -2785,40 +2818,20 @@ void SceneViewport::drawGizmo(ECS::World& world, EditorContext& ctx, ImVec2 orig dl->AddLine(from, to, col, 2.f); dl->AddRectFilled(ImVec2(to.x-5.f,to.y-5.f), ImVec2(to.x+5.f,to.y+5.f), col); }; - auto screenScaleForAxis = [&](const Vec3& axis) -> float { - Vec3 dir = axis; - const float len = dir.length(); - if (len < 1e-6f) return 0.f; - dir = dir / len; - ImVec2 s0 = projectToScreen(worldPos, origin, viewportSize, ctx); - ImVec2 s1 = projectToScreen(worldPos + dir, origin, viewportSize, ctx); - const float dx = s1.x - s0.x; - const float dy = s1.y - s0.y; - return std::sqrt(dx * dx + dy * dy); - }; - auto worldRadiusForRing = [&](const Vec3& axisA, const Vec3& axisB) -> float { - const float scaleA = screenScaleForAxis(axisA); - const float scaleB = screenScaleForAxis(axisB); - const float pxPerUnit = std::max(0.01f, 0.5f * (scaleA + scaleB)); - return HL / pxPerUnit; - }; - auto drawRing = [&](const Vec3& axisA, const Vec3& axisB, u32 col) { - Vec3 a = axisA; - Vec3 b = axisB; - const float aLen = a.length(); - const float bLen = b.length(); - if (aLen < 1e-6f || bLen < 1e-6f) return; - a = a / aLen; - b = b / bLen; - const float worldRadius = worldRadiusForRing(a, b); - const int N = 64; + auto drawRing = [&](ImVec2 a, ImVec2 b, u32 col) { + const float la = std::sqrt(a.x * a.x + a.y * a.y); + const float lb = std::sqrt(b.x * b.x + b.y * b.y); + const float major = std::max(la, lb); + if (major < 1.0f) return; + const float s = HL / major; + constexpr int N = 48; ImVec2 prev; bool hasPrev = false; for (int i = 0; i <= N; ++i) { const float ang = 6.28318f * static_cast(i) / static_cast(N); - const Vec3 wp = worldPos + (a * std::cos(ang) + b * std::sin(ang)) * worldRadius; - const ImVec2 sp = projectToScreen(wp, origin, viewportSize, ctx); - if (hasPrev) dl->AddLine(prev, sp, col, 2.f); + const ImVec2 sp(screenPos.x + (a.x * std::cos(ang) + b.x * std::sin(ang)) * s, + screenPos.y + (a.y * std::cos(ang) + b.y * std::sin(ang)) * s); + if (hasPrev) dl->AddLine(prev, sp, col, 2.5f); prev = sp; hasPrev = true; } @@ -2833,14 +2846,15 @@ void SceneViewport::drawGizmo(ECS::World& world, EditorContext& ctx, ImVec2 orig if (ctx.gizmoMode == EditorContext::GizmoMode::Translate) drawArrow(screenPos, end, col); else if (ctx.gizmoMode == EditorContext::GizmoMode::Scale) drawScaleBox(screenPos, end, col); else if (ctx.gizmoMode == EditorContext::GizmoMode::Rotate) { - const Vec3& ringA = (axId == 1) ? worldAxisY : worldAxisX; - const Vec3& ringB = (axId == 3) ? worldAxisY : worldAxisZ; + const ImVec2 ringA = (axId == 1) ? rawY : rawX; + const ImVec2 ringB = (axId == 3) ? rawY : rawZ; drawRing(ringA, ringB, axisColor(axId, 1.f)); } } + dl->AddCircleFilled(screenPos, 5.f, IM_COL32(255, 255, 255, 230), 12); if (ctx.gizmoMode == EditorContext::GizmoMode::None) - dl->AddCircle(screenPos, 6.f, IM_COL32(255,255,255,180), 12, 2.f); + dl->AddCircle(screenPos, 8.f, IM_COL32(255,255,255,180), 16, 2.f); if (world.has(ctx.selectedEntity)) { auto* emitter = world.get(ctx.selectedEntity); @@ -2857,6 +2871,7 @@ void SceneViewport::drawGizmo(ECS::World& world, EditorContext& ctx, ImVec2 orig dl->AddText(ImVec2(screenPos.x + 8, screenPos.y - 20), IM_COL32(180, 180, 255, 220), "S"); } } + dl->PopClipRect(); } void SceneViewport::drawPhysicsDebug(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize) { @@ -2900,21 +2915,14 @@ bool SceneViewport::drawSkyboxForView(ImDrawList* drawList, ImVec2 origin, ImVec Render::SkyboxRenderer* renderer, int skyboxMaxRasterDim) { if (!drawList) return false; - if (respectEditorToggle && !ctx.skyboxEnabled) return false; - - const std::string projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); - - int presetIndex = ctx.skyboxIndex; - std::filesystem::path texturePath; + const std::string projectRoot = resolveEditorProjectRoot(ctx); const Scene::ActiveSkybox active = Scene::findActiveSkybox(world); - if (active.component) { - presetIndex = active.component->presetIndex; - texturePath = Scene::resolveSkyboxTexturePath(*active.component, projectRoot); - } else { - texturePath = Scene::resolveBuiltinSkyboxPath(presetIndex); - } + if (!active.component) return false; + if (respectEditorToggle && !active.component->enabled) return false; + const std::filesystem::path texturePath = + Scene::resolveSkyboxTexturePath(*active.component, projectRoot); if (texturePath.empty()) return false; const std::string textureKey = texturePath.string(); @@ -3082,64 +3090,123 @@ void SceneViewport::drawGrid3D(ImDrawList* dl, ImVec2 origin, ImVec2 viewportSiz } void SceneViewport::drawNavigationWidget(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize) { + (void)world; ImDrawList* dl = ImGui::GetWindowDrawList(); - const float padding = 12.0f; - const float buttonWidth = 62.0f; - const float widgetSize = 84.0f; - - ImVec2 widgetMin( - origin.x + viewportSize.x - padding - buttonWidth - 6.0f - widgetSize, - origin.y + viewportSize.y - padding - widgetSize - ); - ImVec2 widgetMax(widgetMin.x + widgetSize, widgetMin.y + widgetSize); - - dl->AddRectFilled(widgetMin, widgetMax, IM_COL32(18, 20, 26, 190), 6.0f); - dl->AddRect(widgetMin, widgetMax, IM_COL32(90, 100, 130, 180), 6.0f, 0, 1.0f); - - bool is3D = (ctx.viewMode == EditorContext::ViewMode::Mode3D || - ctx.viewMode == EditorContext::ViewMode::Isometric); - - ImVec2 center(widgetMin.x + widgetSize * 0.5f, widgetMin.y + widgetSize * 0.5f); - const float axisLen = 22.0f; + const bool is3D = (ctx.viewMode == EditorContext::ViewMode::Mode3D || + ctx.viewMode == EditorContext::ViewMode::Isometric); + const float axisLen = 32.0f; + const ImVec2 center(origin.x + viewportSize.x - 58.0f, origin.y + 52.0f); + const ImVec2 mouse = ImGui::GetMousePos(); + const float halfPi = 1.5707963f; + + struct Handle { + Vec3 dir; + int r, g, b; + const char* label; + float yaw; + float pitch; + float depth; + ImVec2 tip; + float screenLen; + }; - { - float sinY = std::sin(ctx.camYaw), cosY = std::cos(ctx.camYaw); - float sinP = std::sin(ctx.camPitch), cosP = std::cos(ctx.camPitch); - - auto axisScreenDir = [&](float wx, float wy, float wz) -> ImVec2 { - float sx = cosY * wx + sinY * wz; - float sy = wy; - float sz = -sinY * wx + cosY * wz; - float sy2 = cosP * sy + sinP * sz; - float len = std::sqrt(sx * sx + sy2 * sy2); - if (len < 0.001f) return ImVec2(0.f, 0.f); - return ImVec2(sx / len * axisLen, -sy2 / len * axisLen); + Handle handles[6]; + int handleCount = 0; + if (is3D) { + const Vec3 eye = editorOrbitOffset(ctx.camYaw, ctx.camPitch, 1.0f); + const Mat4 view = Mat4::lookAt(eye, Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f)); + const Vec3 right(view(0, 0), view(0, 1), view(0, 2)); + const Vec3 up(view(1, 0), view(1, 1), view(1, 2)); + const Vec3 forward(-view(2, 0), -view(2, 1), -view(2, 2)); + const Handle seeds[] = { + {{ 1.0f, 0.0f, 0.0f}, 230, 60, 60, "x", halfPi, 0.0f, 0, {}, 0}, + {{-1.0f, 0.0f, 0.0f}, 140, 40, 40, nullptr, -halfPi, 0.0f, 0, {}, 0}, + {{ 0.0f, 1.0f, 0.0f}, 70, 210, 80, "y", ctx.camYaw, halfPi * 0.98f, 0, {}, 0}, + {{ 0.0f,-1.0f, 0.0f}, 40, 120, 50, nullptr, ctx.camYaw, -halfPi * 0.98f, 0, {}, 0}, + {{ 0.0f, 0.0f, 1.0f}, 70, 130, 240, "z", 3.1415926f, 0.0f, 0, {}, 0}, + {{ 0.0f, 0.0f,-1.0f}, 40, 70, 150, nullptr, 0.0f, 0.0f, 0, {}, 0}, }; + handleCount = 6; + for (int i = 0; i < handleCount; ++i) { + handles[i] = seeds[i]; + const float sx = handles[i].dir.dot(right); + const float sy = handles[i].dir.dot(up); + handles[i].depth = handles[i].dir.dot(forward); + handles[i].tip = ImVec2(center.x + sx * axisLen, center.y - sy * axisLen); + handles[i].screenLen = std::sqrt(sx * sx + sy * sy) * axisLen; + } + std::sort(handles, handles + handleCount, + [](const Handle& a, const Handle& b) { return a.depth > b.depth; }); + } else { + handles[0] = {{1, 0, 0}, 230, 60, 60, "x", 0, 0, -1, ImVec2(center.x + axisLen, center.y), axisLen}; + handles[1] = {{0, 1, 0}, 70, 210, 80, "y", 0, 0, -1, ImVec2(center.x, center.y - axisLen), axisLen}; + handleCount = 2; + } - ImVec2 xDir = axisScreenDir(1.f, 0.f, 0.f); - ImVec2 yDir = axisScreenDir(0.f, 1.f, 0.f); - ImVec2 zDir = axisScreenDir(0.f, 0.f, 1.f); - - dl->AddLine(center, ImVec2(center.x + xDir.x, center.y + xDir.y), IM_COL32(255, 70, 70, 255), 2.0f); - dl->AddText(ImVec2(center.x + xDir.x + 3.f, center.y + xDir.y - 8.f), IM_COL32(255, 90, 90, 255), "X"); - - dl->AddLine(center, ImVec2(center.x + yDir.x, center.y + yDir.y), IM_COL32(70, 255, 90, 255), 2.0f); - dl->AddText(ImVec2(center.x + yDir.x - 4.f, center.y + yDir.y - 14.f), IM_COL32(90, 255, 110, 255), "Y"); - - if (is3D) { - dl->AddLine(center, ImVec2(center.x + zDir.x, center.y + zDir.y), IM_COL32(90, 140, 255, 255), 2.0f); - dl->AddText(ImVec2(center.x + zDir.x - 12.f, center.y + zDir.y - 6.f), IM_COL32(120, 165, 255, 255), "Z"); + int hovered = -1; + if (is3D) { + float bestDepth = 1.0e9f; + for (int i = 0; i < handleCount; ++i) { + const ImVec2 hit = handles[i].screenLen < 8.0f ? center : handles[i].tip; + const float dx = mouse.x - hit.x; + const float dy = mouse.y - hit.y; + if (dx * dx + dy * dy < 12.0f * 12.0f && handles[i].depth < bestDepth) { + bestDepth = handles[i].depth; + hovered = i; + } + } + if (hovered >= 0 && ImGui::IsMouseClicked(ImGuiMouseButton_Left) && ImGui::IsWindowHovered()) { + ctx.camYaw = handles[hovered].yaw; + ctx.camPitch = std::clamp(handles[hovered].pitch, EditorContext::kCamPitchMin, + EditorContext::kCamPitchMax); } } - dl->AddCircleFilled(center, 2.8f, IM_COL32(240, 240, 240, 255)); - dl->AddText(ImVec2(widgetMin.x + 6.0f, widgetMin.y + widgetSize - 18.0f), IM_COL32(220, 220, 230, 220), is3D ? "3D" : "2D"); + dl->AddCircleFilled(center, 2.5f, IM_COL32(240, 240, 240, 255)); + for (int i = 0; i < handleCount; ++i) { + const Handle& axis = handles[i]; + const bool hot = i == hovered; + const bool facing = axis.depth < 0.15f; + const int alpha = hot ? 255 : (facing ? 255 : 150); + const ImU32 color = hot ? IM_COL32(255, 255, 255, 255) : IM_COL32(axis.r, axis.g, axis.b, alpha); + if (axis.screenLen < 8.0f) { + if (!facing && !hot) continue; + const float radius = axis.label ? 8.0f : 5.0f; + dl->AddCircleFilled(center, radius, color, 16); + if (axis.label) { + const ImVec2 text = ImGui::CalcTextSize(axis.label); + dl->AddText(ImVec2(center.x - text.x * 0.5f, center.y - text.y * 0.5f), + IM_COL32(16, 16, 16, 255), axis.label); + } + continue; + } + dl->AddLine(center, axis.tip, color, hot ? 2.6f : (facing ? 2.0f : 1.4f)); + if (axis.label) { + const float ux = (axis.tip.x - center.x) / axis.screenLen; + const float uy = (axis.tip.y - center.y) / axis.screenLen; + const float head = facing ? 7.0f : 5.0f; + const ImVec2 a(axis.tip.x - uy * head * 0.55f - ux * head, axis.tip.y + ux * head * 0.55f - uy * head); + const ImVec2 b(axis.tip.x + uy * head * 0.55f - ux * head, axis.tip.y - ux * head * 0.55f - uy * head); + dl->AddTriangleFilled(axis.tip, a, b, color); + dl->AddText(ImVec2(axis.tip.x + ux * 8.0f - 3.0f, axis.tip.y + uy * 8.0f - 6.0f), color, axis.label); + } else { + dl->AddCircleFilled(axis.tip, facing ? 4.5f : 3.0f, color, 12); + } + } - ImVec2 btnPos(widgetMax.x + 6.0f, widgetMin.y + widgetSize - 24.0f); - ImGui::SetCursorScreenPos(btnPos); - if (ImGui::Button(m_projectionMode == ProjectionMode::Perspective ? "Persp" : "Ortho", ImVec2(buttonWidth, 24.0f))) { + const char* projLabel = m_projectionMode == ProjectionMode::Perspective ? "Persp" : "Ortho"; + const ImVec2 textSize = ImGui::CalcTextSize(projLabel); + const ImVec2 textPos(center.x - textSize.x * 0.5f, center.y + axisLen + 10.0f); + ImGui::SetCursorScreenPos(textPos); + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(1, 1, 1, 0.12f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(1, 1, 1, 0.2f)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0)); + if (ImGui::Button(projLabel, ImVec2(textSize.x + 8.0f, textSize.y + 2.0f))) { toggleProjectionMode(); } + ImGui::PopStyleVar(); + ImGui::PopStyleColor(3); } f32 SceneViewport::rayIntersectsAABB(const Vec3& rayOrigin, const Vec3& rayDir, @@ -3308,12 +3375,12 @@ ECS::Entity SceneViewport::raycastSelectEntity(const Vec3& rayOrigin, const Vec3 return; } - Assets::Mesh3D* mesh = nullptr; - if (filter.primitive == ECS::MeshPrimitive::Custom) { + Assets::Mesh3D* mesh = ECS::editedMesh(world, entity); + if (!mesh && filter.primitive == ECS::MeshPrimitive::Custom) { if (!filter.customMeshPath.empty()) { mesh = Assets::MeshCache::getInstance().getMesh(filter.customMeshPath, projectRoot); } - } else { + } else if (!mesh) { mesh = Render::GpuProceduralMeshes::get(filter.primitive); } if (mesh && (mesh->bounds.max - mesh->bounds.min).lengthSquared() > 1.0e-6f) { @@ -3415,6 +3482,20 @@ void SceneViewport::handleGizmoInput(ECS::World& world, EditorContext& ctx, ImVe switch (ctx.gizmoMode) { case EditorContext::GizmoMode::Translate: + if (ctx.meshElementMode != EditorContext::MeshElementMode::Object) { + Vec3 worldDelta{}; + if (axis == 1) worldDelta.x = projectDelta(1); + else if (axis == 2) worldDelta.y = projectDelta(2); + else if (axis == 3) worldDelta.z = projectDelta(3); + else { + worldDelta.x = delta.x / scale; + worldDelta.y = -delta.y / scale; + } + if (moveMeshSelection(world, ctx, worldDelta)) { + ctx.isDirty = true; + return; + } + } if (axis == 1) pos->position.x += projectDelta(1); else if (axis == 2) pos->position.y += projectDelta(2); else if (axis == 3) pos->position.z += projectDelta(3); @@ -3626,7 +3707,7 @@ void SceneViewport::drawCustomMeshGeometry( if (!meshFilter) return; if (meshFilter->customMeshPath.empty() && !world.has(entity)) return; - const std::string projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); + const std::string projectRoot = resolveEditorProjectRoot(ctx); auto& meshCache = Assets::MeshCache::getInstance(); Assets::Mesh3D* loadedMesh = meshOverride; @@ -3761,10 +3842,7 @@ void SceneViewport::drawSceneMeshesForCamera( Scene::syncTerrainMeshes(world); } - std::string projectRoot; - if (!ctx.currentScenePath.empty()) { - projectRoot = resolveProjectRootFromScenePath(ctx.currentScenePath); - } + const std::string projectRoot = resolveEditorProjectRoot(ctx); Scene::SceneLighting sceneLighting; Scene::collectSceneLights(world, sceneLighting.lights); @@ -3786,6 +3864,12 @@ void SceneViewport::drawSceneMeshesForCamera( [&](ECS::Entity entity, ECS::MeshFilterComponent& meshFilter) { if (entity == skipEntity) return; if (Scene::isEffectivelyDisabled(world, entity)) return; + if (const Effects::EffectComponent* volume = world.get(entity)) { + if (volume->enabled && + volume->kind == static_cast(Effects::EffectKind::VolumetricLight)) { + return; + } + } const Mat4 worldMatrix = entityMatrix(world, entity); const bool isTerrain = world.has(entity); @@ -3797,6 +3881,13 @@ void SceneViewport::drawSceneMeshesForCamera( return; } + if (Assets::Mesh3D* edited = ECS::editedMesh(world, entity)) { + drawCustomMeshGeometry(world, ctx, entity, &meshFilter, worldMatrix, dl, vp, camPos, + origin, panelSize, lightColorAt, true, false, receiveShadows, + &meshRaster, edited); + return; + } + if (meshFilter.primitive == ECS::MeshPrimitive::Custom) { if (meshFilter.customMeshPath.empty()) return; drawCustomMeshGeometry(world, ctx, entity, &meshFilter, worldMatrix, dl, vp, @@ -3828,13 +3919,9 @@ std::string SceneViewport::resolveSpritePath(const std::string& spriteName, cons } } - // 2. Derive project root from current scene path (if available) - std::filesystem::path projectRoot; - if (!ctx.currentScenePath.empty()) { - projectRoot = std::filesystem::path(ctx.currentScenePath).parent_path(); - } else { - projectRoot = std::filesystem::current_path(); - } + const std::filesystem::path projectRoot = !ctx.projectRootPath.empty() + ? ctx.projectRootPath + : std::filesystem::current_path(); // Only the filename (without directory) std::string filename = std::filesystem::path(spriteName).filename().string(); @@ -3896,8 +3983,9 @@ void SceneViewport::drawCameraFrustums(ECS::World& world, EditorContext& ctx, Im world.forEach(q2d, [&](ECS::Entity, ECS::Camera2DComponent& cam, ECS::Transform& pos) { - const f32 halfW = 8.0f / cam.zoom; - const f32 halfH = 4.5f / cam.zoom; + const f32 zoom = std::max(cam.zoom, 0.05f); + const f32 halfW = 8.0f / zoom; + const f32 halfH = 4.5f / zoom; ImVec2 tl = w2s(pos.position.x - halfW, pos.position.y + halfH); ImVec2 tr = w2s(pos.position.x + halfW, pos.position.y + halfH); diff --git a/src/editor/SceneViewport.hpp b/src/editor/SceneViewport.hpp index f1af6473..75b7ec75 100644 --- a/src/editor/SceneViewport.hpp +++ b/src/editor/SceneViewport.hpp @@ -129,6 +129,10 @@ class SceneViewport { ? ProjectionMode::Orthographic : ProjectionMode::Perspective; } + MeshPreviewMode meshPreviewMode() const { return m_meshPreviewMode; } + void setMeshPreviewMode(MeshPreviewMode mode) { m_meshPreviewMode = mode; } + WireframeDensity wireframeDensity() const { return m_wireframeDensity; } + void setWireframeDensity(WireframeDensity density) { m_wireframeDensity = density; } bool isOpen() const { return m_open; } void close() { m_open = false; } @@ -174,6 +178,7 @@ class SceneViewport { void drawPhysicsDebug(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize); void drawCameraFrustums(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize); void drawLightGizmos(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize); + void drawSkeletons(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize); #ifdef CF_HAS_IMGUI void createOrUpdateLightGizmoEntities(ECS::World& world); diff --git a/src/editor/SettingsPanel.cpp b/src/editor/SettingsPanel.cpp index 54c886ae..7ab9e7b4 100644 --- a/src/editor/SettingsPanel.cpp +++ b/src/editor/SettingsPanel.cpp @@ -70,6 +70,9 @@ void SettingsPanel::applyPreferencesToContext(EditorContext& ctx) { ctx.textureQualityFalloff = m_preferences.textureQualityFalloff; ctx.textureQualityMinScale = m_preferences.textureQualityMinScale; ctx.renderScale = std::clamp(m_preferences.renderScale, 0.25f, 2.0f); + const int aa = std::clamp(m_preferences.viewportAntiAlias, 0, 2); + m_preferences.viewportAntiAlias = aa; + ctx.viewportAntiAlias = static_cast(aa); } void SettingsPanel::render() { @@ -341,6 +344,16 @@ void SettingsPanel::renderViewportSettings() { savePreferences(); if (m_editorContext) applyPreferencesToContext(*m_editorContext); } + ImGui::TextWrapped( + "Anti-aliasing for the scene viewport only. The game keeps the anti-aliasing " + "set on each camera's post-processing."); + const char* aaLabels[] = {"Off", "FXAA", "TAA"}; + int aa = std::clamp(m_preferences.viewportAntiAlias, 0, 2); + if (ImGui::Combo("Viewport anti-aliasing", &aa, aaLabels, 3)) { + m_preferences.viewportAntiAlias = aa; + savePreferences(); + if (m_editorContext) applyPreferencesToContext(*m_editorContext); + } ImGui::Spacing(); ImGui::TextColored(ImVec4(0.7f, 0.7f, 1.0f, 1.0f), "Texture quality"); diff --git a/src/editor/ToolboxPanel.hpp b/src/editor/ToolboxPanel.hpp new file mode 100644 index 00000000..ac8c2ad8 --- /dev/null +++ b/src/editor/ToolboxPanel.hpp @@ -0,0 +1,150 @@ +#pragma once + +#include "editor/EditorContext.hpp" +#include "editor/SceneViewport.hpp" + +#ifdef CF_HAS_IMGUI +#include "ecs/MeshGeometry.hpp" +#include "ecs/TerrainComponents.hpp" +#include +#endif + +namespace Caffeine::Editor { + +class ToolboxPanel { +public: + void open() { m_open = true; } + void close() { m_open = false; } + bool isOpen() const { return m_open; } + +#ifdef CF_HAS_IMGUI + void render(ECS::World& world, EditorContext& ctx, SceneViewport& viewport) { + if (!m_open) return; + if (!ImGui::Begin("Toolbox", &m_open)) { + ImGui::End(); + return; + } + + ImGui::SeparatorText("Transform"); + auto modeButton = [&](const char* label, EditorContext::GizmoMode mode) { + const bool active = ctx.gizmoMode == mode; + if (active) ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.20f, 0.45f, 0.85f, 1.0f)); + if (ImGui::Button(label, ImVec2(72.0f, 0.0f))) { + ctx.gizmoMode = mode; + ctx.meshElementMode = EditorContext::MeshElementMode::Object; + ctx.meshElementSelection.clear(); + } + if (active) ImGui::PopStyleColor(); + }; + modeButton("Move", EditorContext::GizmoMode::Translate); + ImGui::SameLine(); + modeButton("Rotate", EditorContext::GizmoMode::Rotate); + ImGui::SameLine(); + modeButton("Scale", EditorContext::GizmoMode::Scale); + const bool local = ctx.gizmoSpace == EditorContext::GizmoSpace::Local; + if (ImGui::Button(local ? "Local axes" : "World axes", ImVec2(-1.0f, 0.0f))) { + ctx.gizmoSpace = local ? EditorContext::GizmoSpace::World + : EditorContext::GizmoSpace::Local; + } + ImGui::TextDisabled("T move E rotate R scale"); + + ImGui::SeparatorText("Geometry"); + auto elementButton = [&](const char* label, EditorContext::MeshElementMode mode) { + const bool active = ctx.meshElementMode == mode; + if (active) ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.85f, 0.55f, 0.15f, 1.0f)); + if (ImGui::Button(label, ImVec2(72.0f, 0.0f))) { + ctx.meshElementMode = mode; + ctx.meshElementSelection.clear(); + if (mode != EditorContext::MeshElementMode::Object && ctx.selectedEntity.isValid()) { + ECS::bakeMeshGeometry(world, ctx.selectedEntity, ctx.projectRootPath.string()); + } + } + if (active) ImGui::PopStyleColor(); + }; + elementButton("Object", EditorContext::MeshElementMode::Object); + ImGui::SameLine(); + elementButton("Vertex", EditorContext::MeshElementMode::Vertex); + ImGui::SameLine(); + elementButton("Edge", EditorContext::MeshElementMode::Edge); + ImGui::SameLine(); + elementButton("Face", EditorContext::MeshElementMode::Face); + ImGui::TextDisabled("Select an element, then drag the gizmo."); + + ImGui::SeparatorText("View"); + auto viewButton = [&](const char* label, EditorContext::ViewMode mode) { + const bool active = ctx.viewMode == mode; + if (active) ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.20f, 0.45f, 0.85f, 1.0f)); + if (ImGui::Button(label, ImVec2(72.0f, 0.0f))) ctx.viewMode = mode; + if (active) ImGui::PopStyleColor(); + }; + viewButton("2D", EditorContext::ViewMode::Mode2D); + ImGui::SameLine(); + viewButton("3D", EditorContext::ViewMode::Mode3D); + ImGui::SameLine(); + viewButton("Iso", EditorContext::ViewMode::Isometric); + const bool perspective = viewport.projectionMode() == SceneViewport::ProjectionMode::Perspective; + if (ImGui::Button(perspective ? "Perspective" : "Orthographic", ImVec2(-1.0f, 0.0f))) { + viewport.toggleProjectionMode(); + } + + ImGui::SeparatorText("Viewport"); + if (ImGui::Checkbox("Snap to grid", &ctx.snapToGrid)) {} + ImGui::SliderFloat("Grid size", &ctx.snapGridSize, 0.1f, 10.0f, "%.2f"); + if (ImGui::Checkbox("Physics shapes", &ctx.physicsDebugVisible)) {} + const bool textured = viewport.meshPreviewMode() == SceneViewport::MeshPreviewMode::Textured; + if (ImGui::Button(textured ? "Textured" : "Wireframe", ImVec2(-1.0f, 0.0f))) { + viewport.setMeshPreviewMode(textured ? SceneViewport::MeshPreviewMode::Wireframe + : SceneViewport::MeshPreviewMode::Textured); + } + if (!textured) { + int density = static_cast(viewport.wireframeDensity()); + const char* labels[] = {"Low", "Medium", "High"}; + if (ImGui::Combo("Density", &density, labels, 3)) { + viewport.setWireframeDensity(static_cast(density)); + } + } + + if (ctx.selectedEntity.isValid() && world.has(ctx.selectedEntity)) { + ImGui::SeparatorText("Terrain"); + auto terrainButton = [&](const char* label, bool active) { + if (active) ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.20f, 0.65f, 0.35f, 1.0f)); + const bool pressed = ImGui::Button(label); + if (active) ImGui::PopStyleColor(); + return pressed; + }; + if (terrainButton("Sculpt", ctx.terrainEditMode == EditorContext::TerrainEditMode::Sculpt)) { + ctx.terrainEditMode = (ctx.terrainEditMode == EditorContext::TerrainEditMode::Sculpt) + ? EditorContext::TerrainEditMode::None + : EditorContext::TerrainEditMode::Sculpt; + } + ImGui::SameLine(); + if (terrainButton("Paint", ctx.terrainEditMode == EditorContext::TerrainEditMode::Splat)) { + ctx.terrainEditMode = (ctx.terrainEditMode == EditorContext::TerrainEditMode::Splat) + ? EditorContext::TerrainEditMode::None + : EditorContext::TerrainEditMode::Splat; + } + if (ctx.terrainEditMode == EditorContext::TerrainEditMode::Sculpt) { + if (terrainButton("Raise", ctx.terrainBrushMode == EditorContext::TerrainBrushMode::Raise)) + ctx.terrainBrushMode = EditorContext::TerrainBrushMode::Raise; + ImGui::SameLine(); + if (terrainButton("Lower", ctx.terrainBrushMode == EditorContext::TerrainBrushMode::Lower)) + ctx.terrainBrushMode = EditorContext::TerrainBrushMode::Lower; + ImGui::SameLine(); + if (terrainButton("Smooth", ctx.terrainBrushMode == EditorContext::TerrainBrushMode::Smooth)) + ctx.terrainBrushMode = EditorContext::TerrainBrushMode::Smooth; + } + ImGui::SliderFloat("Radius", &ctx.terrainBrushRadius, 0.5f, 64.0f, "%.1f"); + ImGui::SliderFloat("Strength", &ctx.terrainBrushStrength, 0.01f, 1.0f, "%.2f"); + } + + ImGui::End(); + } +#else + void render(ECS::World&, EditorContext&, SceneViewport&) {} +#endif + +private: + bool m_open = true; +}; + +} // namespace Caffeine::Editor diff --git a/src/effects/EffectSystem.cpp b/src/effects/EffectSystem.cpp index 3b30f6b3..2e9772e3 100644 --- a/src/effects/EffectSystem.cpp +++ b/src/effects/EffectSystem.cpp @@ -1,12 +1,17 @@ #include "effects/EffectSystem.hpp" #include "assets/MaterialCache.hpp" +#include "assets/MeshCache.hpp" #include "ecs/ComponentQuery.hpp" #include "ecs/Components.hpp" #include "ecs/Components3D.hpp" +#include "ecs/MeshGeometry.hpp" #include "ecs/ParticleSystem.hpp" #include "math/Mat4.hpp" #include "math/Quat.hpp" +#ifdef CF_HAS_SDL3 +#include "render/GpuProceduralMeshes.hpp" +#endif #include "scene/HierarchySystem.hpp" #include "scene/SceneComponents.hpp" @@ -294,8 +299,218 @@ void emitFog(const EffectComponent& effect, const Vec3& center, bool twoD, Emit& } } +Vec3 inverseAffinePoint(const Mat4& matrix, const Vec3& world) { + const Vec3 c0(matrix(0, 0), matrix(1, 0), matrix(2, 0)); + const Vec3 c1(matrix(0, 1), matrix(1, 1), matrix(2, 1)); + const Vec3 c2(matrix(0, 2), matrix(1, 2), matrix(2, 2)); + const Vec3 origin(matrix(0, 3), matrix(1, 3), matrix(2, 3)); + const Vec3 delta = world - origin; + const f32 det = c0.dot(c1.cross(c2)); + if (std::abs(det) < 1.0e-8f) return Vec3(0.0f, 0.0f, 0.0f); + const f32 invDet = 1.0f / det; + return Vec3(delta.dot(c1.cross(c2)) * invDet, delta.dot(c2.cross(c0)) * invDet, + delta.dot(c0.cross(c1)) * invDet); +} + +bool emitVolumetricMesh(ECS::World& world, ECS::Entity entity, const EffectComponent& effect, + const Vec3& cameraPos, Assets::Mesh3D& mesh) { + const ECS::MeshFilterComponent* filter = world.get(entity); + if (!filter) return false; + Assets::Mesh3D* source = ECS::editedMesh(world, entity); +#ifdef CF_HAS_SDL3 + if (!source) source = Render::GpuProceduralMeshes::get(filter->primitive); +#endif + if (!source && filter->primitive == ECS::MeshPrimitive::Custom && !filter->customMeshPath.empty()) { + source = Assets::MeshCache::getInstance().getMesh(filter->customMeshPath, ""); + } + if (!source || source->vertices.empty() || source->indices.empty()) return false; + + Vec3 boundsMin(1.0e30f, 1.0e30f, 1.0e30f); + Vec3 boundsMax(-1.0e30f, -1.0e30f, -1.0e30f); + for (const Assets::Vertex3D& vertex : source->vertices) { + boundsMin.x = std::min(boundsMin.x, vertex.position.x); + boundsMin.y = std::min(boundsMin.y, vertex.position.y); + boundsMin.z = std::min(boundsMin.z, vertex.position.z); + boundsMax.x = std::max(boundsMax.x, vertex.position.x); + boundsMax.y = std::max(boundsMax.y, vertex.position.y); + boundsMax.z = std::max(boundsMax.z, vertex.position.z); + } + const Vec3 center = (boundsMin + boundsMax) * 0.5f; + Vec3 extent = (boundsMax - boundsMin) * 0.5f; + extent.x = std::max(extent.x, 1.0e-4f); + extent.y = std::max(extent.y, 1.0e-4f); + extent.z = std::max(extent.z, 1.0e-4f); + + const Mat4 matrix = effectMatrix(world, entity); + const f32 alpha = std::clamp(0.12f + 0.35f * effect.density, 0.08f, 0.55f); + const Vec3 rgb = effect.lightColor * effect.intensity * alpha; + const Vec3 cameraMesh = inverseAffinePoint(matrix, cameraPos); + const Vec3 cameraLocal((cameraMesh.x - center.x) / extent.x, (cameraMesh.y - center.y) / extent.y, + (cameraMesh.z - center.z) / extent.z); + if (mesh.vertices.size() + source->vertices.size() > 4096) return false; + const u32 base = static_cast(mesh.vertices.size()); + for (const Assets::Vertex3D& vertex : source->vertices) { + const Vec3 local = vertex.position - center; + Assets::Vertex3D out{}; + out.position = matrix.transformPoint(vertex.position); + out.normal = Vec3(local.x / extent.x, local.y / extent.y, local.z / extent.z); + // x encodes the volume sentinel plus cameraLocal.z; y is cameraLocal.x. + out.texcoord = {-1.0e6f + cameraLocal.z, cameraLocal.x}; + out.tangent = Vec4(rgb.x, rgb.y, rgb.z, cameraLocal.y); + mesh.vertices.push_back(out); + } + for (u32 index : source->indices) mesh.indices.push_back(base + index); + return true; +} + +} // namespace + +namespace { + +bool transformDrivesEffect(ECS::World& world, ECS::Entity entity) { + return world.has(entity) && !world.has(entity); +} + +void aimVolumetricMesh(ECS::World& world, ECS::Entity entity, const EffectComponent& effect) { + if (volumetricShapeOf(effect) == VolumetricShape::Sphere) return; + if (transformDrivesEffect(world, entity)) { + world.get(entity)->rotation.x -= 90.0f; + return; + } + ECS::Rotation3D* rotation = world.get(entity); + if (!rotation) rotation = &world.add(entity); + const Quat current(rotation->quaternion.x, rotation->quaternion.y, rotation->quaternion.z, + rotation->quaternion.w); + const Quat aimed = (current * Quat::fromEuler(-1.5707963f, 0.0f, 0.0f)).normalized(); + rotation->quaternion = Vec4(aimed.x, aimed.y, aimed.z, aimed.w); +} + } // namespace +ECS::MeshPrimitive volumetricMeshPrimitive(VolumetricShape shape) { + switch (shape) { + case VolumetricShape::Cone: return ECS::MeshPrimitive::Cone; + case VolumetricShape::Box: return ECS::MeshPrimitive::Cube; + case VolumetricShape::Cylinder: return ECS::MeshPrimitive::Cylinder; + case VolumetricShape::Window: return ECS::MeshPrimitive::Cube; + case VolumetricShape::Sphere: break; + } + return ECS::MeshPrimitive::Sphere; +} + +bool volumetricShapeForMesh(ECS::MeshPrimitive primitive, VolumetricShape& shape) { + switch (primitive) { + case ECS::MeshPrimitive::Sphere: shape = VolumetricShape::Sphere; return true; + case ECS::MeshPrimitive::Cone: shape = VolumetricShape::Cone; return true; + case ECS::MeshPrimitive::Cube: shape = VolumetricShape::Box; return true; + case ECS::MeshPrimitive::Cylinder: shape = VolumetricShape::Cylinder; return true; + default: break; + } + return false; +} + +Vec3 volumetricScaleForEffect(const EffectComponent& effect) { + const VolumetricShape shape = volumetricShapeOf(effect); + const f32 length = std::max(effect.radius, 0.05f); + const f32 width = std::max(effect.startSize, 0.05f); + const f32 depth = std::max(effect.endSize, 0.05f); + switch (shape) { + case VolumetricShape::Sphere: { + const f32 diameter = length * 2.0f; + return {diameter, diameter, diameter}; + } + case VolumetricShape::Cone: + return {depth, length, depth}; + case VolumetricShape::Cylinder: + return {width, length, width}; + case VolumetricShape::Box: + case VolumetricShape::Window: + break; + } + return {width, length, depth}; +} + +void pushVolumetricSizeToMesh(ECS::World& world, ECS::Entity entity, const EffectComponent& effect) { + const Vec3 scale = volumetricScaleForEffect(effect); + if (transformDrivesEffect(world, entity)) { + world.get(entity)->scale = scale; + return; + } + if (!world.has(entity)) world.add(entity); + world.get(entity)->scale = scale; +} + +void pullVolumetricSizeFromMesh(ECS::World& world, ECS::Entity entity, EffectComponent& effect) { + if (!world.has(entity)) return; + Vec3 scale{1.0f, 1.0f, 1.0f}; + if (transformDrivesEffect(world, entity)) scale = world.get(entity)->scale; + else if (const ECS::Scale3D* sized = world.get(entity)) scale = sized->scale; + const f32 sx = std::max(std::abs(scale.x), 0.05f); + const f32 sy = std::max(std::abs(scale.y), 0.05f); + const f32 sz = std::max(std::abs(scale.z), 0.05f); + switch (volumetricShapeOf(effect)) { + case VolumetricShape::Sphere: + effect.radius = sx * 0.5f; + effect.startSize = effect.radius; + effect.endSize = effect.radius; + break; + case VolumetricShape::Cone: + effect.radius = sy; + effect.endSize = sx; + break; + case VolumetricShape::Cylinder: + effect.radius = sy; + effect.startSize = sx; + effect.endSize = sx; + break; + case VolumetricShape::Box: + case VolumetricShape::Window: + effect.radius = sy; + effect.startSize = sx; + effect.endSize = sz; + break; + } +} + +void adoptVolumetricMesh(ECS::World& world, ECS::Entity entity, EffectComponent& effect) { + if (static_cast(effect.kind) != EffectKind::VolumetricLight) return; + if (world.has(entity)) world.remove(entity); + const ECS::MeshPrimitive primitive = volumetricMeshPrimitive(volumetricShapeOf(effect)); + const bool creating = !world.has(entity); + if (creating) { + ECS::MeshFilterComponent filter; + filter.primitive = primitive; + world.add(entity, filter); + if (effect.pad0 == 0) { + pushVolumetricSizeToMesh(world, entity, effect); + aimVolumetricMesh(world, entity, effect); + effect.pad0 = 1; + } + return; + } + if (ECS::MeshFilterComponent* filter = world.get(entity)) { + filter->primitive = primitive; + } + pushVolumetricSizeToMesh(world, entity, effect); + effect.pad0 = 1; +} + +void ensureVolumetricMesh(ECS::World& world, ECS::Entity entity, EffectComponent& effect) { + if (static_cast(effect.kind) != EffectKind::VolumetricLight) return; + if (!world.has(entity)) { + adoptVolumetricMesh(world, entity, effect); + return; + } + const ECS::MeshFilterComponent* filter = world.get(entity); + if (!filter) return; + const VolumetricShape shape = volumetricShapeOf(effect); + if (shape == VolumetricShape::Window && filter->primitive == ECS::MeshPrimitive::Cube) return; + VolumetricShape fromMesh = VolumetricShape::Sphere; + if (volumetricShapeForMesh(filter->primitive, fromMesh) && fromMesh != shape) { + effect.pad1 = static_cast(fromMesh); + } +} + void tickEffects(ECS::World& world, f32 dt, const Vec3& cameraPos) { ECS::ParticleSystem legacy; legacy.onUpdate(world, dt); @@ -387,26 +602,28 @@ void collectOverlayEffects(ECS::World& world, bool onlyTwoD, std::vector(effect.kind) == EffectKind::VolumetricLight && !onlyTwoD) { - const Vec3 origin = effectOrigin(world, entity, effect, {}); - const VolumetricShape shape = volumetricShapeOf(effect); - if (shape == VolumetricShape::Sphere) { + ensureVolumetricMesh(world, entity, effect); + const Mat4 matrix = effectMatrix(world, entity); + const Vec3 center = matrix.transformPoint(Vec3(0.0f, 0.0f, 0.0f)); + const Vec3 side = matrix.transformPoint(Vec3(0.5f, 0.0f, 0.0f)); + const f32 radius = std::max((side - center).length(), 0.1f); + const Vec4 color(effect.lightColor.x, effect.lightColor.y, effect.lightColor.z, + std::clamp(effect.density, 0.0f, 1.0f)); + if (volumetricShapeOf(effect) == VolumetricShape::Sphere) { EffectSprite sprite; - sprite.position = origin; - sprite.size = effect.radius; - sprite.color = Vec4(effect.lightColor.x, effect.lightColor.y, effect.lightColor.z, - std::clamp(effect.density, 0.0f, 1.0f)); + sprite.position = center; + sprite.size = radius; + sprite.color = color; out.push_back(sprite); } else { - const BeamAxes axes = beamAxes(world, entity); - const f32 length = std::max(effect.radius, 0.2f); + const Vec3 start = matrix.transformPoint(Vec3(0.0f, -0.5f, 0.0f)); + const Vec3 finish = matrix.transformPoint(Vec3(0.0f, 0.5f, 0.0f)); for (int step = 0; step < 5; ++step) { const f32 t = static_cast(step) / 4.0f; EffectSprite sprite; - sprite.position = origin + axes.forward * length * t; - const f32 width = effect.startSize + (effect.endSize - effect.startSize) * t; - sprite.size = std::max(width, 0.1f); - sprite.color = Vec4(effect.lightColor.x, effect.lightColor.y, effect.lightColor.z, - std::clamp(effect.density * (1.0f - t), 0.0f, 1.0f)); + sprite.position = start + (finish - start) * t; + sprite.size = radius; + sprite.color = color; out.push_back(sprite); } } @@ -467,6 +684,8 @@ void buildEffectMesh(ECS::World& world, const Vec3& cameraPos, const Vec3& camer pushQuad(mesh, particle.position, right, up, std::max(particle.size, 0.001f), particle.color); } } else if (kind == EffectKind::VolumetricLight) { + ensureVolumetricMesh(world, entity, effect); + if (!emitVolumetricMesh(world, entity, effect, cameraPos, mesh)) { const Vec3 center = effectOrigin(world, entity, effect, cameraPos); if (volumetricShapeOf(effect) == VolumetricShape::Sphere) { const Vec3 viewDir = cameraPos - center; @@ -485,6 +704,7 @@ void buildEffectMesh(ECS::World& world, const Vec3& cameraPos, const Vec3& camer } else { emitVolumetricShafts(world, entity, effect, center, cameraPos, mesh); } + } } else if (kind == EffectKind::Fog) { const Vec3 center = effectOrigin(world, entity, effect, cameraPos); emitFog(effect, center, false, [&](const Vec3& position, f32 size, const Vec4& color) { diff --git a/src/effects/EffectSystem.hpp b/src/effects/EffectSystem.hpp index 561bd07a..17a407c5 100644 --- a/src/effects/EffectSystem.hpp +++ b/src/effects/EffectSystem.hpp @@ -2,6 +2,7 @@ #include "assets/MeshTypes.hpp" #include "effects/EffectTypes.hpp" +#include "ecs/MeshComponents.hpp" #include "ecs/World.hpp" #include "math/Vec3.hpp" #include "math/Vec4.hpp" @@ -36,9 +37,23 @@ const std::vector* particlesFor(u32 entityId); void collectOverlayEffects(ECS::World& world, bool onlyTwoD, std::vector& out); /// Camera-facing quads. Colour is stored in the vertex tangent. +/// Volumetric lights are the entity mesh: scale, rotation and the primitive size the volume. void buildEffectMesh(ECS::World& world, const Vec3& cameraPos, const Vec3& cameraRight, const Vec3& cameraUp, Assets::Mesh3D& mesh); +ECS::MeshPrimitive volumetricMeshPrimitive(VolumetricShape shape); +bool volumetricShapeForMesh(ECS::MeshPrimitive primitive, VolumetricShape& shape); +Vec3 volumetricScaleForEffect(const EffectComponent& effect); + +/// Writes Length / Radius / Width onto the entity scale. +void pushVolumetricSizeToMesh(ECS::World& world, ECS::Entity entity, const EffectComponent& effect); +/// Reads the entity scale back into the effect fields so the inspector matches the gizmo. +void pullVolumetricSizeFromMesh(ECS::World& world, ECS::Entity entity, EffectComponent& effect); +/// Creates the mesh the first time. Later frames keep whatever primitive the user picked. +void ensureVolumetricMesh(ECS::World& world, ECS::Entity entity, EffectComponent& effect); +/// Format changes: switch the primitive and resize the mesh from the effect. +void adoptVolumetricMesh(ECS::World& world, ECS::Entity entity, EffectComponent& effect); + void applyMaterialReflection(f32 reflection, u8 budget, SurfaceShade& shade); void applyEffectShade(const EffectComponent& effect, SurfaceShade& shade); diff --git a/src/effects/EffectTypes.hpp b/src/effects/EffectTypes.hpp index bda48ede..80a42e53 100644 --- a/src/effects/EffectTypes.hpp +++ b/src/effects/EffectTypes.hpp @@ -47,6 +47,7 @@ struct EffectComponent { /// 0 inherit the scene mode, 1 probe, 2 planar, 3 screen-space. u8 reflectMode = 0; /// Fog style when kind is Fog. See EffectFogStyle. + /// Volumetric lights set this to 1 after the volume mesh has been created. u8 pad0 = 0; /// Volumetric light format when kind is VolumetricLight. See VolumetricShape. u8 pad1 = 0; diff --git a/src/render/GpuSceneRenderer.cpp b/src/render/GpuSceneRenderer.cpp index 7e9ea0a0..36170687 100644 --- a/src/render/GpuSceneRenderer.cpp +++ b/src/render/GpuSceneRenderer.cpp @@ -11,6 +11,7 @@ #include "editor/EditorContext.hpp" #include "editor/EditorCameraMath.hpp" #include "ecs/MeshComponents.hpp" +#include "ecs/MeshGeometry.hpp" #include "ecs/ComponentQuery.hpp" #include "scene/HierarchySystem.hpp" #include "scene/SceneComponents.hpp" @@ -875,10 +876,10 @@ void setVec4(float* out, f32 x, f32 y, f32 z, f32 w) { } /// Linear-space fallback sky used when the scene has no environment map. -const Vec3 kSkyZenith{0.16f, 0.30f, 0.62f}; -const Vec3 kSkyHorizon{0.58f, 0.66f, 0.76f}; -const Vec3 kSkyGround{0.16f, 0.15f, 0.14f}; -const Vec3 kFallbackAmbient{0.34f, 0.38f, 0.45f}; +const Vec3 kSkyZenith{0.53f, 0.74f, 0.95f}; +const Vec3 kSkyHorizon{0.94f, 0.96f, 0.98f}; +const Vec3 kSkyGround{0.72f, 0.80f, 0.88f}; +const Vec3 kFallbackAmbient{0.03f, 0.03f, 0.035f}; u32 probeMipCount(u32 resolution) { u32 mips = 1; @@ -1512,6 +1513,12 @@ std::vector GpuSceneRenderer::gatherMeshDraws( world.forEach(q, [&](ECS::Entity entity, ECS::MeshFilterComponent& filter) { if (Scene::isEffectivelyDisabled(world, entity)) return; if (options.excludeEntity.isValid() && entity == options.excludeEntity) return; + if (const Effects::EffectComponent* volume = world.get(entity)) { + if (volume->enabled && + volume->kind == static_cast(Effects::EffectKind::VolumetricLight)) { + return; + } + } const Mat4 worldMatrix = entityMatrix(world, entity); if (auto* terrain = world.get(entity)) { @@ -1544,13 +1551,13 @@ std::vector GpuSceneRenderer::gatherMeshDraws( return; } - Assets::Mesh3D* mesh = nullptr; - if (filter.primitive == ECS::MeshPrimitive::Custom) { + Assets::Mesh3D* mesh = ECS::editedMesh(world, entity); + if (!mesh && filter.primitive == ECS::MeshPrimitive::Custom) { if (!filter.customMeshPath.empty()) { mesh = Assets::MeshCache::getInstance().getMesh(filter.customMeshPath, projectRoot); } if (!mesh) return; - } else { + } else if (!mesh) { mesh = GpuProceduralMeshes::get(filter.primitive); } if (!mesh || mesh->vertices.empty()) return; @@ -2252,10 +2259,11 @@ u32 GpuSceneRenderer::renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& worl GpuSceneRenderOptions opts = options; if (options.resolveFeaturesFromScene) opts.features = resolveForwardRenderFeatures(world); resolveEnvironment(world, projectRoot, opts); - const ECS::PostProcessComponent post = + ECS::PostProcessComponent post = opts.resolvePostProcessFromScene ? resolvePostProcess(world, opts.postProcessCamera, opts.postProcess) : opts.postProcess; + if (opts.overrideAntiAliasing) post.antiAliasing = opts.antiAliasingOverride; const f32 scale = std::clamp(opts.renderScale, 0.25f, 2.0f); const u32 sceneW = std::max(1u, static_cast(std::lround(static_cast(width) * scale))); diff --git a/src/render/GpuSceneRenderer.hpp b/src/render/GpuSceneRenderer.hpp index aeb7ce85..93cc8510 100644 --- a/src/render/GpuSceneRenderer.hpp +++ b/src/render/GpuSceneRenderer.hpp @@ -65,8 +65,8 @@ struct GpuSceneRenderOptions { bool clipBelowEnabled = false; f32 clipBelowY = 0.0f; u32 colorLayer = 0; - /// Sky used for IBL and as the reflection fallback. An enabled SkyboxComponent in the - /// world wins when `resolveEnvironmentFromScene` is set. + /// Sky background / reflection fallback. An enabled SkyboxComponent in the world wins + /// when `resolveEnvironmentFromScene` is set. The sky does not light the scene unless IBL is on. std::string environmentPath; f32 environmentExposure = 1.0f; bool resolveEnvironmentFromScene = true; @@ -78,6 +78,10 @@ struct GpuSceneRenderOptions { bool resolvePostProcessFromScene = true; ECS::Entity postProcessCamera = ECS::Entity::INVALID; ECS::PostProcessComponent postProcess = PostProcessStack::defaults(); + /// When set, replaces anti-aliasing after the camera post stack is resolved. + /// Used by the editor viewport so it does not follow the game camera. + bool overrideAntiAliasing = false; + ECS::PostProcessAntiAliasing antiAliasingOverride{}; /// Internal resolution multiplier (0.5 = faster, 2 = supersampled). f32 renderScale = 1.0f; /// Keeps temporal history (TAA, eye adaptation, SSR) apart per viewport. 0 = derive from diff --git a/src/render/MaterialPreviewRenderer.cpp b/src/render/MaterialPreviewRenderer.cpp index 2625b656..20ae9e4c 100644 --- a/src/render/MaterialPreviewRenderer.cpp +++ b/src/render/MaterialPreviewRenderer.cpp @@ -307,6 +307,9 @@ bool MaterialPreviewRenderer::renderPlaced(RHI::CommandBuffer* cmd, const Assets options.features.maxReflectionProbes = 1; options.features.occlusion = OcclusionMode::Off; options.features.volumetrics = VolumetricQuality::Off; + options.features.iblEnabled = false; + options.features.iblDiffuse = 0.0f; + options.features.iblSpecular = 1.0f; m_renderer.renderWithCamera(cmd, m_world, camera, m_color, m_depth, pixelSize, pixelSize, projectRoot, options); diff --git a/src/render/RenderFeatures.hpp b/src/render/RenderFeatures.hpp index 9296d096..605de7b1 100644 --- a/src/render/RenderFeatures.hpp +++ b/src/render/RenderFeatures.hpp @@ -26,8 +26,9 @@ struct RenderFeatureSettings { u32 occlusionMaxOccluders = 8; f32 occlusionMinRadius = 0.75f; - bool iblEnabled = true; - f32 iblDiffuse = 1.0f; + /// Diffuse IBL (sky as lamp). Specular env reflections use `iblSpecular` independently. + bool iblEnabled = false; + f32 iblDiffuse = 0.0f; f32 iblSpecular = 1.0f; ReflectionMode reflections = ReflectionMode::Probe; diff --git a/src/render/shaders/effect_billboard.frag b/src/render/shaders/effect_billboard.frag index b184826a..8b61bdf1 100644 --- a/src/render/shaders/effect_billboard.frag +++ b/src/render/shaders/effect_billboard.frag @@ -2,11 +2,32 @@ layout(location = 0) in vec2 v_uv; layout(location = 1) in vec4 v_color; +layout(location = 2) in vec3 v_local; layout(location = 0) out vec4 outColor; void main() { float falloff; - if (v_uv.y > 1.5 && v_uv.x > 1.5) { + if (v_uv.x < -1000.0) { + vec3 cam = vec3(v_uv.y, v_color.a, v_uv.x + 1000000.0); + vec3 surf = v_local; + vec3 ray = surf - cam; + float rayLen = length(ray); + if (rayLen < 1e-4) discard; + vec3 dir = ray / rayLen; + vec3 invDir = vec3(abs(dir.x) > 1e-5 ? 1.0 / dir.x : 1e5, + abs(dir.y) > 1e-5 ? 1.0 / dir.y : 1e5, + abs(dir.z) > 1e-5 ? 1.0 / dir.z : 1e5); + vec3 tA = (vec3(-1.0) - surf) * invDir; + vec3 tB = (vec3(1.0) - surf) * invDir; + vec3 tFar = max(tA, tB); + float thickness = max(min(tFar.x, min(tFar.y, tFar.z)), 0.0); + float tClosest = clamp(-dot(surf, dir), 0.0, thickness); + float radial = length(surf + dir * tClosest); + falloff = exp(-radial * radial * 3.0) * clamp(thickness * 0.65, 0.0, 1.0); + if (falloff <= 0.02) discard; + outColor = vec4(v_color.rgb * falloff, falloff); + return; + } else if (v_uv.y > 1.5 && v_uv.x > 1.5) { float ax = abs(v_uv.x - 2.5) * 2.0; float ay = abs(v_uv.y - 2.5) * 2.0; falloff = 1.0 - smoothstep(0.55, 1.0, max(ax, ay)); diff --git a/src/render/shaders/effect_billboard.vert b/src/render/shaders/effect_billboard.vert index e831d20a..4bb45d87 100644 --- a/src/render/shaders/effect_billboard.vert +++ b/src/render/shaders/effect_billboard.vert @@ -12,9 +12,11 @@ layout(set = 1, binding = 0) uniform EffectVertexUBO { layout(location = 0) out vec2 v_uv; layout(location = 1) out vec4 v_color; +layout(location = 2) out vec3 v_local; void main() { v_uv = aTexCoord; v_color = aTangent; + v_local = aNormal; gl_Position = ubo.uMVP * vec4(aPosition, 1.0); } diff --git a/src/render/shaders/scene_lit.frag b/src/render/shaders/scene_lit.frag index 10601782..a4e76f54 100644 --- a/src/render/shaders/scene_lit.frag +++ b/src/render/shaders/scene_lit.frag @@ -428,29 +428,41 @@ vec3 specularRadiance(vec3 R, float roughness) { } void applyIbl(Surface s, inout vec3 diffuseOut, inout vec3 specularOut) { - if (lights.uIblParams.y < 0.5) return; + // Diffuse IBL (sky as fill light) is gated by uIblParams.y. + // Specular IBL (metals reflecting the sky / probes) stays on whenever an + // environment or probe is bound — the skybox is a reflection source, not a lamp. + bool diffuseIbl = lights.uIblParams.y > 0.5; + float specAmt = max(lights.uIblColor.a, 0.0); + bool envBound = lights.uExtra.z > 0.0 || lights.uIblParams.z > 0.5; + if (!diffuseIbl && specAmt <= 0.0) return; + if (!diffuseIbl && !envBound) return; + float NoV = max(dot(s.n, s.v), 1e-4); vec3 R = reflect(-s.v, s.n); vec3 specWeight = iridescentWeight(s, envBrdfApprox(s.F0, s.roughness, NoV)); vec3 kd = (1.0 - specWeight) * (1.0 - s.metallic) * (1.0 - s.transmission); - vec3 irradiance = sampleEnvironment(s.n, 1.0); - vec3 diffuse = kd * irradiance * s.albedo * max(lights.uIblParams.x, 0.0) * s.ao; - if (maxComponent(s.sheen) > 0.0) { - diffuse += s.sheen * irradiance * s.ao * mix(0.08, 0.5, pow(1.0 - NoV, 3.0)); + vec3 diffuse = vec3(0.0); + if (diffuseIbl) { + vec3 irradiance = sampleEnvironment(s.n, 1.0); + diffuse = kd * irradiance * s.albedo * max(lights.uIblParams.x, 0.0) * s.ao; + if (maxComponent(s.sheen) > 0.0) { + diffuse += s.sheen * irradiance * s.ao * mix(0.08, 0.5, pow(1.0 - NoV, 3.0)); + } } float specOcclusion = clamp(pow(NoV + s.ao, exp2(-16.0 * s.roughness - 1.0)) - 1.0 + s.ao, 0.0, 1.0); - vec3 spec = specWeight * specularRadiance(R, s.roughness) * max(lights.uIblColor.a, 0.0) * - specOcclusion; - - if (s.clearcoat > 0.0) { - float Fc = (0.04 + 0.96 * pow(1.0 - NoV, 5.0)) * s.clearcoat; - vec3 Rc = reflect(-s.v, normalize(v_normal)); - diffuse *= 1.0 - Fc; - spec = spec * (1.0 - Fc) + Fc * specularRadiance(Rc, s.clearcoatRoughness) * - max(lights.uIblColor.a, 0.0) * specOcclusion; + vec3 spec = vec3(0.0); + if (specAmt > 0.0 && (diffuseIbl || envBound)) { + spec = specWeight * specularRadiance(R, s.roughness) * specAmt * specOcclusion; + if (s.clearcoat > 0.0) { + float Fc = (0.04 + 0.96 * pow(1.0 - NoV, 5.0)) * s.clearcoat; + vec3 Rc = reflect(-s.v, normalize(v_normal)); + diffuse *= 1.0 - Fc; + spec = spec * (1.0 - Fc) + Fc * specularRadiance(Rc, s.clearcoatRoughness) * specAmt * + specOcclusion; + } } diffuseOut += diffuse; specularOut += spec; diff --git a/src/scene/EnvironmentSystem.cpp b/src/scene/EnvironmentSystem.cpp index d0ac486d..6e15be5d 100644 --- a/src/scene/EnvironmentSystem.cpp +++ b/src/scene/EnvironmentSystem.cpp @@ -2,6 +2,7 @@ #include #include +#include #ifdef __linux__ #include @@ -81,21 +82,47 @@ std::filesystem::path resolveBuiltinSkyboxPath(int presetIndex) { return {}; } +bool existingFile(const std::filesystem::path& path) { + std::error_code ec; + return !path.empty() && std::filesystem::exists(path, ec) && !ec; +} + std::filesystem::path resolveSkyboxTexturePath(const ECS::SkyboxComponent& sky, const std::string& projectRoot) { if (sky.customTexturePath[0] != '\0') { const std::filesystem::path custom(sky.customTexturePath); - std::error_code ec; - if (custom.is_absolute() && std::filesystem::exists(custom, ec)) { - return custom; - } + if (custom.is_absolute() && existingFile(custom)) return custom; if (!projectRoot.empty()) { const auto rooted = std::filesystem::path(projectRoot) / custom; - if (std::filesystem::exists(rooted, ec)) return rooted; + if (existingFile(rooted)) return rooted; } - if (std::filesystem::exists(custom, ec)) return custom; + if (existingFile(custom)) return custom; + return {}; + } + if (!projectRoot.empty() && sky.presetIndex >= 0 && sky.presetIndex < ECS::kSkyboxPresetCount) { + const auto fileName = std::filesystem::path(ECS::kSkyboxPresetFiles[sky.presetIndex]).filename(); + const auto imported = std::filesystem::path(projectRoot) / "assets" / "raw" / "sky" / fileName; + if (existingFile(imported)) return imported; + } + return {}; +} + +void importDefaultSkyboxes(const std::filesystem::path& projectRoot) { + if (projectRoot.empty()) return; + const std::filesystem::path assetsRoot = findEngineAssetsRoot(); + if (assetsRoot.empty()) return; + const std::filesystem::path destination = projectRoot / "assets" / "raw" / "sky"; + std::error_code ec; + std::filesystem::create_directories(destination, ec); + if (ec) return; + for (const char* relative : ECS::kSkyboxPresetFiles) { + if (!relative || std::strstr(relative, "kenney_skyboxes/") != relative) continue; + const std::filesystem::path source = assetsRoot / relative; + if (!existingFile(source)) continue; + const std::filesystem::path target = destination / std::filesystem::path(relative).filename(); + if (existingFile(target)) continue; + std::filesystem::copy_file(source, target, std::filesystem::copy_options::skip_existing, ec); } - return resolveBuiltinSkyboxPath(sky.presetIndex); } } // namespace Caffeine::Scene diff --git a/src/scene/EnvironmentSystem.hpp b/src/scene/EnvironmentSystem.hpp index bcbab504..20662da6 100644 --- a/src/scene/EnvironmentSystem.hpp +++ b/src/scene/EnvironmentSystem.hpp @@ -48,4 +48,7 @@ std::filesystem::path resolveBuiltinSkyboxPath(int presetIndex); std::filesystem::path resolveSkyboxTexturePath(const ECS::SkyboxComponent& sky, const std::string& projectRoot = ""); +/// Copies the engine's default sky images into assets/raw/sky. Missing files only. +void importDefaultSkyboxes(const std::filesystem::path& projectRoot); + } // namespace Caffeine::Scene diff --git a/src/script/EffectBindings.cpp b/src/script/EffectBindings.cpp index 4a3f1961..983ab10e 100644 --- a/src/script/EffectBindings.cpp +++ b/src/script/EffectBindings.cpp @@ -1,4 +1,5 @@ #include "caffeine/effects/EffectApi.hpp" +#include "effects/EffectSystem.hpp" #include #include @@ -27,12 +28,24 @@ void registerEffectScriptBindings(sol::state& lua, ECS::World** worldPtr) { }; effects["volumetric"] = [worldPtr](u32 entityId) { if (!worldPtr || !*worldPtr) return false; - return Effects::setVolumetricLight(**worldPtr, ECS::Entity(entityId, *worldPtr)); + ECS::World& world = **worldPtr; + const ECS::Entity entity(entityId, &world); + if (!Effects::setVolumetricLight(world, entity)) return false; + if (Effects::EffectComponent* effect = world.get(entity)) { + Effects::ensureVolumetricMesh(world, entity, *effect); + } + return true; }; effects["volumetricShape"] = [worldPtr](u32 entityId, u32 shape, u32 columns, u32 rows) { if (!worldPtr || !*worldPtr) return false; + ECS::World& world = **worldPtr; + const ECS::Entity entity(entityId, &world); const auto volumeShape = static_cast(std::min(shape, 4u)); - return Effects::setVolumetricShape(**worldPtr, ECS::Entity(entityId, *worldPtr), volumeShape, columns, rows); + if (!Effects::setVolumetricShape(world, entity, volumeShape, columns, rows)) return false; + if (Effects::EffectComponent* effect = world.get(entity)) { + Effects::adoptVolumetricMesh(world, entity, *effect); + } + return true; }; effects["fog"] = [worldPtr](u32 entityId, u32 domain, u32 style) { if (!worldPtr || !*worldPtr) return false; diff --git a/tests/cap_test_helpers.hpp b/tests/cap_test_helpers.hpp index 616d6051..ed9ee387 100644 --- a/tests/cap_test_helpers.hpp +++ b/tests/cap_test_helpers.hpp @@ -21,7 +21,7 @@ struct CapHeader { uint64_t tableOffset = 64; uint64_t tableSize = 0; uint64_t dataOffset = 0; - uint32_t totalSize = 0; + uint64_t totalSize = 0; uint64_t crc64 = 0; uint32_t reserved2 = 0; uint32_t reserved3 = 0; diff --git a/tests/test_editor.cpp b/tests/test_editor.cpp index 1733a624..77e7eb68 100644 --- a/tests/test_editor.cpp +++ b/tests/test_editor.cpp @@ -17,6 +17,9 @@ #include "../src/editor/SceneSerializer.hpp" #include "../src/editor/DragDropSystem.hpp" #include "../src/editor/ProjectManager.hpp" +#include "../src/editor/DefaultScene.hpp" +#include "../src/scene/EnvironmentSystem.hpp" +#include "../src/render/ForwardRenderFeatures.hpp" #include "../src/audio/AudioComponents.hpp" #include @@ -1103,3 +1106,58 @@ TEST_CASE("SceneTabManager - captureContext and applyContext sync state", "[edit mgr.applyContext(ctx); REQUIRE(ctx.isDirty == true); } + +TEST_CASE("populateDefaultScene - skybox, sun, camera 3D", "[editor][scene]") { + ECS::World world; + populateDefaultScene(world); + + REQUIRE(Scene::hasSceneSkybox(world)); + const Scene::ActiveSkybox sky = Scene::findActiveSkybox(world); + REQUIRE(sky.component != nullptr); + REQUIRE(sky.component->enabled); + REQUIRE(sky.component->presetIndex == 0); + REQUIRE(std::string(sky.component->customTexturePath) == ECS::kDefaultProjectSkyPath); + + bool sun = false; + ECS::ComponentQuery lights; + lights.with(); + world.forEach(lights, [&](ECS::Entity, ECS::DirectionalLightComponent&) { + sun = true; + }); + REQUIRE(sun); + + bool cam3d = false; + ECS::ComponentQuery cams; + cams.with(); + world.forEach(cams, [&](ECS::Entity e, ECS::Camera3DComponent&) { + cam3d = true; + REQUIRE(world.has(e)); + REQUIRE_FALSE(world.get(e)->is2D); + }); + REQUIRE(cam3d); + + const auto features = Render::resolveForwardRenderFeatures(world); + REQUIRE_FALSE(features.iblEnabled); + REQUIRE(features.iblSpecular == Approx(1.0f)); +} + +TEST_CASE("Undo restores names and default scene entities", "[editor][undo]") { + ECS::World world; + populateDefaultScene(world); + EditorContext ctx; + ctx.beginUndo(EditorCommand::SetField, 0, world); + setEntityName(world, Scene::findActiveSkybox(world).entity, "RenamedSky"); + ctx.endUndo(world); + REQUIRE(ctx.undoStack.canUndo()); + REQUIRE(ctx.undoStack.undo(world)); + const Scene::ActiveSkybox sky = Scene::findActiveSkybox(world); + REQUIRE(sky.component != nullptr); + REQUIRE(std::string(getEntityName(world, sky.entity)) == "Skybox"); + bool hasSun = false; + ECS::ComponentQuery lights; + lights.with(); + world.forEach(lights, [&](ECS::Entity, ECS::DirectionalLightComponent&) { + hasSun = true; + }); + REQUIRE(hasSun); +} diff --git a/tests/test_effects.cpp b/tests/test_effects.cpp index acea0454..ac576560 100644 --- a/tests/test_effects.cpp +++ b/tests/test_effects.cpp @@ -2,6 +2,9 @@ #include "caffeine/effects/EffectApi.hpp" #include "effects/EffectSystem.hpp" #include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/MeshComponents.hpp" +#include "ecs/MeshGeometry.hpp" #include "ecs/World.hpp" #include @@ -115,36 +118,68 @@ TEST_CASE("Fog fills 3D shells and dust stays on the 2D overlay", "[effects]") { REQUIRE(mesh.vertices.size() == volumeVerts); } -TEST_CASE("Window and cone volumetric lights build shafts along forward", "[effects]") { +TEST_CASE("Edited mesh geometry replaces the shared primitive", "[effects]") { World world; - Entity window = world.create(); - world.add(window); - EffectComponent panes; - configureVolumetricLight(panes, VolumetricShape::Window); - world.add(window, panes); - - Assets::Mesh3D mesh; - buildEffectMesh(world, Vec3(0.0f, 2.0f, 6.0f), Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f), mesh); - REQUIRE(mesh.vertices.size() > 64u); - f32 minZ = 0.0f; - for (const Assets::Vertex3D& vertex : mesh.vertices) minZ = std::min(minZ, vertex.position.z); - REQUIRE(minZ < -4.0f); + Entity box = world.create(); + MeshFilterComponent filter; + filter.primitive = MeshPrimitive::Cube; + world.add(box, filter); + REQUIRE(bakeMeshGeometry(world, box)); + MeshGeometryComponent* geometry = world.get(box); + REQUIRE(geometry != nullptr); + REQUIRE(geometry->positions.size() >= 8u); + const f32 y0 = geometry->positions[0].y; + geometry->positions[0].y = y0 + 1.5f; + geometry->revision++; + Assets::Mesh3D* mesh = editedMesh(world, box); + REQUIRE(mesh != nullptr); + REQUIRE(mesh->vertices[0].position.y == Approx(y0 + 1.5f).margin(0.001f)); + const std::vector face = faceVertexIndices(*geometry, 0); + REQUIRE(face.size() >= 3u); +} +TEST_CASE("Volumetric lights are the entity mesh", "[effects]") { + World world; Entity cone = world.create(); - world.add(cone); + world.add(cone); + world.add(cone); + world.add(cone); EffectComponent shaft; configureVolumetricLight(shaft, VolumetricShape::Cone); world.add(cone, shaft); + + Assets::Mesh3D mesh; + buildEffectMesh(world, Vec3(0.0f, 2.0f, 6.0f), Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f), mesh); + const MeshFilterComponent* filter = world.get(cone); + REQUIRE(filter != nullptr); + REQUIRE(filter->primitive == MeshPrimitive::Cone); + const Scale3D* scale = world.get(cone); + REQUIRE(scale != nullptr); + REQUIRE(scale->scale.y == Approx(8.0f).margin(0.01f)); + + f32 minZ = 1.0e9f; + f32 maxZ = -1.0e9f; + f32 baseRadius = 0.0f; + for (const Assets::Vertex3D& vertex : mesh.vertices) { + minZ = std::min(minZ, vertex.position.z); + maxZ = std::max(maxZ, vertex.position.z); + baseRadius = std::max(baseRadius, std::abs(vertex.position.x)); + } + REQUIRE(maxZ - minZ == Approx(8.0f).margin(0.05f)); + REQUIRE(baseRadius == Approx(0.8f).margin(0.05f)); + + world.get(cone)->scale.y = 3.0f; mesh.vertices.clear(); + mesh.indices.clear(); buildEffectMesh(world, Vec3(0.0f, 2.0f, 6.0f), Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f), mesh); - f32 nearRadius = 0.0f; - f32 farRadius = 0.0f; + minZ = 1.0e9f; + maxZ = -1.0e9f; for (const Assets::Vertex3D& vertex : mesh.vertices) { - const f32 radial = std::sqrt(vertex.position.x * vertex.position.x + vertex.position.y * vertex.position.y); - if (vertex.position.z > -0.4f) nearRadius = std::max(nearRadius, radial); - if (vertex.position.z < -shaft.radius + 0.6f) farRadius = std::max(farRadius, radial); + minZ = std::min(minZ, vertex.position.z); + maxZ = std::max(maxZ, vertex.position.z); } - REQUIRE(farRadius > nearRadius); + REQUIRE(maxZ - minZ == Approx(3.0f).margin(0.05f)); + REQUIRE(filter->primitive == MeshPrimitive::Cone); } TEST_CASE("Particle params can be set without wiping a 2D emitter", "[effects]") { diff --git a/tests/test_forward_render_features.cpp b/tests/test_forward_render_features.cpp index 4f806029..bb0c7bd6 100644 --- a/tests/test_forward_render_features.cpp +++ b/tests/test_forward_render_features.cpp @@ -16,8 +16,8 @@ TEST_CASE("Forward render features resolve from scene component", "[forwardrende const RenderFeatureSettings defaults = budgetSafeForwardDefaults(); REQUIRE(defaults.instancingEnabled); REQUIRE(defaults.maxInstancesPerBatch == 256u); - REQUIRE(defaults.iblEnabled); - REQUIRE(defaults.iblDiffuse == Approx(1.0f)); + REQUIRE_FALSE(defaults.iblEnabled); + REQUIRE(defaults.iblDiffuse == Approx(0.0f)); REQUIRE(defaults.iblSpecular == Approx(1.0f)); REQUIRE(defaults.occlusion == OcclusionMode::Off); REQUIRE(defaults.reflections == ReflectionMode::Probe); From 2f15857f82de155dd0dc34ae4010dcff2ee67192 Mon Sep 17 00:00:00 2001 From: LyeZinho Date: Sat, 3 Oct 2026 17:48:07 +0100 Subject: [PATCH 5/9] Changes --- apps/runtime/main.cpp | 2 + docs/plans/2026-10-03-unity-56-manual-gap.md | 136 ++ src/animation/AnimationComponents.hpp | 90 +- src/animation/AnimationSystem.hpp | 143 +- src/animation/SkeletalAnimation.hpp | 3 +- src/animation/SkinLibrary.cpp | 1565 ++++++++++++- src/animation/SkinLibrary.hpp | 176 +- src/assets/MeshCache.cpp | 14 +- src/assets/MeshImportValidator.cpp | 20 +- src/assets/MeshLoader.cpp | 303 ++- src/assets/MeshLoader.hpp | 1 + src/ecs/EnvironmentEffectsComponents.hpp | 51 + src/editor/AnimationEditorLink.hpp | 121 + src/editor/AnimationTimeline.cpp | 2077 ++++++++++++++++-- src/editor/AnimationTimeline.hpp | 59 +- src/editor/AnimatorController.cpp | 1971 ++++++++++++++--- src/editor/AnimatorController.hpp | 89 +- src/editor/AssetBrowser.cpp | 13 +- src/editor/BrowseSession.cpp | 4 +- src/editor/CameraPreviewPanel.cpp | 2 +- src/editor/CommandPalette.cpp | 195 +- src/editor/CommandPalette.hpp | 7 +- src/editor/ComponentRegistry.cpp | 47 +- src/editor/ComponentRegistry.hpp | 4 + src/editor/CurveWidget.hpp | 155 ++ src/editor/EditorContext.cpp | 2 +- src/editor/EditorContext.hpp | 17 +- src/editor/EditorPanelUtils.hpp | 37 + src/editor/EditorPreferences.cpp | 6 +- src/editor/EditorPreferences.hpp | 1 + src/editor/EditorShortcuts.hpp | 235 ++ src/editor/EffectEditorPanel.cpp | 54 +- src/editor/EffectObjectFactory.hpp | 2 +- src/editor/EntityPresetPackages.cpp | 6 + src/editor/EntityPresetTypes.hpp | 2 + src/editor/EntityPresetsPanel.cpp | 7 + src/editor/GameplayPreviewPanel.cpp | 36 +- src/editor/GameplayPreviewPanel.hpp | 3 + src/editor/HierarchyPanel.cpp | 139 +- src/editor/HudEditorPanel.cpp | 10 +- src/editor/ImGuiGpuTexture.hpp | 49 + src/editor/InspectorPanel.cpp | 904 ++++++-- src/editor/InspectorPanel.hpp | 1 + src/editor/InspectorWidgets.hpp | 17 +- src/editor/MaterialEditorPanel.cpp | 2 +- src/editor/ParticleEditorPanel.cpp | 32 +- src/editor/PluginSystem.cpp | 56 +- src/editor/PluginSystem.hpp | 5 + src/editor/ProjectManager.cpp | 38 +- src/editor/ProjectManager.hpp | 3 + src/editor/SceneEditor.cpp | 163 +- src/editor/SceneSerializer.cpp | 409 +++- src/editor/SceneSerializer.hpp | 7 +- src/editor/SceneViewport.cpp | 466 +++- src/editor/SceneViewport.hpp | 16 + src/editor/SettingsPanel.cpp | 107 +- src/editor/SettingsPanel.hpp | 1 + src/editor/TerrainEditorPanel.cpp | 6 +- src/editor/ToolboxPanel.hpp | 1 + src/editor/TransformGizmo.cpp | 10 +- src/render/GpuSceneRenderer.cpp | 23 +- src/render/GpuSceneRenderer.hpp | 5 + src/render/RenderFeatures.hpp | 2 +- src/render/shaders/scene_lit.frag | 54 +- src/rhi/RenderDevice.cpp | 21 +- src/rhi/RenderDevice.hpp | 4 + src/runtime/RuntimeSceneRenderer.cpp | 8 +- src/scene/EnvironmentEffectsSystem.hpp | 390 ++++ src/scene/LightingSystem.cpp | 8 +- src/scene/LightingSystem.hpp | 1 + src/script/ForwardRenderBindings.cpp | 2 +- 71 files changed, 9439 insertions(+), 1177 deletions(-) create mode 100644 docs/plans/2026-10-03-unity-56-manual-gap.md create mode 100644 src/ecs/EnvironmentEffectsComponents.hpp create mode 100644 src/editor/AnimationEditorLink.hpp create mode 100644 src/editor/CurveWidget.hpp create mode 100644 src/editor/EditorShortcuts.hpp create mode 100644 src/scene/EnvironmentEffectsSystem.hpp diff --git a/apps/runtime/main.cpp b/apps/runtime/main.cpp index dd52f4c3..c0df8a73 100644 --- a/apps/runtime/main.cpp +++ b/apps/runtime/main.cpp @@ -24,6 +24,7 @@ #include "ui/UISystem.hpp" #include "ui/UIRenderer.hpp" #include "scene/EnvironmentSystem.hpp" +#include "scene/EnvironmentEffectsSystem.hpp" #include "procedural/ProceduralWorldSystem.hpp" #include "render/SkyboxRenderer.hpp" #include "math/Mat4.hpp" @@ -521,6 +522,7 @@ int main(int argc, char** argv) { }); } Caffeine::Effects::tickEffects(world, dt, effectCamera); + Caffeine::Scene::tickEnvironmentEffects(world, dt, effectCamera); Caffeine::Navigation::updateNavigation(world, dt); physics.onUpdate(world, dt); if (scriptsReady) { diff --git a/docs/plans/2026-10-03-unity-56-manual-gap.md b/docs/plans/2026-10-03-unity-56-manual-gap.md new file mode 100644 index 00000000..de483755 --- /dev/null +++ b/docs/plans/2026-10-03-unity-56-manual-gap.md @@ -0,0 +1,136 @@ +# Caffeine contra o manual da Unity 5.6 + +Inventário do Doppio e do runtime em outubro de 2026, lido do código em `src/`. O critério é conseguir o trabalho que a página descreve, não copiar o nome do menu. + +| Temos | Parcial | Falta | Fora de escopo | +| ---: | ---: | ---: | ---: | +| 19 | 32 | 17 | 6 | + +## O que este plano não é + +Famílias legacy de shaders, Asset Store, serviços online, IL2CPP e cluster não entram na fila. O caminho gráfico já é PBR forward com HDR. O scripting é Lua, não C#. + +## Cobertura por capítulo + +Contagem de entradas deste inventário. Fora de escopo não entra nas barras. + +| Capítulo | Temos | Parcial | Falta | +| --- | ---: | ---: | ---: | +| Arranque | 1 | 1 | 0 | +| Assets | 1 | 2 | 1 | +| Janelas | 3 | 5 | 0 | +| Cena | 3 | 3 | 0 | +| Input e build | 0 | 2 | 2 | +| Editor | 1 | 1 | 0 | +| 2D | 1 | 2 | 2 | +| Luz e materiais | 3 | 4 | 4 | +| Terreno e efeitos | 1 | 2 | 1 | +| Física 3D | 2 | 1 | 1 | +| Scripting | 1 | 2 | 0 | +| UI | 1 | 1 | 2 | +| Navegação | 0 | 1 | 0 | +| Animação | 0 | 4 | 2 | +| Áudio | 0 | 1 | 1 | +| Rede e serviços | 0 | 0 | 1 | + +## Ordem de construção + +Para um editor em que se importa um personagem, se anima e se joga a cena. Não é a ordem do manual. + +| | Frente | O que fecha | +| ---: | --- | --- | +| 1 | Personagem visível e estável | Recarregar o glTF com a calibração de bind, confirmar Running no sítio do gizmo e o frame time sem o mesh de 17 km. | +| 2 | Animation Window a sério | Playhead que fica onde se larga, Key no tempo certo, curvas de rotação por osso e replay do clipe gravado. | +| 3 | Animator com parâmetros | Transições por float/bool/trigger, não só um estado por nome de clipe. | +| 4 | Import Settings do modelo | Escala, eixo, clipes e rig numa ficha do asset, em vez de adivinhar na carga. | +| 5 | Física de personagem | Character controller, mesh collider e um joint. Cloth e wheel ficam depois. | +| 6 | UI de jogo utilizável | Imagem, texto editável, scroll e um layout horizontal/vertical. | +| 7 | NavMesh | Bake a partir da geometria e um agente que anda até um ponto, acoplado ao animator. | +| 8 | Definições de projeto | Um sítio para física, tempo, qualidade, tags e input, como os managers da Unity. | + +## Lista do manual + +74 entradas. Fonte: árvore `src/` do Caffeine, não a documentação da Unity. Páginas irmãs, como cada shader legacy ou cada joint 2D, contam como uma lacuna só. + +| Capítulo | Página da Unity | Estado | No Caffeine | +| --- | --- | --- | --- | +| Arranque | Instalador e Learn tab | Fora de escopo | O Doppio compila por CMake. Não há hub nem tutoriais embutidos. | +| Arranque | Projeto 2D ou 3D | Temos | template_type no project.caffeine abre a viewport no modo certo. | +| Arranque | Deploy offline do editor | Parcial | Binário local, sem pacote de instalação nem ativação. | +| Assets | Primitivas (cubo, esfera, cilindro, cone) | Temos | Meshes procedurais partilhados, com geometria editável por entidade. | +| Assets | Importar modelos, texturas e materiais | Parcial | glTF/GLB/OBJ, PNG e .mat. FBX não é um importador de primeira classe. | +| Assets | Import Settings por asset | Falta | Sem aba de escala, rig, animações ou compressão na importação. | +| Assets | Asset Store e Standard Assets | Fora de escopo | Loja da Unity. O projeto recebe céus default em assets/raw/sky. | +| Assets | Pacotes de assets | Parcial | Prefabs e caf-pack. Não há .unitypackage. | +| Janelas | Project, Hierarchy, Inspector | Temos | Asset Browser, hierarquia e inspector de componentes. | +| Janelas | Scene View e navegação | Temos | Órbita, pan, zoom, Persp/Ortho, gizmo de eixos projetado. | +| Janelas | Mover, rodar e escalar | Temos | Gizmos no Toolbox, espaço local/mundo, snap. | +| Janelas | Barra da Scene View e menu Gizmos | Parcial | Toolbox no lugar da barra. Luzes e ossos desenham-se, sem menu para os ligar. | +| Janelas | Game View | Parcial | Gameplay Preview. Não é uma vista de jogo com resolução e stats próprias. | +| Janelas | Ícones, presets e pesquisa | Parcial | Presets de entidade e materiais. Sem ícones na hierarquia nem pesquisa global. | +| Janelas | Workspace e janelas do sistema | Parcial | Painéis saem para janela do SO. No Wayland o mapeamento ainda é frágil. | +| Janelas | Hotkeys do editor | Parcial | Ctrl+S grava, Ctrl+Z desfaz, T/E/R/Q no gizmo. Sem mapa completo. | +| Cena | Cenas, entidades e componentes | Temos | ECS com serializer do editor, undo por snapshot da cena. | +| Cena | Transform | Temos | 2D e 3D, posição, rotação e escala. | +| Cena | Desativar, tags e static | Parcial | Há disable efetivo. Tag existe vazio. Static e layers de render não existem. | +| Cena | Prefabs | Parcial | Gravar e instanciar. Sem overrides aninhados como na Unity. | +| Cena | Gravar a cena | Temos | Ctrl+S escreve a cena e os materiais. | +| Cena | Componentes por script | Parcial | Lua, não C#. Sem MonoBehaviour nem ordem de execução. | +| Input e build | Input de teclado, rato e gamepad | Parcial | Actions e eixos no código. Sem Input Manager editável. | +| Input e build | VR, OpenVR e input móvel | Falta | Sem dispositivos de VR nem teclado móvel. | +| Input e build | Build Settings e Player Settings | Parcial | Diálogo de build. Sem matriz de plataformas, splash ou qualidade por plataforma. | +| Input e build | Managers (física, tempo, tags, qualidade, gráficos) | Falta | Opções estão espalhadas. Não há ecrã de projeto equivalente. | +| Editor | Preferências e modo 2D/3D | Temos | Settings e viewport 2D, 3D e isométrica. AA do viewport é separado do jogo. | +| Editor | Pastas especiais e controlo de versões | Parcial | assets/raw e plugin de git. Sem Perforce nem export de package. | +| Editor | Visual Studio, RenderDoc, analytics, IME | Fora de escopo | Integrações do produto Unity. O editor tem consola e crash log próprios. | +| 2D | Sprites e sprite sheet | Parcial | Sprite, folha e clipe de frames. Sem Sprite Editor, outline, packer nem 9-slice. | +| 2D | Sorting Group | Falta | Sem ordenação de sprites por grupo. | +| 2D | Rigidbody 2D e colliders simples | Parcial | Corpo e collider caixa ou círculo. Sem polígono, aresta, cápsula nem composto. | +| 2D | Joints, effectors e material 2D | Falta | Nenhum dos joints nem effectors da lista. | +| 2D | Tilemap | Temos | Editor de tilemap, fora desta lista da Unity 5.6 mas já no Doppio. | +| Luz e materiais | Direcional, ponto e spot | Temos | Mais luz volumétrica como mesh editável. | +| Luz e materiais | Cookies, area light e Light Explorer | Falta | Sem textura de cookie nem janela de todas as luzes. | +| Luz e materiais | Sombras | Parcial | Sombra direcional no GPU. Sem shadowmask, baked nem luzes todas a projetar. | +| Luz e materiais | GI, lightmaps e light probes | Falta | Sem pré-cálculo. IBL difuso está desligado de propósito; especular reflete o céu. | +| Luz e materiais | Skybox de projeto | Temos | Assets em assets/raw/sky. Sem céu, o fallback é azul com horizonte branco. | +| Luz e materiais | Câmaras e frustum | Parcial | Câmara 2D/3D e pós na câmara. Sem várias câmaras, oblíquo nem occlusion culling. | +| Luz e materiais | Standard Shader / PBR | Temos | Albedo, metal, rugosidade, normal, AO, emissão, opacidade, transmissão, clearcoat, sheen. | +| Luz e materiais | Famílias legacy de shaders | Fora de escopo | Vertex-lit, bumped, parallax e reflective antigos. O caminho é PBR forward. | +| Luz e materiais | Reflection probes e SSR | Parcial | Probes automáticos por objeto e SSR. Sem probes colocados à mão. | +| Luz e materiais | HDR e linear | Temos | Cena HDR e texturas sRGB. Sem escolher gamma vs linear no projeto. | +| Luz e materiais | LOD, instancing e batching | Parcial | LOD de mesh e instancing parcial. Sem frame debugger nem stats de draw calls. | +| Luz e materiais | Compute, command buffers, sparse, cluster | Falta | O RHI tem command buffer interno. Nada disto está exposto ao jogo. | +| Luz e materiais | Vídeo | Falta | Sem Video Player. | +| Terreno e efeitos | Terreno: altura, tintas e LOD | Parcial | Esculpir, splat e chunks. Sem árvores, erva, vento nem SpeedTree. | +| Terreno e efeitos | Partículas | Parcial | Emissor simples e efeitos. Sem sistema modular da Unity. | +| Terreno e efeitos | Pós-processamento | Temos | AA, AO, SSR, fog, DOF, motion blur, exposure, bloom, grading, CA, grain, vigneta. | +| Terreno e efeitos | LUT, dithering, monitores e debug de pós | Falta | O stack existe. Faltam vistas de diagnóstico e LUT de utilizador. | +| Física 3D | Rigidbody e material simples | Temos | Dinâmico, cinemático, estático, fricção e restituição no corpo. | +| Física 3D | Box, sphere e capsule | Temos | Mais trigger. Sem mesh collider nem terrain collider dedicado na lista de componentes. | +| Física 3D | Joints, ragdoll, cloth e wheel | Falta | Nenhum joint, character controller, cloth nem roda. | +| Física 3D | Debug de física | Parcial | Overlay 2D. O 3D não tem a vista de debug da Unity. | +| Scripting | Scripts no inspector e eventos | Parcial | Lua com bindings. Sem corrotinas, UnityEvent nem serialização de campos de script. | +| Scripting | Consola | Temos | Console do editor e log de crash. | +| Scripting | Test runner e debugger | Parcial | Catch2 fora do editor. Sem debugger ligado ao jogo. | +| Scripting | IL2CPP e stripping | Fora de escopo | O runtime já é C++ nativo. | +| UI | Canvas, rect, botão, texto, slider, checkbox | Temos | UI retida com layout básico. | +| UI | Image, mask, dropdown, input, scroll e layout groups | Falta | Sem auto-layout, scaler, máscara nem campo de texto. | +| UI | UI de mundo e várias resoluções | Falta | Sem canvas world-space nem transições de ecrã. | +| UI | IMGUI | Parcial | O editor é ImGui. O jogo não expõe OnGUI. | +| Navegação | NavMesh, agente, obstáculo e links | Parcial | Grelha NavVolume e agente. Sem bake de malha, áreas, custos nem off-mesh. | +| Animação | Clipes importados de glTF | Parcial | Running/Walking entram. A escala cm/m do armature partia o mesh; a calibração de bind corrige isso na próxima carga. | +| Animação | Avatar humanoide | Parcial | Mapeamento automático e manual de ossos. Sem músculos nem avatar asset. | +| Animação | Animation Window | Parcial | Timeline com ossos e objeto. Keyframes ainda não são curvas editáveis, e o tempo do playhead não é fiável. | +| Animação | Animator: estados, parâmetros, transições | Parcial | Grafo de estados a partir dos clipes. Sem parâmetros, blend trees, layers, IK nem root motion. | +| Animação | Máscaras, eventos, split e retarget | Falta | Sem avatar mask, animation events nem retarget entre personagens. | +| Animação | Importador FBX de rig | Falta | Sem abas Rig e Animations da Unity. | +| Áudio | Clip e fonte | Parcial | AudioEmitter e preview. Sem listener como componente de cena completo. | +| Áudio | Mixer, filtros, zonas e microfone | Falta | Sem Audio Mixer nem reverb zones. | +| Rede e serviços | HLAPI, lobby, transport e serviços | Fora de escopo | Rede da Unity e Unity Services. Não são o núcleo do editor. | +| Rede e serviços | VR e cluster | Falta | Sem render em cluster nem câmaras de VR. | + +## Leitura rápida + +Já dá para trabalhar: cena, hierarquia, inspector, gizmos, materiais PBR, céu do projeto, pós-processamento, luzes, terreno básico, prefabs simples, física de primitivas e UI mínima. + +Está pela metade e é o que se sente no editor: importação de personagens, timeline, animator, sombras, probes, partículas, navegação em grelha, áudio e as definições de projeto. diff --git a/src/animation/AnimationComponents.hpp b/src/animation/AnimationComponents.hpp index 07b39af6..3d1ee7d2 100644 --- a/src/animation/AnimationComponents.hpp +++ b/src/animation/AnimationComponents.hpp @@ -71,11 +71,37 @@ struct TransitionCondition { }; }; +enum class KeyInterp : u8 { + Linear, + Constant, + EaseIn, + EaseOut, + EaseInOut, + Custom +}; + +/// Shape of a segment or a fade. Custom uses a cubic Bezier with x in [0, 1]. +struct KeyCurve { + KeyInterp mode = KeyInterp::Linear; + f32 x1 = 0.33f; + f32 y1 = 0.33f; + f32 x2 = 0.67f; + f32 y2 = 0.67f; +}; + +/// Reserved transition target: the layer leaves through Exit and re-enters at its default state. +inline constexpr const char* kAnimatorExitState = "Exit"; + struct AnimationTransition { FixedString<32> toState; std::vector conditions; // all must be satisfied f32 blendTime = 0.1f; bool hasExitTime = false; + /// Normalized source time the transition may fire at, when hasExitTime is set. + f32 exitTime = 1.0f; + /// Normalized time the target state starts at. + f32 offset = 0.0f; + KeyCurve blendCurve; std::function legacyCondition; }; @@ -85,15 +111,73 @@ struct AnimationState { const AnimationClip* clip = nullptr; f32 speed = 1.0f; std::vector transitions; + /// Imported skeletal clip this state plays. Empty means a clip with the state's own name. + FixedString<32> motion; + f32 editorX = 0.0f; + f32 editorY = 0.0f; + bool hasEditorPosition = false; }; -struct Animator { - // Clip storage for deserialized scenes (state.clip may point here). - std::vector embeddedClips; +/// One state graph. The Animator is the base layer; extra layers carry their own graph. +struct AnimatorStateMachine { HashMap, AnimationState> states; FixedString<32> currentState; FixedString<32> previousState; + /// Entry points here. Play mode starts in this state. + FixedString<32> defaultState; f32 timeInState = 0.0f; + /// Checked before the current state's own transitions, from any state. + std::vector anyStateTransitions; + + /// Crossfade from the previous state. The pose blends while fadeElapsed < fadeDuration. + FixedString<32> fadeFromState; + f32 fadeFromTime = 0.0f; + f32 fadeElapsed = 0.0f; + f32 fadeDuration = 0.0f; + KeyCurve fadeCurve; + + f32 entryX = 40.0f, entryY = 120.0f; + f32 anyX = 40.0f, anyY = 40.0f; + f32 exitX = 40.0f, exitY = 220.0f; + + bool fading() const { return fadeDuration > 0.0f && fadeElapsed < fadeDuration && !fadeFromState.empty(); } +}; + +enum class LayerBlendMode : u8 { + Override, + Additive +}; + +/// Body regions a layer mask can include. Bits of AnimatorLayer::mask. +enum class BodyMask : u32 { + Root = 1u << 0, + Body = 1u << 1, + Head = 1u << 2, + LeftArm = 1u << 3, + RightArm = 1u << 4, + LeftLeg = 1u << 5, + RightLeg = 1u << 6, + All = 0x7Fu +}; + +struct AnimatorLayer : AnimatorStateMachine { + FixedString<32> name; + /// Group this layer sits under in the layer tree. Empty is the top level. + FixedString<32> parentGroup; + /// Groups hold other layers and scale their weight. They have no graph of their own. + bool isGroup = false; + bool muted = false; + bool expanded = true; + f32 weight = 1.0f; + LayerBlendMode blend = LayerBlendMode::Override; + u32 mask = static_cast(BodyMask::All); +}; + +struct Animator : AnimatorStateMachine { + // Clip storage for deserialized scenes (state.clip may point here). + std::vector embeddedClips; + /// Layers above the base graph, in evaluation order. + std::vector layers; f32 blendWeight = 1.0f; f32 playbackScale = 1.0f; bool paused = false; diff --git a/src/animation/AnimationSystem.hpp b/src/animation/AnimationSystem.hpp index 92e4870d..a6549ab4 100644 --- a/src/animation/AnimationSystem.hpp +++ b/src/animation/AnimationSystem.hpp @@ -9,7 +9,9 @@ #include "ecs/Components.hpp" #include "ecs/ComponentQuery.hpp" +#include #include +#include namespace Caffeine::Animation { @@ -65,6 +67,107 @@ class AnimationSystem : public ECS::ISystem { checkFrameEvents(anim, frame); } }); + + ECS::ComponentQuery skeletal; + skeletal.with(); + world.forEach(skeletal, [&world, dt](ECS::Entity entity, Animator& anim) { + if (world.has(entity) || anim.paused) return; + const SkinnedPose* pose = world.get(entity); + const ImportedSkin* skin = pose ? findImportedSkin(pose->meshPath) : nullptr; + stepStateMachine(anim, dt, [skin](const AnimatorStateMachine& sm, const FixedString<32>& name) { + return skeletalStateDuration(skin, sm, name); + }); + }); + } + + using StateDurationFn = std::function&)>; + + /// Advances the base graph and every layer. Skeletal poses read the result in tickSkinnedPoses. + static void stepStateMachine(Animator& anim, f32 dt, const StateDurationFn& durationOf) { + bool fired = stepLayer(anim, anim, dt, durationOf); + for (AnimatorLayer& layer : anim.layers) { + if (layer.isGroup) continue; + fired = stepLayer(anim, layer, dt, durationOf) || fired; + } + if (fired) consumeTriggers(anim); + } + + /// Single-duration form: every state of the base graph lasts `stateDuration`. + static void stepStateMachine(Animator& anim, f32 dt, f32 stateDuration) { + stepStateMachine(anim, dt, [stateDuration](const AnimatorStateMachine&, const FixedString<32>&) { + return stateDuration; + }); + } + + static f32 skeletalStateDuration(const ImportedSkin* skin, const AnimatorStateMachine& sm, + const FixedString<32>& name) { + if (!skin || name.empty()) return 0.0f; + const AnimationState* state = sm.states.get(name); + const i32 clip = clipForAnimatorState(*skin, name.cStr(), state ? state->motion.cStr() : nullptr); + if (clip < 0 || clip >= static_cast(skin->clips.size())) return 0.0f; + return skin->clips[static_cast(clip)].duration; + } + + /// Moves a graph to `target` with a crossfade. Exit sends it back through Entry to the default state. + static void enterState(AnimatorStateMachine& sm, const AnimationTransition& transition, + const StateDurationFn& durationOf) { + FixedString<32> target = transition.toState; + if (target == FixedString<32>(kAnimatorExitState)) target = sm.defaultState; + if (target.empty() || !sm.states.contains(target)) return; + if (transition.blendTime > 0.0f && !sm.currentState.empty()) { + sm.fadeFromState = sm.currentState; + sm.fadeFromTime = sm.timeInState; + sm.fadeElapsed = 0.0f; + sm.fadeDuration = transition.blendTime; + sm.fadeCurve = transition.blendCurve; + } else { + sm.fadeFromState = FixedString<32>(); + sm.fadeDuration = 0.0f; + } + sm.previousState = sm.currentState; + sm.currentState = target; + const f32 duration = durationOf ? durationOf(sm, target) : 0.0f; + sm.timeInState = duration > 0.0f ? std::clamp(transition.offset, 0.0f, 1.0f) * duration : 0.0f; + } + + static bool stepLayer(Animator& anim, AnimatorStateMachine& sm, f32 dt, const StateDurationFn& durationOf) { + if (sm.currentState.empty()) { + if (sm.defaultState.empty()) return false; + sm.currentState = sm.defaultState; + sm.timeInState = 0.0f; + sm.fadeDuration = 0.0f; + } + const AnimationState* state = sm.states.get(sm.currentState); + const f32 speed = state ? state->speed : 1.0f; + const f32 step = dt * anim.playbackScale; + sm.timeInState += step * speed; + if (sm.fadeDuration > 0.0f) { + const AnimationState* from = sm.states.get(sm.fadeFromState); + sm.fadeFromTime += step * (from ? from->speed : 1.0f); + sm.fadeElapsed += step; + if (sm.fadeElapsed >= sm.fadeDuration) { + sm.fadeDuration = 0.0f; + sm.fadeElapsed = 0.0f; + sm.fadeFromState = FixedString<32>(); + } + } + const f32 duration = durationOf ? durationOf(sm, sm.currentState) : -1.0f; + for (const AnimationTransition& transition : sm.anyStateTransitions) { + if (transition.toState == sm.currentState) continue; + if (transitionReady(transition, anim, sm.timeInState, duration)) { + enterState(sm, transition, durationOf); + return true; + } + } + if (!state) return false; + for (const AnimationTransition& transition : state->transitions) { + if (transitionReady(transition, anim, sm.timeInState, duration)) { + const AnimationTransition chosen = transition; + enterState(sm, chosen, durationOf); + return true; + } + } + return false; } void play(ECS::World& world, ECS::Entity e, const char* stateName) { @@ -184,32 +287,30 @@ class AnimationSystem : public ECS::ISystem { } } - static void evaluateTransitions(Animator& anim) { + /// Exit time is normalized: 1 waits for the clip's end. With no conditions the exit time alone fires it. + static bool transitionReady(const AnimationTransition& t, const Animator& anim, f32 timeInState, f32 duration) { + if (t.hasExitTime && duration > 0.0f) { + if (timeInState < std::max(t.exitTime, 0.0f) * duration) return false; + } + if (t.conditions.empty() && !t.legacyCondition) return t.hasExitTime; + if (!t.conditions.empty()) { + for (const auto& cond : t.conditions) { + if (!evaluateCondition(cond, anim)) return false; + } + return true; + } + return t.legacyCondition(); + } + + static void evaluateTransitions(Animator& anim, f32 stateDuration = -1.0f) { const AnimationState* state = anim.states.get(anim.currentState); if (!state) return; + const f32 duration = stateDuration >= 0.0f ? stateDuration : (state->clip ? state->clip->duration() : 0.0f); for (const auto& t : state->transitions) { - if (t.hasExitTime && state->clip) { - if (anim.timeInState < state->clip->duration()) continue; - } - - bool conditionsMet = false; - - if (!t.conditions.empty()) { - conditionsMet = true; - for (const auto& cond : t.conditions) { - if (!evaluateCondition(cond, anim)) { - conditionsMet = false; - break; - } - } - } else if (t.legacyCondition) { - conditionsMet = t.legacyCondition(); - } - - if (conditionsMet) { + if (transitionReady(t, anim, anim.timeInState, duration)) { anim.previousState = anim.currentState; - anim.currentState = t.toState; + anim.currentState = t.toState == FixedString<32>(kAnimatorExitState) ? anim.defaultState : t.toState; anim.timeInState = 0.0f; consumeTriggers(anim); return; diff --git a/src/animation/SkeletalAnimation.hpp b/src/animation/SkeletalAnimation.hpp index 56308da4..6b9bca2b 100644 --- a/src/animation/SkeletalAnimation.hpp +++ b/src/animation/SkeletalAnimation.hpp @@ -250,7 +250,8 @@ inline void SkeletalClip::sampleAt(f32 time, const Skeleton& skeleton, std::vect jointPositions->resize(boneCount); for (u32 boneIdx = 0; boneIdx < boneCount; ++boneIdx) { const Mat4& world = worldMatrices[boneIdx]; - (*jointPositions)[boneIdx] = Vec3(world(0, 3), world(1, 3), world(2, 3)); + (*jointPositions)[boneIdx] = skeleton.skinSpace.transformPoint( + Vec3(world(0, 3), world(1, 3), world(2, 3))); } } } diff --git a/src/animation/SkinLibrary.cpp b/src/animation/SkinLibrary.cpp index 2bc91c8a..76136be8 100644 --- a/src/animation/SkinLibrary.cpp +++ b/src/animation/SkinLibrary.cpp @@ -1,14 +1,27 @@ #include "animation/SkinLibrary.hpp" #include "assets/MeshCache.hpp" +#include "assets/MeshLoader.hpp" #include "ecs/ComponentQuery.hpp" +#include "math/Quat.hpp" #include #include +#include +#include +#include #include +#include +#include +#include +#include #include namespace Caffeine::Animation { + +void skinVertices(const Assets::Mesh3D& bind, const std::vector& bones, + std::vector& out); + namespace { std::unordered_map g_skins; @@ -17,6 +30,84 @@ std::unordered_map> g_joints; std::unordered_map> g_jointParents; std::string g_projectRoot; +std::unordered_map g_stamp; +std::unordered_map g_generation; +u64 g_skinRevision = 1; +/// Animated bone locals before authored offsets. The gizmo builds bone frames from these. +std::unordered_map> g_animLocal; +u64 g_frame = 1; + +void dropEntityPose(u32 id) { + g_posed.erase(id); + g_joints.erase(id); + g_jointParents.erase(id); + g_stamp.erase(id); + g_generation.erase(id); + g_animLocal.erase(id); +} + +u32 floatBits(f32 value) { + u32 bits = 0; + std::memcpy(&bits, &value, sizeof(bits)); + return bits; +} + +struct PoseHasher { + u64 hash = 1469598103934665603ull; + void mix(u32 bits) { + hash ^= bits; + hash *= 1099511628211ull; + } + void mixF(f32 value) { mix(floatBits(value)); } +}; + +u64 hashPoseInputs(const SkinnedPose& pose, const std::vector& mix, u8 mode) { + PoseHasher h; + h.mix(mode); + h.mix(static_cast(pose.offsets.size())); + for (const BonePose& offset : pose.offsets) { + h.mixF(offset.rotation.x); + h.mixF(offset.rotation.y); + h.mixF(offset.rotation.z); + h.mixF(offset.translation.x); + h.mixF(offset.translation.y); + h.mixF(offset.translation.z); + } + h.mix(static_cast(mix.size())); + for (const PoseLayerMix& layer : mix) { + h.mixF(layer.weight); + h.mix(layer.mask | (layer.additive ? 0x80000000u : 0u)); + h.mix(static_cast(layer.samples.size())); + for (const PoseSample& sample : layer.samples) { + h.mix(static_cast(sample.clip)); + h.mixF(sample.time); + h.mixF(sample.weight); + h.mixF(sample.loopBlend); + h.mix(sample.loop ? 1u : 0u); + } + } + for (i32 bone : pose.removedBones) h.mix(static_cast(bone)); + for (int slot = 0; slot < static_cast(HumanoidBone::Count); ++slot) h.mix(static_cast(pose.humanoid.bones[slot])); + return h.hash; +} + +bool poseCacheHit(u32 id, u64 hash) { + const auto it = g_stamp.find(id); + return it != g_stamp.end() && it->second == hash; +} + +void storePoseCache(u32 id, u64 hash, bool hasPosedVertices) { + g_stamp[id] = hash; + if (hasPosedVertices) { + u64& generation = g_generation[id]; + generation = generation == 0 ? 1 : generation + 1; + ++g_skinRevision; + } else { + g_generation[id] = 0; + ++g_skinRevision; + } +} + std::string normalizedBone(const std::string& name) { const auto cut = name.find_last_of(":|"); const std::string tail = cut == std::string::npos ? name : name.substr(cut + 1); @@ -60,19 +151,513 @@ bool tokenMatches(const std::string& bone, const char* token) { return bone.size() > needle.size() && bone.compare(bone.size() - needle.size(), needle.size(), needle) == 0; } +Vec3 lerpPose(const Vec3& a, const Vec3& b, f32 t) { + return {a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t}; +} + +void samplePoseKeys(SkinnedPose& pose, u32 boneCount, f32 time) { + std::vector sampled(boneCount); + for (u32 bone = 0; bone < boneCount; ++bone) { + const BoneKeyframe* before = nullptr; + const BoneKeyframe* after = nullptr; + for (const BoneKeyframe& key : pose.keys) { + if (key.bone != static_cast(bone)) continue; + if (key.time <= time + 0.0001f) { + if (!before || key.time >= before->time) before = &key; + } else if (!after || key.time < after->time) { + after = &key; + } + } + if (before && after && after->time > before->time) { + const f32 alpha = evaluateKeyCurve( + before->curve, std::clamp((time - before->time) / (after->time - before->time), 0.0f, 1.0f)); + sampled[bone].rotation = lerpPose(before->rotation, after->rotation, alpha); + sampled[bone].translation = lerpPose(before->translation, after->translation, alpha); + } else if (before) { + sampled[bone].rotation = before->rotation; + sampled[bone].translation = before->translation; + } else if (after) { + sampled[bone].rotation = after->rotation; + sampled[bone].translation = after->translation; + } + } + pose.offsets = std::move(sampled); +} + +struct LocalTRS { + Vec3 t{}; + Quat r = Quat::identity(); + Vec3 s{1.0f, 1.0f, 1.0f}; +}; + +Mat4 trsMatrix(const LocalTRS& trs) { + return Mat4::translation(trs.t) * trs.r.toMatrix() * Mat4::scale(trs.s.x, trs.s.y, trs.s.z); +} + +const std::vector& restPoseFor(const Skeleton& skeleton) { + static std::unordered_map> cache; + std::vector& rest = cache[&skeleton]; + if (rest.size() == skeleton.boneCount()) return rest; + rest.resize(skeleton.boneCount()); + for (u32 bone = 0; bone < skeleton.boneCount(); ++bone) { + const Mat4& m = skeleton.bones[bone].localTransform; + LocalTRS& out = rest[bone]; + out.t = Vec3(m(0, 3), m(1, 3), m(2, 3)); + out.s = Vec3(Vec3(m(0, 0), m(1, 0), m(2, 0)).length(), Vec3(m(0, 1), m(1, 1), m(2, 1)).length(), + Vec3(m(0, 2), m(1, 2), m(2, 2)).length()); + out.r = Quat::fromMatrix(m).normalized(); + } + return rest; +} + +void blendTRS(LocalTRS& into, const LocalTRS& sample, f32 weight) { + if (weight <= 0.0f) return; + if (weight >= 1.0f) { + into = sample; + return; + } + into.t = into.t + (sample.t - into.t) * weight; + into.s = into.s + (sample.s - into.s) * weight; + into.r = Quat::slerp(into.r, sample.r, weight).normalized(); +} + +f32 wrapClipTime(f32 time, f32 duration, bool loop) { + if (duration <= 0.0f) return 0.0f; + if (loop) { + f32 t = std::fmod(time, duration); + if (t < 0.0f) t += duration; + return t; + } + return std::clamp(time, 0.0f, duration); +} + +void sampleClipLocal(const SkeletalClip& clip, f32 time, const Skeleton& skeleton, + const std::vector& rest, std::vector& out) { + const u32 boneCount = skeleton.boneCount(); + out.resize(boneCount); + for (u32 bone = 0; bone < boneCount; ++bone) { + const std::vector* keys = clip.channels.get(bone); + if (!keys || keys->empty()) { + out[bone] = rest[bone]; + continue; + } + const std::vector& kf = *keys; + LocalTRS& trs = out[bone]; + if (time <= kf.front().time || kf.size() == 1) { + trs = {kf.front().position, kf.front().rotation, kf.front().scale}; + continue; + } + if (time >= kf.back().time) { + trs = {kf.back().position, kf.back().rotation, kf.back().scale}; + continue; + } + const auto upper = std::upper_bound(kf.begin(), kf.end(), time, + [](f32 t, const SkeletalKeyframe& key) { return t < key.time; }); + const SkeletalKeyframe& b = *upper; + const SkeletalKeyframe& a = *(upper - 1); + const f32 span = b.time - a.time; + const f32 alpha = span > 0.0f ? (time - a.time) / span : 0.0f; + trs.t = a.position + (b.position - a.position) * alpha; + trs.s = a.scale + (b.scale - a.scale) * alpha; + trs.r = Quat::slerp(a.rotation, b.rotation, alpha).normalized(); + } +} + +void samplePoseSample(const ImportedSkin& skin, const PoseSample& sample, const std::vector& rest, + std::vector& out, std::vector& scratch) { + const SkeletalClip& clip = skin.clips[static_cast(sample.clip)]; + const f32 duration = std::max(clip.duration, 0.0f); + const f32 t = wrapClipTime(sample.time, duration, sample.loop); + sampleClipLocal(clip, t, skin.skeleton, rest, out); + const f32 window = std::min(sample.loopBlend, duration * 0.5f); + if (sample.loop && window > 0.0f && t > duration - window) { + sampleClipLocal(clip, 0.0f, skin.skeleton, rest, scratch); + const f32 w = (t - (duration - window)) / window; + for (size_t bone = 0; bone < out.size(); ++bone) blendTRS(out[bone], scratch[bone], w); + } +} + +/// Body region of each bone: the nearest mapped humanoid bone above it decides. +void bodyPartsFor(const ImportedSkin& skin, const HumanoidRig& rig, std::vector& parts) { + const u32 boneCount = skin.skeleton.boneCount(); + parts.assign(boneCount, static_cast(BodyMask::All)); + if (!rig.matched) return; + std::vector direct(boneCount, 0u); + auto setPart = [&](HumanoidBone slot, BodyMask part) { + const i32 bone = rig.bones[static_cast(slot)]; + if (bone >= 0 && bone < static_cast(boneCount)) direct[static_cast(bone)] = static_cast(part); + }; + setPart(HumanoidBone::Hips, BodyMask::Root); + setPart(HumanoidBone::Spine, BodyMask::Body); + setPart(HumanoidBone::Chest, BodyMask::Body); + setPart(HumanoidBone::Neck, BodyMask::Head); + setPart(HumanoidBone::Head, BodyMask::Head); + setPart(HumanoidBone::LeftUpperArm, BodyMask::LeftArm); + setPart(HumanoidBone::LeftLowerArm, BodyMask::LeftArm); + setPart(HumanoidBone::LeftHand, BodyMask::LeftArm); + setPart(HumanoidBone::RightUpperArm, BodyMask::RightArm); + setPart(HumanoidBone::RightLowerArm, BodyMask::RightArm); + setPart(HumanoidBone::RightHand, BodyMask::RightArm); + setPart(HumanoidBone::LeftUpperLeg, BodyMask::LeftLeg); + setPart(HumanoidBone::LeftLowerLeg, BodyMask::LeftLeg); + setPart(HumanoidBone::LeftFoot, BodyMask::LeftLeg); + setPart(HumanoidBone::RightUpperLeg, BodyMask::RightLeg); + setPart(HumanoidBone::RightLowerLeg, BodyMask::RightLeg); + setPart(HumanoidBone::RightFoot, BodyMask::RightLeg); + for (u32 bone = 0; bone < boneCount; ++bone) { + u32 part = static_cast(BodyMask::Root); + i32 walk = static_cast(bone); + for (u32 guard = 0; walk >= 0 && walk < static_cast(boneCount) && guard < boneCount; ++guard) { + if (direct[static_cast(walk)] != 0u) { + part = direct[static_cast(walk)]; + break; + } + walk = skin.skeleton.bones[static_cast(walk)].parentIndex; + } + parts[bone] = part; + } +} + +void evaluateMix(const ImportedSkin& skin, const SkinnedPose& pose, const std::vector& mix, + std::vector& result) { + const std::vector& rest = restPoseFor(skin.skeleton); + result = rest; + std::vector layerPose; + std::vector sampled; + std::vector scratch; + std::vector parts; + const i32 clipCount = static_cast(skin.clips.size()); + for (size_t layerIndex = 0; layerIndex < mix.size(); ++layerIndex) { + const PoseLayerMix& layer = mix[layerIndex]; + if (layer.weight <= 0.0f) continue; + bool any = false; + layerPose = rest; + for (const PoseSample& sample : layer.samples) { + if (sample.clip < 0 || sample.clip >= clipCount || sample.weight <= 0.0f) continue; + samplePoseSample(skin, sample, rest, sampled, scratch); + for (size_t bone = 0; bone < layerPose.size(); ++bone) blendTRS(layerPose[bone], sampled[bone], sample.weight); + any = true; + } + if (!any) continue; + const bool masked = (layer.mask & static_cast(BodyMask::All)) != static_cast(BodyMask::All); + if (masked && parts.empty()) bodyPartsFor(skin, pose.humanoid, parts); + for (size_t bone = 0; bone < result.size(); ++bone) { + const f32 w = (masked && (parts[bone] & layer.mask) == 0u) ? 0.0f : layer.weight; + if (w <= 0.0f) continue; + if (layer.additive) { + const Quat delta = (rest[bone].r.conjugate() * layerPose[bone].r).normalized(); + result[bone].r = (result[bone].r * Quat::slerp(Quat::identity(), delta, std::min(w, 1.0f))).normalized(); + result[bone].t = result[bone].t + (layerPose[bone].t - rest[bone].t) * w; + } else { + blendTRS(result[bone], layerPose[bone], w); + } + } + } +} + +template +void parallelChunks(size_t count, Fn&& fn) { + const unsigned hardware = std::max(1u, std::thread::hardware_concurrency()); + const size_t workers = count < 24000 ? 1 : std::min(std::min(hardware, 12u), count / 12000); + if (workers <= 1) { + fn(size_t(0), count); + return; + } + const size_t chunk = (count + workers - 1) / workers; + std::vector threads; + threads.reserve(workers - 1); + for (size_t w = 1; w < workers; ++w) { + const size_t begin = w * chunk; + const size_t end = std::min(count, begin + chunk); + if (begin >= end) break; + threads.emplace_back([&fn, begin, end]() { fn(begin, end); }); + } + fn(size_t(0), std::min(count, chunk)); + for (std::thread& thread : threads) thread.join(); +} + +void skinFromLocals(const Skeleton& skeleton, const std::vector& local, const Assets::Mesh3D& mesh, + std::vector& posed, std::vector& joints) { + const u32 boneCount = skeleton.boneCount(); + std::vector world(boneCount, Mat4::identity()); + std::vector resolved(boneCount, 0); + for (u32 pass = 0; pass < boneCount; ++pass) { + bool progressed = false; + for (u32 bone = 0; bone < boneCount; ++bone) { + if (resolved[bone]) continue; + const i32 parent = skeleton.bones[bone].parentIndex; + if (parent >= 0 && (parent >= static_cast(boneCount) || !resolved[static_cast(parent)])) continue; + world[bone] = parent >= 0 ? world[static_cast(parent)] * local[bone] : local[bone]; + resolved[bone] = 1; + progressed = true; + } + if (!progressed) break; + } + std::vector skin(boneCount, Mat4::identity()); + for (u32 bone = 0; bone < boneCount; ++bone) { + skin[bone] = skeleton.skinSpace * world[bone] * skeleton.bones[bone].bindPoseInverse; + } + skinVertices(mesh, skin, posed); + joints.resize(boneCount); + for (u32 bone = 0; bone < boneCount; ++bone) { + joints[bone] = skeleton.skinSpace.transformPoint( + Vec3(world[bone](0, 3), world[bone](1, 3), world[bone](2, 3))); + } +} + +void fillBindJoints(const Skeleton& skeleton, std::vector& joints) { + const u32 boneCount = skeleton.boneCount(); + std::vector world(boneCount, Mat4::identity()); + std::vector resolved(boneCount, 0); + for (u32 pass = 0; pass < boneCount; ++pass) { + bool progressed = false; + for (u32 bone = 0; bone < boneCount; ++bone) { + if (resolved[bone]) continue; + const i32 parent = skeleton.bones[bone].parentIndex; + if (parent >= 0 && (parent >= static_cast(boneCount) || !resolved[static_cast(parent)])) continue; + world[bone] = parent >= 0 + ? world[static_cast(parent)] * skeleton.bones[bone].localTransform + : skeleton.bones[bone].localTransform; + resolved[bone] = 1; + progressed = true; + } + if (!progressed) break; + } + joints.resize(boneCount); + for (u32 bone = 0; bone < boneCount; ++bone) { + joints[bone] = skeleton.skinSpace.transformPoint( + Vec3(world[bone](0, 3), world[bone](1, 3), world[bone](2, 3))); + } +} + +bool nameHasToken(const std::string& bone, const char* token) { + const std::string needle(token); + return bone.find(needle) != std::string::npos; +} + +} // namespace + +bool isFingerBoneName(const std::string& name) { + const std::string bone = normalizedBone(name); + if (bone.empty()) return false; + const char* tokens[] = {"thumb", "index", "middle", "ring", "pinky", "pinkie", "little", + "finger", "digit", "pollex", "forefinger"}; + for (const char* token : tokens) { + if (nameHasToken(bone, token)) return true; + } + return false; +} + +bool poseOmitsBone(const SkinnedPose& pose, i32 bone) { + return std::find(pose.removedBones.begin(), pose.removedBones.end(), bone) != pose.removedBones.end(); +} + +bool isFingerBone(const SkinnedPose& pose, const ImportedSkin& skin, i32 bone) { + if (bone < 0) return false; + for (int slot = kHumanoidBodyCount; slot < static_cast(HumanoidBone::Count); ++slot) { + if (pose.humanoid.bones[slot] == bone) return true; + } + const std::string name = bone < static_cast(skin.boneNames.size()) + ? skin.boneNames[static_cast(bone)] + : std::string(); + if (isFingerBoneName(name)) return true; + const i32 leftHand = pose.humanoid.bones[static_cast(HumanoidBone::LeftHand)]; + const i32 rightHand = pose.humanoid.bones[static_cast(HumanoidBone::RightHand)]; + if (leftHand < 0 && rightHand < 0) return false; + for (int slot = 0; slot < kHumanoidBodyCount; ++slot) { + if (pose.humanoid.bones[slot] == bone) return false; + } + i32 walk = bone < static_cast(skin.skeleton.bones.size()) + ? skin.skeleton.bones[static_cast(bone)].parentIndex + : -1; + for (int guard = 0; walk >= 0 && guard < 32; ++guard) { + if (walk == leftHand || walk == rightHand) return true; + if (walk >= static_cast(skin.skeleton.bones.size())) break; + walk = skin.skeleton.bones[static_cast(walk)].parentIndex; + } + return false; +} + +namespace { + +bool poseIsEdited(const SkinnedPose& pose) { + if (!pose.keys.empty() || pose.sampleKeys) return true; + for (const BonePose& offset : pose.offsets) { + if (offset.rotation.lengthSquared() > 1.0e-8f || offset.translation.lengthSquared() > 1.0e-8f) return true; + } + return false; +} + +} // namespace + +namespace { + +std::string skinFileKey(const std::string& path) { + std::string name = std::filesystem::path(path).filename().string(); + std::transform(name.begin(), name.end(), name.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + return name; +} + } // namespace void registerImportedSkin(const std::string& path, ImportedSkin skin) { if (path.empty() || skin.skeleton.bones.empty()) return; g_skins[path] = std::move(skin); + const std::string file = skinFileKey(path); + if (!file.empty() && file != path) g_skins[file] = g_skins[path]; + ++g_skinRevision; +} + +bool synthesizeHumanoidSkin(const std::string& path, Assets::Mesh3D& mesh, bool replace) { + if (path.empty() || mesh.vertices.empty()) return false; + if (replace) { + const std::string file = skinFileKey(path); + g_skins.erase(path); + if (!file.empty()) { + for (auto it = g_skins.begin(); it != g_skins.end();) { + if (it->first == path || skinFileKey(it->first) == file) it = g_skins.erase(it); + else ++it; + } + } + } else if (findImportedSkin(path)) { + return true; + } + + Vec3 minP = mesh.vertices[0].position; + Vec3 maxP = minP; + for (const auto& vertex : mesh.vertices) { + minP.x = std::min(minP.x, vertex.position.x); + minP.y = std::min(minP.y, vertex.position.y); + minP.z = std::min(minP.z, vertex.position.z); + maxP.x = std::max(maxP.x, vertex.position.x); + maxP.y = std::max(maxP.y, vertex.position.y); + maxP.z = std::max(maxP.z, vertex.position.z); + } + const f32 height = std::max(maxP.y - minP.y, 0.1f); + const f32 halfW = std::max(0.5f * (maxP.x - minP.x), 0.12f * height); + const Vec3 origin((minP.x + maxP.x) * 0.5f, minP.y, (minP.z + maxP.z) * 0.5f); + + struct Def { + const char* name; + i32 parent; + f32 x; + f32 y; + f32 z; + }; + // T-pose, Y-up. x is ±1 at the hands so arm span follows the mesh width. + const Def defs[] = { + {"Hips", -1, 0.00f, 0.52f, 0.00f}, + {"Spine", 0, 0.00f, 0.62f, 0.00f}, + {"Chest", 1, 0.00f, 0.72f, 0.00f}, + {"Neck", 2, 0.00f, 0.84f, 0.00f}, + {"Head", 3, 0.00f, 0.94f, 0.00f}, + {"LeftUpperArm", 2, -0.28f, 0.78f, 0.00f}, + {"LeftLowerArm", 5, -0.68f, 0.78f, 0.00f}, + {"LeftHand", 6, -1.00f, 0.78f, 0.00f}, + {"RightUpperArm", 2, 0.28f, 0.78f, 0.00f}, + {"RightLowerArm", 8, 0.68f, 0.78f, 0.00f}, + {"RightHand", 9, 1.00f, 0.78f, 0.00f}, + {"LeftUpperLeg", 0, -0.16f, 0.50f, 0.00f}, + {"LeftLowerLeg", 11, -0.16f, 0.26f, 0.00f}, + {"LeftFoot", 12, -0.16f, 0.03f, 0.06f}, + {"RightUpperLeg", 0, 0.16f, 0.50f, 0.00f}, + {"RightLowerLeg", 14, 0.16f, 0.26f, 0.00f}, + {"RightFoot", 15, 0.16f, 0.03f, 0.06f}, + }; + constexpr int kCount = static_cast(sizeof(defs) / sizeof(defs[0])); + + ImportedSkin imported; + imported.synthesized = true; + imported.mesh = &mesh; + imported.skeleton.skinSpace = Mat4::identity(); + imported.skeleton.bones.resize(static_cast(kCount)); + imported.boneNames.resize(static_cast(kCount)); + std::vector worldPos(static_cast(kCount)); + for (int i = 0; i < kCount; ++i) { + worldPos[static_cast(i)] = Vec3(origin.x + defs[i].x * halfW, + origin.y + defs[i].y * height, + origin.z + defs[i].z * height); + imported.boneNames[static_cast(i)] = defs[i].name; + imported.skeleton.bones[static_cast(i)].name = defs[i].name; + imported.skeleton.bones[static_cast(i)].parentIndex = defs[i].parent; + const Vec3 local = defs[i].parent < 0 + ? worldPos[static_cast(i)] + : worldPos[static_cast(i)] - worldPos[static_cast(defs[i].parent)]; + imported.skeleton.bones[static_cast(i)].localTransform = Mat4::translation(local); + imported.skeleton.bones[static_cast(i)].bindPoseInverse = + Mat4::translation(-worldPos[static_cast(i)].x, -worldPos[static_cast(i)].y, + -worldPos[static_cast(i)].z); + } + + mesh.skin.assign(mesh.vertices.size(), {}); + for (size_t v = 0; v < mesh.vertices.size(); ++v) { + const Vec3 p = mesh.vertices[v].position; + f32 bestDist[4] = {1.0e12f, 1.0e12f, 1.0e12f, 1.0e12f}; + int bestBone[4] = {0, 0, 0, 0}; + for (int b = 0; b < kCount; ++b) { + Vec3 a = worldPos[static_cast(b)]; + Vec3 d = p - a; + if (defs[b].parent >= 0) { + const Vec3 parent = worldPos[static_cast(defs[b].parent)]; + const Vec3 seg = a - parent; + const f32 seg2 = seg.lengthSquared(); + if (seg2 > 1.0e-8f) { + const f32 t = std::clamp((p - parent).dot(seg) / seg2, 0.0f, 1.0f); + d = p - (parent + seg * t); + } + } + const f32 dist2 = d.lengthSquared(); + for (int slot = 0; slot < 4; ++slot) { + if (dist2 < bestDist[slot]) { + for (int shift = 3; shift > slot; --shift) { + bestDist[shift] = bestDist[shift - 1]; + bestBone[shift] = bestBone[shift - 1]; + } + bestDist[slot] = dist2; + bestBone[slot] = b; + break; + } + } + } + f32 sum = 0.0f; + f32 weights[4] = {}; + for (int slot = 0; slot < 4; ++slot) { + weights[slot] = 1.0f / (bestDist[slot] + 1.0e-4f); + sum += weights[slot]; + } + Assets::VertexSkin influence; + if (sum <= 0.0f) { + influence.joints[0] = 0; + influence.weights[0] = 1.0f; + } else { + for (int slot = 0; slot < 4; ++slot) { + influence.joints[slot] = static_cast(bestBone[slot]); + influence.weights[slot] = weights[slot] / sum; + } + } + mesh.skin[v] = influence; + } + + registerImportedSkin(path, std::move(imported)); + return findImportedSkin(path) != nullptr; } const ImportedSkin* findImportedSkin(const std::string& path) { if (path.empty()) return nullptr; const auto exact = g_skins.find(path); if (exact != g_skins.end()) return &exact->second; + const std::string file = skinFileKey(path); + if (!file.empty()) { + const auto byFile = g_skins.find(file); + if (byFile != g_skins.end()) return &byFile->second; + } const ImportedSkin* match = nullptr; for (const auto& entry : g_skins) { + if (!file.empty() && skinFileKey(entry.first) == file) { + match = &entry.second; + continue; + } if (entry.first.size() >= path.size() && entry.first.compare(entry.first.size() - path.size(), path.size(), path) == 0) { match = &entry.second; @@ -100,17 +685,217 @@ const char* humanoidBoneName(HumanoidBone bone) { case HumanoidBone::RightUpperLeg: return "Right Upper Leg"; case HumanoidBone::RightLowerLeg: return "Right Lower Leg"; case HumanoidBone::RightFoot: return "Right Foot"; + case HumanoidBone::LeftThumbProximal: return "Left Thumb Proximal"; + case HumanoidBone::LeftThumbIntermediate: return "Left Thumb Intermediate"; + case HumanoidBone::LeftThumbDistal: return "Left Thumb Distal"; + case HumanoidBone::LeftIndexProximal: return "Left Index Proximal"; + case HumanoidBone::LeftIndexIntermediate: return "Left Index Intermediate"; + case HumanoidBone::LeftIndexDistal: return "Left Index Distal"; + case HumanoidBone::LeftMiddleProximal: return "Left Middle Proximal"; + case HumanoidBone::LeftMiddleIntermediate: return "Left Middle Intermediate"; + case HumanoidBone::LeftMiddleDistal: return "Left Middle Distal"; + case HumanoidBone::LeftRingProximal: return "Left Ring Proximal"; + case HumanoidBone::LeftRingIntermediate: return "Left Ring Intermediate"; + case HumanoidBone::LeftRingDistal: return "Left Ring Distal"; + case HumanoidBone::LeftLittleProximal: return "Left Little Proximal"; + case HumanoidBone::LeftLittleIntermediate: return "Left Little Intermediate"; + case HumanoidBone::LeftLittleDistal: return "Left Little Distal"; + case HumanoidBone::RightThumbProximal: return "Right Thumb Proximal"; + case HumanoidBone::RightThumbIntermediate: return "Right Thumb Intermediate"; + case HumanoidBone::RightThumbDistal: return "Right Thumb Distal"; + case HumanoidBone::RightIndexProximal: return "Right Index Proximal"; + case HumanoidBone::RightIndexIntermediate: return "Right Index Intermediate"; + case HumanoidBone::RightIndexDistal: return "Right Index Distal"; + case HumanoidBone::RightMiddleProximal: return "Right Middle Proximal"; + case HumanoidBone::RightMiddleIntermediate: return "Right Middle Intermediate"; + case HumanoidBone::RightMiddleDistal: return "Right Middle Distal"; + case HumanoidBone::RightRingProximal: return "Right Ring Proximal"; + case HumanoidBone::RightRingIntermediate: return "Right Ring Intermediate"; + case HumanoidBone::RightRingDistal: return "Right Ring Distal"; + case HumanoidBone::RightLittleProximal: return "Right Little Proximal"; + case HumanoidBone::RightLittleIntermediate: return "Right Little Intermediate"; + case HumanoidBone::RightLittleDistal: return "Right Little Distal"; case HumanoidBone::Count: break; } return ""; } +bool isHumanoidFingerSlot(HumanoidBone bone) { + const int slot = static_cast(bone); + return slot >= kHumanoidBodyCount && slot < static_cast(HumanoidBone::Count); +} + +void assignHumanoidBone(HumanoidRig& rig, HumanoidBone slot, i32 bone) { + const int index = static_cast(slot); + if (index < 0 || index >= static_cast(HumanoidBone::Count)) return; + for (int other = kHumanoidBodyCount; other < static_cast(HumanoidBone::Count); ++other) { + if (other != index && rig.bones[other] == bone) rig.bones[other] = -1; + } + rig.bones[index] = bone; + rig.manual = true; + refreshHumanoidMatched(rig); +} + +namespace { + +struct FingerAlias { + HumanoidBone bone; + const char* token; +}; + +constexpr FingerAlias kFingerAliases[] = { + {HumanoidBone::LeftThumbProximal, "lefthandthumb1"}, {HumanoidBone::LeftThumbIntermediate, "lefthandthumb2"}, + {HumanoidBone::LeftThumbDistal, "lefthandthumb3"}, {HumanoidBone::RightThumbProximal, "righthandthumb1"}, + {HumanoidBone::RightThumbIntermediate, "righthandthumb2"}, {HumanoidBone::RightThumbDistal, "righthandthumb3"}, + {HumanoidBone::LeftIndexProximal, "lefthandindex1"}, {HumanoidBone::LeftIndexIntermediate, "lefthandindex2"}, + {HumanoidBone::LeftIndexDistal, "lefthandindex3"}, {HumanoidBone::RightIndexProximal, "righthandindex1"}, + {HumanoidBone::RightIndexIntermediate, "righthandindex2"}, {HumanoidBone::RightIndexDistal, "righthandindex3"}, + {HumanoidBone::LeftMiddleProximal, "lefthandmiddle1"}, {HumanoidBone::LeftMiddleIntermediate, "lefthandmiddle2"}, + {HumanoidBone::LeftMiddleDistal, "lefthandmiddle3"}, {HumanoidBone::RightMiddleProximal, "righthandmiddle1"}, + {HumanoidBone::RightMiddleIntermediate, "righthandmiddle2"}, {HumanoidBone::RightMiddleDistal, "righthandmiddle3"}, + {HumanoidBone::LeftRingProximal, "lefthandring1"}, {HumanoidBone::LeftRingIntermediate, "lefthandring2"}, + {HumanoidBone::LeftRingDistal, "lefthandring3"}, {HumanoidBone::RightRingProximal, "righthandring1"}, + {HumanoidBone::RightRingIntermediate, "righthandring2"}, {HumanoidBone::RightRingDistal, "righthandring3"}, + {HumanoidBone::LeftLittleProximal, "lefthandpinky1"}, {HumanoidBone::LeftLittleIntermediate, "lefthandpinky2"}, + {HumanoidBone::LeftLittleDistal, "lefthandpinky3"}, {HumanoidBone::RightLittleProximal, "righthandpinky1"}, + {HumanoidBone::RightLittleIntermediate, "righthandpinky2"}, {HumanoidBone::RightLittleDistal, "righthandpinky3"}, + {HumanoidBone::LeftThumbProximal, "lthumb1"}, {HumanoidBone::LeftThumbIntermediate, "lthumb2"}, + {HumanoidBone::LeftThumbDistal, "lthumb3"}, {HumanoidBone::RightThumbProximal, "rthumb1"}, + {HumanoidBone::RightThumbIntermediate, "rthumb2"}, {HumanoidBone::RightThumbDistal, "rthumb3"}, + {HumanoidBone::LeftThumbProximal, "finger0"}, {HumanoidBone::LeftThumbIntermediate, "finger01"}, + {HumanoidBone::LeftThumbDistal, "finger02"}, +}; + +bool boneUsed(const HumanoidRig& rig, i32 bone) { + if (bone < 0) return false; + for (int slot = 0; slot < static_cast(HumanoidBone::Count); ++slot) { + if (rig.bones[slot] == bone) return true; + } + return false; +} + +std::string boneLabel(const ImportedSkin& skin, i32 bone) { + if (bone < 0) return {}; + if (bone < static_cast(skin.boneNames.size())) return normalizedBone(skin.boneNames[static_cast(bone)]); + if (bone < static_cast(skin.skeleton.bones.size())) { + return normalizedBone(skin.skeleton.bones[static_cast(bone)].name.cStr()); + } + return {}; +} + +i32 firstChildOf(const ImportedSkin& skin, i32 parent, const HumanoidRig& rig) { + i32 found = -1; + for (i32 bone = 0; bone < static_cast(skin.skeleton.bones.size()); ++bone) { + if (skin.skeleton.bones[static_cast(bone)].parentIndex != parent) continue; + if (boneUsed(rig, bone)) continue; + if (found < 0) found = bone; + else return -1; + } + return found; +} + +void fillFingerChain(HumanoidRig& rig, const ImportedSkin& skin, i32 proximal, HumanoidBone firstSlot) { + i32 bone = proximal; + for (int joint = 0; joint < 3 && bone >= 0; ++joint) { + const int slot = static_cast(firstSlot) + joint; + if (slot >= static_cast(HumanoidBone::Count) || rig.bones[slot] >= 0) break; + rig.bones[slot] = bone; + bone = firstChildOf(skin, bone, rig); + } +} + +int fingerFamily(const std::string& name, bool left) { + const char* families[] = {"thumb", "index", "middle", "ring", "pinky", "pinkie", "little"}; + const int map[] = {0, 1, 2, 3, 4, 4, 4}; + int found = -1; + for (int i = 0; i < 7; ++i) { + if (!nameHasToken(name, families[i])) continue; + found = map[i]; + break; + } + if (found < 0 && nameHasToken(name, "finger")) { + for (char digit = '0'; digit <= '4'; ++digit) { + if (name.find(std::string("finger") + digit) != std::string::npos) { + found = digit - '0'; + break; + } + } + } + if (found < 0) return -1; + const bool nameLeft = nameHasToken(name, "left") || nameHasToken(name, "lhand") || + (name.size() > 1 && name[0] == 'l' && (name[1] == 't' || name[1] == 'i' || name[1] == 'm' || + name[1] == 'r' || name[1] == 'p' || name[1] == 'f')); + const bool nameRight = nameHasToken(name, "right") || nameHasToken(name, "rhand"); + if (left && nameRight) return -1; + if (!left && nameLeft && !nameRight) return -1; + return found; +} + +void matchHandFingers(HumanoidRig& rig, const ImportedSkin& skin, HumanoidBone handSlot, HumanoidBone thumbSlot) { + const i32 hand = rig.bones[static_cast(handSlot)]; + if (hand < 0) return; + const bool left = handSlot == HumanoidBone::LeftHand; + struct Chain { + i32 root = -1; + int family = -1; + f32 sort = 0.0f; + }; + std::vector chains; + for (i32 bone = 0; bone < static_cast(skin.skeleton.bones.size()); ++bone) { + if (skin.skeleton.bones[static_cast(bone)].parentIndex != hand) continue; + if (boneUsed(rig, bone)) continue; + Chain chain; + chain.root = bone; + chain.family = fingerFamily(boneLabel(skin, bone), left); + const Mat4& local = skin.skeleton.bones[static_cast(bone)].localTransform; + chain.sort = left ? -local(0, 3) : local(0, 3); + chains.push_back(chain); + } + std::stable_sort(chains.begin(), chains.end(), [](const Chain& a, const Chain& b) { + if (a.family >= 0 && b.family >= 0 && a.family != b.family) return a.family < b.family; + if (a.family >= 0 && b.family < 0) return true; + if (a.family < 0 && b.family >= 0) return false; + return a.sort < b.sort; + }); + bool usedFamily[5] = {}; + int nextOpen = 0; + for (const Chain& chain : chains) { + int family = chain.family; + if (family < 0 || usedFamily[family]) { + while (nextOpen < 5 && usedFamily[nextOpen]) ++nextOpen; + if (nextOpen >= 5) break; + family = nextOpen; + } + usedFamily[family] = true; + fillFingerChain(rig, skin, chain.root, + static_cast(static_cast(thumbSlot) + family * 3)); + } +} + +void matchNamedFingers(HumanoidRig& rig, const ImportedSkin& skin) { + const u32 count = std::max(skin.skeleton.boneCount(), static_cast(skin.boneNames.size())); + for (u32 i = 0; i < count; ++i) { + const std::string bone = boneLabel(skin, static_cast(i)); + for (const FingerAlias& alias : kFingerAliases) { + const int slot = static_cast(alias.bone); + if (rig.bones[slot] >= 0) continue; + if (tokenMatches(bone, alias.token) || bone == alias.token) { + rig.bones[slot] = static_cast(i); + break; + } + } + } +} + +} // namespace + HumanoidRig matchHumanoid(const ImportedSkin& skin) { HumanoidRig rig; const u32 count = std::max(skin.skeleton.boneCount(), static_cast(skin.boneNames.size())); for (u32 i = 0; i < count; ++i) { const std::string source = i < skin.boneNames.size() ? skin.boneNames[i] : skin.skeleton.bones[i].name.cStr(); const std::string bone = normalizedBone(source); + if (isFingerBoneName(source)) continue; for (const Alias& alias : kAliases) { const int slot = static_cast(alias.bone); if (rig.bones[slot] >= 0) continue; @@ -120,37 +905,91 @@ HumanoidRig matchHumanoid(const ImportedSkin& skin) { } } } + matchNamedFingers(rig, skin); + matchHandFingers(rig, skin, HumanoidBone::LeftHand, HumanoidBone::LeftThumbProximal); + matchHandFingers(rig, skin, HumanoidBone::RightHand, HumanoidBone::RightThumbProximal); + refreshHumanoidMatched(rig); + return rig; +} + +void refreshHumanoidMatched(HumanoidRig& rig) { const bool arm = rig.bones[static_cast(HumanoidBone::LeftUpperArm)] >= 0 || rig.bones[static_cast(HumanoidBone::RightUpperArm)] >= 0; const bool leg = rig.bones[static_cast(HumanoidBone::LeftUpperLeg)] >= 0 || rig.bones[static_cast(HumanoidBone::RightUpperLeg)] >= 0; rig.matched = rig.bones[static_cast(HumanoidBone::Hips)] >= 0 && rig.bones[static_cast(HumanoidBone::Head)] >= 0 && arm && leg; - return rig; } void skinVertices(const Assets::Mesh3D& bind, const std::vector& bones, std::vector& out) { - out = bind.vertices; - if (bind.skin.size() != bind.vertices.size() || bones.empty()) return; - for (size_t i = 0; i < bind.vertices.size(); ++i) { - const Assets::VertexSkin& skin = bind.skin[i]; - f32 weightSum = 0.0f; - for (f32 weight : skin.weights) weightSum += weight; - if (weightSum <= 0.0001f) continue; - Vec3 position{}; - Vec3 normal{}; + const size_t count = bind.vertices.size(); + if (out.size() != count) { + out.resize(count); + for (size_t i = 0; i < count; ++i) { + out[i].texcoord = bind.vertices[i].texcoord; + out[i].tangent = bind.vertices[i].tangent; + } + } + if (bind.skin.size() != count || bones.empty()) { + for (size_t i = 0; i < count; ++i) { + out[i].position = bind.vertices[i].position; + out[i].normal = bind.vertices[i].normal; + } + return; + } + + struct Palette { + f32 x0, y0, z0, x1, y1, z1, x2, y2, z2, tx, ty, tz; + }; + std::vector palette(bones.size()); + for (size_t bone = 0; bone < bones.size(); ++bone) { + const Mat4& m = bones[bone]; + palette[bone] = {m(0, 0), m(1, 0), m(2, 0), m(0, 1), m(1, 1), m(2, 1), + m(0, 2), m(1, 2), m(2, 2), m(0, 3), m(1, 3), m(2, 3)}; + } + + const Assets::Vertex3D* source = bind.vertices.data(); + const Assets::VertexSkin* influences = bind.skin.data(); + Assets::Vertex3D* destination = out.data(); + const Palette* joints = palette.data(); + const u32 jointCount = static_cast(palette.size()); + + parallelChunks(count, [&](size_t first, size_t last) { + for (size_t i = first; i < last; ++i) { + const Assets::VertexSkin& skin = influences[i]; + const Vec3 position = source[i].position; + const Vec3 normal = source[i].normal; + f32 px = 0.0f, py = 0.0f, pz = 0.0f; + f32 nx = 0.0f, ny = 0.0f, nz = 0.0f; + bool used = false; for (int influence = 0; influence < 4; ++influence) { const f32 weight = skin.weights[influence]; if (weight <= 0.0f) continue; const u32 joint = skin.joints[influence]; - if (joint >= bones.size()) continue; - position = position + bones[joint].transformPoint(bind.vertices[i].position) * weight; - normal = normal + bones[joint].transformVector(bind.vertices[i].normal) * weight; + if (joint >= jointCount) continue; + const Palette& m = joints[joint]; + px += (m.x0 * position.x + m.x1 * position.y + m.x2 * position.z + m.tx) * weight; + py += (m.y0 * position.x + m.y1 * position.y + m.y2 * position.z + m.ty) * weight; + pz += (m.z0 * position.x + m.z1 * position.y + m.z2 * position.z + m.tz) * weight; + nx += (m.x0 * normal.x + m.x1 * normal.y + m.x2 * normal.z) * weight; + ny += (m.y0 * normal.x + m.y1 * normal.y + m.y2 * normal.z) * weight; + nz += (m.z0 * normal.x + m.z1 * normal.y + m.z2 * normal.z) * weight; + used = true; + } + if (!used) { + destination[i].position = position; + destination[i].normal = normal; + continue; + } + destination[i].position = Vec3(px, py, pz); + const f32 lengthSquared = nx * nx + ny * ny + nz * nz; + if (lengthSquared > 0.0001f) { + const f32 inverse = 1.0f / std::sqrt(lengthSquared); + destination[i].normal = Vec3(nx * inverse, ny * inverse, nz * inverse); } - out[i].position = position; - if (normal.lengthSquared() > 0.0001f) out[i].normal = normal.normalized(); } + }); } SpriteSheetRect spriteSheetFrame(const SpriteSheet& sheet, u32 frame, f32 textureWidth, f32 textureHeight) { @@ -174,6 +1013,15 @@ const std::vector* skinnedVerticesFor(u32 entityId) { return &it->second; } +u64 skinnedGenerationFor(u32 entityId) { + const auto it = g_generation.find(entityId); + return it == g_generation.end() ? 0 : it->second; +} + +u64 skinRevision() { + return g_skinRevision; +} + const std::vector* jointPositionsFor(u32 entityId) { const auto it = g_joints.find(entityId); if (it == g_joints.end() || it->second.empty()) return nullptr; @@ -186,10 +1034,134 @@ const std::vector* jointParentsFor(u32 entityId) { return &it->second; } +const char* keyInterpName(KeyInterp mode) { + switch (mode) { + case KeyInterp::Linear: return "Linear"; + case KeyInterp::Constant: return "Constant"; + case KeyInterp::EaseIn: return "Ease In"; + case KeyInterp::EaseOut: return "Ease Out"; + case KeyInterp::EaseInOut: return "Ease In Out"; + case KeyInterp::Custom: return "Custom Curve"; + } + return "Linear"; +} + +KeyCurve keyCurvePreset(KeyInterp mode) { + KeyCurve curve; + curve.mode = mode; + switch (mode) { + case KeyInterp::EaseIn: curve.x1 = 0.42f; curve.y1 = 0.0f; curve.x2 = 1.0f; curve.y2 = 1.0f; break; + case KeyInterp::EaseOut: curve.x1 = 0.0f; curve.y1 = 0.0f; curve.x2 = 0.58f; curve.y2 = 1.0f; break; + case KeyInterp::EaseInOut: curve.x1 = 0.42f; curve.y1 = 0.0f; curve.x2 = 0.58f; curve.y2 = 1.0f; break; + default: break; + } + return curve; +} + +f32 evaluateKeyCurve(const KeyCurve& curve, f32 t) { + t = std::clamp(t, 0.0f, 1.0f); + switch (curve.mode) { + case KeyInterp::Linear: return t; + case KeyInterp::Constant: return t >= 1.0f ? 1.0f : 0.0f; + default: break; + } + const KeyCurve shape = curve.mode == KeyInterp::Custom ? curve : keyCurvePreset(curve.mode); + const f32 x1 = std::clamp(shape.x1, 0.0f, 1.0f); + const f32 x2 = std::clamp(shape.x2, 0.0f, 1.0f); + auto bezier = [](f32 a, f32 b, f32 s) { + const f32 inv = 1.0f - s; + return 3.0f * inv * inv * s * a + 3.0f * inv * s * s * b + s * s * s; + }; + f32 lo = 0.0f; + f32 hi = 1.0f; + f32 s = t; + for (int i = 0; i < 24; ++i) { + s = 0.5f * (lo + hi); + if (bezier(x1, x2, s) < t) lo = s; + else hi = s; + } + return bezier(shape.y1, shape.y2, s); +} + +bool boneEditFrame(const ImportedSkin& skin, const SkinnedPose& pose, i32 bone, Mat4& out, u32 entityId) { + const Skeleton& skeleton = skin.skeleton; + const u32 boneCount = skeleton.boneCount(); + if (bone < 0 || bone >= static_cast(boneCount)) return false; + const auto animated = g_animLocal.find(entityId); + const std::vector* animLocal = + (animated != g_animLocal.end() && animated->second.size() == boneCount) ? &animated->second : nullptr; + auto baseLocal = [&](size_t index) -> const Mat4& { + return animLocal ? (*animLocal)[index] : skeleton.bones[index].localTransform; + }; + auto withOffset = [&](size_t index) { + const BonePose* offset = index < pose.offsets.size() ? &pose.offsets[index] : nullptr; + if (!offset) return baseLocal(index); + const Quat rotation = Quat::fromEuler(offset->rotation.x, offset->rotation.y, offset->rotation.z); + return baseLocal(index) * Mat4::translation(offset->translation) * rotation.toMatrix(); + }; + std::vector chain; + for (i32 walk = skeleton.bones[static_cast(bone)].parentIndex; + walk >= 0 && walk < static_cast(boneCount) && chain.size() < boneCount; + walk = skeleton.bones[static_cast(walk)].parentIndex) { + chain.push_back(walk); + } + Mat4 parent = Mat4::identity(); + for (auto it = chain.rbegin(); it != chain.rend(); ++it) parent = parent * withOffset(static_cast(*it)); + Vec3 translation{}; + if (static_cast(bone) < pose.offsets.size()) translation = pose.offsets[static_cast(bone)].translation; + out = skeleton.skinSpace * parent * baseLocal(static_cast(bone)) * Mat4::translation(translation); + return true; +} + +i32 clipForAnimatorState(const ImportedSkin& skin, const char* stateName, const char* motionName) { + const char* wanted = (motionName && motionName[0] != '\0') ? motionName : stateName; + if (!wanted || wanted[0] == '\0') return -1; + for (int clip = 0; clip < static_cast(skin.clipNames.size()); ++clip) { + if (skin.clipNames[static_cast(clip)] == wanted) return clip; + } + return -1; +} + void setSkinProjectRoot(const std::string& projectRoot) { g_projectRoot = projectRoot; } +SkinnedPose* ensurePoseForMesh(ECS::World& world, ECS::Entity entity, const std::string& projectRoot) { + if (!entity.isValid()) return nullptr; + setSkinProjectRoot(projectRoot); + ECS::MeshFilterComponent* filter = world.get(entity); + SkinnedPose* pose = world.get(entity); + const char* path = nullptr; + if (pose && pose->meshPath[0] != '\0') path = pose->meshPath; + else if (filter && !filter->customMeshPath.empty()) path = filter->customMeshPath.c_str(); + if (!path || path[0] == '\0') return pose; + + Assets::Mesh3D* mesh = Assets::MeshCache::getInstance().getMesh(path, projectRoot); + const std::string resolved = Assets::MeshCache::getInstance().getResolvedPath(); + if (!findImportedSkin(path) && mesh) { + Assets::MeshLoader::ensureGltfSkin(resolved.empty() ? std::string(path) : resolved, mesh); + } + if (!findImportedSkin(path)) return pose; + + if (!pose) { + SkinnedPose created; + std::strncpy(created.meshPath, path, sizeof(created.meshPath) - 1); + created.playing = false; + created.time = 0.0f; + created.editorHeld = true; + world.add(entity, std::move(created)); + pose = world.get(entity); + } else if (pose->meshPath[0] == '\0') { + std::strncpy(pose->meshPath, path, sizeof(pose->meshPath) - 1); + pose->loaded = false; + } + if (filter && filter->customMeshPath.empty() && pose && pose->meshPath[0] != '\0') { + filter->primitive = ECS::MeshPrimitive::Custom; + filter->customMeshPath = pose->meshPath; + } + return pose; +} + void tickSkinnedPoses(ECS::World& world, f32 dt) { ECS::ComponentQuery query; query.with(); @@ -197,67 +1169,120 @@ void tickSkinnedPoses(ECS::World& world, f32 dt) { world.forEach(query, [&](ECS::Entity entity, SkinnedPose& pose) { live.push_back(entity.id()); if (pose.meshPath[0] == '\0') { - g_posed.erase(entity.id()); - g_joints.erase(entity.id()); - g_jointParents.erase(entity.id()); + dropEntityPose(entity.id()); return; } - Assets::MeshCache::getInstance().getMesh(pose.meshPath, g_projectRoot); const ImportedSkin* skin = findImportedSkin(pose.meshPath); const Assets::Mesh3D* mesh = skin ? skin->mesh : nullptr; if (!mesh) mesh = Assets::MeshCache::getInstance().getMesh(pose.meshPath, g_projectRoot); if (!skin || !mesh) { - g_posed.erase(entity.id()); - g_joints.erase(entity.id()); - g_jointParents.erase(entity.id()); + dropEntityPose(entity.id()); return; } - if (const Animator* animator = world.get(entity)) { - const char* stateName = animator->currentState.cStr(); - if (stateName && stateName[0] != '\0') { - for (int clip = 0; clip < static_cast(skin->clipNames.size()); ++clip) { - if (skin->clipNames[static_cast(clip)] == stateName && pose.clipIndex != clip) { - pose.clipIndex = clip; - pose.time = 0.0f; - pose.playing = true; - break; - } - } - } + if (!pose.editorHeld) { + pose.playing = false; + pose.time = 0.0f; + pose.editorHeld = true; } if (!pose.loaded) { - pose.humanoid = matchHumanoid(*skin); + if (!pose.humanoid.manual) pose.humanoid = matchHumanoid(*skin); + else refreshHumanoidMatched(pose.humanoid); pose.loaded = true; if (pose.clipIndex < 0) pose.clipIndex = 0; } - if (!skin->clips.empty()) { - if (pose.clipIndex >= static_cast(skin->clips.size())) pose.clipIndex = 0; - const SkeletalClip& clip = skin->clips[static_cast(pose.clipIndex)]; - if (pose.playing) { - pose.time += dt * pose.speed; - const f32 duration = std::max(clip.duration, 0.0f); - if (duration > 0.0f && pose.time >= duration) { - if (pose.loop && clip.loop) pose.time = std::fmod(pose.time, duration); - else { - pose.time = duration; - pose.playing = false; + auto rememberParents = [&]() { + if (g_jointParents.find(entity.id()) != g_jointParents.end()) return; + std::vector parents; + parents.reserve(skin->skeleton.boneCount()); + for (const Bone& bone : skin->skeleton.bones) parents.push_back(bone.parentIndex); + g_jointParents[entity.id()] = std::move(parents); + }; + + // Priority: the timeline's override, then the animator, then the inspector's single clip. + std::vector mix; + u8 mode = 0; + f32 keyTime = pose.time; + auto mixHasSamples = [](const std::vector& layers) { + for (const PoseLayerMix& layer : layers) { + if (!layer.samples.empty()) return true; + } + return false; + }; + const bool timelineOwns = pose.timelineHold && mixHasSamples(pose.overrideMix); + if (timelineOwns) { + mix = pose.overrideMix; + mode = 1; + keyTime = pose.time; + } else { + const Animator* animator = world.get(entity); + if (animator) buildAnimatorMix(*animator, *skin, mix); + if (!mix.empty()) { + mode = 2; + if (!mix.front().samples.empty()) { + pose.clipIndex = mix.front().samples.back().clip; + pose.time = mix.front().samples.back().time; + } + } else if (!skin->clips.empty()) { + if (pose.clipIndex < 0 || pose.clipIndex >= static_cast(skin->clips.size())) pose.clipIndex = 0; + const SkeletalClip& clip = skin->clips[static_cast(pose.clipIndex)]; + if (pose.playing) { + pose.time += dt * pose.speed; + const f32 duration = std::max(clip.duration, 0.0f); + if (duration > 0.0f && pose.time >= duration) { + if (pose.loop && clip.loop) { + pose.time = std::fmod(pose.time, duration); + } else { + pose.time = duration; + pose.playing = false; + } } } + PoseLayerMix single; + single.samples.push_back({pose.clipIndex, pose.time, 1.0f, pose.loop && clip.loop, 0.0f}); + mix.push_back(std::move(single)); + mode = 3; } - std::vector bones; + } + if (pose.sampleKeys && !pose.keys.empty()) samplePoseKeys(pose, skin->skeleton.boneCount(), keyTime); + + if (mix.empty() && !poseIsEdited(pose)) { + const u64 hash = hashPoseInputs(pose, mix, 0); + if (poseCacheHit(entity.id(), hash)) return; + g_posed.erase(entity.id()); + g_animLocal.erase(entity.id()); std::vector joints; - clip.sampleAt(pose.time, skin->skeleton, bones, &joints); - skinVertices(*mesh, bones, g_posed[entity.id()]); + fillBindJoints(skin->skeleton, joints); g_joints[entity.id()] = std::move(joints); - } else { - g_posed[entity.id()] = mesh->vertices; - g_joints.erase(entity.id()); + rememberParents(); + storePoseCache(entity.id(), hash, false); + return; + } + const u64 hash = hashPoseInputs(pose, mix, mode); + if (poseCacheHit(entity.id(), hash)) return; + + std::vector locals; + evaluateMix(*skin, pose, mix, locals); + const u32 boneCount = skin->skeleton.boneCount(); + std::vector& animLocal = g_animLocal[entity.id()]; + animLocal.resize(boneCount); + std::vector local(boneCount); + for (u32 bone = 0; bone < boneCount; ++bone) { + animLocal[bone] = trsMatrix(locals[bone]); + const BonePose* offset = bone < pose.offsets.size() ? &pose.offsets[bone] : nullptr; + if (offset && (offset->rotation.lengthSquared() > 1.0e-10f || offset->translation.lengthSquared() > 1.0e-10f)) { + const Quat rotation = Quat::fromEuler(offset->rotation.x, offset->rotation.y, offset->rotation.z); + local[bone] = animLocal[bone] * Mat4::translation(offset->translation) * rotation.toMatrix(); + } else { + local[bone] = animLocal[bone]; + } } - std::vector parents; - parents.reserve(skin->skeleton.boneCount()); - for (const Bone& bone : skin->skeleton.bones) parents.push_back(bone.parentIndex); - g_jointParents[entity.id()] = std::move(parents); + std::vector joints; + skinFromLocals(skin->skeleton, local, *mesh, g_posed[entity.id()], joints); + g_joints[entity.id()] = std::move(joints); + rememberParents(); + storePoseCache(entity.id(), hash, true); }); + ++g_frame; for (auto it = g_posed.begin(); it != g_posed.end();) { const bool stillLive = std::find(live.begin(), live.end(), it->first) != live.end(); @@ -272,6 +1297,434 @@ void tickSkinnedPoses(ECS::World& world, f32 dt) { if (std::find(live.begin(), live.end(), it->first) == live.end()) it = g_jointParents.erase(it); else ++it; } + for (auto it = g_stamp.begin(); it != g_stamp.end();) { + if (std::find(live.begin(), live.end(), it->first) == live.end()) it = g_stamp.erase(it); + else ++it; + } + for (auto it = g_generation.begin(); it != g_generation.end();) { + if (std::find(live.begin(), live.end(), it->first) == live.end()) it = g_generation.erase(it); + else ++it; + } + for (auto it = g_animLocal.begin(); it != g_animLocal.end();) { + if (std::find(live.begin(), live.end(), it->first) == live.end()) it = g_animLocal.erase(it); + else ++it; + } +} + +u64 skinFrameCounter() { + return g_frame; +} + +f32 effectiveLayerWeight(const Animator& animator, const AnimatorLayer& layer) { + if (layer.muted) return 0.0f; + f32 weight = std::clamp(layer.weight, 0.0f, 1.0f); + FixedString<32> parent = layer.parentGroup; + for (int depth = 0; depth < 8 && !parent.empty(); ++depth) { + const AnimatorLayer* group = nullptr; + for (const AnimatorLayer& candidate : animator.layers) { + if (candidate.isGroup && candidate.name == parent) { + group = &candidate; + break; + } + } + if (!group) break; + if (group->muted) return 0.0f; + weight *= std::clamp(group->weight, 0.0f, 1.0f); + parent = group->parentGroup; + } + return weight; +} + +namespace { + +void appendMachineSamples(const AnimatorStateMachine& sm, const ImportedSkin& skin, PoseLayerMix& layer) { + auto clipOf = [&](const FixedString<32>& name) -> i32 { + if (name.empty()) return -1; + const AnimationState* state = sm.states.get(name); + return clipForAnimatorState(skin, name.cStr(), state ? state->motion.cStr() : nullptr); + }; + auto loops = [&](i32 clip) { return clip >= 0 && skin.clips[static_cast(clip)].loop; }; + const i32 current = clipOf(sm.currentState); + if (current < 0) return; + if (sm.fading()) { + const i32 from = clipOf(sm.fadeFromState); + if (from >= 0) { + layer.samples.push_back({from, sm.fadeFromTime, 1.0f, loops(from), 0.0f}); + const f32 alpha = evaluateKeyCurve(sm.fadeCurve, sm.fadeElapsed / sm.fadeDuration); + layer.samples.push_back({current, sm.timeInState, std::clamp(alpha, 0.0f, 1.0f), loops(current), 0.0f}); + return; + } + } + layer.samples.push_back({current, sm.timeInState, 1.0f, loops(current), 0.0f}); +} + +} // namespace + +void buildAnimatorMix(const Animator& animator, const ImportedSkin& skin, std::vector& out) { + out.clear(); + bool active = !animator.currentState.empty(); + for (const AnimatorLayer& layer : animator.layers) active = active || (!layer.isGroup && !layer.currentState.empty()); + if (!active || skin.clips.empty()) return; + PoseLayerMix base; + appendMachineSamples(animator, skin, base); + out.push_back(std::move(base)); + for (const AnimatorLayer& layer : animator.layers) { + if (layer.isGroup) continue; + PoseLayerMix mix; + mix.weight = effectiveLayerWeight(animator, layer); + mix.additive = layer.blend == LayerBlendMode::Additive; + mix.mask = layer.mask; + if (mix.weight <= 0.0f) continue; + appendMachineSamples(layer, skin, mix); + if (!mix.samples.empty()) out.push_back(std::move(mix)); + } + if (out.size() == 1 && out.front().samples.empty()) out.clear(); +} + +namespace { + +f32 stripClipDuration(const ClipStrip& strip, const ImportedSkin* skin) { + if (!skin || strip.clip < 0 || strip.clip >= static_cast(skin->clips.size())) return 0.0f; + return std::max(skin->clips[static_cast(strip.clip)].duration, 0.0f); +} + +f32 stripRange(const ClipStrip& strip, const ImportedSkin* skin) { + const f32 duration = stripClipDuration(strip, skin); + const f32 out = strip.clipOut < 0.0f ? duration : std::min(strip.clipOut, duration); + return std::max(out - std::clamp(strip.clipIn, 0.0f, duration), 0.001f); +} + +} // namespace + +f32 clipStripLength(const ClipStrip& strip, const ImportedSkin* skin) { + return stripRange(strip, skin) / std::max(strip.speed, 0.01f) * static_cast(std::max(strip.repeat, 1)); +} + +bool clipStripSourceTime(const ClipStrip& strip, const ImportedSkin* skin, f32 time, f32& outSource) { + const f32 length = clipStripLength(strip, skin); + if (time < strip.start || time > strip.start + length) return false; + const f32 range = stripRange(strip, skin); + const f32 local = (time - strip.start) * std::max(strip.speed, 0.01f); + f32 within = local >= range * static_cast(std::max(strip.repeat, 1)) - 1.0e-5f ? range : std::fmod(local, range); + if (strip.reverse) within = range - within; + outSource = std::clamp(strip.clipIn, 0.0f, stripClipDuration(strip, skin)) + within; + return true; +} + +f32 clipStripFade(const ClipStrip& strip, const ImportedSkin* skin, f32 time, f32 autoFadeIn) { + const f32 length = clipStripLength(strip, skin); + if (strip.muted || time < strip.start || time > strip.start + length) return 0.0f; + f32 weight = std::clamp(strip.weight, 0.0f, 1.0f); + const f32 fadeIn = std::min(std::max(strip.fadeIn, autoFadeIn), length); + if (fadeIn > 0.0f && time - strip.start < fadeIn) { + weight *= evaluateKeyCurve(strip.fadeInCurve, (time - strip.start) / fadeIn); + } + const f32 fadeOut = std::min(strip.fadeOut, length); + const f32 end = strip.start + length; + if (fadeOut > 0.0f && end - time < fadeOut) { + weight *= 1.0f - evaluateKeyCurve(strip.fadeOutCurve, 1.0f - (end - time) / fadeOut); + } + return std::clamp(weight, 0.0f, 1.0f); +} + +f32 clipStripOverlapIn(const SkinnedPose& pose, size_t index, const ImportedSkin* skin) { + if (index >= pose.strips.size()) return 0.0f; + const ClipStrip& strip = pose.strips[index]; + f32 overlap = 0.0f; + for (size_t i = 0; i < pose.strips.size(); ++i) { + const ClipStrip& other = pose.strips[i]; + if (i == index || other.track != strip.track || other.muted) continue; + if (other.start > strip.start || (other.start == strip.start && i > index)) continue; + overlap = std::max(overlap, other.start + clipStripLength(other, skin) - strip.start); + } + return std::clamp(overlap, 0.0f, clipStripLength(strip, skin)); +} + +void buildStripMix(const SkinnedPose& pose, const ImportedSkin* skin, f32 time, std::vector& out) { + out.clear(); + if (!skin || pose.strips.empty()) return; + std::vector order(pose.strips.size()); + for (size_t i = 0; i < order.size(); ++i) order[i] = i; + std::stable_sort(order.begin(), order.end(), [&](size_t a, size_t b) { + const ClipStrip& sa = pose.strips[a]; + const ClipStrip& sb = pose.strips[b]; + return sa.track != sb.track ? sa.track < sb.track : sa.start < sb.start; + }); + PoseLayerMix layer; + for (size_t index : order) { + const ClipStrip& strip = pose.strips[index]; + f32 source = 0.0f; + if (!clipStripSourceTime(strip, skin, time, source)) continue; + const f32 weight = clipStripFade(strip, skin, time, clipStripOverlapIn(pose, index, skin)); + if (weight <= 0.0f) continue; + layer.samples.push_back({strip.clip, source, weight, false, strip.loopBlend}); + const f32 range = stripRange(strip, skin); + const f32 window = std::min(strip.loopBlend, range * 0.5f); + const f32 within = source - std::clamp(strip.clipIn, 0.0f, stripClipDuration(strip, skin)); + if (window > 0.0f && within > range - window) { + const f32 blend = (within - (range - window)) / window; + layer.samples.push_back({strip.clip, strip.clipIn, weight * blend, false, 0.0f}); + } + } + if (layer.samples.empty()) { + i32 hold = -1; + f32 holdEnd = -1.0f; + for (size_t index : order) { + const ClipStrip& strip = pose.strips[index]; + if (strip.muted) continue; + const f32 end = strip.start + clipStripLength(strip, skin); + if (time >= strip.start && end >= holdEnd) { + hold = static_cast(index); + holdEnd = end; + } else if (hold < 0 && time < strip.start && (holdEnd < 0.0f || strip.start < holdEnd)) { + hold = static_cast(index); + holdEnd = strip.start; + } + } + if (hold >= 0) { + const ClipStrip& strip = pose.strips[static_cast(hold)]; + f32 source = 0.0f; + if (!clipStripSourceTime(strip, skin, std::clamp(time, strip.start, strip.start + clipStripLength(strip, skin)), + source)) { + source = time < strip.start ? strip.clipIn : strip.clipOut < 0.0f + ? stripClipDuration(strip, skin) + : strip.clipOut; + } + layer.samples.push_back({strip.clip, source, std::clamp(strip.weight, 0.0f, 1.0f), false, 0.0f}); + } + } + if (!layer.samples.empty()) out.push_back(std::move(layer)); +} + +f32 stripsDuration(const SkinnedPose& pose, const ImportedSkin* skin) { + f32 end = 0.0f; + for (const ClipStrip& strip : pose.strips) end = std::max(end, strip.start + clipStripLength(strip, skin)); + return end; +} + +void ensureDefaultStrips(SkinnedPose& pose, const ImportedSkin* skin) { + if (pose.stripsInitialized || !skin) return; + pose.stripsInitialized = true; + if (!pose.strips.empty() || skin->clips.empty()) return; + i32 clip = pose.clipIndex; + if (clip < 0 || clip >= static_cast(skin->clips.size())) clip = 0; + ClipStrip strip; + strip.clip = clip; + const f32 duration = stripClipDuration(strip, skin); + strip.loopBlend = std::min(0.12f, duration * 0.12f); + pose.strips.push_back(strip); +} + +void bakeClipToKeys(SkinnedPose& pose, const ImportedSkin& skin, i32 clip, i32 bone) { + if (clip < 0 || clip >= static_cast(skin.clips.size())) return; + const SkeletalClip& source = skin.clips[static_cast(clip)]; + pose.keys.erase(std::remove_if(pose.keys.begin(), pose.keys.end(), + [&](const BoneKeyframe& key) { + return bone < 0 ? !isFingerBone(pose, skin, key.bone) : key.bone == bone; + }), + pose.keys.end()); + for (const auto& pair : source.channels) { + const i32 channel = static_cast(pair.key); + if (bone >= 0 && channel != bone) continue; + if (poseOmitsBone(pose, channel)) continue; + if (bone < 0 && isFingerBone(pose, skin, channel)) continue; + for (const SkeletalKeyframe& frame : pair.value) { + BoneKeyframe key; + key.time = frame.time; + key.bone = channel; + key.rotation = frame.rotation.toEuler(); + key.translation = frame.position; + pose.keys.push_back(key); + } + } + pose.sampleKeys = !pose.keys.empty(); +} + +bool deleteKeysNearTime(SkinnedPose& pose, i32 bone, f32 time, f32 window) { + bool removed = false; + auto near = [&](f32 keyTime) { return std::fabs(keyTime - time) <= window; }; + if (bone < 0) { + const auto size = pose.objectKeys.size(); + pose.objectKeys.erase(std::remove_if(pose.objectKeys.begin(), pose.objectKeys.end(), + [&](const ObjectKeyframe& key) { return near(key.time); }), + pose.objectKeys.end()); + removed = pose.objectKeys.size() != size; + } else { + const auto size = pose.keys.size(); + pose.keys.erase(std::remove_if(pose.keys.begin(), pose.keys.end(), + [&](const BoneKeyframe& key) { return key.bone == bone && near(key.time); }), + pose.keys.end()); + removed = pose.keys.size() != size; + } + return removed; +} + +namespace { + +void writeCurve(std::ostream& out, const KeyCurve& curve) { + out << static_cast(curve.mode) << '\t' << curve.x1 << '\t' << curve.y1 << '\t' << curve.x2 << '\t' << curve.y2; +} + +KeyCurve readCurve(const std::vector& fields, size_t at) { + KeyCurve curve; + if (at + 4 >= fields.size()) return curve; + const int mode = std::atoi(fields[at].c_str()); + curve.mode = static_cast(std::clamp(mode, 0, static_cast(KeyInterp::Custom))); + curve.x1 = std::strtof(fields[at + 1].c_str(), nullptr); + curve.y1 = std::strtof(fields[at + 2].c_str(), nullptr); + curve.x2 = std::strtof(fields[at + 3].c_str(), nullptr); + curve.y2 = std::strtof(fields[at + 4].c_str(), nullptr); + return curve; +} + +std::vector splitTabs(const std::string& line) { + std::vector fields; + std::string field; + std::istringstream stream(line); + while (std::getline(stream, field, '\t')) fields.push_back(field); + return fields; +} + +} // namespace + +bool savePoseAnimation(const std::string& path, const std::string& name, const SkinnedPose& pose, + const ImportedSkin* skin) { + std::error_code ec; + const std::filesystem::path file(path); + if (file.has_parent_path()) std::filesystem::create_directories(file.parent_path(), ec); + std::ofstream out(file); + if (!out) return false; + f32 duration = std::max(stripsDuration(pose, skin), 0.0f); + for (const BoneKeyframe& key : pose.keys) duration = std::max(duration, key.time); + for (const ObjectKeyframe& key : pose.objectKeys) duration = std::max(duration, key.time); + out << "CAFANIM1\n"; + out << "name " << name << '\n'; + out << "loop 1\n"; + out << "fps 30\n"; + out << "duration " << duration << '\n'; + out << "kind skeletal\n"; + out << "mesh " << pose.meshPath << '\n'; + auto clipName = [&](i32 clip) -> std::string { + if (skin && clip >= 0 && clip < static_cast(skin->clipNames.size())) return skin->clipNames[static_cast(clip)]; + return std::to_string(clip); + }; + auto boneName = [&](i32 bone) -> std::string { + if (skin && bone >= 0 && bone < static_cast(skin->boneNames.size())) return skin->boneNames[static_cast(bone)]; + return std::string(); + }; + for (const ClipStrip& strip : pose.strips) { + out << "strip\t" << strip.clip << '\t' << clipName(strip.clip) << '\t' << strip.track << '\t' << strip.start << '\t' + << strip.clipIn << '\t' << strip.clipOut << '\t' << strip.speed << '\t' << strip.repeat << '\t' << strip.fadeIn + << '\t' << strip.fadeOut << '\t'; + writeCurve(out, strip.fadeInCurve); + out << '\t'; + writeCurve(out, strip.fadeOutCurve); + out << '\t' << strip.weight << '\t' << (strip.muted ? 1 : 0) << '\t' << (strip.reverse ? 1 : 0) << '\t' + << strip.loopBlend << '\t' << strip.state << '\n'; + } + for (const BoneKeyframe& key : pose.keys) { + out << "bonekey\t" << key.time << '\t' << key.bone << '\t' << boneName(key.bone) << '\t' << key.rotation.x << '\t' + << key.rotation.y << '\t' << key.rotation.z << '\t' << key.translation.x << '\t' << key.translation.y << '\t' + << key.translation.z << '\t'; + writeCurve(out, key.curve); + out << '\n'; + } + for (const ObjectKeyframe& key : pose.objectKeys) { + out << "objkey\t" << key.time << '\t' << key.position.x << '\t' << key.position.y << '\t' << key.position.z << '\t'; + writeCurve(out, key.curve); + out << '\n'; + } + return static_cast(out); +} + +bool isPoseAnimationFile(const std::string& path) { + std::ifstream in(path); + std::string line; + for (int i = 0; i < 12 && std::getline(in, line); ++i) { + if (line == "kind skeletal") return true; + } + return false; +} + +bool loadPoseAnimation(const std::string& path, SkinnedPose& pose, const ImportedSkin* skin) { + std::ifstream in(path); + std::string line; + if (!std::getline(in, line) || line != "CAFANIM1") return false; + auto findClip = [&](const std::string& name, i32 fallback) -> i32 { + if (skin) { + for (size_t i = 0; i < skin->clipNames.size(); ++i) { + if (skin->clipNames[i] == name) return static_cast(i); + } + if (fallback >= 0 && fallback < static_cast(skin->clips.size())) return fallback; + return -1; + } + return fallback; + }; + auto findBone = [&](const std::string& name, i32 fallback) -> i32 { + if (skin && !name.empty()) { + for (size_t i = 0; i < skin->boneNames.size(); ++i) { + if (skin->boneNames[i] == name) return static_cast(i); + } + } + if (skin && fallback >= static_cast(skin->skeleton.boneCount())) return -1; + return fallback; + }; + std::vector strips; + std::vector keys; + std::vector objectKeys; + bool skeletal = false; + while (std::getline(in, line)) { + if (line == "kind skeletal") { + skeletal = true; + continue; + } + const std::vector f = splitTabs(line); + if (f.empty()) continue; + auto num = [&](size_t i) { return i < f.size() ? std::strtof(f[i].c_str(), nullptr) : 0.0f; }; + if (f[0] == "strip" && f.size() >= 23) { + ClipStrip strip; + strip.clip = findClip(f[2], std::atoi(f[1].c_str())); + if (strip.clip < 0) continue; + strip.track = std::atoi(f[3].c_str()); + strip.start = num(4); + strip.clipIn = num(5); + strip.clipOut = num(6); + strip.speed = num(7); + strip.repeat = std::max(1, std::atoi(f[8].c_str())); + strip.fadeIn = num(9); + strip.fadeOut = num(10); + strip.fadeInCurve = readCurve(f, 11); + strip.fadeOutCurve = readCurve(f, 16); + strip.weight = num(21); + strip.muted = std::atoi(f[22].c_str()) != 0; + strip.reverse = f.size() > 23 && std::atoi(f[23].c_str()) != 0; + strip.loopBlend = num(24); + if (f.size() > 25) std::snprintf(strip.state, sizeof(strip.state), "%s", f[25].c_str()); + strips.push_back(strip); + } else if (f[0] == "bonekey" && f.size() >= 10) { + BoneKeyframe key; + key.time = num(1); + key.bone = findBone(f[3], std::atoi(f[2].c_str())); + if (key.bone < 0) continue; + key.rotation = Vec3(num(4), num(5), num(6)); + key.translation = Vec3(num(7), num(8), num(9)); + key.curve = readCurve(f, 10); + keys.push_back(key); + } else if (f[0] == "objkey" && f.size() >= 5) { + ObjectKeyframe key; + key.time = num(1); + key.position = Vec3(num(2), num(3), num(4)); + key.curve = readCurve(f, 5); + objectKeys.push_back(key); + } + } + if (!skeletal) return false; + pose.strips = std::move(strips); + pose.stripsInitialized = true; + pose.keys = std::move(keys); + pose.objectKeys = std::move(objectKeys); + pose.sampleKeys = !pose.keys.empty(); + return true; } } // namespace Caffeine::Animation diff --git a/src/animation/SkinLibrary.hpp b/src/animation/SkinLibrary.hpp index f85a5996..e05076d0 100644 --- a/src/animation/SkinLibrary.hpp +++ b/src/animation/SkinLibrary.hpp @@ -3,6 +3,7 @@ #include "animation/SkeletalAnimation.hpp" #include "assets/MeshTypes.hpp" #include "ecs/Entity.hpp" +#include "ecs/MeshComponents.hpp" #include "ecs/World.hpp" #include @@ -16,10 +17,14 @@ struct ImportedSkin { std::vector clips; std::vector clipNames; const Assets::Mesh3D* mesh = nullptr; + bool synthesized = false; }; void registerImportedSkin(const std::string& path, ImportedSkin skin); const ImportedSkin* findImportedSkin(const std::string& path); +/// Build a T-pose humanoid from mesh bounds when the file has no glTF skin. +/// `replace` rebuilds an existing fitted skin after the mesh or bind changed. +bool synthesizeHumanoidSkin(const std::string& path, Assets::Mesh3D& mesh, bool replace = false); enum class HumanoidBone : u8 { Hips, @@ -39,12 +44,47 @@ enum class HumanoidBone : u8 { RightUpperLeg, RightLowerLeg, RightFoot, + LeftThumbProximal, + LeftThumbIntermediate, + LeftThumbDistal, + LeftIndexProximal, + LeftIndexIntermediate, + LeftIndexDistal, + LeftMiddleProximal, + LeftMiddleIntermediate, + LeftMiddleDistal, + LeftRingProximal, + LeftRingIntermediate, + LeftRingDistal, + LeftLittleProximal, + LeftLittleIntermediate, + LeftLittleDistal, + RightThumbProximal, + RightThumbIntermediate, + RightThumbDistal, + RightIndexProximal, + RightIndexIntermediate, + RightIndexDistal, + RightMiddleProximal, + RightMiddleIntermediate, + RightMiddleDistal, + RightRingProximal, + RightRingIntermediate, + RightRingDistal, + RightLittleProximal, + RightLittleIntermediate, + RightLittleDistal, Count }; +constexpr int kHumanoidBodyCount = static_cast(HumanoidBone::LeftThumbProximal); +constexpr int kHumanoidLegacyCount = kHumanoidBodyCount; + struct HumanoidRig { i32 bones[static_cast(HumanoidBone::Count)]; bool matched = false; + /// User mapping stays on the character. Automatic matching runs only while this is false. + bool manual = false; HumanoidRig() { for (i32& bone : bones) bone = -1; @@ -52,24 +92,142 @@ struct HumanoidRig { }; const char* humanoidBoneName(HumanoidBone bone); +bool isHumanoidFingerSlot(HumanoidBone bone); HumanoidRig matchHumanoid(const ImportedSkin& skin); +void refreshHumanoidMatched(HumanoidRig& rig); +void assignHumanoidBone(HumanoidRig& rig, HumanoidBone slot, i32 bone); /// Writes skinned positions into `out`. Unskinned meshes are copied through. void skinVertices(const Assets::Mesh3D& bind, const std::vector& bones, std::vector& out); +/// Local edit on top of the bind pose. Euler angles are radians. +struct BonePose { + Vec3 rotation{}; + Vec3 translation{}; +}; + +const char* keyInterpName(KeyInterp mode); +KeyCurve keyCurvePreset(KeyInterp mode); +/// Maps segment progress t in [0, 1] through the curve. +f32 evaluateKeyCurve(const KeyCurve& curve, f32 t); + +struct BoneKeyframe { + f32 time = 0.0f; + i32 bone = -1; + Vec3 rotation{}; + Vec3 translation{}; + KeyCurve curve; +}; + +struct ObjectKeyframe { + f32 time = 0.0f; + Vec3 position{}; + KeyCurve curve; +}; + +/// One clip placed on the timeline, edited like a strip in a video editor. +struct ClipStrip { + i32 clip = 0; + /// Row on the timeline. Higher tracks blend over lower ones. + i32 track = 0; + f32 start = 0.0f; + /// Source range in clip seconds. clipOut < 0 means the clip's end. + f32 clipIn = 0.0f; + f32 clipOut = -1.0f; + f32 speed = 1.0f; + /// Times the source range plays back to back. + i32 repeat = 1; + f32 fadeIn = 0.0f; + f32 fadeOut = 0.0f; + KeyCurve fadeInCurve; + KeyCurve fadeOutCurve; + f32 weight = 1.0f; + bool muted = false; + bool reverse = false; + /// Seconds at the end of each pass that blend back into the first frame, so loops close. + f32 loopBlend = 0.0f; + /// Animator state this strip stands for. Empty when the strip is free. + char state[32] = {}; +}; + +/// Clip and its playback time, blended over what came before it in the layer. +struct PoseSample { + i32 clip = -1; + f32 time = 0.0f; + f32 weight = 1.0f; + bool loop = true; + f32 loopBlend = 0.0f; +}; + +struct PoseLayerMix { + std::vector samples; + f32 weight = 1.0f; + bool additive = false; + u32 mask = 0x7Fu; +}; + /// Owned playback for a skinned or general 3D mesh. The skeleton stays in the import library. struct SkinnedPose { char meshPath[260] = {}; i32 clipIndex = 0; f32 time = 0.0f; f32 speed = 1.0f; - bool playing = true; + bool playing = false; + /// Cleared on load so an imported clip does not start until Play is pressed. + bool editorHeld = false; bool loop = true; bool loaded = false; + /// Timeline sets this while playing or scrubbing so keys replace the live pose. + bool sampleKeys = false; HumanoidRig humanoid; + std::vector offsets; + std::vector keys; + std::vector objectKeys; + /// Joints the user removed from the editable skeleton. Skinning keeps the bind pose. + std::vector removedBones; + /// Timeline clip strips. Filled from the imported clips the first time the timeline opens. + std::vector strips; + bool stripsInitialized = false; + /// Editor override: the timeline writes the blend it wants shown. + std::vector overrideMix; + u64 overrideFrame = 0; + /// Timeline is open on this entity. tickSkinnedPoses keeps overrideMix until this is cleared. + bool timelineHold = false; }; +/// Seconds the strip occupies on the timeline. +f32 clipStripLength(const ClipStrip& strip, const ImportedSkin* skin); +/// Source clip time at timeline time `time`, or false outside the strip. +bool clipStripSourceTime(const ClipStrip& strip, const ImportedSkin* skin, f32 time, f32& outSource); +/// Fade weight at timeline time `time` (0 outside the strip). Overlap with the previous strip on the +/// same track counts as a crossfade even without an explicit fade in. +f32 clipStripFade(const ClipStrip& strip, const ImportedSkin* skin, f32 time, f32 autoFadeIn); +/// Seconds the strip overlaps the strip before it on the same track. +f32 clipStripOverlapIn(const SkinnedPose& pose, size_t index, const ImportedSkin* skin); +void buildStripMix(const SkinnedPose& pose, const ImportedSkin* skin, f32 time, std::vector& out); +f32 stripsDuration(const SkinnedPose& pose, const ImportedSkin* skin); +/// Places the active imported clip on track 0, once per pose, with a loop blend. +void ensureDefaultStrips(SkinnedPose& pose, const ImportedSkin* skin); +/// Copies the imported clip's channels onto editable pose keys. bone < 0 bakes every non-finger joint. +void bakeClipToKeys(SkinnedPose& pose, const ImportedSkin& skin, i32 clip, i32 bone); +/// Removes keys of `bone` (`-1` is object position) near `time`. Returns true when anything was removed. +bool deleteKeysNearTime(SkinnedPose& pose, i32 bone, f32 time, f32 window = 0.02f); +/// Monotonic tick counter. overrideMix is honoured while overrideFrame is this or the last tick. +u64 skinFrameCounter(); + +/// Skeletal .anim asset: strips, bone keys, object keys and their curves. +bool savePoseAnimation(const std::string& path, const std::string& name, const SkinnedPose& pose, + const ImportedSkin* skin); +bool loadPoseAnimation(const std::string& path, SkinnedPose& pose, const ImportedSkin* skin); +/// True when the file holds skeletal data rather than sprite frames. +bool isPoseAnimationFile(const std::string& path); + +bool isFingerBoneName(const std::string& name); +bool poseOmitsBone(const SkinnedPose& pose, i32 bone); +/// Name tokens, hand children, or a slot the user assigned. +bool isFingerBone(const SkinnedPose& pose, const ImportedSkin& skin, i32 bone); + /// Grid of frames on one texture. frameIndex selects the cell. struct SpriteSheet { u32 columns = 1; @@ -87,10 +245,26 @@ struct SpriteSheetRect { SpriteSheetRect spriteSheetFrame(const SpriteSheet& sheet, u32 frame, f32 textureWidth, f32 textureHeight); const std::vector* skinnedVerticesFor(u32 entityId); +/// Bumps only when the posed vertex buffer changes. Zero means the bind mesh is in use. +u64 skinnedGenerationFor(u32 entityId); +/// Increments whenever any entity's posed vertices change. The editor viewport uses it to redraw. +u64 skinRevision(); const std::vector* jointPositionsFor(u32 entityId); const std::vector* jointParentsFor(u32 entityId); +/// Skin-space frame of a joint before its own edit rotation: skinSpace * parent * bind local * translation. +/// The gizmo uses it to turn screen drags into bone-local rotation and translation. +bool boneEditFrame(const ImportedSkin& skin, const SkinnedPose& pose, i32 bone, Mat4& out, + u32 entityId = 0xFFFFFFFFu); +/// Layer weight after its groups' weights and mute flags. +f32 effectiveLayerWeight(const Animator& animator, const AnimatorLayer& layer); +/// Pose layers for the animator's current states and crossfades. Empty when nothing is playing. +void buildAnimatorMix(const Animator& animator, const ImportedSkin& skin, std::vector& out); +/// Clip index the animator state plays, or -1. A state's motion name wins over its own name. +i32 clipForAnimatorState(const ImportedSkin& skin, const char* stateName, const char* motionName); /// Editor and runtime pass the project root so `assets/...` paths resolve. void setSkinProjectRoot(const std::string& projectRoot); +/// If the entity's mesh has a skeleton, attach SkinnedPose so the timeline can drive it. +SkinnedPose* ensurePoseForMesh(ECS::World& world, ECS::Entity entity, const std::string& projectRoot); void tickSkinnedPoses(ECS::World& world, f32 dt); } // namespace Caffeine::Animation diff --git a/src/assets/MeshCache.cpp b/src/assets/MeshCache.cpp index 8666d8b3..e873cd25 100644 --- a/src/assets/MeshCache.cpp +++ b/src/assets/MeshCache.cpp @@ -67,14 +67,14 @@ std::filesystem::path findEngineAssetsRoot() { Mesh3D* loadMeshFromBuffer(const std::string& path, const std::vector& buffer, std::string& outError) { if (buffer.empty()) { - outError = "Ficheiro vazio"; + outError = "Empty file"; return nullptr; } const std::string ext = extensionLower(path); if (ext == ".obj") { Mesh3D* mesh = MeshLoader::parseOBJ(reinterpret_cast(buffer.data()), buffer.size()); - if (!mesh) outError = "Falha ao interpretar OBJ"; + if (!mesh) outError = "Failed to parse OBJ"; return mesh; } if (ext == ".gltf" || ext == ".glb") { @@ -90,7 +90,7 @@ Mesh3D* loadMeshFromBuffer(const std::string& path, const std::vector& buffe std::string parseError; Mesh3D* mesh = MeshLoader::parseGLTF(buffer.data(), buffer.size(), path.c_str(), &parseError); if (!mesh) { - outError = parseError.empty() ? "Falha ao interpretar glTF" : parseError; + outError = parseError.empty() ? "Failed to parse glTF" : parseError; } return mesh; } @@ -100,11 +100,11 @@ Mesh3D* loadMeshFromBuffer(const std::string& path, const std::vector& buffe if (objPath.string() != path && std::filesystem::exists(objPath)) { return MeshCache::getInstance().getMesh(objPath.string()); } - outError = "FBX nao suportado — exporte como OBJ ou glTF"; + outError = "FBX is not supported — export as OBJ or glTF"; return nullptr; } - outError = "Formato de mesh nao suportado"; + outError = "Unsupported mesh format"; return nullptr; } @@ -244,7 +244,7 @@ Mesh3D* MeshCache::getMesh(const std::string& path, const std::string& projectRo m_lastResolvedPath.clear(); if (path.empty()) { - m_lastError = "Caminho do mesh vazio"; + m_lastError = "Empty mesh path"; return nullptr; } @@ -275,7 +275,7 @@ Mesh3D* MeshCache::getMesh(const std::string& path, const std::string& projectRo } if (m_lastError.empty()) { - m_lastError = "Ficheiro nao encontrado: " + path; + m_lastError = "File not found: " + path; } return nullptr; } diff --git a/src/assets/MeshImportValidator.cpp b/src/assets/MeshImportValidator.cpp index bbba2721..a2ae2cdb 100644 --- a/src/assets/MeshImportValidator.cpp +++ b/src/assets/MeshImportValidator.cpp @@ -130,8 +130,8 @@ MeshImportReport MeshImportValidator::analyze(const std::filesystem::path& meshP MeshImportReport report; report.meshFileExists = std::filesystem::exists(meshPath); if (!report.meshFileExists) { - report.errorSummary = "Ficheiro nao encontrado"; - report.suggestion = "Verifique o caminho do mesh no Inspector."; + report.errorSummary = "File not found"; + report.suggestion = "Check the mesh path in the Inspector."; return report; } @@ -149,13 +149,13 @@ MeshImportReport MeshImportValidator::analyze(const std::filesystem::path& meshP classifyDependencies(meshDir, listGltfExternalUris(meshPath), report); report.readyToLoad = report.missingDependencies.empty(); if (!report.readyToLoad) { - report.errorSummary = "Ficheiros em falta: "; + report.errorSummary = "Missing files: "; for (size_t i = 0; i < report.missingDependencies.size(); ++i) { if (i > 0) report.errorSummary += ", "; report.errorSummary += report.missingDependencies[i]; } report.suggestion = - "Copie o .bin e as texturas para assets/raw, ou exporte como .glb (tudo num ficheiro)."; + "Copy the .bin and textures into assets/raw, or export as .glb (everything in one file)."; } return report; } @@ -165,12 +165,12 @@ MeshImportReport MeshImportValidator::analyze(const std::filesystem::path& meshP classifyDependencies(meshDir, listObjExternalFiles(meshPath), report); report.readyToLoad = report.missingDependencies.empty(); if (!report.readyToLoad) { - report.errorSummary = "Ficheiros em falta: "; + report.errorSummary = "Missing files: "; for (size_t i = 0; i < report.missingDependencies.size(); ++i) { if (i > 0) report.errorSummary += ", "; report.errorSummary += report.missingDependencies[i]; } - report.suggestion = "Importe o .obj com o .mtl e texturas na mesma pasta."; + report.suggestion = "Import the .obj with the .mtl and textures in the same folder."; } else { report.readyToLoad = true; } @@ -184,15 +184,15 @@ MeshImportReport MeshImportValidator::analyze(const std::filesystem::path& meshP return analyze(objPath); } report.readyToLoad = false; - report.errorSummary = "FBX nao suportado diretamente"; - report.suggestion = "Exporte como OBJ ou glTF (.glb recomendado)."; + report.errorSummary = "FBX is not supported directly"; + report.suggestion = "Export as OBJ or glTF (.glb recommended)."; return report; } report.format = ext.empty() ? "unknown" : ext.substr(1); report.readyToLoad = false; - report.errorSummary = "Formato de mesh nao suportado"; - report.suggestion = "Use OBJ, glTF ou GLB."; + report.errorSummary = "Unsupported mesh format"; + report.suggestion = "Use OBJ, glTF, or GLB."; return report; } diff --git a/src/assets/MeshLoader.cpp b/src/assets/MeshLoader.cpp index e267b12e..0ca20535 100644 --- a/src/assets/MeshLoader.cpp +++ b/src/assets/MeshLoader.cpp @@ -15,6 +15,10 @@ #include #include #include +#include +#include +#include +#include namespace Caffeine::Assets { using namespace Caffeine; @@ -144,7 +148,17 @@ Mat4 gltfNodeLocal(const tinygltf::Node& node) { void importGltfSkin(const tinygltf::Model& model, const std::string& path, Mesh3D* mesh) { if (!mesh || model.skins.empty() || model.nodes.empty()) return; - const tinygltf::Skin& skin = model.skins[0]; + size_t skinIndex = 0; + bool foundSkin = false; + for (size_t i = 0; i < model.skins.size(); ++i) { + if (!model.skins[i].joints.empty()) { + skinIndex = i; + foundSkin = true; + break; + } + } + if (!foundSkin) return; + const tinygltf::Skin& skin = model.skins[skinIndex]; if (skin.joints.empty()) return; std::vector parent(model.nodes.size(), -1); @@ -180,6 +194,57 @@ void importGltfSkin(const tinygltf::Model& model, const std::string& path, Mesh3 imported.skeleton.bones[joint].parentIndex = parentBone; } + std::vector extraNodes; + extraNodes.reserve(model.nodes.size()); + for (size_t nodeIndex = 0; nodeIndex < model.nodes.size(); ++nodeIndex) { + if (boneOfNode[nodeIndex] >= 0) continue; + int cursor = parent[nodeIndex]; + bool underJoint = false; + for (int guard = 0; cursor >= 0 && guard < 64; ++guard) { + if (boneOfNode[static_cast(cursor)] >= 0) { + underJoint = true; + break; + } + cursor = parent[static_cast(cursor)]; + } + if (underJoint) extraNodes.push_back(static_cast(nodeIndex)); + } + std::sort(extraNodes.begin(), extraNodes.end(), [&](int a, int b) { + auto depthOf = [&](int node) { + int depth = 0; + for (int cursor = parent[static_cast(node)]; cursor >= 0 && depth < 64; + cursor = parent[static_cast(cursor)]) { + ++depth; + } + return depth; + }; + return depthOf(a) < depthOf(b); + }); + for (int nodeIndex : extraNodes) { + if (imported.skeleton.bones.size() >= 256) break; + if (nodeIndex < 0 || nodeIndex >= static_cast(model.nodes.size())) continue; + if (boneOfNode[static_cast(nodeIndex)] >= 0) continue; + const tinygltf::Node& node = model.nodes[static_cast(nodeIndex)]; + const int bone = static_cast(imported.skeleton.bones.size()); + boneOfNode[static_cast(nodeIndex)] = bone; + imported.boneNames.push_back(node.name.empty() ? ("bone_" + std::to_string(bone)) : node.name); + Animation::Bone added; + added.name = imported.boneNames.back().c_str(); + added.localTransform = gltfNodeLocal(node); + added.bindPoseInverse = Mat4::identity(); + int cursor = parent[static_cast(nodeIndex)]; + int parentBone = -1; + while (cursor >= 0) { + if (boneOfNode[static_cast(cursor)] >= 0) { + parentBone = boneOfNode[static_cast(cursor)]; + break; + } + cursor = parent[static_cast(cursor)]; + } + added.parentIndex = parentBone; + imported.skeleton.bones.push_back(added); + } + std::vector nodeWorld(model.nodes.size(), Mat4::identity()); std::vector visited(model.nodes.size(), 0); const auto walkNode = [&](auto&& self, int index, const Mat4& parentWorld) -> void { @@ -208,6 +273,15 @@ void importGltfSkin(const tinygltf::Model& model, const std::string& path, Mesh3 imported.skeleton.bones[joint].bindPoseInverse = inverse; } } + const size_t authoredJoints = skin.joints.size(); + for (size_t nodeIndex = 0; nodeIndex < model.nodes.size(); ++nodeIndex) { + const int bone = boneOfNode[nodeIndex]; + if (bone < static_cast(authoredJoints)) continue; + Mat4 inverse; + if (invertMat4(nodeWorld[nodeIndex], inverse)) { + imported.skeleton.bones[static_cast(bone)].bindPoseInverse = inverse; + } + } mesh->skin.assign(mesh->vertices.size(), {}); u32 vertexCursor = 0; @@ -258,6 +332,20 @@ void importGltfSkin(const tinygltf::Model& model, const std::string& path, Mesh3 clip.name = animation.name.empty() ? "Clip" : animation.name.c_str(); clip.loop = true; f32 duration = 0.0f; + // Translation, rotation and scale arrive as separate tracks with their own key times. + // Each bone is resampled on the union of its track times so the merged keys stay in order. + struct Track { + std::vector times; + std::vector vectors; + std::vector rotations; + bool step = false; + }; + struct BoneTracks { + Track translation; + Track rotation; + Track scale; + }; + std::unordered_map boneTracks; for (const tinygltf::AnimationChannel& channel : animation.channels) { if (channel.target_node < 0 || channel.target_node >= static_cast(boneOfNode.size())) continue; const int bone = boneOfNode[static_cast(channel.target_node)]; @@ -280,44 +368,82 @@ void importGltfSkin(const tinygltf::Model& model, const std::string& path, Mesh3 continue; } const int components = channel.target_path == "rotation" ? 4 : 3; - const Mat4& rest = imported.skeleton.bones[static_cast(bone)].localTransform; - const Vec3 restPosition(rest(0, 3), rest(1, 3), rest(2, 3)); - const Vec3 restScale(Vec3(rest(0, 0), rest(1, 0), rest(2, 0)).length(), - Vec3(rest(0, 1), rest(1, 1), rest(2, 1)).length(), - Vec3(rest(0, 2), rest(1, 2), rest(2, 2)).length()); - const Quat restRotation = Quat::fromMatrix(rest); - std::vector keys(timeCount); + BoneTracks& tracks = boneTracks[bone]; + Track& track = channel.target_path == "translation" ? tracks.translation + : channel.target_path == "scale" ? tracks.scale + : tracks.rotation; + track = Track{}; + track.step = sampler.interpolation == "STEP"; for (size_t key = 0; key < timeCount; ++key) { f32 time = 0.0f; std::memcpy(&time, times + key * timeStride, sizeof(f32)); - keys[key].time = time; - keys[key].position = restPosition; - keys[key].rotation = restRotation; - keys[key].scale = restScale; duration = std::max(duration, time); const u8* value = values + (key * static_cast(valuesPerKey) + (cubic ? 1 : 0)) * valueStride; f32 raw[4] = {0, 0, 0, 1}; std::memcpy(raw, value, sizeof(f32) * static_cast(components)); - if (channel.target_path == "translation") keys[key].position = Vec3(raw[0], raw[1], raw[2]); - else if (channel.target_path == "scale") keys[key].scale = Vec3(raw[0], raw[1], raw[2]); - else keys[key].rotation = Quat(raw[0], raw[1], raw[2], raw[3]); + track.times.push_back(time); + if (components == 4) track.rotations.push_back(Quat(raw[0], raw[1], raw[2], raw[3]).normalized()); + else track.vectors.push_back(Vec3(raw[0], raw[1], raw[2])); } - const std::vector* existing = clip.channels.get(static_cast(bone)); - std::vector merged = existing ? *existing : std::vector{}; - if (merged.empty()) { - merged = keys; - } else { - for (size_t key = 0; key < keys.size() && key < merged.size(); ++key) { - if (channel.target_path == "translation") merged[key].position = keys[key].position; - else if (channel.target_path == "scale") merged[key].scale = keys[key].scale; - else if (channel.target_path == "rotation") merged[key].rotation = keys[key].rotation; - } - if (keys.size() > merged.size()) { - for (size_t key = merged.size(); key < keys.size(); ++key) merged.push_back(keys[key]); - } + } + auto trackSegment = [](const Track& track, f32 time, size_t& index, f32& alpha) { + const auto upper = std::upper_bound(track.times.begin(), track.times.end(), time); + if (upper == track.times.begin()) { + index = 0; + alpha = 0.0f; + return; } - (void)rest; - clip.channels.set(static_cast(bone), merged); + index = static_cast(upper - track.times.begin()) - 1; + if (index + 1 >= track.times.size()) { + alpha = 0.0f; + return; + } + const f32 span = track.times[index + 1] - track.times[index]; + alpha = (track.step || span <= 0.0f) ? 0.0f : (time - track.times[index]) / span; + }; + auto sampleVector = [&](const Track& track, f32 time, const Vec3& fallback) { + if (track.times.empty() || track.vectors.empty()) return fallback; + size_t index = 0; + f32 alpha = 0.0f; + trackSegment(track, time, index, alpha); + const Vec3& a = track.vectors[std::min(index, track.vectors.size() - 1)]; + if (alpha <= 0.0f || index + 1 >= track.vectors.size()) return a; + return a + (track.vectors[index + 1] - a) * alpha; + }; + auto sampleRotation = [&](const Track& track, f32 time, const Quat& fallback) { + if (track.times.empty() || track.rotations.empty()) return fallback; + size_t index = 0; + f32 alpha = 0.0f; + trackSegment(track, time, index, alpha); + const Quat& a = track.rotations[std::min(index, track.rotations.size() - 1)]; + if (alpha <= 0.0f || index + 1 >= track.rotations.size()) return a; + return Quat::slerp(a, track.rotations[index + 1], alpha).normalized(); + }; + for (auto& [bone, tracks] : boneTracks) { + const Mat4& rest = imported.skeleton.bones[static_cast(bone)].localTransform; + const Vec3 restPosition(rest(0, 3), rest(1, 3), rest(2, 3)); + const Vec3 restScale(Vec3(rest(0, 0), rest(1, 0), rest(2, 0)).length(), + Vec3(rest(0, 1), rest(1, 1), rest(2, 1)).length(), + Vec3(rest(0, 2), rest(1, 2), rest(2, 2)).length()); + const Quat restRotation = Quat::fromMatrix(rest); + std::vector keyTimes; + for (const Track* track : {&tracks.translation, &tracks.rotation, &tracks.scale}) { + keyTimes.insert(keyTimes.end(), track->times.begin(), track->times.end()); + } + std::sort(keyTimes.begin(), keyTimes.end()); + keyTimes.erase(std::unique(keyTimes.begin(), keyTimes.end(), + [](f32 a, f32 b) { return std::fabs(a - b) < 1.0e-5f; }), + keyTimes.end()); + if (keyTimes.empty()) continue; + std::vector keys(keyTimes.size()); + for (size_t key = 0; key < keyTimes.size(); ++key) { + const f32 time = keyTimes[key]; + keys[key].time = time; + keys[key].position = sampleVector(tracks.translation, time, restPosition); + keys[key].rotation = sampleRotation(tracks.rotation, time, restRotation); + keys[key].scale = sampleVector(tracks.scale, time, restScale); + } + clip.channels.set(static_cast(bone), std::move(keys)); } if (clip.channels.size() == 0) continue; clip.duration = duration; @@ -326,6 +452,71 @@ void importGltfSkin(const tinygltf::Model& model, const std::string& path, Mesh3 } imported.mesh = mesh; + // Bind pose must land on the raw vertices. Some exporters leave the armature + // at 0.01 while the inverse-bind stays in centimeters, and the inverse mesh + // transform then throws the character thousands of units away. + if (mesh->skin.size() == mesh->vertices.size() && !imported.skeleton.bones.empty()) { + const u32 boneCount = imported.skeleton.boneCount(); + std::vector world(boneCount, Mat4::identity()); + std::vector resolved(boneCount, 0); + for (u32 pass = 0; pass < boneCount; ++pass) { + bool progressed = false; + for (u32 bone = 0; bone < boneCount; ++bone) { + if (resolved[bone]) continue; + const i32 parent = imported.skeleton.bones[bone].parentIndex; + if (parent >= 0 && (parent >= static_cast(boneCount) || !resolved[static_cast(parent)])) { + continue; + } + world[bone] = parent >= 0 + ? world[static_cast(parent)] * imported.skeleton.bones[bone].localTransform + : imported.skeleton.bones[bone].localTransform; + resolved[bone] = 1; + progressed = true; + } + if (!progressed) break; + } + const auto bindError = [&](const Mat4& space) -> f32 { + f32 error = 0.0f; + int samples = 0; + const size_t step = std::max(1, mesh->vertices.size() / 24); + for (size_t i = 0; i < mesh->vertices.size() && samples < 24; i += step) { + const Vec3& vertex = mesh->vertices[i].position; + const VertexSkin& influence = mesh->skin[i]; + Vec3 posed{}; + f32 weightSum = 0.0f; + for (int channel = 0; channel < 4; ++channel) { + const f32 weight = influence.weights[channel]; + if (weight <= 0.0f) continue; + const u32 joint = influence.joints[channel]; + if (joint >= boneCount) continue; + const Mat4 skinMatrix = + space * world[joint] * imported.skeleton.bones[joint].bindPoseInverse; + posed = posed + skinMatrix.transformPoint(vertex) * weight; + weightSum += weight; + } + if (weightSum <= 0.0f) continue; + error += (posed - vertex).length(); + ++samples; + } + return samples > 0 ? error / static_cast(samples) : 1.0e9f; + }; + const f32 currentError = bindError(imported.skeleton.skinSpace); + if (currentError > 0.01f) { + Mat4 meshWorld; + f32 bestError = currentError; + Mat4 chosen = imported.skeleton.skinSpace; + if (invertMat4(imported.skeleton.skinSpace, meshWorld)) { + const f32 scaledError = bindError(meshWorld); + if (scaledError < bestError) { + bestError = scaledError; + chosen = meshWorld; + } + } + const f32 identityError = bindError(Mat4::identity()); + if (identityError < bestError) chosen = Mat4::identity(); + imported.skeleton.skinSpace = chosen; + } + } Animation::registerImportedSkin(path, std::move(imported)); } @@ -334,14 +525,14 @@ void importGltfSkin(const tinygltf::Model& model, const std::string& path, Mesh3 Mesh3D* MeshLoader::parseGLTF(const u8* data, usize dataLen, const char* filename, std::string* outError) { if (!filename) { - if (outError) *outError = "Dados glTF invalidos"; + if (outError) *outError = "Invalid glTF data"; return nullptr; } const std::string filenameStr(filename); const bool isGlb = filenameStr.ends_with(".glb"); if (isGlb && (!data || dataLen == 0)) { - if (outError) *outError = "Dados glTF invalidos"; + if (outError) *outError = "Invalid glTF data"; return nullptr; } @@ -372,13 +563,13 @@ Mesh3D* MeshLoader::parseGLTF(const u8* data, usize dataLen, const char* filenam if (!success) { if (outError) { - *outError = err.empty() ? "Falha ao carregar glTF" : err; + *outError = err.empty() ? "Failed to load glTF" : err; } return nullptr; } if (model.meshes.empty()) { - if (outError) *outError = "glTF nao contem meshes"; + if (outError) *outError = "glTF contains no meshes"; return nullptr; } @@ -531,7 +722,7 @@ Mesh3D* MeshLoader::parseGLTF(const u8* data, usize dataLen, const char* filenam if (vertices.empty()) { delete mesh; - if (outError) *outError = "glTF sem vertices validos"; + if (outError) *outError = "glTF has no valid vertices"; return nullptr; } @@ -590,4 +781,46 @@ void MeshLoader::loadPNGTexture(Mesh3D* mesh, const char* pngPath) { loadTextureFromFile(mesh, pngPath); } +void MeshLoader::ensureGltfSkin(const std::string& path, Mesh3D* mesh) { + if (path.empty() || !mesh || Animation::findImportedSkin(path)) return; + static std::unordered_set attempted; + if (!attempted.insert(path).second) return; + + const auto skipImages = [](tinygltf::Image* image, const int, std::string*, std::string*, int, int, + const unsigned char*, int, void*) -> bool { + if (image) { + image->image.clear(); + image->width = 0; + image->height = 0; + image->component = 0; + } + return true; + }; + + const bool isGlb = path.size() >= 4 && + (path.ends_with(".glb") || path.ends_with(".GLB")); + tinygltf::Model model; + tinygltf::TinyGLTF loader; + loader.SetImageLoader(skipImages, nullptr); + std::string err, warn; + std::string basePath; + const size_t lastSlash = path.find_last_of("/\\"); + if (lastSlash != std::string::npos) basePath = path.substr(0, lastSlash + 1); + bool success = false; + if (isGlb) { + std::ifstream file(path, std::ios::binary); + if (!file) return; + std::vector buffer((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + if (buffer.empty()) return; + success = loader.LoadBinaryFromMemory(&model, &err, &warn, buffer.data(), + static_cast(buffer.size()), basePath); + } else { + success = loader.LoadASCIIFromFile(&model, &err, &warn, path); + } + if (success) importGltfSkin(model, path, mesh); + if (!Animation::findImportedSkin(path)) { + Animation::synthesizeHumanoidSkin(path, *mesh); + } +} + } diff --git a/src/assets/MeshLoader.hpp b/src/assets/MeshLoader.hpp index 7a9fb838..1c6d1802 100644 --- a/src/assets/MeshLoader.hpp +++ b/src/assets/MeshLoader.hpp @@ -184,6 +184,7 @@ class MeshLoader { static Mesh3D* parseGLTF(const u8* data, usize dataLen, const char* filename, std::string* outError = nullptr); + static void ensureGltfSkin(const std::string& path, Mesh3D* mesh); static bool loadTextureFromFile(Mesh3D* mesh, const char* imagePath); static void loadPNGTexture(Mesh3D* mesh, const char* pngPath); diff --git a/src/ecs/EnvironmentEffectsComponents.hpp b/src/ecs/EnvironmentEffectsComponents.hpp new file mode 100644 index 00000000..fc739b81 --- /dev/null +++ b/src/ecs/EnvironmentEffectsComponents.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec3.hpp" + +namespace Caffeine::ECS { + +enum class EnvironmentEffectKind : u8 { + WorldLight = 0, +}; + +enum class WorldLightMode : u8 { + DayNight = 0, + Zone = 1, +}; + +/// Scene-wide environment driver. Core engine object, not a plugin. +/// World Light Simulation: Day/Night rotates the sun and ambient; Zone tints a volume. +struct EnvironmentEffectsComponent { + u8 kind = 0; + u8 mode = 0; + u8 enabled = 1; + u8 driveExistingLights = 1; + f32 timeOfDay = 14.0f; + f32 dayLengthSeconds = 0.0f; + f32 sunIntensity = 1.2f; + f32 moonIntensity = 0.18f; + Vec3 sunColor{1.00f, 0.96f, 0.88f}; + Vec3 moonColor{0.45f, 0.55f, 0.85f}; + f32 ambientDay = 0.28f; + f32 ambientNight = 0.04f; + f32 shadowStrength = 1.0f; + f32 aoDay = 0.18f; + f32 aoNight = 0.55f; + f32 zoneRadius = 12.0f; + Vec3 zoneColor{1.00f, 0.92f, 0.75f}; + f32 zoneIntensity = 1.0f; + f32 zoneFalloff = 1.5f; + Vec3 drivenAmbient{0.18f, 0.18f, 0.20f}; + f32 drivenAmbient2D = 1.0f; + f32 skyExposure = 1.0f; + u8 castShadows = 1; + u8 environmentLighting = 1; + u8 ambientOcclusion = 1; + u8 volumetricsEnabled = 1; + f32 indoorDarkness = 0.92f; + f32 skyVisibility = 1.0f; + f32 volumetricDensity = 0.045f; +}; + +} // namespace Caffeine::ECS diff --git a/src/editor/AnimationEditorLink.hpp b/src/editor/AnimationEditorLink.hpp new file mode 100644 index 00000000..3a1a1746 --- /dev/null +++ b/src/editor/AnimationEditorLink.hpp @@ -0,0 +1,121 @@ +#pragma once + +#include "animation/AnimationComponents.hpp" +#include "animation/SkinLibrary.hpp" +#include "core/Types.hpp" + +#include +#include +#include + +namespace Caffeine::Editor { + +/// State the Animation Timeline and the Animator Controller share, so each can follow the other. +struct AnimationEditorLink { + u32 entity = 0xFFFFFFFFu; + + /// Timeline side, refreshed every frame the timeline drives the pose. + u64 timelineFrame = 0; + std::string timelineState; + std::string timelineFadeFrom; + f32 timelineFade = 1.0f; + f32 timelineStateProgress = 0.0f; + bool timelinePlaying = false; + + /// Animator side. + bool animatorPreview = false; + std::string previewState; + f32 previewTime = 0.0f; + std::string selectedState; + u64 selectionSerial = 0; + std::string selectedFrom; + std::string selectedTo; + u64 transitionSerial = 0; + + /// Timeline asks the animator to select and frame a state. + std::string focusState; + u64 focusSerial = 0; + + /// Asset Browser asks the timeline to open an .anim file. + std::string openAnimRequest; + + static AnimationEditorLink& get() { + static AnimationEditorLink link; + return link; + } + + bool timelineActive(u64 frame) const { return timelineFrame + 2 >= frame && !timelineState.empty(); } +}; + +/// The animator state a strip stands for: its binding, or the base-layer state that plays its clip. +inline std::string stripStateName(const Animation::ClipStrip& strip, const Animation::Animator* animator, + const Animation::ImportedSkin* skin) { + if (strip.state[0] != '\0') return strip.state; + if (!animator || !skin || strip.clip < 0 || strip.clip >= static_cast(skin->clipNames.size())) return {}; + const std::string& clip = skin->clipNames[static_cast(strip.clip)]; + for (const auto& pair : animator->states) { + const char* motion = pair.value.motion.empty() ? pair.key.cStr() : pair.value.motion.cStr(); + if (clip == motion) return pair.key.cStr(); + } + return {}; +} + +/// Track-0 strips sorted by start. Consecutive pairs are the crossfades the animator mirrors. +inline std::vector baseTrackOrder(const Animation::SkinnedPose& pose) { + std::vector order; + for (size_t i = 0; i < pose.strips.size(); ++i) { + if (pose.strips[i].track == 0) order.push_back(i); + } + std::stable_sort(order.begin(), order.end(), + [&](size_t a, size_t b) { return pose.strips[a].start < pose.strips[b].start; }); + return order; +} + +/// Crossfade length between a strip and the one before it: overlap, or the explicit fade in. +inline f32 stripCrossfade(const Animation::SkinnedPose& pose, size_t index, const Animation::ImportedSkin* skin) { + return std::max(Animation::clipStripOverlapIn(pose, index, skin), pose.strips[index].fadeIn); +} + +inline Animation::AnimationTransition* findTransition(Animation::AnimatorStateMachine& sm, const std::string& from, + const std::string& to) { + Animation::AnimationState* state = sm.states.get(FixedString<32>(from.c_str())); + if (!state) return nullptr; + for (Animation::AnimationTransition& transition : state->transitions) { + if (to == transition.toState.cStr()) return &transition; + } + return nullptr; +} + +/// Timeline to animator: crossfades between bound strips become the matching transitions' blend. +inline void pushStripFadesToAnimator(const Animation::SkinnedPose& pose, const Animation::ImportedSkin* skin, + Animation::Animator& animator) { + const std::vector order = baseTrackOrder(pose); + for (size_t i = 1; i < order.size(); ++i) { + const std::string from = stripStateName(pose.strips[order[i - 1]], &animator, skin); + const std::string to = stripStateName(pose.strips[order[i]], &animator, skin); + if (from.empty() || to.empty() || from == to) continue; + if (Animation::AnimationTransition* transition = findTransition(animator, from, to)) { + transition->blendTime = stripCrossfade(pose, order[i], skin); + transition->blendCurve = pose.strips[order[i]].fadeInCurve; + } + } +} + +/// Animator to timeline: each bound pair takes the transition's blend as an overlap. Later strips ripple. +inline void pullTransitionToStrips(Animation::SkinnedPose& pose, const Animation::ImportedSkin* skin, + const Animation::Animator& animator, const std::string& from, const std::string& to, + const Animation::AnimationTransition& transition) { + const std::vector order = baseTrackOrder(pose); + for (size_t i = 1; i < order.size(); ++i) { + Animation::ClipStrip& previous = pose.strips[order[i - 1]]; + Animation::ClipStrip& next = pose.strips[order[i]]; + if (stripStateName(previous, &animator, skin) != from || stripStateName(next, &animator, skin) != to) continue; + const f32 wantedStart = previous.start + Animation::clipStripLength(previous, skin) - transition.blendTime; + const f32 shift = wantedStart - next.start; + next.fadeIn = 0.0f; + next.fadeInCurve = transition.blendCurve; + for (size_t j = i; j < order.size(); ++j) pose.strips[order[j]].start = std::max(0.0f, pose.strips[order[j]].start + shift); + } +} + +} // namespace Caffeine::Editor diff --git a/src/editor/AnimationTimeline.cpp b/src/editor/AnimationTimeline.cpp index 94fe4da7..3c5f5e96 100644 --- a/src/editor/AnimationTimeline.cpp +++ b/src/editor/AnimationTimeline.cpp @@ -2,8 +2,12 @@ #include "animation/ClipAsset.hpp" #include "animation/SkinLibrary.hpp" #include "debug/LogSystem.hpp" +#include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" +#include "editor/AnimationEditorLink.hpp" #include #include +#include namespace Caffeine::Editor { @@ -64,6 +68,7 @@ void AnimationTimelinePanel::stop() { void AnimationTimelinePanel::pause() { m_isPlaying = false; + m_applyTime = true; } f32 AnimationTimelinePanel::applyEasing(f32 t, EasingType easing) const { @@ -171,17 +176,195 @@ void AnimationTimelinePanel::saveClipFile(const std::filesystem::path& path) { Animation::saveMotionClip(path, m_motion); } +Animation::SkinnedPose* AnimationTimelinePanel::selectedPose() const { + if (!m_scene) return nullptr; + return m_scene->get(ECS::Entity(m_selectedEntity, m_scene)); +} + +std::filesystem::path AnimationTimelinePanel::animationFolder() const { + const std::filesystem::path root = m_projectRoot.empty() ? std::filesystem::path(".") : std::filesystem::path(m_projectRoot); + return root / "assets" / "raw" / "Animations"; +} + +void AnimationTimelinePanel::stripsEdited() { + m_timelineDrivesClip = true; + m_applyTime = true; + Animation::SkinnedPose* pose = selectedPose(); + if (!pose) return; + pose->stripsInitialized = true; + if (Animation::Animator* animator = m_scene->get(ECS::Entity(m_selectedEntity, m_scene))) { + pushStripFadesToAnimator(*pose, Animation::findImportedSkin(pose->meshPath), *animator); + } +} + +static f32 stripClipDuration(const Animation::ClipStrip& strip, const Animation::ImportedSkin* skin) { + if (!skin || strip.clip < 0 || strip.clip >= static_cast(skin->clips.size())) return 1.0f; + return std::max(skin->clips[static_cast(strip.clip)].duration, 0.05f); +} + +void AnimationTimelinePanel::splitSelectedStrip() { + Animation::SkinnedPose* pose = selectedPose(); + if (!pose || m_selectedStrip < 0 || m_selectedStrip >= static_cast(pose->strips.size())) return; + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + Animation::ClipStrip& strip = pose->strips[static_cast(m_selectedStrip)]; + const f32 length = Animation::clipStripLength(strip, skin); + f32 cut = m_currentTime - strip.start; + if (cut <= 0.02f || cut >= length - 0.02f) return; + Animation::ClipStrip head = strip; + Animation::ClipStrip tail = strip; + if (strip.repeat > 1) { + const f32 pass = length / static_cast(strip.repeat); + const i32 headPasses = std::clamp(static_cast(std::round(cut / pass)), 1, strip.repeat - 1); + cut = pass * static_cast(headPasses); + head.repeat = headPasses; + tail.repeat = strip.repeat - headPasses; + } else { + const f32 in = strip.clipIn; + const f32 out = strip.clipOut < 0.0f ? stripClipDuration(strip, skin) : strip.clipOut; + const f32 source = cut * std::max(strip.speed, 0.01f); + if (strip.reverse) { + head.clipIn = out - source; + head.clipOut = out; + tail.clipIn = in; + tail.clipOut = out - source; + } else { + head.clipIn = in; + head.clipOut = in + source; + tail.clipIn = in + source; + tail.clipOut = strip.clipOut; + } + } + head.fadeOut = 0.0f; + head.loopBlend = 0.0f; + tail.fadeIn = 0.0f; + tail.start = strip.start + cut; + strip = head; + pose->strips.insert(pose->strips.begin() + m_selectedStrip + 1, tail); + m_selectedStrip += 1; + stripsEdited(); +} + +void AnimationTimelinePanel::duplicateSelectedStrip() { + Animation::SkinnedPose* pose = selectedPose(); + if (!pose || m_selectedStrip < 0 || m_selectedStrip >= static_cast(pose->strips.size())) return; + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + Animation::ClipStrip copy = pose->strips[static_cast(m_selectedStrip)]; + copy.start += Animation::clipStripLength(copy, skin); + pose->strips.push_back(copy); + m_selectedStrip = static_cast(pose->strips.size()) - 1; + stripsEdited(); +} + +void AnimationTimelinePanel::deleteSelectedStrip() { + Animation::SkinnedPose* pose = selectedPose(); + if (!pose || m_selectedStrip < 0 || m_selectedStrip >= static_cast(pose->strips.size())) return; + pose->strips.erase(pose->strips.begin() + m_selectedStrip); + m_selectedStrip = -1; + stripsEdited(); +} + +void AnimationTimelinePanel::buildStripsFromAnimator() { + Animation::SkinnedPose* pose = selectedPose(); + if (!pose) return; + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + const Animation::Animator* animator = m_scene->get(ECS::Entity(m_selectedEntity, m_scene)); + if (!skin || !animator) return; + std::string current = animator->defaultState.cStr(); + if (current.empty() && !animator->states.empty()) current = animator->states.begin()->key.cStr(); + std::vector chain; + std::vector visited; + f32 cursor = 0.0f; + f32 blend = 0.0f; + Animation::KeyCurve blendCurve; + while (!current.empty() && chain.size() < 12 && + std::find(visited.begin(), visited.end(), current) == visited.end()) { + visited.push_back(current); + const Animation::AnimationState* state = animator->states.get(FixedString<32>(current.c_str())); + if (!state) break; + const i32 clip = Animation::clipForAnimatorState(*skin, current.c_str(), state->motion.cStr()); + if (clip < 0) break; + Animation::ClipStrip strip; + strip.clip = clip; + strip.speed = state->speed > 0.0f ? state->speed : 1.0f; + strip.start = std::max(0.0f, cursor - blend); + strip.fadeInCurve = blendCurve; + std::snprintf(strip.state, sizeof(strip.state), "%s", current.c_str()); + const f32 length = Animation::clipStripLength(strip, skin); + cursor = strip.start + length; + chain.push_back(strip); + + const Animation::AnimationTransition* next = nullptr; + for (const Animation::AnimationTransition& transition : state->transitions) { + if (transition.toState == FixedString<32>(Animation::kAnimatorExitState)) continue; + if (!next || (transition.hasExitTime && !next->hasExitTime)) next = &transition; + } + if (!next) break; + blend = std::min(next->blendTime, length * 0.9f); + blendCurve = next->blendCurve; + current = next->toState.cStr(); + } + if (chain.empty()) return; + pose->strips.erase(std::remove_if(pose->strips.begin(), pose->strips.end(), + [](const Animation::ClipStrip& strip) { return strip.track == 0; }), + pose->strips.end()); + pose->strips.insert(pose->strips.begin(), chain.begin(), chain.end()); + m_selectedStrip = 0; + stripsEdited(); +} + +void AnimationTimelinePanel::openAnimationPath(const std::string& path) { + const std::string file = std::filesystem::path(path).filename().string(); + if (!Animation::isPoseAnimationFile(path)) { + loadClipFile(path); + m_assetStatus = "Opened " + file; + return; + } + Animation::SkinnedPose* pose = selectedPose(); + if (!pose) { + m_assetStatus = "Select the character " + file + " belongs to, then open it again."; + return; + } + if (!Animation::loadPoseAnimation(path, *pose, Animation::findImportedSkin(pose->meshPath))) { + m_assetStatus = "Could not read " + file; + return; + } + m_selectedStrip = -1; + m_keySelected = false; + m_currentTime = 0.0f; + m_isPlaying = false; + stripsEdited(); + m_assetStatus = "Opened " + file; +} + +bool AnimationTimelinePanel::saveAnimationPath(const std::filesystem::path& path, const std::string& name) { + std::error_code ec; + if (path.has_parent_path()) std::filesystem::create_directories(path.parent_path(), ec); + bool ok = false; + if (Animation::SkinnedPose* pose = m_drivingBones ? selectedPose() : nullptr) { + ok = Animation::savePoseAnimation(path.string(), name, *pose, Animation::findImportedSkin(pose->meshPath)); + } else { + m_ownedClip.name = name.c_str(); + saveClipFile(path); + ok = std::filesystem::exists(path, ec); + } + m_assetStatus = (ok ? "Saved " : "Could not save ") + path.filename().string(); + return ok; +} + } #ifdef CF_HAS_IMGUI +#include "editor/CurveWidget.hpp" #include "editor/FilePicker.hpp" +#include + namespace Caffeine::Editor { -static constexpr f32 k_TrackLabelWidth = 110.0f; -static constexpr f32 k_TrackHeight = 22.0f; -static constexpr f32 k_RulerHeight = 20.0f; +static constexpr f32 k_TrackLabelWidth = 160.0f; +static constexpr f32 k_TrackHeight = 28.0f; +static constexpr f32 k_RulerHeight = 22.0f; static constexpr f32 k_KeyDiamondSize = 5.0f; static const ImU32 k_ColTrackBg = IM_COL32(35, 35, 42, 255); @@ -191,106 +374,258 @@ static const ImU32 k_ColTrackLabelSel = IM_COL32(40, 80, 140, 255); static const ImU32 k_ColRulerBg = IM_COL32(25, 25, 32, 255); static const ImU32 k_ColRulerTick = IM_COL32(90, 90, 110, 255); static const ImU32 k_ColRulerText = IM_COL32(150,150, 170, 255); -static const ImU32 k_ColPlayhead = IM_COL32(255, 80, 80, 255); +static const ImU32 k_ColPlayhead = IM_COL32(245, 245, 250, 255); + static const ImU32 k_ColKeyframe = IM_COL32(255,210, 60, 255); static const ImU32 k_ColKeyframeSel = IM_COL32(255,255, 130, 255); static const ImU32 k_ColKeyframeHover = IM_COL32(255,240, 120, 255); static const ImU32 k_ColProgress = IM_COL32(60, 100, 220, 180); -void AnimationTimelinePanel::setScene(ECS::World* world, u32 selectedEntity) { +void AnimationTimelinePanel::setScene(ECS::World* world, u32 selectedEntity, i32 selectedBone) { m_scene = world; m_selectedEntity = selectedEntity; + if (selectedBone >= 0) m_objectRow = false; + m_editBone = selectedBone; +} + +bool AnimationTimelinePanel::consumePickedBone(i32& bone) { + if (m_pickedBone < -1) return false; + bone = m_pickedBone; + m_pickedBone = -2; + return true; } void AnimationTimelinePanel::render(f32 deltaTime) { - if (!m_open) return; + AnimationEditorLink& link = AnimationEditorLink::get(); + if (m_selectedEntity != m_driveEntity) { + if (m_scene && m_driveEntity != 0xFFFFFFFFu) { + if (Animation::SkinnedPose* previous = m_scene->get(ECS::Entity(m_driveEntity, m_scene))) { + previous->timelineHold = false; + previous->overrideMix.clear(); + } + } + m_driveEntity = m_selectedEntity; + m_timelineDrivesClip = false; + m_isPlaying = false; + m_selectedStrip = -1; + m_keySelected = false; + m_stripDrag = StripDrag::None; + m_extraTracks = 0; + m_viewSpan = 0.0f; + m_viewStart = 0.0f; + m_currentTime = 0.0f; + } + if (!link.openAnimRequest.empty()) { + const std::string path = link.openAnimRequest; + link.openAnimRequest.clear(); + m_open = true; + openAnimationPath(path); + } + if (!m_open) { + if (Animation::SkinnedPose* held = selectedPose()) { + held->timelineHold = false; + held->overrideMix.clear(); + } + return; + } - f32 drivenDuration = m_clip ? m_clip->duration() : 0.0f; - bool drivenLoop = m_looping; + f32 drivenDuration = 0.0f; m_driveName.clear(); - if (m_scene) { - ECS::Entity selected(m_selectedEntity, m_scene); - if (Animation::SkinnedPose* pose = m_scene->get(selected)) { - if (const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath)) { - if (pose->clipIndex >= 0 && pose->clipIndex < static_cast(skin->clips.size())) { - const Animation::SkeletalClip& boneClip = skin->clips[static_cast(pose->clipIndex)]; - drivenDuration = std::max(drivenDuration, boneClip.duration); - if (pose->clipIndex < static_cast(skin->clipNames.size())) { - m_driveName = skin->clipNames[static_cast(pose->clipIndex)]; - } + m_drivingBones = false; + Animation::SkinnedPose* pose = selectedPose(); + const Animation::ImportedSkin* skin = pose ? Animation::findImportedSkin(pose->meshPath) : nullptr; + if (pose && skin && (!skin->boneNames.empty() || !skin->clips.empty())) { + m_drivingBones = true; + Animation::ensureDefaultStrips(*pose, skin); + drivenDuration = Animation::stripsDuration(*pose, skin); + for (const Animation::BoneKeyframe& key : pose->keys) drivenDuration = std::max(drivenDuration, key.time); + for (const Animation::ObjectKeyframe& key : pose->objectKeys) drivenDuration = std::max(drivenDuration, key.time); + if (drivenDuration <= 0.0f) drivenDuration = 1.0f; + } else { + pose = nullptr; + } + if (!m_drivingBones && m_clip) drivenDuration = m_clip->duration(); + m_timelineDuration = drivenDuration; + + if (pose) { + const Animation::Animator* animator = m_scene->get(ECS::Entity(m_selectedEntity, m_scene)); + auto selectStripFor = [&](const std::string& state) { + for (size_t i = 0; i < pose->strips.size(); ++i) { + if (stripStateName(pose->strips[i], animator, skin) != state) continue; + m_selectedStrip = static_cast(i); + m_keySelected = false; + if (!link.animatorPreview) { + m_currentTime = pose->strips[i].start; + m_applyTime = true; } + return; + } + }; + if (link.selectionSerial != m_linkSelectionSeen) { + m_linkSelectionSeen = link.selectionSerial; + if (!link.selectedState.empty()) selectStripFor(link.selectedState); + } + if (link.transitionSerial != m_linkTransitionSeen) { + m_linkTransitionSeen = link.transitionSerial; + const std::vector order = baseTrackOrder(*pose); + for (size_t i = 1; i < order.size(); ++i) { + if (stripStateName(pose->strips[order[i - 1]], animator, skin) != link.selectedFrom || + stripStateName(pose->strips[order[i]], animator, skin) != link.selectedTo) { + continue; + } + m_selectedStrip = static_cast(order[i]); + m_keySelected = false; + if (!link.animatorPreview) { + m_currentTime = pose->strips[order[i]].start; + m_applyTime = true; + } + break; } - drivenLoop = drivenLoop || pose->loop; } } - m_timelineDuration = drivenDuration; + + const bool animatorOwns = pose && link.animatorPreview && link.entity == m_selectedEntity; + if (animatorOwns) { + m_isPlaying = false; + m_timelineDrivesClip = false; + m_applyTime = false; + pose->timelineHold = false; + pose->overrideMix.clear(); + const Animation::Animator* animator = m_scene->get(ECS::Entity(m_selectedEntity, m_scene)); + for (const Animation::ClipStrip& strip : pose->strips) { + if (stripStateName(strip, animator, skin) != link.previewState) continue; + const f32 length = Animation::clipStripLength(strip, skin); + if (length > 0.0f) m_currentTime = strip.start + std::fmod(std::max(link.previewTime, 0.0f), length); + break; + } + m_driveName = "Animator: " + link.previewState; + } + if (m_isPlaying && drivenDuration > 0.0f) { m_currentTime += deltaTime; if (m_currentTime >= drivenDuration) { - if (drivenLoop) m_currentTime = 0.0f; - else m_isPlaying = false; + if (m_looping) { + m_currentTime = std::fmod(m_currentTime, drivenDuration); + } else { + m_currentTime = drivenDuration; + m_isPlaying = false; + } } } - if (m_scene) { + if (m_isPlaying || m_applyTime || (pose && skin && !animatorOwns)) m_timelineDrivesClip = true; + + if (pose && skin && m_timelineDrivesClip && !animatorOwns) { ECS::Entity selected(m_selectedEntity, m_scene); - if (Animation::SkinnedPose* pose = m_scene->get(selected)) { - if (m_isPlaying || m_applyTime) { - pose->playing = false; - pose->time = m_currentTime; - pose->loop = drivenLoop; - } else { - m_currentTime = pose->time; + Animation::buildStripMix(*pose, skin, m_currentTime, pose->overrideMix); + pose->timelineHold = true; + pose->overrideFrame = Animation::skinFrameCounter(); + pose->time = m_currentTime; + pose->sampleKeys = !pose->keys.empty(); + if ((m_isPlaying || m_applyTime) && !pose->objectKeys.empty()) { + const Animation::ObjectKeyframe* before = nullptr; + const Animation::ObjectKeyframe* after = nullptr; + for (const Animation::ObjectKeyframe& key : pose->objectKeys) { + if (key.time <= m_currentTime + 0.0001f) { + if (!before || key.time >= before->time) before = &key; + } else if (!after || key.time < after->time) { + after = &key; + } + } + Vec3 position{}; + bool have = false; + if (before && after && after->time > before->time) { + const f32 alpha = Animation::evaluateKeyCurve( + before->curve, std::clamp((m_currentTime - before->time) / (after->time - before->time), 0.0f, 1.0f)); + position = Vec3(before->position.x + (after->position.x - before->position.x) * alpha, + before->position.y + (after->position.y - before->position.y) * alpha, + before->position.z + (after->position.z - before->position.z) * alpha); + have = true; + } else if (before) { + position = before->position; + have = true; + } else if (after) { + position = after->position; + have = true; + } + if (have) { + if (ECS::Transform* transform = m_scene->get(selected)) transform->position = position; + if (ECS::Position3D* position3 = m_scene->get(selected)) position3->position = position; + } + } + + const Animation::Animator* animator = m_scene->get(selected); + link.entity = m_selectedEntity; + link.timelineFrame = Animation::skinFrameCounter(); + link.timelinePlaying = m_isPlaying; + link.timelineState.clear(); + link.timelineFadeFrom.clear(); + link.timelineFade = 1.0f; + link.timelineStateProgress = 0.0f; + const std::vector order = baseTrackOrder(*pose); + i32 at = -1; + for (size_t i = 0; i < order.size(); ++i) { + const Animation::ClipStrip& strip = pose->strips[order[i]]; + const f32 length = Animation::clipStripLength(strip, skin); + if (!strip.muted && m_currentTime >= strip.start && m_currentTime < strip.start + length) at = static_cast(i); + } + if (at >= 0) { + const Animation::ClipStrip& strip = pose->strips[order[static_cast(at)]]; + const f32 length = std::max(Animation::clipStripLength(strip, skin), 0.0001f); + link.timelineState = stripStateName(strip, animator, skin); + link.timelineStateProgress = (m_currentTime - strip.start) / length; + const f32 fade = stripCrossfade(*pose, order[static_cast(at)], skin); + if (at > 0 && fade > 0.0f && m_currentTime - strip.start < fade) { + const Animation::ClipStrip& previous = pose->strips[order[static_cast(at - 1)]]; + if (m_currentTime < previous.start + Animation::clipStripLength(previous, skin)) { + link.timelineFadeFrom = stripStateName(previous, animator, skin); + link.timelineFade = Animation::evaluateKeyCurve(strip.fadeInCurve, (m_currentTime - strip.start) / fade); + } + } + } + } + if (pose && !animatorOwns) { + for (const Animation::ClipStrip& strip : pose->strips) { + const f32 length = Animation::clipStripLength(strip, skin); + if (strip.muted || m_currentTime < strip.start || m_currentTime >= strip.start + length) continue; + if (strip.clip >= 0 && strip.clip < static_cast(skin->clipNames.size())) { + m_driveName = skin->clipNames[static_cast(strip.clip)]; } } + if (m_driveName.empty()) m_driveName = "Pose"; + } + + if (m_scene && (m_isPlaying || m_applyTime) && !m_drivingBones) { + ECS::Entity selected(m_selectedEntity, m_scene); + for (const std::unique_ptr& track : m_tracks) { + if (!track || track->getType() != TrackType::Transform) continue; + const auto value = interpolateValue(track.get(), m_currentTime); + if (!std::holds_alternative(value)) continue; + const Vec3 position = std::get(value); + if (ECS::Transform* transform = m_scene->get(selected)) transform->position = position; + if (ECS::Position3D* position3 = m_scene->get(selected)) position3->position = position; + } } m_applyTime = false; ImGui::SetNextWindowSizeConstraints(ImVec2(400, 200), ImVec2(FLT_MAX, FLT_MAX)); - if (ImGui::Begin("Animation Timeline", &m_open)) { + if (ImGui::Begin("Animation Timeline", &m_open, ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoScrollbar)) { renderHeader(); ImGui::Separator(); - if (m_scene) { - ECS::Entity selected(m_selectedEntity, m_scene); - if (Animation::SkinnedPose* pose = m_scene->get(selected)) { - const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); - ImGui::TextUnformatted(pose->humanoid.matched ? "3D humanoide" : "3D skeletal"); - if (skin && !skin->clipNames.empty()) { - const int index = std::clamp(pose->clipIndex, 0, static_cast(skin->clipNames.size()) - 1); - if (ImGui::BeginCombo("Bone Clip", skin->clipNames[static_cast(index)].c_str())) { - for (int i = 0; i < static_cast(skin->clipNames.size()); ++i) { - if (ImGui::Selectable(skin->clipNames[static_cast(i)].c_str(), i == index)) { - pose->clipIndex = i; - pose->time = 0.0f; - pose->playing = true; - } - } - ImGui::EndCombo(); - } - } - if (skin) { - const int shown = std::min(static_cast(skin->boneNames.size()), 12); - for (int i = 0; i < shown; ++i) { - ImGui::BulletText("%s", skin->boneNames[static_cast(i)].c_str()); - } - if (static_cast(skin->boneNames.size()) > shown) { - ImGui::TextDisabled("%d ossos", static_cast(skin->boneNames.size())); - } - } - ImGui::Separator(); - } - } renderTimeline(); + renderAssetPopups(); if (m_pendingLoad) { - if (auto selected = FilePicker::pickPath(FilePicker::Mode::PickFile, "Load Animation", {})) { - loadClipFile(*selected); + if (auto picked = FilePicker::pickPath(FilePicker::Mode::PickFile, "Load Animation", {})) { + openAnimationPath(picked->string()); m_pendingLoad = false; } else if (FilePicker::consumeCloseEvent("Load Animation")) { m_pendingLoad = false; } } if (m_pendingSave) { - if (auto selected = FilePicker::pickPath(FilePicker::Mode::SaveFile, "Save Animation", {})) { - saveClipFile(*selected); + if (auto picked = FilePicker::pickPath(FilePicker::Mode::SaveFile, "Save Animation", {})) { + std::filesystem::path path = *picked; + if (path.extension() != ".anim") path += ".anim"; + saveAnimationPath(path, path.stem().string()); m_pendingSave = false; } else if (FilePicker::consumeCloseEvent("Save Animation")) { m_pendingSave = false; @@ -301,26 +636,26 @@ void AnimationTimelinePanel::render(f32 deltaTime) { } void AnimationTimelinePanel::renderHeader() { - ImGui::Text("Animation:"); - ImGui::SameLine(); - if (m_clip) { + Animation::SkinnedPose* pose = m_drivingBones ? selectedPose() : nullptr; + if (pose) { + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + ImGui::TextColored(ImVec4(0.5f, 0.9f, 0.6f, 1.0f), "%s", m_driveName.empty() ? "Pose" : m_driveName.c_str()); + ImGui::SameLine(); + ImGui::TextDisabled("%s %d bones %.2fs", pose->humanoid.matched ? "humanoid" : "skeletal", + skin ? static_cast(skin->boneNames.size()) : 0, m_timelineDuration); + } else if (m_clip) { ImGui::TextColored(ImVec4(0.4f, 0.8f, 1.0f, 1.0f), "%s", m_clip->name.cStr()); ImGui::SameLine(); ImGui::TextDisabled("%.2fs %u fps", m_clip->duration(), m_clip->fps); - } else if (!m_driveName.empty()) { - ImGui::TextColored(ImVec4(0.5f, 0.9f, 0.6f, 1.0f), "%s", m_driveName.c_str()); - ImGui::SameLine(); - ImGui::TextDisabled("%.2fs bones", m_timelineDuration); } else { ImGui::TextDisabled("No clip"); } ImGui::SameLine(0, 12.0f); - if (m_isPlaying) { if (ImGui::SmallButton(" Pause ")) pause(); } else { - if (ImGui::SmallButton(" Play ")) play(); + if (ImGui::SmallButton(" Play ")) play(); } ImGui::SameLine(); if (ImGui::SmallButton(" Stop ")) stop(); @@ -330,199 +665,1547 @@ void AnimationTimelinePanel::renderHeader() { ImGui::SameLine(); ImGui::Checkbox("Onion Skin", &m_onionSkinningEnabled); ImGui::SameLine(); - if (ImGui::SmallButton("New Clip")) newClip(); + if (ImGui::SmallButton("New")) { + if (pose) ImGui::OpenPopup("##timeline_new"); + else newClip(); + } + if (ImGui::BeginPopup("##timeline_new")) { + if (pose) { + if (ImGui::MenuItem("Empty Timeline")) { + pose->strips.clear(); + pose->keys.clear(); + pose->objectKeys.clear(); + m_selectedStrip = -1; + m_keySelected = false; + stripsEdited(); + } + if (ImGui::MenuItem("Active Clip")) { + pose->strips.clear(); + pose->stripsInitialized = false; + Animation::ensureDefaultStrips(*pose, Animation::findImportedSkin(pose->meshPath)); + m_selectedStrip = pose->strips.empty() ? -1 : 0; + stripsEdited(); + } + if (ImGui::MenuItem("All Imported Clips")) { + pose->strips.clear(); + pose->stripsInitialized = true; + const Animation::ImportedSkin* imported = Animation::findImportedSkin(pose->meshPath); + f32 start = 0.0f; + for (i32 clip = 0; imported && clip < static_cast(imported->clips.size()); ++clip) { + Animation::ClipStrip strip; + strip.clip = clip; + strip.start = start; + strip.loopBlend = std::min(0.12f, Animation::clipStripLength(strip, imported) * 0.12f); + pose->strips.push_back(strip); + start += Animation::clipStripLength(strip, imported); + } + m_selectedStrip = pose->strips.empty() ? -1 : 0; + stripsEdited(); + } + const bool hasAnimator = m_scene->get(ECS::Entity(m_selectedEntity, m_scene)) != nullptr; + if (ImGui::MenuItem("From Animator", nullptr, false, hasAnimator)) buildStripsFromAnimator(); + } + ImGui::EndPopup(); + } ImGui::SameLine(); - if (ImGui::SmallButton("Load .anim")) m_pendingLoad = true; + if (ImGui::SmallButton("Open...")) { + m_openLoadPopup = true; + m_assetFilter[0] = '\0'; + } ImGui::SameLine(); - if (ImGui::SmallButton("Save .anim")) m_pendingSave = true; - if (!m_motion.positions.empty()) { - ImGui::SameLine(); - ImGui::TextDisabled("pos keys %zu", m_motion.positions.size()); + if (ImGui::SmallButton("Save...")) { + m_openSavePopup = true; + if (m_assetName[0] == '\0') { + std::string base = pose ? std::filesystem::path(pose->meshPath).stem().string() : std::string(m_motion.name); + if (base.empty()) base = "Animation"; + std::snprintf(m_assetName, sizeof(m_assetName), "%s", base.c_str()); + } } - if (m_timelineDuration > 0.0f) { ImGui::SameLine(0, 16.0f); ImGui::TextDisabled("Time: %.3f / %.2f", m_currentTime, m_timelineDuration); } + if (!m_assetStatus.empty()) { + ImGui::SameLine(0, 16.0f); + ImGui::TextDisabled("%s", m_assetStatus.c_str()); + } +} + +void AnimationTimelinePanel::renderAssetPopups() { + if (m_openSavePopup) { + ImGui::OpenPopup("Save Animation Asset"); + m_openSavePopup = false; + } + if (m_openLoadPopup) { + ImGui::OpenPopup("Open Animation Asset"); + m_openLoadPopup = false; + } + const std::filesystem::path folder = animationFolder(); + if (ImGui::BeginPopupModal("Save Animation Asset", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::TextDisabled("Saved to the project folder assets/raw/Animations"); + ImGui::SetNextItemWidth(300.0f); + if (ImGui::IsWindowAppearing()) ImGui::SetKeyboardFocusHere(); + const bool enter = ImGui::InputText("Name", m_assetName, sizeof(m_assetName), ImGuiInputTextFlags_EnterReturnsTrue); + std::string name = m_assetName; + if (name.size() > 5 && name.compare(name.size() - 5, 5, ".anim") == 0) name.resize(name.size() - 5); + const bool valid = !name.empty() && name.find_first_of("/\\:*?\"<>|") == std::string::npos; + const std::filesystem::path path = folder / (name + ".anim"); + std::error_code ec; + const bool exists = valid && std::filesystem::exists(path, ec); + if (exists) ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.3f, 1.0f), "%s.anim exists. Saving replaces it.", name.c_str()); + if (!valid && !name.empty()) ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "The name has invalid characters."); + ImGui::BeginDisabled(!valid); + if (ImGui::Button(exists ? "Replace" : "Save") || (enter && valid)) { + saveAnimationPath(path, name); + ImGui::CloseCurrentPopup(); + } + ImGui::EndDisabled(); + ImGui::SameLine(); + if (ImGui::Button("Browse...")) { + m_pendingSave = true; + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + if (ImGui::BeginPopupModal("Open Animation Asset", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { + const std::filesystem::path assets = folder.parent_path().parent_path(); + ImGui::SetNextItemWidth(420.0f); + ImGui::InputTextWithHint("##anim_filter", "Filter", m_assetFilter, sizeof(m_assetFilter)); + std::vector files; + std::error_code ec; + if (std::filesystem::is_directory(assets, ec)) { + for (std::filesystem::recursive_directory_iterator it( + assets, std::filesystem::directory_options::skip_permission_denied, ec), end; + it != end && files.size() < 500; it.increment(ec)) { + if (ec) break; + if (it->is_regular_file(ec) && it->path().extension() == ".anim") files.push_back(it->path()); + } + } + std::sort(files.begin(), files.end()); + std::string filter = m_assetFilter; + std::transform(filter.begin(), filter.end(), filter.begin(), [](unsigned char c) { return std::tolower(c); }); + std::string chosen; + ImGui::BeginChild("##anim_files", ImVec2(420.0f, 240.0f), true); + int shown = 0; + for (const std::filesystem::path& file : files) { + const std::string relative = file.lexically_relative(assets.parent_path()).generic_string(); + std::string lower = relative; + std::transform(lower.begin(), lower.end(), lower.begin(), [](unsigned char c) { return std::tolower(c); }); + if (!filter.empty() && lower.find(filter) == std::string::npos) continue; + ++shown; + const bool pose = Animation::isPoseAnimationFile(file.string()); + ImGui::TextDisabled(pose ? "[3D]" : "[2D]"); + ImGui::SameLine(); + if (ImGui::Selectable(relative.c_str())) chosen = file.string(); + } + if (shown == 0) ImGui::TextDisabled(files.empty() ? "No .anim files in this project yet." : "Nothing matches the filter."); + ImGui::EndChild(); + if (!chosen.empty()) { + openAnimationPath(chosen); + ImGui::CloseCurrentPopup(); + } + if (ImGui::Button("Browse...")) { + m_pendingLoad = true; + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } +} + +struct RowKey { + usize index = 0; + f32 time = 0.0f; +}; + +static void collectRowKeys(const Animation::SkinnedPose& pose, i32 rowBone, std::vector& out) { + out.clear(); + if (rowBone < 0) { + for (usize i = 0; i < pose.objectKeys.size(); ++i) out.push_back({i, pose.objectKeys[i].time}); + } else { + for (usize i = 0; i < pose.keys.size(); ++i) { + if (pose.keys[i].bone == rowBone) out.push_back({i, pose.keys[i].time}); + } + } + std::stable_sort(out.begin(), out.end(), [](const RowKey& a, const RowKey& b) { return a.time < b.time; }); +} + +static Animation::KeyCurve* rowKeyCurve(Animation::SkinnedPose& pose, i32 rowBone, usize index) { + if (rowBone < 0) return index < pose.objectKeys.size() ? &pose.objectKeys[index].curve : nullptr; + if (index >= pose.keys.size() || pose.keys[index].bone != rowBone) return nullptr; + return &pose.keys[index].curve; +} + +static f32* rowKeyTime(Animation::SkinnedPose& pose, i32 rowBone, usize index) { + if (rowBone < 0) return index < pose.objectKeys.size() ? &pose.objectKeys[index].time : nullptr; + if (index >= pose.keys.size() || pose.keys[index].bone != rowBone) return nullptr; + return &pose.keys[index].time; +} + +static void applyInterp(Animation::KeyCurve& curve, Animation::KeyInterp mode) { + if (mode == Animation::KeyInterp::Custom) { + if (curve.mode != Animation::KeyInterp::Custom) { + Animation::KeyCurve shaped = curve.mode == Animation::KeyInterp::Linear || + curve.mode == Animation::KeyInterp::Constant + ? Animation::KeyCurve{} + : Animation::keyCurvePreset(curve.mode); + curve = shaped; + } + curve.mode = Animation::KeyInterp::Custom; + return; + } + curve = Animation::keyCurvePreset(mode); +} + +static const Animation::KeyInterp k_InterpModes[] = { + Animation::KeyInterp::Linear, Animation::KeyInterp::EaseIn, Animation::KeyInterp::EaseOut, + Animation::KeyInterp::EaseInOut, Animation::KeyInterp::Constant, Animation::KeyInterp::Custom, +}; + +static ImU32 clipFill(int index, bool active) { + static const ImU32 colors[] = { + IM_COL32(86, 114, 156, 255), + IM_COL32(78, 132, 112, 255), + IM_COL32(156, 118, 78, 255), + IM_COL32(132, 96, 150, 255), + }; + ImU32 color = colors[index % 4]; + if (!active) color = (color & 0x00FFFFFFu) | 0xAA000000u; + return color; +} + +static ImU32 propertyFill(int index, int alpha = 235) { + static const ImU32 colors[] = { + IM_COL32(196, 92, 140, 255), + IM_COL32(64, 158, 96, 255), + IM_COL32(196, 148, 58, 255), + IM_COL32(72, 132, 196, 255), + }; + const int slot = index < 0 ? -index : index; + return (colors[slot % 4] & 0x00FFFFFFu) | (static_cast(alpha) << 24); } void AnimationTimelinePanel::renderTimeline() { f32 duration = m_timelineDuration; if (duration <= 0.0f && m_clip) duration = m_clip->duration(); - if (duration <= 0.0f && !m_clip) { + if (duration <= 0.0f && !m_clip && !m_drivingBones) { ImGui::Spacing(); ImGui::TextDisabled(" No animation clip selected."); ImGui::Spacing(); - ImGui::TextColored(ImVec4(0.5f,0.5f,0.5f,0.7f), " Tracks"); + ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 0.7f), " Tracks"); ImGui::TextDisabled(" Select a skinned mesh, or add a clip."); return; } if (duration <= 0.0f) duration = 1.0f; - ImDrawList* dl = ImGui::GetWindowDrawList(); - ImVec2 cursor = ImGui::GetCursorScreenPos(); - f32 availWidth = ImGui::GetContentRegionAvail().x; - f32 trackWidth = availWidth - k_TrackLabelWidth; - if (trackWidth < 1.0f) trackWidth = 1.0f; + Animation::SkinnedPose* pose = m_drivingBones ? selectedPose() : nullptr; + const bool boneMode = pose != nullptr; + const Animation::ImportedSkin* skin = pose ? Animation::findImportedSkin(pose->meshPath) : nullptr; + const i32 selectedRow = m_objectRow ? -1 : m_editBone; + if (boneMode) duration = std::max(duration + std::max(0.5f, duration * 0.25f), 1.0f); + if (boneMode && (m_selectedStrip < -1 || m_selectedStrip >= static_cast(pose->strips.size()))) m_selectedStrip = -1; - auto timeToX = [&](f32 t) -> f32 { - return cursor.x + k_TrackLabelWidth + (t / duration) * trackWidth; - }; - auto xToTime = [&](f32 x) -> f32 { - return ((x - cursor.x - k_TrackLabelWidth) / trackWidth) * duration; - }; + if (boneMode) { + ECS::Entity selected(m_selectedEntity, m_scene); + auto entityPosition = [&]() -> Vec3 { + if (const ECS::Position3D* position3 = m_scene->get(selected)) return position3->position; + if (const ECS::Transform* transform = m_scene->get(selected)) return transform->position; + return {}; + }; + auto recordKey = [&]() { + const auto sameTime = [&](f32 time) { return std::fabs(time - m_currentTime) < 0.02f; }; + if (m_objectRow || m_editBone < 0) { + for (usize i = 0; i < pose->objectKeys.size(); ++i) { + if (sameTime(pose->objectKeys[i].time)) { + pose->objectKeys[i].position = entityPosition(); + m_selectedKeyframe = i; + m_keySelected = true; + return; + } + } + Animation::ObjectKeyframe key; + key.time = m_currentTime; + key.position = entityPosition(); + pose->objectKeys.push_back(key); + m_objectRow = true; + m_selectedKeyframe = pose->objectKeys.size() - 1; + m_keySelected = true; + return; + } + const u32 boneCount = skin ? skin->skeleton.boneCount() : 0; + if (m_editBone >= static_cast(boneCount)) return; + if (pose->offsets.size() < boneCount) pose->offsets.resize(boneCount); + const Animation::BonePose& live = pose->offsets[static_cast(m_editBone)]; + for (usize i = 0; i < pose->keys.size(); ++i) { + Animation::BoneKeyframe& key = pose->keys[i]; + if (key.bone == m_editBone && sameTime(key.time)) { + key.rotation = live.rotation; + key.translation = live.translation; + m_selectedKeyframe = i; + m_keySelected = true; + return; + } + } + Animation::BoneKeyframe key; + key.time = m_currentTime; + key.bone = m_editBone; + key.rotation = live.rotation; + key.translation = live.translation; + pose->keys.push_back(key); + m_selectedKeyframe = pose->keys.size() - 1; + m_keySelected = true; + }; + if (ImGui::Button("Key")) recordKey(); + ImGui::SameLine(); + Animation::KeyCurve* curve = m_keySelected ? rowKeyCurve(*pose, selectedRow, m_selectedKeyframe) : nullptr; + if (!curve) m_keySelected = false; + if (ImGui::Button("Delete") && (curve || m_selectedStrip >= 0 || !pose->keys.empty() || !pose->objectKeys.empty())) { + if (curve) { + if (selectedRow < 0) { + pose->objectKeys.erase(pose->objectKeys.begin() + static_cast(m_selectedKeyframe)); + } else { + pose->keys.erase(pose->keys.begin() + static_cast(m_selectedKeyframe)); + } + m_keySelected = false; + curve = nullptr; + } else if (Animation::deleteKeysNearTime(*pose, selectedRow, m_currentTime)) { + m_keySelected = false; + } else if (m_selectedStrip >= 0) { + deleteSelectedStrip(); + } + m_applyTime = true; + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Deletes the selected key, keys at the playhead, or the selected clip."); + } + ImGui::SameLine(); + ImGui::BeginDisabled(m_selectedStrip < 0 || !skin || m_editBone < 0); + if (ImGui::Button("Edit Keys") && m_selectedStrip >= 0 && skin && m_editBone >= 0) { + Animation::bakeClipToKeys(*pose, *skin, pose->strips[static_cast(m_selectedStrip)].clip, m_editBone); + m_objectRow = false; + m_keySelected = false; + m_applyTime = true; + } + ImGui::EndDisabled(); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip(m_selectedStrip < 0 ? "Select a clip first." + : m_editBone < 0 ? "Select a bone in the viewport or the inspector, then copy its keys." + : "Copies this bone's channel from the clip onto editable keys."); + } + if (curve) { + ImGui::SameLine(); + ImGui::SetNextItemWidth(120.0f); + int mode = static_cast(curve->mode); + const char* modes[] = {"Linear", "Constant", "Ease In", "Ease Out", "Ease In Out", "Custom"}; + if (ImGui::Combo("Interpolation", &mode, modes, 6)) { + applyInterp(*curve, static_cast(mode)); + m_applyTime = true; + } + } + + ImGui::SameLine(0.0f, 16.0f); + if (ImGui::Button("+ Clip")) ImGui::OpenPopup("##timeline_add_clip"); + if (ImGui::BeginPopup("##timeline_add_clip")) { + const i32 track = m_selectedStrip >= 0 ? pose->strips[static_cast(m_selectedStrip)].track : 0; + ImGui::TextDisabled("Add at %.2fs", m_currentTime); + for (size_t i = 0; skin && i < skin->clipNames.size(); ++i) { + if (ImGui::MenuItem(skin->clipNames[i].c_str())) { + Animation::ClipStrip strip; + strip.clip = static_cast(i); + strip.track = track; + strip.start = m_currentTime; + pose->strips.push_back(strip); + m_selectedStrip = static_cast(pose->strips.size()) - 1; + m_keySelected = false; + stripsEdited(); + } + } + if (!skin || skin->clipNames.empty()) ImGui::TextDisabled("This mesh has no imported clips."); + ImGui::EndPopup(); + } + const bool hasStrip = m_selectedStrip >= 0; + ImGui::SameLine(); + ImGui::BeginDisabled(!hasStrip); + if (ImGui::Button("Split")) splitSelectedStrip(); + ImGui::SameLine(); + if (ImGui::Button("Duplicate")) duplicateSelectedStrip(); + ImGui::SameLine(); + if (ImGui::Button("Delete Clip")) deleteSelectedStrip(); + ImGui::EndDisabled(); + ImGui::SameLine(); + if (ImGui::Button("+ Track")) ++m_extraTracks; + ImGui::SameLine(); + const bool hasAnimator = m_scene->get(selected) != nullptr; + ImGui::BeginDisabled(!hasAnimator); + if (ImGui::Button("From Animator")) buildStripsFromAnimator(); + ImGui::EndDisabled(); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip(hasAnimator ? "Lay out the base track by following the Animator from its default state." + : "Add an Animator to this entity first."); + } + ImGui::SameLine(); + ImGui::Checkbox("Snap", &m_snap); + } else { + if (ImGui::Button("+ Track")) { + auto track = std::make_unique(); + track->targetPropertyName = FixedString<32>("Track"); + m_tracks.push_back(std::move(track)); + } + ImGui::SameLine(); + if (ImGui::Button("+ Key") && m_scene) { + ECS::Entity selected(m_selectedEntity, m_scene); + Vec3 position{}; + if (const ECS::Position3D* position3 = m_scene->get(selected)) position = position3->position; + else if (const ECS::Transform* transform = m_scene->get(selected)) position = transform->position; + AnimationTrack* track = m_selectedTrack < m_tracks.size() ? m_tracks[m_selectedTrack].get() : nullptr; + if (!track || track->getType() != TrackType::Transform) { + track = nullptr; + for (const std::unique_ptr& existing : m_tracks) { + if (existing && existing->getType() == TrackType::Transform) { + track = existing.get(); + break; + } + } + } + if (!track) { + auto created = std::make_unique(); + created->targetPropertyName = FixedString<32>("Position"); + m_tracks.push_back(std::move(created)); + track = m_tracks.back().get(); + m_selectedTrack = m_tracks.size() - 1; + } + track->addKeyframe(m_currentTime, position); + } + ImGui::SameLine(); + if (ImGui::Button("Del Key")) deleteSelectedKeyframe(); + } - dl->AddRectFilled(cursor, - ImVec2(cursor.x + availWidth, cursor.y + k_RulerHeight), - k_ColRulerBg); + const ImGuiStyle& style = ImGui::GetStyle(); + const ImGuiIO& io = ImGui::GetIO(); + const f32 minSpan = std::min(0.05f, duration); + f32 viewSpan = std::clamp(m_viewSpan > 0.0f ? m_viewSpan : duration, minSpan, duration); - { - f32 minTickSpacing = 40.0f; - int numTicks = static_cast(trackWidth / minTickSpacing); - if (numTicks < 1) numTicks = 1; - f32 tickInterval = duration / static_cast(numTicks); - - for (int i = 0; i <= numTicks; ++i) { - f32 t = static_cast(i) * tickInterval; - f32 x = timeToX(t); - bool isMajor = (i % 5 == 0) || (numTicks <= 5); - f32 tickH = isMajor ? k_RulerHeight * 0.6f : k_RulerHeight * 0.3f; - dl->AddLine( - ImVec2(x, cursor.y + k_RulerHeight - tickH), - ImVec2(x, cursor.y + k_RulerHeight), - k_ColRulerTick); + ImGui::SameLine(0.0f, 16.0f); + if (ImGui::SmallButton("-")) viewSpan = std::min(duration, viewSpan * 1.25f); + ImGui::SameLine(); + if (ImGui::SmallButton("+")) viewSpan = std::max(minSpan, viewSpan * 0.8f); + ImGui::SameLine(); + if (ImGui::SmallButton("Fit")) { + viewSpan = duration; + m_viewStart = 0.0f; + } + ImGui::SameLine(); + ImGui::TextDisabled("%.0f%%", duration / std::max(viewSpan, 0.0001f) * 100.0f); + ImGui::TextDisabled(boneMode ? "Drag clips to move, edges to trim, top corners to fade. " + "Delete removes a key or clip. Edit Keys copies the clip onto the timeline. Ctrl+wheel zooms." + : "Wheel scrolls tracks. Ctrl+wheel zooms. Shift+wheel or middle drag pans."); + + if (boneMode && ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) && !io.WantTextInput && + !ImGui::IsPopupOpen("", ImGuiPopupFlags_AnyPopupId)) { + if (ImGui::IsKeyPressed(ImGuiKey_Delete, false)) { + if (m_keySelected) { + if (selectedRow < 0 && m_selectedKeyframe < pose->objectKeys.size()) { + pose->objectKeys.erase(pose->objectKeys.begin() + static_cast(m_selectedKeyframe)); + } else if (m_selectedKeyframe < pose->keys.size()) { + pose->keys.erase(pose->keys.begin() + static_cast(m_selectedKeyframe)); + } + m_keySelected = false; + m_applyTime = true; + } else if (Animation::deleteKeysNearTime(*pose, selectedRow, m_currentTime)) { + m_applyTime = true; + } else if (m_selectedStrip >= 0) { + deleteSelectedStrip(); + } + } + if (io.KeyCtrl && ImGui::IsKeyPressed(ImGuiKey_D, false)) duplicateSelectedStrip(); + if (io.KeyCtrl && ImGui::IsKeyPressed(ImGuiKey_K, false)) splitSelectedStrip(); + } + + const f32 inspectorW = boneMode ? 300.0f : 0.0f; + const f32 fullWidth = ImGui::GetContentRegionAvail().x; + const f32 availWidth = std::max(240.0f, fullWidth - (boneMode ? inspectorW + style.ItemSpacing.x : 0.0f)); + const f32 regionH = std::max(ImGui::GetContentRegionAvail().y, k_TrackHeight * 3.0f); + + ImGui::BeginGroup(); + ImDrawList* dl = ImGui::GetWindowDrawList(); + const ImVec2 cursor = ImGui::GetCursorScreenPos(); + const f32 trackWidth = std::max(1.0f, availWidth - k_TrackLabelWidth - style.ScrollbarSize); + const f32 laneLeft = cursor.x + k_TrackLabelWidth; + const f32 laneRight = laneLeft + trackWidth; + + f32 viewStart = std::clamp(m_viewStart, 0.0f, std::max(0.0f, duration - viewSpan)); + const bool overLanes = io.MousePos.x >= cursor.x && io.MousePos.x <= cursor.x + availWidth; + if (ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows) && overLanes) { + const f32 pointer = std::clamp((io.MousePos.x - laneLeft) / trackWidth, 0.0f, 1.0f); + const f32 pointerTime = viewStart + pointer * viewSpan; + if (io.KeyCtrl && io.MouseWheel != 0.0f) { + viewSpan = std::clamp(viewSpan * (io.MouseWheel > 0.0f ? 0.8f : 1.25f), minSpan, duration); + viewStart = pointerTime - pointer * viewSpan; + } else if (io.MouseWheelH != 0.0f || (io.KeyShift && io.MouseWheel != 0.0f)) { + const f32 delta = io.MouseWheelH != 0.0f ? io.MouseWheelH : io.MouseWheel; + viewStart -= delta * viewSpan * 0.12f; + } + if (ImGui::IsMouseDragging(ImGuiMouseButton_Middle)) { + viewStart -= (io.MouseDelta.x / trackWidth) * viewSpan; + } + } + viewStart = std::clamp(viewStart, 0.0f, std::max(0.0f, duration - viewSpan)); + m_viewStart = viewStart; + m_viewSpan = viewSpan; + auto timeToX = [&](f32 t) -> f32 { return laneLeft + ((t - viewStart) / viewSpan) * trackWidth; }; + auto xToTime = [&](f32 x) -> f32 { return viewStart + ((x - laneLeft) / trackWidth) * viewSpan; }; + + dl->AddRectFilled(cursor, ImVec2(cursor.x + availWidth, cursor.y + k_RulerHeight), k_ColRulerBg); + dl->PushClipRect(ImVec2(laneLeft, cursor.y), ImVec2(laneRight, cursor.y + k_RulerHeight), true); + { + const int numTicks = std::max(1, static_cast(trackWidth / 48.0f)); + const f32 tickInterval = viewSpan / static_cast(numTicks); + const int firstTick = static_cast(std::ceil(viewStart / tickInterval)); + for (int tick = firstTick; tick * tickInterval <= viewStart + viewSpan + 0.0001f; ++tick) { + const f32 t = static_cast(tick) * tickInterval; + const f32 x = timeToX(t); + const bool isMajor = (tick % 5 == 0); + const f32 tickH = isMajor ? k_RulerHeight * 0.6f : k_RulerHeight * 0.3f; + dl->AddLine(ImVec2(x, cursor.y + k_RulerHeight - tickH), ImVec2(x, cursor.y + k_RulerHeight), k_ColRulerTick); if (isMajor) { char buf[16]; snprintf(buf, sizeof(buf), "%.2f", t); dl->AddText(ImVec2(x + 2.0f, cursor.y + 2.0f), k_ColRulerText, buf); } } + if (boneMode && m_timelineDuration > 0.0f) { + const f32 endX = timeToX(m_timelineDuration); + dl->AddLine(ImVec2(endX, cursor.y), ImVec2(endX, cursor.y + k_RulerHeight), IM_COL32(230, 120, 90, 200), 1.5f); + } + const f32 px = timeToX(m_currentTime); + dl->AddLine(ImVec2(px, cursor.y), ImVec2(px, cursor.y + k_RulerHeight), k_ColPlayhead, 1.0f); + dl->AddTriangleFilled(ImVec2(px - 5.0f, cursor.y), ImVec2(px + 5.0f, cursor.y), ImVec2(px, cursor.y + 8.0f), + k_ColPlayhead); } - + dl->PopClipRect(); { - f32 px = timeToX(m_currentTime); - dl->AddLine(ImVec2(px, cursor.y), ImVec2(px, cursor.y + k_RulerHeight), k_ColPlayhead, 1.0f); - dl->AddTriangleFilled( - ImVec2(px - 5.0f, cursor.y), - ImVec2(px + 5.0f, cursor.y), - ImVec2(px, cursor.y + 8.0f), - k_ColPlayhead); + char timeText[32]; + snprintf(timeText, sizeof(timeText), "%.3fs", m_currentTime); + dl->AddText(ImVec2(cursor.x + 6.0f, cursor.y + 3.0f), k_ColRulerText, timeText); } - ImGui::InvisibleButton("ruler_click", ImVec2(availWidth, k_RulerHeight)); - if (ImGui::IsItemHovered() && ImGui::IsMouseDown(ImGuiMouseButton_Left)) { - f32 clickX = ImGui::GetIO().MousePos.x; - f32 t = xToTime(clickX); - m_currentTime = std::max(0.0f, std::min(t, duration)); + if (ImGui::IsItemActive() && io.MouseClickedPos[0].x >= laneLeft) { + m_currentTime = std::clamp(xToTime(io.MousePos.x), 0.0f, duration); m_applyTime = true; } - ImGui::SetCursorScreenPos(ImVec2(cursor.x, cursor.y + k_RulerHeight + 2.0f)); - if (ImGui::Button("+ Track")) { - auto track = std::make_unique(); - track->targetPropertyName = FixedString<32>("Track"); - m_tracks.push_back(std::move(track)); + const f32 hScrollH = 12.0f; + const f32 childH = std::max(k_TrackHeight * 2.0f, regionH - k_RulerHeight - hScrollH - style.ItemSpacing.y * 2.0f); + ImGui::BeginChild("##timeline_tracks", ImVec2(availWidth, childH), false, + ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_AlwaysVerticalScrollbar); + if (ImGui::IsWindowHovered() && io.MouseWheel != 0.0f && !io.KeyCtrl && !io.KeyShift && io.MouseWheelH == 0.0f) { + ImGui::SetScrollY(std::clamp(ImGui::GetScrollY() - io.MouseWheel * k_TrackHeight * 2.0f, 0.0f, ImGui::GetScrollMaxY())); } - ImGui::SameLine(); - if (ImGui::Button("+ Key") && !m_tracks.empty()) { - addKeyframeToSelectedTrack(m_currentTime, i32(0)); + if (boneMode) renderBoneRows(laneLeft, trackWidth, duration); + else renderSpriteRows(laneLeft, trackWidth, duration); + { + ImDrawList* childDraw = ImGui::GetWindowDrawList(); + const ImVec2 childPos = ImGui::GetWindowPos(); + const f32 px = timeToX(m_currentTime); + if (px >= laneLeft && px <= laneRight) { + childDraw->AddLine(ImVec2(px, childPos.y), ImVec2(px, childPos.y + ImGui::GetWindowHeight()), k_ColPlayhead, 1.5f); + } + } + ImGui::EndChild(); + + { + const ImVec2 bar = ImGui::GetCursorScreenPos(); + const ImVec2 trackMin(laneLeft, bar.y + 2.0f); + const ImVec2 trackMax(laneRight, bar.y + hScrollH - 2.0f); + dl->AddRectFilled(trackMin, trackMax, IM_COL32(28, 30, 36, 255), 4.0f); + const f32 thumb0 = laneLeft + (m_viewStart / duration) * trackWidth; + const f32 thumb1 = laneLeft + ((m_viewStart + m_viewSpan) / duration) * trackWidth; + ImGui::InvisibleButton("##timeline_hscroll", ImVec2(availWidth, hScrollH)); + const bool active = ImGui::IsItemActive(); + const bool hovered = ImGui::IsItemHovered(); + dl->AddRectFilled(ImVec2(thumb0, trackMin.y), ImVec2(std::max(thumb1, thumb0 + 8.0f), trackMax.y), + active ? IM_COL32(150, 160, 180, 255) : hovered ? IM_COL32(120, 128, 146, 255) + : IM_COL32(92, 98, 112, 255), + 4.0f); + if (ImGui::IsItemClicked() && (io.MousePos.x < thumb0 || io.MousePos.x > thumb1)) { + const f32 center = ((io.MousePos.x - laneLeft) / trackWidth) * duration; + m_viewStart = center - m_viewSpan * 0.5f; + } else if (active) { + m_viewStart += (io.MouseDelta.x / trackWidth) * duration; + } + m_viewStart = std::clamp(m_viewStart, 0.0f, std::max(0.0f, duration - m_viewSpan)); + } + ImGui::EndGroup(); + + if (!boneMode) return; + bool curvePanel = false; + if (m_keySelected) { + std::vector keys; + collectRowKeys(*pose, selectedRow, keys); + for (usize i = 0; i + 1 < keys.size(); ++i) { + if (keys[i].index == m_selectedKeyframe) curvePanel = true; + } } ImGui::SameLine(); - if (ImGui::Button("Del Key")) { - deleteSelectedKeyframe(); + ImGui::BeginChild("##timeline_inspector", ImVec2(inspectorW, regionH), true); + if (curvePanel) { + renderCurveEditor(); + } else if (m_selectedStrip >= 0) { + renderStripInspector(); + } else { + ImGui::TextDisabled("Nothing selected"); + ImGui::Spacing(); + ImGui::TextWrapped("Click a clip to edit its trim, speed, repeat, fades and state binding. " + "Click the segment between two keys to edit its curve."); + } + ImGui::EndChild(); +} + +void AnimationTimelinePanel::renderBoneRows(f32 laneLeft, f32 trackWidth, f32 duration) { + ECS::Entity selected(m_selectedEntity, m_scene); + Animation::SkinnedPose* pose = m_scene->get(selected); + if (!pose) return; + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + ImDrawList* dl = ImGui::GetWindowDrawList(); + const ImGuiIO& io = ImGui::GetIO(); + const f32 rowWidth = ImGui::GetContentRegionAvail().x; + const f32 laneRight = laneLeft + trackWidth; + const ImVec2 windowPos = ImGui::GetWindowPos(); + const f32 windowBottom = windowPos.y + ImGui::GetWindowHeight(); + auto timeToX = [&](f32 t) -> f32 { return laneLeft + ((t - m_viewStart) / m_viewSpan) * trackWidth; }; + auto xToTime = [&](f32 x) -> f32 { return m_viewStart + ((x - laneLeft) / trackWidth) * m_viewSpan; }; + + auto drawTrackChrome = [&](ImVec2 rowPos, const char* label, bool selectedRow, ImU32 pip, f32 indent) { + const ImU32 rowBg = selectedRow ? IM_COL32(38, 44, 58, 255) : k_ColTrackBg; + dl->AddRectFilled(rowPos, ImVec2(rowPos.x + rowWidth, rowPos.y + k_TrackHeight), rowBg); + dl->AddLine(ImVec2(rowPos.x, rowPos.y + k_TrackHeight - 1.0f), ImVec2(rowPos.x + rowWidth, rowPos.y + k_TrackHeight - 1.0f), + IM_COL32(22, 22, 28, 255)); + dl->AddRectFilled(rowPos, ImVec2(rowPos.x + k_TrackLabelWidth - 2.0f, rowPos.y + k_TrackHeight), + selectedRow ? k_ColTrackLabelSel : k_ColTrackLabel); + dl->AddRectFilled(ImVec2(rowPos.x + indent, rowPos.y + 6.0f), + ImVec2(rowPos.x + indent + 4.0f, rowPos.y + k_TrackHeight - 6.0f), pip, 1.0f); + dl->PushClipRect(rowPos, ImVec2(rowPos.x + k_TrackLabelWidth - 4.0f, rowPos.y + k_TrackHeight), true); + dl->AddText(ImVec2(rowPos.x + indent + 10.0f, rowPos.y + 6.0f), IM_COL32(230, 234, 240, 255), label); + dl->PopClipRect(); + }; + auto pushLaneClip = [&](ImVec2 rowPos) { + dl->PushClipRect(ImVec2(laneLeft, std::max(rowPos.y, windowPos.y)), + ImVec2(laneRight, std::min(rowPos.y + k_TrackHeight, windowBottom)), true); + }; + + renderStripRows(laneLeft, trackWidth); + + std::vector rows; + rows.push_back(-1); + if (m_editBone >= 0) rows.push_back(m_editBone); + for (const Animation::BoneKeyframe& key : pose->keys) { + if (std::find(rows.begin(), rows.end(), key.bone) == rows.end()) rows.push_back(key.bone); + } + + bool openContext = false; + std::vector keys; + for (i32 rowBone : rows) { + const bool rowSelected = rowBone < 0 ? m_objectRow : (!m_objectRow && m_editBone == rowBone); + const ImVec2 rowPos = ImGui::GetCursorScreenPos(); + std::string label = "Object Position"; + if (rowBone >= 0) { + label = (skin && rowBone < static_cast(skin->boneNames.size())) + ? skin->boneNames[static_cast(rowBone)] + : ("Bone " + std::to_string(rowBone)); + } + drawTrackChrome(rowPos, label.c_str(), rowSelected, propertyFill(rowBone < 0 ? 2 : rowBone), 18.0f); + ImGui::InvisibleButton(("pose_row_" + std::to_string(rowBone)).c_str(), ImVec2(rowWidth, k_TrackHeight), + ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); + const bool rowHovered = ImGui::IsItemHovered(); + const bool rowClicked = ImGui::IsItemClicked(ImGuiMouseButton_Left); + const bool rowContext = ImGui::IsItemClicked(ImGuiMouseButton_Right); + const bool inLane = io.MousePos.x >= laneLeft && io.MousePos.x <= laneRight; + bool consumed = false; + auto selectKey = [&](usize index, bool moveHead) { + m_objectRow = rowBone < 0; + m_editBone = rowBone; + m_pickedBone = rowBone; + m_selectedKeyframe = index; + m_keySelected = true; + if (moveHead) { + if (const f32* time = rowKeyTime(*pose, rowBone, index)) { + m_currentTime = *time; + m_applyTime = true; + } + } + }; + + collectRowKeys(*pose, rowBone, keys); + const ImU32 color = propertyFill(rowBone < 0 ? 2 : rowBone, 90); + const ImU32 colorSelected = propertyFill(rowBone < 0 ? 2 : rowBone, 200); + pushLaneClip(rowPos); + const f32 top = rowPos.y + 7.0f; + const f32 bottom = rowPos.y + k_TrackHeight - 7.0f; + for (usize k = 0; k + 1 < keys.size(); ++k) { + const f32 x0 = timeToX(keys[k].time); + const f32 x1 = timeToX(keys[k + 1].time); + if (x1 < laneLeft || x0 > laneRight) continue; + const Animation::KeyCurve* curve = rowKeyCurve(*pose, rowBone, keys[k].index); + if (!curve) continue; + const bool segmentSelected = m_keySelected && rowSelected && m_selectedKeyframe == keys[k].index; + const bool segmentHovered = rowHovered && inLane && io.MousePos.x > x0 + k_KeyDiamondSize + 1.0f && + io.MousePos.x < x1 - k_KeyDiamondSize - 1.0f; + dl->AddRectFilled(ImVec2(x0, rowPos.y + 4.0f), ImVec2(x1, rowPos.y + k_TrackHeight - 4.0f), + segmentSelected ? colorSelected : (segmentHovered ? propertyFill(rowBone < 0 ? 2 : rowBone, 140) : color), 3.0f); + ImVec2 points[25]; + for (int s = 0; s < 25; ++s) { + const f32 u = static_cast(s) / 24.0f; + const f32 v = std::clamp(Animation::evaluateKeyCurve(*curve, u), -0.2f, 1.2f); + points[s] = ImVec2(x0 + (x1 - x0) * u, bottom - (bottom - top) * v); + } + dl->AddPolyline(points, 25, IM_COL32(255, 255, 255, segmentSelected ? 235 : 130), 0, segmentSelected ? 1.8f : 1.2f); + if (segmentHovered) { + ImGui::SetTooltip("%s (%.2fs to %.2fs)\nClick to edit the curve. Right-click to change it.", + Animation::keyInterpName(curve->mode), keys[k].time, keys[k + 1].time); + if (rowClicked) { + selectKey(keys[k].index, false); + consumed = true; + } + if (rowContext) { + selectKey(keys[k].index, false); + m_contextBone = rowBone; + m_contextKey = keys[k].index; + openContext = true; + consumed = true; + } + } + } + for (const RowKey& key : keys) { + const f32 kx = timeToX(key.time); + if (kx < laneLeft - k_KeyDiamondSize || kx > laneRight + k_KeyDiamondSize) continue; + const f32 ky = rowPos.y + k_TrackHeight * 0.5f; + const Animation::KeyCurve* curve = rowKeyCurve(*pose, rowBone, key.index); + const bool selectedKey = m_keySelected && rowSelected && m_selectedKeyframe == key.index; + const bool hovered = rowHovered && std::fabs(io.MousePos.x - kx) <= k_KeyDiamondSize + 2.0f && + std::fabs(io.MousePos.y - ky) <= k_KeyDiamondSize + 2.0f; + const ImU32 fill = selectedKey ? k_ColKeyframeSel : (hovered ? k_ColKeyframeHover : k_ColKeyframe); + const f32 size = k_KeyDiamondSize + (selectedKey ? 1.5f : 0.0f); + if (curve && curve->mode == Animation::KeyInterp::Constant) { + dl->AddRectFilled(ImVec2(kx - size, ky - size), ImVec2(kx + size, ky + size), fill); + dl->AddRect(ImVec2(kx - size, ky - size), ImVec2(kx + size, ky + size), IM_COL32(0, 0, 0, 160)); + } else if (curve && curve->mode != Animation::KeyInterp::Linear) { + dl->AddCircleFilled(ImVec2(kx, ky), size, fill, 16); + dl->AddCircle(ImVec2(kx, ky), size, IM_COL32(0, 0, 0, 160), 16); + } else { + dl->AddQuadFilled(ImVec2(kx - size, ky), ImVec2(kx, ky - size), ImVec2(kx + size, ky), ImVec2(kx, ky + size), fill); + dl->AddQuad(ImVec2(kx - size, ky), ImVec2(kx, ky - size), ImVec2(kx + size, ky), ImVec2(kx, ky + size), + IM_COL32(0, 0, 0, 160)); + } + if (hovered && rowClicked) { + selectKey(key.index, true); + m_isDraggingKeyframe = true; + consumed = true; + } + if (hovered && rowContext) { + selectKey(key.index, false); + m_contextBone = rowBone; + m_contextKey = key.index; + openContext = true; + consumed = true; + } + } + dl->PopClipRect(); + + if ((rowClicked || rowContext) && !consumed) { + m_objectRow = rowBone < 0; + m_editBone = rowBone; + m_pickedBone = rowBone; + m_keySelected = false; + if (rowClicked && inLane) { + m_currentTime = std::clamp(xToTime(io.MousePos.x), 0.0f, duration); + m_applyTime = true; + } + } } - ImGui::Spacing(); + if (m_isDraggingKeyframe) { + if (!ImGui::IsMouseDown(ImGuiMouseButton_Left)) { + m_isDraggingKeyframe = false; + } else if (m_keySelected && ImGui::IsMouseDragging(ImGuiMouseButton_Left, 2.0f)) { + if (f32* time = rowKeyTime(*pose, m_objectRow ? -1 : m_editBone, m_selectedKeyframe)) { + f32 newTime = std::clamp(xToTime(io.MousePos.x), 0.0f, duration); + if (!io.KeyAlt) newTime = std::round(newTime * 60.0f) / 60.0f; + *time = newTime; + m_currentTime = newTime; + m_applyTime = true; + } + } + } + + if (openContext) ImGui::OpenPopup("##timeline_key_ctx"); + if (ImGui::BeginPopup("##timeline_key_ctx")) { + Animation::KeyCurve* curve = rowKeyCurve(*pose, m_contextBone, m_contextKey); + if (!curve) { + ImGui::CloseCurrentPopup(); + } else { + ImGui::TextDisabled("Interpolation to the next key"); + for (Animation::KeyInterp mode : k_InterpModes) { + if (ImGui::MenuItem(Animation::keyInterpName(mode), nullptr, curve->mode == mode)) { + applyInterp(*curve, mode); + m_applyTime = true; + } + } + ImGui::Separator(); + if (ImGui::MenuItem("Delete Key")) { + if (m_contextBone < 0) pose->objectKeys.erase(pose->objectKeys.begin() + static_cast(m_contextKey)); + else pose->keys.erase(pose->keys.begin() + static_cast(m_contextKey)); + m_keySelected = false; + m_applyTime = true; + } + } + ImGui::EndPopup(); + } +} + +void AnimationTimelinePanel::renderSpriteRows(f32 laneLeft, f32 trackWidth, f32 duration) { if (m_tracks.empty()) { ImGui::TextDisabled(" No tracks. Use '+ Track' to add one."); return; } - - ImVec2 trackAreaStart = ImGui::GetCursorScreenPos(); + ImDrawList* dl = ImGui::GetWindowDrawList(); + const ImGuiIO& io = ImGui::GetIO(); + const f32 rowWidth = ImGui::GetContentRegionAvail().x; + const f32 laneRight = laneLeft + trackWidth; + auto timeToX = [&](f32 t) -> f32 { return laneLeft + ((t - m_viewStart) / m_viewSpan) * trackWidth; }; + auto xToTime = [&](f32 x) -> f32 { return m_viewStart + ((x - laneLeft) / trackWidth) * m_viewSpan; }; for (usize i = 0; i < m_tracks.size(); ++i) { auto& track = m_tracks[i]; - bool isSelected = (i == m_selectedTrack); - - ImVec2 rowPos = ImGui::GetCursorScreenPos(); - ImU32 rowBg = (i % 2 == 0) ? k_ColTrackBg : k_ColTrackBgAlt; - dl->AddRectFilled(rowPos, ImVec2(rowPos.x + availWidth, rowPos.y + k_TrackHeight), rowBg); - - ImU32 labelBg = isSelected ? k_ColTrackLabelSel : k_ColTrackLabel; - dl->AddRectFilled(rowPos, ImVec2(rowPos.x + k_TrackLabelWidth - 2.0f, rowPos.y + k_TrackHeight), labelBg); - - const char* typeTag = - track->getType() == TrackType::Sprite ? "[S]" : - track->getType() == TrackType::Transform ? "[T]" : - track->getType() == TrackType::Event ? "[E]" : "[?]"; - - dl->AddText(ImVec2(rowPos.x + 4.0f, rowPos.y + 4.0f), IM_COL32(200,200,200,255), typeTag); - dl->AddText(ImVec2(rowPos.x + 28.0f, rowPos.y + 4.0f), IM_COL32(220,220,230,255), track->targetPropertyName.cStr()); + const bool isSelected = (i == m_selectedTrack); + const ImVec2 rowPos = ImGui::GetCursorScreenPos(); + dl->AddRectFilled(rowPos, ImVec2(rowPos.x + rowWidth, rowPos.y + k_TrackHeight), (i % 2 == 0) ? k_ColTrackBg : k_ColTrackBgAlt); + dl->AddRectFilled(rowPos, ImVec2(rowPos.x + k_TrackLabelWidth - 2.0f, rowPos.y + k_TrackHeight), + isSelected ? k_ColTrackLabelSel : k_ColTrackLabel); + const char* typeTag = track->getType() == TrackType::Sprite ? "[S]" + : track->getType() == TrackType::Transform ? "[T]" + : track->getType() == TrackType::Event ? "[E]" + : "[?]"; + dl->AddText(ImVec2(rowPos.x + 4.0f, rowPos.y + 6.0f), IM_COL32(200, 200, 200, 255), typeTag); + dl->AddText(ImVec2(rowPos.x + 28.0f, rowPos.y + 6.0f), IM_COL32(220, 220, 230, 255), track->targetPropertyName.cStr()); + + ImGui::InvisibleButton(("track_row_" + std::to_string(i)).c_str(), ImVec2(rowWidth, k_TrackHeight), + ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); + const bool rowHovered = ImGui::IsItemHovered(); + const bool rowClicked = ImGui::IsItemClicked(ImGuiMouseButton_Left); + const bool rowContext = ImGui::IsItemClicked(ImGuiMouseButton_Right); + bool consumed = false; + + dl->PushClipRect(ImVec2(laneLeft, rowPos.y), ImVec2(laneRight, rowPos.y + k_TrackHeight), true); + for (usize j = 0; j < track->keyframes.size(); ++j) { + const f32 kx = timeToX(track->keyframes[j].time); + const f32 ky = rowPos.y + k_TrackHeight * 0.5f; + const bool kfSelected = isSelected && (j == m_selectedKeyframe); + const bool hovered = rowHovered && std::fabs(io.MousePos.x - kx) <= k_KeyDiamondSize + 2.0f && + io.MousePos.x >= laneLeft && io.MousePos.x <= laneRight; + const ImU32 color = kfSelected ? k_ColKeyframeSel : hovered ? k_ColKeyframeHover : k_ColKeyframe; + dl->AddQuadFilled(ImVec2(kx - k_KeyDiamondSize, ky), ImVec2(kx, ky - k_KeyDiamondSize), + ImVec2(kx + k_KeyDiamondSize, ky), ImVec2(kx, ky + k_KeyDiamondSize), color); + if (hovered && rowClicked) { + m_selectedTrack = i; + m_selectedKeyframe = j; + m_isDraggingKeyframe = true; + consumed = true; + } + if (hovered && rowContext) { + m_selectedTrack = i; + m_selectedKeyframe = j; + deleteSelectedKeyframe(); + consumed = true; + break; + } + } + dl->PopClipRect(); + if (rowClicked && !consumed) { + m_selectedTrack = i; + if (io.MousePos.x >= laneLeft) { + m_currentTime = std::clamp(xToTime(io.MousePos.x), 0.0f, duration); + m_applyTime = true; + } + } + } - ImGui::InvisibleButton(("track_row_" + std::to_string(i)).c_str(), ImVec2(availWidth, k_TrackHeight)); - if (ImGui::IsItemClicked()) m_selectedTrack = i; + if (m_isDraggingKeyframe) { + if (!ImGui::IsMouseDown(ImGuiMouseButton_Left)) m_isDraggingKeyframe = false; + else if (ImGui::IsMouseDragging(ImGuiMouseButton_Left, 2.0f)) { + moveSelectedKeyframe(std::clamp(xToTime(io.MousePos.x), 0.0f, duration)); + } + } - for (usize j = 0; j < track->keyframes.size(); ++j) { - const auto& kf = track->keyframes[j]; - f32 kx = timeToX(kf.time); - f32 ky = rowPos.y + k_TrackHeight * 0.5f; + if (m_selectedTrack < m_tracks.size()) { + auto& track = m_tracks[m_selectedTrack]; + ImGui::Text("Selected: %s Keyframes: %zu", track->targetPropertyName.cStr(), track->keyframes.size()); + if (m_selectedKeyframe < track->keyframes.size()) { + ImGui::SameLine(0, 16.0f); + ImGui::TextDisabled("Key %zu @ %.3fs", m_selectedKeyframe, track->keyframes[m_selectedKeyframe].time); + } + } +} - bool kfSelected = isSelected && (j == m_selectedKeyframe); +void AnimationTimelinePanel::renderCurveEditor() { + Animation::SkinnedPose* pose = selectedPose(); + if (!pose) return; + const i32 rowBone = m_objectRow ? -1 : m_editBone; + std::vector keys; + collectRowKeys(*pose, rowBone, keys); + usize nextIndex = 0; + bool found = false; + for (usize i = 0; i + 1 < keys.size(); ++i) { + if (keys[i].index == m_selectedKeyframe) { + nextIndex = keys[i + 1].index; + found = true; + break; + } + } + Animation::KeyCurve* curve = rowKeyCurve(*pose, rowBone, m_selectedKeyframe); + f32* startTime = rowKeyTime(*pose, rowBone, m_selectedKeyframe); + f32* endTime = rowKeyTime(*pose, rowBone, nextIndex); + if (!found || !curve || !startTime || !endTime) return; + + const f32 width = ImGui::GetContentRegionAvail().x; + ImGui::TextUnformatted("Key Curve"); + ImGui::TextDisabled("%.3fs to %.3fs", *startTime, *endTime); + if (editKeyCurve("key_curve", *curve, width, 140.0f)) m_applyTime = true; + ImGui::Separator(); + ImGui::PushItemWidth(width - 90.0f); + if (ImGui::DragFloat("Start", startTime, 0.005f, 0.0f, *endTime, "%.3fs")) m_applyTime = true; + if (ImGui::DragFloat("End", endTime, 0.005f, *startTime, 3600.0f, "%.3fs")) m_applyTime = true; + if (curve->mode == Animation::KeyInterp::Custom) { + f32 handles[4] = {curve->x1, curve->y1, curve->x2, curve->y2}; + if (ImGui::DragFloat4("Handles", handles, 0.005f)) { + curve->x1 = std::clamp(handles[0], 0.0f, 1.0f); + curve->y1 = handles[1]; + curve->x2 = std::clamp(handles[2], 0.0f, 1.0f); + curve->y2 = handles[3]; + m_applyTime = true; + } + } + if (rowBone >= 0 && m_selectedKeyframe < pose->keys.size()) { + Animation::BoneKeyframe& key = pose->keys[m_selectedKeyframe]; + constexpr f32 kToDeg = 57.2957795f; + f32 degrees[3] = {key.rotation.x * kToDeg, key.rotation.y * kToDeg, key.rotation.z * kToDeg}; + if (ImGui::DragFloat3("Rotation", degrees, 0.5f, -360.0f, 360.0f, "%.1f")) { + key.rotation = Vec3(degrees[0] / kToDeg, degrees[1] / kToDeg, degrees[2] / kToDeg); + m_applyTime = true; + } + if (ImGui::DragFloat3("Offset", &key.translation.x, 0.01f)) m_applyTime = true; + } else if (rowBone < 0 && m_selectedKeyframe < pose->objectKeys.size()) { + if (ImGui::DragFloat3("Position", &pose->objectKeys[m_selectedKeyframe].position.x, 0.01f)) m_applyTime = true; + } + ImGui::PopItemWidth(); +} - ImVec2 kfMin(kx - k_KeyDiamondSize, ky); - ImVec2 kfMax(kx + k_KeyDiamondSize, ky); - ImVec2 kfTop(kx, ky - k_KeyDiamondSize); - ImVec2 kfBot(kx, ky + k_KeyDiamondSize); +void AnimationTimelinePanel::renderStripRows(f32 laneLeft, f32 trackWidth) { + Animation::SkinnedPose* pose = selectedPose(); + if (!pose) return; + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + Animation::Animator* animator = m_scene->get(ECS::Entity(m_selectedEntity, m_scene)); + const AnimationEditorLink& link = AnimationEditorLink::get(); + ImDrawList* dl = ImGui::GetWindowDrawList(); + const ImGuiIO& io = ImGui::GetIO(); + const f32 rowWidth = ImGui::GetContentRegionAvail().x; + const f32 laneRight = laneLeft + trackWidth; + const ImVec2 windowPos = ImGui::GetWindowPos(); + const f32 windowBottom = windowPos.y + ImGui::GetWindowHeight(); + constexpr f32 rowH = 38.0f; + auto timeToX = [&](f32 t) -> f32 { return laneLeft + ((t - m_viewStart) / m_viewSpan) * trackWidth; }; + auto xToTime = [&](f32 x) -> f32 { return m_viewStart + ((x - laneLeft) / trackWidth) * m_viewSpan; }; + auto clipName = [&](i32 clip) -> const char* { + return (skin && clip >= 0 && clip < static_cast(skin->clipNames.size())) + ? skin->clipNames[static_cast(clip)].c_str() + : "Clip"; + }; + if (m_selectedStrip >= static_cast(pose->strips.size())) m_selectedStrip = -1; + + i32 trackCount = 1 + m_extraTracks; + for (const Animation::ClipStrip& strip : pose->strips) trackCount = std::max(trackCount, strip.track + 1); + m_stripRowsTop = ImGui::GetCursorScreenPos().y; + + const f32 snapRadius = 8.0f / trackWidth * m_viewSpan; + auto snapTime = [&](f32 t, i32 skip, bool& snapped) -> f32 { + snapped = false; + if (!m_snap || io.KeyAlt) return t; + f32 best = t; + f32 bestDistance = snapRadius; + auto consider = [&](f32 candidate) { + const f32 distance = std::fabs(candidate - t); + if (distance < bestDistance) { + bestDistance = distance; + best = candidate; + snapped = true; + } + }; + consider(0.0f); + consider(m_currentTime); + for (size_t i = 0; i < pose->strips.size(); ++i) { + if (static_cast(i) == skip) continue; + consider(pose->strips[i].start); + consider(pose->strips[i].start + Animation::clipStripLength(pose->strips[i], skin)); + } + return best; + }; - bool hovered = ImGui::IsMouseHoveringRect(ImVec2(kx - k_KeyDiamondSize, ky - k_KeyDiamondSize), - ImVec2(kx + k_KeyDiamondSize, ky + k_KeyDiamondSize)); + bool openStripMenu = false; + for (i32 track = 0; track < trackCount; ++track) { + const ImVec2 rowPos = ImGui::GetCursorScreenPos(); + dl->AddRectFilled(rowPos, ImVec2(rowPos.x + rowWidth, rowPos.y + rowH), track % 2 ? k_ColTrackBgAlt : k_ColTrackBg); + dl->AddLine(ImVec2(rowPos.x, rowPos.y + rowH - 1.0f), ImVec2(rowPos.x + rowWidth, rowPos.y + rowH - 1.0f), + IM_COL32(22, 22, 28, 255)); + dl->AddRectFilled(rowPos, ImVec2(rowPos.x + k_TrackLabelWidth - 2.0f, rowPos.y + rowH), k_ColTrackLabel); + dl->AddRectFilled(ImVec2(rowPos.x + 8.0f, rowPos.y + 8.0f), ImVec2(rowPos.x + 12.0f, rowPos.y + rowH - 8.0f), + IM_COL32(120, 170, 230, 255), 1.0f); + const std::string label = track == 0 ? "Clips" : "Clips " + std::to_string(track + 1); + dl->AddText(ImVec2(rowPos.x + 18.0f, rowPos.y + 4.0f), IM_COL32(230, 234, 240, 255), label.c_str()); + dl->AddText(ImVec2(rowPos.x + 18.0f, rowPos.y + 20.0f), IM_COL32(140, 146, 160, 255), + track == 0 ? "synced with Animator" : "blends over lower"); + + ImGui::InvisibleButton(("strip_row_" + std::to_string(track)).c_str(), ImVec2(rowWidth, rowH), + ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); + const bool rowHovered = ImGui::IsItemHovered(); + const bool clickedLeft = ImGui::IsItemClicked(ImGuiMouseButton_Left); + const bool clickedRight = ImGui::IsItemClicked(ImGuiMouseButton_Right); + const bool doubleClicked = rowHovered && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left); + const bool inLane = io.MousePos.x >= laneLeft && io.MousePos.x <= laneRight; + const f32 top = rowPos.y + 3.0f; + const f32 bottom = rowPos.y + rowH - 3.0f; + + dl->PushClipRect(ImVec2(laneLeft, std::max(rowPos.y, windowPos.y)), + ImVec2(laneRight, std::min(rowPos.y + rowH, windowBottom)), true); + i32 hit = -1; + StripDrag hitZone = StripDrag::None; + for (size_t i = 0; i < pose->strips.size(); ++i) { + const Animation::ClipStrip& strip = pose->strips[i]; + if (strip.track != track) continue; + const f32 length = Animation::clipStripLength(strip, skin); + const f32 x0 = timeToX(strip.start); + const f32 x1 = timeToX(strip.start + length); + const bool isSelected = static_cast(i) == m_selectedStrip; + const std::string state = stripStateName(strip, animator, skin); + const bool live = !state.empty() && ((link.animatorPreview && link.previewState == state) || + (m_timelineDrivesClip && link.timelineState == state && track == 0)); + const bool hoveredStrip = rowHovered && inLane && io.MousePos.x >= x0 && io.MousePos.x <= x1; + + ImU32 fill = strip.muted ? IM_COL32(70, 72, 80, 200) : clipFill(strip.clip, true); + dl->AddRectFilled(ImVec2(x0, top), ImVec2(x1, bottom), fill, 4.0f); + if (isSelected) dl->AddRectFilled(ImVec2(x0, top), ImVec2(x1, bottom), IM_COL32(255, 255, 255, 28), 4.0f); + for (i32 r = 1; r < strip.repeat; ++r) { + const f32 x = timeToX(strip.start + length * static_cast(r) / static_cast(strip.repeat)); + for (f32 y = top + 2.0f; y < bottom; y += 6.0f) { + dl->AddLine(ImVec2(x, y), ImVec2(x, std::min(y + 3.0f, bottom)), IM_COL32(255, 255, 255, 120)); + } + } - ImU32 kfColor = kfSelected ? k_ColKeyframeSel : - hovered ? k_ColKeyframeHover : - k_ColKeyframe; + const f32 overlap = Animation::clipStripOverlapIn(*pose, i, skin); + const f32 fadeIn = std::max(strip.fadeIn, overlap); + if (fadeIn > 0.0f) { + const f32 xf = timeToX(strip.start + fadeIn); + ImVec2 points[17]; + for (int k = 0; k < 17; ++k) { + const f32 u = static_cast(k) / 16.0f; + const f32 v = std::clamp(Animation::evaluateKeyCurve(strip.fadeInCurve, u), 0.0f, 1.0f); + points[k] = ImVec2(x0 + (xf - x0) * u, bottom - (bottom - top) * v); + } + for (int k = 0; k < 16; ++k) { + dl->AddQuadFilled(ImVec2(points[k].x, top), ImVec2(points[k + 1].x, top), points[k + 1], points[k], + IM_COL32(0, 0, 0, 90)); + } + dl->AddPolyline(points, 17, IM_COL32(255, 255, 255, 210), 0, 1.5f); + if (overlap > 0.0f) { + const f32 xo = timeToX(strip.start + overlap); + for (f32 x = x0; x < xo; x += 7.0f) { + dl->AddLine(ImVec2(x, bottom), ImVec2(std::min(x + 7.0f, xo), top), IM_COL32(255, 230, 140, 45)); + } + } + } + if (strip.fadeOut > 0.0f) { + const f32 xs = timeToX(strip.start + length - strip.fadeOut); + ImVec2 points[17]; + for (int k = 0; k < 17; ++k) { + const f32 u = static_cast(k) / 16.0f; + const f32 v = 1.0f - std::clamp(Animation::evaluateKeyCurve(strip.fadeOutCurve, u), 0.0f, 1.0f); + points[k] = ImVec2(xs + (x1 - xs) * u, bottom - (bottom - top) * v); + } + for (int k = 0; k < 16; ++k) { + dl->AddQuadFilled(ImVec2(points[k].x, top), ImVec2(points[k + 1].x, top), points[k + 1], points[k], + IM_COL32(0, 0, 0, 90)); + } + dl->AddPolyline(points, 17, IM_COL32(255, 255, 255, 210), 0, 1.5f); + } - dl->AddQuadFilled(kfMin, kfTop, kfMax, kfBot, kfColor); - dl->AddQuad(kfMin, kfTop, kfMax, kfBot, IM_COL32(0,0,0,120)); + if (x1 - x0 > 30.0f) { + const f32 textX = std::max(x0, laneLeft) + 6.0f; + dl->PushClipRect(ImVec2(std::max(x0, laneLeft), top), ImVec2(std::min(x1, laneRight) - 2.0f, bottom), true); + dl->AddText(ImVec2(textX, top + 2.0f), strip.muted ? IM_COL32(170, 170, 176, 255) : IM_COL32(245, 245, 248, 255), + clipName(strip.clip)); + char info[96]; + int used = 0; + if (std::fabs(strip.speed - 1.0f) > 0.001f) used += std::snprintf(info + used, sizeof(info) - used, "%.2fx ", strip.speed); + if (strip.repeat > 1) used += std::snprintf(info + used, sizeof(info) - used, "x%d ", strip.repeat); + if (strip.reverse) used += std::snprintf(info + used, sizeof(info) - used, "rev "); + if (strip.muted) used += std::snprintf(info + used, sizeof(info) - used, "muted "); + if (!state.empty()) std::snprintf(info + used, sizeof(info) - used, "> %s", state.c_str()); + else if (used == 0) std::snprintf(info, sizeof(info), "%.2fs", length); + dl->AddText(ImVec2(textX, top + 17.0f), IM_COL32(220, 226, 236, 170), info); + dl->PopClipRect(); + } - if (hovered && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) { - m_selectedTrack = i; - m_selectedKeyframe = j; + const f32 handleIn = timeToX(strip.start + strip.fadeIn); + const f32 handleOut = timeToX(strip.start + length - strip.fadeOut); + if (isSelected || hoveredStrip) { + dl->AddCircleFilled(ImVec2(handleIn, top + 4.0f), 4.0f, IM_COL32(255, 255, 255, 230), 12); + dl->AddCircleFilled(ImVec2(handleOut, top + 4.0f), 4.0f, IM_COL32(255, 255, 255, 230), 12); + } + const ImU32 outline = isSelected ? IM_COL32(255, 255, 255, 240) + : live ? IM_COL32(120, 230, 140, 255) + : IM_COL32(0, 0, 0, 110); + dl->AddRect(ImVec2(x0, top), ImVec2(x1, bottom), outline, 4.0f, 0, isSelected || live ? 2.0f : 1.0f); + + if (hoveredStrip) { + hit = static_cast(i); + if (std::fabs(io.MousePos.x - handleIn) <= 6.0f && io.MousePos.y <= top + 10.0f) hitZone = StripDrag::FadeIn; + else if (std::fabs(io.MousePos.x - handleOut) <= 6.0f && io.MousePos.y <= top + 10.0f) hitZone = StripDrag::FadeOut; + else if (io.MousePos.x - x0 <= 6.0f) hitZone = StripDrag::TrimLeft; + else if (x1 - io.MousePos.x <= 6.0f) hitZone = StripDrag::TrimRight; + else hitZone = StripDrag::Move; } + } + dl->PopClipRect(); + + if (hit >= 0 && m_stripDrag == StripDrag::None) { + if (hitZone != StripDrag::Move) ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW); + const char* hint = hitZone == StripDrag::FadeIn ? "Fade in" + : hitZone == StripDrag::FadeOut ? "Fade out" + : hitZone == StripDrag::TrimLeft ? "Trim start" + : hitZone == StripDrag::TrimRight ? "Trim end (drag past the clip end to repeat)" + : nullptr; + if (hint) ImGui::SetTooltip("%s", hint); + } + if (clickedLeft) { + if (hit >= 0) { + m_selectedStrip = hit; + m_keySelected = false; + m_stripDrag = hitZone; + m_stripDragOrigin = pose->strips[static_cast(hit)]; + m_stripDragMouseTime = xToTime(io.MousePos.x); + const std::string state = stripStateName(pose->strips[static_cast(hit)], animator, skin); + if (!state.empty()) { + AnimationEditorLink& mutableLink = AnimationEditorLink::get(); + mutableLink.focusState = state; + ++mutableLink.focusSerial; + } + } else if (inLane) { + m_selectedStrip = -1; + m_currentTime = std::max(0.0f, xToTime(io.MousePos.x)); + m_applyTime = true; + } + } + if (doubleClicked && hit >= 0) { + m_currentTime = pose->strips[static_cast(hit)].start; + m_applyTime = true; + } + if (clickedRight) { + m_contextStrip = hit; + m_contextTime = std::max(0.0f, xToTime(io.MousePos.x)); + m_contextTrack = track; + if (hit >= 0) { + m_selectedStrip = hit; + m_keySelected = false; + } + openStripMenu = true; + } + } - if (kfSelected && ImGui::IsMouseDragging(ImGuiMouseButton_Left, 2.0f)) { - f32 newTime = xToTime(ImGui::GetIO().MousePos.x); - newTime = std::max(0.0f, std::min(newTime, duration)); - moveSelectedKeyframe(newTime); + if (m_stripDrag != StripDrag::None) { + if (!ImGui::IsMouseDown(ImGuiMouseButton_Left) || m_selectedStrip < 0) { + m_stripDrag = StripDrag::None; + stripsEdited(); + } else if (ImGui::IsMouseDragging(ImGuiMouseButton_Left, 2.0f)) { + Animation::ClipStrip& strip = pose->strips[static_cast(m_selectedStrip)]; + const Animation::ClipStrip& origin = m_stripDragOrigin; + const f32 mouseTime = xToTime(io.MousePos.x); + const f32 delta = mouseTime - m_stripDragMouseTime; + const f32 length = Animation::clipStripLength(origin, skin); + const f32 speed = std::max(origin.speed, 0.01f); + const f32 full = stripClipDuration(origin, skin); + const f32 sourceOut = origin.clipOut < 0.0f ? full : origin.clipOut; + bool snapped = false; + switch (m_stripDrag) { + case StripDrag::Move: { + f32 start = std::max(0.0f, origin.start + delta); + const f32 snappedStart = snapTime(start, m_selectedStrip, snapped); + if (snapped) { + start = snappedStart; + } else { + const f32 snappedEnd = snapTime(start + length, m_selectedStrip, snapped); + if (snapped) start = std::max(0.0f, snappedEnd - length); + } + strip.start = start; + const i32 row = static_cast(std::floor((io.MousePos.y - m_stripRowsTop) / rowH)); + strip.track = std::clamp(row, 0, trackCount); + m_extraTracks = std::max(m_extraTracks, strip.track); + break; + } + case StripDrag::TrimLeft: { + if (origin.repeat > 1) break; + const f32 start = snapTime(origin.start + delta, m_selectedStrip, snapped); + const f32 shift = (start - origin.start) * speed; + if (!origin.reverse) { + const f32 in = std::clamp(origin.clipIn + shift, 0.0f, sourceOut - 0.02f); + strip.clipIn = in; + strip.start = std::max(0.0f, origin.start + (in - origin.clipIn) / speed); + } else { + const f32 out = std::clamp(sourceOut - shift, origin.clipIn + 0.02f, full); + strip.clipOut = out >= full - 0.0001f ? -1.0f : out; + strip.start = std::max(0.0f, origin.start + (sourceOut - out) / speed); + } + break; + } + case StripDrag::TrimRight: { + const f32 end = snapTime(origin.start + length + delta, m_selectedStrip, snapped); + const f32 wanted = std::max(0.02f, end - origin.start); + if (origin.repeat > 1) { + const f32 pass = length / static_cast(origin.repeat); + strip.repeat = std::clamp(static_cast(std::round(wanted / pass)), 1, 64); + break; + } + const f32 maxPass = origin.reverse ? sourceOut / speed : (full - origin.clipIn) / speed; + if (wanted <= maxPass + 0.0001f) { + strip.repeat = 1; + if (!origin.reverse) { + const f32 out = origin.clipIn + wanted * speed; + strip.clipOut = out >= full - 0.0001f ? -1.0f : out; + } else { + strip.clipIn = std::max(0.0f, sourceOut - wanted * speed); + } + } else { + if (!origin.reverse) strip.clipOut = -1.0f; + else strip.clipIn = 0.0f; + strip.repeat = std::clamp(static_cast(std::round(wanted / maxPass)), 1, 64); + } + break; + } + case StripDrag::FadeIn: + strip.fadeIn = std::clamp(mouseTime - strip.start, 0.0f, std::max(0.0f, length - strip.fadeOut)); + break; + case StripDrag::FadeOut: + strip.fadeOut = std::clamp(strip.start + length - mouseTime, 0.0f, std::max(0.0f, length - strip.fadeIn)); + break; + case StripDrag::None: + break; } + if (m_stripDrag != StripDrag::Move) ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW); + const f32 newLength = Animation::clipStripLength(strip, skin); + ImGui::SetTooltip("Start %.2fs Length %.2fs%s\nFade %.2fs / %.2fs", strip.start, newLength, + strip.repeat > 1 ? " (repeats)" : "", strip.fadeIn, strip.fadeOut); + m_timelineDrivesClip = true; + m_applyTime = true; + } + } - if (hovered && ImGui::IsMouseClicked(ImGuiMouseButton_Right)) { - m_selectedTrack = i; - m_selectedKeyframe = j; - deleteSelectedKeyframe(); + if (openStripMenu) ImGui::OpenPopup("##strip_ctx"); + if (ImGui::BeginPopup("##strip_ctx")) { + if (m_contextStrip >= 0 && m_contextStrip < static_cast(pose->strips.size())) { + Animation::ClipStrip& strip = pose->strips[static_cast(m_contextStrip)]; + ImGui::TextDisabled("%s", clipName(strip.clip)); + ImGui::Separator(); + if (ImGui::MenuItem("Split at Playhead", "Ctrl+K")) { + m_selectedStrip = m_contextStrip; + splitSelectedStrip(); + } else if (ImGui::MenuItem("Duplicate", "Ctrl+D")) { + m_selectedStrip = m_contextStrip; + duplicateSelectedStrip(); + } else if (ImGui::MenuItem("Delete", "Del")) { + m_selectedStrip = m_contextStrip; + deleteSelectedStrip(); + } else { + ImGui::Separator(); + bool changed = false; + if (ImGui::MenuItem("Mute", nullptr, strip.muted)) { + strip.muted = !strip.muted; + changed = true; + } + if (ImGui::MenuItem("Reverse", nullptr, strip.reverse)) { + strip.reverse = !strip.reverse; + changed = true; + } + if (ImGui::BeginMenu("Speed")) { + for (f32 value : {0.25f, 0.5f, 0.75f, 1.0f, 1.25f, 1.5f, 2.0f, 3.0f}) { + char label[16]; + std::snprintf(label, sizeof(label), "%.2fx", value); + if (ImGui::MenuItem(label, nullptr, std::fabs(strip.speed - value) < 0.001f)) { + strip.speed = value; + changed = true; + } + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Reset Trim")) { + strip.clipIn = 0.0f; + strip.clipOut = -1.0f; + strip.repeat = 1; + changed = true; + } + if (ImGui::MenuItem("Reset Fades")) { + strip.fadeIn = 0.0f; + strip.fadeOut = 0.0f; + strip.fadeInCurve = {}; + strip.fadeOutCurve = {}; + changed = true; + } + if (ImGui::BeginMenu("Move to Track")) { + for (i32 track = 0; track <= trackCount; ++track) { + const std::string label = track == trackCount ? "New Track" : "Clips " + std::to_string(track + 1); + if (ImGui::MenuItem(label.c_str(), nullptr, strip.track == track)) { + strip.track = track; + m_extraTracks = std::max(m_extraTracks, track); + changed = true; + } + } + ImGui::EndMenu(); + } + if (animator && ImGui::BeginMenu("Bind to State")) { + if (ImGui::MenuItem("Automatic (by clip name)", nullptr, strip.state[0] == '\0')) { + strip.state[0] = '\0'; + changed = true; + } + for (const auto& pair : animator->states) { + if (ImGui::MenuItem(pair.key.cStr(), nullptr, std::string(strip.state) == pair.key.cStr())) { + std::snprintf(strip.state, sizeof(strip.state), "%s", pair.key.cStr()); + changed = true; + } + } + ImGui::EndMenu(); + } + if (animator && strip.track == 0) { + const std::vector order = baseTrackOrder(*pose); + const auto at = std::find(order.begin(), order.end(), static_cast(m_contextStrip)); + if (at != order.end() && at != order.begin()) { + const Animation::ClipStrip& previous = pose->strips[*(at - 1)]; + const std::string from = stripStateName(previous, animator, skin); + const std::string to = stripStateName(strip, animator, skin); + if (!from.empty() && !to.empty() && from != to) { + Animation::AnimationTransition* existing = findTransition(*animator, from, to); + const std::string label = existing ? "Sync Crossfade To Animator (" + from + " > " + to + ")" + : "Create Transition In Animator (" + from + " > " + to + ")"; + if (ImGui::MenuItem(label.c_str())) { + if (!existing) { + Animation::AnimationState* source = animator->states.get(FixedString<32>(from.c_str())); + if (source) { + Animation::AnimationTransition transition; + transition.toState = to.c_str(); + transition.hasExitTime = true; + const f32 previousLength = std::max(Animation::clipStripLength(previous, skin), 0.0001f); + const f32 fade = stripCrossfade(*pose, static_cast(m_contextStrip), skin); + transition.exitTime = std::clamp((previousLength - fade) / previousLength, 0.0f, 1.0f); + source->transitions.push_back(transition); + } + } + changed = true; + } + } + } + } + if (changed) stripsEdited(); + } + } else { + ImGui::TextDisabled("Track %d at %.2fs", m_contextTrack + 1, m_contextTime); + ImGui::Separator(); + if (ImGui::BeginMenu("Add Clip Here")) { + for (size_t i = 0; skin && i < skin->clipNames.size(); ++i) { + if (ImGui::MenuItem(skin->clipNames[i].c_str())) { + Animation::ClipStrip strip; + strip.clip = static_cast(i); + strip.track = m_contextTrack; + strip.start = m_contextTime; + pose->strips.push_back(strip); + m_selectedStrip = static_cast(pose->strips.size()) - 1; + stripsEdited(); + } + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Add Track")) ++m_extraTracks; + bool trackEmpty = true; + for (const Animation::ClipStrip& strip : pose->strips) { + if (strip.track == m_contextTrack) trackEmpty = false; } + if (ImGui::MenuItem("Remove Track", nullptr, false, + trackEmpty && m_contextTrack > 0 && m_contextTrack == trackCount - 1 && m_extraTracks > 0)) { + --m_extraTracks; + } + if (ImGui::MenuItem("Build From Animator", nullptr, false, animator != nullptr)) buildStripsFromAnimator(); } + ImGui::EndPopup(); } +} - ImVec2 trackAreaEnd = ImGui::GetCursorScreenPos(); +void AnimationTimelinePanel::renderStripInspector() { + Animation::SkinnedPose* pose = selectedPose(); + if (!pose || m_selectedStrip < 0 || m_selectedStrip >= static_cast(pose->strips.size())) return; + const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); + Animation::Animator* animator = m_scene->get(ECS::Entity(m_selectedEntity, m_scene)); + AnimationEditorLink& link = AnimationEditorLink::get(); + Animation::ClipStrip& strip = pose->strips[static_cast(m_selectedStrip)]; + const f32 width = ImGui::GetContentRegionAvail().x; + bool changed = false; + auto clipName = [&](i32 clip) -> const char* { + return (skin && clip >= 0 && clip < static_cast(skin->clipNames.size())) + ? skin->clipNames[static_cast(clip)].c_str() + : "Clip"; + }; - { - f32 px = timeToX(m_currentTime); - f32 topY = trackAreaStart.y; - f32 botY = trackAreaEnd.y; - dl->AddLine(ImVec2(px, topY), ImVec2(px, botY), k_ColPlayhead, 1.5f); + ImGui::TextUnformatted("Clip"); + ImGui::BeginDisabled(m_editBone < 0); + if (ImGui::Button("Edit Bone Keys") && skin && m_editBone >= 0) { + Animation::bakeClipToKeys(*pose, *skin, strip.clip, m_editBone); + m_objectRow = false; + m_applyTime = true; + } + ImGui::EndDisabled(); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip(m_editBone < 0 ? "Select a bone first." + : "Copies this bone's channel from the clip onto editable keys."); + } + ImGui::SameLine(); + if (ImGui::SmallButton("All Joints") && skin) { + Animation::bakeClipToKeys(*pose, *skin, strip.clip, -1); + m_applyTime = true; + } + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Copies every non-finger joint. Heavy on long clips."); + ImGui::SameLine(); + if (ImGui::Button("Delete Clip")) deleteSelectedStrip(); + ImGui::PushItemWidth(width - 92.0f); + if (ImGui::BeginCombo("Source", clipName(strip.clip))) { + for (size_t i = 0; skin && i < skin->clipNames.size(); ++i) { + if (ImGui::Selectable(skin->clipNames[i].c_str(), static_cast(i) == strip.clip)) { + strip.clip = static_cast(i); + strip.clipIn = 0.0f; + strip.clipOut = -1.0f; + changed = true; + } + } + ImGui::EndCombo(); + } + const std::string bound = stripStateName(strip, animator, skin); + const std::string statePreview = strip.state[0] != '\0' ? std::string(strip.state) + : bound.empty() ? std::string("None") + : "Auto: " + bound; + ImGui::BeginDisabled(animator == nullptr); + if (ImGui::BeginCombo("State", statePreview.c_str())) { + if (ImGui::Selectable("Automatic (by clip name)", strip.state[0] == '\0')) { + strip.state[0] = '\0'; + changed = true; + } + for (const auto& pair : animator->states) { + if (ImGui::Selectable(pair.key.cStr(), std::string(strip.state) == pair.key.cStr())) { + std::snprintf(strip.state, sizeof(strip.state), "%s", pair.key.cStr()); + changed = true; + } + } + ImGui::EndCombo(); + } + ImGui::EndDisabled(); + int track = strip.track + 1; + if (ImGui::InputInt("Track", &track)) { + strip.track = std::max(0, track - 1); + m_extraTracks = std::max(m_extraTracks, strip.track); + changed = true; } - if (m_selectedTrack < m_tracks.size()) { - auto& track = m_tracks[m_selectedTrack]; - ImGui::Separator(); - ImGui::Text("Selected: %s Keyframes: %zu", track->targetPropertyName.cStr(), track->keyframes.size()); - if (m_selectedKeyframe < track->keyframes.size()) { - const auto& kf = track->keyframes[m_selectedKeyframe]; - ImGui::SameLine(0, 16.0f); - ImGui::TextDisabled("Key %zu @ %.3fs", m_selectedKeyframe, kf.time); + ImGui::SeparatorText("Timing"); + const f32 full = stripClipDuration(strip, skin); + changed |= ImGui::DragFloat("Start", &strip.start, 0.01f, 0.0f, 3600.0f, "%.3fs"); + f32 trimOut = strip.clipOut < 0.0f ? full : strip.clipOut; + if (ImGui::DragFloat("Trim In", &strip.clipIn, 0.01f, 0.0f, trimOut - 0.02f, "%.3fs")) { + strip.clipIn = std::clamp(strip.clipIn, 0.0f, trimOut - 0.02f); + changed = true; + } + if (ImGui::DragFloat("Trim Out", &trimOut, 0.01f, strip.clipIn + 0.02f, full, "%.3fs")) { + trimOut = std::clamp(trimOut, strip.clipIn + 0.02f, full); + strip.clipOut = trimOut >= full - 0.0001f ? -1.0f : trimOut; + changed = true; + } + ImGui::TextDisabled("Uses %.2fs of %.2fs", trimOut - strip.clipIn, full); + if (ImGui::DragFloat("Speed", &strip.speed, 0.01f, 0.05f, 8.0f, "%.2fx")) { + strip.speed = std::clamp(strip.speed, 0.05f, 8.0f); + changed = true; + } + f32 length = Animation::clipStripLength(strip, skin); + if (ImGui::DragFloat("Length", &length, 0.01f, 0.05f, 3600.0f, "%.3fs")) { + const f32 source = (trimOut - strip.clipIn) * static_cast(std::max(strip.repeat, 1)); + strip.speed = std::clamp(source / std::max(length, 0.05f), 0.05f, 8.0f); + changed = true; + } + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Stretches the clip: changes its speed to fit this length."); + if (ImGui::InputInt("Repeat", &strip.repeat)) { + strip.repeat = std::clamp(strip.repeat, 1, 64); + changed = true; + } + changed |= ImGui::Checkbox("Reverse", &strip.reverse); + ImGui::SameLine(); + changed |= ImGui::Checkbox("Mute", &strip.muted); + + ImGui::SeparatorText("Blending"); + length = Animation::clipStripLength(strip, skin); + changed |= ImGui::SliderFloat("Weight", &strip.weight, 0.0f, 1.0f, "%.2f"); + if (ImGui::DragFloat("Fade In", &strip.fadeIn, 0.01f, 0.0f, std::max(0.0f, length - strip.fadeOut), "%.2fs")) { + strip.fadeIn = std::clamp(strip.fadeIn, 0.0f, std::max(0.0f, length - strip.fadeOut)); + changed = true; + } + const f32 overlap = Animation::clipStripOverlapIn(*pose, static_cast(m_selectedStrip), skin); + if (overlap > 0.0f) ImGui::TextDisabled("Crossfade from the clip before: %.2fs", overlap); + if (strip.fadeIn > 0.0f || overlap > 0.0f) changed |= editKeyCurve("fade_in_curve", strip.fadeInCurve, width, 80.0f); + if (ImGui::DragFloat("Fade Out", &strip.fadeOut, 0.01f, 0.0f, std::max(0.0f, length - strip.fadeIn), "%.2fs")) { + strip.fadeOut = std::clamp(strip.fadeOut, 0.0f, std::max(0.0f, length - strip.fadeIn)); + changed = true; + } + if (strip.fadeOut > 0.0f) changed |= editKeyCurve("fade_out_curve", strip.fadeOutCurve, width, 80.0f); + if (ImGui::DragFloat("Loop Blend", &strip.loopBlend, 0.01f, 0.0f, std::max(0.0f, length * 0.5f), "%.2fs")) { + strip.loopBlend = std::clamp(strip.loopBlend, 0.0f, std::max(0.0f, length * 0.5f)); + changed = true; + } + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Blends the end of the clip into its start so repeats loop seamlessly."); + + if (animator) { + ImGui::SeparatorText("Animator"); + if (bound.empty()) { + ImGui::TextWrapped("Bind this clip to a state to sync its crossfades with the Animator."); + } else { + ImGui::Text("State: %s", bound.c_str()); + if (ImGui::SmallButton("Show In Animator")) { + link.focusState = bound; + ++link.focusSerial; + } + if (strip.track == 0) { + const std::vector order = baseTrackOrder(*pose); + const auto at = std::find(order.begin(), order.end(), static_cast(m_selectedStrip)); + if (at != order.end() && at != order.begin()) { + const std::string from = stripStateName(pose->strips[*(at - 1)], animator, skin); + if (!from.empty() && from != bound) { + if (const Animation::AnimationTransition* transition = findTransition(*animator, from, bound)) { + ImGui::TextDisabled("%s > %s blend %.2fs %s", from.c_str(), bound.c_str(), transition->blendTime, + Animation::keyInterpName(transition->blendCurve.mode)); + } else { + ImGui::TextDisabled("No transition %s > %s yet.", from.c_str(), bound.c_str()); + ImGui::TextDisabled("Right-click the clip to create it."); + } + } + } + } else { + ImGui::TextDisabled("Only the first track syncs crossfades."); + } } } + ImGui::PopItemWidth(); + if (changed) stripsEdited(); } void AnimationTimelinePanel::renderTracks() {} diff --git a/src/editor/AnimationTimeline.hpp b/src/editor/AnimationTimeline.hpp index 7af78b03..575a040e 100644 --- a/src/editor/AnimationTimeline.hpp +++ b/src/editor/AnimationTimeline.hpp @@ -1,5 +1,6 @@ #pragma once #include "animation/ClipAsset.hpp" +#include "animation/SkinLibrary.hpp" #include "ecs/World.hpp" #include "core/Types.hpp" #include "math/Vec3.hpp" @@ -100,7 +101,12 @@ class AnimationTimelinePanel { void close() { m_open = false; } void open() { m_open = true; } - void setScene(ECS::World* world, u32 selectedEntity); + void setScene(ECS::World* world, u32 selectedEntity, i32 selectedBone); + void setProjectRoot(const std::string& root) { m_projectRoot = root; } + /// Project folder new .anim files go to. + std::filesystem::path animationFolder() const; + /// The timeline row click selects a joint. -1 is the object itself. + bool consumePickedBone(i32& bone); void newClip(); void loadClipFile(const std::filesystem::path& path); void saveClipFile(const std::filesystem::path& path); @@ -126,15 +132,66 @@ class AnimationTimelinePanel { f32 m_currentTime = 0.0f; f32 m_timelineDuration = 0.0f; std::string m_driveName; + bool m_drivingBones = false; bool m_applyTime = false; bool m_isPlaying = false; bool m_looping = true; bool m_onionSkinningEnabled = false; bool m_open = true; + f32 m_viewStart = 0.0f; + f32 m_viewSpan = 0.0f; + + void renderBoneRows(f32 laneLeft, f32 trackWidth, f32 duration); + void renderSpriteRows(f32 laneLeft, f32 trackWidth, f32 duration); + void renderCurveEditor(); + void renderStripRows(f32 laneLeft, f32 trackWidth); + void renderStripInspector(); + void renderAssetPopups(); + void splitSelectedStrip(); + void duplicateSelectedStrip(); + void deleteSelectedStrip(); + void buildStripsFromAnimator(); + void stripsEdited(); + void openAnimationPath(const std::string& path); + bool saveAnimationPath(const std::filesystem::path& path, const std::string& name); + Animation::SkinnedPose* selectedPose() const; + + enum class StripDrag { None, Move, TrimLeft, TrimRight, FadeIn, FadeOut }; + + std::string m_projectRoot; + u32 m_driveEntity = 0xFFFFFFFFu; + i32 m_selectedStrip = -1; + StripDrag m_stripDrag = StripDrag::None; + Animation::ClipStrip m_stripDragOrigin; + f32 m_stripDragMouseTime = 0.0f; + f32 m_stripRowsTop = 0.0f; + i32 m_extraTracks = 0; + bool m_snap = true; + i32 m_contextStrip = -1; + f32 m_contextTime = 0.0f; + i32 m_contextTrack = 0; + u64 m_linkSelectionSeen = 0; + u64 m_linkTransitionSeen = 0; + char m_assetFilter[64] = {}; + char m_assetName[64] = {}; + bool m_openSavePopup = false; + bool m_openLoadPopup = false; + std::string m_assetStatus; + usize m_selectedTrack = 0; usize m_selectedKeyframe = 0; bool m_isDraggingKeyframe = false; + /// Bone mode: a key (and the segment that leaves it) is selected. + bool m_keySelected = false; + i32 m_contextBone = -2; + usize m_contextKey = 0; + int m_dragHandle = 0; + bool m_scrubbing = false; + i32 m_editBone = -1; + i32 m_pickedBone = -2; + bool m_objectRow = false; + bool m_timelineDrivesClip = false; }; } // namespace Caffeine::Editor \ No newline at end of file diff --git a/src/editor/AnimatorController.cpp b/src/editor/AnimatorController.cpp index 36a64c0f..82443fc7 100644 --- a/src/editor/AnimatorController.cpp +++ b/src/editor/AnimatorController.cpp @@ -1,281 +1,1019 @@ #include "editor/AnimatorController.hpp" +#include "animation/AnimationSystem.hpp" #include "animation/SkinLibrary.hpp" -#include +#include "editor/AnimationEditorLink.hpp" +#include #include #include +#include +#include #ifdef CF_HAS_IMGUI +#include "editor/CurveWidget.hpp" + namespace Caffeine::Editor { using namespace Animation; -static const ImU32 k_ColCanvas = IM_COL32(28, 28, 36, 255); -static const ImU32 k_ColGrid = IM_COL32(45, 45, 58, 255); -static const ImU32 k_ColStateNormal = IM_COL32(50, 70, 110, 255); -static const ImU32 k_ColStateActive = IM_COL32(40, 130, 80, 255); -static const ImU32 k_ColStateSel = IM_COL32(80, 110, 180, 255); -static const ImU32 k_ColStateBorder = IM_COL32(100,120, 180, 255); -static const ImU32 k_ColStateText = IM_COL32(220,230,255, 255); -static const ImU32 k_ColArrow = IM_COL32(160,180,210, 255); -static const ImU32 k_ColArrowActive = IM_COL32(80, 220, 120, 255); - -void AnimatorControllerWindow::bindSelection(ECS::World* world, ECS::Entity entity) { +static const ImU32 k_ColCanvas = IM_COL32(36, 38, 42, 255); +static const ImU32 k_ColGrid = IM_COL32(46, 48, 53, 255); +static const ImU32 k_ColGridMajor = IM_COL32(58, 60, 66, 255); +static const ImU32 k_ColStateNormal = IM_COL32(78, 82, 88, 255); +static const ImU32 k_ColStateDefault = IM_COL32(196, 112, 42, 255); +static const ImU32 k_ColEntry = IM_COL32(42, 138, 70, 255); +static const ImU32 k_ColExit = IM_COL32(168, 52, 52, 255); +static const ImU32 k_ColAny = IM_COL32(42, 128, 126, 255); +static const ImU32 k_ColBorder = IM_COL32(20, 20, 22, 255); +static const ImU32 k_ColSelected = IM_COL32(90, 160, 255, 255); +static const ImU32 k_ColText = IM_COL32(236, 238, 242, 255); +static const ImU32 k_ColArrow = IM_COL32(214, 218, 224, 230); +static const ImU32 k_ColArrowHover = IM_COL32(255, 255, 255, 255); +static const ImU32 k_ColProgress = IM_COL32(80, 150, 255, 255); +static const ImU32 k_ColTimeline = IM_COL32(110, 220, 140, 255); + +static const char* k_EntryName = "Entry"; +static const char* k_AnyName = "Any State"; +static const char* k_ExitName = kAnimatorExitState; +static const char* k_LayerPayload = "CAF_ANIM_LAYER"; + +static bool reservedNodeName(const std::string& name) { + return name == k_EntryName || name == k_AnyName || name == k_ExitName; +} + +static f32 distanceToSegment(ImVec2 p, ImVec2 a, ImVec2 b) { + const f32 dx = b.x - a.x; + const f32 dy = b.y - a.y; + const f32 len2 = dx * dx + dy * dy; + f32 t = len2 > 0.0001f ? ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2 : 0.0f; + t = std::clamp(t, 0.0f, 1.0f); + const f32 px = a.x + dx * t - p.x; + const f32 py = a.y + dy * t - p.y; + return std::sqrt(px * px + py * py); +} + +void AnimatorControllerWindow::bindSelection(ECS::World* world, ECS::Entity entity, + const std::string& projectRoot) { + Animator* animator = nullptr; + if (world && entity.isValid()) { + if (SkinnedPose* pose = ensurePoseForMesh(*world, entity, projectRoot)) { + if (const ImportedSkin* skin = findImportedSkin(pose->meshPath)) { + if (!skin->clipNames.empty() && !world->has(entity)) { + world->add(entity); + if (Animator* created = world->get(entity)) { + for (const std::string& clip : skin->clipNames) { + if (clip.empty()) continue; + AnimationState state; + state.name = clip.c_str(); + state.motion = clip.c_str(); + created->states.set(state.name, state); + if (created->defaultState.empty()) created->defaultState = state.name; + } + } + } + } + } + animator = world->get(entity); + } + if (animator == m_bound && world == m_world && entity == m_entity) return; + if (m_preview) stopPreview(); m_world = world; m_entity = entity; - Animator* animator = nullptr; - if (world && entity.isValid()) animator = world->get(entity); - if (animator == m_bound) return; m_bound = animator; setAnimator(animator); } void AnimatorControllerWindow::setAnimator(Animator* animator) { m_animator = animator ? animator : &m_internalAnimator; - m_nodePositions.clear(); + m_layer = -1; + m_selection = Selection::None; m_selectedState.clear(); - if (!animator) return; - - float col = 0.0f; - float row = 0.0f; - float stepX = 180.0f; - float stepY = 70.0f; - int n = 0; + m_selectedTransitionFrom.clear(); + m_selectedTransition = -1; + m_dragNode.clear(); + m_linkFrom.clear(); + m_linkDrag = false; + m_status.clear(); + m_renameTarget.clear(); + m_layerNameTarget = -2; + if (m_animator->defaultState.empty() && !m_animator->states.empty()) { + m_animator->defaultState = m_animator->states.begin()->key; + } + layoutMissingNodes(); +} - for (auto& pair : animator->states) { - m_nodePositions[pair.key.cStr()] = StateNodePos{col * stepX + 20.0f, row * stepY + 20.0f}; - ++n; - col += 1.0f; - if (n % 4 == 0) { col = 0.0f; row += 1.0f; } +AnimatorStateMachine& AnimatorControllerWindow::graph() { + if (m_layer >= 0 && m_layer < static_cast(m_animator->layers.size()) && + !m_animator->layers[static_cast(m_layer)].isGroup) { + return m_animator->layers[static_cast(m_layer)]; } + return *m_animator; } -ImVec2 AnimatorControllerWindow::nodeCenter(const StateNodePos& pos) const { - ImVec2 sz = stateNodeSize(); - return {pos.x + sz.x * 0.5f, pos.y + sz.y * 0.5f}; +bool AnimatorControllerWindow::editingGroup() const { + return m_layer >= 0 && m_layer < static_cast(m_animator->layers.size()) && + m_animator->layers[static_cast(m_layer)].isGroup; } -void AnimatorControllerWindow::render() { - if (!m_open) return; +std::vector* AnimatorControllerWindow::transitionList(const std::string& from) { + AnimatorStateMachine& sm = graph(); + if (from == k_AnyName) return &sm.anyStateTransitions; + AnimationState* state = sm.states.get(FixedString<32>(from.c_str())); + return state ? &state->transitions : nullptr; +} - ImGui::SetNextWindowSizeConstraints({500, 350}, {FLT_MAX, FLT_MAX}); - if (!ImGui::Begin("Animator Controller", &m_open)) { - ImGui::End(); - return; - } +AnimationTransition* AnimatorControllerWindow::selectedTransition() { + std::vector* list = transitionList(m_selectedTransitionFrom); + if (!list || m_selectedTransition < 0 || m_selectedTransition >= static_cast(list->size())) return nullptr; + return &(*list)[static_cast(m_selectedTransition)]; +} - if (!m_bound) { - ImGui::TextDisabled("Add an Animator on the selected entity to keep this graph."); +bool AnimatorControllerWindow::timelineLinked(const std::string& from, const std::string& to) const { + if (m_layer != -1 || !m_world || !m_entity.isValid() || from == k_AnyName) return false; + const SkinnedPose* pose = m_world->get(m_entity); + if (!pose) return false; + const ImportedSkin* skin = findImportedSkin(pose->meshPath); + const std::vector order = baseTrackOrder(*pose); + for (size_t i = 1; i < order.size(); ++i) { + if (stripStateName(pose->strips[order[i - 1]], m_animator, skin) == from && + stripStateName(pose->strips[order[i]], m_animator, skin) == to) { + return true; + } } + return false; +} + +void AnimatorControllerWindow::transitionEdited(const std::string& from, const AnimationTransition& transition) { + if (m_layer != -1 || from == k_AnyName || !m_world || !m_entity.isValid()) return; + SkinnedPose* pose = m_world->get(m_entity); + if (!pose) return; + pullTransitionToStrips(*pose, findImportedSkin(pose->meshPath), *m_animator, from, transition.toState.cStr(), transition); +} + +std::vector AnimatorControllerWindow::clipNames() const { + if (!m_world || !m_entity.isValid()) return {}; + const SkinnedPose* pose = m_world->get(m_entity); + const ImportedSkin* skin = pose ? findImportedSkin(pose->meshPath) : nullptr; + return skin ? skin->clipNames : std::vector{}; +} + +f32 AnimatorControllerWindow::stateDuration(const AnimationState& state) const { if (m_world && m_entity.isValid()) { - if (const Animation::SkinnedPose* pose = m_world->get(m_entity)) { - if (const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath)) { - if (ImGui::Button("States from bone clips") && m_animator && !skin->clipNames.empty()) { - float column = 0.0f; - float row = 0.0f; - for (const std::string& clipName : skin->clipNames) { - FixedString<32> name(clipName.c_str()); - if (name.empty()) continue; - if (!m_animator->states.get(name)) { - AnimationState state; - state.name = name; - m_animator->states.set(name, state); - } - if (m_nodePositions.find(name.cStr()) == m_nodePositions.end()) { - m_nodePositions[name.cStr()] = StateNodePos{column * 180.0f + 20.0f, row * 70.0f + 20.0f}; - column += 1.0f; - if (column >= 4.0f) { - column = 0.0f; - row += 1.0f; - } - } - if (m_animator->currentState.empty()) m_animator->currentState = name; - } + if (const SkinnedPose* pose = m_world->get(m_entity)) { + if (const ImportedSkin* skin = findImportedSkin(pose->meshPath)) { + const i32 clip = clipForAnimatorState(*skin, state.name.cStr(), state.motion.cStr()); + if (clip >= 0 && clip < static_cast(skin->clips.size())) { + return skin->clips[static_cast(clip)].duration; } - ImGui::SameLine(); - ImGui::TextDisabled("%d bone clips", static_cast(skin->clipNames.size())); } } } + return state.clip ? state.clip->duration() : 0.0f; +} - float inspectorWidth = 230.0f; - float availW = ImGui::GetContentRegionAvail().x; - float canvasW = availW - inspectorWidth - 6.0f; +f32 AnimatorControllerWindow::graphStateDuration(const AnimatorStateMachine& sm, const FixedString<32>& name) const { + const AnimationState* state = sm.states.get(name); + return state ? stateDuration(*state) : 0.0f; +} - ImGui::BeginChild("##anim_canvas_col", {canvasW, 0.0f}, false, ImGuiWindowFlags_NoScrollbar); - renderCanvas(); - ImGui::EndChild(); +void AnimatorControllerWindow::layoutMissingNodes() { + AnimatorStateMachine& sm = graph(); + int slot = 0; + for (auto& pair : sm.states) { + AnimationState& state = pair.value; + if (state.hasEditorPosition) continue; + for (;; ++slot) { + const f32 x = 240.0f + static_cast(slot % 3) * 200.0f; + const f32 y = 40.0f + static_cast(slot / 3) * 80.0f; + bool taken = false; + for (const auto& other : sm.states) { + if (other.value.hasEditorPosition && std::fabs(other.value.editorX - x) < 60.0f && + std::fabs(other.value.editorY - y) < 40.0f) { + taken = true; + break; + } + } + if (taken) continue; + state.editorX = x; + state.editorY = y; + state.hasEditorPosition = true; + ++slot; + break; + } + } +} - ImGui::SameLine(); - ImGui::BeginChild("##anim_inspector_col", {inspectorWidth, 0.0f}); - renderParameterPanel(); - ImGui::Separator(); - renderInspector(); - ImGui::EndChild(); +std::string AnimatorControllerWindow::uniqueStateName(const char* base) const { + AnimatorStateMachine& sm = const_cast(this)->graph(); + std::string name = reservedNodeName(base) ? std::string(base) + " 1" : std::string(base); + for (int suffix = 1; sm.states.contains(FixedString<32>(name.c_str())) || reservedNodeName(name); ++suffix) { + name = std::string(base) + " " + std::to_string(suffix); + } + return name; +} - ImGui::End(); +std::string AnimatorControllerWindow::uniqueLayerName(const char* base) const { + auto taken = [&](const std::string& name) { + for (const AnimatorLayer& layer : m_animator->layers) { + if (name == layer.name.cStr()) return true; + } + return name == "Base Layer"; + }; + std::string name = base; + for (int suffix = 1; taken(name); ++suffix) name = std::string(base) + " " + std::to_string(suffix); + return name; } -void AnimatorControllerWindow::renderCanvas() { - ImDrawList* dl = ImGui::GetWindowDrawList(); - ImVec2 origin = ImGui::GetCursorScreenPos(); - ImVec2 canvasSize = ImGui::GetContentRegionAvail(); +void AnimatorControllerWindow::selectState(const std::string& name) { + m_selection = Selection::State; + m_selectedState = name; + m_selectedTransition = -1; + if (m_layer == -1) { + AnimationEditorLink& link = AnimationEditorLink::get(); + link.selectedState = name; + ++link.selectionSerial; + } +} - ImGui::InvisibleButton("##canvas", canvasSize, ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); - bool canvasHovered = ImGui::IsItemHovered(); - bool canvasClicked = ImGui::IsItemClicked(ImGuiMouseButton_Right); +void AnimatorControllerWindow::createState(const char* name, const char* motion, f32 x, f32 y) { + AnimatorStateMachine& sm = graph(); + AnimationState state; + state.name = name; + state.motion = motion ? motion : ""; + state.editorX = x; + state.editorY = y; + state.hasEditorPosition = true; + sm.states.set(state.name, state); + if (sm.defaultState.empty()) sm.defaultState = state.name; + selectState(name); +} - dl->AddRectFilled(origin, {origin.x + canvasSize.x, origin.y + canvasSize.y}, k_ColCanvas); +void AnimatorControllerWindow::renameState(const std::string& from, const std::string& to) { + if (to.empty() || from == to) return; + if (reservedNodeName(to)) { + m_status = to + " is reserved for a graph node."; + return; + } + AnimatorStateMachine& sm = graph(); + const FixedString<32> oldName(from.c_str()); + const FixedString<32> newName(to.c_str()); + if (sm.states.contains(newName)) { + m_status = "A state named " + to + " already exists."; + return; + } + const AnimationState* existing = sm.states.get(oldName); + if (!existing) return; + AnimationState copy = *existing; + copy.name = newName; + if (copy.motion.empty()) copy.motion = oldName; + sm.states.remove(oldName); + sm.states.set(newName, copy); + for (auto& pair : sm.states) { + for (AnimationTransition& transition : pair.value.transitions) { + if (transition.toState == oldName) transition.toState = newName; + } + } + for (AnimationTransition& transition : sm.anyStateTransitions) { + if (transition.toState == oldName) transition.toState = newName; + } + if (sm.defaultState == oldName) sm.defaultState = newName; + if (sm.currentState == oldName) sm.currentState = newName; + if (sm.previousState == oldName) sm.previousState = newName; + if (sm.fadeFromState == oldName) sm.fadeFromState = newName; + if (m_layer == -1 && m_world && m_entity.isValid()) { + if (SkinnedPose* pose = m_world->get(m_entity)) { + for (ClipStrip& strip : pose->strips) { + if (from == strip.state) std::snprintf(strip.state, sizeof(strip.state), "%s", to.c_str()); + } + } + } + if (m_selectedState == from) m_selectedState = to; + if (m_selectedTransitionFrom == from) m_selectedTransitionFrom = to; + m_renameTarget.clear(); +} - float gridStep = 40.0f; - for (float x = fmodf(m_canvasScrollX, gridStep); x < canvasSize.x; x += gridStep) - dl->AddLine({origin.x + x, origin.y}, {origin.x + x, origin.y + canvasSize.y}, k_ColGrid); - for (float y = fmodf(m_canvasScrollY, gridStep); y < canvasSize.y; y += gridStep) - dl->AddLine({origin.x, origin.y + y}, {origin.x + canvasSize.x, origin.y + y}, k_ColGrid); +void AnimatorControllerWindow::deleteState(const std::string& name) { + AnimatorStateMachine& sm = graph(); + const FixedString<32> key(name.c_str()); + sm.states.remove(key); + auto dropTarget = [&](std::vector& transitions) { + transitions.erase(std::remove_if(transitions.begin(), transitions.end(), + [&](const AnimationTransition& t) { return t.toState == key; }), + transitions.end()); + }; + for (auto& pair : sm.states) dropTarget(pair.value.transitions); + dropTarget(sm.anyStateTransitions); + if (sm.defaultState == key) { + sm.defaultState = sm.states.empty() ? FixedString<32>() : sm.states.begin()->key; + } + if (sm.currentState == key) sm.currentState = FixedString<32>(); + if (sm.fadeFromState == key) sm.fadeDuration = 0.0f; + m_selection = Selection::None; + m_selectedState.clear(); + m_selectedTransition = -1; +} - if (canvasHovered && ImGui::IsMouseDragging(ImGuiMouseButton_Middle)) { - ImVec2 delta = ImGui::GetIO().MouseDelta; - m_canvasScrollX += delta.x; - m_canvasScrollY += delta.y; +void AnimatorControllerWindow::addTransition(const std::string& from, const std::string& to) { + if (from == to) return; + if (to == k_EntryName || to == k_AnyName) { + m_status = "Transitions cannot end on Entry or Any State."; + return; + } + AnimatorStateMachine& sm = graph(); + if (from == k_EntryName) { + if (to == k_ExitName) return; + sm.defaultState = to.c_str(); + m_selection = Selection::Entry; + return; + } + if (from == k_ExitName) { + m_status = "Exit has no outgoing transitions. It returns to Entry."; + return; + } + if (from == k_AnyName && to == k_ExitName) { + m_status = "Any State cannot lead to Exit."; + return; + } + std::vector* list = transitionList(from); + if (!list) return; + AnimationTransition transition; + transition.toState = to.c_str(); + transition.blendTime = 0.25f; + if (from == k_AnyName) { + transition.hasExitTime = false; + m_status = "Any State transitions fire on their conditions. Add one in the inspector."; + } else { + transition.hasExitTime = true; + const f32 duration = graphStateDuration(sm, FixedString<32>(from.c_str())); + transition.exitTime = duration > 0.0f ? std::max(0.0f, 1.0f - transition.blendTime / duration) : 0.75f; } + list->push_back(transition); + m_selection = Selection::Transition; + m_selectedTransitionFrom = from; + m_selectedTransition = static_cast(list->size()) - 1; + transitionEdited(from, transition); +} - if (canvasClicked) ImGui::OpenPopup("##canvas_ctx"); - if (ImGui::BeginPopup("##canvas_ctx")) { - if (ImGui::MenuItem("Add State")) m_addStatePopup = true; - ImGui::EndPopup(); +void AnimatorControllerWindow::playState(const std::string& name) { + AnimatorStateMachine& sm = graph(); + const FixedString<32> key(name.c_str()); + if (!sm.states.contains(key)) return; + if (!m_preview) startPreview(); + if (!m_preview) return; + AnimationTransition transition; + transition.toState = key; + transition.blendTime = (sm.currentState.empty() || sm.currentState == key) ? 0.0f : 0.2f; + AnimationSystem::enterState(sm, transition, [this](const AnimatorStateMachine& graphRef, const FixedString<32>& state) { + return graphStateDuration(graphRef, state); + }); +} + +static void resetGraphPlayback(AnimatorStateMachine& sm) { + sm.currentState = FixedString<32>(); + sm.previousState = FixedString<32>(); + sm.fadeFromState = FixedString<32>(); + sm.fadeDuration = 0.0f; + sm.fadeElapsed = 0.0f; + sm.timeInState = 0.0f; +} + +void AnimatorControllerWindow::startPreview() { + if (!m_bound || m_animator != m_bound) return; + resetGraphPlayback(*m_animator); + for (AnimatorLayer& layer : m_animator->layers) resetGraphPlayback(layer); + m_preview = true; + runPreview(); +} + +void AnimatorControllerWindow::stopPreview() { + m_preview = false; + if (m_bound && m_animator == m_bound) { + resetGraphPlayback(*m_animator); + for (AnimatorLayer& layer : m_animator->layers) resetGraphPlayback(layer); } + AnimationEditorLink::get().animatorPreview = false; +} + +void AnimatorControllerWindow::runPreview() { + if (!m_preview || !m_bound || m_animator != m_bound) return; + AnimationSystem::stepStateMachine(*m_animator, ImGui::GetIO().DeltaTime, + [this](const AnimatorStateMachine& sm, const FixedString<32>& name) { + return graphStateDuration(sm, name); + }); +} - if (m_addStatePopup) { - ImGui::OpenPopup("##new_state"); - m_addStatePopup = false; +void AnimatorControllerWindow::publishLink() { + AnimationEditorLink& link = AnimationEditorLink::get(); + if (!m_preview || !m_bound || !m_entity.isValid()) { + link.animatorPreview = false; + return; } - if (ImGui::BeginPopupModal("##new_state", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::Text("State name:"); - ImGui::InputText("##ns", m_newStateName, sizeof(m_newStateName)); - if (ImGui::Button("Add") && m_animator && m_newStateName[0] != '\0') { - AnimationState s; - s.name = m_newStateName; - m_animator->states.set(FixedString<32>(m_newStateName), s); - m_nodePositions[m_newStateName] = StateNodePos{80.0f, 80.0f}; - memset(m_newStateName, 0, sizeof(m_newStateName)); - ImGui::CloseCurrentPopup(); - } - ImGui::SameLine(); - if (ImGui::Button("Cancel")) ImGui::CloseCurrentPopup(); - ImGui::EndPopup(); + link.animatorPreview = true; + link.entity = m_entity.id(); + link.previewState = m_animator->currentState.cStr(); + link.previewTime = m_animator->timeInState; +} + +void AnimatorControllerWindow::consumeLink() { + AnimationEditorLink& link = AnimationEditorLink::get(); + if (link.timelinePlaying && !m_preview && m_entity.isValid() && link.entity == m_entity.id() && + !link.timelineState.empty() && m_selection != Selection::Transition) { + m_layer = -1; + m_selection = Selection::State; + m_selectedState = link.timelineState; + } + if (link.focusSerial == m_focusSeen) return; + m_focusSeen = link.focusSerial; + const AnimationState* state = m_animator->states.get(FixedString<32>(link.focusState.c_str())); + if (!state) return; + m_layer = -1; + m_selection = Selection::State; + m_selectedState = link.focusState; + m_selectedTransition = -1; + const ImVec2 node = stateNodeSize(); + const f32 x = state->editorX + m_canvasScrollX; + const f32 y = state->editorY + m_canvasScrollY; + if (m_canvasSize.x > 0.0f && (x < 0.0f || y < 0.0f || x + node.x > m_canvasSize.x || y + node.y > m_canvasSize.y)) { + m_canvasScrollX = m_canvasSize.x * 0.5f - (state->editorX + node.x * 0.5f); + m_canvasScrollY = m_canvasSize.y * 0.5f - (state->editorY + node.y * 0.5f); + } +} + +void AnimatorControllerWindow::render() { + if (!m_open) { + if (m_preview) stopPreview(); + return; } + if (m_layer >= static_cast(m_animator->layers.size())) m_layer = -1; + consumeLink(); + runPreview(); + publishLink(); - if (!m_animator) { - dl->AddText({origin.x + 12.0f, origin.y + 12.0f}, IM_COL32(100,100,120,200), "No animator assigned."); + ImGui::SetNextWindowSizeConstraints({560, 360}, {FLT_MAX, FLT_MAX}); + if (!ImGui::Begin("Animator Controller", &m_open)) { + ImGui::End(); return; } - dl->PushClipRect(origin, {origin.x + canvasSize.x, origin.y + canvasSize.y}, true); + renderToolbar(); + + const float sideWidth = 230.0f; + const float inspectorWidth = 280.0f; + const float availW = ImGui::GetContentRegionAvail().x; + const float canvasW = std::max(180.0f, availW - sideWidth - inspectorWidth - 12.0f); - for (auto& fromPair : m_animator->states) { - const FixedString<32>& fromName = fromPair.key; - const AnimationState& fromState = fromPair.value; + ImGui::BeginChild("##anim_params_col", {sideWidth, 0.0f}, true); + if (ImGui::BeginTabBar("##anim_side")) { + if (ImGui::BeginTabItem("Layers")) { + renderLayersPanel(); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Parameters")) { + renderParameterPanel(); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::EndChild(); + + ImGui::SameLine(); + ImGui::BeginChild("##anim_canvas_col", {canvasW, 0.0f}, false, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse); + if (editingGroup()) { + ImGui::Spacing(); + ImGui::TextDisabled(" This is a layer group. It scales the weight of the layers inside it."); + ImGui::TextDisabled(" Select a layer in the group to edit its graph."); + } else { + renderCanvas(); + } + ImGui::EndChild(); - auto fromIt = m_nodePositions.find(fromName.cStr()); - if (fromIt == m_nodePositions.end()) continue; + ImGui::SameLine(); + ImGui::BeginChild("##anim_inspector_col", {inspectorWidth, 0.0f}, true); + renderInspector(); + ImGui::EndChild(); - ImVec2 fc = nodeCenter(fromIt->second); - ImVec2 fromCanvas{origin.x + fc.x + m_canvasScrollX, origin.y + fc.y + m_canvasScrollY}; + ImGui::End(); +} - for (const auto& t : fromState.transitions) { - auto toIt = m_nodePositions.find(t.toState.cStr()); - if (toIt == m_nodePositions.end()) continue; - ImVec2 tc = nodeCenter(toIt->second); - ImVec2 toCanvas{origin.x + tc.x + m_canvasScrollX, origin.y + tc.y + m_canvasScrollY}; - bool isActiveTransition = (m_animator->currentState == fromName && - m_animator->previousState == t.toState); - drawTransitionArrow(fromCanvas, toCanvas, isActiveTransition); +void AnimatorControllerWindow::renderToolbar() { + const AnimationEditorLink& link = AnimationEditorLink::get(); + if (m_bound) { + bool preview = m_preview; + if (ImGui::Checkbox("Live Preview", &preview)) { + if (preview) startPreview(); + else stopPreview(); + } + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Runs every layer of the state machine in the editor. Change parameters to fire transitions.\n" + "The Animation Timeline follows the current state while this is on."); + } + ImGui::SameLine(); + if (ImGui::Button("Restart")) startPreview(); + ImGui::SameLine(); + const AnimatorStateMachine& sm = graph(); + const std::string layerName = m_layer < 0 ? std::string("Base Layer") + : std::string(m_animator->layers[static_cast(m_layer)].name.cStr()); + ImGui::TextDisabled("%s Current: %s %.2fs", layerName.c_str(), sm.currentState.empty() ? "-" : sm.currentState.cStr(), + sm.timeInState); + if (sm.fading()) { + ImGui::SameLine(); + ImGui::TextColored(ImVec4(0.45f, 0.65f, 1.0f, 1.0f), "blending from %s %.0f%%", sm.fadeFromState.cStr(), + 100.0f * sm.fadeElapsed / std::max(sm.fadeDuration, 0.0001f)); } + if (!m_preview && m_entity.isValid() && link.entity == m_entity.id() && link.timelineActive(skinFrameCounter())) { + ImGui::SameLine(0.0f, 16.0f); + ImGui::TextColored(ImVec4(0.45f, 0.86f, 0.55f, 1.0f), "Timeline: %s", link.timelineState.c_str()); + } + } else { + ImGui::TextDisabled("Select a mesh with a skeleton, or add an Animator component."); + } + if (!m_status.empty()) { + ImGui::SameLine(0.0f, 16.0f); + ImGui::TextColored(ImVec4(1.0f, 0.82f, 0.4f, 1.0f), "%s", m_status.c_str()); } + ImGui::TextDisabled("Right-click the grid to create states. Drag the dot on a node's right edge to link it. " + "Double-click a state to play it."); +} - bool deletedNode = false; - for (auto& nodePair : m_animator->states) { - if (deletedNode) break; +void AnimatorControllerWindow::renderCanvas() { + AnimatorStateMachine& sm = graph(); + const AnimationEditorLink& link = AnimationEditorLink::get(); + ImDrawList* dl = ImGui::GetWindowDrawList(); + const ImGuiIO& io = ImGui::GetIO(); + const ImVec2 origin = ImGui::GetCursorScreenPos(); + ImVec2 canvasSize = ImGui::GetContentRegionAvail(); + canvasSize.x = std::max(canvasSize.x, 50.0f); + canvasSize.y = std::max(canvasSize.y, 50.0f); + m_canvasSize = canvasSize; - const FixedString<32>& name = nodePair.key; - AnimationState& state = nodePair.value; + ImGui::InvisibleButton("##canvas", canvasSize, + ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle); + const bool hovered = ImGui::IsItemHovered(); + const bool active = ImGui::IsItemActive(); + const bool clickedLeft = ImGui::IsItemClicked(ImGuiMouseButton_Left); + const bool clickedRight = ImGui::IsItemClicked(ImGuiMouseButton_Right); + const ImVec2 canvasMax(origin.x + canvasSize.x, origin.y + canvasSize.y); - auto posIt = m_nodePositions.find(name.cStr()); - if (posIt == m_nodePositions.end()) continue; + dl->PushClipRect(origin, canvasMax, true); + dl->AddRectFilled(origin, canvasMax, k_ColCanvas); + const f32 gridStep = 22.0f; + { + const int firstX = static_cast(std::floor(-m_canvasScrollX / gridStep)); + for (int i = firstX;; ++i) { + const f32 x = origin.x + m_canvasScrollX + static_cast(i) * gridStep; + if (x > canvasMax.x) break; + dl->AddLine({x, origin.y}, {x, canvasMax.y}, (i % 5 == 0) ? k_ColGridMajor : k_ColGrid); + } + const int firstY = static_cast(std::floor(-m_canvasScrollY / gridStep)); + for (int i = firstY;; ++i) { + const f32 y = origin.y + m_canvasScrollY + static_cast(i) * gridStep; + if (y > canvasMax.y) break; + dl->AddLine({origin.x, y}, {canvasMax.x, y}, (i % 5 == 0) ? k_ColGridMajor : k_ColGrid); + } + } - StateNodePos& nodePos = posIt->second; - bool isActive = (m_animator->currentState == name); - bool isSelected = (m_selectedState == name.cStr()); + const bool timelineLive = m_layer == -1 && !m_preview && m_entity.isValid() && link.entity == m_entity.id() && + link.timelineActive(skinFrameCounter()); + std::vector timelineStates; + if (m_layer == -1 && m_world && m_entity.isValid()) { + if (const SkinnedPose* pose = m_world->get(m_entity)) { + const ImportedSkin* skin = findImportedSkin(pose->meshPath); + for (const ClipStrip& strip : pose->strips) { + const std::string name = stripStateName(strip, m_animator, skin); + if (!name.empty() && std::find(timelineStates.begin(), timelineStates.end(), name) == timelineStates.end()) { + timelineStates.push_back(name); + } + } + } + } + + const ImVec2 nodeSize = stateNodeSize(); + auto toScreen = [&](f32 x, f32 y) { return ImVec2(origin.x + x + m_canvasScrollX, origin.y + y + m_canvasScrollY); }; - ImVec2 nMin{origin.x + nodePos.x + m_canvasScrollX, - origin.y + nodePos.y + m_canvasScrollY}; - ImVec2 sz = stateNodeSize(); - ImVec2 nMax{nMin.x + sz.x, nMin.y + sz.y}; + struct NodeInfo { + std::string name; + ImVec2 min; + ImVec2 max; + Selection kind; + }; + std::vector nodes; + auto addNode = [&](const std::string& name, f32 x, f32 y, Selection kind) { + const ImVec2 min = toScreen(x, y); + nodes.push_back({name, min, ImVec2(min.x + nodeSize.x, min.y + nodeSize.y), kind}); + }; + addNode(k_AnyName, sm.anyX, sm.anyY, Selection::AnyState); + addNode(k_EntryName, sm.entryX, sm.entryY, Selection::Entry); + addNode(k_ExitName, sm.exitX, sm.exitY, Selection::Exit); + for (auto& pair : sm.states) { + addNode(pair.key.cStr(), pair.value.editorX, pair.value.editorY, Selection::State); + } + auto findNode = [&](const std::string& name) -> const NodeInfo* { + for (const NodeInfo& node : nodes) { + if (node.name == name) return &node; + } + return nullptr; + }; + auto nodeAt = [&](ImVec2 p) -> const NodeInfo* { + for (auto it = nodes.rbegin(); it != nodes.rend(); ++it) { + if (p.x >= it->min.x && p.x <= it->max.x && p.y >= it->min.y && p.y <= it->max.y) return &*it; + } + return nullptr; + }; + auto centerOf = [](const NodeInfo& node) { + return ImVec2((node.min.x + node.max.x) * 0.5f, (node.min.y + node.max.y) * 0.5f); + }; + auto edgePoint = [&](const NodeInfo& node, ImVec2 toward) { + const ImVec2 center = centerOf(node); + const f32 dx = toward.x - center.x; + const f32 dy = toward.y - center.y; + const f32 hx = (node.max.x - node.min.x) * 0.5f; + const f32 hy = (node.max.y - node.min.y) * 0.5f; + const f32 sx = std::fabs(dx) < 0.001f ? 1.0e9f : hx / std::fabs(dx); + const f32 sy = std::fabs(dy) < 0.001f ? 1.0e9f : hy / std::fabs(dy); + const f32 scale = std::min(sx, sy); + return ImVec2(center.x + dx * scale, center.y + dy * scale); + }; + auto portOf = [](const NodeInfo& node) { return ImVec2(node.max.x, (node.min.y + node.max.y) * 0.5f); }; - ImU32 bg = isActive ? k_ColStateActive : (isSelected ? k_ColStateSel : k_ColStateNormal); - dl->AddRectFilled(nMin, nMax, bg, 6.0f); - dl->AddRect(nMin, nMax, k_ColStateBorder, 6.0f, 0, isSelected ? 2.0f : 1.0f); + struct Edge { + std::string from; + std::string to; + int index = -1; + ImVec2 a; + ImVec2 b; + bool entry = false; + const AnimationTransition* transition = nullptr; + }; + std::vector edges; + if (!sm.defaultState.empty()) { + const NodeInfo* entry = findNode(k_EntryName); + const NodeInfo* target = findNode(sm.defaultState.cStr()); + if (entry && target) { + edges.push_back({k_EntryName, sm.defaultState.cStr(), -1, edgePoint(*entry, centerOf(*target)), + edgePoint(*target, centerOf(*entry)), true, nullptr}); + } + } + auto hasReverse = [&](const std::string& from, const std::string& to) { + const AnimationState* back = sm.states.get(FixedString<32>(to.c_str())); + if (!back) return false; + for (const AnimationTransition& t : back->transitions) { + if (from == t.toState.cStr()) return true; + } + return false; + }; + auto addEdges = [&](const std::string& fromName, const std::vector& transitions) { + const NodeInfo* from = findNode(fromName); + if (!from) return; + for (int i = 0; i < static_cast(transitions.size()); ++i) { + const AnimationTransition& transition = transitions[static_cast(i)]; + const NodeInfo* to = findNode(transition.toState.cStr()); + if (!to || to == from) continue; + ImVec2 a = edgePoint(*from, centerOf(*to)); + ImVec2 b = edgePoint(*to, centerOf(*from)); + if (hasReverse(fromName, transition.toState.cStr())) { + const f32 dx = b.x - a.x; + const f32 dy = b.y - a.y; + const f32 len = std::max(std::sqrt(dx * dx + dy * dy), 0.001f); + const ImVec2 offset(-dy / len * 6.0f, dx / len * 6.0f); + a = ImVec2(a.x + offset.x, a.y + offset.y); + b = ImVec2(b.x + offset.x, b.y + offset.y); + } + edges.push_back({fromName, transition.toState.cStr(), i, a, b, false, &transition}); + } + }; + addEdges(k_AnyName, sm.anyStateTransitions); + for (auto& pair : sm.states) addEdges(pair.key.cStr(), pair.value.transitions); - dl->AddText({nMin.x + 8.0f, nMin.y + 8.0f}, k_ColStateText, name.cStr()); - if (state.clip) { - char info[48]; - snprintf(info, sizeof(info), "%.0f fps", static_cast(state.clip->fps)); - dl->AddText({nMin.x + 8.0f, nMin.y + 24.0f}, IM_COL32(150,180,150,200), info); + auto edgeAt = [&](ImVec2 p) -> int { + int best = -1; + f32 bestDistance = 6.0f; + for (int i = 0; i < static_cast(edges.size()); ++i) { + const f32 d = distanceToSegment(p, edges[static_cast(i)].a, edges[static_cast(i)].b); + if (d < bestDistance) { + bestDistance = d; + best = i; + } } + return best; + }; - ImGui::SetCursorScreenPos(nMin); - std::string btnId = "##node_" + std::string(name.cStr()); - ImGui::InvisibleButton(btnId.c_str(), sz); + const ImVec2 mouse = io.MousePos; + const NodeInfo* hoveredNode = hovered ? nodeAt(mouse) : nullptr; + const int hoveredEdge = (hovered && !hoveredNode) ? edgeAt(mouse) : -1; + bool onPort = false; + if (hoveredNode && hoveredNode->kind != Selection::Exit) { + const ImVec2 port = portOf(*hoveredNode); + const f32 dx = mouse.x - port.x; + const f32 dy = mouse.y - port.y; + onPort = dx * dx + dy * dy < 100.0f; + } - if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) { - m_selectedState = name.cStr(); - m_animator->currentState = name; - m_animator->timeInState = 0.0f; + auto selectNode = [&](const NodeInfo& node) { + if (node.kind == Selection::State) { + selectState(node.name); + return; + } + m_selection = node.kind; + m_selectedState.clear(); + m_selectedTransition = -1; + }; + auto selectEdge = [&](const Edge& edge) { + if (edge.entry) { + m_selection = Selection::Entry; + return; } - if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left, 4.0f)) { - ImVec2 delta = ImGui::GetIO().MouseDelta; - nodePos.x += delta.x; - nodePos.y += delta.y; + m_selection = Selection::Transition; + m_selectedTransitionFrom = edge.from; + m_selectedTransition = edge.index; + if (m_layer == -1 && edge.from != k_AnyName) { + AnimationEditorLink& mutableLink = AnimationEditorLink::get(); + mutableLink.selectedFrom = edge.from; + mutableLink.selectedTo = edge.to; + ++mutableLink.transitionSerial; } - if (ImGui::IsItemHovered() && ImGui::IsMouseClicked(ImGuiMouseButton_Right)) { - m_selectedState = name.cStr(); - ImGui::OpenPopup(("##node_ctx_" + std::string(name.cStr())).c_str()); + }; + + if (clickedLeft) { + m_status.clear(); + if (!m_linkFrom.empty() && !m_linkDrag) { + if (hoveredNode) addTransition(m_linkFrom, hoveredNode->name); + m_linkFrom.clear(); + } else if (onPort) { + m_linkFrom = hoveredNode->name; + m_linkDrag = true; + } else if (hoveredNode) { + selectNode(*hoveredNode); + m_dragNode = hoveredNode->name; + } else if (hoveredEdge >= 0) { + selectEdge(edges[static_cast(hoveredEdge)]); + } else { + m_selection = Selection::None; + m_selectedState.clear(); + m_panning = true; } - if (ImGui::BeginPopup(("##node_ctx_" + std::string(name.cStr())).c_str())) { - if (ImGui::MenuItem("Set as Default")) { - m_animator->currentState = name; - m_animator->timeInState = 0.0f; + } + if (hoveredNode && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left) && hoveredNode->kind == Selection::State) { + playState(hoveredNode->name); + } + if (active && ImGui::IsMouseDragging(ImGuiMouseButton_Left, 2.0f)) { + if (!m_dragNode.empty()) { + if (m_dragNode == k_EntryName) { + sm.entryX += io.MouseDelta.x; + sm.entryY += io.MouseDelta.y; + } else if (m_dragNode == k_AnyName) { + sm.anyX += io.MouseDelta.x; + sm.anyY += io.MouseDelta.y; + } else if (m_dragNode == k_ExitName) { + sm.exitX += io.MouseDelta.x; + sm.exitY += io.MouseDelta.y; + } else if (AnimationState* state = sm.states.get(FixedString<32>(m_dragNode.c_str()))) { + state->editorX += io.MouseDelta.x; + state->editorY += io.MouseDelta.y; } - if (ImGui::MenuItem("Add Transition")) { - m_showAddTransition = true; + } else if (m_panning) { + m_canvasScrollX += io.MouseDelta.x; + m_canvasScrollY += io.MouseDelta.y; + } + } + if ((hovered || active) && ImGui::IsMouseDragging(ImGuiMouseButton_Middle)) { + m_canvasScrollX += io.MouseDelta.x; + m_canvasScrollY += io.MouseDelta.y; + } + if (ImGui::IsMouseReleased(ImGuiMouseButton_Left)) { + if (m_linkDrag) { + const NodeInfo* target = nodeAt(mouse); + if (target && target->name != m_linkFrom) addTransition(m_linkFrom, target->name); + m_linkFrom.clear(); + m_linkDrag = false; + } + m_dragNode.clear(); + m_panning = false; + } + if (clickedRight) { + m_linkFrom.clear(); + m_linkDrag = false; + if (hoveredNode) { + selectNode(*hoveredNode); + m_contextNode = hoveredNode->name; + ImGui::OpenPopup("##node_ctx"); + } else if (hoveredEdge >= 0 && !edges[static_cast(hoveredEdge)].entry) { + const Edge& edge = edges[static_cast(hoveredEdge)]; + selectEdge(edge); + m_contextTransitionFrom = edge.from; + m_contextTransition = edge.index; + ImGui::OpenPopup("##edge_ctx"); + } else { + m_contextPos = {mouse.x - origin.x - m_canvasScrollX - nodeSize.x * 0.5f, + mouse.y - origin.y - m_canvasScrollY - nodeSize.y * 0.5f}; + ImGui::OpenPopup("##canvas_ctx"); + } + } + if ((hovered || ImGui::IsWindowFocused()) && !io.WantTextInput) { + if (ImGui::IsKeyPressed(ImGuiKey_Escape)) { + m_linkFrom.clear(); + m_linkDrag = false; + m_status.clear(); + } + if (ImGui::IsKeyPressed(ImGuiKey_Delete)) { + if (m_selection == Selection::State && !m_selectedState.empty()) { + deleteState(m_selectedState); + } else if (m_selection == Selection::Transition) { + std::vector* list = transitionList(m_selectedTransitionFrom); + if (list && m_selectedTransition >= 0 && m_selectedTransition < static_cast(list->size())) { + list->erase(list->begin() + m_selectedTransition); + } + m_selection = Selection::None; } - if (ImGui::MenuItem("Delete State")) { - m_animator->states.remove(name); - m_nodePositions.erase(name.cStr()); - m_selectedState.clear(); - deletedNode = true; - ImGui::EndPopup(); - break; + } + } + + auto drawArrow = [&](ImVec2 a, ImVec2 b, ImU32 color, f32 thickness) { + dl->AddLine(a, b, color, thickness); + const f32 dx = b.x - a.x; + const f32 dy = b.y - a.y; + const f32 len = std::sqrt(dx * dx + dy * dy); + if (len < 1.0f) return; + const ImVec2 dir(dx / len, dy / len); + const ImVec2 mid((a.x + b.x) * 0.5f + dir.x * 5.0f, (a.y + b.y) * 0.5f + dir.y * 5.0f); + const ImVec2 back(mid.x - dir.x * 10.0f, mid.y - dir.y * 10.0f); + const ImVec2 perp(-dir.y * 5.5f, dir.x * 5.5f); + dl->AddTriangleFilled(mid, ImVec2(back.x + perp.x, back.y + perp.y), ImVec2(back.x - perp.x, back.y - perp.y), color); + }; + for (int i = 0; i < static_cast(edges.size()); ++i) { + const Edge& edge = edges[static_cast(i)]; + bool selected = false; + if (edge.entry) selected = m_selection == Selection::Entry; + else selected = m_selection == Selection::Transition && m_selectedTransitionFrom == edge.from && m_selectedTransition == edge.index; + ImU32 color = edge.entry ? IM_COL32(230, 160, 90, 230) + : edge.from == k_AnyName ? IM_COL32(110, 210, 205, 230) + : edge.to == k_ExitName ? IM_COL32(230, 130, 130, 230) + : k_ColArrow; + if (i == hoveredEdge) color = k_ColArrowHover; + if (selected) color = k_ColSelected; + + f32 activeFade = -1.0f; + ImU32 activeColor = k_ColProgress; + if (!edge.entry && m_preview && sm.fading() && edge.to == sm.currentState.cStr() && + (edge.from == sm.fadeFromState.cStr() || edge.from == k_AnyName)) { + activeFade = sm.fadeElapsed / std::max(sm.fadeDuration, 0.0001f); + } + if (!edge.entry && timelineLive && !link.timelineFadeFrom.empty() && edge.from == link.timelineFadeFrom && + edge.to == link.timelineState) { + activeFade = link.timelineFade; + activeColor = k_ColTimeline; + } + if (activeFade >= 0.0f) { + drawArrow(edge.a, edge.b, activeColor, 3.5f); + const f32 u = std::clamp(activeFade, 0.0f, 1.0f); + dl->AddCircleFilled(ImVec2(edge.a.x + (edge.b.x - edge.a.x) * u, edge.a.y + (edge.b.y - edge.a.y) * u), 5.0f, + IM_COL32(255, 255, 255, 255), 12); + } else { + drawArrow(edge.a, edge.b, color, selected ? 2.5f : 1.6f); + } + + if (edge.transition && edge.transition->blendTime > 0.0f) { + const bool linked = timelineLinked(edge.from, edge.to); + const f32 dx = edge.b.x - edge.a.x; + const f32 dy = edge.b.y - edge.a.y; + const f32 len = std::max(std::sqrt(dx * dx + dy * dy), 0.001f); + if (len > 90.0f) { + char text[16]; + std::snprintf(text, sizeof(text), "%.2fs", edge.transition->blendTime); + const ImVec2 textSize = ImGui::CalcTextSize(text); + const ImVec2 mid((edge.a.x + edge.b.x) * 0.5f - dy / len * 14.0f, (edge.a.y + edge.b.y) * 0.5f + dx / len * 14.0f); + const ImVec2 boxMin(mid.x - (textSize.x + 24.0f) * 0.5f, mid.y - 8.0f); + const ImVec2 boxMax(boxMin.x + textSize.x + 24.0f, mid.y + 8.0f); + dl->AddRectFilled(boxMin, boxMax, linked ? IM_COL32(30, 70, 44, 230) : IM_COL32(28, 30, 36, 220), 3.0f); + if (linked) dl->AddRect(boxMin, boxMax, k_ColTimeline, 3.0f); + drawCurveGlyph(dl, ImVec2(boxMin.x + 4.0f, boxMin.y + 3.0f), ImVec2(boxMin.x + 18.0f, boxMax.y - 3.0f), + edge.transition->blendCurve, linked ? k_ColTimeline : IM_COL32(255, 210, 60, 255), 1.2f); + dl->AddText(ImVec2(boxMin.x + 21.0f, boxMin.y + 1.0f), IM_COL32(220, 224, 232, 255), text); + if (hovered && mouse.x >= boxMin.x && mouse.x <= boxMax.x && mouse.y >= boxMin.y && mouse.y <= boxMax.y) { + ImGui::SetTooltip("%s > %s\nBlend %.2fs, %s%s", edge.from.c_str(), edge.to.c_str(), edge.transition->blendTime, + keyInterpName(edge.transition->blendCurve.mode), + linked ? "\nSynced with the Animation Timeline crossfade." : ""); + } } - ImGui::EndPopup(); } } - if (m_showAddTransition && !m_selectedState.empty()) { - ImGui::OpenPopup("##add_transition"); - m_showAddTransition = false; + for (const NodeInfo& node : nodes) { + ImU32 fill = k_ColStateNormal; + if (node.kind == Selection::Entry) fill = k_ColEntry; + else if (node.kind == Selection::AnyState) fill = k_ColAny; + else if (node.kind == Selection::Exit) fill = k_ColExit; + else if (sm.defaultState == FixedString<32>(node.name.c_str())) fill = k_ColStateDefault; + const bool selected = (node.kind == Selection::State && m_selection == Selection::State && m_selectedState == node.name) || + (node.kind != Selection::State && m_selection == node.kind); + const bool isHovered = hoveredNode == &node; + const bool onTimeline = timelineLive && node.kind == Selection::State && node.name == link.timelineState; + dl->AddRectFilled(node.min, node.max, fill, 5.0f); + if (isHovered && !selected) dl->AddRectFilled(node.min, node.max, IM_COL32(255, 255, 255, 18), 5.0f); + ImU32 border = selected ? k_ColSelected : (isHovered ? IM_COL32(170, 176, 188, 255) : k_ColBorder); + if (onTimeline && !selected) border = k_ColTimeline; + dl->AddRect(node.min, node.max, border, 5.0f, 0, selected || onTimeline ? 2.5f : 1.2f); + const ImVec2 textSize = ImGui::CalcTextSize(node.name.c_str()); + dl->PushClipRect(node.min, node.max, true); + dl->AddText(ImVec2(node.min.x + std::max(8.0f, (nodeSize.x - textSize.x) * 0.5f), node.min.y + (nodeSize.y - textSize.y) * 0.5f - 2.0f), + k_ColText, node.name.c_str()); + dl->PopClipRect(); + if (node.kind == Selection::State && + std::find(timelineStates.begin(), timelineStates.end(), node.name) != timelineStates.end()) { + dl->AddCircleFilled(ImVec2(node.max.x - 8.0f, node.min.y + 8.0f), 3.0f, k_ColTimeline, 10); + if (isHovered && !onPort) ImGui::SetTooltip("Used by a clip on the Animation Timeline."); + } + auto drawProgress = [&](f32 progress, ImU32 color) { + const f32 barY = node.max.y - 5.0f; + dl->AddRectFilled(ImVec2(node.min.x + 6.0f, barY), ImVec2(node.max.x - 6.0f, barY + 3.0f), IM_COL32(20, 24, 30, 255), 1.5f); + dl->AddRectFilled(ImVec2(node.min.x + 6.0f, barY), + ImVec2(node.min.x + 6.0f + (nodeSize.x - 12.0f) * std::clamp(progress, 0.0f, 1.0f), barY + 3.0f), + color, 1.5f); + }; + if (node.kind == Selection::State && m_preview) { + const FixedString<32> key(node.name.c_str()); + if (sm.currentState == key) { + const f32 duration = graphStateDuration(sm, key); + drawProgress(duration > 0.0f ? std::fmod(sm.timeInState, duration) / duration : 1.0f, k_ColProgress); + } else if (sm.fading() && sm.fadeFromState == key) { + const f32 duration = graphStateDuration(sm, key); + drawProgress(duration > 0.0f ? std::fmod(sm.fadeFromTime, duration) / duration : 1.0f, IM_COL32(80, 150, 255, 120)); + } + } else if (onTimeline) { + drawProgress(link.timelineStateProgress, k_ColTimeline); + } + if (isHovered && node.kind != Selection::Exit) { + const ImVec2 port = portOf(node); + dl->AddCircleFilled(port, onPort ? 6.0f : 4.5f, onPort ? k_ColSelected : IM_COL32(230, 232, 238, 255), 16); + if (onPort) { + ImGui::SetTooltip(node.kind == Selection::Entry ? "Drag to a state to make it the default." + : "Drag to another node to add a transition."); + } + } } - if (ImGui::BeginPopupModal("##add_transition", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::Text("From: %s -> To:", m_selectedState.c_str()); - ImGui::InputText("##tt", m_transitionTo, sizeof(m_transitionTo)); - if (ImGui::Button("Add") && m_animator && m_transitionTo[0] != '\0') { - AnimationState* fromState = m_animator->states.get(FixedString<32>(m_selectedState.c_str())); - if (fromState) { - AnimationTransition t; - t.toState = m_transitionTo; - fromState->transitions.push_back(t); + + if (!m_linkFrom.empty()) { + if (const NodeInfo* from = findNode(m_linkFrom)) { + const NodeInfo* target = nodeAt(mouse); + const ImVec2 end = (target && target != from) ? edgePoint(*target, centerOf(*from)) : mouse; + drawArrow(edgePoint(*from, end), end, k_ColSelected, 2.0f); + } + } + + bool openRename = false; + if (ImGui::BeginPopup("##node_ctx")) { + const std::string name = m_contextNode; + if (name == k_EntryName) { + if (ImGui::MenuItem("Set Default State...")) { + m_linkFrom = name; + m_linkDrag = false; + m_status = "Click the state Entry should start in. Esc cancels."; + } + } else if (name == k_AnyName) { + if (ImGui::MenuItem("Make Transition")) { + m_linkFrom = name; + m_linkDrag = false; + m_status = "Click the target state. Esc cancels."; } - memset(m_transitionTo, 0, sizeof(m_transitionTo)); + } else if (name == k_ExitName) { + ImGui::TextDisabled("Transitions into Exit return the layer to Entry."); + } else { + AnimationState* state = sm.states.get(FixedString<32>(name.c_str())); + if (ImGui::MenuItem("Make Transition")) { + m_linkFrom = name; + m_linkDrag = false; + m_status = "Click the target state or Exit. Esc cancels."; + } + if (ImGui::MenuItem("Set as Default State")) sm.defaultState = name.c_str(); + if (ImGui::MenuItem("Play State")) playState(name); + if (m_layer == -1 && ImGui::MenuItem("Show In Timeline")) { + AnimationEditorLink& mutableLink = AnimationEditorLink::get(); + mutableLink.selectedState = name; + ++mutableLink.selectionSerial; + } + const std::vector clips = clipNames(); + if (state && !clips.empty() && ImGui::BeginMenu("Motion")) { + for (const std::string& clip : clips) { + const bool current = state->motion.empty() ? clip == name : clip == state->motion.cStr(); + if (ImGui::MenuItem(clip.c_str(), nullptr, current)) state->motion = clip.c_str(); + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Rename")) openRename = true; + ImGui::Separator(); + if (ImGui::MenuItem("Delete State", "Del")) deleteState(name); + } + ImGui::EndPopup(); + } + if (openRename) { + m_renameTarget = m_contextNode; + std::snprintf(m_renameBuffer, sizeof(m_renameBuffer), "%s", m_contextNode.c_str()); + ImGui::OpenPopup("Rename State"); + } + if (ImGui::BeginPopupModal("Rename State", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { + if (ImGui::IsWindowAppearing()) ImGui::SetKeyboardFocusHere(); + const bool enter = ImGui::InputText("##rename", m_renameBuffer, sizeof(m_renameBuffer), ImGuiInputTextFlags_EnterReturnsTrue); + if (ImGui::Button("Rename") || enter) { + renameState(m_renameTarget, m_renameBuffer); ImGui::CloseCurrentPopup(); } ImGui::SameLine(); @@ -283,122 +1021,809 @@ void AnimatorControllerWindow::renderCanvas() { ImGui::EndPopup(); } + if (ImGui::BeginPopup("##edge_ctx")) { + std::vector* list = transitionList(m_contextTransitionFrom); + if (list && m_contextTransition >= 0 && m_contextTransition < static_cast(list->size())) { + AnimationTransition& transition = (*list)[static_cast(m_contextTransition)]; + ImGui::TextDisabled("%s > %s", m_contextTransitionFrom.c_str(), transition.toState.cStr()); + ImGui::MenuItem("Has Exit Time", nullptr, &transition.hasExitTime); + if (ImGui::BeginMenu("Blend Time")) { + for (f32 value : {0.0f, 0.1f, 0.25f, 0.5f, 1.0f}) { + char label[16]; + std::snprintf(label, sizeof(label), "%.2fs", value); + if (ImGui::MenuItem(label, nullptr, std::fabs(transition.blendTime - value) < 0.001f)) { + transition.blendTime = value; + transitionEdited(m_contextTransitionFrom, transition); + } + } + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Blend Curve")) { + for (KeyInterp mode : kCurveModes) { + if (mode == KeyInterp::Custom) continue; + if (ImGui::MenuItem(keyInterpName(mode), nullptr, transition.blendCurve.mode == mode)) { + applyKeyInterp(transition.blendCurve, mode); + transitionEdited(m_contextTransitionFrom, transition); + } + } + ImGui::EndMenu(); + } + ImGui::Separator(); + if (ImGui::MenuItem("Delete Transition", "Del")) { + list->erase(list->begin() + m_contextTransition); + m_selection = Selection::None; + } + } + ImGui::EndPopup(); + } + + if (ImGui::BeginPopup("##canvas_ctx")) { + if (ImGui::MenuItem("Create Empty State")) { + createState(uniqueStateName("New State").c_str(), "", m_contextPos.x, m_contextPos.y); + } + const std::vector clips = clipNames(); + if (ImGui::BeginMenu("Create State From Clip", !clips.empty())) { + for (const std::string& clip : clips) { + if (ImGui::MenuItem(clip.c_str())) { + createState(uniqueStateName(clip.c_str()).c_str(), clip.c_str(), m_contextPos.x, m_contextPos.y); + } + } + ImGui::EndMenu(); + } + ImGui::Separator(); + if (ImGui::MenuItem("Frame Graph")) { + m_canvasScrollX = 0.0f; + m_canvasScrollY = 0.0f; + } + ImGui::EndPopup(); + } + + if (sm.states.empty()) { + dl->AddText(ImVec2(origin.x + 220.0f, origin.y + 60.0f), IM_COL32(150, 154, 166, 220), + "Right-click to create a state."); + } dl->PopClipRect(); } -void AnimatorControllerWindow::drawTransitionArrow(ImVec2 from, ImVec2 to, bool isActive) { +void AnimatorControllerWindow::renderInspector() { + if (editingGroup()) { + ImGui::TextDisabled("Group properties are in the Layers tab."); + return; + } + AnimatorStateMachine& sm = graph(); + switch (m_selection) { + case Selection::State: { + AnimationState* state = sm.states.get(FixedString<32>(m_selectedState.c_str())); + if (state) { + renderStateInspector(*state); + return; + } + break; + } + case Selection::Transition: + renderTransitionInspector(); + return; + case Selection::Entry: { + ImGui::TextColored(ImVec4(0.45f, 0.85f, 0.55f, 1.0f), "Entry"); + ImGui::Separator(); + ImGui::TextWrapped("The graph starts in the default state (orange). Exit comes back here."); + if (ImGui::BeginCombo("Default", sm.defaultState.empty() ? "(none)" : sm.defaultState.cStr())) { + for (auto& pair : sm.states) { + if (ImGui::Selectable(pair.key.cStr(), pair.key == sm.defaultState)) sm.defaultState = pair.key; + } + ImGui::EndCombo(); + } + return; + } + case Selection::AnyState: { + ImGui::TextColored(ImVec4(0.45f, 0.85f, 0.85f, 1.0f), "Any State"); + ImGui::Separator(); + ImGui::TextWrapped("Its transitions are checked first, from whatever state is playing. " + "They need a condition, or exit time, to fire."); + ImGui::SeparatorText("Transitions"); + int removeIndex = -1; + for (int i = 0; i < static_cast(sm.anyStateTransitions.size()); ++i) { + const AnimationTransition& transition = sm.anyStateTransitions[static_cast(i)]; + ImGui::PushID(i); + char label[96]; + std::snprintf(label, sizeof(label), "> %s%s", transition.toState.cStr(), + transition.conditions.empty() && !transition.hasExitTime ? " (never)" : ""); + if (ImGui::Selectable(label, false, 0, ImVec2(ImGui::GetContentRegionAvail().x - 24.0f, 0.0f))) { + m_selection = Selection::Transition; + m_selectedTransitionFrom = k_AnyName; + m_selectedTransition = i; + } + ImGui::SameLine(); + if (ImGui::SmallButton("x")) removeIndex = i; + ImGui::PopID(); + } + if (removeIndex >= 0) sm.anyStateTransitions.erase(sm.anyStateTransitions.begin() + removeIndex); + ImGui::SetNextItemWidth(-1.0f); + if (ImGui::BeginCombo("##add_any", "Add transition to...")) { + std::string target; + for (auto& pair : sm.states) { + if (ImGui::Selectable(pair.key.cStr())) target = pair.key.cStr(); + } + ImGui::EndCombo(); + if (!target.empty()) addTransition(k_AnyName, target); + } + return; + } + case Selection::Exit: + ImGui::TextColored(ImVec4(0.95f, 0.5f, 0.5f, 1.0f), "Exit"); + ImGui::Separator(); + ImGui::TextWrapped("A transition into Exit leaves the current state and goes back through Entry " + "to the default state, with the transition's blend."); + return; + case Selection::None: + break; + } + ImGui::TextDisabled("Select a state or a transition."); + ImGui::Spacing(); + ImGui::Text("States: %zu", static_cast(sm.states.size())); + ImGui::Text("Default: %s", sm.defaultState.empty() ? "(none)" : sm.defaultState.cStr()); + ImGui::Text("Any State transitions: %zu", sm.anyStateTransitions.size()); +} + +void AnimatorControllerWindow::renderStateInspector(AnimationState& state) { + AnimatorStateMachine& sm = graph(); + if (m_renameTarget != m_selectedState) { + m_renameTarget = m_selectedState; + std::snprintf(m_renameBuffer, sizeof(m_renameBuffer), "%s", m_selectedState.c_str()); + } + ImGui::SetNextItemWidth(-1.0f); + if (ImGui::InputText("##state_name", m_renameBuffer, sizeof(m_renameBuffer), ImGuiInputTextFlags_EnterReturnsTrue)) { + const std::string from = m_selectedState; + renameState(from, m_renameBuffer); + return; + } + ImGui::TextDisabled("Enter renames the state."); + ImGui::Separator(); + + const std::vector clips = clipNames(); + const char* motionPreview = state.motion.empty() ? state.name.cStr() : state.motion.cStr(); + if (ImGui::BeginCombo("Motion", motionPreview)) { + for (const std::string& clip : clips) { + if (ImGui::Selectable(clip.c_str(), clip == motionPreview)) state.motion = clip.c_str(); + } + if (clips.empty()) ImGui::TextDisabled("No imported clips."); + ImGui::EndCombo(); + } + ImGui::DragFloat("Speed", &state.speed, 0.01f, 0.0f, 10.0f); + const f32 duration = stateDuration(state); + if (duration > 0.0f) ImGui::TextDisabled("Length %.2fs", duration); + if (sm.defaultState == state.name) { + ImGui::TextColored(ImVec4(0.95f, 0.6f, 0.25f, 1.0f), "Default state"); + } else if (ImGui::Button("Set as Default State")) { + sm.defaultState = state.name; + } + ImGui::SameLine(); + if (ImGui::Button("Play")) playState(m_selectedState); + if (m_layer == -1) { + ImGui::SameLine(); + if (ImGui::Button("Timeline")) { + AnimationEditorLink& link = AnimationEditorLink::get(); + link.selectedState = m_selectedState; + ++link.selectionSerial; + } + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Select this state's clip in the Animation Timeline."); + } + + ImGui::Spacing(); + ImGui::SeparatorText("Transitions"); + int removeIndex = -1; + for (int i = 0; i < static_cast(state.transitions.size()); ++i) { + const AnimationTransition& transition = state.transitions[static_cast(i)]; + ImGui::PushID(i); + char label[96]; + std::snprintf(label, sizeof(label), "> %s %.2fs%s", transition.toState.cStr(), transition.blendTime, + transition.conditions.empty() ? (transition.hasExitTime ? " exit time" : " (never)") : ""); + if (ImGui::Selectable(label, false, 0, ImVec2(ImGui::GetContentRegionAvail().x - 24.0f, 0.0f))) { + m_selection = Selection::Transition; + m_selectedTransitionFrom = m_selectedState; + m_selectedTransition = i; + } + ImGui::SameLine(); + if (ImGui::SmallButton("x")) removeIndex = i; + ImGui::PopID(); + } + if (removeIndex >= 0) state.transitions.erase(state.transitions.begin() + removeIndex); + ImGui::SetNextItemWidth(-1.0f); + if (ImGui::BeginCombo("##add_transition", "Add transition to...")) { + const std::string from = m_selectedState; + std::string target; + for (auto& pair : sm.states) { + if (from == pair.key.cStr()) continue; + if (ImGui::Selectable(pair.key.cStr())) target = pair.key.cStr(); + } + if (ImGui::Selectable(k_ExitName)) target = k_ExitName; + ImGui::EndCombo(); + if (!target.empty()) addTransition(from, target); + } +} + +void AnimatorControllerWindow::renderTransitionTimeline(AnimationTransition& transition, const std::string& from) { + AnimatorStateMachine& sm = graph(); + const ImGuiIO& io = ImGui::GetIO(); + const std::string to = transition.toState.cStr(); + f32 sourceLength = from == k_AnyName ? 0.0f : graphStateDuration(sm, FixedString<32>(from.c_str())); + const FixedString<32> targetKey = to == k_ExitName ? sm.defaultState : transition.toState; + f32 targetLength = graphStateDuration(sm, targetKey); + if (sourceLength <= 0.0f) sourceLength = 1.0f; + if (targetLength <= 0.0f) targetLength = 1.0f; + const f32 exitStart = transition.hasExitTime ? std::max(transition.exitTime, 0.0f) * sourceLength : sourceLength * 0.5f; + const f32 blend = std::max(transition.blendTime, 0.0f); + const f32 targetVisible = targetLength * (1.0f - std::clamp(transition.offset, 0.0f, 1.0f)); + const f32 total = std::max({sourceLength, exitStart + blend, exitStart + targetVisible}) * 1.08f; + + const f32 width = ImGui::GetContentRegionAvail().x; + const ImVec2 size(width, 70.0f); + const ImVec2 pos = ImGui::GetCursorScreenPos(); ImDrawList* dl = ImGui::GetWindowDrawList(); - ImU32 col = isActive ? k_ColArrowActive : k_ColArrow; + const f32 pad = 6.0f; + const f32 scale = (size.x - pad * 2.0f) / total; + auto timeToX = [&](f32 t) { return pos.x + pad + t * scale; }; - dl->AddLine(from, to, col, 1.5f); + ImGui::InvisibleButton("##transition_bars", size); + const bool active = ImGui::IsItemActive(); + const bool hovered = ImGui::IsItemHovered(); + dl->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(26, 28, 34, 255), 4.0f); - ImVec2 dir{to.x - from.x, to.y - from.y}; - float len = sqrtf(dir.x * dir.x + dir.y * dir.y); - if (len < 1.0f) return; - dir.x /= len; dir.y /= len; + const f32 sourceTop = pos.y + 8.0f; + const f32 sourceBottom = pos.y + 28.0f; + const f32 targetTop = pos.y + 36.0f; + const f32 targetBottom = pos.y + 56.0f; + dl->AddRectFilled(ImVec2(timeToX(0.0f), sourceTop), ImVec2(timeToX(sourceLength), sourceBottom), IM_COL32(70, 110, 170, 255), 3.0f); + dl->AddText(ImVec2(timeToX(0.0f) + 4.0f, sourceTop + 3.0f), k_ColText, from.c_str()); + const f32 targetStartX = timeToX(exitStart); + const f32 targetEndX = timeToX(exitStart + targetVisible); + dl->AddRectFilled(ImVec2(targetStartX, targetTop), ImVec2(targetEndX, targetBottom), IM_COL32(70, 140, 100, 255), 3.0f); + dl->PushClipRect(ImVec2(targetStartX, targetTop), ImVec2(targetEndX, targetBottom), true); + dl->AddText(ImVec2(targetStartX + 4.0f, targetTop + 3.0f), k_ColText, to.c_str()); + dl->PopClipRect(); + const f32 blendEndX = timeToX(exitStart + blend); + if (blend > 0.0f) { + dl->AddRectFilled(ImVec2(targetStartX, sourceTop), ImVec2(blendEndX, targetBottom), IM_COL32(255, 255, 255, 30)); + drawCurveGlyph(dl, ImVec2(targetStartX, targetBottom), ImVec2(blendEndX, sourceTop), transition.blendCurve, + IM_COL32(255, 210, 60, 255), 1.6f); + } + dl->AddLine(ImVec2(targetStartX, sourceTop - 4.0f), ImVec2(targetStartX, targetBottom + 4.0f), IM_COL32(255, 255, 255, 160), 1.0f); + dl->AddLine(ImVec2(blendEndX, sourceTop - 4.0f), ImVec2(blendEndX, targetBottom + 4.0f), IM_COL32(255, 210, 60, 220), 1.5f); + char caption[96]; + std::snprintf(caption, sizeof(caption), transition.hasExitTime ? "exit %.2fs blend %.2fs" : "on condition blend %.2fs", + transition.hasExitTime ? exitStart : blend, blend); + dl->AddText(ImVec2(pos.x + pad, targetBottom + 1.0f), IM_COL32(150, 156, 170, 255), caption); - ImVec2 mid{(from.x + to.x) * 0.5f, (from.y + to.y) * 0.5f}; - float aw = 7.0f; - float ah = 5.0f; - ImVec2 perp{-dir.y * ah, dir.x * ah}; - ImVec2 tip{mid.x + dir.x * aw, mid.y + dir.y * aw}; - ImVec2 bl{mid.x - dir.x * aw + perp.x, mid.y - dir.y * aw + perp.y}; - ImVec2 br{mid.x - dir.x * aw - perp.x, mid.y - dir.y * aw - perp.y}; - dl->AddTriangleFilled(tip, bl, br, col); + if (ImGui::IsItemClicked()) { + if (std::fabs(io.MousePos.x - blendEndX) <= 6.0f) m_barDrag = 2; + else if (transition.hasExitTime && io.MousePos.y >= targetTop && io.MousePos.x >= targetStartX && io.MousePos.x <= targetEndX) m_barDrag = 1; + else m_barDrag = 0; + } + if (!active) m_barDrag = 0; + if (hovered && m_barDrag == 0) { + if (std::fabs(io.MousePos.x - blendEndX) <= 6.0f) { + ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeEW); + ImGui::SetTooltip("Drag to change the blend time."); + } else if (transition.hasExitTime && io.MousePos.y >= targetTop && io.MousePos.x >= targetStartX && io.MousePos.x <= targetEndX) { + ImGui::SetTooltip("Drag to change the exit time."); + } + } + if (active && m_barDrag != 0 && io.MouseDelta.x != 0.0f) { + const f32 delta = io.MouseDelta.x / scale; + if (m_barDrag == 1) transition.exitTime = std::clamp(transition.exitTime + delta / sourceLength, 0.0f, 10.0f); + else transition.blendTime = std::clamp(transition.blendTime + delta, 0.0f, 5.0f); + transitionEdited(from, transition); + } } -void AnimatorControllerWindow::renderInspector() { - if (!m_animator || m_selectedState.empty()) { - ImGui::TextDisabled("Select a state to inspect."); +void AnimatorControllerWindow::renderTransitionInspector() { + AnimationTransition* selected = selectedTransition(); + if (!selected) { + m_selection = Selection::None; + ImGui::TextDisabled("Select a state or a transition."); return; } + AnimationTransition& transition = *selected; + const std::string from = m_selectedTransitionFrom; + const std::string to = transition.toState.cStr(); + ImGui::TextColored(ImVec4(0.55f, 0.75f, 1.0f, 1.0f), "%s > %s", from.c_str(), to.c_str()); + if (timelineLinked(from, to)) { + ImGui::TextColored(ImVec4(0.45f, 0.86f, 0.55f, 1.0f), "Synced with the timeline crossfade"); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Blend time and curve follow the overlap of these clips on the Animation Timeline, both ways."); + } + } + if (from == k_AnyName) ImGui::TextDisabled("Fires from any state when it is ready."); + if (to == k_ExitName) ImGui::TextDisabled("Goes back to Entry, then the default state."); + ImGui::Separator(); - AnimationState* state = m_animator->states.get(FixedString<32>(m_selectedState.c_str())); - if (!state) return; + bool changed = false; + const f32 width = ImGui::GetContentRegionAvail().x; + ImGui::PushItemWidth(width - 100.0f); + changed |= ImGui::Checkbox("Has Exit Time", &transition.hasExitTime); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Waits for the exit time. With no conditions, the transition fires right at it."); + } + ImGui::BeginDisabled(!transition.hasExitTime); + changed |= ImGui::DragFloat("Exit Time", &transition.exitTime, 0.01f, 0.0f, 10.0f, "%.2f"); + ImGui::EndDisabled(); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { + ImGui::SetTooltip("Normalized time of the source state. 1 is the end of its clip."); + } + changed |= ImGui::DragFloat("Blend Time", &transition.blendTime, 0.01f, 0.0f, 5.0f, "%.2fs"); + changed |= ImGui::SliderFloat("Offset", &transition.offset, 0.0f, 1.0f, "%.2f"); + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Normalized time the target state starts at."); + ImGui::PopItemWidth(); + transition.blendTime = std::max(transition.blendTime, 0.0f); - ImGui::TextColored({0.4f,0.8f,1.0f,1.0f}, "%s", m_selectedState.c_str()); - ImGui::Separator(); + ImGui::Spacing(); + renderTransitionTimeline(transition, from); + ImGui::SeparatorText("Blend Curve"); + changed |= editKeyCurve("blend_curve", transition.blendCurve, width, 90.0f); + if (changed) transitionEdited(from, transition); - ImGui::Text("Speed:"); ImGui::SameLine(); - ImGui::SetNextItemWidth(-1); - ImGui::DragFloat("##spd", &state->speed, 0.01f, 0.0f, 10.0f); + ImGui::Spacing(); + ImGui::SeparatorText("Conditions"); + if (transition.conditions.empty()) { + ImGui::TextDisabled(transition.hasExitTime ? "None. Fires at exit time." : "None. This transition never fires."); + } + int removeIndex = -1; + for (int i = 0; i < static_cast(transition.conditions.size()); ++i) { + TransitionCondition& condition = transition.conditions[static_cast(i)]; + ImGui::PushID(i); + ImGui::SetNextItemWidth(100.0f); + if (ImGui::BeginCombo("##param", condition.parameterName.empty() ? "(parameter)" : condition.parameterName.cStr())) { + for (const AnimatorParameter& parameter : m_animator->parameters) { + if (ImGui::Selectable(parameter.name.cStr(), parameter.name == condition.parameterName)) { + condition.parameterName = parameter.name; + condition.op = parameter.type == ParameterType::Float ? ConditionOperator::Greater : ConditionOperator::Equals; + if (parameter.type == ParameterType::Bool) condition.boolValue = true; + else if (parameter.type == ParameterType::Float) condition.floatValue = 0.0f; + else condition.intValue = 0; + } + } + ImGui::EndCombo(); + } + ImGui::SameLine(); + const AnimatorParameter* parameter = m_animator->findParameter(condition.parameterName); + if (!parameter) { + ImGui::TextDisabled("missing"); + } else if (parameter->type == ParameterType::Trigger) { + ImGui::TextDisabled("is fired"); + } else if (parameter->type == ParameterType::Bool) { + ImGui::SetNextItemWidth(70.0f); + int value = condition.boolValue ? 0 : 1; + const char* items[] = {"true", "false"}; + if (ImGui::Combo("##bool", &value, items, 2)) { + condition.op = ConditionOperator::Equals; + condition.boolValue = value == 0; + } + } else { + const bool isFloat = parameter->type == ParameterType::Float; + const char* ops[] = {"Greater", "Less", "Equals", "NotEqual"}; + const ConditionOperator opValues[] = {ConditionOperator::Greater, ConditionOperator::Less, + ConditionOperator::Equals, ConditionOperator::NotEquals}; + const int opCount = isFloat ? 2 : 4; + int current = 0; + for (int o = 0; o < opCount; ++o) { + if (condition.op == opValues[o]) current = o; + } + ImGui::SetNextItemWidth(70.0f); + if (ImGui::Combo("##op", ¤t, ops, opCount)) condition.op = opValues[current]; + ImGui::SameLine(); + ImGui::SetNextItemWidth(50.0f); + if (isFloat) { + ImGui::DragFloat("##value", &condition.floatValue, 0.01f); + } else { + int value = condition.intValue; + if (ImGui::DragInt("##value", &value)) condition.intValue = value; + } + } + ImGui::SameLine(); + if (ImGui::SmallButton("x")) removeIndex = i; + ImGui::PopID(); + } + if (removeIndex >= 0) transition.conditions.erase(transition.conditions.begin() + removeIndex); - if (state->clip) { - ImGui::Text("Clip: %s", state->clip->name.cStr()); - ImGui::Text("FPS: %u Frames: %zu", state->clip->fps, state->clip->frames.size()); - } else { - ImGui::TextDisabled("No clip assigned."); + ImGui::BeginDisabled(m_animator->parameters.empty()); + if (ImGui::Button("+ Condition")) { + const AnimatorParameter& parameter = m_animator->parameters.front(); + TransitionCondition condition; + condition.parameterName = parameter.name; + condition.op = parameter.type == ParameterType::Float ? ConditionOperator::Greater : ConditionOperator::Equals; + if (parameter.type == ParameterType::Bool) condition.boolValue = true; + else if (parameter.type == ParameterType::Float) condition.floatValue = 0.0f; + else condition.intValue = 0; + transition.conditions.push_back(condition); } + ImGui::EndDisabled(); + if (m_animator->parameters.empty()) ImGui::TextDisabled("Add a parameter in the Parameters tab first."); ImGui::Spacing(); - ImGui::Text("Transitions (%zu):", state->transitions.size()); - for (usize i = 0; i < state->transitions.size(); ++i) { - const auto& t = state->transitions[i]; - ImGui::BulletText("-> %s blend=%.2f %s", - t.toState.cStr(), t.blendTime, - t.hasExitTime ? "[exit]" : ""); - if (!t.conditions.empty()) { - for (const auto& c : t.conditions) { - const char* opStr = - c.op == Animation::ConditionOperator::Equals ? "==" : - c.op == Animation::ConditionOperator::NotEquals ? "!=" : - c.op == Animation::ConditionOperator::Greater ? ">" : - c.op == Animation::ConditionOperator::Less ? "<" : - c.op == Animation::ConditionOperator::GreaterOrEqual ? ">=" : "<="; - ImGui::Indent(); - ImGui::TextDisabled("%s %s", c.parameterName.cStr(), opStr); - ImGui::Unindent(); + if (ImGui::Button("Delete Transition")) { + if (std::vector* list = transitionList(from)) { + list->erase(list->begin() + m_selectedTransition); + } + m_selection = Selection::None; + } +} + +bool AnimatorControllerWindow::layerInside(int index, const std::string& group) const { + const std::vector& layers = m_animator->layers; + if (index < 0 || index >= static_cast(layers.size()) || group.empty()) return false; + std::string parent = layers[static_cast(index)].parentGroup.cStr(); + for (int depth = 0; depth < 16 && !parent.empty(); ++depth) { + if (parent == group) return true; + std::string next; + for (const AnimatorLayer& layer : layers) { + if (layer.isGroup && parent == layer.name.cStr()) next = layer.parentGroup.cStr(); + } + parent = next; + } + return false; +} + +void AnimatorControllerWindow::selectLayer(int index) { + m_layer = index; + m_selection = Selection::None; + m_selectedState.clear(); + m_selectedTransition = -1; + m_linkFrom.clear(); + m_linkDrag = false; + m_dragNode.clear(); + m_status.clear(); + if (!editingGroup()) layoutMissingNodes(); +} + +void AnimatorControllerWindow::addLayer(bool group) { + std::vector& layers = m_animator->layers; + AnimatorLayer layer; + layer.name = uniqueLayerName(group ? "Group" : "Layer").c_str(); + layer.isGroup = group; + if (m_layer >= 0 && m_layer < static_cast(layers.size())) { + const AnimatorLayer& selected = layers[static_cast(m_layer)]; + layer.parentGroup = selected.isGroup ? selected.name : selected.parentGroup; + } + layers.push_back(layer); + selectLayer(static_cast(layers.size()) - 1); +} + +void AnimatorControllerWindow::deleteLayer(int index) { + std::vector& layers = m_animator->layers; + if (index < 0 || index >= static_cast(layers.size())) return; + const AnimatorLayer removed = layers[static_cast(index)]; + if (removed.isGroup) { + for (AnimatorLayer& layer : layers) { + if (layer.parentGroup == removed.name) layer.parentGroup = removed.parentGroup; + } + } + layers.erase(layers.begin() + index); + selectLayer(-1); +} + +void AnimatorControllerWindow::moveLayer(int index, int before, const std::string& parent) { + std::vector& layers = m_animator->layers; + if (index < 0 || index >= static_cast(layers.size())) return; + const std::string movedName = layers[static_cast(index)].name.cStr(); + if (layers[static_cast(index)].isGroup && parent == movedName) return; + for (size_t i = 0; i < layers.size(); ++i) { + if (layers[i].isGroup && parent == layers[i].name.cStr() && layerInside(static_cast(i), movedName)) return; + } + const std::string selectedName = m_layer >= 0 && m_layer < static_cast(layers.size()) + ? std::string(layers[static_cast(m_layer)].name.cStr()) + : std::string(); + const std::string beforeName = before >= 0 && before < static_cast(layers.size()) + ? std::string(layers[static_cast(before)].name.cStr()) + : std::string(); + + std::vector block; + std::vector rest; + for (size_t i = 0; i < layers.size(); ++i) { + const bool inBlock = static_cast(i) == index || + (layers[static_cast(index)].isGroup && layerInside(static_cast(i), movedName)); + (inBlock ? block : rest).push_back(layers[i]); + } + block.front().parentGroup = parent.c_str(); + if (!beforeName.empty() && beforeName == movedName) return; + + size_t insertAt = rest.size(); + if (!beforeName.empty()) { + for (size_t i = 0; i < rest.size(); ++i) { + if (beforeName == rest[i].name.cStr()) insertAt = i; + } + } else if (!parent.empty()) { + for (size_t i = 0; i < rest.size(); ++i) { + if (rest[i].isGroup && parent == rest[i].name.cStr()) insertAt = i + 1; + } + bool advanced = true; + while (advanced && insertAt < rest.size()) { + advanced = false; + std::string ancestor = rest[insertAt].parentGroup.cStr(); + for (int depth = 0; depth < 16 && !ancestor.empty(); ++depth) { + if (ancestor == parent) { + ++insertAt; + advanced = true; + break; + } + std::string next; + for (const AnimatorLayer& layer : rest) { + if (layer.isGroup && ancestor == layer.name.cStr()) next = layer.parentGroup.cStr(); + } + ancestor = next; + } + } + } + rest.insert(rest.begin() + static_cast(insertAt), block.begin(), block.end()); + layers = std::move(rest); + m_layer = -1; + for (size_t i = 0; i < layers.size(); ++i) { + if (!selectedName.empty() && selectedName == layers[i].name.cStr()) m_layer = static_cast(i); + } +} + +void AnimatorControllerWindow::renderLayerRow(int index, int depth) { + std::vector& layers = m_animator->layers; + AnimatorLayer& layer = layers[static_cast(index)]; + ImGui::PushID(index); + ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_OpenOnArrow; + if (!layer.isGroup) flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; + if (m_layer == index) flags |= ImGuiTreeNodeFlags_Selected; + if (layer.isGroup) ImGui::SetNextItemOpen(layer.expanded); + char label[96]; + std::snprintf(label, sizeof(label), "%s%s%s", layer.isGroup ? "[G] " : "", layer.name.cStr(), layer.muted ? " (muted)" : ""); + const f32 rowRight = ImGui::GetCursorPosX() + ImGui::GetContentRegionAvail().x; + if (layer.muted) ImGui::PushStyleColor(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_TextDisabled)); + const bool open = ImGui::TreeNodeEx("##layer", flags, "%s", label); + if (layer.muted) ImGui::PopStyleColor(); + if (layer.isGroup) layer.expanded = open; + if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen()) selectLayer(index); + if (ImGui::BeginDragDropSource()) { + ImGui::SetDragDropPayload(k_LayerPayload, &index, sizeof(int)); + ImGui::Text("%s", layer.name.cStr()); + ImGui::EndDragDropSource(); + } + if (ImGui::BeginDragDropTarget()) { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(k_LayerPayload)) { + const int source = *static_cast(payload->Data); + if (source != index && !layerInside(index, layers[static_cast(source)].name.cStr())) { + m_moveLayer = source; + if (layer.isGroup) { + m_moveBefore = -1; + m_moveParent = layer.name.cStr(); + } else { + m_moveBefore = index; + m_moveParent = layer.parentGroup.cStr(); + } + } + } + ImGui::EndDragDropTarget(); + } + if (ImGui::BeginPopupContextItem("##layer_ctx")) { + if (ImGui::MenuItem("Mute", nullptr, layer.muted)) layer.muted = !layer.muted; + if (!layer.isGroup && ImGui::MenuItem("Duplicate")) { + AnimatorLayer copy = layer; + copy.name = uniqueLayerName(layer.name.cStr()).c_str(); + layers.insert(layers.begin() + index + 1, copy); + ImGui::EndPopup(); + ImGui::PopID(); + return; + } + if (!layer.parentGroup.empty() && ImGui::MenuItem("Move Out of Group")) { + m_moveLayer = index; + m_moveBefore = -1; + std::string grandparent; + for (const AnimatorLayer& other : layers) { + if (other.isGroup && other.name == layer.parentGroup) grandparent = other.parentGroup.cStr(); } + m_moveParent = grandparent; } + ImGui::Separator(); + if (ImGui::MenuItem(layer.isGroup ? "Delete Group" : "Delete Layer")) m_contextLayer = index; + ImGui::EndPopup(); + } + ImGui::SameLine(rowRight - 34.0f); + ImGui::TextDisabled("%.2f", layer.weight); + if (layer.isGroup && open) { + const std::string groupName = layer.name.cStr(); + if (depth < 8) { + for (int i = 0; i < static_cast(layers.size()); ++i) { + if (i != index && groupName == layers[static_cast(i)].parentGroup.cStr()) renderLayerRow(i, depth + 1); + } + } + ImGui::TreePop(); } + ImGui::PopID(); +} + +void AnimatorControllerWindow::renderLayersPanel() { + std::vector& layers = m_animator->layers; + if (ImGui::SmallButton("+ Layer")) addLayer(false); + ImGui::SameLine(); + if (ImGui::SmallButton("+ Group")) addLayer(true); + ImGui::SameLine(); + ImGui::TextDisabled("drag to reorder"); + + if (ImGui::Selectable("Base Layer", m_layer == -1)) selectLayer(-1); + if (ImGui::BeginDragDropTarget()) { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(k_LayerPayload)) { + m_moveLayer = *static_cast(payload->Data); + m_moveBefore = layers.empty() ? -1 : 0; + m_moveParent.clear(); + } + ImGui::EndDragDropTarget(); + } + auto groupExists = [&](const FixedString<32>& name) { + for (const AnimatorLayer& layer : layers) { + if (layer.isGroup && layer.name == name) return true; + } + return false; + }; + m_contextLayer = -2; + for (int i = 0; i < static_cast(layers.size()); ++i) { + const AnimatorLayer& layer = layers[static_cast(i)]; + if (layer.parentGroup.empty() || !groupExists(layer.parentGroup)) renderLayerRow(i, 0); + if (static_cast(layers.size()) <= i) break; + } + ImGui::InvisibleButton("##layer_drop_end", ImVec2(std::max(ImGui::GetContentRegionAvail().x, 1.0f), 14.0f)); + if (ImGui::BeginDragDropTarget()) { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(k_LayerPayload)) { + m_moveLayer = *static_cast(payload->Data); + m_moveBefore = -1; + m_moveParent.clear(); + } + ImGui::EndDragDropTarget(); + } + if (m_moveLayer >= 0) { + moveLayer(m_moveLayer, m_moveBefore, m_moveParent); + m_moveLayer = -1; + } + if (m_contextLayer >= 0) { + deleteLayer(m_contextLayer); + m_contextLayer = -2; + } + if (layers.empty()) ImGui::TextDisabled("Layers play on top of the base layer,\nfor example an upper-body wave."); + ImGui::Separator(); + renderLayerProperties(); +} + +void AnimatorControllerWindow::renderLayerProperties() { + std::vector& layers = m_animator->layers; + if (m_layer < 0 || m_layer >= static_cast(layers.size())) { + ImGui::TextUnformatted("Base Layer"); + ImGui::TextDisabled("Always full weight. Layers above\nblend over it in list order."); + return; + } + AnimatorLayer& layer = layers[static_cast(m_layer)]; + if (m_layerNameTarget != m_layer) { + m_layerNameTarget = m_layer; + std::snprintf(m_layerName, sizeof(m_layerName), "%s", layer.name.cStr()); + } + ImGui::SetNextItemWidth(-1.0f); + ImGui::InputText("##layer_name", m_layerName, sizeof(m_layerName)); + if (ImGui::IsItemDeactivatedAfterEdit() && m_layerName[0] != '\0' && std::string(m_layerName) != layer.name.cStr()) { + const std::string wanted = uniqueLayerName(m_layerName); + const FixedString<32> oldName = layer.name; + layer.name = wanted.c_str(); + if (layer.isGroup) { + for (AnimatorLayer& other : layers) { + if (other.parentGroup == oldName) other.parentGroup = layer.name; + } + } + std::snprintf(m_layerName, sizeof(m_layerName), "%s", wanted.c_str()); + } + ImGui::PushItemWidth(-90.0f); + ImGui::Checkbox("Mute", &layer.muted); + ImGui::SliderFloat("Weight", &layer.weight, 0.0f, 1.0f, "%.2f"); + ImGui::TextDisabled("Effective weight %.2f", effectiveLayerWeight(*m_animator, layer)); + if (!layer.isGroup) { + int blend = layer.blend == LayerBlendMode::Additive ? 1 : 0; + const char* modes[] = {"Override", "Additive"}; + if (ImGui::Combo("Blending", &blend, modes, 2)) layer.blend = blend == 1 ? LayerBlendMode::Additive : LayerBlendMode::Override; + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Override replaces the pose of the masked body parts.\nAdditive adds this layer's motion on top."); + } + ImGui::PopItemWidth(); + ImGui::SeparatorText("Body Mask"); + static const char* parts[] = {"Root", "Body", "Head", "Left Arm", "Right Arm", "Left Leg", "Right Leg"}; + for (int bit = 0; bit < 7; ++bit) { + unsigned int mask = layer.mask; + if (ImGui::CheckboxFlags(parts[bit], &mask, 1u << bit)) layer.mask = mask; + if (bit % 2 == 0 && bit < 6) ImGui::SameLine(110.0f); + } + if (ImGui::SmallButton("All")) layer.mask = static_cast(BodyMask::All); + ImGui::SameLine(); + if (ImGui::SmallButton("None")) layer.mask = 0u; + ImGui::SameLine(); + if (ImGui::SmallButton("Upper Body")) { + layer.mask = static_cast(BodyMask::Body) | static_cast(BodyMask::Head) | + static_cast(BodyMask::LeftArm) | static_cast(BodyMask::RightArm); + } + ImGui::Spacing(); + ImGui::TextDisabled("%zu states", static_cast(layer.states.size())); + if (ImGui::SmallButton("Copy States From Base")) { + layer.states = m_animator->states; + layer.defaultState = m_animator->defaultState; + layer.anyStateTransitions = m_animator->anyStateTransitions; + resetGraphPlayback(layer); + } + if (ImGui::IsItemHovered()) ImGui::SetTooltip("Replaces this layer's graph with a copy of the base layer's."); + } else { + ImGui::PopItemWidth(); + int children = 0; + for (const AnimatorLayer& other : layers) { + if (other.parentGroup == layer.name) ++children; + } + ImGui::TextDisabled("%d layers inside. Drop layers on the group.", children); + } + ImGui::Spacing(); + if (ImGui::Button(layer.isGroup ? "Delete Group" : "Delete Layer")) deleteLayer(m_layer); } void AnimatorControllerWindow::renderParameterPanel() { if (!m_animator) return; - ImGui::TextColored({0.9f,0.8f,0.4f,1.0f}, "Parameters"); - ImGui::Separator(); + if (ImGui::SmallButton("+")) ImGui::OpenPopup("##add_param"); + if (ImGui::BeginPopup("##add_param")) { + if (ImGui::IsWindowAppearing()) ImGui::SetKeyboardFocusHere(); + const bool enter = ImGui::InputText("Name", m_newParamName, sizeof(m_newParamName), ImGuiInputTextFlags_EnterReturnsTrue); + const char* paramTypes[] = {"Float", "Int", "Bool", "Trigger"}; + const ParameterType types[] = {ParameterType::Float, ParameterType::Int, ParameterType::Bool, ParameterType::Trigger}; + ImGui::Combo("Type", &m_newParamType, paramTypes, 4); + if ((ImGui::Button("Add") || enter) && m_newParamName[0] != '\0') { + m_animator->addParameter(m_newParamName, types[std::clamp(m_newParamType, 0, 3)]); + std::memset(m_newParamName, 0, sizeof(m_newParamName)); + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + ImGui::SameLine(); + ImGui::SetNextItemWidth(-1.0f); + ImGui::InputTextWithHint("##param_filter", "Search", m_paramFilter, sizeof(m_paramFilter)); - for (auto& p : m_animator->parameters) { - ImGui::PushID(p.name.cStr()); + int removeIndex = -1; + for (int i = 0; i < static_cast(m_animator->parameters.size()); ++i) { + AnimatorParameter& p = m_animator->parameters[static_cast(i)]; + if (m_paramFilter[0] != '\0' && std::string(p.name.cStr()).find(m_paramFilter) == std::string::npos) continue; + ImGui::PushID(i); + const char* glyph = "B"; + if (p.type == ParameterType::Float) glyph = "F"; + else if (p.type == ParameterType::Int) glyph = "I"; + else if (p.type == ParameterType::Trigger) glyph = "T"; + ImGui::TextDisabled("%s", glyph); + ImGui::SameLine(); + ImGui::TextUnformatted(p.name.cStr()); + if (ImGui::BeginPopupContextItem("##param_ctx")) { + if (ImGui::MenuItem("Delete Parameter")) removeIndex = i; + ImGui::EndPopup(); + } + ImGui::SameLine(110.0f); + ImGui::SetNextItemWidth(-1.0f); switch (p.type) { - case Animation::ParameterType::Bool: { + case ParameterType::Bool: { bool v = p.boolValue; - if (ImGui::Checkbox(p.name.cStr(), &v)) p.boolValue = v; + if (ImGui::Checkbox("##v", &v)) p.boolValue = v; break; } - case Animation::ParameterType::Float: { - ImGui::SetNextItemWidth(80.0f); - ImGui::DragFloat(p.name.cStr(), &p.floatValue, 0.01f); + case ParameterType::Float: + ImGui::DragFloat("##v", &p.floatValue, 0.01f); break; - } - case Animation::ParameterType::Int: { + case ParameterType::Int: { int v = p.intValue; - ImGui::SetNextItemWidth(80.0f); - if (ImGui::DragInt(p.name.cStr(), &v)) p.intValue = static_cast(v); + if (ImGui::DragInt("##v", &v)) p.intValue = static_cast(v); break; } - case Animation::ParameterType::Trigger: { - if (ImGui::SmallButton(p.name.cStr())) p.triggered = true; - ImGui::SameLine(); - ImGui::TextDisabled("[T]%s", p.triggered ? "*" : ""); + case ParameterType::Trigger: + if (ImGui::SmallButton(p.triggered ? "Set" : "Fire")) p.triggered = true; break; - } } ImGui::PopID(); } - - ImGui::Spacing(); - const char* paramTypes[] = {"Bool", "Float", "Int", "Trigger"}; - ImGui::InputText("##pname", m_newParamName, sizeof(m_newParamName)); - ImGui::SameLine(); - ImGui::SetNextItemWidth(60.0f); - ImGui::Combo("##ptype", &m_newParamType, paramTypes, 4); - ImGui::SameLine(); - if (ImGui::SmallButton("+##param") && m_newParamName[0] != '\0') { - m_animator->addParameter(m_newParamName, static_cast(m_newParamType)); - memset(m_newParamName, 0, sizeof(m_newParamName)); + if (removeIndex >= 0) m_animator->parameters.erase(m_animator->parameters.begin() + removeIndex); + if (m_animator->parameters.empty()) { + ImGui::TextDisabled("No parameters. Use + to add one."); } + ImGui::Spacing(); + ImGui::TextDisabled("Right-click a parameter to delete it."); } } diff --git a/src/editor/AnimatorController.hpp b/src/editor/AnimatorController.hpp index 15cf89dd..65a07f7f 100644 --- a/src/editor/AnimatorController.hpp +++ b/src/editor/AnimatorController.hpp @@ -5,7 +5,7 @@ #include "ecs/World.hpp" #include "math/Vec2.hpp" #include -#include +#include #ifdef CF_HAS_IMGUI #include @@ -23,7 +23,7 @@ class AnimatorControllerWindow { AnimatorControllerWindow() = default; void setAnimator(Animation::Animator* animator); - void bindSelection(ECS::World* world, ECS::Entity entity); + void bindSelection(ECS::World* world, ECS::Entity entity, const std::string& projectRoot); Animation::Animator* getAnimator() const { return m_animator; } void render(); @@ -33,39 +33,94 @@ class AnimatorControllerWindow { void close() { m_open = false; } private: + enum class Selection { None, State, Transition, Entry, AnyState, Exit }; + + void renderToolbar(); void renderCanvas(); void renderInspector(); + void renderStateInspector(Animation::AnimationState& state); + void renderTransitionInspector(); + void renderTransitionTimeline(Animation::AnimationTransition& transition, const std::string& from); void renderParameterPanel(); - - void drawStateNode(const std::string& name, const Animation::AnimationState& state, bool isActive); - void drawTransitionArrow(ImVec2 from, ImVec2 to, bool isActive); - - ImVec2 stateNodeSize() const { return {150.0f, 44.0f}; } - ImVec2 nodeCenter(const StateNodePos& pos) const; + void renderLayersPanel(); + void renderLayerRow(int index, int depth); + void renderLayerProperties(); + void runPreview(); + void startPreview(); + void stopPreview(); + void publishLink(); + void consumeLink(); + + /// Graph the canvas edits: the base layer or the selected layer. + Animation::AnimatorStateMachine& graph(); + bool editingGroup() const; + std::vector* transitionList(const std::string& from); + Animation::AnimationTransition* selectedTransition(); + void transitionEdited(const std::string& from, const Animation::AnimationTransition& transition); + bool timelineLinked(const std::string& from, const std::string& to) const; + + std::vector clipNames() const; + f32 stateDuration(const Animation::AnimationState& state) const; + f32 graphStateDuration(const Animation::AnimatorStateMachine& sm, const FixedString<32>& name) const; + void layoutMissingNodes(); + std::string uniqueStateName(const char* base) const; + std::string uniqueLayerName(const char* base) const; + void createState(const char* name, const char* motion, f32 x, f32 y); + void renameState(const std::string& from, const std::string& to); + void deleteState(const std::string& name); + void addTransition(const std::string& from, const std::string& to); + void playState(const std::string& name); + void selectLayer(int index); + void addLayer(bool group); + void deleteLayer(int index); + void moveLayer(int index, int before, const std::string& parent); + bool layerInside(int index, const std::string& group) const; + void selectState(const std::string& name); + + ImVec2 stateNodeSize() const { return {150.0f, 38.0f}; } Animation::Animator m_internalAnimator; Animation::Animator* m_animator = &m_internalAnimator; Animation::Animator* m_bound = nullptr; ECS::World* m_world = nullptr; ECS::Entity m_entity = ECS::Entity::INVALID; + /// -1 is the base layer, otherwise an index into Animator::layers. + int m_layer = -1; - std::unordered_map m_nodePositions; - + Selection m_selection = Selection::None; std::string m_selectedState; std::string m_selectedTransitionFrom; - std::string m_selectedTransitionTo; + int m_selectedTransition = -1; + + std::string m_dragNode; + bool m_panning = false; + std::string m_linkFrom; + bool m_linkDrag = false; + std::string m_contextNode; + std::string m_contextTransitionFrom; + int m_contextTransition = -1; + StateNodePos m_contextPos; + std::string m_status; + int m_contextLayer = -2; + int m_barDrag = 0; + int m_moveLayer = -1; + int m_moveBefore = -1; + std::string m_moveParent; bool m_open = true; - bool m_draggingNode = false; + bool m_preview = false; float m_canvasScrollX = 0.0f; float m_canvasScrollY = 0.0f; - bool m_addStatePopup = false; - - char m_newStateName[32] = {}; + ImVec2 m_canvasSize{0.0f, 0.0f}; + u64 m_focusSeen = 0; + + char m_paramFilter[32] = {}; + char m_renameBuffer[32] = {}; + std::string m_renameTarget; + char m_layerName[32] = {}; + int m_layerNameTarget = -2; char m_newParamName[32] = {}; int m_newParamType = 0; - char m_transitionTo[32] = {}; - bool m_showAddTransition = false; }; } diff --git a/src/editor/AssetBrowser.cpp b/src/editor/AssetBrowser.cpp index 3e184d2c..929d1d0d 100644 --- a/src/editor/AssetBrowser.cpp +++ b/src/editor/AssetBrowser.cpp @@ -5,6 +5,8 @@ #include "editor/DragDropSystem.hpp" #include "editor/PrefabSystem.hpp" #include "editor/EditorContext.hpp" +#include "editor/AnimationEditorLink.hpp" +#include "editor/ProjectManager.hpp" #include "core/io/CafTypes.hpp" #include "assets/TextureCompiler.hpp" #include "assets/MeshImportValidator.hpp" @@ -96,6 +98,7 @@ void AssetBrowser::init(const ProjectConfig& projectConfig) { m_pathHistory.clear(); std::filesystem::create_directories(m_rawRoot); std::filesystem::create_directories(m_processedRoot); + ProjectManager::EnsureDefaultFolders(m_projectRoot); refresh(); } @@ -852,6 +855,8 @@ void AssetBrowser::renderGridView() { m_onMaterialOpen(entry.path); } else if (isBrowserImage(entry.path) && m_editorContext) { m_editorContext->imageToOpen = entry.path.string(); + } else if (entry.path.extension() == ".anim") { + AnimationEditorLink::get().openAnimRequest = entry.path.string(); } } } @@ -941,6 +946,8 @@ void AssetBrowser::renderListView() { m_onMaterialOpen(entry.path); } else if (isBrowserImage(entry.path) && m_editorContext) { m_editorContext->imageToOpen = entry.path.string(); + } else if (entry.path.extension() == ".anim") { + AnimationEditorLink::get().openAnimRequest = entry.path.string(); } } } @@ -1420,7 +1427,7 @@ bool AssetBrowser::importPath(const std::filesystem::path& sourcePath, bool auto if (!relEc) rel = computed; if (!importSingleFile(file, m_rawRoot / rel)) { - setStatusMessage("Falha ao importar ficheiros do mesh", true); + setStatusMessage("Failed to import mesh files", true); refresh(); return false; } @@ -1432,7 +1439,7 @@ bool AssetBrowser::importPath(const std::filesystem::path& sourcePath, bool auto } const auto report = Assets::MeshImportValidator::analyze(m_rawRoot / sourcePath.filename()); - std::string message = "Mesh importado (" + std::to_string(copiedCount) + " ficheiro(s))"; + std::string message = "Mesh imported (" + std::to_string(copiedCount) + " file(s))"; if (!report.readyToLoad) { message = "Importado mas incompleto: " + report.errorSummary; if (!report.suggestion.empty()) { @@ -1536,7 +1543,7 @@ void AssetBrowser::renderAssetCreatorModal() { ImGui::BeginChild("AssetOptions", ImVec2(0.0f, 320.0f), true); if (m_assetCreatorCategory == 1) { - ImGui::TextWrapped("Prefira .glb (um ficheiro). glTF separado precisa do .bin e texturas."); + ImGui::TextWrapped("Prefer .glb (one file). A separate glTF needs the .bin and textures."); ImGui::Spacing(); } diff --git a/src/editor/BrowseSession.cpp b/src/editor/BrowseSession.cpp index e3cf5491..887bae6e 100644 --- a/src/editor/BrowseSession.cpp +++ b/src/editor/BrowseSession.cpp @@ -23,7 +23,7 @@ void serviceBrowseSession(EditorContext& ctx, AssetBrowser& browser) { if (poll == AssetBrowser::AssetPickerPoll::Selected) { if (session.stringTarget) { *session.stringTarget = picked; - ctx.isDirty = true; + ctx.markDirty(); session.clear(); } else { const u32 field = session.fieldId; @@ -49,7 +49,7 @@ void serviceBrowseSession(EditorContext& ctx, AssetBrowser& browser) { if (auto chosen = FilePicker::pickPath(mode, session.title, session.startPath)) { if (session.stringTarget) { *session.stringTarget = chosen->string(); - ctx.isDirty = true; + ctx.markDirty(); session.clear(); return; } diff --git a/src/editor/CameraPreviewPanel.cpp b/src/editor/CameraPreviewPanel.cpp index 2d4fd52b..bb35a548 100644 --- a/src/editor/CameraPreviewPanel.cpp +++ b/src/editor/CameraPreviewPanel.cpp @@ -195,7 +195,7 @@ bool renderCameraPreviewGpuOnly(SceneViewport& viewport, ECS::World& world, Edit const u32 probeW = static_cast(std::max(fbSizeProbe.x, 8.0f)); const u32 probeH = static_cast(std::max(fbSizeProbe.y, 8.0f)); const bool sizeChanged = probeW != cache.lastW || probeH != cache.lastH; - const u64 sceneStamp = editorSceneContentStamp(world); + const u64 sceneStamp = editorSceneContentStamp(world) ^ (ctx.visualRevision * 0xD1B54A32D192ED03ull); const bool sceneChanged = sceneStamp != cache.lastSceneStamp; const u32 gpuInterval = (camChanged || sceneChanged) ? 1u : 2u; const bool rerunGpu = (camChanged || sizeChanged || sceneChanged || !cache.hasFrame || diff --git a/src/editor/CommandPalette.cpp b/src/editor/CommandPalette.cpp index 15ecd671..f8a7c276 100644 --- a/src/editor/CommandPalette.cpp +++ b/src/editor/CommandPalette.cpp @@ -1,4 +1,6 @@ #include "editor/CommandPalette.hpp" +#include "editor/EditorIcons.hpp" +#include "editor/PluginSystem.hpp" #include #include @@ -8,12 +10,22 @@ void CommandPalette::registerCommand(const FixedString<64>& id, const FixedString<128>& label, const FixedString<128>& category, std::function callback, - bool enabled) { + bool enabled, + const char* plugin, + const char* keywords) { for (auto& cmd : m_commands) { if (cmd.id == id) return; } - m_commands.push_back({id, label, category, std::move(callback), enabled}); + Item item; + item.id = id; + item.label = label; + item.category = category; + item.callback = std::move(callback); + item.enabled = enabled; + if (plugin) item.plugin = plugin; + if (keywords) item.keywords = keywords; + m_commands.push_back(std::move(item)); } void CommandPalette::unregisterCommand(const FixedString<64>& id) { @@ -26,6 +38,7 @@ void CommandPalette::open() { m_open = true; m_selectedIndex = 0; m_searchBuffer[0] = '\0'; + m_focusSearch = true; filterResults(""); } @@ -49,27 +62,27 @@ void CommandPalette::clearResults() { void CommandPalette::filterResults(const char* query) { m_filteredResults.clear(); + auto visible = [](const Item& cmd) { + if (!cmd.enabled) return false; + return PluginManager::instance().isContributionEnabled(cmd.plugin); + }; + if (!query || query[0] == '\0') { for (const auto& cmd : m_commands) { - if (cmd.enabled) { - m_filteredResults.push_back(&cmd); - } + if (visible(cmd)) m_filteredResults.push_back(&cmd); } } else { std::string lowerQuery = query; std::transform(lowerQuery.begin(), lowerQuery.end(), lowerQuery.begin(), ::tolower); for (const auto& cmd : m_commands) { - if (!cmd.enabled) continue; + if (!visible(cmd)) continue; - std::string lowerLabel = cmd.label.cStr(); - std::transform(lowerLabel.begin(), lowerLabel.end(), lowerLabel.begin(), ::tolower); + std::string haystack = std::string(cmd.label.cStr()) + " " + cmd.category.cStr() + " " + + cmd.id.cStr() + " " + cmd.keywords; + std::transform(haystack.begin(), haystack.end(), haystack.begin(), ::tolower); - std::string lowerCategory = cmd.category.cStr(); - std::transform(lowerCategory.begin(), lowerCategory.end(), lowerCategory.begin(), ::tolower); - - if (lowerLabel.find(lowerQuery) != std::string::npos || - lowerCategory.find(lowerQuery) != std::string::npos) { + if (haystack.find(lowerQuery) != std::string::npos) { m_filteredResults.push_back(&cmd); } } @@ -125,58 +138,128 @@ namespace Caffeine::Editor { void CommandPalette::render() { if (!m_open) return; - ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x * 0.5f, ImGui::GetIO().DisplaySize.y * 0.3f), ImGuiCond_Always); - ImGui::SetNextWindowSize(ImVec2(600, 400), ImGuiCond_Always); + const ImVec2 display = ImGui::GetIO().DisplaySize; + ImGui::SetNextWindowPos(ImVec2(display.x * 0.5f, display.y * 0.22f), ImGuiCond_FirstUseEver, ImVec2(0.5f, 0.0f)); + ImGui::SetNextWindowSize(ImVec2(560.0f, 460.0f), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSizeConstraints(ImVec2(420.0f, 280.0f), ImVec2(display.x * 0.9f, display.y * 0.9f)); + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(14.0f, 12.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 8.0f); + ImGuiWindowFlags flags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings; + if (!ImGui::Begin("Quick Search", &m_open, flags)) { + ImGui::End(); + ImGui::PopStyleVar(2); + return; + } + + bool scrollToSelection = false; + if (ImGui::IsKeyPressed(ImGuiKey_Escape)) close(); + if (ImGui::IsKeyPressed(ImGuiKey_DownArrow)) { + nextItem(); + scrollToSelection = true; + } + if (ImGui::IsKeyPressed(ImGuiKey_UpArrow)) { + previousItem(); + scrollToSelection = true; + } - ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings | - ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize; + if (m_focusSearch) ImGui::SetKeyboardFocusHere(); + ImGui::SetNextItemWidth(-1.0f); + const bool submitted = ImGui::InputTextWithHint("##search", "Panels, actions, plugins...", m_searchBuffer, + sizeof(m_searchBuffer), ImGuiInputTextFlags_EnterReturnsTrue); + if (m_focusSearch) m_focusSearch = false; + filterResults(m_searchBuffer); + if (submitted) { + executeSelected(); + close(); + } - if (ImGui::Begin("Command Palette", nullptr, flags)) { - ImGui::SetNextItemWidth(ImGui::GetWindowWidth() - 20); - if (ImGui::InputText("##search", m_searchBuffer, sizeof(m_searchBuffer), - ImGuiInputTextFlags_EnterReturnsTrue)) { - executeSelected(); + ImGui::Spacing(); + ImGui::BeginChild("results", ImVec2(0.0f, -ImGui::GetFrameHeightWithSpacing()), true); + + const float rowH = ImGui::GetFrameHeight() + 10.0f; + auto categoryColor = [](const char* category) -> ImU32 { + if (std::strcmp(category, "Scene") == 0) return IM_COL32(48, 96, 156, 230); + if (std::strcmp(category, "Animation") == 0) return IM_COL32(156, 92, 48, 230); + if (std::strcmp(category, "Content") == 0) return IM_COL32(46, 122, 96, 230); + if (std::strcmp(category, "Debug") == 0) return IM_COL32(122, 72, 156, 230); + if (std::strcmp(category, "Tools") == 0) return IM_COL32(42, 118, 138, 230); + if (std::strcmp(category, "Actions") == 0) return IM_COL32(168, 132, 42, 230); + if (std::strcmp(category, "Plugins") == 0) return IM_COL32(156, 64, 96, 230); + if (std::strcmp(category, "Panels") == 0) return IM_COL32(48, 96, 156, 230); + unsigned hash = 2166136261u; + for (const char* c = category; *c; ++c) hash = (hash ^ static_cast(*c)) * 16777619u; + return IM_COL32(70 + (hash & 70), 70 + ((hash >> 8) & 70), 90 + ((hash >> 16) & 80), 230); + }; + auto iconFor = [](const Item* item) -> const char* { + const char* id = item->id.cStr(); + if (std::strstr(id, "hierarchy")) return EditorIcon::Hierarchy; + if (std::strstr(id, "inspector")) return EditorIcon::Inspector; + if (std::strstr(id, "console")) return EditorIcon::Console; + if (std::strstr(id, "profiler")) return EditorIcon::Profiler; + if (std::strstr(id, "debugger")) return EditorIcon::EntityDebugger; + if (std::strstr(id, "plugin")) return EditorIcon::Plugins; + if (std::strstr(id, "asset")) return EditorIcon::Assets; + if (std::strstr(id, "animator")) return EditorIcon::Animator; + if (std::strstr(id, "animation") || std::strstr(id, "timeline")) return EditorIcon::Animation; + if (std::strstr(id, "viewport") || std::strstr(id, "camera") || std::strstr(id, "gameplay")) return EditorIcon::Viewport; + if (std::strstr(id, "settings")) return EditorIcon::Search; + if (std::strstr(id, "save")) return EditorIcon::Save; + if (std::strstr(id, "new")) return EditorIcon::NewScene; + if (std::strstr(id, "build") || std::strstr(id, "toolbox")) return EditorIcon::Build; + if (std::strcmp(item->category.cStr(), "Plugins") == 0) return EditorIcon::Plugins; + if (std::strcmp(item->category.cStr(), "Actions") == 0) return EditorIcon::Build; + return EditorIcon::Folder; + }; + for (usize i = 0; i < m_filteredResults.size(); ++i) { + const Item* item = m_filteredResults[i]; + if (!item) continue; + const bool isSelected = i == m_selectedIndex; + ImGui::PushID(static_cast(i)); + const float rowW = ImGui::GetContentRegionAvail().x; + const ImVec2 rowPos = ImGui::GetCursorScreenPos(); + ImGui::InvisibleButton("##row", ImVec2(rowW, rowH)); + const bool hovered = ImGui::IsItemHovered(); + if (ImGui::IsItemClicked()) { + m_selectedIndex = i; + if (item->callback) item->callback(); close(); } - - if (ImGui::IsItemActive() && !ImGui::IsItemEdited()) { - filterResults(m_searchBuffer); + if (isSelected && scrollToSelection) ImGui::SetScrollHereY(0.5f); + ImDrawList* draw = ImGui::GetWindowDrawList(); + const ImVec2 rowMax(rowPos.x + rowW, rowPos.y + rowH); + if (isSelected || hovered) { + draw->AddRectFilled(rowPos, rowMax, + isSelected ? IM_COL32(58, 78, 108, 255) : IM_COL32(48, 52, 60, 255), 4.0f); } - - ImGui::Separator(); - - ImGui::BeginChild("results", ImVec2(0, 300), false, ImGuiWindowFlags_NoNav); - - for (usize i = 0; i < m_filteredResults.size(); ++i) { - const Item* item = m_filteredResults[i]; - if (!item) continue; - - bool isSelected = (i == m_selectedIndex); - - if (isSelected) { - ImGui::SetNextItemOpen(true); - } - - std::string label = std::string("[") + item->category.cStr() + "] " + item->label.cStr(); - - if (ImGui::Selectable(label.c_str(), isSelected, ImGuiSelectableFlags_None)) { - m_selectedIndex = i; - item->callback(); - close(); - } - - if (ImGui::IsItemHovered() && isSelected) { - ImGui::SetTooltip("Press Enter to execute"); + const float iconSize = ImGui::GetFontSize(); + const char* icon = iconFor(item); + if (EditorIcons::hasIcon(icon)) { + const ImTextureRef tex = EditorIcons::get(icon); + if (tex._TexData != nullptr || tex._TexID != ImTextureID_Invalid) { + const ImVec2 iconPos(rowPos.x + 8.0f, rowPos.y + (rowH - iconSize) * 0.5f); + draw->AddImage(tex, iconPos, ImVec2(iconPos.x + iconSize, iconPos.y + iconSize)); } } - - ImGui::EndChild(); - - ImGui::Separator(); - ImGui::TextDisabled("Ctrl+L to open | ↑↓ Navigate Enter Execute Esc Close"); + const char* category = item->category.cStr(); + const ImVec2 categorySize = ImGui::CalcTextSize(category); + const float pillW = std::clamp(categorySize.x + 16.0f, 72.0f, 130.0f); + const ImVec2 pillMin(rowPos.x + 8.0f + iconSize + 8.0f, rowPos.y + 6.0f); + const ImVec2 pillMax(pillMin.x + pillW, rowPos.y + rowH - 6.0f); + draw->AddRectFilled(pillMin, pillMax, categoryColor(category), 4.0f); + draw->AddText(ImVec2(pillMin.x + (pillW - categorySize.x) * 0.5f, pillMin.y + 2.0f), + IM_COL32(244, 246, 250, 255), category); + draw->AddText(ImVec2(pillMax.x + 12.0f, rowPos.y + (rowH - ImGui::GetFontSize()) * 0.5f), + ImGui::GetColorU32(ImGuiCol_Text), item->label.cStr()); + ImGui::PopID(); + } + if (m_filteredResults.empty()) { + ImGui::TextDisabled("Nothing found."); } + ImGui::EndChild(); + ImGui::TextDisabled("Drag this window. Enter runs ↑↓ navigate Esc closes"); ImGui::End(); + ImGui::PopStyleVar(2); } } diff --git a/src/editor/CommandPalette.hpp b/src/editor/CommandPalette.hpp index e9dfd1da..0ce5a9e8 100644 --- a/src/editor/CommandPalette.hpp +++ b/src/editor/CommandPalette.hpp @@ -17,6 +17,8 @@ struct CommandPaletteItem { FixedString<128> category; std::function callback; bool enabled = true; + std::string plugin; + std::string keywords; }; class CommandPalette { @@ -29,7 +31,9 @@ class CommandPalette { const FixedString<128>& label, const FixedString<128>& category, std::function callback, - bool enabled = true); + bool enabled = true, + const char* plugin = nullptr, + const char* keywords = nullptr); void unregisterCommand(const FixedString<64>& id); @@ -65,6 +69,7 @@ class CommandPalette { std::vector m_commands; std::vector m_filteredResults; usize m_selectedIndex = 0; + bool m_focusSearch = false; }; } \ No newline at end of file diff --git a/src/editor/ComponentRegistry.cpp b/src/editor/ComponentRegistry.cpp index 7ee7dff3..aae98bf8 100644 --- a/src/editor/ComponentRegistry.cpp +++ b/src/editor/ComponentRegistry.cpp @@ -21,6 +21,9 @@ #include "navigation/NavVolume.hpp" #include "ecs/PostProcessComponents.hpp" #include "ecs/ForwardRenderComponents.hpp" +#include "ecs/EnvironmentEffectsComponents.hpp" +#include "ecs/PostProcessComponents.hpp" +#include "render/RenderFeatures.hpp" #include "editor/ComponentTypeRegistry.hpp" #include "ecs/Components3D.hpp" #include "scene/LightingSystem.hpp" @@ -85,6 +88,32 @@ void registerAllComponents(ComponentRegistry& reg) { [](ECS::World& w, ECS::Entity e){ return w.has(e); }, [](ECS::World& w, ECS::Entity e){ w.add(e); } }); + reg.registerComponent({ + "Environment", "Environment Effects", + [](ECS::World& w, ECS::Entity e){ return w.has(e); }, + [](ECS::World& w, ECS::Entity e){ + w.add(e); + if (!w.has(e) && !w.has(e)) w.add(e); + if (!w.has(e)) { + auto& features = w.add(e); + features.ibl.enabled = false; + features.occlusion.enabled = true; + features.volumetrics.enabled = true; + features.volumetrics.quality = Render::VolumetricQuality::High; + features.volumetrics.sampleShadows = true; + features.volumetrics.density = 0.045f; + features.volumetrics.height = 80.0f; + features.volumetrics.anisotropy = 0.62f; + } + if (!w.has(e)) { + auto& post = w.add(e); + post.ambientOcclusion.enabled = true; + post.ambientOcclusion.intensity = 1.1f; + } + }, + {}, + "world light day night zone ambient environment" + }); reg.registerComponent({ "Environment", "Terrain", [](ECS::World& w, ECS::Entity e) { return w.has(e); }, @@ -170,7 +199,7 @@ void registerAllComponents(ComponentRegistry& reg) { } }); reg.registerComponent({ - "Animation", "Skinned Mesh", + "Animation", "Skeleton", [](ECS::World& w, ECS::Entity e) { return w.has(e); }, [](ECS::World& w, ECS::Entity e) { Animation::SkinnedPose pose; @@ -178,7 +207,9 @@ void registerAllComponents(ComponentRegistry& reg) { std::strncpy(pose.meshPath, filter->customMeshPath.c_str(), sizeof(pose.meshPath) - 1); } w.add(e, std::move(pose)); - } + }, + {}, + "skinned mesh pose bones skeleton skel" }); reg.registerComponent({ "Animation", "Animation Player", @@ -192,12 +223,16 @@ void registerAllComponents(ComponentRegistry& reg) { Navigation::NavVolume volume; volume.resize(32, 32); w.add(e, std::move(volume)); - } + }, + "ai_development_plugin", + "navigation navmesh ai" }); reg.registerComponent({ "AI", "Nav Agent", [](ECS::World& w, ECS::Entity e) { return w.has(e); }, - [](ECS::World& w, ECS::Entity e) { w.add(e); } + [](ECS::World& w, ECS::Entity e) { w.add(e); }, + "ai_development_plugin", + "navigation pathfinding ai" }); reg.registerComponent({ "Camera", "Camera Active", @@ -276,7 +311,9 @@ void registerAllComponents(ComponentRegistry& reg) { reg.registerComponent({ "Procedural", "Procedural World", [](ECS::World& w, ECS::Entity e) { return w.has(e); }, - [](ECS::World& w, ECS::Entity e) { w.add(e); } + [](ECS::World& w, ECS::Entity e) { w.add(e); }, + "procedural_tools_plugin", + "terrain generate world" }); ComponentTypeRegistry::instance().registerType("PostProcess"); diff --git a/src/editor/ComponentRegistry.hpp b/src/editor/ComponentRegistry.hpp index c529ed62..650b0987 100644 --- a/src/editor/ComponentRegistry.hpp +++ b/src/editor/ComponentRegistry.hpp @@ -13,6 +13,10 @@ struct ComponentEntry { std::string name; std::function has; std::function add; + /// When set, Add Component / Quick Search hide this entry if that plugin is off. + std::string plugin; + /// Extra search tokens (space separated), e.g. "skeleton skinned bones". + std::string keywords; }; class ComponentRegistry { diff --git a/src/editor/CurveWidget.hpp b/src/editor/CurveWidget.hpp new file mode 100644 index 00000000..6374b163 --- /dev/null +++ b/src/editor/CurveWidget.hpp @@ -0,0 +1,155 @@ +#pragma once + +#ifdef CF_HAS_IMGUI + +#include "animation/SkinLibrary.hpp" + +#include + +#include + +namespace Caffeine::Editor { + +inline const Animation::KeyInterp kCurveModes[] = { + Animation::KeyInterp::Linear, Animation::KeyInterp::EaseIn, Animation::KeyInterp::EaseOut, + Animation::KeyInterp::EaseInOut, Animation::KeyInterp::Constant, Animation::KeyInterp::Custom, +}; + +inline void applyKeyInterp(Animation::KeyCurve& curve, Animation::KeyInterp mode) { + if (mode == Animation::KeyInterp::Custom) { + if (curve.mode != Animation::KeyInterp::Custom) { + curve = (curve.mode == Animation::KeyInterp::Linear || curve.mode == Animation::KeyInterp::Constant) + ? Animation::KeyCurve{} + : Animation::keyCurvePreset(curve.mode); + } + curve.mode = Animation::KeyInterp::Custom; + return; + } + curve = Animation::keyCurvePreset(mode); +} + +/// Curve shape inside [min, max], 0..1 on both axes. +inline void drawCurveGlyph(ImDrawList* dl, ImVec2 min, ImVec2 max, const Animation::KeyCurve& curve, ImU32 color, + f32 thickness = 1.5f) { + ImVec2 points[17]; + for (int i = 0; i < 17; ++i) { + const f32 u = static_cast(i) / 16.0f; + const f32 v = std::clamp(Animation::evaluateKeyCurve(curve, u), -0.2f, 1.2f); + points[i] = ImVec2(min.x + (max.x - min.x) * u, max.y - (max.y - min.y) * v); + } + dl->AddPolyline(points, 17, color, 0, thickness); +} + +/// Combo with the interpolation presets. Returns true when the mode changed. +inline bool curveModeCombo(const char* label, Animation::KeyCurve& curve, f32 width = 130.0f) { + bool changed = false; + ImGui::SetNextItemWidth(width); + if (ImGui::BeginCombo(label, Animation::keyInterpName(curve.mode))) { + for (Animation::KeyInterp mode : kCurveModes) { + if (ImGui::Selectable(Animation::keyInterpName(mode), curve.mode == mode)) { + applyKeyInterp(curve, mode); + changed = true; + } + } + ImGui::EndCombo(); + } + return changed; +} + +/// Bezier editor with draggable handles. Dragging a handle switches the curve to Custom. +inline bool editKeyCurve(const char* id, Animation::KeyCurve& curve, f32 width, f32 height = 120.0f) { + ImGui::PushID(id); + const ImGuiIO& io = ImGui::GetIO(); + ImDrawList* dl = ImGui::GetWindowDrawList(); + const ImVec2 size(std::max(width, 80.0f), height); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const f32 pad = 10.0f; + const f32 vMin = -0.25f; + const f32 vMax = 1.25f; + auto toScreen = [&](f32 u, f32 v) { + return ImVec2(pos.x + pad + u * (size.x - pad * 2.0f), + pos.y + size.y - pad - ((v - vMin) / (vMax - vMin)) * (size.y - pad * 2.0f)); + }; + ImGui::InvisibleButton("##graph", size); + const bool active = ImGui::IsItemActive(); + ImGuiStorage* storage = ImGui::GetStateStorage(); + const ImGuiID handleKey = ImGui::GetID("##handle"); + int handle = storage->GetInt(handleKey, 0); + + dl->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(26, 28, 34, 255), 4.0f); + dl->AddRect(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(60, 64, 74, 255), 4.0f); + dl->AddLine(toScreen(0.0f, 0.0f), toScreen(1.0f, 0.0f), IM_COL32(70, 74, 86, 255)); + dl->AddLine(toScreen(0.0f, 1.0f), toScreen(1.0f, 1.0f), IM_COL32(70, 74, 86, 255)); + dl->AddLine(toScreen(0.0f, 0.0f), toScreen(1.0f, 1.0f), IM_COL32(70, 74, 86, 140)); + + const bool hasHandles = curve.mode != Animation::KeyInterp::Constant; + const Animation::KeyCurve shape = curve.mode == Animation::KeyInterp::Custom ? curve + : curve.mode == Animation::KeyInterp::Linear ? Animation::KeyCurve{} + : Animation::keyCurvePreset(curve.mode); + const ImVec2 h1 = toScreen(shape.x1, shape.y1); + const ImVec2 h2 = toScreen(shape.x2, shape.y2); + if (hasHandles) { + dl->AddLine(toScreen(0.0f, 0.0f), h1, IM_COL32(120, 180, 255, 200), 1.2f); + dl->AddLine(toScreen(1.0f, 1.0f), h2, IM_COL32(120, 180, 255, 200), 1.2f); + } + ImVec2 points[49]; + for (int s = 0; s < 49; ++s) { + const f32 u = static_cast(s) / 48.0f; + points[s] = toScreen(u, Animation::evaluateKeyCurve(curve, u)); + } + dl->AddPolyline(points, 49, IM_COL32(255, 210, 60, 255), 0, 2.0f); + if (hasHandles) { + dl->AddCircleFilled(h1, handle == 1 ? 6.0f : 5.0f, IM_COL32(160, 205, 255, 255), 16); + dl->AddCircleFilled(h2, handle == 2 ? 6.0f : 5.0f, IM_COL32(160, 205, 255, 255), 16); + } + if (ImGui::IsItemClicked() && hasHandles) { + auto dist2 = [&](ImVec2 p) { + const f32 dx = io.MousePos.x - p.x; + const f32 dy = io.MousePos.y - p.y; + return dx * dx + dy * dy; + }; + const f32 d1 = dist2(h1); + const f32 d2 = dist2(h2); + handle = std::min(d1, d2) < 196.0f ? (d1 <= d2 ? 1 : 2) : 0; + } + if (!active) handle = 0; + bool changed = false; + if (active && handle != 0) { + if (curve.mode != Animation::KeyInterp::Custom) applyKeyInterp(curve, Animation::KeyInterp::Custom); + const f32 u = std::clamp((io.MousePos.x - pos.x - pad) / (size.x - pad * 2.0f), 0.0f, 1.0f); + const f32 v = std::clamp(vMin + ((pos.y + size.y - pad - io.MousePos.y) / (size.y - pad * 2.0f)) * (vMax - vMin), + vMin, vMax); + if (handle == 1) { + curve.x1 = u; + curve.y1 = v; + } else { + curve.x2 = u; + curve.y2 = v; + } + changed = true; + } + storage->SetInt(handleKey, handle); + + changed = curveModeCombo("Curve", curve, size.x - 60.0f) || changed; + const struct { + const char* label; + Animation::KeyInterp mode; + } presets[] = {{"Linear", Animation::KeyInterp::Linear}, + {"In", Animation::KeyInterp::EaseIn}, + {"Out", Animation::KeyInterp::EaseOut}, + {"In Out", Animation::KeyInterp::EaseInOut}, + {"Step", Animation::KeyInterp::Constant}}; + for (int i = 0; i < 5; ++i) { + if (i > 0) ImGui::SameLine(); + if (ImGui::SmallButton(presets[i].label)) { + applyKeyInterp(curve, presets[i].mode); + changed = true; + } + } + ImGui::PopID(); + return changed; +} + +} // namespace Caffeine::Editor + +#endif diff --git a/src/editor/EditorContext.cpp b/src/editor/EditorContext.cpp index e48ef176..58ad0165 100644 --- a/src/editor/EditorContext.cpp +++ b/src/editor/EditorContext.cpp @@ -106,7 +106,7 @@ void EditorContext::endUndo(ECS::World& world) { undoStack.push(m_pendingCmd); m_undoPending = false; - isDirty = true; + markDirty(); } } // namespace Caffeine::Editor diff --git a/src/editor/EditorContext.hpp b/src/editor/EditorContext.hpp index adbf3d2f..54f7650e 100644 --- a/src/editor/EditorContext.hpp +++ b/src/editor/EditorContext.hpp @@ -95,6 +95,8 @@ class EditorContext { // ── Scene state ──────────────────────────────────────────────────── std::string currentScenePath; bool isDirty = false; + /// Bumps when the editor changes something the cached GPU view must show. + u64 visualRevision = 1; std::string materialToOpen; std::string imageToOpen; std::filesystem::path projectRootPath; @@ -155,6 +157,13 @@ class EditorContext { enum class MeshElementMode : u8 { Object, Vertex, Edge, Face }; MeshElementMode meshElementMode = MeshElementMode::Object; std::vector meshElementSelection; + /// Bone picked on the character currently being configured. Ignored for other entities. + u32 skeletonEntityId = 0xFFFFFFFFu; + i32 skeletonBone = -1; + bool showBones = true; + /// Inspector Remap Bones: next viewport/list click assigns this humanoid slot. + bool remapBones = false; + i32 remapHumanoidSlot = 0; // ── Snap ─────────────────────────────────────────────────────────── bool snapToGrid = false; @@ -269,7 +278,13 @@ class EditorContext { bool hasMultiSelection() const { return selectedEntities.size() > 1; } - void markDirty() { isDirty = true; } + void markDirty() { + isDirty = true; + ++visualRevision; + } + + /// Scene file is unsaved, but the GPU view already tracks the change (gizmo / pose). + void markModified() { isDirty = true; } // ── Transient status (viewport / import feedback) ──────────────── std::string transientStatus; diff --git a/src/editor/EditorPanelUtils.hpp b/src/editor/EditorPanelUtils.hpp index 537925af..d58628a6 100644 --- a/src/editor/EditorPanelUtils.hpp +++ b/src/editor/EditorPanelUtils.hpp @@ -6,7 +6,10 @@ #include "ecs/MeshComponents.hpp" #include "ecs/ForwardRenderComponents.hpp" #include "ecs/PostProcessComponents.hpp" +#include "animation/SkinLibrary.hpp" +#include "ecs/LightComponents.hpp" #include "ecs/SkyboxComponents.hpp" +#include "ecs/EnvironmentEffectsComponents.hpp" #include "ecs/TerrainComponents.hpp" #include "ecs/World.hpp" #include "scene/SceneComponents.hpp" @@ -31,6 +34,7 @@ inline u64 editorSceneContentStamp(ECS::World& world) { mix(world.entityCount()); mix(Assets::MaterialCache::instance().revision()); + mix(Animation::skinRevision()); ECS::ComponentQuery meshQuery; meshQuery.with(); @@ -91,6 +95,39 @@ inline u64 editorSceneContentStamp(ECS::World& world) { for (const char* c = sky.customTexturePath; *c; ++c) mix(static_cast(*c)); }); + ECS::ComponentQuery envQuery; + envQuery.with(); + world.forEach( + envQuery, [&](ECS::Entity entity, ECS::EnvironmentEffectsComponent& fx) { + mix(entity.id()); + mix(fx.enabled); + mix(fx.mode); + u32 bits = 0; + std::memcpy(&bits, &fx.timeOfDay, sizeof(bits)); + mix(bits); + std::memcpy(&bits, &fx.drivenAmbient.x, sizeof(bits)); + mix(bits); + std::memcpy(&bits, &fx.drivenAmbient2D, sizeof(bits)); + mix(bits); + }); + + ECS::ComponentQuery lightQuery; + lightQuery.with(); + world.forEach(lightQuery, [&](ECS::Entity entity, ECS::LightComponent& light) { + mix(entity.id()); + u32 bits = 0; + std::memcpy(&bits, &light.intensity, sizeof(bits)); + mix(bits); + std::memcpy(&bits, &light.color.x, sizeof(bits)); + mix(bits); + std::memcpy(&bits, &light.color.y, sizeof(bits)); + mix(bits); + std::memcpy(&bits, &light.color.z, sizeof(bits)); + mix(bits); + std::memcpy(&bits, &light.color.w, sizeof(bits)); + mix(bits); + }); + ECS::ComponentQuery postQuery; postQuery.with(); world.forEach(postQuery, [&](ECS::Entity entity, ECS::PostProcessComponent& fx) { diff --git a/src/editor/EditorPreferences.cpp b/src/editor/EditorPreferences.cpp index 362a0fa4..3d23caca 100644 --- a/src/editor/EditorPreferences.cpp +++ b/src/editor/EditorPreferences.cpp @@ -1,4 +1,5 @@ #include "editor/EditorPreferences.hpp" +#include "editor/EditorShortcuts.hpp" #include #include @@ -102,6 +103,8 @@ EditorPreferences EditorPreferences::load() { readBoolField(json, "show_fps_status_bar", prefs.showFPSInStatusBar); readBoolField(json, "confirm_scene_close", prefs.confirmOnSceneClose); readBoolField(json, "reopen_last_scene", prefs.reopenLastSceneOnStartup); + readStringField(json, "keymap", prefs.keymap); + EditorShortcuts::instance().deserialize(prefs.keymap); return prefs; } @@ -134,7 +137,8 @@ bool EditorPreferences::save() const { file << " \"viewport_anti_alias\": " << viewportAntiAlias << ",\n"; file << " \"show_fps_status_bar\": " << (showFPSInStatusBar ? "true" : "false") << ",\n"; file << " \"confirm_scene_close\": " << (confirmOnSceneClose ? "true" : "false") << ",\n"; - file << " \"reopen_last_scene\": " << (reopenLastSceneOnStartup ? "true" : "false") << "\n"; + file << " \"reopen_last_scene\": " << (reopenLastSceneOnStartup ? "true" : "false") << ",\n"; + file << " \"keymap\": \"" << EditorShortcuts::instance().serialize() << "\"\n"; file << "}\n"; return file.good(); } diff --git a/src/editor/EditorPreferences.hpp b/src/editor/EditorPreferences.hpp index 67c338d1..fbb9ea62 100644 --- a/src/editor/EditorPreferences.hpp +++ b/src/editor/EditorPreferences.hpp @@ -33,6 +33,7 @@ struct EditorPreferences { bool showFPSInStatusBar = true; bool confirmOnSceneClose = true; bool reopenLastSceneOnStartup = true; + std::string keymap; static std::filesystem::path preferencesPath(); static EditorPreferences load(); diff --git a/src/editor/EditorShortcuts.hpp b/src/editor/EditorShortcuts.hpp new file mode 100644 index 00000000..2fd95d48 --- /dev/null +++ b/src/editor/EditorShortcuts.hpp @@ -0,0 +1,235 @@ +#pragma once + +#include "core/Types.hpp" + +#include +#include + +#ifdef CF_HAS_IMGUI +#include +#endif + +namespace Caffeine::Editor { + +enum class Shortcut : u8 { + GizmoTranslate, + GizmoRotate, + GizmoScale, + CameraForward, + CameraBack, + CameraLeft, + CameraRight, + Save, + NewScene, + Undo, + Redo, + Copy, + Paste, + Duplicate, + CommandPalette, + CommandPaletteAlt, + DeleteSelection, + Count +}; + +struct ShortcutBinding { + int key = 0; + bool ctrl = false; + bool shift = false; +}; + +class EditorShortcuts { +public: + static EditorShortcuts& instance() { + static EditorShortcuts shortcuts; + return shortcuts; + } + + ShortcutBinding& binding(Shortcut id) { return m_bindings[static_cast(id)]; } + const ShortcutBinding& binding(Shortcut id) const { return m_bindings[static_cast(id)]; } + + static const char* label(Shortcut id) { + switch (id) { + case Shortcut::GizmoTranslate: return "Move"; + case Shortcut::GizmoRotate: return "Rotate"; + case Shortcut::GizmoScale: return "Scale"; + case Shortcut::CameraForward: return "Camera Forward"; + case Shortcut::CameraBack: return "Camera Back"; + case Shortcut::CameraLeft: return "Camera Left"; + case Shortcut::CameraRight: return "Camera Right"; + case Shortcut::Save: return "Save"; + case Shortcut::NewScene: return "New Scene"; + case Shortcut::Undo: return "Undo"; + case Shortcut::Redo: return "Redo"; + case Shortcut::Copy: return "Copy"; + case Shortcut::Paste: return "Paste"; + case Shortcut::Duplicate: return "Duplicate"; + case Shortcut::CommandPalette: return "Quick Search"; + case Shortcut::CommandPaletteAlt: return "Quick Search (alt)"; + case Shortcut::DeleteSelection: return "Delete Selection"; + case Shortcut::Count: break; + } + return ""; + } + + const char* chord(Shortcut id) const { + static char text[64]; + text[0] = '\0'; +#ifdef CF_HAS_IMGUI + const ShortcutBinding& item = binding(id); + if (item.key == ImGuiKey_None) { + std::snprintf(text, sizeof(text), "—"); + return text; + } + std::snprintf(text, sizeof(text), "%s%s%s", + item.ctrl ? "Ctrl+" : "", + item.shift ? "Shift+" : "", + ImGui::GetKeyName(static_cast(item.key))); +#else + (void)id; +#endif + return text; + } + + bool pressed(Shortcut id) const { +#ifdef CF_HAS_IMGUI + const ShortcutBinding& item = binding(id); + if (item.key == ImGuiKey_None) return false; + const ImGuiIO& io = ImGui::GetIO(); + if (!item.ctrl && io.WantTextInput) return false; + if (item.ctrl != io.KeyCtrl || item.shift != io.KeyShift) return false; + return ImGui::IsKeyPressed(static_cast(item.key)); +#else + (void)id; + return false; +#endif + } + + bool down(Shortcut id) const { +#ifdef CF_HAS_IMGUI + const ShortcutBinding& item = binding(id); + if (item.key == ImGuiKey_None) return false; + const ImGuiIO& io = ImGui::GetIO(); + if (io.WantTextInput) return false; + if (item.ctrl != io.KeyCtrl) return false; + return ImGui::IsKeyDown(static_cast(item.key)); +#else + (void)id; + return false; +#endif + } + + void beginCapture(Shortcut id) { m_capture = static_cast(id); } + bool capturing(Shortcut id) const { return m_capture == static_cast(id); } + bool isCapturing() const { return m_capture >= 0; } + + bool pollCapture() { +#ifdef CF_HAS_IMGUI + if (m_capture < 0) return false; + if (ImGui::IsKeyPressed(ImGuiKey_Escape)) { + m_capture = -1; + return false; + } + const ImGuiIO& io = ImGui::GetIO(); + for (int key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; ++key) { + if (key == ImGuiKey_LeftCtrl || key == ImGuiKey_RightCtrl || + key == ImGuiKey_LeftShift || key == ImGuiKey_RightShift || + key == ImGuiKey_LeftAlt || key == ImGuiKey_RightAlt || + key == ImGuiKey_Escape) { + continue; + } + if (!ImGui::IsKeyPressed(static_cast(key))) continue; + ShortcutBinding& item = m_bindings[m_capture]; + item.key = key; + item.ctrl = io.KeyCtrl; + item.shift = io.KeyShift; + for (int other = 0; other < static_cast(Shortcut::Count); ++other) { + if (other == m_capture) continue; + ShortcutBinding& taken = m_bindings[other]; + if (taken.key == item.key && taken.ctrl == item.ctrl && taken.shift == item.shift) { + taken.key = ImGuiKey_None; + } + } + m_capture = -1; + return true; + } +#else + (void)0; +#endif + return false; + } + + void resetDefaults() { + for (ShortcutBinding& item : m_bindings) item = {}; +#ifdef CF_HAS_IMGUI + auto set = [this](Shortcut id, ImGuiKey key, bool ctrl, bool shift) { + ShortcutBinding& item = binding(id); + item.key = key; + item.ctrl = ctrl; + item.shift = shift; + }; + set(Shortcut::GizmoTranslate, ImGuiKey_T, false, false); + set(Shortcut::GizmoRotate, ImGuiKey_R, false, false); + set(Shortcut::GizmoScale, ImGuiKey_E, false, false); + set(Shortcut::CameraForward, ImGuiKey_W, false, false); + set(Shortcut::CameraBack, ImGuiKey_S, false, false); + set(Shortcut::CameraLeft, ImGuiKey_A, false, false); + set(Shortcut::CameraRight, ImGuiKey_D, false, false); + set(Shortcut::Save, ImGuiKey_S, true, false); + set(Shortcut::NewScene, ImGuiKey_N, true, false); + set(Shortcut::Undo, ImGuiKey_Z, true, false); + set(Shortcut::Redo, ImGuiKey_Y, true, false); + set(Shortcut::Copy, ImGuiKey_C, true, false); + set(Shortcut::Paste, ImGuiKey_V, true, false); + set(Shortcut::Duplicate, ImGuiKey_D, true, false); + set(Shortcut::CommandPalette, ImGuiKey_L, true, false); + set(Shortcut::CommandPaletteAlt, ImGuiKey_P, true, true); + set(Shortcut::DeleteSelection, ImGuiKey_Delete, false, false); +#endif + m_capture = -1; + } + + std::string serialize() const { + std::string out; + for (int i = 0; i < static_cast(Shortcut::Count); ++i) { + const ShortcutBinding& item = m_bindings[i]; + out += std::to_string(item.key); + out += ':'; + out += item.ctrl ? '1' : '0'; + out += ':'; + out += item.shift ? '1' : '0'; + out += ';'; + } + return out; + } + + void deserialize(const std::string& text) { + if (text.empty()) return; + resetDefaults(); + int index = 0; + size_t cursor = 0; + while (index < static_cast(Shortcut::Count) && cursor < text.size()) { + const size_t end = text.find(';', cursor); + const std::string token = text.substr(cursor, end == std::string::npos ? std::string::npos : end - cursor); + int key = 0; + int ctrl = 0; + int shift = 0; + if (std::sscanf(token.c_str(), "%d:%d:%d", &key, &ctrl, &shift) == 3) { + m_bindings[index].key = key; + m_bindings[index].ctrl = ctrl != 0; + m_bindings[index].shift = shift != 0; + } + ++index; + if (end == std::string::npos) break; + cursor = end + 1; + } + } + +private: + EditorShortcuts() { resetDefaults(); } + + ShortcutBinding m_bindings[static_cast(Shortcut::Count)]{}; + int m_capture = -1; +}; + +} // namespace Caffeine::Editor diff --git a/src/editor/EffectEditorPanel.cpp b/src/editor/EffectEditorPanel.cpp index dd5547e5..6ccef6b4 100644 --- a/src/editor/EffectEditorPanel.cpp +++ b/src/editor/EffectEditorPanel.cpp @@ -159,19 +159,19 @@ void EffectEditorPanel::onImGuiRender(EditorContext& ctx) { bool enabled = selected->enabled != 0; if (ImGui::Checkbox("Enabled", &enabled)) { selected->enabled = enabled ? 1 : 0; - ctx.isDirty = true; + ctx.markDirty(); } const char* spaces[] = {"World", "Camera"}; int space = static_cast(selected->space); if (ImGui::Combo("Space", &space, spaces, 2)) { selected->space = static_cast(space); - ctx.isDirty = true; + ctx.markDirty(); } const char* qualities[] = {"Performance", "Balanced", "Quality"}; int quality = static_cast(selected->quality); if (ImGui::Combo("Quality", &quality, qualities, 3)) { selected->quality = static_cast(quality); - ctx.isDirty = true; + ctx.markDirty(); } const Effects::EffectKind kind = static_cast(selected->kind); @@ -185,79 +185,79 @@ void EffectEditorPanel::onImGuiRender(EditorContext& ctx) { Effects::configureVolumetricLight(*selected, static_cast(shape)); selected->lightColor = color; Effects::adoptVolumetricMesh(*world, selectedEntity, *selected); - ctx.isDirty = true; + ctx.markDirty(); } ImGui::TextDisabled("The volume is the mesh. Move, rotate and scale it."); const Effects::VolumetricShape volume = Effects::volumetricShapeOf(*selected); if (volume == Effects::VolumetricShape::Sphere) { if (dragFloat("Radius", selected->radius, 0.05f, 0.1f, 40.0f)) { pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } } else { if (dragFloat("Length", selected->radius, 0.05f, 0.2f, 40.0f)) { pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } if (volume == Effects::VolumetricShape::Cone) { f32 baseRadius = selected->endSize * 0.5f; if (dragFloat("Radius", baseRadius, 0.01f, 0.05f, 12.0f)) { selected->endSize = baseRadius * 2.0f; pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } } else if (volume == Effects::VolumetricShape::Cylinder) { if (dragFloat("Diameter", selected->startSize, 0.01f, 0.05f, 8.0f)) { selected->endSize = selected->startSize; pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } } else { if (dragFloat("Width", selected->startSize, 0.01f, 0.05f, 12.0f)) { pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } if (dragFloat("Height", selected->endSize, 0.01f, 0.05f, 12.0f)) { pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } } } - if (dragFloat("Density", selected->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Anisotropy", &selected->anisotropy, 0.0f, 0.9f)) ctx.isDirty = true; - if (dragFloat("Intensity", selected->intensity, 0.05f, 0.0f, 16.0f)) ctx.isDirty = true; - if (ImGui::ColorEdit3("Light", &selected->lightColor.x)) ctx.isDirty = true; + if (dragFloat("Density", selected->density, 0.005f, 0.0f, 2.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Anisotropy", &selected->anisotropy, 0.0f, 0.9f)) ctx.markDirty(); + if (dragFloat("Intensity", selected->intensity, 0.05f, 0.0f, 16.0f)) ctx.markDirty(); + if (ImGui::ColorEdit3("Light", &selected->lightColor.x)) ctx.markDirty(); } else if (kind == Effects::EffectKind::Fog) { int style = static_cast(selected->pad0 > 3 ? 0 : selected->pad0); if (ImGui::Combo("Look", &style, styles, 4)) { const auto domain = static_cast(selected->domain); Effects::configureFog(*selected, domain, static_cast(style)); - ctx.isDirty = true; + ctx.markDirty(); } int domain = static_cast(selected->domain); const char* domains[] = {"2D and 3D", "2D", "3D"}; if (ImGui::Combo("Domain", &domain, domains, 3)) { selected->domain = static_cast(domain); - ctx.isDirty = true; + ctx.markDirty(); } - if (dragFloat("Radius", selected->radius, 0.05f, 0.1f, 40.0f)) ctx.isDirty = true; - if (dragFloat("Density", selected->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; - if (dragFloat("Intensity", selected->intensity, 0.02f, 0.0f, 4.0f)) ctx.isDirty = true; - if (ImGui::ColorEdit3("Color", &selected->lightColor.x)) ctx.isDirty = true; + if (dragFloat("Radius", selected->radius, 0.05f, 0.1f, 40.0f)) ctx.markDirty(); + if (dragFloat("Density", selected->density, 0.005f, 0.0f, 2.0f)) ctx.markDirty(); + if (dragFloat("Intensity", selected->intensity, 0.02f, 0.0f, 4.0f)) ctx.markDirty(); + if (ImGui::ColorEdit3("Color", &selected->lightColor.x)) ctx.markDirty(); } else if (kind == Effects::EffectKind::ReflectiveSurface) { - if (ImGui::SliderFloat("Reflection", &selected->reflection, 0.0f, 1.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Roughness", &selected->roughness, 0.02f, 1.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Metallic", &selected->metallic, 0.0f, 1.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Reflection", &selected->reflection, 0.0f, 1.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Roughness", &selected->roughness, 0.02f, 1.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Metallic", &selected->metallic, 0.0f, 1.0f)) ctx.markDirty(); } else if (kind == Effects::EffectKind::MaterialShade) { - if (ImGui::ColorEdit3("Tint", &selected->tint.x)) ctx.isDirty = true; - if (dragFloat("Emission", selected->emissionBoost, 0.05f, 0.0f, 8.0f)) ctx.isDirty = true; - if (dragFloat("Roughness Bias", selected->roughnessBias, 0.01f, -1.0f, 1.0f)) ctx.isDirty = true; + if (ImGui::ColorEdit3("Tint", &selected->tint.x)) ctx.markDirty(); + if (dragFloat("Emission", selected->emissionBoost, 0.05f, 0.0f, 8.0f)) ctx.markDirty(); + if (dragFloat("Roughness Bias", selected->roughnessBias, 0.01f, -1.0f, 1.0f)) ctx.markDirty(); } if (ImGui::Button("Delete Effect")) { ctx.beginUndo(EditorCommand::RemoveEntity, selectedEntity.id(), *world); world->destroy(selectedEntity); - ctx.isDirty = true; + ctx.markDirty(); ctx.endUndo(*world); } ImGui::End(); diff --git a/src/editor/EffectObjectFactory.hpp b/src/editor/EffectObjectFactory.hpp index ddcc3094..4f9cb1a8 100644 --- a/src/editor/EffectObjectFactory.hpp +++ b/src/editor/EffectObjectFactory.hpp @@ -27,7 +27,7 @@ inline ECS::Entity spawnEffectObject(ECS::World& world, EditorContext& ctx, cons } } ctx.selectEntity(entity); - ctx.isDirty = true; + ctx.markDirty(); ctx.endUndo(world); return entity; } diff --git a/src/editor/EntityPresetPackages.cpp b/src/editor/EntityPresetPackages.cpp index 799cbd1d..540dc777 100644 --- a/src/editor/EntityPresetPackages.cpp +++ b/src/editor/EntityPresetPackages.cpp @@ -237,6 +237,12 @@ void scanEntityPresetPackages(const std::filesystem::path& rootDirectory, for (auto& preset : loaded.presets) { if (preset.source.empty()) preset.source = sourceLabel; + if (sourceLabel == "plugin" && preset.plugin.empty()) { + const auto relative = std::filesystem::relative(entry.path(), rootDirectory, ec); + if (!relative.empty() && relative.begin() != relative.end()) { + preset.plugin = relative.begin()->string(); + } + } registry.registerPreset(std::move(preset)); } } diff --git a/src/editor/EntityPresetTypes.hpp b/src/editor/EntityPresetTypes.hpp index 6295a984..ad6f41fe 100644 --- a/src/editor/EntityPresetTypes.hpp +++ b/src/editor/EntityPresetTypes.hpp @@ -67,6 +67,8 @@ struct EntityPresetDescriptor { std::string category; std::string defaultEntityName = "New Entity"; std::string source = "builtin"; + /// Plugin library stem when the preset came from plugins/. Empty = always visible. + std::string plugin; bool builtIn = true; std::filesystem::path packageRoot; diff --git a/src/editor/EntityPresetsPanel.cpp b/src/editor/EntityPresetsPanel.cpp index a0cf9734..6c907e0f 100644 --- a/src/editor/EntityPresetsPanel.cpp +++ b/src/editor/EntityPresetsPanel.cpp @@ -1,5 +1,6 @@ #include "editor/EntityPresetsPanel.hpp" #include "editor/EntityPresetRegistry.hpp" +#include "editor/PluginSystem.hpp" #include "editor/EditorPanelUtils.hpp" #ifdef CF_HAS_IMGUI @@ -22,6 +23,11 @@ void EntityPresetsPanel::createSelectedPreset(ECS::World& world, EditorContext& m_statusIsError = true; return; } + if (!PluginManager::instance().isContributionEnabled(preset->plugin)) { + m_statusMessage = "That preset belongs to a disabled plugin."; + m_statusIsError = true; + return; + } if (m_projectRoot.empty()) { m_statusMessage = "Open a project before creating presets."; m_statusIsError = true; @@ -76,6 +82,7 @@ void EntityPresetsPanel::renderPresetList() { } for (const auto* preset : presets) { + if (!PluginManager::instance().isContributionEnabled(preset->plugin)) continue; const bool selected = (m_selectedPresetId == preset->id); if (ImGui::Selectable(preset->displayName.c_str(), selected)) { selectPreset(preset->id); diff --git a/src/editor/GameplayPreviewPanel.cpp b/src/editor/GameplayPreviewPanel.cpp index 41007bbb..4eeb535a 100644 --- a/src/editor/GameplayPreviewPanel.cpp +++ b/src/editor/GameplayPreviewPanel.cpp @@ -13,6 +13,7 @@ #include "editor/EditorContext.hpp" #include "math/Mat4.hpp" #include "scene/EnvironmentSystem.hpp" +#include "scene/EnvironmentEffectsSystem.hpp" #include "scene/HierarchySystem.hpp" #include "scene/PlayMode2D.hpp" #include "render/SkyboxRenderer.hpp" @@ -109,6 +110,16 @@ void GameplayPreviewPanel::shutdown() { } void GameplayPreviewPanel::resizeCanvas(u32 width, u32 height) { + GpuCanvasLatch latch{m_width, m_height, m_pendingW, m_pendingH, m_stable}; + if (!latch.commit(width, height)) { + m_pendingW = latch.pendingW; + m_pendingH = latch.pendingH; + m_stable = latch.stable; + return; + } + m_pendingW = m_pendingH = m_stable = 0; + width = latch.width; + height = latch.height; if (!m_device || width < 1 || height < 1) return; if (m_width == width && m_height == height && m_colorTarget && m_depthTarget) return; @@ -250,23 +261,28 @@ void GameplayPreviewPanel::render(ECS::World& world, EditorContext& ctx) { camera.proj = Mat4::perspective(camera.fovRad, aspect, camera.nearClip, camera.farClip); Render::GpuSceneRenderOptions previewOpts; - previewOpts.enableShadows = false; + previewOpts.enableShadows = Scene::environmentWantsShadows(world); previewOpts.wireframeMeshes = false; previewOpts.environmentPath.clear(); previewOpts.postProcessCamera = cameraEntity; previewOpts.renderScale = ctx.renderScale; previewOpts.deltaTime = ImGui::GetIO().DeltaTime; + previewOpts.viewId = 3; + if (Scene::environmentHasOverride(world)) { + previewOpts.overrideAmbient = true; + previewOpts.ambientColor = Scene::environmentAmbientAt(world, position); + } - const bool camChanged = (position - m_lastCamPos).length() > 0.001f - || (forward - m_lastCamForward).length() > 0.001f - || std::abs(camera.fovRad - m_lastFovRad) > 0.001f; - const bool sizeChanged = targetW != m_lastTargetW || targetH != m_lastTargetH; - const u64 sceneStamp = editorSceneContentStamp(world); + const bool camChanged = (position - m_lastCamPos).length() > 0.0005f + || (forward - m_lastCamForward).length() > 0.0005f + || std::abs(camera.fovRad - m_lastFovRad) > 0.0005f; + const bool sizeChanged = m_width != m_lastTargetW || m_height != m_lastTargetH; + const u64 sceneStamp = editorSceneContentStamp(world) ^ (ctx.visualRevision * 0xD1B54A32D192ED03ull); const bool sceneChanged = sceneStamp != m_lastSceneStamp; - const u32 gpuInterval = (camChanged || sceneChanged) ? 1u : 2u; + // TAA needs every frame. Skipping left the jittered projection on screen. const bool rerunGpu = (camChanged || sizeChanged || sceneChanged || !m_hasGpuFrame || ctx.isPlayMode || m_renderer.needsAnotherFrame()) - && editorPanelWorthGpuRender(origin, panelSize, gpuInterval); + && editorPanelWorthGpuRender(origin, panelSize, 1u); if (rerunGpu) { m_renderer.renderWithCamera(m_frameCmd, world, camera, m_colorTarget, m_depthTarget, @@ -274,8 +290,8 @@ void GameplayPreviewPanel::render(ECS::World& world, EditorContext& ctx) { m_lastCamPos = position; m_lastCamForward = forward; m_lastFovRad = camera.fovRad; - m_lastTargetW = targetW; - m_lastTargetH = targetH; + m_lastTargetW = m_width; + m_lastTargetH = m_height; m_lastSceneStamp = sceneStamp; m_hasGpuFrame = true; } diff --git a/src/editor/GameplayPreviewPanel.hpp b/src/editor/GameplayPreviewPanel.hpp index 465ebf16..22b990f4 100644 --- a/src/editor/GameplayPreviewPanel.hpp +++ b/src/editor/GameplayPreviewPanel.hpp @@ -43,6 +43,9 @@ class GameplayPreviewPanel { RHI::Texture* m_depthTarget = nullptr; u32 m_width = 0; u32 m_height = 0; + u32 m_pendingW = 0; + u32 m_pendingH = 0; + u32 m_stable = 0; Render::GpuSceneRenderer m_renderer; bool m_ready = false; Vec3 m_lastCamPos{}; diff --git a/src/editor/HierarchyPanel.cpp b/src/editor/HierarchyPanel.cpp index 6517b3d8..81ff3764 100644 --- a/src/editor/HierarchyPanel.cpp +++ b/src/editor/HierarchyPanel.cpp @@ -8,14 +8,34 @@ #include "ecs/TerrainComponents.hpp" #include "ecs/LightComponents.hpp" #include "ecs/SkyboxComponents.hpp" +#include "ecs/EnvironmentEffectsComponents.hpp" +#include "ecs/ForwardRenderComponents.hpp" +#include "ecs/PostProcessComponents.hpp" +#include "render/RenderFeatures.hpp" #include "ecs/CameraComponents.hpp" #include "ecs/Components3D.hpp" +#include "ecs/Components.hpp" +#include "ecs/MeshComponents.hpp" +#include "ecs/MeshGeometry.hpp" +#include "ecs/PrefabComponents.hpp" +#include "ecs/ProceduralComponents.hpp" +#include "ecs/TerrainComponents.hpp" +#include "audio/AudioComponents.hpp" +#include "animation/AnimationComponents.hpp" +#include "animation/AnimationPlayer.hpp" +#include "animation/SkinLibrary.hpp" +#include "effects/EffectTypes.hpp" +#include "navigation/NavVolume.hpp" +#include "physics/PhysicsComponents3D.hpp" +#include "script/ScriptTypes.hpp" +#include "ui/UIComponents.hpp" #include "scene/LightingSystem.hpp" #include "math/Quat.hpp" #include "terrain/TerrainCache.hpp" #include #include #include +#include #ifdef CF_HAS_IMGUI @@ -303,22 +323,104 @@ void HierarchyPanel::renderEntityNode(ECS::Entity entity) { } } -void HierarchyPanel::duplicateEntity(ECS::World& world, ECS::Entity src) { - if (!src.isValid()) return; +namespace { - m_context->beginUndo(EditorCommand::AddEntity, u32_max, world); - ECS::Entity dst = world.create(); +template +void copyComponent(ECS::World& world, ECS::Entity src, ECS::Entity dst) { + if (const T* component = world.get(src)) { + world.add(dst, *component); + } +} +ECS::Entity duplicateEntityTree(ECS::World& world, ECS::Entity src, ECS::Entity newParent, + bool offsetRoot) { + ECS::Entity dst = world.create(); char newName[128]; std::snprintf(newName, sizeof(newName), "%s (Copy)", getEntityName(world, src)); setEntityName(world, dst, newName); - if (auto* c = world.get(src)) { auto& d = world.add(dst); d = *c; } - if (auto* c = world.get(src)) { auto& d = world.add(dst); d = *c; } - if (auto* c = world.get(src)) { auto& d = world.add(dst); d = *c; } - if (auto* c = world.get(src)) { auto& d = world.add(dst); d = *c; } + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + copyComponent(world, src, dst); + + if (offsetRoot) { + if (auto* p = world.get(dst)) p->position.x += 1.0f; + if (auto* t = world.get(dst)) t->position.x += 1.0f; + } + + if (newParent.isValid()) { + world.add(dst).parent = newParent; + } else if (const Scene::Parent* parent = world.get(src)) { + world.add(dst, *parent); + } + + ECS::ComponentQuery children; + children.with(); + std::vector kids; + world.forEach(children, [&](ECS::Entity child, Scene::Parent& link) { + if (link.parent == src) kids.push_back(child); + }); + for (ECS::Entity child : kids) { + duplicateEntityTree(world, child, dst, false); + } + return dst; +} + +} // namespace +void HierarchyPanel::duplicateEntity(ECS::World& world, ECS::Entity src) { + if (!src.isValid()) return; + m_context->beginUndo(EditorCommand::AddEntity, u32_max, world); + const ECS::Entity dst = duplicateEntityTree(world, src, ECS::Entity::INVALID, true); m_context->selectEntity(dst); + m_context->markDirty(); m_context->endUndo(world); } @@ -471,6 +573,25 @@ void HierarchyPanel::createEntityWithType(ECS::World& world, const char* name, c world.add(e, sky); world.add(e); } + else if (strcmp(componentType, "EnvironmentEffects") == 0) { + world.add(e); + world.add(e); + world.add(e); + world.add(e); + auto& features = world.add(e); + features.ibl.enabled = false; + features.occlusion.enabled = true; + features.volumetrics.enabled = true; + features.volumetrics.quality = Render::VolumetricQuality::High; + features.volumetrics.sampleShadows = true; + features.volumetrics.density = 0.045f; + features.volumetrics.height = 80.0f; + features.volumetrics.anisotropy = 0.62f; + auto& post = world.add(e); + post.ambientOcclusion.enabled = true; + post.ambientOcclusion.intensity = 1.1f; + post.ambientOcclusion.radius = 0.55f; + } else if (strcmp(componentType, "Terrain") == 0) { world.add(e); world.add(e); @@ -578,6 +699,8 @@ void HierarchyPanel::renderCreateEntityMenuItems() { if (ImGui::BeginMenu("Environment")) { if (ImGui::MenuItem("Skybox")) createEntityWithType(*m_world, "Skybox", "Skybox"); + if (ImGui::MenuItem("Environment Effects")) + createEntityWithType(*m_world, "Environment Effects", "EnvironmentEffects"); if (ImGui::MenuItem("Terrain")) createEntityWithType(*m_world, "Terrain", "Terrain"); ImGui::EndMenu(); } diff --git a/src/editor/HudEditorPanel.cpp b/src/editor/HudEditorPanel.cpp index 4d0da926..d19c4d2d 100644 --- a/src/editor/HudEditorPanel.cpp +++ b/src/editor/HudEditorPanel.cpp @@ -147,7 +147,7 @@ void HudEditorPanel::onImGuiRender(EditorContext& ctx) { parentWidget(*world, entity, parent); } ctx.selectEntity(entity); - ctx.isDirty = true; + ctx.markDirty(); ctx.endUndo(*world); layout.layout(*world); }; @@ -231,8 +231,8 @@ void HudEditorPanel::onImGuiRender(EditorContext& ctx) { finishCreate(box, parent); } - ImGui::TextDisabled("Arrasta para mover. O canto inferior direito redimensiona. Cores e texto ficam no inspector."); - ImGui::TextDisabled("Cliques e valores continuam em Lua (caffeine.ui) ou em C++ (UISystem)."); + ImGui::TextDisabled("Drag to move. The bottom-right corner resizes. Colors and text live in the inspector."); + ImGui::TextDisabled("Clicks and values stay in Lua (caffeine.ui) or C++ (UISystem)."); const float listWidth = 200.0f; ImGui::BeginChild("hud_list", ImVec2(listWidth, 0.0f), true); @@ -312,7 +312,7 @@ void HudEditorPanel::onImGuiRender(EditorContext& ctx) { const Vec2 canvasDelta{delta.x / scaleX, delta.y / scaleY}; if (m_resizing) resizeWidget(*widget, canvasDelta); else moveWidget(*widget, canvasDelta); - ctx.isDirty = true; + ctx.markDirty(); layout.layout(*world); } } @@ -359,7 +359,7 @@ void HudEditorPanel::onImGuiRender(EditorContext& ctx) { ctx.beginUndo(EditorCommand::RemoveEntity, ctx.selectedEntity.id(), *world); world->destroy(ctx.selectedEntity); ctx.selectEntity(ECS::Entity::INVALID); - ctx.isDirty = true; + ctx.markDirty(); ctx.endUndo(*world); } diff --git a/src/editor/ImGuiGpuTexture.hpp b/src/editor/ImGuiGpuTexture.hpp index 9092ae45..b867e036 100644 --- a/src/editor/ImGuiGpuTexture.hpp +++ b/src/editor/ImGuiGpuTexture.hpp @@ -3,8 +3,12 @@ #ifdef CF_HAS_IMGUI #ifdef CF_HAS_SDL3 +#include "core/Types.hpp" + #include #include +#include +#include #include #include @@ -24,9 +28,54 @@ inline ImVec2 imguiFramebufferSize(ImVec2 logicalSize, int maxDim = 1920) { w *= shrink; h *= shrink; } + // Even pixels keep TAA jitter symmetric and stop 1px HiDPI flicker from reallocating. + w = std::max(8.0f, std::floor(w * 0.5f) * 2.0f); + h = std::max(8.0f, std::floor(h * 0.5f) * 2.0f); return ImVec2(w, h); } +/// Holds the GPU canvas at the last settled size so a live window drag does not +/// rebuild HDR / TAA / probe targets every pixel. +struct GpuCanvasLatch { + u32 width = 0; + u32 height = 0; + u32 pendingW = 0; + u32 pendingH = 0; + u32 stable = 0; + + static u32 snap(u32 value) { return value < 8u ? 8u : (value & ~1u); } + + bool commit(u32 wantedW, u32 wantedH, u32 settleFrames = 8) { + wantedW = snap(wantedW); + wantedH = snap(wantedH); + if (width == 0 || height == 0) { + width = wantedW; + height = wantedH; + pendingW = pendingH = 0; + stable = 0; + return true; + } + if (wantedW == width && wantedH == height) { + pendingW = pendingH = 0; + stable = 0; + return false; + } + if (wantedW == pendingW && wantedH == pendingH) { + ++stable; + } else { + pendingW = wantedW; + pendingH = wantedH; + stable = 1; + } + if (stable < settleFrames) return false; + width = wantedW; + height = wantedH; + pendingW = pendingH = 0; + stable = 0; + return true; + } +}; + /// Releases GPU backing for a user-owned ImTextureData (sprites, icons, previews). inline void destroyImGuiTexture(std::unique_ptr& texture) { if (!texture) return; diff --git a/src/editor/InspectorPanel.cpp b/src/editor/InspectorPanel.cpp index 5ba50a26..0eedaef0 100644 --- a/src/editor/InspectorPanel.cpp +++ b/src/editor/InspectorPanel.cpp @@ -1,7 +1,9 @@ #include "editor/InspectorPanel.hpp" +#include "editor/PluginSystem.hpp" #include #include +#include #include "editor/EntitySnapshotExport.hpp" #include "editor/EditorPanelUtils.hpp" #include "editor/DragDropSystem.hpp" @@ -21,11 +23,13 @@ #include "effects/EffectTypes.hpp" #include "navigation/NavVolume.hpp" #include "assets/MeshCache.hpp" +#include "assets/MeshLoader.hpp" #include "assets/MeshMaterialExport.hpp" #include "editor/EditorPaths.hpp" #include "ecs/CameraComponents.hpp" #include "ecs/PostProcessComponents.hpp" #include "ecs/ForwardRenderComponents.hpp" +#include "ecs/EnvironmentEffectsComponents.hpp" #include "render/RenderFeatures.hpp" #include "editor/ComponentTypeRegistry.hpp" #include "ecs/TerrainComponents.hpp" @@ -150,6 +154,7 @@ void InspectorPanel::render(ECS::World& world, EditorContext& ctx) { drawUISlider(world, e, ctx); drawLight(world, e, ctx); drawSkybox(world, e, ctx); + drawEnvironmentEffects(world, e, ctx); drawTerrain(world, e, ctx); drawPostProcess(world, e, ctx); drawForwardRenderFeatures(world, e, ctx); @@ -172,12 +177,13 @@ void InspectorPanel::render(ECS::World& world, EditorContext& ctx) { const char* lastCategory = nullptr; for (const auto& entry : ComponentRegistry::instance().entries()) { if (entry.has(world, e)) continue; + if (!PluginManager::instance().isContributionEnabled(entry.plugin)) continue; if (m_addComponentSearch[0] != '\0') { - std::string lower = entry.name; + std::string haystack = entry.name + " " + entry.category + " " + entry.keywords; std::string query = m_addComponentSearch; - std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower); + std::transform(haystack.begin(), haystack.end(), haystack.begin(), ::tolower); std::transform(query.begin(), query.end(), query.begin(), ::tolower); - if (lower.find(query) == std::string::npos) continue; + if (haystack.find(query) == std::string::npos) continue; } if (!lastCategory || entry.category != lastCategory) { if (lastCategory) ImGui::Separator(); @@ -229,7 +235,7 @@ void InspectorPanel::drawTransform(ECS::World& world, ECS::Entity e, EditorConte } } else { if (Widgets::DragVec3("Rotation", t->rotation, 1.0f, -360.0f, 360.0f)) { changed = true; } - ImGui::Checkbox("Manter proporcao", &ctx.uniformScale); + ImGui::Checkbox("Keep proportions", &ctx.uniformScale); const Vec3 oldScale = t->scale; if (Widgets::DragVec3("Scale", t->scale, 0.05f, 0.01f, 100.0f)) { if (ctx.uniformScale) { @@ -261,7 +267,7 @@ void InspectorPanel::drawTransform(ECS::World& world, ECS::Entity e, EditorConte } PrefabSystem::RecordOverride(world, e, "Transform", "position", PrefabSystem::SerializeVec3(t->position)); - ctx.isDirty = true; + ctx.markDirty(); } } else if (auto* p3 = world.get(e)) { const bool posOverride = PrefabSystem::IsOverridden(world, e, "Position3D", "position"); @@ -269,7 +275,7 @@ void InspectorPanel::drawTransform(ECS::World& world, ECS::Entity e, EditorConte if (Widgets::DragVec3("Position", p3->position, 0.5f)) { PrefabSystem::RecordOverride(world, e, "Position3D", "position", PrefabSystem::SerializeVec3(p3->position)); - ctx.isDirty = true; + ctx.markDirty(); } if (posOverride) ImGui::PopStyleColor(); @@ -287,14 +293,14 @@ void InspectorPanel::drawTransform(ECS::World& world, ECS::Entity e, EditorConte eulerDeg.y * kDegToRad, eulerDeg.z * kDegToRad).normalized(); r3.quaternion = Vec4(q.x, q.y, q.z, q.w); - ctx.isDirty = true; + ctx.markDirty(); } Vec3 scale(1.0f, 1.0f, 1.0f); if (auto* s3 = world.get(e)) { scale = s3->scale; } - ImGui::Checkbox("Manter proporcao", &ctx.uniformScale); + ImGui::Checkbox("Keep proportions", &ctx.uniformScale); const Vec3 oldScale = scale; if (Widgets::DragVec3("Scale", scale, 0.05f, 0.01f, 100.0f)) { if (ctx.uniformScale) { @@ -308,7 +314,7 @@ void InspectorPanel::drawTransform(ECS::World& world, ECS::Entity e, EditorConte scale = oldScale * factor; } world.add(e).scale = scale; - ctx.isDirty = true; + ctx.markDirty(); } } } @@ -323,17 +329,17 @@ void InspectorPanel::drawSprite(ECS::World& world, ECS::Entity e, EditorContext& if (!Widgets::ComponentHeader("Sprite Renderer", enabled, removeRequested, "beer")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } auto* sprite = world.get(e); if (Widgets::AssetField(ctx, "Texture", sprite->name, ".png;.jpg;.bmp")) - ctx.isDirty = true; + ctx.markDirty(); int frame = static_cast(sprite->frameIndex); if (ImGui::DragInt("Frame", &frame, 1, 0, 1000)) { sprite->frameIndex = static_cast(frame > 0 ? frame : 0); - ctx.isDirty = true; + ctx.markDirty(); } } @@ -349,24 +355,24 @@ void InspectorPanel::drawCamera(ECS::World& world, ECS::Entity e, EditorContext& if (has2D) { bool enabled = true, removeRequested = false; if (!Widgets::ComponentHeader("Camera2D", enabled, removeRequested, "account")) return; - if (removeRequested) { world.remove(e); ctx.isDirty = true; return; } + if (removeRequested) { world.remove(e); ctx.markDirty(); return; } auto* cam = world.get(e); - if (ImGui::DragFloat("Zoom", &cam->zoom, 0.01f, 0.01f, 100.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Near Clip", &cam->nearClip, 0.01f, 0.001f, 10.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Far Clip", &cam->farClip, 1.0f, 1.0f, 10000.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Zoom", &cam->zoom, 0.01f, 0.01f, 100.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Near Clip", &cam->nearClip, 0.01f, 0.001f, 10.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Far Clip", &cam->farClip, 1.0f, 1.0f, 10000.0f)) ctx.markDirty(); } if (has3D) { bool enabled = true, removeRequested = false; if (!Widgets::ComponentHeader("Camera3D", enabled, removeRequested, "account")) return; - if (removeRequested) { world.remove(e); ctx.isDirty = true; return; } + if (removeRequested) { world.remove(e); ctx.markDirty(); return; } auto* cam = world.get(e); - if (ImGui::DragFloat("FOV", &cam->fov, 0.5f, 10.0f, 170.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Near Clip", &cam->nearClip, 0.01f, 0.001f, 10.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Far Clip", &cam->farClip, 1.0f, 1.0f, 10000.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Aspect", &cam->aspectRatio, 0.01f, 0.1f, 10.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("FOV", &cam->fov, 0.5f, 10.0f, 170.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Near Clip", &cam->nearClip, 0.01f, 0.001f, 10.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Far Clip", &cam->farClip, 1.0f, 1.0f, 10000.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Aspect", &cam->aspectRatio, 0.01f, 0.1f, 10.0f)) ctx.markDirty(); } } void InspectorPanel::drawRigidBody2D(ECS::World& world, ECS::Entity e, EditorContext& ctx) { @@ -377,32 +383,32 @@ void InspectorPanel::drawRigidBody2D(ECS::World& world, ECS::Entity e, EditorCon if (!Widgets::ComponentHeader("RigidBody2D", enabled, removeRequested, "arrows-vertical")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } auto* rb = world.get(e); ImGui::DragFloat("Mass", &rb->mass, 0.1f, 0.1f, 1000.0f, "%.2f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::DragFloat("Restitution", &rb->restitution, 0.01f, 0.0f, 1.0f, "%.2f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::DragFloat("Friction", &rb->friction, 0.01f, 0.0f, 1.0f, "%.2f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::DragFloat("Linear Damping", &rb->linearDamping, 0.01f, 0.0f, 1.0f, "%.2f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::Checkbox("Is Kinematic", &rb->isKinematic); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::Checkbox("Lock Rotation", &rb->lockRotation); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::Checkbox("Is Sleeping", &rb->isSleeping); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); } void InspectorPanel::drawRigidBody3D(ECS::World& world, ECS::Entity e, EditorContext& ctx) { if (!world.has(e)) return; @@ -412,25 +418,25 @@ void InspectorPanel::drawRigidBody3D(ECS::World& world, ECS::Entity e, EditorCon if (!Widgets::ComponentHeader("RigidBody3D", enabled, removeRequested, "arrows-vertical")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } auto* rb = world.get(e); ImGui::DragFloat("Mass", &rb->mass, 0.1f, 0.001f, 10000.0f, "%.2f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::DragFloat("Friction", &rb->friction, 0.01f, 0.0f, 1.0f, "%.2f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::DragFloat("Restitution", &rb->restitution, 0.01f, 0.0f, 1.0f, "%.2f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); const char* types[] = {"Dynamic", "Kinematic", "Static"}; int type = static_cast(rb->bodyType); if (ImGui::Combo("Body Type", &type, types, 3)) { rb->bodyType = static_cast(type); - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::Checkbox("Lock Rotation", &rb->lockRotation)) ctx.isDirty = true; + if (ImGui::Checkbox("Lock Rotation", &rb->lockRotation)) ctx.markDirty(); } void InspectorPanel::drawCollider3D(ECS::World& world, ECS::Entity e, EditorContext& ctx) { @@ -441,7 +447,7 @@ void InspectorPanel::drawCollider3D(ECS::World& world, ECS::Entity e, EditorCont if (!Widgets::ComponentHeader("Collider3D", enabled, removeRequested, "box")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -450,7 +456,7 @@ void InspectorPanel::drawCollider3D(ECS::World& world, ECS::Entity e, EditorCont int shape = static_cast(col->shape); if (ImGui::Combo("Shape", &shape, shapes, 3)) { col->shape = static_cast(shape); - ctx.isDirty = true; + ctx.markDirty(); } if (col->shape == Physics3D::ColliderShape3D::Sphere) { ImGui::DragFloat("Radius", &col->halfExtents.x, 0.01f, 0.01f, 100.0f, "%.2f"); @@ -460,8 +466,8 @@ void InspectorPanel::drawCollider3D(ECS::World& world, ECS::Entity e, EditorCont } else { ImGui::DragFloat3("Half Extents", &col->halfExtents.x, 0.01f, 0.01f, 100.0f, "%.2f"); } - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; - if (ImGui::Checkbox("Trigger", &col->isTrigger)) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); + if (ImGui::Checkbox("Trigger", &col->isTrigger)) ctx.markDirty(); } void InspectorPanel::drawAudioSource(ECS::World& world, ECS::Entity e, EditorContext& ctx) { @@ -472,7 +478,7 @@ void InspectorPanel::drawAudioSource(ECS::World& world, ECS::Entity e, EditorCon if (!Widgets::ComponentHeader("Audio Source", enabled, removeRequested, "bell")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -482,22 +488,22 @@ void InspectorPanel::drawAudioSource(ECS::World& world, ECS::Entity e, EditorCon ImGui::PushID("audio-clip"); if (Widgets::AssetField(ctx, "Clip", clipStr, ".wav;.ogg;.mp3")) { emitter->clipPath = clipStr.c_str(); - ctx.isDirty = true; + ctx.markDirty(); } ImGui::PopID(); ImGui::SliderFloat("Volume", &emitter->volume, 0.0f, 1.0f, "%.2f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::DragFloat("Max Distance", &emitter->maxDistance, 1.0f, 0.0f, 2000.0f, "%.0f"); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::Checkbox("Loop", &emitter->loop); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::Checkbox("Play on Spawn", &emitter->playOnSpawn); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); ImGui::Checkbox("Spatial", &emitter->spatial); - if (ImGui::IsItemDeactivatedAfterEdit()) ctx.isDirty = true; + if (ImGui::IsItemDeactivatedAfterEdit()) ctx.markDirty(); } void InspectorPanel::drawCollider2D(ECS::World& world, ECS::Entity e, EditorContext& ctx) { @@ -508,7 +514,7 @@ void InspectorPanel::drawCollider2D(ECS::World& world, ECS::Entity e, EditorCont if (!Widgets::ComponentHeader("Collider2D", enabled, removeRequested, "alert-square")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -519,7 +525,7 @@ void InspectorPanel::drawCollider2D(ECS::World& world, ECS::Entity e, EditorCont if (ImGui::Combo("Shape", &shapeIdx, shapes, 2)) { col->shape = (shapeIdx == 1) ? Physics2D::ColliderShape::Circle : Physics2D::ColliderShape::AABB; - ctx.isDirty = true; + ctx.markDirty(); } if (col->shape == Physics2D::ColliderShape::AABB) { @@ -527,11 +533,11 @@ void InspectorPanel::drawCollider2D(ECS::World& world, ECS::Entity e, EditorCont if (Widgets::DragVec2("Size", size, 0.01f, 0.01f, 2000.0f)) { col->size.x = size.x; col->size.y = size.y; - ctx.isDirty = true; + ctx.markDirty(); } } else { if (ImGui::DragFloat("Radius", &col->radius, 0.01f, 0.01f, 1000.0f)) { - ctx.isDirty = true; + ctx.markDirty(); } } @@ -539,17 +545,17 @@ void InspectorPanel::drawCollider2D(ECS::World& world, ECS::Entity e, EditorCont if (Widgets::DragVec2("Offset", offset, 0.5f)) { col->offset.x = offset.x; col->offset.y = offset.y; - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::Checkbox("Is Static", &col->isStatic)) ctx.isDirty = true; - if (ImGui::Checkbox("Is Trigger", &col->isTrigger)) ctx.isDirty = true; - if (ImGui::Checkbox("Is One Way", &col->isOneWay)) ctx.isDirty = true; + if (ImGui::Checkbox("Is Static", &col->isStatic)) ctx.markDirty(); + if (ImGui::Checkbox("Is Trigger", &col->isTrigger)) ctx.markDirty(); + if (ImGui::Checkbox("Is One Way", &col->isOneWay)) ctx.markDirty(); int layer = static_cast(col->layer); if (ImGui::DragInt("Layer", &layer, 1, 0, 31)) { col->layer = static_cast(layer); - ctx.isDirty = true; + ctx.markDirty(); } float colF[4] = { @@ -563,7 +569,7 @@ void InspectorPanel::drawCollider2D(ECS::World& world, ECS::Entity e, EditorCont col->debugColor[1] = static_cast(colF[1] * 255.0f); col->debugColor[2] = static_cast(colF[2] * 255.0f); col->debugColor[3] = static_cast(colF[3] * 255.0f); - ctx.isDirty = true; + ctx.markDirty(); } } @@ -578,7 +584,7 @@ void InspectorPanel::drawScript(ECS::World& world, ECS::Entity e, EditorContext& if (!Widgets::ComponentHeader("Script", enabled, removeRequested, "at")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -666,7 +672,7 @@ void InspectorPanel::drawPersistent(ECS::World& world, ECS::Entity e, EditorCont if (!Widgets::ComponentHeader("Persistent", enabled, removeRequested, "backup-restore")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -683,7 +689,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont if (!Widgets::ComponentHeader("Mesh Filter", enabled, removeRequested, "arrows-diagonal")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -693,7 +699,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont if (auto* renderer = world.get(e)) { renderer->materialPath = path; } - ctx.isDirty = true; + ctx.markDirty(); ctx.assetBrowserDirty = true; }; @@ -712,7 +718,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont effect->pad1 = static_cast(shape); } } - ctx.isDirty = true; + ctx.markDirty(); } if (mf->primitive != ECS::MeshPrimitive::Custom) { if (!world.has(e)) { @@ -721,7 +727,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont if (auto* scale = world.get(e)) { Widgets::setWidthForLabel("Shape Size"); if (ImGui::DragFloat3("Shape Size", &scale->scale.x, 0.05f, 0.01f, 1000.0f, "%.2f")) { - ctx.isDirty = true; + ctx.markDirty(); } ImGui::TextDisabled("Non-uniform scale stretches the primitive."); ImGui::TextDisabled("Viewport: Vertex, Edge and Face edit the geometry."); @@ -729,7 +735,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont } if (mf->primitive == ECS::MeshPrimitive::Custom) { if (Widgets::AssetField(ctx, "Mesh", mf->customMeshPath, ".obj;.fbx;.gltf;.glb")) { - ctx.isDirty = true; + ctx.markDirty(); if (mf->customMaterialPath.empty()) { const std::string projectRoot = resolveProjectRoot(ctx).string(); if (Assets::Mesh3D* mesh = @@ -745,14 +751,14 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont if (world.has(e)) { ImGui::TextDisabled("Texture managed by Terrain component"); } else if (Widgets::AssetField(ctx, "Albedo Texture", mf->customTexturePath, ".png;.jpg;.jpeg")) { - ctx.isDirty = true; + ctx.markDirty(); } if (!world.has(e)) { if (Widgets::AssetField(ctx, "Normal Map", mf->customNormalPath, ".png;.jpg;.jpeg")) { - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::SliderFloat("Shininess", &mf->shininess, 1.0f, 128.0f)) { - ctx.isDirty = true; + ctx.markDirty(); } } if (!world.has(e) && !mf->customTexturePath.empty()) { @@ -775,7 +781,7 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont } if (!textureFound) { ImGui::TextColored(ImVec4(1.0f, 0.35f, 0.35f, 1.0f), - "Textura nao encontrada: %s", mf->customTexturePath.c_str()); + "Texture not found: %s", mf->customTexturePath.c_str()); } } if (!mf->customMeshPath.empty() && ImGui::Button("Extract Materials")) { @@ -792,10 +798,10 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont if (!mf->customMeshPath.empty()) { const std::string ext = std::filesystem::path(mf->customMeshPath).extension().string(); if (ext == ".fbx" || ext == ".FBX") { - ImGui::TextDisabled("FBX requer export OBJ/glTF (mesmo nome) para preview."); + ImGui::TextDisabled("FBX needs an OBJ/glTF export (same name) for preview."); } if (ext == ".gltf" || ext == ".GLTF") { - ImGui::TextDisabled("glTF separado precisa do .bin e texturas na mesma pasta."); + ImGui::TextDisabled("A separate glTF needs the .bin and textures in the same folder."); } std::string projectRoot = resolveProjectRoot(ctx).string(); @@ -823,8 +829,8 @@ void InspectorPanel::drawMeshFilter(ECS::World& world, ECS::Entity e, EditorCont } if (auto* mr = world.get(e)) { ImGui::Separator(); - if (ImGui::Checkbox("Cast Shadows", &mr->castShadows)) ctx.isDirty = true; - if (ImGui::Checkbox("Receive Shadows", &mr->receiveShadows)) ctx.isDirty = true; + if (ImGui::Checkbox("Cast Shadows", &mr->castShadows)) ctx.markDirty(); + if (ImGui::Checkbox("Receive Shadows", &mr->receiveShadows)) ctx.markDirty(); } } @@ -837,7 +843,7 @@ void InspectorPanel::drawUIWidget(ECS::World& world, ECS::Entity e, EditorContex if (!Widgets::ComponentHeader("UI Widget", enabled, removeRequested, "align-left")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -867,7 +873,7 @@ void InspectorPanel::drawUIWidget(ECS::World& world, ECS::Entity e, EditorContex ImGui::DragFloat2("Text Align", &w->style.textAlignment.x, 0.01f, 0.0f, 1.0f); ImGui::TreePop(); } - ctx.isDirty = true; + ctx.markDirty(); } void InspectorPanel::drawUIButton(ECS::World& world, ECS::Entity e, EditorContext& ctx) { @@ -879,7 +885,7 @@ void InspectorPanel::drawUIButton(ECS::World& world, ECS::Entity e, EditorContex if (!Widgets::ComponentHeader("UI Button", enabled, removeRequested, "arrow-down-square")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -888,7 +894,7 @@ void InspectorPanel::drawUIButton(ECS::World& world, ECS::Entity e, EditorContex buf[sizeof(buf) - 1] = '\0'; if (ImGui::InputText("Label", buf, sizeof(buf))) { btn->labelText = buf; - ctx.isDirty = true; + ctx.markDirty(); } ImGui::ColorEdit4("Idle Color", &btn->idleColor.r); ImGui::ColorEdit4("Hover Color", &btn->hoverColor.r); @@ -905,7 +911,7 @@ void InspectorPanel::drawUILabel(ECS::World& world, ECS::Entity e, EditorContext if (!Widgets::ComponentHeader("UI Label", enabled, removeRequested, "align-left")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -914,7 +920,7 @@ void InspectorPanel::drawUILabel(ECS::World& world, ECS::Entity e, EditorContext buf[sizeof(buf) - 1] = '\0'; if (ImGui::InputTextMultiline("Text", buf, sizeof(buf), ImVec2(-1, 60))) { lbl->text = buf; - ctx.isDirty = true; + ctx.markDirty(); } ImGui::Checkbox("Word Wrap", &lbl->wordWrap); } @@ -928,7 +934,7 @@ void InspectorPanel::drawUIProgressBar(ECS::World& world, ECS::Entity e, EditorC if (!Widgets::ComponentHeader("UI Progress Bar", enabled, removeRequested, "arrows-horizontal")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -942,7 +948,7 @@ void InspectorPanel::drawUIProgressBar(ECS::World& world, ECS::Entity e, EditorC ? (pb->currentValue - pb->minValue) / (pb->maxValue - pb->minValue) : 0.0f; ImGui::ProgressBar(fraction, ImVec2(-1, 0)); - ctx.isDirty = true; + ctx.markDirty(); } void InspectorPanel::drawUISlider(ECS::World& world, ECS::Entity e, EditorContext& ctx) { @@ -954,7 +960,7 @@ void InspectorPanel::drawUISlider(ECS::World& world, ECS::Entity e, EditorContex if (!Widgets::ComponentHeader("UI Slider", enabled, removeRequested, "arrows-horizontal")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -962,7 +968,7 @@ void InspectorPanel::drawUISlider(ECS::World& world, ECS::Entity e, EditorContex ImGui::DragFloat("Max Value", &sl->maxValue, 1.0f); ImGui::SliderFloat("Value", &sl->currentValue, sl->minValue, sl->maxValue); ImGui::Checkbox("Snap To Int", &sl->snapToInt); - ctx.isDirty = true; + ctx.markDirty(); } std::filesystem::path InspectorPanel::resolveProjectRoot(const EditorContext& ctx) const { @@ -981,7 +987,7 @@ void InspectorPanel::drawCppScript(ECS::World& world, ECS::Entity e, EditorConte if (!Widgets::ComponentHeader("C++ Script", enabled, removeRequested, "at")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -1007,7 +1013,7 @@ void InspectorPanel::drawCppScript(ECS::World& world, ECS::Entity e, EditorConte csc->className = scriptNames[static_cast(current)]; csc->instance.reset(); csc->initialized = false; - ctx.isDirty = true; + ctx.markDirty(); } if (!csc->className.empty()) { @@ -1055,12 +1061,12 @@ void InspectorPanel::drawSkybox(ECS::World& world, ECS::Entity e, EditorContext& if (!Widgets::ComponentHeader("Skybox", enabled, removeRequested, "weather-sunny")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } if (enabled != sky->enabled) { sky->enabled = enabled; - ctx.isDirty = true; + ctx.markDirty(); } if (sky->customTexturePath[0] == '\0' && @@ -1070,7 +1076,7 @@ void InspectorPanel::drawSkybox(ECS::World& world, ECS::Entity e, EditorContext& const char* name = slash ? slash + 1 : file; const std::string relative = std::string("assets/raw/sky/") + name; std::strncpy(sky->customTexturePath, relative.c_str(), sizeof(sky->customTexturePath) - 1); - ctx.isDirty = true; + ctx.markDirty(); } std::string texture = sky->customTexturePath; @@ -1080,13 +1086,111 @@ void InspectorPanel::drawSkybox(ECS::World& world, ECS::Entity e, EditorContext& std::strncpy(sky->customTexturePath, texture.c_str(), sizeof(sky->customTexturePath) - 1); sky->customTexturePath[sizeof(sky->customTexturePath) - 1] = '\0'; if (sky->customTexturePath[0] == '\0') sky->presetIndex = -1; - ctx.isDirty = true; + ctx.markDirty(); } ImGui::PopID(); ImGui::TextDisabled("Empty texture uses the clear sky."); if (ImGui::DragFloat("Exposure", &sky->exposure, 0.01f, 0.0f, 8.0f, "%.2f")) { - ctx.isDirty = true; + ctx.markDirty(); + } +} + +void InspectorPanel::drawEnvironmentEffects(ECS::World& world, ECS::Entity e, EditorContext& ctx) { + ECS::EnvironmentEffectsComponent* fx = world.get(e); + if (!fx) return; + bool enabled = fx->enabled != 0; + bool removeRequested = false; + const bool open = Widgets::ComponentHeader("Environment Effects", enabled, removeRequested, "weather-sunny"); + if (enabled != (fx->enabled != 0)) { + fx->enabled = enabled ? 1 : 0; + ctx.markDirty(); + } + if (removeRequested) { + world.remove(e); + ctx.markDirty(); + return; + } + if (!open) return; + + const char* kinds[] = {"World Light Simulation"}; + int kind = static_cast(fx->kind); + if (ImGui::Combo("Effect", &kind, kinds, 1)) { + fx->kind = static_cast(kind); + ctx.markDirty(); + } + const char* modes[] = {"Day / Night", "Zone"}; + int mode = static_cast(fx->mode); + if (ImGui::Combo("Mode", &mode, modes, 2)) { + fx->mode = static_cast(mode); + ctx.markDirty(); + } + bool driveLights = fx->driveExistingLights != 0; + if (ImGui::Checkbox("Drive sun directional", &driveLights)) { + fx->driveExistingLights = driveLights ? 1 : 0; + ctx.markDirty(); + } + ImGui::TextDisabled("Day / Night uses one Directional Light as the sun. Other lights stay as fill."); + bool castShadows = fx->castShadows != 0; + if (ImGui::Checkbox("Cast Shadows", &castShadows)) { + fx->castShadows = castShadows ? 1 : 0; + ctx.markDirty(); + } + bool envLight = fx->environmentLighting != 0; + if (ImGui::Checkbox("Environment Lighting", &envLight)) { + fx->environmentLighting = envLight ? 1 : 0; + ctx.markDirty(); + } + bool ao = fx->ambientOcclusion != 0; + if (ImGui::Checkbox("Ambient Occlusion", &ao)) { + fx->ambientOcclusion = ao ? 1 : 0; + ctx.markDirty(); + } + bool volumes = fx->volumetricsEnabled != 0; + if (ImGui::Checkbox("Volumetrics", &volumes)) { + fx->volumetricsEnabled = volumes ? 1 : 0; + ctx.markDirty(); + } + ImGui::TextDisabled("Sky visibility %.0f%% · enclosed rooms kill sky fill.", + fx->skyVisibility * 100.0f); + if (fx->mode == static_cast(ECS::WorldLightMode::DayNight)) { + if (ImGui::SliderFloat("Time of Day", &fx->timeOfDay, 0.0f, 24.0f, "%.2f h")) ctx.markDirty(); + if (ImGui::DragFloat("Day Length", &fx->dayLengthSeconds, 1.0f, 0.0f, 3600.0f, "%.0f s")) { + ctx.markDirty(); + } + ImGui::TextDisabled("0 s = scrub only. Play advances the clock."); + if (ImGui::DragFloat("Sun Intensity", &fx->sunIntensity, 0.01f, 0.0f, 8.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Moon Intensity", &fx->moonIntensity, 0.01f, 0.0f, 4.0f)) ctx.markDirty(); + float sun[3] = {fx->sunColor.x, fx->sunColor.y, fx->sunColor.z}; + if (ImGui::ColorEdit3("Sun Color", sun)) { + fx->sunColor = Vec3(sun[0], sun[1], sun[2]); + ctx.markDirty(); + } + float moon[3] = {fx->moonColor.x, fx->moonColor.y, fx->moonColor.z}; + if (ImGui::ColorEdit3("Moon Color", moon)) { + fx->moonColor = Vec3(moon[0], moon[1], moon[2]); + ctx.markDirty(); + } + if (ImGui::SliderFloat("Ambient Day", &fx->ambientDay, 0.0f, 1.5f)) ctx.markDirty(); + if (ImGui::SliderFloat("Ambient Night", &fx->ambientNight, 0.0f, 1.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Shadow Strength", &fx->shadowStrength, 0.0f, 1.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Indoor Darkness", &fx->indoorDarkness, 0.0f, 0.98f)) ctx.markDirty(); + if (ImGui::SliderFloat("AO Day", &fx->aoDay, 0.0f, 1.5f)) ctx.markDirty(); + if (ImGui::SliderFloat("AO Night", &fx->aoNight, 0.0f, 2.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Volumetric Density", &fx->volumetricDensity, 0.001f, 0.0f, 0.25f, "%.3f")) { + ctx.markDirty(); + } + ImGui::TextDisabled("Sun shafts need an opening and Cast Shadows. Point / spot lights glow in the volume."); + } else { + if (ImGui::DragFloat("Radius", &fx->zoneRadius, 0.1f, 0.25f, 250.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Intensity", &fx->zoneIntensity, 0.01f, 0.0f, 8.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Falloff", &fx->zoneFalloff, 0.2f, 4.0f)) ctx.markDirty(); + float zone[3] = {fx->zoneColor.x, fx->zoneColor.y, fx->zoneColor.z}; + if (ImGui::ColorEdit3("Zone Color", zone)) { + fx->zoneColor = Vec3(zone[0], zone[1], zone[2]); + ctx.markDirty(); + } + ImGui::TextDisabled("Tints 3D ambient and 2D sprites inside the radius."); } } @@ -1108,7 +1212,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext if (removeRequested) { Terrain::TerrainCache::instance().removeEntity(e); world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); ImGui::PopID(); return; } @@ -1119,13 +1223,13 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext terrain->resolutionX = static_cast(resX); terrain->dataRevision++; Terrain::TerrainCache::instance().syncEntity(world, e); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::SliderInt("Resolution Z", &resZ, 17, 513)) { terrain->resolutionZ = static_cast(resZ); terrain->dataRevision++; Terrain::TerrainCache::instance().syncEntity(world, e); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Heightmap vertex count. Existing heights are resampled when changed."); @@ -1135,7 +1239,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext terrain->splatResolutionScale = static_cast(splatScale); terrain->splatRevision++; Terrain::TerrainCache::instance().syncEntity(world, e); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Splat resolution: %u x %u (height scale x%d)", @@ -1146,15 +1250,15 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext ImGui::TextDisabled("1 world unit = 1 meter"); if (ImGui::DragFloat("World Size X (m)", &terrain->worldSizeX, 1.0f, 16.0f, 10000.0f, "%.1f m")) { terrain->dataRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragFloat("World Size Z (m)", &terrain->worldSizeZ, 1.0f, 16.0f, 10000.0f, "%.1f m")) { terrain->dataRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragFloat("Max Height (m)", &terrain->maxHeight, 0.5f, 4.0f, 2000.0f, "%.1f m")) { terrain->dataRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { const f32 suggested = Caffeine::WorldUnits::suggestedHeightM( @@ -1166,10 +1270,10 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext suggested); } if (ImGui::Checkbox("Cast Shadows", &terrain->castShadows)) { - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::Checkbox("Receive Shadows", &terrain->receiveShadows)) { - ctx.isDirty = true; + ctx.markDirty(); } ImGui::Separator(); @@ -1178,10 +1282,10 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext #ifdef CF_HAS_SDL3 Terrain::TerrainGpuTextureCache::instance().invalidateEntity(e, nullptr); #endif - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::SliderFloat("Shininess", &terrain->shininess, 1.0f, 128.0f)) { - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::InputText("Albedo Texture", terrain->texturePath, sizeof(terrain->texturePath))) { Terrain::TerrainCache::instance().repairTexturePaths(*terrain); @@ -1189,7 +1293,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext #ifdef CF_HAS_SDL3 Terrain::TerrainGpuTextureCache::instance().invalidateEntity(e, nullptr); #endif - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Engine asset path or project-relative texture"); @@ -1197,7 +1301,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext if (terrain->texturePath[0] != '\0' && Assets::MeshCache::resolveTexturePath(terrain->texturePath, projectRoot).empty()) { ImGui::TextColored(ImVec4(1.0f, 0.35f, 0.35f, 1.0f), - "Textura nao encontrada: %s", terrain->texturePath); + "Texture not found: %s", terrain->texturePath); } if (ImGui::Button("Reset Default Textures")) { const ECS::TerrainComponent defaults; @@ -1213,11 +1317,11 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext Terrain::TerrainGpuTextureCache::instance().invalidateEntity(e, nullptr); #endif terrain->splatRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragFloat("Tile Size", &terrain->textureTileSize, 0.25f, 1.0f, 128.0f, "%.1f")) { terrain->dataRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("World units covered by one texture repeat"); @@ -1227,7 +1331,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext ImGui::TextUnformatted("Optimization"); if (ImGui::Checkbox("Chunked LOD", &terrain->useChunks)) { terrain->dataRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Split terrain into chunks with distance-based LOD and frustum culling"); @@ -1237,26 +1341,26 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext if (ImGui::SliderInt("Chunk Resolution", &chunkVerts, 9, 129)) { terrain->chunkVertexCount = static_cast(chunkVerts); terrain->dataRevision++; - ctx.isDirty = true; + ctx.markDirty(); } int maxLod = static_cast(terrain->maxLodLevels); if (ImGui::SliderInt("LOD Levels", &maxLod, 1, 6)) { terrain->maxLodLevels = static_cast(maxLod); terrain->dataRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragFloat("LOD Distance", &terrain->lodDistanceScale, 1.0f, 32.0f, 4096.0f, "%.0f")) { terrain->dataRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::SliderFloat("LOD Hysteresis", &terrain->lodHysteresis, 0.0f, 0.9f, "%.2f")) { - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::Checkbox("Frustum Cull", &terrain->frustumCull)) { - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::Checkbox("Show Chunk Debug", &ctx.terrainShowChunkDebug)) { - ctx.isDirty = true; + ctx.markDirty(); } } @@ -1264,7 +1368,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext ImGui::TextUnformatted("Splatmap"); if (ImGui::Checkbox("Use Splatmap", &terrain->useSplatmap)) { Terrain::TerrainCache::instance().syncTextureToFilter(world, e, *terrain); - ctx.isDirty = true; + ctx.markDirty(); } if (terrain->useSplatmap) { const char* layerLabels[] = {"Grass", "Rock", "Sand", "Dirt"}; @@ -1279,7 +1383,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext Terrain::TerrainGpuTextureCache::instance().invalidateEntity(e, nullptr); #endif terrain->splatRevision++; - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("%s", terrain->splatLayerPaths[i]); @@ -1288,11 +1392,11 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext Assets::MeshCache::resolveTexturePath(terrain->splatLayerPaths[i], projectRoot) .empty()) { ImGui::TextColored(ImVec4(1.0f, 0.35f, 0.35f, 1.0f), - "Textura nao encontrada: %s", terrain->splatLayerPaths[i]); + "Texture not found: %s", terrain->splatLayerPaths[i]); } } if (ImGui::DragFloat("Splat Tile Size", &terrain->splatTileSize, 0.25f, 1.0f, 128.0f, "%.1f")) { - ctx.isDirty = true; + ctx.markDirty(); } } @@ -1303,7 +1407,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext terrain->collisionSampleStep = static_cast(collisionStep); terrain->dataRevision++; Terrain::TerrainCache::instance().syncEntity(world, e); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Higher = fewer collision triangles (render mesh unchanged)"); @@ -1311,7 +1415,7 @@ void InspectorPanel::drawTerrain(ECS::World& world, ECS::Entity e, EditorContext if (ImGui::Checkbox("Build Collision Mesh", &terrain->buildCollisionMesh)) { terrain->dataRevision++; Terrain::TerrainCache::instance().syncEntity(world, e); - ctx.isDirty = true; + ctx.markDirty(); } ImGui::Separator(); @@ -1327,7 +1431,7 @@ void InspectorPanel::drawForwardRenderFeatures(ECS::World& world, ECS::Entity e, if (!Widgets::ComponentHeader("Forward Render Features", enabled, removeRequested, "sparkles")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -1338,75 +1442,76 @@ void InspectorPanel::drawForwardRenderFeatures(ECS::World& world, ECS::Entity e, ImGui::TextWrapped( "Scene-owned forward pass: instancing, IBL, occlusion, reflections, volumetrics. " "Not stored in editor preferences — use this component, Lua, or C++."); - if (ImGui::Checkbox("Component enabled", &fx->enabled)) ctx.isDirty = true; + if (ImGui::Checkbox("Component enabled", &fx->enabled)) ctx.markDirty(); if (ImGui::CollapsingHeader("Instancing", ImGuiTreeNodeFlags_DefaultOpen)) { - if (ImGui::Checkbox("Enabled", &fx->instancing.enabled)) ctx.isDirty = true; + if (ImGui::Checkbox("Enabled", &fx->instancing.enabled)) ctx.markDirty(); int maxBatch = static_cast(fx->instancing.maxInstancesPerBatch); if (ImGui::SliderInt("Max / batch", &maxBatch, 2, 256)) { fx->instancing.maxInstancesPerBatch = static_cast(maxBatch); - ctx.isDirty = true; + ctx.markDirty(); } } if (ImGui::CollapsingHeader("IBL", ImGuiTreeNodeFlags_DefaultOpen)) { - if (ImGui::Checkbox("Diffuse IBL", &fx->ibl.enabled)) ctx.isDirty = true; + if (ImGui::Checkbox("Diffuse IBL", &fx->ibl.enabled)) ctx.markDirty(); ImGui::TextDisabled("Sky as fill light. Metals still reflect the sky via Specular."); - if (ImGui::SliderFloat("Diffuse", &fx->ibl.diffuse, 0.0f, 2.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Specular", &fx->ibl.specular, 0.0f, 2.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Diffuse", &fx->ibl.diffuse, 0.0f, 2.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Specular", &fx->ibl.specular, 0.0f, 2.0f)) ctx.markDirty(); } if (ImGui::CollapsingHeader("Occlusion")) { - if (ImGui::Checkbox("Coarse CPU occlusion", &fx->occlusion.enabled)) ctx.isDirty = true; + if (ImGui::Checkbox("Coarse CPU occlusion", &fx->occlusion.enabled)) ctx.markDirty(); int maxOcc = static_cast(fx->occlusion.maxOccluders); if (ImGui::SliderInt("Max occluders", &maxOcc, 1, 16)) { fx->occlusion.maxOccluders = static_cast(maxOcc); - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::DragFloat("Min radius", &fx->occlusion.minRadius, 0.05f, 0.1f, 20.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Min radius", &fx->occlusion.minRadius, 0.05f, 0.1f, 20.0f)) ctx.markDirty(); } if (ImGui::CollapsingHeader("Reflections")) { - if (ImGui::Checkbox("Enabled", &fx->reflections.enabled)) ctx.isDirty = true; + if (ImGui::Checkbox("Enabled", &fx->reflections.enabled)) ctx.markDirty(); const char* modes[] = {"Off", "Planar", "Screen-space", "Probe"}; int mode = static_cast(fx->reflections.mode); if (ImGui::Combo("Mode", &mode, modes, 4)) { fx->reflections.mode = static_cast(mode); - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::DragFloat("Plane Y", &fx->reflections.planeY, 0.05f, -50.0f, 50.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Intensity", &fx->reflections.intensity, 0.0f, 1.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Plane Y", &fx->reflections.planeY, 0.05f, -50.0f, 50.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Intensity", &fx->reflections.intensity, 0.0f, 1.0f)) ctx.markDirty(); if (ImGui::SliderFloat("Resolution scale", &fx->reflections.resolutionScale, 0.25f, 1.0f)) { - ctx.isDirty = true; + ctx.markDirty(); } int steps = static_cast(fx->reflections.ssrMaxSteps); if (ImGui::SliderInt("SSR steps", &steps, 1, 12)) { fx->reflections.ssrMaxSteps = static_cast(steps); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragFloat("SSR distance", &fx->reflections.ssrMaxDistance, 0.25f, 0.5f, 40.0f)) { - ctx.isDirty = true; + ctx.markDirty(); } int probe = static_cast(fx->reflections.probeResolution); if (ImGui::SliderInt("Probe resolution", &probe, 16, 128)) { fx->reflections.probeResolution = static_cast(probe); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::Checkbox("Only when camera settled", &fx->reflections.expensiveOnlyWhenSettled)) { - ctx.isDirty = true; + ctx.markDirty(); } } if (ImGui::CollapsingHeader("Volumetrics")) { - if (ImGui::Checkbox("Enabled", &fx->volumetrics.enabled)) ctx.isDirty = true; - const char* qualities[] = {"Off", "Low", "Medium"}; + if (ImGui::Checkbox("Enabled", &fx->volumetrics.enabled)) ctx.markDirty(); + const char* qualities[] = {"Off", "Low", "Medium", "High"}; int quality = static_cast(fx->volumetrics.quality); - if (ImGui::Combo("Quality", &quality, qualities, 3)) { + if (ImGui::Combo("Quality", &quality, qualities, 4)) { fx->volumetrics.quality = static_cast(quality); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragFloat("Density", &fx->volumetrics.density, 0.001f, 0.0f, 0.2f, "%.3f")) { - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::DragFloat("Height", &fx->volumetrics.height, 0.1f, 0.5f, 80.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Anisotropy", &fx->volumetrics.anisotropy, 0.0f, 0.9f)) ctx.isDirty = true; - if (ImGui::Checkbox("Sample shadows", &fx->volumetrics.sampleShadows)) ctx.isDirty = true; + if (ImGui::DragFloat("Height", &fx->volumetrics.height, 0.1f, 0.5f, 80.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Anisotropy", &fx->volumetrics.anisotropy, 0.0f, 0.9f)) ctx.markDirty(); + if (ImGui::Checkbox("Sample shadows", &fx->volumetrics.sampleShadows)) ctx.markDirty(); + ImGui::TextDisabled("High + Sample shadows uses the sun cascade along the view ray."); } ImGui::PopID(); } @@ -1419,7 +1524,7 @@ void InspectorPanel::drawPostProcess(ECS::World& world, ECS::Entity e, EditorCon if (!Widgets::ComponentHeader("Post Process", enabled, removeRequested, "sparkles")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -1428,12 +1533,27 @@ void InspectorPanel::drawPostProcess(ECS::World& world, ECS::Entity e, EditorCon ImGui::PushID("postprocess"); const u32 typeId = ComponentTypeRegistry::instance().lookup("PostProcess"); - if (const ComponentDrawer* drawer = m_drawers.get(typeId)) { - (*drawer)(fx); - ImGui::PopID(); - return; + if (PluginManager::instance().isComponentDrawerEnabled(typeId)) { + if (const ComponentDrawer* drawer = m_drawers.get(typeId)) { + (*drawer)(fx); + ImGui::PopID(); + return; + } + } + ImGui::TextDisabled("Core post stack. These fields drive the Caffeine renderer."); + if (ImGui::Checkbox("Enabled", &fx->enabled)) ctx.markDirty(); + if (ImGui::DragFloat("Exposure", &fx->colorGrading.exposure, 0.01f, 0.0f, 16.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Contrast", &fx->colorGrading.contrast, 0.01f, 0.0f, 3.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Saturation", &fx->colorGrading.saturation, 0.01f, 0.0f, 3.0f)) ctx.markDirty(); + if (ImGui::Checkbox("Bloom", &fx->bloom.enabled)) ctx.markDirty(); + if (fx->bloom.enabled && ImGui::DragFloat("Bloom Intensity", &fx->bloom.intensity, 0.01f, 0.0f, 4.0f)) { + ctx.markDirty(); + } + if (ImGui::Checkbox("Ambient Occlusion", &fx->ambientOcclusion.enabled)) ctx.markDirty(); + if (fx->ambientOcclusion.enabled && + ImGui::DragFloat("AO Intensity", &fx->ambientOcclusion.intensity, 0.01f, 0.0f, 4.0f)) { + ctx.markDirty(); } - ImGui::TextDisabled("Install the Post Processing plugin for the full effect stack editor."); ImGui::PopID(); } @@ -1453,7 +1573,7 @@ void InspectorPanel::drawLight(ECS::World& world, ECS::Entity e, EditorContext& if (world.has(e)) world.remove(e); if (world.has(e)) world.remove(e); if (world.has(e)) world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } @@ -1462,30 +1582,30 @@ void InspectorPanel::drawLight(ECS::World& world, ECS::Entity e, EditorContext& float col[4] = { light->color.x, light->color.y, light->color.z, light->color.w }; if (ImGui::ColorEdit4("Color", col)) { light->color = Vec4(col[0], col[1], col[2], col[3]); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragFloat("Intensity", &light->intensity, 0.05f, 0.0f, 100.0f, "%.2f")) { - ctx.isDirty = true; + ctx.markDirty(); } if (world.has(e)) { auto* dir = world.get(e); - if (ImGui::DragFloat("Shadow Distance", &dir->shadowDistance, 1.0f, 1.0f, 10000.0f)) ctx.isDirty = true; - if (ImGui::Checkbox("Cast Shadows", &dir->castShadows)) ctx.isDirty = true; + if (ImGui::DragFloat("Shadow Distance", &dir->shadowDistance, 1.0f, 1.0f, 10000.0f)) ctx.markDirty(); + if (ImGui::Checkbox("Cast Shadows", &dir->castShadows)) ctx.markDirty(); } if (world.has(e)) { auto* pl = world.get(e); - if (ImGui::DragFloat("Radius", &pl->radius, 0.5f, 0.1f, 1000.0f)) ctx.isDirty = true; - if (ImGui::Checkbox("Cast Shadows", &pl->castShadows)) ctx.isDirty = true; + if (ImGui::DragFloat("Radius", &pl->radius, 0.5f, 0.1f, 1000.0f)) ctx.markDirty(); + if (ImGui::Checkbox("Cast Shadows", &pl->castShadows)) ctx.markDirty(); } if (world.has(e)) { auto* sl = world.get(e); - if (ImGui::DragFloat("Radius", &sl->radius, 0.5f, 0.1f, 1000.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Angle", &sl->angle, 0.5f, 1.0f, 179.0f, "%.1f deg")) ctx.isDirty = true; - if (ImGui::Checkbox("Cast Shadows", &sl->castShadows)) ctx.isDirty = true; + if (ImGui::DragFloat("Radius", &sl->radius, 0.5f, 0.1f, 1000.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Angle", &sl->angle, 0.5f, 1.0f, 179.0f, "%.1f deg")) ctx.markDirty(); + if (ImGui::Checkbox("Cast Shadows", &sl->castShadows)) ctx.markDirty(); } } @@ -1507,7 +1627,7 @@ void InspectorPanel::drawPrefabInstance(ECS::World& world, ECS::Entity e, Editor PrefabSystem::RevertOverrides(world, instanceRoot); ctx.selectEntity(instanceRoot); ctx.endUndo(world); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::Button("Apply to Prefab", ImVec2(-1, 0))) { ctx.beginUndo(EditorCommand::SetField, instanceRoot.id(), world); @@ -1515,7 +1635,7 @@ void InspectorPanel::drawPrefabInstance(ECS::World& world, ECS::Entity e, Editor ctx.selectEntity(instanceRoot); } ctx.endUndo(world); - ctx.isDirty = true; + ctx.markDirty(); } ImGui::Separator(); } @@ -1548,11 +1668,11 @@ void InspectorPanel::drawEffect(ECS::World& world, ECS::Entity e, EditorContext& const bool open = Widgets::ComponentHeader("Effect", enabled, removeRequested, "beer"); if (enabled != (effect->enabled != 0)) { effect->enabled = enabled ? 1 : 0; - ctx.isDirty = true; + ctx.markDirty(); } if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } if (!open) return; @@ -1567,44 +1687,44 @@ void InspectorPanel::drawEffect(ECS::World& world, ECS::Entity e, EditorContext& Effects::configureFog(*effect, static_cast(effect->domain), static_cast(effect->pad0 > 3 ? 0 : effect->pad0)); } - ctx.isDirty = true; + ctx.markDirty(); } const char* spaces[] = {"World", "Camera"}; int space = static_cast(effect->space); if (ImGui::Combo("Space", &space, spaces, 2)) { effect->space = static_cast(space); - ctx.isDirty = true; + ctx.markDirty(); } const char* domains[] = {"2D and 3D", "2D", "3D"}; int domain = static_cast(effect->domain); if (ImGui::Combo("Domain", &domain, domains, 3)) { effect->domain = static_cast(domain); - ctx.isDirty = true; + ctx.markDirty(); } const char* qualities[] = {"Performance", "Balanced", "Quality"}; int quality = static_cast(effect->quality); if (ImGui::Combo("Quality", &quality, qualities, 3)) { effect->quality = static_cast(quality); - ctx.isDirty = true; + ctx.markDirty(); } char path[260] = {}; std::strncpy(path, effect->materialPath, sizeof(path) - 1); if (ImGui::InputText("Material", path, sizeof(path))) { std::memset(effect->materialPath, 0, sizeof(effect->materialPath)); std::strncpy(effect->materialPath, path, sizeof(effect->materialPath) - 1); - ctx.isDirty = true; + ctx.markDirty(); } if (effect->kind == static_cast(Effects::EffectKind::Particles)) { - if (ImGui::DragFloat("Rate", &effect->rate, 0.5f, 0.0f, 400.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Lifetime", &effect->lifetime, 0.02f, 0.05f, 20.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Rate", &effect->rate, 0.5f, 0.0f, 400.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Lifetime", &effect->lifetime, 0.02f, 0.05f, 20.0f)) ctx.markDirty(); int cap = effect->maxParticles; if (ImGui::DragInt("Max", &cap, 1, 1, 2048)) { effect->maxParticles = cap; - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::DragFloat("Start Size", &effect->startSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("End Size", &effect->endSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Gravity Y", &effect->gravity.y, 0.05f, -20.0f, 20.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Start Size", &effect->startSize, 0.01f, 0.0f, 8.0f)) ctx.markDirty(); + if (ImGui::DragFloat("End Size", &effect->endSize, 0.01f, 0.0f, 8.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Gravity Y", &effect->gravity.y, 0.05f, -20.0f, 20.0f)) ctx.markDirty(); } else if (effect->kind == static_cast(Effects::EffectKind::VolumetricLight)) { Effects::ensureVolumetricMesh(world, e, *effect); Effects::pullVolumetricSizeFromMesh(world, e, *effect); @@ -1616,75 +1736,75 @@ void InspectorPanel::drawEffect(ECS::World& world, ECS::Entity e, EditorContext& Effects::configureVolumetricLight(*effect, static_cast(shape)); effect->lightColor = color; Effects::adoptVolumetricMesh(world, e, *effect); - ctx.isDirty = true; + ctx.markDirty(); } ImGui::TextDisabled("The volume is the mesh. Move, rotate and scale it."); const Effects::VolumetricShape volume = Effects::volumetricShapeOf(*effect); if (volume == Effects::VolumetricShape::Sphere) { if (ImGui::DragFloat("Radius", &effect->radius, 0.05f, 0.1f, 40.0f)) { pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } } else { if (ImGui::DragFloat("Length", &effect->radius, 0.05f, 0.2f, 40.0f)) { pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } if (volume == Effects::VolumetricShape::Cone) { f32 baseRadius = effect->endSize * 0.5f; if (ImGui::DragFloat("Radius", &baseRadius, 0.01f, 0.05f, 12.0f)) { effect->endSize = baseRadius * 2.0f; pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } } else if (volume == Effects::VolumetricShape::Cylinder) { if (ImGui::DragFloat("Diameter", &effect->startSize, 0.01f, 0.05f, 8.0f)) { effect->endSize = effect->startSize; pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } } else { if (ImGui::DragFloat("Width", &effect->startSize, 0.01f, 0.05f, 12.0f)) { pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragFloat("Height", &effect->endSize, 0.01f, 0.05f, 12.0f)) { pushSize(); - ctx.isDirty = true; + ctx.markDirty(); } } } - if (ImGui::DragFloat("Density", &effect->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Anisotropy", &effect->anisotropy, 0.0f, 0.9f)) ctx.isDirty = true; - if (ImGui::DragFloat("Intensity", &effect->intensity, 0.05f, 0.0f, 16.0f)) ctx.isDirty = true; - if (ImGui::ColorEdit3("Light", &effect->lightColor.x)) ctx.isDirty = true; + if (ImGui::DragFloat("Density", &effect->density, 0.005f, 0.0f, 2.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Anisotropy", &effect->anisotropy, 0.0f, 0.9f)) ctx.markDirty(); + if (ImGui::DragFloat("Intensity", &effect->intensity, 0.05f, 0.0f, 16.0f)) ctx.markDirty(); + if (ImGui::ColorEdit3("Light", &effect->lightColor.x)) ctx.markDirty(); } else if (effect->kind == static_cast(Effects::EffectKind::Fog)) { const char* looks[] = {"Fog", "Dust", "Mist", "Smoke"}; int style = static_cast(effect->pad0 > 3 ? 0 : effect->pad0); if (ImGui::Combo("Look", &style, looks, 4)) { Effects::configureFog(*effect, static_cast(effect->domain), static_cast(style)); - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::DragFloat("Radius", &effect->radius, 0.05f, 0.1f, 40.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Density", &effect->density, 0.005f, 0.0f, 2.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Intensity", &effect->intensity, 0.02f, 0.0f, 4.0f)) ctx.isDirty = true; - if (ImGui::ColorEdit3("Color", &effect->lightColor.x)) ctx.isDirty = true; + if (ImGui::DragFloat("Radius", &effect->radius, 0.05f, 0.1f, 40.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Density", &effect->density, 0.005f, 0.0f, 2.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Intensity", &effect->intensity, 0.02f, 0.0f, 4.0f)) ctx.markDirty(); + if (ImGui::ColorEdit3("Color", &effect->lightColor.x)) ctx.markDirty(); } else if (effect->kind == static_cast(Effects::EffectKind::ReflectiveSurface)) { - if (ImGui::SliderFloat("Reflection", &effect->reflection, 0.0f, 1.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Roughness", &effect->roughness, 0.02f, 1.0f)) ctx.isDirty = true; - if (ImGui::SliderFloat("Metallic", &effect->metallic, 0.0f, 1.0f)) ctx.isDirty = true; + if (ImGui::SliderFloat("Reflection", &effect->reflection, 0.0f, 1.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Roughness", &effect->roughness, 0.02f, 1.0f)) ctx.markDirty(); + if (ImGui::SliderFloat("Metallic", &effect->metallic, 0.0f, 1.0f)) ctx.markDirty(); const char* modes[] = {"Inherit", "Probe", "Planar", "Screen"}; int mode = static_cast(effect->reflectMode); if (ImGui::Combo("Reflect Mode", &mode, modes, 4)) { effect->reflectMode = static_cast(mode); - ctx.isDirty = true; + ctx.markDirty(); } ImGui::TextDisabled("Performance 8 steps, balanced 24, quality 48. The scene reflection mode still chooses the technique."); } else { - if (ImGui::ColorEdit3("Tint", &effect->tint.x)) ctx.isDirty = true; - if (ImGui::DragFloat("Emission", &effect->emissionBoost, 0.05f, 0.0f, 8.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Roughness Bias", &effect->roughnessBias, 0.01f, -1.0f, 1.0f)) ctx.isDirty = true; + if (ImGui::ColorEdit3("Tint", &effect->tint.x)) ctx.markDirty(); + if (ImGui::DragFloat("Emission", &effect->emissionBoost, 0.05f, 0.0f, 8.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Roughness Bias", &effect->roughnessBias, 0.01f, -1.0f, 1.0f)) ctx.markDirty(); } } @@ -1696,7 +1816,7 @@ void InspectorPanel::drawSpriteSheet(ECS::World& world, ECS::Entity e, EditorCon if (!Widgets::ComponentHeader("Sprite Sheet", enabled, removeRequested, "beer")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } int columns = static_cast(sheet->columns); @@ -1704,17 +1824,17 @@ void InspectorPanel::drawSpriteSheet(ECS::World& world, ECS::Entity e, EditorCon int frames = static_cast(sheet->frameCount); if (ImGui::DragInt("Columns", &columns, 1, 1, 64)) { sheet->columns = static_cast(columns); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragInt("Rows", &rows, 1, 1, 64)) { sheet->rows = static_cast(rows); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::DragInt("Frame Count", &frames, 1, 1, 4096)) { sheet->frameCount = static_cast(frames); - ctx.isDirty = true; + ctx.markDirty(); } - ImGui::TextDisabled("O frame do sprite escolhe a celula. Clipes e o animator avancam esse indice."); + ImGui::TextDisabled("The sprite frame picks the cell. Clips and the animator advance that index."); } void InspectorPanel::drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorContext& ctx) { @@ -1722,10 +1842,10 @@ void InspectorPanel::drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorCon if (!pose) return; bool enabled = true; bool removeRequested = false; - if (!Widgets::ComponentHeader("Skinned Mesh", enabled, removeRequested, "arrows-diagonal")) return; + if (!Widgets::ComponentHeader("Skeleton", enabled, removeRequested, "arrows-diagonal")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } std::string meshPath = pose->meshPath; @@ -1735,6 +1855,7 @@ void InspectorPanel::drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorCon std::strncpy(pose->meshPath, meshPath.c_str(), sizeof(pose->meshPath) - 1); pose->meshPath[sizeof(pose->meshPath) - 1] = '\0'; pose->loaded = false; + pose->humanoid = {}; pose->clipIndex = 0; pose->time = 0.0f; ECS::MeshFilterComponent* filter = world.get(e); @@ -1747,7 +1868,7 @@ void InspectorPanel::drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorCon filter->customMeshPath = pose->meshPath; } Assets::MeshCache::getInstance().getMesh(pose->meshPath, ctx.projectRootPath.string()); - ctx.isDirty = true; + ctx.markDirty(); } ImGui::PopID(); if (pose->meshPath[0] != '\0') { @@ -1761,9 +1882,37 @@ void InspectorPanel::drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorCon filter->customMeshPath = pose->meshPath; } } + if (pose->meshPath[0] == '\0') { + if (const ECS::MeshFilterComponent* filter = world.get(e)) { + if (!filter->customMeshPath.empty()) { + std::strncpy(pose->meshPath, filter->customMeshPath.c_str(), sizeof(pose->meshPath) - 1); + pose->meshPath[sizeof(pose->meshPath) - 1] = '\0'; + } + } + } + Assets::Mesh3D* boundMesh = nullptr; + if (pose->meshPath[0] != '\0') { + boundMesh = Assets::MeshCache::getInstance().getMesh(pose->meshPath, ctx.projectRootPath.string()); + } + const std::string resolved = Assets::MeshCache::getInstance().getResolvedPath(); const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath); - if (!skin || skin->clipNames.empty()) { - ImGui::TextDisabled("Sem clipes esqueleticos. Usa um glTF/GLB com pele."); + if (!skin && !resolved.empty()) skin = Animation::findImportedSkin(resolved); + if (!skin && boundMesh && !resolved.empty()) { + Assets::MeshLoader::ensureGltfSkin(resolved, boundMesh); + skin = Animation::findImportedSkin(resolved); + if (!skin) skin = Animation::findImportedSkin(pose->meshPath); + } + if (!skin) { + ImGui::TextDisabled("No skin on this mesh. The file needs glTF skins / joints."); + if (!Assets::MeshCache::getInstance().getLastError().empty()) { + ImGui::TextWrapped("%s", Assets::MeshCache::getInstance().getLastError().c_str()); + } + } else if (skin->synthesized) { + ImGui::TextDisabled("Fitted humanoid (%d bones). This file has no authored glTF skin.", + static_cast(skin->boneNames.size())); + } else if (skin->clipNames.empty()) { + ImGui::TextDisabled("Skin found (%d bones). This file has no animation clips.", + static_cast(skin->boneNames.size())); } else { const char* preview = skin->clipNames[static_cast( std::clamp(pose->clipIndex, 0, static_cast(skin->clipNames.size()) - 1))].c_str(); @@ -1773,26 +1922,321 @@ void InspectorPanel::drawSkinnedPose(ECS::World& world, ECS::Entity e, EditorCon pose->clipIndex = i; pose->time = 0.0f; pose->playing = true; - ctx.isDirty = true; + ctx.markDirty(); + } + } + ImGui::EndCombo(); + } + } + if (ImGui::DragFloat("Time", &pose->time, 0.01f, 0.0f, 1000.0f)) ctx.markDirty(); + if (ImGui::DragFloat("Speed", &pose->speed, 0.01f, 0.0f, 8.0f)) ctx.markDirty(); + if (ImGui::Checkbox("Playing", &pose->playing)) ctx.markDirty(); + if (ImGui::Checkbox("Loop", &pose->loop)) ctx.markDirty(); + if (!skin || skin->boneNames.empty()) return; + + if (!ImGui::CollapsingHeader("Skeleton", ImGuiTreeNodeFlags_DefaultOpen)) return; + if (ImGui::Checkbox("Show bones", &ctx.showBones)) {} + ImGui::TextDisabled("%d bones%s", static_cast(skin->boneNames.size()), + pose->humanoid.matched ? " · humanoid" : ""); + if (ctx.skeletonEntityId == e.id() && ctx.skeletonBone >= 0 && + ctx.skeletonBone < static_cast(skin->skeleton.boneCount())) { + const int boneIndex = ctx.skeletonBone; + if (boneIndex < static_cast(skin->boneNames.size())) { + ImGui::Text("Bone: %s", skin->boneNames[static_cast(boneIndex)].c_str()); + } + if (pose->offsets.size() < skin->skeleton.boneCount()) pose->offsets.resize(skin->skeleton.boneCount()); + Animation::BonePose& bone = pose->offsets[static_cast(boneIndex)]; + constexpr f32 kRadToDeg = 57.2957795f; + constexpr f32 kDegToRad = 0.0174532925f; + float rotation[3] = {bone.rotation.x * kRadToDeg, bone.rotation.y * kRadToDeg, bone.rotation.z * kRadToDeg}; + if (ImGui::DragFloat3("Rotation", rotation, 1.0f)) { + bone.rotation = Vec3(rotation[0] * kDegToRad, rotation[1] * kDegToRad, rotation[2] * kDegToRad); + pose->sampleKeys = false; + ctx.markDirty(); + } + if (ImGui::DragFloat3("Translation", &bone.translation.x, 0.01f)) { + pose->sampleKeys = false; + ctx.markDirty(); + } + ImGui::TextDisabled("The joint gizmo does the same. Key on the timeline records it, Play repeats it."); + } + + if (ImGui::Button(ctx.remapBones ? "Done remapping" : "Remap Bones")) { + ctx.remapBones = !ctx.remapBones; + ctx.skeletonEntityId = e.id(); + if (ctx.remapBones) { + ctx.showBones = true; + if (ctx.remapHumanoidSlot < 0 || ctx.remapHumanoidSlot >= Animation::kHumanoidBodyCount) { + ctx.remapHumanoidSlot = 0; + } + } + } + ImGui::SameLine(); + if (ImGui::Button("Auto-map")) { + pose->humanoid = Animation::matchHumanoid(*skin); + pose->humanoid.manual = true; + pose->loaded = true; + ctx.markDirty(); + } + if (skin->synthesized && boundMesh) { + ImGui::SameLine(); + if (ImGui::Button("Refit to mesh")) { + const std::string refitPath = !resolved.empty() ? resolved : std::string(pose->meshPath); + if (Animation::synthesizeHumanoidSkin(refitPath, *boundMesh, true)) { + if (const Animation::ImportedSkin* fitted = Animation::findImportedSkin(refitPath)) { + pose->humanoid = Animation::matchHumanoid(*fitted); + pose->humanoid.manual = true; + pose->loaded = true; + ctx.showBones = true; + ctx.markDirty(); + } + } + } + } + ImGui::TextDisabled("Remap: pick a slot, then click a bone here or in the viewport."); + + if (ctx.remapBones) { + ImGui::Separator(); + ImGui::TextUnformatted("Remap Bones"); + const int boneCount = static_cast(skin->boneNames.size()); + for (int slot = 0; slot < Animation::kHumanoidBodyCount; ++slot) { + const auto kind = static_cast(slot); + const i32 bone = pose->humanoid.bones[slot]; + const char* boneName = "None"; + if (bone >= 0 && bone < boneCount) boneName = skin->boneNames[static_cast(bone)].c_str(); + const std::string row = std::string(Animation::humanoidBoneName(kind)) + " → " + boneName; + ImGui::PushID(slot); + if (ImGui::Selectable(row.c_str(), ctx.remapHumanoidSlot == slot)) { + ctx.remapHumanoidSlot = slot; + ctx.skeletonEntityId = e.id(); + } + ImGui::PopID(); + } + if (ctx.skeletonBone >= 0 && ctx.remapHumanoidSlot >= 0 && + ImGui::Button("Assign selected bone")) { + Animation::assignHumanoidBone(pose->humanoid, + static_cast(ctx.remapHumanoidSlot), + ctx.skeletonBone); + pose->loaded = true; + ctx.markDirty(); + } + ImGui::SameLine(); + if (ImGui::Button("Clear this slot") && ctx.remapHumanoidSlot >= 0 && + ctx.remapHumanoidSlot < Animation::kHumanoidBodyCount) { + pose->humanoid.bones[ctx.remapHumanoidSlot] = -1; + pose->humanoid.manual = true; + Animation::refreshHumanoidMatched(pose->humanoid); + ctx.markDirty(); + } + if (ImGui::Button("Clear all mappings")) { + pose->humanoid = {}; + pose->humanoid.manual = true; + ctx.markDirty(); + } + ImGui::Separator(); + } + + auto mapHumanoidSlot = [&](int slot) { + const auto kind = static_cast(slot); + const char* slotName = Animation::humanoidBoneName(kind); + i32& bone = pose->humanoid.bones[slot]; + const int boneCount = static_cast(skin->boneNames.size()); + const char* preview = "None"; + if (bone >= 0 && bone < boneCount) preview = skin->boneNames[static_cast(bone)].c_str(); + ImGui::PushID(slot); + if (ImGui::BeginCombo(slotName, preview)) { + if (ImGui::Selectable("None", bone < 0)) { + bone = -1; + pose->humanoid.manual = true; + Animation::refreshHumanoidMatched(pose->humanoid); + ctx.markDirty(); + } + for (int index = 0; index < boneCount; ++index) { + ImGui::PushID(index); + const bool chosen = bone == index; + if (ImGui::Selectable(skin->boneNames[static_cast(index)].c_str(), chosen)) { + Animation::assignHumanoidBone(pose->humanoid, kind, index); + pose->loaded = true; + ctx.skeletonEntityId = e.id(); + ctx.skeletonBone = index; + ctx.markDirty(); } + ImGui::PopID(); } ImGui::EndCombo(); } + ImGui::PopID(); + }; + + if (ImGui::TreeNode("Humanoid mapping")) { + for (int slot = 0; slot < Animation::kHumanoidBodyCount; ++slot) mapHumanoidSlot(slot); + ImGui::TreePop(); } - if (ImGui::DragFloat("Time", &pose->time, 0.01f, 0.0f, 1000.0f)) ctx.isDirty = true; - if (ImGui::DragFloat("Speed", &pose->speed, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; - if (ImGui::Checkbox("Playing", &pose->playing)) ctx.isDirty = true; - if (ImGui::Checkbox("Loop", &pose->loop)) ctx.isDirty = true; - if (pose->humanoid.matched) { - ImGui::TextDisabled("Humanoide"); - for (int i = 0; i < static_cast(Animation::HumanoidBone::Count); ++i) { - const i32 bone = pose->humanoid.bones[i]; - if (bone < 0 || !skin || bone >= static_cast(skin->boneNames.size())) continue; - ImGui::BulletText("%s: %s", Animation::humanoidBoneName(static_cast(i)), - skin->boneNames[static_cast(bone)].c_str()); + + if (ImGui::TreeNode("Fingers")) { + if (ImGui::Button("Auto-map fingers")) { + const Animation::HumanoidRig mapped = Animation::matchHumanoid(*skin); + for (int slot = Animation::kHumanoidBodyCount; slot < static_cast(Animation::HumanoidBone::Count); + ++slot) { + pose->humanoid.bones[slot] = mapped.bones[slot]; + } + pose->humanoid.manual = true; + pose->loaded = true; + Animation::refreshHumanoidMatched(pose->humanoid); + ctx.markDirty(); + } + ImGui::SameLine(); + if (ctx.skeletonBone >= 0 && ImGui::Button("Assign selected")) { + int empty = -1; + for (int slot = Animation::kHumanoidBodyCount; slot < static_cast(Animation::HumanoidBone::Count); + ++slot) { + if (pose->humanoid.bones[slot] < 0) { + empty = slot; + break; + } + } + if (empty >= 0) { + Animation::assignHumanoidBone(pose->humanoid, static_cast(empty), + ctx.skeletonBone); + pose->loaded = true; + ctx.markDirty(); + } + } + int fingerCount = 0; + for (int slot = Animation::kHumanoidBodyCount; slot < static_cast(Animation::HumanoidBone::Count); ++slot) { + mapHumanoidSlot(slot); + if (pose->humanoid.bones[slot] >= 0) ++fingerCount; + } + if (fingerCount == 0) { + ImGui::TextDisabled("No fingers on this skeleton. Assign a joint to a slot, or re-export with finger bones."); + } else { + ImGui::TextDisabled("%d finger joints mapped. Slots can be set by hand.", fingerCount); + } + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Bones")) { + const int count = static_cast(std::max(skin->boneNames.size(), skin->skeleton.bones.size())); + std::vector> children(static_cast(count)); + std::vector roots; + for (int index = 0; index < count; ++index) { + int parent = -1; + if (index < static_cast(skin->skeleton.bones.size())) { + parent = skin->skeleton.bones[static_cast(index)].parentIndex; + } + if (parent >= 0 && parent < count && parent != index) children[static_cast(parent)].push_back(index); + else roots.push_back(index); } - } else if (skin && !skin->boneNames.empty()) { - ImGui::TextDisabled("Modelo geral, %d ossos", static_cast(skin->boneNames.size())); + const auto drawNode = [&](auto&& self, int index) -> void { + if (Animation::poseOmitsBone(*pose, index)) { + for (int child : children[static_cast(index)]) self(self, child); + return; + } + std::string label = (index < static_cast(skin->boneNames.size()) && + !skin->boneNames[static_cast(index)].empty()) + ? skin->boneNames[static_cast(index)] + : ("Bone " + std::to_string(index)); + if (Animation::isFingerBone(*pose, *skin, index)) { + label += " · finger"; + } + label += "##bone"; + label += std::to_string(index); + const bool hasChild = !children[static_cast(index)].empty(); + ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_SpanAvailWidth; + if (!hasChild) flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; + if (ctx.skeletonEntityId == e.id() && ctx.skeletonBone == index) { + flags |= ImGuiTreeNodeFlags_Selected; + } + const bool open = ImGui::TreeNodeEx(label.c_str(), flags); + if (ImGui::IsItemClicked()) { + ctx.skeletonEntityId = e.id(); + ctx.skeletonBone = index; + if (ctx.remapBones && ctx.remapHumanoidSlot >= 0 && + ctx.remapHumanoidSlot < Animation::kHumanoidBodyCount) { + Animation::assignHumanoidBone(pose->humanoid, + static_cast(ctx.remapHumanoidSlot), + index); + pose->loaded = true; + ctx.markDirty(); + for (int slot = ctx.remapHumanoidSlot + 1; slot < Animation::kHumanoidBodyCount; ++slot) { + if (pose->humanoid.bones[slot] < 0) { + ctx.remapHumanoidSlot = slot; + break; + } + } + } + } + if (ImGui::BeginPopupContextItem()) { + if (ImGui::MenuItem("Edit")) { + ctx.skeletonEntityId = e.id(); + ctx.skeletonBone = index; + } + if (ImGui::BeginMenu("Set as finger")) { + for (int slot = Animation::kHumanoidBodyCount; + slot < static_cast(Animation::HumanoidBone::Count); ++slot) { + const auto kind = static_cast(slot); + if (ImGui::MenuItem(Animation::humanoidBoneName(kind), nullptr, + pose->humanoid.bones[slot] == index)) { + Animation::assignHumanoidBone(pose->humanoid, kind, index); + pose->loaded = true; + ctx.markDirty(); + } + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Not a finger")) { + for (int slot = Animation::kHumanoidBodyCount; + slot < static_cast(Animation::HumanoidBone::Count); ++slot) { + if (pose->humanoid.bones[slot] == index) pose->humanoid.bones[slot] = -1; + } + pose->humanoid.manual = true; + ctx.markDirty(); + } + if (ImGui::MenuItem("Reset joint")) { + if (pose->offsets.size() < skin->skeleton.boneCount()) pose->offsets.resize(skin->skeleton.boneCount()); + pose->offsets[static_cast(index)] = {}; + ctx.markDirty(); + } + if (ImGui::MenuItem("Delete joint")) { + if (!Animation::poseOmitsBone(*pose, index)) pose->removedBones.push_back(index); + if (pose->offsets.size() < skin->skeleton.boneCount()) pose->offsets.resize(skin->skeleton.boneCount()); + pose->offsets[static_cast(index)] = {}; + pose->keys.erase(std::remove_if(pose->keys.begin(), pose->keys.end(), + [index](const Animation::BoneKeyframe& key) { return key.bone == index; }), + pose->keys.end()); + if (ctx.skeletonBone == index) ctx.skeletonBone = -1; + ctx.markDirty(); + } + ImGui::EndPopup(); + } + if (open && hasChild) { + for (int child : children[static_cast(index)]) self(self, child); + ImGui::TreePop(); + } + }; + for (int root : roots) drawNode(drawNode, root); + if (!pose->removedBones.empty()) { + ImGui::Separator(); + ImGui::TextDisabled("Deleted joints"); + for (size_t removed = 0; removed < pose->removedBones.size();) { + const i32 index = pose->removedBones[removed]; + const char* name = (index >= 0 && index < static_cast(skin->boneNames.size())) + ? skin->boneNames[static_cast(index)].c_str() + : "Bone"; + ImGui::PushID(index + 100000); + ImGui::TextUnformatted(name); + ImGui::SameLine(); + if (ImGui::SmallButton("Restore")) { + pose->removedBones.erase(pose->removedBones.begin() + static_cast(removed)); + ctx.markDirty(); + ImGui::PopID(); + continue; + } + ImGui::PopID(); + ++removed; + } + } + ImGui::TreePop(); } } @@ -1803,7 +2247,7 @@ void InspectorPanel::drawAnimationPlayer(ECS::World& world, ECS::Entity e, Edito if (!Widgets::ComponentHeader("Animation Player", enabled, removeRequested, "arrows-horizontal")) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } auto* player = world.get(e); @@ -1814,11 +2258,11 @@ void InspectorPanel::drawAnimationPlayer(ECS::World& world, ECS::Entity e, Edito if (ImGui::InputText("Clip", path, sizeof(path))) { Animation::setPlayerPath(*player, path); player->loaded = false; - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::DragFloat("Speed", &player->speed, 0.05f, 0.0f, 8.0f)) ctx.isDirty = true; - if (ImGui::Checkbox("Playing", &player->playing)) ctx.isDirty = true; - if (ImGui::Checkbox("Loop", &player->loop)) ctx.isDirty = true; + if (ImGui::DragFloat("Speed", &player->speed, 0.05f, 0.0f, 8.0f)) ctx.markDirty(); + if (ImGui::Checkbox("Playing", &player->playing)) ctx.markDirty(); + if (ImGui::Checkbox("Loop", &player->loop)) ctx.markDirty(); ImGui::PopID(); } @@ -1829,7 +2273,7 @@ void InspectorPanel::drawNavAgent(ECS::World& world, ECS::Entity e, EditorContex if (!Widgets::ComponentHeader("Nav Agent", enabled, removeRequested)) return; if (removeRequested) { world.remove(e); - ctx.isDirty = true; + ctx.markDirty(); return; } auto* agent = world.get(e); @@ -1840,13 +2284,13 @@ void InspectorPanel::drawNavAgent(ECS::World& world, ECS::Entity e, EditorContex if (ImGui::Combo("Behaviour", &mode, modes, 4)) { agent->mode = static_cast(mode); agent->planDirty = true; - ctx.isDirty = true; + ctx.markDirty(); } - if (ImGui::DragFloat("Speed", &agent->speed, 0.05f, 0.0f, 40.0f)) ctx.isDirty = true; + if (ImGui::DragFloat("Speed", &agent->speed, 0.05f, 0.0f, 40.0f)) ctx.markDirty(); if (ImGui::DragFloat3("Destination", &agent->destination.x, 0.1f)) { agent->hasDestination = true; agent->planDirty = true; - ctx.isDirty = true; + ctx.markDirty(); } ImGui::TextDisabled("Patrol points %u", agent->patrolCount); ImGui::PopID(); diff --git a/src/editor/InspectorPanel.hpp b/src/editor/InspectorPanel.hpp index 87bbeb9e..57aa29ab 100644 --- a/src/editor/InspectorPanel.hpp +++ b/src/editor/InspectorPanel.hpp @@ -57,6 +57,7 @@ class InspectorPanel { void drawUISlider(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawLight(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawSkybox(ECS::World& world, ECS::Entity e, EditorContext& ctx); + void drawEnvironmentEffects(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawTerrain(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawPostProcess(ECS::World& world, ECS::Entity e, EditorContext& ctx); void drawForwardRenderFeatures(ECS::World& world, ECS::Entity e, EditorContext& ctx); diff --git a/src/editor/InspectorWidgets.hpp b/src/editor/InspectorWidgets.hpp index 57943fc9..f8d778f1 100644 --- a/src/editor/InspectorWidgets.hpp +++ b/src/editor/InspectorWidgets.hpp @@ -206,7 +206,8 @@ inline bool ComponentHeader(const char* label, bool& enabled, bool& outRemove, ImGui::PushID(label); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 4.0f)); - bool open = ImGui::CollapsingHeader("##hdr", ImGuiTreeNodeFlags_DefaultOpen); + const bool open = ImGui::CollapsingHeader("##hdr", ImGuiTreeNodeFlags_DefaultOpen | + ImGuiTreeNodeFlags_AllowOverlap); ImGui::PopStyleVar(); ImGui::SameLine(); @@ -219,10 +220,14 @@ inline bool ComponentHeader(const char* label, bool& enabled, bool& outRemove, } ImGui::TextUnformatted(label); - ImGui::SameLine(ImGui::GetContentRegionAvail().x + ImGui::GetCursorPosX() - 24.0f); - if (ImGui::SmallButton("...")) { - ImGui::OpenPopup("##cmenu"); - } + ImGui::SameLine(); + const float rest = ImGui::GetContentRegionAvail().x; + const float buttons = 52.0f; + if (rest > buttons) ImGui::Dummy(ImVec2(rest - buttons, 1.0f)); + ImGui::SameLine(); + if (ImGui::SmallButton("...")) ImGui::OpenPopup("##cmenu"); + ImGui::SameLine(); + if (ImGui::SmallButton("X")) outRemove = true; if (ImGui::BeginPopup("##cmenu")) { if (ImGui::MenuItem("Remove Component")) { outRemove = true; @@ -231,7 +236,7 @@ inline bool ComponentHeader(const char* label, bool& enabled, bool& outRemove, ImGui::EndPopup(); } ImGui::PopID(); - return open; + return outRemove ? true : open; } } // namespace Caffeine::Editor::Widgets diff --git a/src/editor/MaterialEditorPanel.cpp b/src/editor/MaterialEditorPanel.cpp index c879d1a6..174ec98d 100644 --- a/src/editor/MaterialEditorPanel.cpp +++ b/src/editor/MaterialEditorPanel.cpp @@ -151,7 +151,7 @@ void MaterialEditorPanel::assignToSelection(EditorContext& ctx, bool force) { } ++applied; } - if (applied > 0) ctx.isDirty = true; + if (applied > 0) ctx.markDirty(); } bool MaterialEditorPanel::createInAssetBrowser(EditorContext& ctx) { diff --git a/src/editor/ParticleEditorPanel.cpp b/src/editor/ParticleEditorPanel.cpp index dfb0f0c9..39d03390 100644 --- a/src/editor/ParticleEditorPanel.cpp +++ b/src/editor/ParticleEditorPanel.cpp @@ -96,45 +96,45 @@ void ParticleEditorPanel::onImGuiRender(EditorContext& ctx) { bool enabled = selected->enabled != 0; if (ImGui::Checkbox("Enabled", &enabled)) { selected->enabled = enabled ? 1 : 0; - ctx.isDirty = true; + ctx.markDirty(); } int domain = static_cast(selected->domain); const char* domains[] = {"2D and 3D", "2D", "3D"}; if (ImGui::Combo("Domain", &domain, domains, 3)) { selected->domain = static_cast(domain); - ctx.isDirty = true; + ctx.markDirty(); } const char* spaces[] = {"World", "Camera"}; int space = static_cast(selected->space); if (ImGui::Combo("Space", &space, spaces, 2)) { selected->space = static_cast(space); - ctx.isDirty = true; + ctx.markDirty(); } - if (dragFloat("Rate", selected->rate, 0.5f, 0.0f, 400.0f)) ctx.isDirty = true; - if (dragFloat("Lifetime", selected->lifetime, 0.02f, 0.05f, 20.0f)) ctx.isDirty = true; + if (dragFloat("Rate", selected->rate, 0.5f, 0.0f, 400.0f)) ctx.markDirty(); + if (dragFloat("Lifetime", selected->lifetime, 0.02f, 0.05f, 20.0f)) ctx.markDirty(); int cap = selected->maxParticles; if (ImGui::DragInt("Max", &cap, 1.0f, 1, 2048)) { selected->maxParticles = cap; - ctx.isDirty = true; + ctx.markDirty(); } - if (dragFloat("Start Size", selected->startSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; - if (dragFloat("End Size", selected->endSize, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; - if (ImGui::ColorEdit4("Start Color", &selected->startColor.x)) ctx.isDirty = true; - if (ImGui::ColorEdit4("End Color", &selected->endColor.x)) ctx.isDirty = true; - if (ImGui::DragFloat3("Velocity Min", &selected->velocityMin.x, 0.02f)) ctx.isDirty = true; - if (ImGui::DragFloat3("Velocity Max", &selected->velocityMax.x, 0.02f)) ctx.isDirty = true; - if (ImGui::DragFloat3("Gravity", &selected->gravity.x, 0.05f)) ctx.isDirty = true; - if (dragFloat("Drag", selected->drag, 0.01f, 0.0f, 8.0f)) ctx.isDirty = true; + if (dragFloat("Start Size", selected->startSize, 0.01f, 0.0f, 8.0f)) ctx.markDirty(); + if (dragFloat("End Size", selected->endSize, 0.01f, 0.0f, 8.0f)) ctx.markDirty(); + if (ImGui::ColorEdit4("Start Color", &selected->startColor.x)) ctx.markDirty(); + if (ImGui::ColorEdit4("End Color", &selected->endColor.x)) ctx.markDirty(); + if (ImGui::DragFloat3("Velocity Min", &selected->velocityMin.x, 0.02f)) ctx.markDirty(); + if (ImGui::DragFloat3("Velocity Max", &selected->velocityMax.x, 0.02f)) ctx.markDirty(); + if (ImGui::DragFloat3("Gravity", &selected->gravity.x, 0.05f)) ctx.markDirty(); + if (dragFloat("Drag", selected->drag, 0.01f, 0.0f, 8.0f)) ctx.markDirty(); char path[260] = {}; std::snprintf(path, sizeof(path), "%s", selected->materialPath); if (ImGui::InputText("Material", path, sizeof(path))) { std::snprintf(selected->materialPath, sizeof(selected->materialPath), "%s", path); - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::Button("Delete Particle")) { ctx.beginUndo(EditorCommand::RemoveEntity, selectedEntity.id(), *world); world->destroy(selectedEntity); - ctx.isDirty = true; + ctx.markDirty(); ctx.endUndo(*world); } ImGui::End(); diff --git a/src/editor/PluginSystem.cpp b/src/editor/PluginSystem.cpp index ead47b7c..d059632c 100644 --- a/src/editor/PluginSystem.cpp +++ b/src/editor/PluginSystem.cpp @@ -170,6 +170,7 @@ bool PluginManager::hostRegisterEntityPresetManifest(void* ctx, const char* plug if (!loaded.presets.empty()) { for (auto& preset : loaded.presets) { preset.source = id; + preset.plugin = id; EntityPresetRegistry::instance().registerPreset(std::move(preset)); } return true; @@ -197,7 +198,7 @@ CaffeinePluginU32 PluginManager::hostGetSelectedEntityId(void* editorContext) { void PluginManager::hostMarkSceneDirty(void* editorContext) { auto* ctx = static_cast(editorContext); - if (ctx) ctx->isDirty = true; + if (ctx) ctx->markDirty(); } bool PluginManager::hostInvokeService(void* ctx, const char* serviceName, const void* request, @@ -253,7 +254,7 @@ bool PluginManager::registerPanel(const std::string& pluginName, const std::stri FixedString<64> id(panel.commandId.c_str()); m_commandPalette->registerCommand( id, FixedString<128>(title.c_str()), FixedString<128>("Plugins"), - [this, title]() { openPanel(title); }); + [this, title]() { openPanel(title); }, true, pluginName.c_str()); } return true; } @@ -451,6 +452,26 @@ bool PluginManager::loadPluginInternal(const std::string& path, bool fromHotRelo return true; } +bool PluginManager::isContributionEnabled(const std::string& pluginName) const { + if (pluginName.empty()) return true; + if (const PluginHandle* handle = findLoadedPluginByStem(pluginName)) return handle->enabled; + const std::filesystem::path asPath(pluginName); + if (const PluginHandle* handle = findLoadedPluginByStem(asPath.stem().string())) { + return handle->enabled; + } + return false; +} + +bool PluginManager::isComponentDrawerEnabled(u32 componentTypeId) const { + bool found = false; + for (const auto& drawer : m_componentDrawers) { + if (drawer.componentTypeId != componentTypeId) continue; + found = true; + if (isContributionEnabled(drawer.pluginName)) return true; + } + return !found; +} + const PluginHandle* PluginManager::findLoadedPluginByStem( const std::string& stem) const { for (const auto& [path, handle] : m_loadedPlugins) { @@ -565,7 +586,7 @@ void PluginManager::refreshPlugins(float dt) { } for (auto& [name, handle] : m_loadedPlugins) { - if (handle.status != PluginStatus::Active || !handle.instance) continue; + if (!handle.enabled || handle.status != PluginStatus::Active || !handle.instance) continue; try { handle.instance->OnUpdate(0.5f); } catch (...) { @@ -594,10 +615,22 @@ void PluginManager::renderPanels() { } } +bool PluginManager::hasMenuItems(const char* topLevelMenu) const { + if (!topLevelMenu) return false; + for (const auto& action : m_menuActions) { + if (!isContributionEnabled(action.pluginName)) continue; + const auto slash = action.menuPath.find('/'); + if (slash == std::string::npos) continue; + if (action.menuPath.compare(0, slash, topLevelMenu) == 0) return true; + } + return false; +} + void PluginManager::renderMenuItems(const char* topLevelMenu) { if (!topLevelMenu) return; for (const auto& action : m_menuActions) { + if (!isContributionEnabled(action.pluginName)) continue; const auto slash = action.menuPath.find('/'); if (slash == std::string::npos) continue; @@ -612,8 +645,17 @@ void PluginManager::renderMenuItems(const char* topLevelMenu) { } void PluginManager::renderMenuExtensions() { - if (!m_panels.empty() && ImGui::BeginMenu("Window")) { + bool any = false; + for (const auto& panel : m_panels) { + if (isContributionEnabled(panel.pluginName)) { + any = true; + break; + } + } + if (!any) return; + if (ImGui::BeginMenu("Window")) { for (auto& panel : m_panels) { + if (!isContributionEnabled(panel.pluginName)) continue; ImGui::MenuItem(panel.title.c_str(), nullptr, &panel.open); } ImGui::EndMenu(); @@ -656,7 +698,13 @@ void PluginManager::renderManagerUI() { for (auto& [path, handle] : m_loadedPlugins) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); + const bool wasEnabled = handle.enabled; ImGui::Checkbox(("##en" + handle.name).c_str(), &handle.enabled); + if (wasEnabled && !handle.enabled) { + for (auto& panel : m_panels) { + if (panel.pluginName == handle.name) panel.open = false; + } + } ImGui::TableSetColumnIndex(1); ImGui::TextUnformatted(handle.name.c_str()); diff --git a/src/editor/PluginSystem.hpp b/src/editor/PluginSystem.hpp index f1aa2b68..116d8905 100644 --- a/src/editor/PluginSystem.hpp +++ b/src/editor/PluginSystem.hpp @@ -89,6 +89,11 @@ class PluginManager { const std::unordered_map& plugins() const { return m_loadedPlugins; } const std::vector& panels() const { return m_panels; } + /// Empty name is always on. Missing or disabled plugins return false. + bool isContributionEnabled(const std::string& pluginName) const; + /// True when no plugin owns the drawer, or the owning plugin is enabled. + bool isComponentDrawerEnabled(u32 componentTypeId) const; + bool hasMenuItems(const char* topLevelMenu) const; // Editor-side registration (also used by host API callbacks) bool registerPanel(const std::string& pluginName, const std::string& title, diff --git a/src/editor/ProjectManager.cpp b/src/editor/ProjectManager.cpp index 7c3bffd2..445851fa 100644 --- a/src/editor/ProjectManager.cpp +++ b/src/editor/ProjectManager.cpp @@ -217,13 +217,29 @@ std::filesystem::path ProjectManager::DefaultRecentPath() { #endif } +void ProjectManager::EnsureDefaultFolders(const std::filesystem::path& root) { + if (root.empty()) return; + std::error_code ec; + const char* folders[] = { + "assets/raw", + "assets/raw/Animations", + "assets/raw/Models", + "assets/raw/Materials", + "assets/raw/Textures", + "assets/raw/Audio", + "assets/raw/Prefabs", + "assets/raw/Sky", + "assets/processed", + "scripts", + "scenes", + "build", + }; + for (const char* folder : folders) std::filesystem::create_directories(root / folder, ec); +} + void ProjectManager::CreateDirectoryStructure(const std::filesystem::path& root) { std::filesystem::create_directories(root); - std::filesystem::create_directories(root / "assets" / "raw"); - std::filesystem::create_directories(root / "assets" / "processed"); - std::filesystem::create_directories(root / "scripts"); - std::filesystem::create_directories(root / "scenes"); - std::filesystem::create_directories(root / "build"); + EnsureDefaultFolders(root); } bool ProjectManager::SaveProjectFile(const ProjectConfig& config) { @@ -316,16 +332,7 @@ bool ProjectManager::CreateNewProject(const ProjectConfig& config) { std::error_code ec; std::filesystem::create_directories(config.RootPath, ec); if (ec) return false; - std::filesystem::create_directories(config.RootPath / "assets" / "raw", ec); - if (ec) return false; - std::filesystem::create_directories(config.RootPath / "assets" / "processed", ec); - if (ec) return false; - std::filesystem::create_directories(config.RootPath / "scripts", ec); - if (ec) return false; - std::filesystem::create_directories(config.RootPath / "scenes", ec); - if (ec) return false; - std::filesystem::create_directories(config.RootPath / "build", ec); - if (ec) return false; + EnsureDefaultFolders(config.RootPath); if (!SaveProjectFile(config)) return false; Scene::importDefaultSkyboxes(config.RootPath); @@ -344,6 +351,7 @@ bool ProjectManager::OpenProject(const std::filesystem::path& projectFilePath) { if (IsPackagedBuildRoot(cfg.RootPath, cfg)) return false; m_CurrentConfig = cfg; + EnsureDefaultFolders(cfg.RootPath); Scene::importDefaultSkyboxes(cfg.RootPath); UpdateRecentProjects(resolved); diff --git a/src/editor/ProjectManager.hpp b/src/editor/ProjectManager.hpp index 5265b703..8a0db161 100644 --- a/src/editor/ProjectManager.hpp +++ b/src/editor/ProjectManager.hpp @@ -69,6 +69,9 @@ class ProjectManager { // Canonical editor project root (never a nested build/ output folder). static std::filesystem::path ResolveEditorProjectRoot(std::filesystem::path root); + /// Creates the default project folders (Animations, Models, Materials, ...) if they are missing. + static void EnsureDefaultFolders(const std::filesystem::path& root); + // Override the recent projects file path (used for testing). // Reloads from the new path immediately. void SetRecentProjectsPath(std::filesystem::path path) { diff --git a/src/editor/SceneEditor.cpp b/src/editor/SceneEditor.cpp index 1c4a24a7..d56dd421 100644 --- a/src/editor/SceneEditor.cpp +++ b/src/editor/SceneEditor.cpp @@ -6,6 +6,7 @@ #include "physics/PhysicsComponents2D.hpp" #include "editor/ComponentRegistry.hpp" #include "editor/EditorIcons.hpp" +#include "editor/EditorShortcuts.hpp" #include "debug/Profiler.hpp" #include "debug/LogSystem.hpp" #include "editor/PluginSystem.hpp" @@ -14,6 +15,7 @@ #include "editor/EntityPresetRegistry.hpp" #include "editor/EditorPaths.hpp" #include "scene/HierarchySystem.hpp" +#include "scene/EnvironmentEffectsSystem.hpp" #include "scene/PlayMode2D.hpp" #include "navigation/NavigationSystem.hpp" #include "effects/EffectSystem.hpp" @@ -69,67 +71,80 @@ bool SceneEditor::init(RHI::RenderDevice* device, Assets::AssetManager* assetMan m_hierarchy.setOpenPresetsCallback([this]() { m_entityPresets.open(); }); m_tabManager.newScene("Untitled"); - m_commandPalette.registerCommand("panel_hierarchy", "Hierarchy Panel", "Panels", [this]() { + m_commandPalette.registerCommand("panel_hierarchy", "Hierarchy Panel", "Scene", [this]() { m_hierarchy.open(); }); - m_commandPalette.registerCommand("panel_inspector", "Inspector Panel", "Panels", [this]() { + m_commandPalette.registerCommand("panel_inspector", "Inspector Panel", "Scene", [this]() { m_inspector.open(); }); - m_commandPalette.registerCommand("panel_console", "Console", "Panels", [this]() { + m_commandPalette.registerCommand("panel_console", "Console", "Debug", [this]() { m_console.open(); }); - m_commandPalette.registerCommand("panel_profiler", "Profiler", "Panels", [this]() { + m_commandPalette.registerCommand("panel_profiler", "Profiler", "Debug", [this]() { m_profiler.open(); }); - m_commandPalette.registerCommand("panel_entity_debugger", "Entity Debugger", "Panels", [this]() { + m_commandPalette.registerCommand("panel_entity_debugger", "Entity Debugger", "Debug", [this]() { m_entityDebugger.open(); }); - m_commandPalette.registerCommand("panel_plugin_manager", "Plugin Manager", "Panels", [this]() { + m_commandPalette.registerCommand("panel_plugin_manager", "Plugin Manager", "Plugins", [this]() { PluginManager::instance().openManager(); }); - m_commandPalette.registerCommand("panel_asset_browser", "Asset Browser", "Panels", [this]() { + m_commandPalette.registerCommand("panel_asset_browser", "Asset Browser", "Content", [this]() { m_assetBrowser.open(); }); - m_commandPalette.registerCommand("panel_animation_timeline", "Animation Timeline", "Panels", [this]() { + m_commandPalette.registerCommand("panel_animation_timeline", "Animation Timeline", "Animation", [this]() { m_animationTimeline.open(); }); - m_commandPalette.registerCommand("panel_animator_controller", "Animator Controller", "Panels", [this]() { + m_commandPalette.registerCommand("panel_animator_controller", "Animator Controller", "Animation", [this]() { m_animatorController.open(); }); - m_commandPalette.registerCommand("panel_tilemap", "Tilemap Editor", "Panels", [this]() { + m_commandPalette.registerCommand("panel_tilemap", "Tilemap Editor", "Content", [this]() { m_tilemapEditor.open(); }); - m_commandPalette.registerCommand("panel_script_editor", "Script Editor", "Panels", [this]() { + m_commandPalette.registerCommand("panel_script_editor", "Script Editor", "Tools", [this]() { m_scriptEditor.open(); }); - m_commandPalette.registerCommand("panel_material_editor", "Material Editor", "Panels", [this]() { + m_commandPalette.registerCommand("panel_material_editor", "Material Editor", "Content", [this]() { m_materialEditor.open(); }); - m_commandPalette.registerCommand("panel_image_manager", "Image Manager", "Panels", [this]() { + m_commandPalette.registerCommand("panel_image_manager", "Image Manager", "Content", [this]() { m_imageManager.open(); }); - m_commandPalette.registerCommand("panel_hud_editor", "HUD Editor", "Panels", [this]() { + m_commandPalette.registerCommand("panel_hud_editor", "HUD Editor", "Tools", [this]() { m_hudEditor.open(); }); - m_commandPalette.registerCommand("panel_particles", "Particles", "Panels", [this]() { + m_commandPalette.registerCommand("panel_particles", "Particles", "Tools", [this]() { m_particleEditor.open(); }); - m_commandPalette.registerCommand("panel_effects", "Effects", "Panels", [this]() { + m_commandPalette.registerCommand("panel_effects", "Effects", "Tools", [this]() { m_effectEditor.open(); }); - m_commandPalette.registerCommand("panel_terrain_editor", "Terrain Editor", "Panels", [this]() { + m_commandPalette.registerCommand("panel_terrain_editor", "Terrain Editor", "Tools", [this]() { m_terrainEditor.open(); }); - m_commandPalette.registerCommand("panel_entity_presets", "Entity Presets", "Panels", [this]() { + m_commandPalette.registerCommand("panel_entity_presets", "Entity Presets", "Scene", [this]() { m_entityPresets.open(); }); - m_commandPalette.registerCommand("panel_gameplay_preview", "Gameplay Preview", "Panels", [this]() { + m_commandPalette.registerCommand("panel_gameplay_preview", "Gameplay Preview", "Scene", [this]() { m_gameplayPreview.open(); }); - m_commandPalette.registerCommand("panel_settings", "Settings", "Panels", [this]() { + m_commandPalette.registerCommand("panel_settings", "Settings", "Tools", [this]() { m_settingsPanel.open(); }); - m_commandPalette.registerCommand("panel_viewport", "Scene Viewport", "Panels", [this]() { + m_commandPalette.registerCommand("panel_viewport", "Scene Viewport", "Scene", [this]() { + m_viewport.open(); + }); + m_commandPalette.registerCommand("panel_toolbox", "Toolbox", "Scene", [this]() { + m_toolbox.open(); + }); + m_commandPalette.registerCommand("panel_audio_preview", "Audio Preview", "Content", [this]() { + m_audioPreview.open(); + }); + m_commandPalette.registerCommand("panel_camera_preview", "Camera Preview", "Scene", [this]() { + m_cameraPreview.open(); + }); + m_commandPalette.registerCommand("action_build", "Build and Run", "Actions", [this]() { + m_buildDialog.open(); }); m_commandPalette.registerCommand("action_new_scene", "New Scene", "Actions", [this]() { @@ -209,6 +224,26 @@ bool SceneEditor::init(RHI::RenderDevice* device, Assets::AssetManager* assetMan #endif registerAllComponents(ComponentRegistry::instance()); + { + int index = 0; + for (const auto& entry : ComponentRegistry::instance().entries()) { + const std::string id = "add_component_" + std::to_string(index++); + const std::string label = std::string("Add ") + entry.name; + m_commandPalette.registerCommand( + Caffeine::FixedString<64>(id.c_str()), Caffeine::FixedString<128>(label.c_str()), + Caffeine::FixedString<128>("Components"), + [this, entry]() { + ECS::World* world = m_tabManager.activeWorld(); + if (!world || !m_ctx.selectedEntity.isValid()) return; + if (entry.has(*world, m_ctx.selectedEntity)) return; + m_ctx.beginUndo(EditorCommand::AddComponent, m_ctx.selectedEntity.id(), *world); + entry.add(*world, m_ctx.selectedEntity); + m_ctx.endUndo(*world); + }, + true, entry.plugin.empty() ? nullptr : entry.plugin.c_str(), + entry.keywords.empty() ? nullptr : entry.keywords.c_str()); + } + } registerPlayModeEventListeners(); Debug::LogSystem::instance().addSink([this](Debug::LogLevel level, const char* category, const char* message) { @@ -446,8 +481,12 @@ void SceneEditor::exitPlayMode(ECS::World& world) { void SceneEditor::tickSystems(ECS::World& world, f32 dt) { Animation::setSkinProjectRoot(m_ctx.projectRootPath.string()); + const Vec3 editorCam = + editorCameraPosition(m_ctx.camYaw, m_ctx.camPitch, m_ctx.camDistance, m_ctx.camFocus); + Scene::tickEnvironmentEffects(world, (m_isPlaying && !m_isPaused) ? dt : 0.0f, + Scene::firstCamera3DPosition(world, editorCam)); if (!m_isPlaying || m_isPaused) { - Animation::tickSkinnedPoses(world, m_isPlaying ? 0.0f : dt); + Scene::propagateTransforms(world); return; } @@ -924,6 +963,39 @@ void SceneEditor::render(f32 deltaTime) { m_inspector.render(*activeWorld, m_ctx); } renderPlaybar(*activeWorld); + if (m_ctx.selectedEntity.isValid()) { + Animation::ensurePoseForMesh(*activeWorld, m_ctx.selectedEntity, + m_ctx.projectRootPath.string()); + } + { + CF_PROFILE_SCOPE("SceneEditor::animationEditors"); + i32 posedBone = -1; + if (m_ctx.skeletonEntityId == m_ctx.selectedEntity.id()) posedBone = m_ctx.skeletonBone; + m_animationTimeline.setScene(activeWorld, m_ctx.selectedEntity.id(), posedBone); + m_animationTimeline.setProjectRoot(m_ctx.projectRootPath.string()); + m_animationTimeline.render(deltaTime); + if (m_animationTimeline.consumePickedBone(posedBone)) { + m_ctx.skeletonEntityId = m_ctx.selectedEntity.id(); + m_ctx.skeletonBone = posedBone; + } + m_animatorController.bindSelection(activeWorld, m_ctx.selectedEntity, + m_ctx.projectRootPath.string()); + m_animatorController.render(); + if (!m_isPlaying || m_isPaused) { + f32 skinDt = 0.0f; + if (m_animationTimeline.isPlaying()) { + skinDt = deltaTime; + } else { + ECS::ComponentQuery playing; + playing.with(); + activeWorld->forEach( + playing, [&](ECS::Entity, Animation::SkinnedPose& pose) { + if (pose.playing && !pose.timelineHold) skinDt = deltaTime; + }); + } + Animation::tickSkinnedPoses(*activeWorld, skinDt); + } + } m_viewport.setFrameCommandBuffer(m_frameCmd); #ifdef CF_HAS_SDL3 m_gameplayPreview.setFrameCommandBuffer(m_frameCmd); @@ -1011,10 +1083,6 @@ void SceneEditor::render(f32 deltaTime) { m_materialEditor.setFrameCommandBuffer(nullptr); m_assetBrowser.setFrameCommandBuffer(nullptr); #endif - m_animationTimeline.setScene(activeWorld, m_ctx.selectedEntity.id()); - m_animationTimeline.render(deltaTime); - m_animatorController.bindSelection(activeWorld, m_ctx.selectedEntity); - m_animatorController.render(); m_tilemapEditor.render(); m_commandPalette.render(); m_buildDialog.render(); @@ -1114,29 +1182,29 @@ void SceneEditor::renderMainMenuBar(ECS::World& world) { ImGui::EndMenu(); } if (ImGui::BeginMenu("Edit")) { - if (EditorIcons::menuItem(EditorIcon::Undo, "Undo", "Ctrl+Z", false, m_ctx.undoStack.canUndo())) { + if (EditorIcons::menuItem(EditorIcon::Undo, "Undo", EditorShortcuts::instance().chord(Shortcut::Undo), false, m_ctx.undoStack.canUndo())) { m_ctx.undoStack.undo(world); if (!world.isEntityAlive(m_ctx.selectedEntity)) m_ctx.selectedEntity = ECS::Entity::INVALID; } - if (EditorIcons::menuItem(EditorIcon::Redo, "Redo", "Ctrl+Y", false, m_ctx.undoStack.canRedo())) { + if (EditorIcons::menuItem(EditorIcon::Redo, "Redo", EditorShortcuts::instance().chord(Shortcut::Redo), false, m_ctx.undoStack.canRedo())) { m_ctx.undoStack.redo(world); if (!world.isEntityAlive(m_ctx.selectedEntity)) m_ctx.selectedEntity = ECS::Entity::INVALID; } ImGui::Separator(); - if (EditorIcons::menuItem(EditorIcon::Copy, "Copy", "Ctrl+C", false, m_ctx.selectedEntity.isValid())) { + if (EditorIcons::menuItem(EditorIcon::Copy, "Copy", EditorShortcuts::instance().chord(Shortcut::Copy), false, m_ctx.selectedEntity.isValid())) { m_ctx.clipboardEntity = m_ctx.selectedEntity; } - if (EditorIcons::menuItem(EditorIcon::Paste, "Paste", "Ctrl+V", false, m_ctx.clipboardEntity.isValid())) { + if (EditorIcons::menuItem(EditorIcon::Paste, "Paste", EditorShortcuts::instance().chord(Shortcut::Paste), false, m_ctx.clipboardEntity.isValid())) { m_hierarchy.duplicateEntity(world, m_ctx.clipboardEntity); } - if (EditorIcons::menuItem(EditorIcon::Duplicate, "Duplicate", "Ctrl+D", false, m_ctx.selectedEntity.isValid())) { + if (EditorIcons::menuItem(EditorIcon::Duplicate, "Duplicate", EditorShortcuts::instance().chord(Shortcut::Duplicate), false, m_ctx.selectedEntity.isValid())) { m_hierarchy.duplicateEntity(world, m_ctx.selectedEntity); } PluginManager::instance().renderMenuItems("Edit"); ImGui::EndMenu(); } - if (ImGui::BeginMenu("Help")) { + if (PluginManager::instance().hasMenuItems("Help") && ImGui::BeginMenu("Help")) { PluginManager::instance().renderMenuItems("Help"); ImGui::EndMenu(); } @@ -1349,20 +1417,13 @@ void SceneEditor::renderStatusBar(ECS::World& world) { // ── Shortcuts ─────────────────────────────────────────────────── void SceneEditor::handleShortcuts(ECS::World& world) { - bool ctrl = ImGui::GetIO().KeyCtrl; - bool shift = ImGui::GetIO().KeyShift; - - if (ctrl && ImGui::IsKeyPressed(ImGuiKey_L)) { + if (EditorShortcuts::instance().pressed(Shortcut::CommandPalette) || + EditorShortcuts::instance().pressed(Shortcut::CommandPaletteAlt)) { m_commandPalette.toggle(); return; } - if (ctrl && shift && ImGui::IsKeyPressed(ImGuiKey_P)) { - m_commandPalette.toggle(); - return; - } - - if (ctrl && ImGui::IsKeyPressed(ImGuiKey_S)) { + if (EditorShortcuts::instance().pressed(Shortcut::Save)) { const bool saveMaterial = m_materialEditor.isOpen() && (m_materialEditor.wasFocusedLastFrame() || m_materialEditor.isDirty()); if (saveMaterial) m_materialEditor.handleSaveShortcut(); @@ -1374,7 +1435,7 @@ void SceneEditor::handleShortcuts(ECS::World& world) { } } } - if (ctrl && ImGui::IsKeyPressed(ImGuiKey_N)) { + if (EditorShortcuts::instance().pressed(Shortcut::NewScene)) { if (m_ctx.isDirty) { m_pendingAction = PendingAction::NewScene; ImGui::OpenPopup("Unsaved Changes?"); @@ -1382,30 +1443,26 @@ void SceneEditor::handleShortcuts(ECS::World& world) { doNewScene(); } } - if (ctrl && ImGui::IsKeyPressed(ImGuiKey_Z)) { - if (ImGui::GetIO().KeyShift) { - if (m_ctx.undoStack.canRedo()) m_ctx.undoStack.redo(world); - } else { - if (m_ctx.undoStack.canUndo()) m_ctx.undoStack.undo(world); - } + if (EditorShortcuts::instance().pressed(Shortcut::Undo)) { + if (m_ctx.undoStack.canUndo()) m_ctx.undoStack.undo(world); if (!world.isEntityAlive(m_ctx.selectedEntity)) m_ctx.selectedEntity = ECS::Entity::INVALID; } - if (ctrl && ImGui::IsKeyPressed(ImGuiKey_Y)) { + if (EditorShortcuts::instance().pressed(Shortcut::Redo)) { if (m_ctx.undoStack.canRedo()) m_ctx.undoStack.redo(world); if (!world.isEntityAlive(m_ctx.selectedEntity)) m_ctx.selectedEntity = ECS::Entity::INVALID; } - if (ctrl && ImGui::IsKeyPressed(ImGuiKey_C)) { + if (EditorShortcuts::instance().pressed(Shortcut::Copy)) { if (m_ctx.selectedEntity.isValid()) { m_ctx.clipboardEntity = m_ctx.selectedEntity; } } - if (ctrl && ImGui::IsKeyPressed(ImGuiKey_V)) { + if (EditorShortcuts::instance().pressed(Shortcut::Paste)) { if (m_ctx.clipboardEntity.isValid()) { m_hierarchy.duplicateEntity(world, m_ctx.clipboardEntity); } } - if (ctrl && ImGui::IsKeyPressed(ImGuiKey_D)) { + if (EditorShortcuts::instance().pressed(Shortcut::Duplicate)) { if (m_ctx.selectedEntity.isValid()) { m_hierarchy.duplicateEntity(world, m_ctx.selectedEntity); } diff --git a/src/editor/SceneSerializer.cpp b/src/editor/SceneSerializer.cpp index 4144c7e1..8fbc24dd 100644 --- a/src/editor/SceneSerializer.cpp +++ b/src/editor/SceneSerializer.cpp @@ -14,6 +14,7 @@ #include "effects/EffectTypes.hpp" #include "navigation/NavVolume.hpp" #include "ecs/PostProcessComponents.hpp" +#include "ecs/EnvironmentEffectsComponents.hpp" #include "physics/PhysicsComponents2D.hpp" #include "physics/PhysicsComponents3D.hpp" #include "script/ScriptTypes.hpp" @@ -467,6 +468,77 @@ void SceneSerializer::collectAnimatorComponents( IO::appendString(data, evt.cStr()); } + IO::appendU32(data, kAnimatorEditorMarker); + IO::appendString(data, anim.defaultState.cStr()); + IO::appendU32(data, static_cast(anim.states.size())); + for (auto& [stateName, state] : anim.states) { + IO::appendString(data, stateName.cStr()); + IO::appendString(data, state.motion.cStr()); + IO::appendU8(data, state.hasEditorPosition ? 1 : 0); + IO::appendF32(data, state.editorX); + IO::appendF32(data, state.editorY); + } + + auto writeCurve = [&](const Animation::KeyCurve& curve) { + IO::appendU8(data, static_cast(curve.mode)); + IO::appendF32(data, curve.x1); + IO::appendF32(data, curve.y1); + IO::appendF32(data, curve.x2); + IO::appendF32(data, curve.y2); + }; + auto writeTransition = [&](const Animation::AnimationTransition& tr) { + IO::appendString(data, tr.toState.cStr()); + IO::appendF32(data, tr.blendTime); + IO::appendU8(data, tr.hasExitTime ? 1 : 0); + IO::appendF32(data, tr.exitTime); + IO::appendF32(data, tr.offset); + writeCurve(tr.blendCurve); + IO::appendU32(data, static_cast(tr.conditions.size())); + for (const auto& cond : tr.conditions) { + IO::appendString(data, cond.parameterName.cStr()); + IO::appendU8(data, static_cast(cond.op)); + IO::appendU8(data, cond.boolValue ? 1 : 0); + IO::appendF32(data, cond.floatValue); + IO::appendI32(data, cond.intValue); + } + }; + auto writeMachine = [&](const Animation::AnimatorStateMachine& sm) { + IO::appendString(data, sm.defaultState.cStr()); + IO::appendF32(data, sm.entryX); + IO::appendF32(data, sm.entryY); + IO::appendF32(data, sm.anyX); + IO::appendF32(data, sm.anyY); + IO::appendF32(data, sm.exitX); + IO::appendF32(data, sm.exitY); + IO::appendU32(data, static_cast(sm.anyStateTransitions.size())); + for (const auto& tr : sm.anyStateTransitions) writeTransition(tr); + IO::appendU32(data, static_cast(sm.states.size())); + for (auto& [stateName, state] : sm.states) { + IO::appendString(data, stateName.cStr()); + IO::appendString(data, state.motion.cStr()); + IO::appendF32(data, state.speed); + IO::appendU8(data, state.hasEditorPosition ? 1 : 0); + IO::appendF32(data, state.editorX); + IO::appendF32(data, state.editorY); + IO::appendU32(data, static_cast(state.transitions.size())); + for (const auto& tr : state.transitions) writeTransition(tr); + } + }; + IO::appendU32(data, kAnimatorGraphMarker); + writeMachine(anim); + IO::appendU32(data, static_cast(anim.layers.size())); + for (const Animation::AnimatorLayer& layer : anim.layers) { + IO::appendString(data, layer.name.cStr()); + IO::appendString(data, layer.parentGroup.cStr()); + IO::appendU8(data, layer.isGroup ? 1 : 0); + IO::appendU8(data, layer.muted ? 1 : 0); + IO::appendU8(data, layer.expanded ? 1 : 0); + IO::appendF32(data, layer.weight); + IO::appendU8(data, static_cast(layer.blend)); + IO::appendU32(data, layer.mask); + if (!layer.isGroup) writeMachine(layer); + } + entries.push_back({e.id(), std::move(data)}); }); } @@ -1049,7 +1121,8 @@ bool SceneSerializer::serializeToMemory(std::vector& out, const std::string& query.with(); m_world.forEach(query, [&](ECS::Entity entity, Animation::SkinnedPose& pose) { const u32 pathLen = static_cast(std::strlen(pose.meshPath)); - std::vector data(4 + pathLen + sizeof(i32) + sizeof(f32) * 2 + 2); + constexpr u32 kHumanoidBytes = static_cast(sizeof(i32) * static_cast(Animation::HumanoidBone::Count)); + std::vector data(4 + pathLen + sizeof(i32) + sizeof(f32) * 2 + 2 + 2 + kHumanoidBytes); u32 offset = 0; std::memcpy(data.data() + offset, &pathLen, 4); offset += 4; @@ -1063,11 +1136,79 @@ bool SceneSerializer::serializeToMemory(std::vector& out, const std::string& offset += sizeof(f32); data[offset++] = pose.playing ? 1 : 0; data[offset++] = pose.loop ? 1 : 0; + data[offset++] = 1; + data[offset++] = static_cast((pose.humanoid.matched ? 1 : 0) | (pose.humanoid.manual ? 2 : 0) | (1u << 2)); + std::memcpy(data.data() + offset, pose.humanoid.bones, kHumanoidBytes); + offset += kHumanoidBytes; + auto appendBytes = [&](const void* bytes, u32 size) { + data.resize(offset + size); + if (size > 0) std::memcpy(data.data() + offset, bytes, size); + offset += size; + }; + auto appendVec3 = [&](const Vec3& value) { appendBytes(&value.x, sizeof(f32) * 3); }; + const u32 offsetCount = static_cast(pose.offsets.size()); + const u32 keyCount = static_cast(pose.keys.size()); + const u32 objectCount = static_cast(pose.objectKeys.size()); + appendBytes(&offsetCount, 4); + for (const Animation::BonePose& bone : pose.offsets) { + appendVec3(bone.rotation); + appendVec3(bone.translation); + } + appendBytes(&keyCount, 4); + for (const Animation::BoneKeyframe& key : pose.keys) { + appendBytes(&key.time, sizeof(f32)); + appendBytes(&key.bone, sizeof(i32)); + appendVec3(key.rotation); + appendVec3(key.translation); + } + appendBytes(&objectCount, 4); + for (const Animation::ObjectKeyframe& key : pose.objectKeys) { + appendBytes(&key.time, sizeof(f32)); + appendVec3(key.position); + } + const u32 removedCount = static_cast(pose.removedBones.size()); + appendBytes(&removedCount, 4); + for (i32 bone : pose.removedBones) appendBytes(&bone, sizeof(i32)); + const u32 curveMarker = kPoseCurveMarker; + appendBytes(&curveMarker, 4); + auto appendCurve = [&](const Animation::KeyCurve& curve) { + const u8 mode = static_cast(curve.mode); + appendBytes(&mode, 1); + appendBytes(&curve.x1, sizeof(f32)); + appendBytes(&curve.y1, sizeof(f32)); + appendBytes(&curve.x2, sizeof(f32)); + appendBytes(&curve.y2, sizeof(f32)); + }; + for (const Animation::BoneKeyframe& key : pose.keys) appendCurve(key.curve); + for (const Animation::ObjectKeyframe& key : pose.objectKeys) appendCurve(key.curve); + const u32 stripMarker = kPoseStripMarker; + appendBytes(&stripMarker, 4); + const u32 stripCount = static_cast(pose.strips.size()); + appendBytes(&stripCount, 4); + for (const Animation::ClipStrip& strip : pose.strips) { + appendBytes(&strip.clip, sizeof(i32)); + appendBytes(&strip.track, sizeof(i32)); + appendBytes(&strip.start, sizeof(f32)); + appendBytes(&strip.clipIn, sizeof(f32)); + appendBytes(&strip.clipOut, sizeof(f32)); + appendBytes(&strip.speed, sizeof(f32)); + appendBytes(&strip.repeat, sizeof(i32)); + appendBytes(&strip.fadeIn, sizeof(f32)); + appendBytes(&strip.fadeOut, sizeof(f32)); + appendCurve(strip.fadeInCurve); + appendCurve(strip.fadeOutCurve); + appendBytes(&strip.weight, sizeof(f32)); + const u8 flags = static_cast((strip.muted ? 1 : 0) | (strip.reverse ? 2 : 0)); + appendBytes(&flags, 1); + appendBytes(&strip.loopBlend, sizeof(f32)); + appendBytes(strip.state, 32); + } entityMap[entity.id()].emplace_back(kTypeSkinnedPose, std::move(data)); }); } emitPodComponents(kTypeSpriteSheet, entityMap); emitPodComponents(kTypeEffect, entityMap); + emitPodComponents(kTypeEnvironmentEffects, entityMap); { ECS::ComponentQuery query; query.with(); @@ -1419,8 +1560,121 @@ bool SceneSerializer::deserializeFromMemory(const std::vector& buffer, const std::memcpy(&pose.speed, entry.data.data() + offset, sizeof(f32)); offset += sizeof(f32); pose.playing = entry.data[offset++] != 0; - pose.loop = entry.data[offset] != 0; - pose.loaded = false; + pose.loop = entry.data[offset++] != 0; + constexpr u32 kHumanoidBytes = static_cast(sizeof(i32) * static_cast(Animation::HumanoidBone::Count)); + constexpr u32 kLegacyHumanoidBytes = static_cast(sizeof(i32) * Animation::kHumanoidLegacyCount); + if (offset + 2 + kLegacyHumanoidBytes <= entry.data.size() && entry.data[offset] == 1) { + ++offset; + const u8 flags = entry.data[offset++]; + const u32 storedBytes = ((flags >> 2) & 0x7u) >= 1u ? kHumanoidBytes : kLegacyHumanoidBytes; + if (offset + storedBytes > entry.data.size()) break; + std::memcpy(pose.humanoid.bones, entry.data.data() + offset, + std::min(storedBytes, kHumanoidBytes)); + pose.humanoid.matched = (flags & 1) != 0; + pose.humanoid.manual = (flags & 2) != 0; + if (pose.humanoid.manual) pose.loaded = true; + offset += storedBytes; + auto readBytes = [&](void* bytes, u32 size) -> bool { + if (offset + size > entry.data.size()) return false; + if (size > 0) std::memcpy(bytes, entry.data.data() + offset, size); + offset += size; + return true; + }; + auto readVec3 = [&](Vec3& value) -> bool { return readBytes(&value.x, sizeof(f32) * 3); }; + u32 offsetCount = 0; + u32 keyCount = 0; + u32 objectCount = 0; + if (readBytes(&offsetCount, 4) && offsetCount < 10000) { + pose.offsets.resize(offsetCount); + bool ok = true; + for (Animation::BonePose& bone : pose.offsets) { + ok = ok && readVec3(bone.rotation) && readVec3(bone.translation); + } + ok = ok && readBytes(&keyCount, 4) && keyCount < 100000; + if (ok) { + pose.keys.resize(keyCount); + for (Animation::BoneKeyframe& key : pose.keys) { + ok = ok && readBytes(&key.time, sizeof(f32)) && readBytes(&key.bone, sizeof(i32)); + ok = ok && readVec3(key.rotation) && readVec3(key.translation); + } + } + ok = ok && readBytes(&objectCount, 4) && objectCount < 100000; + if (ok) { + pose.objectKeys.resize(objectCount); + for (Animation::ObjectKeyframe& key : pose.objectKeys) { + ok = ok && readBytes(&key.time, sizeof(f32)) && readVec3(key.position); + } + } + if (!ok) { + pose.offsets.clear(); + pose.keys.clear(); + pose.objectKeys.clear(); + } else { + u32 removedCount = 0; + if (readBytes(&removedCount, 4) && removedCount < 10000) { + pose.removedBones.resize(removedCount); + for (i32& bone : pose.removedBones) { + if (!readBytes(&bone, sizeof(i32))) { + pose.removedBones.clear(); + break; + } + } + } + u32 curveMarker = 0; + if (readBytes(&curveMarker, 4) && curveMarker == kPoseCurveMarker) { + auto readCurve = [&](Animation::KeyCurve& curve) -> bool { + u8 mode = 0; + if (!readBytes(&mode, 1)) return false; + if (mode > static_cast(Animation::KeyInterp::Custom)) mode = 0; + curve.mode = static_cast(mode); + return readBytes(&curve.x1, sizeof(f32)) && readBytes(&curve.y1, sizeof(f32)) && + readBytes(&curve.x2, sizeof(f32)) && readBytes(&curve.y2, sizeof(f32)); + }; + for (Animation::BoneKeyframe& key : pose.keys) { + if (!readCurve(key.curve)) break; + } + for (Animation::ObjectKeyframe& key : pose.objectKeys) { + if (!readCurve(key.curve)) break; + } + } + u32 stripMarker = 0; + u32 stripCount = 0; + if (readBytes(&stripMarker, 4) && stripMarker == kPoseStripMarker && + readBytes(&stripCount, 4) && stripCount < 10000) { + pose.strips.resize(stripCount); + pose.stripsInitialized = true; + for (Animation::ClipStrip& strip : pose.strips) { + u8 flags = 0; + if (!readBytes(&strip.clip, sizeof(i32)) || !readBytes(&strip.track, sizeof(i32)) || + !readBytes(&strip.start, sizeof(f32)) || !readBytes(&strip.clipIn, sizeof(f32)) || + !readBytes(&strip.clipOut, sizeof(f32)) || !readBytes(&strip.speed, sizeof(f32)) || + !readBytes(&strip.repeat, sizeof(i32)) || !readBytes(&strip.fadeIn, sizeof(f32)) || + !readBytes(&strip.fadeOut, sizeof(f32))) { + pose.strips.clear(); + break; + } + auto readCurve = [&](Animation::KeyCurve& curve) -> bool { + u8 mode = 0; + if (!readBytes(&mode, 1)) return false; + if (mode > static_cast(Animation::KeyInterp::Custom)) mode = 0; + curve.mode = static_cast(mode); + return readBytes(&curve.x1, sizeof(f32)) && readBytes(&curve.y1, sizeof(f32)) && + readBytes(&curve.x2, sizeof(f32)) && readBytes(&curve.y2, sizeof(f32)); + }; + if (!readCurve(strip.fadeInCurve) || !readCurve(strip.fadeOutCurve) || + !readBytes(&strip.weight, sizeof(f32)) || !readBytes(&flags, 1) || + !readBytes(&strip.loopBlend, sizeof(f32)) || !readBytes(strip.state, 32)) { + pose.strips.clear(); + break; + } + strip.muted = (flags & 1) != 0; + strip.reverse = (flags & 2) != 0; + strip.state[31] = 0; + } + } + } + } + } m_world.add(e, std::move(pose)); break; } @@ -1432,6 +1686,13 @@ bool SceneSerializer::deserializeFromMemory(const std::vector& buffer, const applyPODComponent( e, entry.data.data(), static_cast(entry.data.size()), m_world); break; + case kTypeEnvironmentEffects: { + auto& fx = m_world.add(e); + const u32 n = std::min(static_cast(sizeof(fx)), + static_cast(entry.data.size())); + if (n > 0) std::memcpy(&fx, entry.data.data(), n); + break; + } case kTypeNavVolume: { if (entry.data.size() < 24) break; Navigation::NavVolume volume; @@ -1913,6 +2174,148 @@ bool SceneSerializer::applyAnimatorComponent(ECS::Entity e, const u8* data, u32 anim.frameEvents[i] = {frame, evt.c_str()}; } + u32 editorMarker = 0; + if (IO::readU32(cursor, end, editorMarker) && editorMarker == kAnimatorEditorMarker) { + std::string defaultState; + u32 count = 0; + if (IO::readString(cursor, end, defaultState) && IO::readU32(cursor, end, count)) { + anim.defaultState = defaultState.c_str(); + for (u32 i = 0; i < count; ++i) { + std::string stateName; + std::string motion; + u8 hasPosition = 0; + f32 x = 0.0f; + f32 y = 0.0f; + if (!IO::readString(cursor, end, stateName) || !IO::readString(cursor, end, motion) || + !IO::readU8(cursor, end, hasPosition) || !IO::readF32(cursor, end, x) || + !IO::readF32(cursor, end, y)) { + break; + } + if (Animation::AnimationState* state = anim.states.get(FixedString<32>(stateName.c_str()))) { + state->motion = motion.c_str(); + state->hasEditorPosition = hasPosition != 0; + state->editorX = x; + state->editorY = y; + } + } + } + } + + u32 graphMarker = 0; + if (IO::readU32(cursor, end, graphMarker) && graphMarker == kAnimatorGraphMarker) { + auto readCurve = [&](Animation::KeyCurve& curve) -> bool { + u8 mode = 0; + if (!IO::readU8(cursor, end, mode) || !IO::readF32(cursor, end, curve.x1) || + !IO::readF32(cursor, end, curve.y1) || !IO::readF32(cursor, end, curve.x2) || + !IO::readF32(cursor, end, curve.y2)) { + return false; + } + if (mode > static_cast(Animation::KeyInterp::Custom)) mode = 0; + curve.mode = static_cast(mode); + return true; + }; + auto readTransition = [&](Animation::AnimationTransition& tr) -> bool { + std::string to; + u8 hasExit = 0; + u32 condCount = 0; + if (!IO::readString(cursor, end, to) || !IO::readF32(cursor, end, tr.blendTime) || + !IO::readU8(cursor, end, hasExit) || !IO::readF32(cursor, end, tr.exitTime) || + !IO::readF32(cursor, end, tr.offset) || !readCurve(tr.blendCurve) || + !IO::readU32(cursor, end, condCount)) { + return false; + } + tr.toState = to.c_str(); + tr.hasExitTime = hasExit != 0; + if (condCount > 256) return false; + tr.conditions.resize(condCount); + for (auto& cond : tr.conditions) { + std::string param; + u8 op = 0; + u8 boolValue = 0; + if (!IO::readString(cursor, end, param) || !IO::readU8(cursor, end, op) || + !IO::readU8(cursor, end, boolValue) || !IO::readF32(cursor, end, cond.floatValue) || + !IO::readI32(cursor, end, cond.intValue)) { + return false; + } + cond.parameterName = param.c_str(); + cond.op = static_cast(op); + cond.boolValue = boolValue != 0; + } + return true; + }; + auto readMachine = [&](Animation::AnimatorStateMachine& sm) -> bool { + std::string defaultState; + u32 anyCount = 0; + u32 stateCount = 0; + if (!IO::readString(cursor, end, defaultState) || !IO::readF32(cursor, end, sm.entryX) || + !IO::readF32(cursor, end, sm.entryY) || !IO::readF32(cursor, end, sm.anyX) || + !IO::readF32(cursor, end, sm.anyY) || !IO::readF32(cursor, end, sm.exitX) || + !IO::readF32(cursor, end, sm.exitY) || !IO::readU32(cursor, end, anyCount)) { + return false; + } + sm.defaultState = defaultState.c_str(); + if (anyCount > 256) return false; + sm.anyStateTransitions.resize(anyCount); + for (auto& tr : sm.anyStateTransitions) { + if (!readTransition(tr)) return false; + } + if (!IO::readU32(cursor, end, stateCount) || stateCount > 512) return false; + sm.states.clear(); + for (u32 i = 0; i < stateCount; ++i) { + std::string name; + std::string motion; + u8 hasPos = 0; + u32 trCount = 0; + Animation::AnimationState state; + if (!IO::readString(cursor, end, name) || !IO::readString(cursor, end, motion) || + !IO::readF32(cursor, end, state.speed) || !IO::readU8(cursor, end, hasPos) || + !IO::readF32(cursor, end, state.editorX) || !IO::readF32(cursor, end, state.editorY) || + !IO::readU32(cursor, end, trCount)) { + return false; + } + state.name = name.c_str(); + state.motion = motion.c_str(); + state.hasEditorPosition = hasPos != 0; + if (trCount > 256) return false; + state.transitions.resize(trCount); + for (auto& tr : state.transitions) { + if (!readTransition(tr)) return false; + } + sm.states.set(state.name, state); + } + if (sm.currentState.empty()) sm.currentState = sm.defaultState; + return true; + }; + if (readMachine(anim)) { + u32 layerCount = 0; + if (IO::readU32(cursor, end, layerCount) && layerCount < 64) { + anim.layers.resize(layerCount); + for (Animation::AnimatorLayer& layer : anim.layers) { + std::string name; + std::string parent; + u8 isGroup = 0, muted = 0, expanded = 1, blend = 0; + if (!IO::readString(cursor, end, name) || !IO::readString(cursor, end, parent) || + !IO::readU8(cursor, end, isGroup) || !IO::readU8(cursor, end, muted) || + !IO::readU8(cursor, end, expanded) || !IO::readF32(cursor, end, layer.weight) || + !IO::readU8(cursor, end, blend) || !IO::readU32(cursor, end, layer.mask)) { + anim.layers.clear(); + break; + } + layer.name = name.c_str(); + layer.parentGroup = parent.c_str(); + layer.isGroup = isGroup != 0; + layer.muted = muted != 0; + layer.expanded = expanded != 0; + layer.blend = blend != 0 ? Animation::LayerBlendMode::Additive : Animation::LayerBlendMode::Override; + if (!layer.isGroup && !readMachine(layer)) { + anim.layers.clear(); + break; + } + } + } + } + } + anim.onFrameEvent = nullptr; return true; } diff --git a/src/editor/SceneSerializer.hpp b/src/editor/SceneSerializer.hpp index 28276fa9..ff784505 100644 --- a/src/editor/SceneSerializer.hpp +++ b/src/editor/SceneSerializer.hpp @@ -75,7 +75,12 @@ class SceneSerializer { static constexpr u32 kTypeSpriteSheet = 51; static constexpr u32 kTypeEffect = 52; static constexpr u32 kTypeMeshGeometry = 53; - static constexpr u32 kTypeCount = 54; + static constexpr u32 kTypeEnvironmentEffects = 54; + static constexpr u32 kTypeCount = 55; + static constexpr u32 kPoseCurveMarker = 0x56525543u; + static constexpr u32 kPoseStripMarker = 0x50525453u; + static constexpr u32 kAnimatorEditorMarker = 0x524F5441u; + static constexpr u32 kAnimatorGraphMarker = 0x48505247u; static constexpr u32 kFormatVersion = 7; static constexpr u32 kSignature = 0x46464143; // "CAFF" little-endian diff --git a/src/editor/SceneViewport.cpp b/src/editor/SceneViewport.cpp index 01d69ae7..6037135e 100644 --- a/src/editor/SceneViewport.cpp +++ b/src/editor/SceneViewport.cpp @@ -3,9 +3,11 @@ #include "debug/CrashHandler.hpp" #include "editor/DragDropSystem.hpp" #include "scene/EnvironmentSystem.hpp" +#include "scene/EnvironmentEffectsSystem.hpp" #include "assets/MaterialCache.hpp" #include "editor/PrefabSystem.hpp" #include "editor/EditorContext.hpp" +#include "editor/EditorShortcuts.hpp" #include "editor/EditorCameraMath.hpp" #include "editor/ImGuiGpuTexture.hpp" #include "editor/TestInstrumentation.hpp" @@ -767,8 +769,19 @@ bool SceneViewport::init(RHI::RenderDevice* device, Config cfg) { } void SceneViewport::resizeCanvasIfNeeded(u32 newWidth, u32 newHeight) { + GpuCanvasLatch latch{m_lastCanvasWidth, m_lastCanvasHeight, m_canvasPendingW, m_canvasPendingH, + m_canvasStable}; + if (!latch.commit(newWidth, newHeight)) { + m_canvasPendingW = latch.pendingW; + m_canvasPendingH = latch.pendingH; + m_canvasStable = latch.stable; + return; + } + m_canvasPendingW = m_canvasPendingH = m_canvasStable = 0; + newWidth = latch.width; + newHeight = latch.height; if (!m_device || newWidth < 1 || newHeight < 1) return; - if (m_lastCanvasWidth == newWidth && m_lastCanvasHeight == newHeight) return; + if (m_lastCanvasWidth == newWidth && m_lastCanvasHeight == newHeight && m_colorTarget) return; if (m_colorTarget) m_device->destroyTexture(m_colorTarget); if (m_depthTarget) m_device->destroyTexture(m_depthTarget); @@ -792,8 +805,19 @@ void SceneViewport::resizeCanvasIfNeeded(u32 newWidth, u32 newHeight) { } void SceneViewport::resizePreviewCanvasIfNeeded(u32 newWidth, u32 newHeight) { + GpuCanvasLatch latch{m_previewCanvasWidth, m_previewCanvasHeight, m_previewPendingW, m_previewPendingH, + m_previewStable}; + if (!latch.commit(newWidth, newHeight)) { + m_previewPendingW = latch.pendingW; + m_previewPendingH = latch.pendingH; + m_previewStable = latch.stable; + return; + } + m_previewPendingW = m_previewPendingH = m_previewStable = 0; + newWidth = latch.width; + newHeight = latch.height; if (!m_device || newWidth < 1 || newHeight < 1) return; - if (m_previewCanvasWidth == newWidth && m_previewCanvasHeight == newHeight) return; + if (m_previewCanvasWidth == newWidth && m_previewCanvasHeight == newHeight && m_previewColorTarget) return; if (m_previewColorTarget) m_device->destroyTexture(m_previewColorTarget); if (m_previewDepthTarget) m_device->destroyTexture(m_previewDepthTarget); @@ -837,7 +861,9 @@ bool SceneViewport::renderCameraPreviewGpu(RHI::CommandBuffer* cmd, ECS::World& camera.farClip = farClip; Render::GpuSceneRenderOptions previewOpts; - previewOpts.enableShadows = false; + previewOpts.enableShadows = Scene::environmentWantsShadows(world); + previewOpts.directionalCascadeCount = 1; + previewOpts.cameraSettled = true; previewOpts.textureQuality.enabled = ctx.textureQualityEnabled; previewOpts.textureQuality.fullRadius = ctx.textureQualityRadius; previewOpts.textureQuality.falloffDistance = ctx.textureQualityFalloff; @@ -847,6 +873,10 @@ bool SceneViewport::renderCameraPreviewGpu(RHI::CommandBuffer* cmd, ECS::World& previewOpts.renderScale = ctx.renderScale; previewOpts.deltaTime = ImGui::GetIO().DeltaTime; previewOpts.viewId = 2; + if (Scene::environmentHasOverride(world)) { + previewOpts.overrideAmbient = true; + previewOpts.ambientColor = Scene::environmentAmbientAt(world, cameraPos); + } m_gpuSceneRenderer.renderWithCamera( cmd, world, camera, m_previewColorTarget, m_previewDepthTarget, width, height, projectRoot, previewOpts); @@ -932,8 +962,8 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { const ImVec2 framebufferSize = imguiFramebufferSize(viewportSize, 3840); const u32 targetCanvasW = static_cast(framebufferSize.x); const u32 targetCanvasH = static_cast(framebufferSize.y); - const bool canvasResized = m_gpuCacheWidth != targetCanvasW || m_gpuCacheHeight != targetCanvasH; resizeCanvasIfNeeded(targetCanvasW, targetCanvasH); + const bool canvasResized = m_gpuCacheWidth != m_lastCanvasWidth || m_gpuCacheHeight != m_lastCanvasHeight; if (ctx.viewMode == EditorContext::ViewMode::Mode3D) { Scene::syncTerrainMeshes(world); @@ -956,12 +986,14 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { const bool editorCameraMoved = camMotion > 0.0001f; const bool previewModeChanged = m_meshPreviewMode != m_lastMeshPreviewMode; const u64 sceneStamp = editorSceneContentStamp(world) ^ - (static_cast(ctx.skyboxIndex + 1) * 0x9E3779B97F4A7C15ull); + (static_cast(ctx.skyboxIndex + 1) * 0x9E3779B97F4A7C15ull) ^ + (ctx.visualRevision * 0xD1B54A32D192ED03ull); const bool sceneChanged = sceneStamp != m_lastSceneStamp; + const bool poseChanged = m_lastSkinRevision != Animation::skinRevision(); // Shadows and reflection probes only run on a settled frame; draw one when the camera stops. - const bool settledFramePending = !m_lastGpuFrameSettled && camMotion < 0.002f; + const bool settledFramePending = !m_lastGpuFrameSettled && camMotion < 0.002f && !poseChanged; const bool gpuNeedsRedraw = editorCameraMoved || canvasResized || previewModeChanged - || sceneChanged || settledFramePending || !m_hasValidGpuFrame || ctx.isPlayMode + || sceneChanged || poseChanged || settledFramePending || !m_hasValidGpuFrame || ctx.isPlayMode || m_viewportNeedsAnotherFrame || std::abs(ctx.renderScale - m_lastRenderScale) > 1e-4f || m_config.grid != m_lastGridVisible; @@ -974,11 +1006,13 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { // previews keep their own lighting; shadows belong in play mode / runtime, not edit mode. // One cascade, and only after the camera settles. Four cascades while // orbiting redraw the whole scene and blow the 16 ms budget. - gpuOpts.enableShadows = m_editorCamMotion < 0.002f && m_hasValidGpuFrame; + gpuOpts.enableShadows = Scene::environmentWantsShadows(world) || + (!poseChanged && m_editorCamMotion < 0.002f && m_hasValidGpuFrame); gpuOpts.directionalCascadeCount = 1; gpuOpts.terrainLodDistanceScale = 2.0f; gpuOpts.textureQuality.enabled = false; - gpuOpts.cameraSettled = m_editorCamMotion < 0.002f && m_hasValidGpuFrame; + gpuOpts.cameraSettled = !poseChanged && m_editorCamMotion < 0.002f && m_hasValidGpuFrame; + gpuOpts.skipTemporalSettle = poseChanged && !editorCameraMoved && !canvasResized; gpuOpts.environmentPath.clear(); gpuOpts.renderScale = ctx.renderScale; gpuOpts.overrideAntiAliasing = true; @@ -989,6 +1023,10 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { gpuOpts.antiAliasingOverride.sharpness = 0.5f; gpuOpts.deltaTime = ImGui::GetIO().DeltaTime; gpuOpts.viewId = 1; + if (Scene::environmentHasOverride(world)) { + gpuOpts.overrideAmbient = true; + gpuOpts.ambientColor = Scene::environmentAmbientAt(world, camPos); + } if (ctx.selectedEntity.isValid() && world.has(ctx.selectedEntity)) { gpuOpts.postProcessCamera = ctx.selectedEntity; } @@ -1019,6 +1057,7 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { m_gpuCacheWidth = m_lastCanvasWidth; m_gpuCacheHeight = m_lastCanvasHeight; m_lastSceneStamp = sceneStamp; + m_lastSkinRevision = Animation::skinRevision(); m_lastGpuFrameSettled = gpuOpts.cameraSettled; m_lastRenderScale = ctx.renderScale; m_lastGridVisible = m_config.grid; @@ -1172,6 +1211,50 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { pickedElement = pickMeshElement(world, ctx, mousePos, vpMin, vpSize, elementVp); } if (!pickedElement) { + int pickedBone = -1; + if (ctx.selectedEntity.isValid() && world.has(ctx.selectedEntity)) { + const std::vector* joints = Animation::jointPositionsFor(ctx.selectedEntity.id()); + if (joints && !joints->empty()) { + const Mat4 boneWorld = entityMatrix(world, ctx.selectedEntity); + f32 best = 14.0f * 14.0f; + const int count = std::min(static_cast(joints->size()), 256); + const Animation::SkinnedPose* pose = world.get(ctx.selectedEntity); + for (int bone = 0; bone < count; ++bone) { + if (pose && Animation::poseOmitsBone(*pose, bone)) continue; + const Vec3 joint = boneWorld.transformPoint((*joints)[static_cast(bone)]); + const ImVec2 screen = projectToScreen(joint, vpMin, vpSize, ctx); + if (screen.x < -5000.0f) continue; + const f32 dx = screen.x - mousePos.x; + const f32 dy = screen.y - mousePos.y; + const f32 dist = dx * dx + dy * dy; + if (dist < best) { + best = dist; + pickedBone = bone; + } + } + } + } + if (pickedBone >= 0) { + ctx.skeletonEntityId = ctx.selectedEntity.id(); + ctx.skeletonBone = pickedBone; + if (ctx.remapBones && ctx.remapHumanoidSlot >= 0) { + if (Animation::SkinnedPose* pose = world.get(ctx.selectedEntity)) { + Animation::assignHumanoidBone( + pose->humanoid, + static_cast(ctx.remapHumanoidSlot), + pickedBone); + pose->loaded = true; + ctx.markDirty(); + for (int slot = ctx.remapHumanoidSlot + 1; slot < Animation::kHumanoidBodyCount; + ++slot) { + if (pose->humanoid.bones[slot] < 0) { + ctx.remapHumanoidSlot = slot; + break; + } + } + } + } + } else { const ECS::Entity picked = raycastSelectEntity(ray.origin, ray.direction, world, projectRoot); const bool shiftPressed = ImGui::IsKeyDown(ImGuiKey_LeftShift) || ImGui::IsKeyDown(ImGuiKey_RightShift); @@ -1185,6 +1268,7 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { ctx.meshElementSelection.clear(); } } + } } } @@ -1218,12 +1302,11 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows)) { - if (ImGui::IsKeyPressed(ImGuiKey_T)) ctx.gizmoMode = EditorContext::GizmoMode::Translate; - if (ImGui::IsKeyPressed(ImGuiKey_E)) ctx.gizmoMode = EditorContext::GizmoMode::Rotate; - if (ImGui::IsKeyPressed(ImGuiKey_R)) ctx.gizmoMode = EditorContext::GizmoMode::Scale; - if (ImGui::IsKeyPressed(ImGuiKey_Q)) ctx.gizmoMode = EditorContext::GizmoMode::None; - - if (ImGui::IsKeyPressed(ImGuiKey_Delete) && ctx.selectedEntity.isValid()) { + if (EditorShortcuts::instance().pressed(Shortcut::GizmoTranslate)) ctx.gizmoMode = EditorContext::GizmoMode::Translate; + if (EditorShortcuts::instance().pressed(Shortcut::GizmoRotate)) ctx.gizmoMode = EditorContext::GizmoMode::Rotate; + if (EditorShortcuts::instance().pressed(Shortcut::GizmoScale)) ctx.gizmoMode = EditorContext::GizmoMode::Scale; + + if (EditorShortcuts::instance().pressed(Shortcut::DeleteSelection) && ctx.selectedEntity.isValid()) { ctx.beginUndo(EditorCommand::RemoveEntity, ctx.selectedEntity.id(), world); world.destroy(ctx.selectedEntity); ctx.selectedEntity = ECS::Entity::INVALID; @@ -1246,6 +1329,7 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { if (leftDragging && !m_gizmoDragging) { ctx.beginUndo(EditorCommand::SetField, ctx.selectedEntity.id(), world); m_gizmoDragging = true; + m_gizmoUnsnappedValid = false; } if (leftDragging) { handleGizmoInput(world, ctx, viewportSize); @@ -1311,7 +1395,7 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { } else { terrain->dataRevision++; } - ctx.isDirty = true; + ctx.markDirty(); } else if (terrainSplatMode) { auto* splatmap = Terrain::TerrainCache::instance().splatmapFor(ctx.selectedEntity); if (splatmap) { @@ -1324,7 +1408,7 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { hitWorld, brush, ImGui::GetIO().DeltaTime); terrain->splatRevision++; - ctx.isDirty = true; + ctx.markDirty(); } } } @@ -1486,12 +1570,10 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { else right = right.normalized(); Vec3 camPos = ctx.camFocus - lookDir * ctx.camDistance; - if (ImGui::IsKeyDown(ImGuiKey_W)) camPos += lookDir * speed; - if (ImGui::IsKeyDown(ImGuiKey_S)) camPos -= lookDir * speed; - if (ImGui::IsKeyDown(ImGuiKey_A)) camPos -= right * speed; - if (ImGui::IsKeyDown(ImGuiKey_D)) camPos += right * speed; - if (ImGui::IsKeyDown(ImGuiKey_Q)) camPos -= worldUp * speed; - if (ImGui::IsKeyDown(ImGuiKey_E)) camPos += worldUp * speed; + if (EditorShortcuts::instance().down(Shortcut::CameraForward)) camPos += lookDir * speed; + if (EditorShortcuts::instance().down(Shortcut::CameraBack)) camPos -= lookDir * speed; + if (EditorShortcuts::instance().down(Shortcut::CameraLeft)) camPos -= right * speed; + if (EditorShortcuts::instance().down(Shortcut::CameraRight)) camPos += right * speed; ctx.camFocus = camPos + lookDir * ctx.camDistance; } } @@ -1807,13 +1889,16 @@ void SceneViewport::drawSprites(ECS::World& world, EditorContext& ctx, ImVec2 or } const bool selected = (ctx.selectedEntity == entity); + const f32 env2D = Scene::environmentAmbient2D(world); + const int tint = static_cast(std::clamp(env2D, 0.0f, 1.5f) * 255.0f); const ImU32 fill = selected ? IM_COL32(100, 170, 255, 80) : IM_COL32(180, 180, 200, 45); const ImU32 border = selected ? IM_COL32(110, 210, 255, 255) : IM_COL32(190, 190, 220, 200); ImDrawList* dl = ImGui::GetWindowDrawList(); if (hasTexture) { + const ImU32 tinted = IM_COL32(std::min(tint, 255), std::min(tint, 255), std::min(tint, 255), 255); dl->AddImageQuad(texRef, p1, p2, p3, p4, ImVec2(uv0x, uv0y), ImVec2(uv1x, uv0y), - ImVec2(uv1x, uv1y), ImVec2(uv0x, uv1y)); + ImVec2(uv1x, uv1y), ImVec2(uv0x, uv1y), tinted); } else { // Draw checkerboard pattern for missing texture dl->AddQuadFilled(p1, p2, p3, p4, IM_COL32(64, 64, 64, 200)); @@ -2140,7 +2225,7 @@ void SceneViewport::drawEmptyEntities(ECS::World& world, EditorContext& ctx, ImV Vec3 labelPos = worldMatrix.transformPoint(Vec3(0.0f, 0.7f, 0.0f)); ImVec2 sp = projectCached(labelPos); if (sp.x > -5000.0f) { - const char* msg = loadError.empty() ? "Mesh nao carregado" : loadError.c_str(); + const char* msg = loadError.empty() ? "Mesh failed to load" : loadError.c_str(); dl->AddText(sp, errCol, msg); } break; @@ -2461,6 +2546,7 @@ void SceneViewport::drawEmptyEntities(ECS::World& world, EditorContext& ctx, ImV } void SceneViewport::drawSkeletons(ECS::World& world, EditorContext& ctx, ImVec2 origin, ImVec2 viewportSize) { + if (!ctx.showBones) return; if (ctx.viewMode != EditorContext::ViewMode::Mode3D && ctx.viewMode != EditorContext::ViewMode::Isometric) { return; @@ -2470,26 +2556,121 @@ void SceneViewport::drawSkeletons(ECS::World& world, EditorContext& ctx, ImVec2 ECS::ComponentQuery query; query.with(); - world.forEach(query, [&](ECS::Entity entity, Animation::SkinnedPose&) { + world.forEach(query, [&](ECS::Entity entity, Animation::SkinnedPose& pose) { const std::vector* joints = Animation::jointPositionsFor(entity.id()); const std::vector* parents = Animation::jointParentsFor(entity.id()); if (!joints || !parents || joints->size() != parents->size()) return; const Mat4 worldMatrix = entityMatrix(world, entity); const bool selected = ctx.selectedEntity == entity; - const ImU32 color = selected ? IM_COL32(255, 196, 64, 230) : IM_COL32(120, 190, 255, 160); const int count = std::min(static_cast(joints->size()), 256); + const int markedBone = (selected && ctx.skeletonEntityId == entity.id() && ctx.skeletonBone >= 0 && + ctx.skeletonBone < count) ? ctx.skeletonBone : -1; + const Animation::ImportedSkin* skin = selected ? Animation::findImportedSkin(pose.meshPath) : nullptr; + + ImVec2 screens[256]; + bool visible[256]; + i32 shownParent[256]; + for (int i = 0; i < count; ++i) { + visible[i] = false; + shownParent[i] = -1; + if (Animation::poseOmitsBone(pose, i)) continue; + i32 parent = (*parents)[static_cast(i)]; + while (parent >= 0 && parent < count && Animation::poseOmitsBone(pose, parent)) { + parent = (*parents)[static_cast(parent)]; + } + shownParent[i] = (parent >= 0 && parent < count) ? parent : -1; + screens[i] = projectToScreen(worldMatrix.transformPoint((*joints)[static_cast(i)]), + origin, viewportSize, ctx); + visible[i] = screens[i].x > -5000.0f; + } + + // The selected bone and everything under it follow its pose, so they share the highlight. + auto underMarked = [&](int bone) { + for (int b = bone, guard = 0; b >= 0 && b < count && guard < 256; ++guard) { + if (b == markedBone) return true; + b = (*parents)[static_cast(b)]; + } + return false; + }; + + int hoveredBone = -1; + if (selected && !m_gizmoDragging && m_hoveredAxis == 0 && ImGui::IsWindowHovered()) { + const ImVec2 mouse = ImGui::GetMousePos(); + if (mouse.x >= origin.x && mouse.y >= origin.y && mouse.x <= origin.x + viewportSize.x && + mouse.y <= origin.y + viewportSize.y) { + f32 best = 14.0f * 14.0f; + for (int i = 0; i < count; ++i) { + if (!visible[i]) continue; + const f32 dx = screens[i].x - mouse.x, dy = screens[i].y - mouse.y; + if (dx * dx + dy * dy < best) { + best = dx * dx + dy * dy; + hoveredBone = i; + } + } + } + } + + const ImU32 idleColor = IM_COL32(120, 190, 255, 150); + const ImU32 boneFill = IM_COL32(255, 196, 64, 70); + const ImU32 boneEdge = IM_COL32(255, 196, 64, 220); + const ImU32 chainFill = IM_COL32(255, 96, 176, 110); + const ImU32 chainEdge = IM_COL32(255, 120, 190, 255); + const ImU32 shadow = IM_COL32(10, 12, 16, 170); + for (int i = 0; i < count; ++i) { - const i32 parent = (*parents)[static_cast(i)]; - const Vec3 joint = worldMatrix.transformPoint((*joints)[static_cast(i)]); - const ImVec2 screen = projectToScreen(joint, origin, viewportSize, ctx); - if (screen.x < -5000.0f) continue; - dl->AddCircleFilled(screen, selected ? 3.0f : 2.0f, color, 8); - if (parent < 0 || parent >= count) continue; - const Vec3 parentJoint = worldMatrix.transformPoint((*joints)[static_cast(parent)]); - const ImVec2 parentScreen = projectToScreen(parentJoint, origin, viewportSize, ctx); - if (parentScreen.x < -5000.0f) continue; - dl->AddLine(parentScreen, screen, color, selected ? 1.8f : 1.2f); + const int parent = shownParent[i]; + if (!visible[i] || parent < 0 || !visible[parent]) continue; + const ImVec2 a = screens[parent], b = screens[i]; + if (!selected) { + dl->AddLine(a, b, idleColor, 1.2f); + continue; + } + const f32 dx = b.x - a.x, dy = b.y - a.y; + const f32 len = std::sqrt(dx * dx + dy * dy); + const bool chain = markedBone >= 0 && underMarked(i); + if (len < 6.0f) { + dl->AddLine(a, b, chain ? chainEdge : boneEdge, 1.5f); + continue; + } + // Tapered octahedral silhouette from the parent joint to the child joint. + const f32 nx = -dy / len, ny = dx / len; + const f32 w = std::clamp(len * 0.11f, 2.5f, 8.0f); + const ImVec2 waist(a.x + dx * 0.18f, a.y + dy * 0.18f); + const ImVec2 pts[4] = {a, ImVec2(waist.x + nx * w, waist.y + ny * w), b, + ImVec2(waist.x - nx * w, waist.y - ny * w)}; + dl->AddConvexPolyFilled(pts, 4, chain ? chainFill : boneFill); + dl->AddPolyline(pts, 4, shadow, ImDrawFlags_Closed, 3.0f); + dl->AddPolyline(pts, 4, chain ? chainEdge : boneEdge, ImDrawFlags_Closed, 1.4f); } + + for (int i = 0; i < count; ++i) { + if (!visible[i]) continue; + if (!selected) { + dl->AddCircleFilled(screens[i], 2.0f, idleColor, 8); + continue; + } + const bool marked = i == markedBone; + const bool hot = i == hoveredBone; + const f32 radius = marked ? 6.5f : hot ? 5.5f : 3.5f; + const ImU32 fill = marked ? IM_COL32(255, 64, 160, 255) + : hot ? IM_COL32(255, 236, 120, 255) + : (markedBone >= 0 && underMarked(i)) ? chainEdge : boneEdge; + dl->AddCircleFilled(screens[i], radius + 1.5f, shadow, 14); + dl->AddCircleFilled(screens[i], radius, fill, 14); + if (marked || hot) dl->AddCircle(screens[i], radius + 4.0f, fill, 18, 1.5f); + } + + auto label = [&](int bone, ImU32 textColor) { + if (bone < 0 || !visible[bone] || !skin || bone >= static_cast(skin->boneNames.size())) return; + const char* name = skin->boneNames[static_cast(bone)].c_str(); + const ImVec2 size = ImGui::CalcTextSize(name); + const ImVec2 at(screens[bone].x + 10.0f, screens[bone].y - size.y - 6.0f); + dl->AddRectFilled(ImVec2(at.x - 4.0f, at.y - 2.0f), ImVec2(at.x + size.x + 4.0f, at.y + size.y + 2.0f), + IM_COL32(16, 18, 24, 215), 4.0f); + dl->AddText(at, textColor, name); + }; + label(markedBone, IM_COL32(255, 220, 235, 255)); + if (hoveredBone != markedBone) label(hoveredBone, IM_COL32(255, 244, 190, 255)); }); } @@ -2648,6 +2829,14 @@ void SceneViewport::drawGizmo(ECS::World& world, EditorContext& ctx, ImVec2 orig Vec3 worldPos; if (!tryGetEntityPosition(world, ctx.selectedEntity, worldPos)) return; + if (ctx.skeletonEntityId == ctx.selectedEntity.id() && ctx.skeletonBone >= 0) { + if (const std::vector* joints = Animation::jointPositionsFor(ctx.selectedEntity.id())) { + if (ctx.skeletonBone < static_cast(joints->size())) { + worldPos = entityMatrix(world, ctx.selectedEntity) + .transformPoint((*joints)[static_cast(ctx.skeletonBone)]); + } + } + } ImVec2 screenPos = projectToScreen(worldPos, origin, viewportSize, ctx); ImDrawList* dl = ImGui::GetForegroundDrawList(); dl->PushClipRect(origin, ImVec2(origin.x + viewportSize.x, origin.y + viewportSize.y), true); @@ -2718,6 +2907,42 @@ void SceneViewport::drawGizmo(ECS::World& world, EditorContext& ctx, ImVec2 orig m_axisRawDirs[1] = nY; m_axisRawDirs[2] = nZ; m_gizmoScreenOrigin = screenPos; + m_gizmoIs3D = is3D; + { + const Vec3 axes[3] = {worldAxisX, worldAxisY, worldAxisZ}; + const ImVec2 raws[3] = {rawX, rawY, rawZ}; + const float axisWorldStep = is3D ? std::max(0.25f, ctx.camDistance * 0.02f) : 1.0f; + const float scale2D = std::max(0.0001f, ctx.viewportZoom * 50.0f); + const float worldPerHandle = std::max(1.0f, ctx.camDistance * 0.1f); + for (int i = 0; i < 3; ++i) { + const float len = axes[i].length(); + m_axisWorldDirs[i] = len > 1e-6f ? axes[i] / len : axes[i]; + if (is3D) { + const ImVec2 handle(m_axisRawDirs[i].x * HL, m_axisRawDirs[i].y * HL); + m_axisScreenPerUnit[i] = ImVec2(handle.x / worldPerHandle, handle.y / worldPerHandle); + } else { + m_axisScreenPerUnit[i] = ImVec2(raws[i].x * scale2D, raws[i].y * scale2D); + } + m_axisRotSign[i] = 0.0f; + if (!is3D) { + m_axisRotSign[i] = i == 2 ? -1.0f : 0.0f; + continue; + } + const Vec3 a = m_axisWorldDirs[i]; + const Vec3 helper = std::fabs(a.y) < 0.9f ? Vec3(0.0f, 1.0f, 0.0f) : Vec3(1.0f, 0.0f, 0.0f); + const Vec3 b = (helper - a * a.dot(helper)).normalized(); + const Vec3 c = a.cross(b); + const float step = 0.2f; + const ImVec2 s0 = projectToScreen(worldPos + b * axisWorldStep, origin, viewportSize, ctx); + const ImVec2 s1 = projectToScreen(worldPos + (b * std::cos(step) + c * std::sin(step)) * axisWorldStep, + origin, viewportSize, ctx); + const ImVec2 v0(s0.x - screenPos.x, s0.y - screenPos.y); + const ImVec2 v1(s1.x - screenPos.x, s1.y - screenPos.y); + const float crossZ = v0.x * v1.y - v0.y * v1.x; + const float norm = std::sqrt((v0.x * v0.x + v0.y * v0.y) * (v1.x * v1.x + v1.y * v1.y)); + if (norm > 1e-3f && std::fabs(crossZ) / norm > 0.02f) m_axisRotSign[i] = crossZ > 0.0f ? 1.0f : -1.0f; + } + } const float fsX = axisForeshorten(worldAxisX); const float fsY = axisForeshorten(worldAxisY); @@ -3456,6 +3681,98 @@ void SceneViewport::handleGizmoInput(ECS::World& world, EditorContext& ctx, ImVe int axis = keyAxis ? keyAxis : m_hoveredAxis; m_gizmoDragAxis = axis; + const bool axisDrag = axis >= 1 && axis <= 3; + + // World units along a drawn axis for this mouse delta; one axis length on screen equals one unit moved. + auto axisAmount = [&](int axIdx) -> f32 { + const ImVec2 s = m_axisScreenPerUnit[axIdx - 1]; + const f32 len2 = s.x * s.x + s.y * s.y; + if (len2 < 1e-4f) return 0.0f; + return (delta.x * s.x + delta.y * s.y) / len2; + }; + // Free move: solve the mouse delta in the two axes that are most face-on to the camera. + auto freeMove = [&]() -> Vec3 { + if (!m_gizmoIs3D) { + const f32 s = std::max(0.0001f, ctx.viewportZoom * 50.0f); + return Vec3(delta.x / s, -delta.y / s, 0.0f); + } + int bi = 0, bj = 1; + f32 bestDet = 0.0f; + for (int i = 0; i < 3; ++i) { + for (int j = i + 1; j < 3; ++j) { + const ImVec2 a = m_axisScreenPerUnit[i], b = m_axisScreenPerUnit[j]; + const f32 det = std::fabs(a.x * b.y - a.y * b.x); + if (det > bestDet) { bestDet = det; bi = i; bj = j; } + } + } + if (bestDet < 1e-4f) return Vec3(); + const ImVec2 a = m_axisScreenPerUnit[bi], b = m_axisScreenPerUnit[bj]; + const f32 det = a.x * b.y - a.y * b.x; + const f32 u = (delta.x * b.y - delta.y * b.x) / det; + const f32 v = (a.x * delta.y - a.y * delta.x) / det; + return m_axisWorldDirs[bi] * u + m_axisWorldDirs[bj] * v; + }; + auto moveDelta = [&]() -> Vec3 { + return axisDrag ? m_axisWorldDirs[axis - 1] * axisAmount(axis) : freeMove(); + }; + // Rotation follows the angle the cursor sweeps around the gizmo centre. + auto rotateAxis = [&]() -> int { return axisDrag ? axis : (m_gizmoIs3D ? 2 : 3); }; + auto rotateAngle = [&]() -> f32 { + const int ax = rotateAxis(); + const f32 sign = m_axisRotSign[ax - 1]; + const ImVec2 mouse = ImGui::GetMousePos(); + const ImVec2 c = m_gizmoScreenOrigin; + const ImVec2 cur(mouse.x - c.x, mouse.y - c.y); + const ImVec2 prev(cur.x - delta.x, cur.y - delta.y); + const f32 minRadius2 = 10.0f * 10.0f; + if (sign == 0.0f || cur.x * cur.x + cur.y * cur.y < minRadius2 || + prev.x * prev.x + prev.y * prev.y < minRadius2) { + return (delta.x - delta.y) * 0.01f; + } + const f32 swept = std::atan2(prev.x * cur.y - prev.y * cur.x, prev.x * cur.x + prev.y * cur.y); + return swept * sign; + }; + + if (ctx.skeletonEntityId == ctx.selectedEntity.id() && ctx.skeletonBone >= 0) { + if (Animation::SkinnedPose* pose = world.get(ctx.selectedEntity)) { + if (const Animation::ImportedSkin* skin = Animation::findImportedSkin(pose->meshPath)) { + const u32 boneCount = skin->skeleton.boneCount(); + if (ctx.skeletonBone < static_cast(boneCount)) { + if (pose->offsets.size() < boneCount) pose->offsets.resize(boneCount); + Animation::BonePose& bone = pose->offsets[static_cast(ctx.skeletonBone)]; + pose->sampleKeys = false; + // Bone offsets live in the parent-relative bone frame; convert world deltas through it. + const Mat4 entityWorld = entityMatrix(world, ctx.selectedEntity); + Mat4 boneFrame; + const bool hasFrame = Animation::boneEditFrame(*skin, *pose, ctx.skeletonBone, boneFrame, + ctx.selectedEntity.id()); + const Mat4 worldToBone = (entityWorld * boneFrame).inverted(); + switch (ctx.gizmoMode) { + case EditorContext::GizmoMode::Translate: { + const Vec3 worldDelta = moveDelta(); + bone.translation += hasFrame ? worldToBone.transformVector(worldDelta) : worldDelta; + break; + } + case EditorContext::GizmoMode::Rotate: { + const Vec3 worldAxis = m_axisWorldDirs[rotateAxis() - 1]; + Vec3 localAxis = hasFrame ? worldToBone.transformVector(worldAxis) : worldAxis; + if (localAxis.lengthSquared() < 1e-12f) break; + localAxis = localAxis.normalized(); + const Quat current = Quat::fromEuler(bone.rotation.x, bone.rotation.y, bone.rotation.z); + const Quat next = (Quat::fromAxisAngle(localAxis, rotateAngle()) * current).normalized(); + bone.rotation = next.toEuler(); + break; + } + case EditorContext::GizmoMode::Scale: + case EditorContext::GizmoMode::None: + break; + } + ctx.markModified(); + return; + } + } + } + } auto* pos = world.get(ctx.selectedEntity); if (!pos) { @@ -3471,52 +3788,61 @@ void SceneViewport::handleGizmoInput(ECS::World& world, EditorContext& ctx, ImVe pos = &world.add(ctx.selectedEntity, initial); } - const float scale = ctx.viewportZoom * 50.0f; - - auto projectDelta = [&](int axIdx) -> float { - ImVec2 raw = m_axisRawDirs[axIdx - 1]; - float mag2 = raw.x*raw.x + raw.y*raw.y; - if (mag2 < 0.0001f) return 0.f; - return (delta.x*raw.x + delta.y*raw.y) / mag2 / scale; + // Transform values are parent-relative; child entities need world deltas mapped into the parent space. + Mat4 worldToParent = Mat4::identity(); + bool hasParentSpace = false; + if (auto* wt = world.get(ctx.selectedEntity)) { + worldToParent = (wt->matrix * buildLocalMatrix(*pos).inverted()).inverted(); + hasParentSpace = true; + } + auto toParent = [&](const Vec3& v) -> Vec3 { + return hasParentSpace ? worldToParent.transformVector(v) : v; }; switch (ctx.gizmoMode) { - case EditorContext::GizmoMode::Translate: + case EditorContext::GizmoMode::Translate: { + const Vec3 worldDelta = toParent(moveDelta()); if (ctx.meshElementMode != EditorContext::MeshElementMode::Object) { - Vec3 worldDelta{}; - if (axis == 1) worldDelta.x = projectDelta(1); - else if (axis == 2) worldDelta.y = projectDelta(2); - else if (axis == 3) worldDelta.z = projectDelta(3); - else { - worldDelta.x = delta.x / scale; - worldDelta.y = -delta.y / scale; - } if (moveMeshSelection(world, ctx, worldDelta)) { - ctx.isDirty = true; + ctx.markModified(); return; } } - if (axis == 1) pos->position.x += projectDelta(1); - else if (axis == 2) pos->position.y += projectDelta(2); - else if (axis == 3) pos->position.z += projectDelta(3); - else { - pos->position.x += delta.x / scale; - pos->position.y -= delta.y / scale; + if (!m_gizmoUnsnappedValid) { + m_gizmoUnsnapped = pos->position; + m_gizmoUnsnappedValid = true; } + m_gizmoUnsnapped += worldDelta; + pos->position = m_gizmoUnsnapped; if (ctx.snapToGrid && ctx.snapGridSize > 0.f) { - pos->position.x = roundf(pos->position.x / ctx.snapGridSize) * ctx.snapGridSize; - pos->position.y = roundf(pos->position.y / ctx.snapGridSize) * ctx.snapGridSize; + const f32 g = ctx.snapGridSize; + pos->position.x = roundf(pos->position.x / g) * g; + pos->position.y = roundf(pos->position.y / g) * g; + if (m_gizmoIs3D) pos->position.z = roundf(pos->position.z / g) * g; } break; - case EditorContext::GizmoMode::Rotate: - if (axis == 1) pos->rotation.x += delta.y * 0.01f; - else if (axis == 2) pos->rotation.y += delta.x * 0.01f; - else pos->rotation.z += delta.x * 0.01f; + } + case EditorContext::GizmoMode::Rotate: { + const f32 angle = rotateAngle(); + if (!m_gizmoIs3D) { + pos->rotation.z += angle * kRadToDeg; + break; + } + const Quat current = Quat::fromEuler(pos->rotation.x * kDegToRad, pos->rotation.y * kDegToRad, + pos->rotation.z * kDegToRad); + const Vec3 parentAxis = toParent(m_axisWorldDirs[rotateAxis() - 1]); + if (parentAxis.lengthSquared() < 1e-12f) break; + const Quat next = (Quat::fromAxisAngle(parentAxis.normalized(), angle) * current).normalized(); + const Vec3 euler = next.toEuler(); + pos->rotation = Vec3(euler.x * kRadToDeg, euler.y * kRadToDeg, euler.z * kRadToDeg); break; + } case EditorContext::GizmoMode::Scale: - if (axis == 1) { pos->scale.x = std::max(0.01f, pos->scale.x * (1.f + projectDelta(1) * 0.5f)); } - else if (axis == 2) { pos->scale.y = std::max(0.01f, pos->scale.y * (1.f + projectDelta(2) * 0.5f)); } - else if (axis == 3) { pos->scale.z = std::max(0.01f, pos->scale.z * (1.f + projectDelta(3) * 0.5f)); } + if (axisDrag) { + const f32 factor = 1.f + axisAmount(axis) * 0.5f; + f32& component = axis == 1 ? pos->scale.x : axis == 2 ? pos->scale.y : pos->scale.z; + component = std::max(0.01f, component * factor); + } else { pos->scale.x = std::max(0.01f, pos->scale.x * (1.f + delta.x * 0.005f)); pos->scale.y = std::max(0.01f, pos->scale.y * (1.f + delta.y * 0.005f)); @@ -3538,7 +3864,7 @@ void SceneViewport::handleGizmoInput(ECS::World& world, EditorContext& ctx, ImVe r3->quaternion = Vec4(q.x, q.y, q.z, q.w); } - ctx.isDirty = true; + ctx.markModified(); } MeshDrawTexture SceneViewport::resolveTextureFromPath(const std::string& path, diff --git a/src/editor/SceneViewport.hpp b/src/editor/SceneViewport.hpp index 75b7ec75..18823baa 100644 --- a/src/editor/SceneViewport.hpp +++ b/src/editor/SceneViewport.hpp @@ -277,6 +277,15 @@ class SceneViewport { int m_hoveredAxis = 0; int m_gizmoDragAxis = 0; ImVec2 m_axisRawDirs[3] = {}; + /// Screen pixels per world unit along each drawn axis, so a drag follows the cursor. + ImVec2 m_axisScreenPerUnit[3] = {}; + Vec3 m_axisWorldDirs[3] = {Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f), Vec3(0.0f, 0.0f, 1.0f)}; + /// +1 or -1: screen turn direction of a positive rotation about the axis. 0 when the ring is edge-on. + f32 m_axisRotSign[3] = {}; + bool m_gizmoIs3D = false; + /// Position before grid snapping, so slow drags still accumulate between snap steps. + Vec3 m_gizmoUnsnapped; + bool m_gizmoUnsnappedValid = false; ImVec2 m_gizmoScreenOrigin = {}; ImVec2 m_boxSelectStart = { 0.0f, 0.0f }; ProjectionMode m_projectionMode = ProjectionMode::Perspective; @@ -293,6 +302,12 @@ class SceneViewport { u32 m_lastCanvasHeight = 0; u32 m_previewCanvasWidth = 0; u32 m_previewCanvasHeight = 0; + u32 m_canvasPendingW = 0; + u32 m_canvasPendingH = 0; + u32 m_canvasStable = 0; + u32 m_previewPendingW = 0; + u32 m_previewPendingH = 0; + u32 m_previewStable = 0; f32 m_lastEditorCamYaw = 0.0f; f32 m_lastEditorCamPitch = 0.0f; f32 m_lastEditorCamDistance = 0.0f; @@ -303,6 +318,7 @@ class SceneViewport { u32 m_gpuCacheWidth = 0; u32 m_gpuCacheHeight = 0; u64 m_lastSceneStamp = 0; + u64 m_lastSkinRevision = 0; bool m_hasValidGpuFrame = false; bool m_lastGpuFrameSettled = false; f32 m_lastRenderScale = 1.0f; diff --git a/src/editor/SettingsPanel.cpp b/src/editor/SettingsPanel.cpp index 7ab9e7b4..b19e0316 100644 --- a/src/editor/SettingsPanel.cpp +++ b/src/editor/SettingsPanel.cpp @@ -1,8 +1,11 @@ #include "editor/SettingsPanel.hpp" #include "editor/EditorIcons.hpp" +#include "editor/EditorShortcuts.hpp" #include "editor/EditorTheme.hpp" #include +#include +#include #ifdef CF_HAS_IMGUI #include @@ -90,6 +93,7 @@ void SettingsPanel::render() { {"Viewport", "arrows-vertical"}, {"Panels", "arrow-down-square"}, {"Layout Profiles", "backup-restore"}, + {"Shortcuts", "arrows-diagonal"}, }; if (ImGui::BeginChild("settings_nav", ImVec2(220.0f, -40.0f), true)) { @@ -103,15 +107,20 @@ void SettingsPanel::render() { for (int i = 0; i < IM_ARRAYSIZE(navItems); ++i) { ImGui::PushID(i); const bool selected = (m_settingsSection == i); - if (ImGui::Selectable("##row", selected, ImGuiSelectableFlags_None, ImVec2(-1.0f, rowH))) { - m_settingsSection = i; + const float rowW = ImGui::GetContentRegionAvail().x; + const ImVec2 rowPos = ImGui::GetCursorScreenPos(); + ImGui::InvisibleButton("##row", ImVec2(rowW, rowH)); + if (ImGui::IsItemClicked()) m_settingsSection = i; + const bool hovered = ImGui::IsItemHovered(); + if (selected || hovered) { + navDraw->AddRectFilled(rowPos, ImVec2(rowPos.x + rowW, rowPos.y + rowH), + selected ? IM_COL32(58, 78, 108, 255) : IM_COL32(48, 52, 60, 255), 4.0f); } - const ImVec2 rMin = ImGui::GetItemRectMin(); - const ImVec2 rMax = ImGui::GetItemRectMax(); + const ImVec2 rMin = rowPos; const float labelX = rMin.x + style.FramePadding.x + iconSize + style.ItemInnerSpacing.x; - const float labelY = rMin.y + style.FramePadding.y; + const float labelY = rMin.y + (rowH - iconSize) * 0.5f; if (EditorIcons::hasIcon(navItems[i].icon)) { const ImTextureRef iconTex = EditorIcons::get(navItems[i].icon); if (iconTex._TexData != nullptr || iconTex._TexID != ImTextureID_Invalid) { @@ -137,6 +146,7 @@ void SettingsPanel::render() { case 2: renderViewportSettings(); break; case 3: renderPanelSettings(); break; case 4: renderLayoutProfiles(); break; + case 5: renderShortcutSettings(); break; default: break; } ImGui::EndChild(); @@ -153,6 +163,93 @@ void SettingsPanel::render() { #endif } +void SettingsPanel::renderShortcutSettings() { +#ifdef CF_HAS_IMGUI + ImGui::TextColored(ImVec4(0.7f, 0.7f, 1.0f, 1.0f), "IDE Shortcuts"); + ImGui::Separator(); + ImGui::TextWrapped("Click Assign and press the new key. Ctrl and Shift are stored if they are held. Esc cancels."); + if (EditorShortcuts::instance().pollCapture()) savePreferences(); + if (ImGui::Button("Reset Shortcuts")) { + EditorShortcuts::instance().resetDefaults(); + savePreferences(); + } + ImGui::Spacing(); + static char search[96] = {}; + ImGui::SetNextItemWidth(-1.0f); + ImGui::InputTextWithHint("##shortcut_search", "Search shortcuts...", search, sizeof(search)); + ImGui::Spacing(); + + struct ShortcutGroup { + const char* name; + Shortcut ids[8]; + int count; + }; + const ShortcutGroup groups[] = { + {"Transform", {Shortcut::GizmoTranslate, Shortcut::GizmoRotate, Shortcut::GizmoScale}, 3}, + {"Camera", {Shortcut::CameraForward, Shortcut::CameraBack, Shortcut::CameraLeft, Shortcut::CameraRight}, 4}, + {"Edit", + {Shortcut::NewScene, Shortcut::Save, Shortcut::Undo, Shortcut::Redo, Shortcut::Copy, Shortcut::Paste, + Shortcut::Duplicate, Shortcut::DeleteSelection}, + 8}, + {"Windows", {Shortcut::CommandPalette, Shortcut::CommandPaletteAlt}, 2}, + }; + auto contains = [](const char* haystack, const char* needle) { + if (!needle || needle[0] == '\0') return true; + if (!haystack) return false; + for (const char* start = haystack; *start; ++start) { + const char* left = start; + const char* right = needle; + while (*left && *right && + std::tolower(static_cast(*left)) == std::tolower(static_cast(*right))) { + ++left; + ++right; + } + if (*right == '\0') return true; + } + return false; + }; + + bool any = false; + for (const ShortcutGroup& group : groups) { + Shortcut shown[8] = {}; + int shownCount = 0; + const bool groupMatch = search[0] != '\0' && contains(group.name, search); + for (int i = 0; i < group.count; ++i) { + const Shortcut id = group.ids[i]; + if (groupMatch || contains(EditorShortcuts::label(id), search) || + contains(EditorShortcuts::instance().chord(id), search)) { + shown[shownCount++] = id; + } + } + if (shownCount == 0) continue; + any = true; + if (search[0] != '\0') ImGui::SetNextItemOpen(true, ImGuiCond_Always); + if (!ImGui::TreeNodeEx(group.name, ImGuiTreeNodeFlags_DefaultOpen)) continue; + if (ImGui::BeginTable(group.name, 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersInnerH)) { + ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("Key", ImGuiTableColumnFlags_WidthFixed, 160.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 90.0f); + for (int i = 0; i < shownCount; ++i) { + const Shortcut id = shown[i]; + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::TextUnformatted(EditorShortcuts::label(id)); + ImGui::TableSetColumnIndex(1); + ImGui::TextUnformatted(EditorShortcuts::instance().chord(id)); + ImGui::TableSetColumnIndex(2); + ImGui::PushID(static_cast(id)); + const char* caption = EditorShortcuts::instance().capturing(id) ? "..." : "Assign"; + if (ImGui::SmallButton(caption)) EditorShortcuts::instance().beginCapture(id); + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + if (!any) ImGui::TextDisabled("No shortcuts match."); +#endif +} + void SettingsPanel::renderLayoutProfiles() { #ifdef CF_HAS_IMGUI const auto& profiles = m_layoutManager.profiles(); diff --git a/src/editor/SettingsPanel.hpp b/src/editor/SettingsPanel.hpp index 6e6f543b..18fe343a 100644 --- a/src/editor/SettingsPanel.hpp +++ b/src/editor/SettingsPanel.hpp @@ -59,6 +59,7 @@ class SettingsPanel { void renderEditorSettings(); void renderViewportSettings(); void renderPanelSettings(); + void renderShortcutSettings(); }; } // namespace Caffeine::Editor diff --git a/src/editor/TerrainEditorPanel.cpp b/src/editor/TerrainEditorPanel.cpp index f7f130c7..05e9d4ba 100644 --- a/src/editor/TerrainEditorPanel.cpp +++ b/src/editor/TerrainEditorPanel.cpp @@ -92,7 +92,7 @@ void TerrainEditorPanel::drawEditTools(ECS::World& world, ECS::Entity entity, Ed Terrain::TerrainGpuTextureCache::instance().invalidateEntity(entity, nullptr); #endif terrain->splatRevision++; - ctx.isDirty = true; + ctx.markDirty(); } ImGui::Separator(); @@ -180,7 +180,7 @@ void TerrainEditorPanel::drawDataFile(ECS::World& world, ECS::Entity entity, Edi if (!terrain) return; if (ImGui::InputText("Terrain Path", terrain->terrainDataPath, sizeof(terrain->terrainDataPath))) { - ctx.isDirty = true; + ctx.markDirty(); } if (ImGui::IsItemHovered()) { ImGui::SetTooltip("Project-relative path to the .cterrain height/splat data file"); @@ -205,7 +205,7 @@ void TerrainEditorPanel::drawDataFile(ECS::World& world, ECS::Entity entity, Edi } Terrain::TerrainCache::instance().saveTerrainFile( entity, projectRoot / terrain->terrainDataPath, terrain->useSplatmap); - ctx.isDirty = true; + ctx.markDirty(); } } } diff --git a/src/editor/ToolboxPanel.hpp b/src/editor/ToolboxPanel.hpp index ac8c2ad8..f7697ca0 100644 --- a/src/editor/ToolboxPanel.hpp +++ b/src/editor/ToolboxPanel.hpp @@ -91,6 +91,7 @@ class ToolboxPanel { if (ImGui::Checkbox("Snap to grid", &ctx.snapToGrid)) {} ImGui::SliderFloat("Grid size", &ctx.snapGridSize, 0.1f, 10.0f, "%.2f"); if (ImGui::Checkbox("Physics shapes", &ctx.physicsDebugVisible)) {} + if (ImGui::Checkbox("Bones", &ctx.showBones)) {} const bool textured = viewport.meshPreviewMode() == SceneViewport::MeshPreviewMode::Textured; if (ImGui::Button(textured ? "Textured" : "Wireframe", ImVec2(-1.0f, 0.0f))) { viewport.setMeshPreviewMode(textured ? SceneViewport::MeshPreviewMode::Wireframe diff --git a/src/editor/TransformGizmo.cpp b/src/editor/TransformGizmo.cpp index 724eb968..04166923 100644 --- a/src/editor/TransformGizmo.cpp +++ b/src/editor/TransformGizmo.cpp @@ -1,4 +1,5 @@ #include "editor/TransformGizmo.hpp" +#include "editor/EditorShortcuts.hpp" #include "editor/EditorCameraMath.hpp" #include "editor/SceneViewport.hpp" #include "ecs/Components.hpp" @@ -292,7 +293,7 @@ void TransformGizmo::onImGuiRender(ECS::World& world, ECS::Entity entity, Editor default: break; } - ctx.isDirty = true; + ctx.markModified(); } else if (m_isDragging && !ImGui::IsMouseDown(ImGuiMouseButton_Left)) { m_isDragging = false; m_dragAxis = GizmoAxis::None; @@ -304,10 +305,9 @@ void TransformGizmo::onImGuiRender(ECS::World& world, ECS::Entity entity, Editor void TransformGizmo::handleInput(EditorContext& ctx) { #ifdef CF_HAS_IMGUI - if (ImGui::IsKeyPressed(ImGuiKey_W)) ctx.gizmoMode = EditorContext::GizmoMode::Translate; - if (ImGui::IsKeyPressed(ImGuiKey_E)) ctx.gizmoMode = EditorContext::GizmoMode::Rotate; - if (ImGui::IsKeyPressed(ImGuiKey_R)) ctx.gizmoMode = EditorContext::GizmoMode::Scale; - if (ImGui::IsKeyPressed(ImGuiKey_Q)) ctx.gizmoMode = EditorContext::GizmoMode::None; + if (EditorShortcuts::instance().pressed(Shortcut::GizmoTranslate)) ctx.gizmoMode = EditorContext::GizmoMode::Translate; + if (EditorShortcuts::instance().pressed(Shortcut::GizmoRotate)) ctx.gizmoMode = EditorContext::GizmoMode::Rotate; + if (EditorShortcuts::instance().pressed(Shortcut::GizmoScale)) ctx.gizmoMode = EditorContext::GizmoMode::Scale; #endif } diff --git a/src/render/GpuSceneRenderer.cpp b/src/render/GpuSceneRenderer.cpp index 36170687..8905c3f4 100644 --- a/src/render/GpuSceneRenderer.cpp +++ b/src/render/GpuSceneRenderer.cpp @@ -483,14 +483,19 @@ RHI::Buffer* GpuSceneRenderer::vertexBufferFor(const MeshDraw& draw) { return draw.mesh->vertexBuffer; } const u64 bytes = static_cast(draw.skinnedVertices->size() * sizeof(Assets::Vertex3D)); + const u64 generation = Animation::skinnedGenerationFor(draw.entity.id()); RHI::Buffer*& slot = m_skinBuffers[draw.entity.id()]; + u64& uploaded = m_skinUploadGen[draw.entity.id()]; if (!slot || slot->size != bytes) { if (slot) m_device->destroyBuffer(slot); RHI::BufferDesc desc; desc.size = bytes; slot = m_device->createBuffer(desc, RHI::BufferUsage::Vertex); + uploaded = 0; } + if (slot && generation != 0 && uploaded == generation) return slot; if (slot) m_device->uploadBuffer(slot, draw.skinnedVertices->data(), bytes); + if (slot) uploaded = generation; return slot ? slot : draw.mesh->vertexBuffer; } @@ -501,6 +506,7 @@ void GpuSceneRenderer::shutdown() { } } m_skinBuffers.clear(); + m_skinUploadGen.clear(); for (auto& [_, cache] : m_meshLods) { destroyMeshGpu(cache.medium); destroyMeshGpu(cache.far); @@ -1018,7 +1024,11 @@ void GpuSceneRenderer::drawMeshList(RHI::CommandBuffer* cmd, // Everything that is the same for every draw of the pass. LightingUBO base{}; setVec4(base.cameraPos, camera.position.x, camera.position.y, camera.position.z, 0.0f); - setVec4(base.ambient, kFallbackAmbient.x, kFallbackAmbient.y, kFallbackAmbient.z, 0.0f); + if (options.overrideAmbient) { + setVec4(base.ambient, options.ambientColor.x, options.ambientColor.y, options.ambientColor.z, 0.0f); + } else { + setVec4(base.ambient, kFallbackAmbient.x, kFallbackAmbient.y, kFallbackAmbient.z, 0.0f); + } base.dirCount = static_cast(std::min(lighting.lights.directionals.size(), size_t{4})); for (int i = 0; i < base.dirCount; ++i) { const auto& d = lighting.lights.directionals[i]; @@ -1060,7 +1070,8 @@ void GpuSceneRenderer::drawMeshList(RHI::CommandBuffer* cmd, base.volParams[0] = features.volumetrics == VolumetricQuality::Off ? 0.0f : 1.0f; base.volParams[1] = features.volumetricDensity; base.volParams[2] = features.volumetricHeight; - base.volParams[3] = features.volumetrics == VolumetricQuality::Medium ? 12.0f + base.volParams[3] = features.volumetrics == VolumetricQuality::High ? 24.0f + : features.volumetrics == VolumetricQuality::Medium ? 12.0f : features.volumetrics == VolumetricQuality::Low ? 6.0f : 0.0f; const bool planarOn = m_reflectionValid && m_reflectionColor && !m_inReflectionPass && @@ -2279,7 +2290,7 @@ u32 GpuSceneRenderer::renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& worl GpuSceneCamera camera = cameraIn; const Mat4 unjitteredViewProj = cameraIn.proj * cameraIn.view; - const bool taa = PostProcessStack::usesTaa(post) && !opts.wireframeMeshes; + const bool taa = PostProcessStack::usesTaa(post) && !opts.wireframeMeshes && !opts.skipTemporalSettle; Vec2 jitter(0.0f, 0.0f); if (taa) { jitter = PostProcessStack::taaJitter(view->frameIndex); @@ -2325,7 +2336,7 @@ u32 GpuSceneRenderer::renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& worl in.deltaTime = std::clamp(opts.deltaTime, 1e-4f, 0.25f); in.time = static_cast(m_frameCounter) * (1.0f / 60.0f); in.frameIndex = view->frameIndex; - in.historyValid = view->hasPrevious; + in.historyValid = view->hasPrevious && !opts.skipTemporalSettle; in.jitterPixels = jitter; in.viewId = viewId; m_post.execute(cmd, post, in); @@ -2338,7 +2349,9 @@ u32 GpuSceneRenderer::renderWithCamera(RHI::CommandBuffer* cmd, ECS::World& worl std::memcpy(&bits, unjitteredViewProj.data() + i, sizeof(bits)); changeHash = (changeHash ^ bits) * 1099511628211ull; } - if (changeHash != view->prevSceneHash) { + if (opts.skipTemporalSettle) { + view->settleFrames = 0; + } else if (changeHash != view->prevSceneHash) { u32 settle = 2; if (taa) settle = 16; view->settleFrames = std::max(view->settleFrames, settle); diff --git a/src/render/GpuSceneRenderer.hpp b/src/render/GpuSceneRenderer.hpp index 93cc8510..f3934d32 100644 --- a/src/render/GpuSceneRenderer.hpp +++ b/src/render/GpuSceneRenderer.hpp @@ -89,6 +89,10 @@ struct GpuSceneRenderOptions { u64 viewId = 0; f32 deltaTime = 1.0f / 60.0f; bool drawSky = true; + /// Pose-only editor redraw: skip TAA/probe settle so Play does not leave the viewport looping. + bool skipTemporalSettle = false; + bool overrideAmbient = false; + Vec3 ambientColor{0.03f, 0.03f, 0.035f}; GpuGridOverlay grid{}; }; @@ -307,6 +311,7 @@ class GpuSceneRenderer { RHI::Pipeline* m_instancedPipeline = nullptr; RHI::Buffer* m_instanceBuffer = nullptr; std::unordered_map m_skinBuffers; + std::unordered_map m_skinUploadGen; RHI::Buffer* vertexBufferFor(const MeshDraw& draw); RHI::Pipeline* m_blendPipeline = nullptr; RHI::Shader* m_fullscreenVert = nullptr; diff --git a/src/render/RenderFeatures.hpp b/src/render/RenderFeatures.hpp index 605de7b1..408626fd 100644 --- a/src/render/RenderFeatures.hpp +++ b/src/render/RenderFeatures.hpp @@ -16,7 +16,7 @@ enum class ReflectionMode : u8 { Off = 0, Planar = 1, ScreenSpace = 2, Probe = 3 /// Analytical height fog in the forward shader. It does not redraw the scene. /// Low is 6 steps, Medium is 12. Shadow samples along the ray are optional. -enum class VolumetricQuality : u8 { Off = 0, Low = 1, Medium = 2 }; +enum class VolumetricQuality : u8 { Off = 0, Low = 1, Medium = 2, High = 3 }; struct RenderFeatureSettings { bool instancingEnabled = true; diff --git a/src/render/shaders/scene_lit.frag b/src/render/shaders/scene_lit.frag index a4e76f54..21e29c6a 100644 --- a/src/render/shaders/scene_lit.frag +++ b/src/render/shaders/scene_lit.frag @@ -494,30 +494,66 @@ vec3 transmittedLight(Surface s) { return sampleProbeOrSky(T, s.roughness); } +float henyeyGreenstein(float cosTheta, float g) { + float g2 = g * g; + float denom = max(1.0 + g2 - 2.0 * g * cosTheta, 1e-4); + return (1.0 - g2) / (12.5663706144 * pow(denom, 1.5)); +} + vec3 applyVolumetrics(vec3 color) { if (lights.uVolParams.x < 0.5 || lights.uVolParams.y <= 0.0001) return color; vec3 ray = v_worldPos - lights.uCameraPos.xyz; float rayLen = length(ray); if (rayLen < 0.05) return color; vec3 rd = ray / rayLen; - float steps = clamp(lights.uVolParams.w, 1.0, 12.0); + float steps = clamp(lights.uVolParams.w, 1.0, 24.0); float stepLen = rayLen / steps; vec3 lightDir = vec3(0.0, 1.0, 0.0); if (lights.uDirCount > 0) lightDir = normalize(-lights.uDirData[0].xyz); - float phase = clamp(1.0 + lights.uIblParams.w * dot(rd, lightDir), 0.15, 2.0); + float g = clamp(lights.uIblParams.w, 0.0, 0.92); + float hg = henyeyGreenstein(dot(rd, lightDir), g); + float phase = 0.28 + hg * 2.4; + bool shadowMaps = lights.uExtra.x > 0.5 && shadows.uDirShadowValid.x > 0.5; vec3 accum = vec3(0.0); float transmittance = 1.0; - for (int i = 0; i < 12; ++i) { + for (int i = 0; i < 24; ++i) { if (float(i) >= steps) break; vec3 p = lights.uCameraPos.xyz + rd * (stepLen * (float(i) + 0.5)); - float heightFog = exp(-max(p.y, 0.0) / max(lights.uVolParams.z, 0.5)); - float density = lights.uVolParams.y * heightFog; - float shadow = 1.0; - if (lights.uExtra.x > 0.5 && shadows.uDirShadowValid.x > 0.5) { - shadow = sampleDirShadow(uShadowMap0, 0, p, vec3(0.0)); + float heightFog = exp(-max(p.y, 0.0) / max(lights.uVolParams.z, 8.0)); + float density = lights.uVolParams.y * mix(1.0, heightFog, 0.22); + float shaft = 0.22; + if (shadowMaps) { + shaft = pow(sampleDirShadow(uShadowMap0, 0, p, vec3(0.0)), 1.25); } float absorb = density * stepLen; - vec3 fogColor = lights.uIblColor.rgb * phase * shadow; + vec3 fogColor = lights.uAmbient.rgb * 0.10; + if (lights.uDirCount > 0) { + fogColor += lights.uDirColor[0].rgb * lights.uDirData[0].w * phase * shaft; + } + for (int L = 0; L < 4; ++L) { + if (L >= lights.uPointCount) break; + vec3 toL = lights.uPointData[L].xyz - p; + float dist = length(toL); + float radius = max(lights.uPointData[L].w, 0.05); + if (dist > radius) continue; + float att = 1.0 - dist / radius; + att *= att; + float pntHg = henyeyGreenstein(dot(rd, toL / max(dist, 0.001)), g * 0.85); + fogColor += lights.uPointColor[L].rgb * lights.uPointColor[L].a * att * (0.35 + pntHg * 2.0); + } + for (int L = 0; L < 4; ++L) { + if (L >= lights.uSpotCount) break; + vec3 toL = lights.uSpotData[L].xyz - p; + float dist = length(toL); + float radius = max(lights.uSpotData[L].w, 0.05); + if (dist > radius) continue; + vec3 ldir = toL / max(dist, 0.001); + float cone = dot(-ldir, normalize(lights.uSpotDir[L].xyz)); + if (cone < lights.uSpotAngle[L].x) continue; + float att = 1.0 - dist / radius; + float spotHg = henyeyGreenstein(dot(rd, ldir), g); + fogColor += lights.uSpotColor[L].rgb * lights.uSpotDir[L].w * att * att * (0.40 + spotHg * 2.2); + } accum += transmittance * fogColor * absorb; transmittance *= exp(-absorb); } diff --git a/src/rhi/RenderDevice.cpp b/src/rhi/RenderDevice.cpp index 92da1a33..110bb4f3 100644 --- a/src/rhi/RenderDevice.cpp +++ b/src/rhi/RenderDevice.cpp @@ -65,6 +65,7 @@ void RenderDevice::shutdown() { SDL_WaitForGPUIdle(m_device); for (u32 i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) { releasePendingTransfers(i); + releaseRetiredTextures(i); } m_activeFrameCmd = nullptr; @@ -211,6 +212,7 @@ void RenderDevice::endFrame(CommandBuffer* cmd) { // Release transfer buffers from the frame that just retired (3 frames ago). m_frameIndex = (m_frameIndex + 1) % MAX_FRAMES_IN_FLIGHT; releasePendingTransfers(m_frameIndex); + releaseRetiredTextures(m_frameIndex); } Texture* RenderDevice::createTexture(const TextureDesc& desc) { @@ -314,10 +316,25 @@ Buffer* RenderDevice::createBuffer(const BufferDesc& desc, BufferUsage usage) { return buf; } +void RenderDevice::retireGpuTexture(SDL_GPUTexture* handle) { + if (!handle) return; + if (!m_device) return; + m_retiredTextures[m_frameIndex].push_back(handle); +} + +void RenderDevice::releaseRetiredTextures(u32 slot) { + if (slot >= MAX_FRAMES_IN_FLIGHT) return; + for (SDL_GPUTexture* handle : m_retiredTextures[slot]) { + if (m_device && handle) SDL_ReleaseGPUTexture(m_device, handle); + } + m_retiredTextures[slot].clear(); +} + void RenderDevice::destroyTexture(Texture* tex) { if (!tex) return; - if (m_device && tex->handle) { - SDL_ReleaseGPUTexture(m_device, tex->handle); + if (tex->handle) { + retireGpuTexture(tex->handle); + tex->handle = nullptr; } delete tex; } diff --git a/src/rhi/RenderDevice.hpp b/src/rhi/RenderDevice.hpp index 0a3700f0..2a9506c9 100644 --- a/src/rhi/RenderDevice.hpp +++ b/src/rhi/RenderDevice.hpp @@ -282,6 +282,10 @@ class RenderDevice { static constexpr u32 MAX_FRAMES_IN_FLIGHT = 3; void releasePendingTransfers(u32 slot); + void retireGpuTexture(SDL_GPUTexture* handle); + void releaseRetiredTextures(u32 slot); + + std::vector m_retiredTextures[MAX_FRAMES_IN_FLIGHT]; }; } // namespace Caffeine::RHI diff --git a/src/runtime/RuntimeSceneRenderer.cpp b/src/runtime/RuntimeSceneRenderer.cpp index d01a8b5b..5858570f 100644 --- a/src/runtime/RuntimeSceneRenderer.cpp +++ b/src/runtime/RuntimeSceneRenderer.cpp @@ -15,6 +15,7 @@ #include "scene/LightingSystem.hpp" #include "scene/TerrainSystem.hpp" #include "scene/EnvironmentSystem.hpp" +#include "scene/EnvironmentEffectsSystem.hpp" #ifdef CF_HAS_SDL3 #include #endif @@ -432,9 +433,14 @@ void RuntimeSceneRenderer::render(ECS::World& world, Editor::EditorContext& ctx, const u32 w = static_cast(std::max(panelSize.x, 8.0f)); const u32 h = static_cast(std::max(panelSize.y, 8.0f)); resizeCanvas(w, h); + Render::GpuSceneRenderOptions gpuOpts; + if (Scene::environmentHasOverride(world)) { + gpuOpts.overrideAmbient = true; + gpuOpts.ambientColor = Scene::environmentAmbientAt(world, gpuCamera->position); + } const u32 drawn = m_gpuRenderer.renderWithCamera(m_frameCmd, world, *gpuCamera, m_colorTarget, - m_depthTarget, w, h, projectRoot); + m_depthTarget, w, h, projectRoot, gpuOpts); if (drawn > 0 && m_colorTarget && m_colorTarget->handle) { dl->AddImage(reinterpret_cast(m_colorTarget->handle), origin, ImVec2(origin.x + panelSize.x, origin.y + panelSize.y), ImVec2(0, 0), diff --git a/src/scene/EnvironmentEffectsSystem.hpp b/src/scene/EnvironmentEffectsSystem.hpp new file mode 100644 index 00000000..85299efa --- /dev/null +++ b/src/scene/EnvironmentEffectsSystem.hpp @@ -0,0 +1,390 @@ +#pragma once + +#include "ecs/EnvironmentEffectsComponents.hpp" +#include "ecs/ForwardRenderComponents.hpp" +#include "ecs/LightComponents.hpp" +#include "ecs/PostProcessComponents.hpp" +#include "ecs/SkyboxComponents.hpp" +#include "ecs/MeshComponents.hpp" +#include "ecs/CameraComponents.hpp" +#include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/ComponentQuery.hpp" +#include "ecs/World.hpp" +#include "math/Quat.hpp" +#include "math/Vec3.hpp" +#include "math/Vec4.hpp" +#include "scene/HierarchySystem.hpp" +#include "scene/LightingSystem.hpp" + +#include +#include +#include + +namespace Caffeine::Scene { + +inline Vec3 environmentEntityPosition(ECS::World& world, ECS::Entity entity) { + if (auto* wt = world.get(entity)) { + return Vec3(wt->matrix(0, 3), wt->matrix(1, 3), wt->matrix(2, 3)); + } + if (auto* p = world.get(entity)) return p->position; + if (auto* t = world.get(entity)) return t->position; + return {}; +} + +inline Vec3 worldLightSunDirection(f32 timeOfDay) { + const f32 hour = std::clamp(timeOfDay, 0.0f, 24.0f); + const f32 tau = (hour / 24.0f) * 6.28318530718f; + const f32 elevation = std::sin((hour - 6.0f) / 12.0f * 3.14159265359f); + if (elevation > 0.0f) { + return Vec3(std::cos(tau), -std::max(0.12f, elevation), std::sin(tau)).normalized(); + } + return Vec3(-std::cos(tau), -0.22f, -std::sin(tau)).normalized(); +} + +inline f32 worldLightDayFactor(f32 timeOfDay) { + const f32 elevation = std::sin((std::clamp(timeOfDay, 0.0f, 24.0f) - 6.0f) / 12.0f * 3.14159265359f); + return std::clamp(elevation, 0.0f, 1.0f); +} + +inline f32 sampleSkyVisibility(ECS::World& world, const Vec3& origin); + +inline Vec3 firstCamera3DPosition(ECS::World& world, const Vec3& fallback) { + Vec3 pos = fallback; + ECS::ComponentQuery query; + query.with(); + world.forEach(query, [&](ECS::Entity entity, ECS::Camera3DComponent&) { + if (isEffectivelyDisabled(world, entity)) return; + if (auto* active = world.get(entity)) { + if (active->is2D) return; + } + pos = environmentEntityPosition(world, entity); + }); + return pos; +} + +inline f32 environmentZoneWeight(ECS::World& world, ECS::Entity entity, + const ECS::EnvironmentEffectsComponent& fx, const Vec3& viewPos) { + if (fx.mode != static_cast(ECS::WorldLightMode::Zone)) return 0.0f; + const Vec3 origin = environmentEntityPosition(world, entity); + const f32 radius = std::max(fx.zoneRadius, 0.01f); + const f32 dist = (viewPos - origin).length(); + const f32 t = std::clamp(dist / radius, 0.0f, 1.0f); + return 1.0f - std::pow(t, std::max(fx.zoneFalloff, 0.05f)); +} + +inline void evaluateWorldLightFill(const ECS::EnvironmentEffectsComponent& fx, f32 skyVis, + f32 zoneWeight, Vec3& fill, f32& fill2D, f32& skyExposure) { + const bool zone = fx.mode == static_cast(ECS::WorldLightMode::Zone); + const f32 day = worldLightDayFactor(fx.timeOfDay); + const f32 night = 1.0f - day; + const f32 indoor = 1.0f - std::clamp(fx.indoorDarkness, 0.0f, 0.98f) * (1.0f - skyVis); + fill = fx.sunColor * (fx.ambientDay * day) + fx.moonColor * (fx.ambientNight * night); + fill2D = fx.ambientDay * day + fx.ambientNight * night; + if (zone) { + fill = fill * (1.0f - zoneWeight) + fx.zoneColor * (fx.zoneIntensity * zoneWeight); + fill2D = fill2D * (1.0f - zoneWeight) + fx.zoneIntensity * zoneWeight; + } + if (fx.environmentLighting != 0) { + fill = fill * indoor; + fill2D = std::max(0.02f, fill2D * std::max(indoor, 0.08f)); + } + skyExposure = (zone ? (0.45f + 0.7f * zoneWeight) : (0.28f + 0.85f * day)) * indoor; +} + +inline Vec3 environmentAmbientAt(ECS::World& world, const Vec3& viewPos) { + Vec3 ambient(0.03f, 0.03f, 0.035f); + bool found = false; + ECS::ComponentQuery query; + query.with(); + world.forEach( + query, [&](ECS::Entity entity, ECS::EnvironmentEffectsComponent& fx) { + if (isEffectivelyDisabled(world, entity) || fx.enabled == 0) return; + const f32 sky = + fx.environmentLighting != 0 ? sampleSkyVisibility(world, viewPos) : 1.0f; + const f32 zoneWeight = environmentZoneWeight(world, entity, fx, viewPos); + Vec3 fill{}; + f32 fill2D = 1.0f; + f32 skyExposure = 1.0f; + evaluateWorldLightFill(fx, sky, zoneWeight, fill, fill2D, skyExposure); + if (!found) { + ambient = fill; + found = true; + } else { + ambient = Vec3(ambient.x + fill.x, ambient.y + fill.y, ambient.z + fill.z) * 0.5f; + } + }); + return ambient; +} + +inline Vec3 environmentAmbient3D(ECS::World& world) { + Vec3 ambient(0.03f, 0.03f, 0.035f); + bool found = false; + ECS::ComponentQuery query; + query.with(); + world.forEach( + query, [&](ECS::Entity entity, ECS::EnvironmentEffectsComponent& fx) { + if (isEffectivelyDisabled(world, entity) || fx.enabled == 0) return; + if (!found) { + ambient = fx.drivenAmbient; + found = true; + } else { + ambient = Vec3(ambient.x + fx.drivenAmbient.x, ambient.y + fx.drivenAmbient.y, + ambient.z + fx.drivenAmbient.z) * + 0.5f; + } + }); + return ambient; +} + +inline ECS::Entity ensureSunDirectional(ECS::World& world, ECS::Entity envEntity) { + ECS::Entity sun; + ECS::ComponentQuery lights; + lights.with(); + lights.with(); + world.forEach( + lights, [&](ECS::Entity lightEntity, ECS::LightComponent&, ECS::DirectionalLightComponent&) { + if (isEffectivelyDisabled(world, lightEntity)) return; + if (!sun.isValid()) sun = lightEntity; + }); + if (sun.isValid()) return sun; + if (!world.has(envEntity)) { + auto& light = world.add(envEntity); + light.intensity = 1.2f; + } + if (!world.has(envEntity)) { + world.add(envEntity); + } + if (!world.has(envEntity)) world.add(envEntity); + if (!world.has(envEntity)) world.add(envEntity); + applyDefaultSunOrientation(world, envEntity); + return envEntity; +} + +inline f32 environmentAmbient2D(ECS::World& world) { + f32 ambient = 1.0f; + ECS::ComponentQuery query; + query.with(); + world.forEach( + query, [&](ECS::Entity entity, ECS::EnvironmentEffectsComponent& fx) { + if (isEffectivelyDisabled(world, entity) || fx.enabled == 0) return; + ambient = std::min(ambient, fx.drivenAmbient2D); + }); + return ambient; +} + +inline bool rayHitsAabb(const Vec3& origin, const Vec3& dir, const Vec3& bmin, const Vec3& bmax, + f32 maxDist) { + f32 tmin = 0.0f; + f32 tmax = maxDist; + for (int axis = 0; axis < 3; ++axis) { + const f32 o = axis == 0 ? origin.x : (axis == 1 ? origin.y : origin.z); + const f32 d = axis == 0 ? dir.x : (axis == 1 ? dir.y : dir.z); + const f32 mn = axis == 0 ? bmin.x : (axis == 1 ? bmin.y : bmin.z); + const f32 mx = axis == 0 ? bmax.x : (axis == 1 ? bmax.y : bmax.z); + if (std::abs(d) < 1.0e-8f) { + if (o < mn || o > mx) return false; + continue; + } + const f32 inv = 1.0f / d; + f32 t0 = (mn - o) * inv; + f32 t1 = (mx - o) * inv; + if (t0 > t1) std::swap(t0, t1); + tmin = std::max(tmin, t0); + tmax = std::min(tmax, t1); + if (tmax < tmin) return false; + } + return tmax > 0.05f; +} + +inline f32 sampleSkyVisibility(ECS::World& world, const Vec3& origin) { + struct Box { + Vec3 min; + Vec3 max; + }; + std::vector boxes; + ECS::ComponentQuery meshes; + meshes.with(); + world.forEach( + meshes, [&](ECS::Entity entity, ECS::MeshFilterComponent&) { + if (isEffectivelyDisabled(world, entity)) return; + Vec3 center{}; + Vec3 half(0.5f, 0.5f, 0.5f); + if (auto* wt = world.get(entity)) { + center = Vec3(wt->matrix(0, 3), wt->matrix(1, 3), wt->matrix(2, 3)); + half = Vec3(Vec3(wt->matrix(0, 0), wt->matrix(1, 0), wt->matrix(2, 0)).length(), + Vec3(wt->matrix(0, 1), wt->matrix(1, 1), wt->matrix(2, 1)).length(), + Vec3(wt->matrix(0, 2), wt->matrix(1, 2), wt->matrix(2, 2)).length()) * + 0.5f; + } else if (auto* p = world.get(entity)) { + center = p->position; + if (auto* s = world.get(entity)) { + half = Vec3(std::abs(s->scale.x), std::abs(s->scale.y), std::abs(s->scale.z)) * 0.5f; + } + } else { + return; + } + half.x = std::max(half.x, 0.05f); + half.y = std::max(half.y, 0.05f); + half.z = std::max(half.z, 0.05f); + boxes.push_back({center - half, center + half}); + }); + + const Vec3 dirs[] = { + {0.00f, 1.00f, 0.00f}, {0.35f, 0.92f, 0.00f}, {-0.35f, 0.92f, 0.00f}, + {0.00f, 0.92f, 0.35f}, {0.00f, 0.92f, -0.35f}, {0.50f, 0.75f, 0.40f}, + {-0.50f, 0.75f, 0.40f}, {0.50f, 0.75f, -0.40f}, {-0.50f, 0.75f, -0.40f}, + }; + int blocked = 0; + const int count = static_cast(sizeof(dirs) / sizeof(dirs[0])); + const Vec3 start = origin + Vec3(0.0f, 0.35f, 0.0f); + for (int i = 0; i < count; ++i) { + const Vec3 dir = dirs[i].normalized(); + bool hit = false; + for (const Box& box : boxes) { + if (rayHitsAabb(start, dir, box.min, box.max, 36.0f)) { + hit = true; + break; + } + } + if (hit) ++blocked; + } + return 1.0f - static_cast(blocked) / static_cast(count); +} + +inline bool environmentWantsShadows(ECS::World& world) { + bool wanted = false; + ECS::ComponentQuery query; + query.with(); + world.forEach( + query, [&](ECS::Entity entity, ECS::EnvironmentEffectsComponent& fx) { + if (!isEffectivelyDisabled(world, entity) && fx.enabled != 0 && fx.castShadows != 0) { + wanted = true; + } + }); + return wanted; +} + +inline bool environmentHasOverride(ECS::World& world) { + bool found = false; + ECS::ComponentQuery query; + query.with(); + world.forEach( + query, [&](ECS::Entity entity, ECS::EnvironmentEffectsComponent& fx) { + if (!isEffectivelyDisabled(world, entity) && fx.enabled != 0) found = true; + }); + return found; +} + +inline void ensureEnvironmentRenderStack(ECS::World& world) { + ECS::Entity host = ECS::Entity::INVALID; + ECS::ComponentQuery query; + query.with(); + world.forEach( + query, [&](ECS::Entity entity, ECS::EnvironmentEffectsComponent& fx) { + if (host.isValid()) return; + if (!isEffectivelyDisabled(world, entity) && fx.enabled != 0) host = entity; + }); + if (!host.isValid()) return; + if (!world.has(host)) { + auto& features = world.add(host); + features.ibl.enabled = false; + features.occlusion.enabled = true; + features.volumetrics.enabled = true; + features.volumetrics.quality = Render::VolumetricQuality::High; + features.volumetrics.sampleShadows = true; + features.volumetrics.density = 0.045f; + features.volumetrics.height = 80.0f; + features.volumetrics.anisotropy = 0.62f; + } + if (!world.has(host)) { + auto& post = world.add(host); + post.ambientOcclusion.enabled = true; + post.ambientOcclusion.intensity = 1.1f; + post.ambientOcclusion.radius = 0.55f; + } +} + +inline void tickEnvironmentEffects(ECS::World& world, f32 dt, const Vec3& viewPos) { + ensureEnvironmentRenderStack(world); + ECS::ComponentQuery query; + query.with(); + world.forEach( + query, [&](ECS::Entity entity, ECS::EnvironmentEffectsComponent& fx) { + if (isEffectivelyDisabled(world, entity) || fx.enabled == 0) return; + + if (fx.kind == static_cast(ECS::EnvironmentEffectKind::WorldLight) && + fx.mode == static_cast(ECS::WorldLightMode::DayNight) && + fx.dayLengthSeconds > 0.05f && dt > 0.0f) { + fx.timeOfDay = std::fmod(fx.timeOfDay + (dt * 24.0f) / fx.dayLengthSeconds, 24.0f); + if (fx.timeOfDay < 0.0f) fx.timeOfDay += 24.0f; + } + + const bool zone = fx.mode == static_cast(ECS::WorldLightMode::Zone); + const f32 zoneWeight = environmentZoneWeight(world, entity, fx, viewPos); + const f32 day = worldLightDayFactor(fx.timeOfDay); + const f32 night = 1.0f - day; + fx.skyVisibility = fx.environmentLighting != 0 ? sampleSkyVisibility(world, viewPos) : 1.0f; + Vec3 fill{}; + f32 fill2D = 1.0f; + evaluateWorldLightFill(fx, fx.skyVisibility, zoneWeight, fill, fill2D, fx.skyExposure); + fx.drivenAmbient = fill; + fx.drivenAmbient2D = std::clamp(fill2D, 0.02f, 2.0f); + + if (fx.driveExistingLights != 0 && !zone) { + const Vec3 sunDir = worldLightSunDirection(fx.timeOfDay); + const Vec3 lightColor = fx.sunColor * day + fx.moonColor * night; + const f32 intensity = fx.sunIntensity * day + fx.moonIntensity * night; + const ECS::Entity sun = ensureSunDirectional(world, entity); + if (auto* light = world.get(sun)) { + light->color = Vec4(lightColor.x, lightColor.y, lightColor.z, 1.0f); + light->intensity = intensity; + } + if (auto* dir = world.get(sun)) { + dir->castShadows = fx.castShadows != 0 && fx.shadowStrength > 0.05f; + } + applySunDirection(world, sun, sunDir); + } + + ECS::ComponentQuery skies; + skies.with(); + world.forEach(skies, [&](ECS::Entity skyEntity, ECS::SkyboxComponent& sky) { + if (isEffectivelyDisabled(world, skyEntity) || !sky.enabled) return; + sky.exposure = fx.skyExposure; + }); + + const f32 ao = zone ? (fx.aoDay * zoneWeight + fx.aoNight * (1.0f - zoneWeight)) + : (fx.aoDay * day + fx.aoNight * night); + ECS::ComponentQuery features; + features.with(); + world.forEach( + features, [&](ECS::Entity fxEntity, ECS::ForwardRenderFeaturesComponent& fwd) { + if (isEffectivelyDisabled(world, fxEntity) || !fwd.enabled) return; + fwd.occlusion.enabled = fx.ambientOcclusion != 0 && ao > 0.02f; + fwd.occlusion.minRadius = std::clamp(0.45f + ao, 0.35f, 2.0f); + fwd.volumetrics.enabled = fx.volumetricsEnabled != 0; + if (fwd.volumetrics.enabled) { + fwd.volumetrics.quality = Render::VolumetricQuality::High; + fwd.volumetrics.sampleShadows = fx.castShadows != 0; + fwd.volumetrics.density = std::max(fx.volumetricDensity, 0.002f); + fwd.volumetrics.height = 80.0f; + fwd.volumetrics.anisotropy = 0.62f; + } + }); + + ECS::ComponentQuery posts; + posts.with(); + world.forEach( + posts, [&](ECS::Entity postEntity, ECS::PostProcessComponent& post) { + if (isEffectivelyDisabled(world, postEntity) || !post.enabled) return; + post.ambientOcclusion.enabled = fx.ambientOcclusion != 0; + if (post.ambientOcclusion.enabled) { + post.ambientOcclusion.intensity = std::clamp(ao * (1.4f - 0.6f * fx.skyVisibility), + 0.25f, 3.0f); + post.ambientOcclusion.radius = 0.55f; + } + }); + }); +} + +} // namespace Caffeine::Scene diff --git a/src/scene/LightingSystem.cpp b/src/scene/LightingSystem.cpp index e8a85434..c35bf01a 100644 --- a/src/scene/LightingSystem.cpp +++ b/src/scene/LightingSystem.cpp @@ -90,8 +90,8 @@ bool directionalLightHasExplicitAim(ECS::World& world, ECS::Entity entity) { return false; } -void applyDefaultSunOrientation(ECS::World& world, ECS::Entity entity) { - const Vec3 sun = defaultSunDirection(); +void applySunDirection(ECS::World& world, ECS::Entity entity, const Vec3& direction) { + const Vec3 sun = direction.lengthSquared() > 1.0e-8f ? direction.normalized() : defaultSunDirection(); const Quat q = Quat::lookAt(-1.0f * sun, Vec3(0.0f, 1.0f, 0.0f)); ECS::Rotation3D* rotation = world.get(entity); if (!rotation) rotation = &world.add(entity); @@ -104,6 +104,10 @@ void applyDefaultSunOrientation(ECS::World& world, ECS::Entity entity) { } } +void applyDefaultSunOrientation(ECS::World& world, ECS::Entity entity) { + applySunDirection(world, entity, defaultSunDirection()); +} + void LightingData::clear() { directionals.clear(); points.clear(); diff --git a/src/scene/LightingSystem.hpp b/src/scene/LightingSystem.hpp index 6e27dbfc..561baabe 100644 --- a/src/scene/LightingSystem.hpp +++ b/src/scene/LightingSystem.hpp @@ -67,6 +67,7 @@ void collectSceneLights(ECS::World& world, LightingData& out); /// (local -Z). Identity sun lights the horizon, not the floor. Vec3 defaultSunDirection(); bool directionalLightHasExplicitAim(ECS::World& world, ECS::Entity entity); +void applySunDirection(ECS::World& world, ECS::Entity entity, const Vec3& direction); void applyDefaultSunOrientation(ECS::World& world, ECS::Entity entity); void buildSceneShadowMaps(ECS::World& world, const LightingData& lights, const Vec3& focus, diff --git a/src/script/ForwardRenderBindings.cpp b/src/script/ForwardRenderBindings.cpp index 38f3dc67..876482b5 100644 --- a/src/script/ForwardRenderBindings.cpp +++ b/src/script/ForwardRenderBindings.cpp @@ -68,7 +68,7 @@ void registerForwardRenderBindings(sol::state& lua, ECS::World** worldPtr) { fx->volumetrics.enabled = enabled; if (quality) { fx->volumetrics.quality = - static_cast(std::clamp(*quality, 0, 2)); + static_cast(std::clamp(*quality, 0, 3)); } } }; From 374b84aafa1726b120044ce2ae5c3ac165a9c622 Mon Sep 17 00:00:00 2001 From: LyeZinho Date: Wed, 14 Oct 2026 22:10:45 +0100 Subject: [PATCH 6/9] =?UTF-8?q?Runtime=20capabilities=20=E2=80=94=20patch?= =?UTF-8?q?=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 10 + apps/runtime/main.cpp | 22 +- .../runtime-capabilities-patch-notes.md | 116 ++++++++ docs/rendering/overlay-2d-rhi.md | 22 ++ docs/scripting/native-modules.md | 51 ++++ docs/scripting/runtime-apis.md | 122 +++++--- include/caffeine/runtime/NativeModuleAPI.h | 47 +++ planning/engine-runtime-capabilities-rfc.md | 168 +++++++++++ src/ecs/LodComponents.hpp | 19 ++ src/ecs/MapComponents.hpp | 17 ++ src/editor/ComponentRegistry.cpp | 22 ++ src/editor/SceneEditor.cpp | 6 +- src/editor/SceneSerializer.cpp | 12 + src/editor/SceneSerializer.hpp | 4 +- src/editor/SceneViewport.cpp | 237 +-------------- src/events/Events.hpp | 10 + src/render/Overlay2D.cpp | 212 ++++++++++++++ src/render/Overlay2D.hpp | 97 +++++++ src/render/shaders/overlay2d.frag | 8 + src/render/shaders/overlay2d.vert | 15 + src/runtime/GameStateStack.cpp | 50 ++++ src/runtime/GameStateStack.hpp | 38 +++ src/runtime/PlayClock.cpp | 64 ++++ src/runtime/PlayClock.hpp | 44 +++ src/scene/Camera2DPlay.hpp | 24 ++ src/scene/MapSurfaceSystem.cpp | 88 ++++++ src/scene/MapSurfaceSystem.hpp | 15 + src/scene/PickQuery.cpp | 168 +++++++++++ src/scene/PickQuery.hpp | 79 +++++ src/scene/PickRaycast.cpp | 263 +++++++++++++++++ src/scene/SpriteLod2DSystem.cpp | 41 +++ src/scene/SpriteLod2DSystem.hpp | 10 + src/script/AssetTextLoader.cpp | 64 ++++ src/script/AssetTextLoader.hpp | 26 ++ src/script/NativeModuleHost.cpp | 169 +++++++++++ src/script/NativeModuleHost.hpp | 36 +++ src/script/RuntimeScriptBindings.cpp | 274 ++++++++++++++++++ src/script/RuntimeScriptBindings.hpp | 23 ++ src/script/ScriptEngine.cpp | 51 ++++ src/script/ScriptEngine.hpp | 3 + src/script/ScriptSystem.cpp | 32 +- src/script/ScriptSystem.hpp | 7 +- src/spatial/SpatialGrid2D.hpp | 59 ++++ tests/CMakeLists.txt | 1 + tests/test_pick_query.cpp | 42 +++ 45 files changed, 2618 insertions(+), 270 deletions(-) create mode 100644 docs/releases/runtime-capabilities-patch-notes.md create mode 100644 docs/rendering/overlay-2d-rhi.md create mode 100644 docs/scripting/native-modules.md create mode 100644 include/caffeine/runtime/NativeModuleAPI.h create mode 100644 planning/engine-runtime-capabilities-rfc.md create mode 100644 src/ecs/LodComponents.hpp create mode 100644 src/ecs/MapComponents.hpp create mode 100644 src/render/Overlay2D.cpp create mode 100644 src/render/Overlay2D.hpp create mode 100644 src/render/shaders/overlay2d.frag create mode 100644 src/render/shaders/overlay2d.vert create mode 100644 src/runtime/GameStateStack.cpp create mode 100644 src/runtime/GameStateStack.hpp create mode 100644 src/runtime/PlayClock.cpp create mode 100644 src/runtime/PlayClock.hpp create mode 100644 src/scene/Camera2DPlay.hpp create mode 100644 src/scene/MapSurfaceSystem.cpp create mode 100644 src/scene/MapSurfaceSystem.hpp create mode 100644 src/scene/PickQuery.cpp create mode 100644 src/scene/PickQuery.hpp create mode 100644 src/scene/PickRaycast.cpp create mode 100644 src/scene/SpriteLod2DSystem.cpp create mode 100644 src/scene/SpriteLod2DSystem.hpp create mode 100644 src/script/AssetTextLoader.cpp create mode 100644 src/script/AssetTextLoader.hpp create mode 100644 src/script/NativeModuleHost.cpp create mode 100644 src/script/NativeModuleHost.hpp create mode 100644 src/script/RuntimeScriptBindings.cpp create mode 100644 src/script/RuntimeScriptBindings.hpp create mode 100644 src/spatial/SpatialGrid2D.hpp create mode 100644 tests/test_pick_query.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d74c28a8..67b7a9e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,13 @@ add_library(caffeine-core src/assets/PrefabSerializer.cpp src/assets/HotReloader.cpp src/scene/PlayMode2D.cpp + src/scene/PickQuery.cpp + src/scene/PickRaycast.cpp + src/scene/MapSurfaceSystem.cpp + src/scene/SpriteLod2DSystem.cpp + src/render/Overlay2D.cpp + src/runtime/PlayClock.cpp + src/runtime/GameStateStack.cpp src/scene/EnvironmentSystem.cpp src/scene/CpuDirectionalShadowMap.cpp src/scene/LightingSystem.cpp @@ -393,6 +400,9 @@ if(CAFFEINE_ENABLE_SCRIPTING) src/script/AnimationBindings.cpp src/script/EffectBindings.cpp src/script/NavigationBindings.cpp + src/script/RuntimeScriptBindings.cpp + src/script/AssetTextLoader.cpp + src/script/NativeModuleHost.cpp ) endif() diff --git a/apps/runtime/main.cpp b/apps/runtime/main.cpp index c0df8a73..1fc0036f 100644 --- a/apps/runtime/main.cpp +++ b/apps/runtime/main.cpp @@ -23,6 +23,11 @@ #include "scene/HierarchySystem.hpp" #include "ui/UISystem.hpp" #include "ui/UIRenderer.hpp" +#include "render/Overlay2D.hpp" +#include "render/Camera2D.hpp" +#include "scene/PickQuery.hpp" +#include "scene/PlayMode2D.hpp" +#include "runtime/PlayClock.hpp" #include "scene/EnvironmentSystem.hpp" #include "scene/EnvironmentEffectsSystem.hpp" #include "procedural/ProceduralWorldSystem.hpp" @@ -334,6 +339,18 @@ void renderGameView(Caffeine::ECS::World& world, Caffeine::Editor::EditorContext renderer.render(world, ctx, dl, vp, camPos, origin, panelSize, cameraEntity, projectRoot, &gpuCam); + Caffeine::Render::Rect2D vpRect{{origin.x, origin.y}, {panelSize.x, panelSize.y}}; + Caffeine::Render::Camera2D cam2d; + cam2d.setViewport(vpRect); + cam2d.setPosition({camPos.x, camPos.y}); + cam2d.setZoom(1.0f); + const Caffeine::ECS::Entity cam2dEntity = Caffeine::Scene::findActiveCamera2DEntity(world); + if (cam2dEntity.isValid()) { + cam2d = Caffeine::Scene::buildCamera2DFromEntity(world, cam2dEntity, vpRect); + } + Caffeine::Scene::PlayRenderContext::instance().set2D(vpRect, cam2d); + Caffeine::Render::Overlay2D::draw(dl, cam2d, origin, panelSize); + Caffeine::UI::drawWidgets(world, dl, origin, panelSize); ImGui::End(); @@ -443,15 +460,16 @@ int main(int argc, char** argv) { Caffeine::Events::EventBus eventBus; Caffeine::Physics2D::PhysicsSystem2D physics(&eventBus); Caffeine::Animation::AnimationSystem animation; + Caffeine::UI::UISystem uiSystem(&eventBus); Caffeine::Script::ScriptEngine scriptEngine; Caffeine::Script::ScriptEngine::InitParams scriptParams; scriptParams.world = &world; scriptParams.input = &input; scriptParams.events = &eventBus; + scriptParams.ui = &uiSystem; const bool scriptsReady = scriptEngine.init(scriptParams); scriptEngine.setSearchRoot(buildRoot.string()); - Caffeine::Script::ScriptSystem scriptSystem(scriptsReady ? &scriptEngine : nullptr); - Caffeine::UI::UISystem uiSystem(&eventBus); + Caffeine::Script::ScriptSystem scriptSystem(scriptsReady ? &scriptEngine : nullptr, &eventBus); if (scriptsReady) { scriptSystem.resetPlayState(); eventBus.subscribe( diff --git a/docs/releases/runtime-capabilities-patch-notes.md b/docs/releases/runtime-capabilities-patch-notes.md new file mode 100644 index 00000000..15c812ae --- /dev/null +++ b/docs/releases/runtime-capabilities-patch-notes.md @@ -0,0 +1,116 @@ +# Runtime capabilities — patch notes + +**Date:** 2026-10-14 +**Scope:** Caffeine engine core + scripting (Doppio consumes the same APIs) +**RFC:** [planning/engine-runtime-capabilities-rfc.md](../../planning/engine-runtime-capabilities-rfc.md) + +This document is intended for **all engine users** (internal teams and third-party projects). It summarizes what landed in two implementation phases and how to adopt it safely. + +--- + +## Design principles (unchanged) + +1. **Optional** — Projects that only use sprites + scripts pay no map/native/LOD cost unless they use those APIs. +2. **Neutral** — No real-world map providers, HTTP tile URLs, or game-specific names in core. +3. **Editor ≠ runtime** — Doppio plugins stay separate from play-mode native modules. +4. **Single Lua contract** — Documented in [runtime-apis.md](../scripting/runtime-apis.md). + +--- + +## Phase 1 (foundation) + +| Feature | Summary | +|---------|---------| +| **Picking** | `Scene::pickEntityAtWorld`, `raycastSelectEntity`, `PlayRenderContext`, `PickQueryRegistry` | +| **Overlays** | `Render::Overlay2D` + `caffeine.draw2d.*` | +| **UI** | Lua helpers on existing `UISystem` | +| **Scripts** | `require`, `caffeine.assets.loadText`, `PlayClock`, `GameStateStack` | +| **Map (data model)** | `MapSurface2DComponent` (bounds + chunk size only) | + +**Tests:** `tests/test_pick_query.cpp` (`[pick]`). + +--- + +## Phase 2 (this patch) + +### 1. Native runtime modules + +- **ABI:** `include/caffeine/runtime/NativeModuleAPI.h` +- **Host:** `Script::NativeModuleHost` (`dlopen` / `LoadLibrary`, `caffeine_native_module_info`, optional `caffeine_native_call`) +- **Lua:** `caffeine.native.load`, `caffeine.native.call(module, fn, json?)` +- **Docs:** [native-modules.md](../scripting/native-modules.md) + +### 2. Overlay RHI path + +- **API:** `Overlay2D::buildRhiMesh`, `Overlay2D::drawRhi` (SDL GPU / no ImGui entry point) +- **Shaders:** `overlay2d.vert` / `overlay2d.frag` in tree; wire into builtin shader registration to enable GPU draw +- **Docs:** [overlay-2d-rhi.md](../rendering/overlay-2d-rhi.md) + +### 3. Map surface — editor + events + +- **Component:** `MapSurface2DComponent` serialized in `.caf` (type id **55**) +- **Editor:** Add Component → **Map Surface 2D** +- **Runtime:** `Scene::tickMapSurfaceChunkRequests` emits `Events::OnMapSurfaceChunkRequest` +- **Lua:** `caffeine.map.onChunkRequest(fn)` or `caffeine.events.on("mapChunkRequest", fn)` +- **Note:** You supply all content (textures, meshes, data). The engine only reports which logical chunks are visible. + +### 4. 2D sprite LOD + +- **Component:** `SpriteLod2DComponent` (type id **56**), zoom thresholds + scale factor +- **System:** `Scene::applySpriteLod2D` driven by active play camera zoom +- **Editor:** Add Component → **Sprite LOD 2D** (captures current transform scale as base) + +### 5. Custom Lua picking + +- **API:** `caffeine.pick.register`, `unregister`, `query` +- Custom handlers run before entity AABB pick; return a numeric custom id or false + +--- + +## Migration checklist for game teams + +- [ ] Replace ad-hoc screen→world math with `caffeine.pick.screenToWorld` / `PlayRenderContext` +- [ ] Move vector debug draw to `caffeine.draw2d` instead of editor-only gizmos +- [ ] For large surfaces, add `MapSurface2D` + handle `mapChunkRequest` in Lua (or C++ via `EventBus`) +- [ ] For dense 2D scenes, add `SpriteLod2D` on marker entities +- [ ] For heavy sim outside Lua, add `native/my_module.so` using the documented ABI +- [ ] Read [runtime-apis.md](../scripting/runtime-apis.md) (English) before upgrading scripts + +--- + +## Binary scene format + +| Type ID | Component | +|--------:|-----------| +| 55 | `MapSurface2DComponent` | +| 56 | `SpriteLod2DComponent` | + +Older `.caf` files load unchanged; new components are opt-in. + +--- + +## Known follow-ups + +- Register `overlay2d` shaders in `BuiltinShader` + CMake for full GPU overlay draw without ImGui +- Richer `caffeine.native.call` (typed Lua tables ↔ JSON) +- Inspector widgets for map bounds (today: component defaults + future inspector polish) +- Optional `SpatialGrid2D` helpers documented under [spatial-partitioning.md](../physics/spatial-partitioning.md) usage patterns + +--- + +## Files touched (high level) + +- `src/scene/PickQuery.*`, `PickRaycast.*`, `MapSurfaceSystem.*`, `SpriteLod2DSystem.*` +- `src/render/Overlay2D.*`, `src/render/shaders/overlay2d.*` +- `src/script/RuntimeScriptBindings.cpp`, `NativeModuleHost.*`, `AssetTextLoader.*` +- `src/runtime/PlayClock.*`, `GameStateStack.*` +- `src/ecs/MapComponents.hpp`, `LodComponents.hpp` +- `include/caffeine/runtime/NativeModuleAPI.h` +- `src/editor/SceneSerializer.*`, `ComponentRegistry.cpp` +- `docs/scripting/*`, `docs/rendering/overlay-2d-rhi.md`, this file + +--- + +## Support + +Questions or regressions: attach project `native/` layout, script snippets using new APIs, and whether play mode is 2D or 3D (affects `PlayRenderContext`). diff --git a/docs/rendering/overlay-2d-rhi.md b/docs/rendering/overlay-2d-rhi.md new file mode 100644 index 00000000..7a28f0d3 --- /dev/null +++ b/docs/rendering/overlay-2d-rhi.md @@ -0,0 +1,22 @@ +# 2D vector overlays (RHI path) + +Play-mode debug and gameplay lines are batched in `Render::Overlay2D`. + +## ImGui path (editor + current runtime) + +When `CF_HAS_IMGUI` is defined, `Overlay2D::draw(ImDrawList*, ...)` renders after the world and before UI widgets. + +## Shipping / no ImGui + +1. Scripts record primitives via `caffeine.draw2d.*` (same buffer as ImGui). +2. `Overlay2D::buildRhiMesh(camera, screenOrigin, vertices)` tessellates lines and rect outlines into world-space triangles. +3. `Overlay2D::drawRhi(CommandBuffer*, camera, screenOrigin)` is the GPU submission entry point. + +Shader sources live in `src/render/shaders/overlay2d.vert` and `overlay2d.frag`. Register them in the builtin shader list and `ShaderBytecode` when enabling GPU draw on your branch. + +Until the pipeline is registered, tessellation still runs so gameplay logic can be tested; GPU upload is a no-op. + +## Coordinate spaces + +- **world** — values in scene units; transformed with `Camera2D`. +- **screen** — pixel offsets relative to the viewport origin; converted via `screenToWorld` for RHI meshes. diff --git a/docs/scripting/native-modules.md b/docs/scripting/native-modules.md new file mode 100644 index 00000000..87adb7eb --- /dev/null +++ b/docs/scripting/native-modules.md @@ -0,0 +1,51 @@ +# Runtime native modules + +Caffeine can load **game simulation** libraries at play time. This is separate from **Doppio editor plugins** (`PluginAPI.hpp`). + +## Layout + +``` +your-project/ + native/ + my_sim.so # Linux + my_sim.dll # Windows +``` + +Set the project search root via `ScriptEngine::setSearchRoot` (build output / project root). + +## ABI (version 1) + +Header: `include/caffeine/runtime/NativeModuleAPI.h` + +Required export: + +```c +CAFFEINE_NATIVE_EXPORT const CaffeineNativeModuleInfo* caffeine_native_module_info(void); +``` + +Optional exports: + +```c +CAFFEINE_NATIVE_EXPORT void caffeine_native_on_load(void* host_opaque); +CAFFEINE_NATIVE_EXPORT void caffeine_native_on_unload(void* host_opaque); +CAFFEINE_NATIVE_EXPORT int caffeine_native_call(const char* function, const char* args_json, + char* out_buf, uint32_t out_capacity); +``` + +- `caffeine_native_call` returns `0` on success; non-zero on error (message in `out_buf` when possible). +- Arguments and results are UTF-8 JSON strings for portability. + +## Lua + +```lua +caffeine.native.load("my_sim") +local result = caffeine.native.call("my_sim", "step", '{"dt":0.016}') +``` + +## Threading + +Unless documented otherwise, native code runs on the **main thread** with the Lua VM and ECS. Do not call Lua from worker threads without synchronization. + +## CI + +Ship modules for each target platform; the engine does not cross-compile native code. diff --git a/docs/scripting/runtime-apis.md b/docs/scripting/runtime-apis.md index 593e824a..6b4e45de 100644 --- a/docs/scripting/runtime-apis.md +++ b/docs/scripting/runtime-apis.md @@ -1,68 +1,112 @@ -# Lua — APIs de runtime (core) +# Lua runtime APIs (core) > **VM:** `Script::ScriptEngine` (sol2) -> **Sistemas:** `ScriptSystem` (play mode) +> **Systems:** `ScriptSystem` (play mode) -Bindings registados em `ScriptEngine::registerBindings()`. O Doppio não duplica estas APIs — plugins e scripts de jogo usam o mesmo `caffeine` global. +Bindings are registered in `ScriptEngine::init()`. Doppio does not duplicate these APIs — editor plugins and game scripts share the same global `caffeine` table. --- -## Ciclo de vida (`ScriptComponent`) +## Lifecycle (`ScriptComponent`) -| Função | Quando | -|--------|--------| -| `onCreate(entityId)` | Primeiro frame após load | -| `onUpdate(entityId, dt)` | Cada frame em play mode | -| `onDestroy(entityId)` | Entidade destruída | -| `onCollision(entityId, otherId)` | Colisão 2D | +| Function | When | +|----------|------| +| `onCreate(entityId)` | First frame after load | +| `onUpdate(entityId, dt)` | Each play-mode frame (scaled; see `caffeine.time`) | +| `onFixedUpdate(entityId, dt)` | Fixed simulation step (default 60 Hz) | +| `onDestroy(entityId)` | Entity destroyed | +| `onCollision(entityId, otherId)` | 2D physics collision | -`loadScript(path)` resolve caminhos relativos à raiz do projeto (`setSearchRoot`). +`loadScript(path)` resolves paths from the project search root (`setSearchRoot`). +`require("mod.name")` loads `scripts/mod/name.lua`. --- -## Pós-processamento (`caffeine.postprocess`) +## Time (`caffeine.time`) -Documentação completa: [`../rendering/post-processing.md`](../rendering/post-processing.md). +`delta`, `unscaledDelta`, `time`, `timeScale`, `setTimeScale`, `paused`, `setPaused`, `fixedDelta`, `frame`, `seed`, `setSeed`. -```lua -caffeine.postprocess.add(cameraId) -local fx = caffeine.postprocess.get(cameraId) -- tabela aninhada por efeito -caffeine.postprocess.setValue(cameraId, "bloom.intensity", 0.2) -caffeine.postprocess.enableEffect(cameraId, "dof", true) -- aliases: ao, aa, fog, ssr, chromatic -caffeine.postprocess.applyPreset(cameraId, "cinematic") -- cinematic | horror | arcade | reset -local api = caffeine.postprocess.handle(cameraId) -caffeine.postprocess.setCustomScript(cameraId, "scripts/my_stack.lua") -``` +--- -### `customEffectScript` (`PostProcessComponent`) +## Picking (`caffeine.pick`) -Em play mode, `ScriptSystem` carrega o ficheiro com chave `postprocess:` e chama: +| API | Description | +|-----|-------------| +| `world(x, y)` | Entity id at world position (2D AABB) | +| `screen(x, y)` | Entity id from screen pixels | +| `atMouse()` | Entity id under cursor | +| `screenToWorld(x, y)` | `{ x, y }` table | +| `raycast(origin, dir)` | Closest entity id along 3D ray | +| `register(fn)` | Custom picker; `fn(wx, wy)` returns custom id or false | +| `unregister(handle)` | Remove custom picker | +| `query(wx, wy)` | `{ kind = "entity"\|"custom"\|"none", ... }` | -```lua -function onPostProcess(entityId, dt, api) - api.set("bloom.intensity", 0.15) -end -``` +Play mode sets `PlayRenderContext` from the active 2D camera / viewport. -Se não existir `onPostProcess`, usa `onUpdate(entityId, dt)`. +--- + +## 2D drawing (`caffeine.draw2d`) + +Record in `onUpdate` (buffer cleared each frame). Draw order: world → overlays → UI. -Campos disponíveis: `caffeine.postprocess.effects()` e `caffeine.postprocess.fields("bloom")` (ver `PostProcessFields.hpp`). +`line`, `circle`, `rect`, `poly` — color `{r,g,b,a}`, space `"world"` or `"screen"`. + +GPU path without ImGui: `Render::Overlay2D::buildRhiMesh` / `drawRhi` (see [overlay-2d-rhi.md](../rendering/overlay-2d-rhi.md)). --- -## Forward render (`caffeine.forwardrender`) +## Runtime UI (`caffeine.ui`) -Ver [`../rendering/forward-render-features.md`](../rendering/forward-render-features.md). +`setLabel`, `setProgress`, `createCanvas`, `createLabel`, `createButton`, `hitTest`. + +--- + +## Text assets (`caffeine.assets`) + +`loadText(path)` — reads project-relative files with cache. + +--- + +## Game state helpers (`caffeine.gameState`) + +`push(id)`, `pop()`, `top()`, `pause()`, `resume()` — optional, domain-agnostic. + +--- + +## Map surfaces (`caffeine.map`) + +Generic logical map layers (`MapSurface2DComponent`), not tied to real-world geo or HTTP. ```lua -caffeine.forwardrender.ensure(entityId) -caffeine.forwardrender.setReflections(entityId, true, 3) -- 0 off, 1 planar, 2 SSR, 3 probe -caffeine.forwardrender.setVolumetrics(entityId, true, 2) -caffeine.forwardrender.setOcclusion(entityId, true) +caffeine.map.onChunkRequest(function(payload) + -- payload.surfaceEntityId, chunkX, chunkY, worldMinX, worldMinY, chunkSize +end) ``` +Enable `enableChunkRequests` on the component in the editor. The engine emits `mapChunkRequest` when the camera view intersects new chunks. + +--- + +## Native modules (`caffeine.native`) + +Play-mode libraries in `native/*.so` (see [native-modules.md](native-modules.md)). + +`load(name)`, `call(module, function, argsJson?)` → result string or error. + +--- + +## Post-processing (`caffeine.postprocess`) + +See [post-processing.md](../rendering/post-processing.md). + +--- + +## Forward render (`caffeine.forwardrender`) + +See [forward-render-features.md](../rendering/forward-render-features.md). + --- -## Materiais +## Materials -Materiais em runtime passam por `MaterialCache` e componentes de mesh; edição de `.mat` é no editor. Ver [`../rendering/materials-pbr.md`](../rendering/materials-pbr.md). +Runtime materials use `MaterialCache` and mesh components; `.mat` editing is in the editor. See [materials-pbr.md](../rendering/materials-pbr.md). diff --git a/include/caffeine/runtime/NativeModuleAPI.h b/include/caffeine/runtime/NativeModuleAPI.h new file mode 100644 index 00000000..c6d2577a --- /dev/null +++ b/include/caffeine/runtime/NativeModuleAPI.h @@ -0,0 +1,47 @@ +/** + * Caffeine runtime native module ABI (play mode). + * Not used by Doppio editor plugins — see PluginAPI.hpp for IDE extensions. + */ +#ifndef CAFFEINE_RUNTIME_NATIVE_MODULE_API_H +#define CAFFEINE_RUNTIME_NATIVE_MODULE_API_H + +#include + +#ifdef _WIN32 +#define CAFFEINE_NATIVE_EXPORT __declspec(dllexport) +#define CAFFEINE_NATIVE_IMPORT __declspec(dllimport) +#else +#define CAFFEINE_NATIVE_EXPORT __attribute__((visibility("default"))) +#define CAFFEINE_NATIVE_IMPORT +#endif + +#define CAFFEINE_NATIVE_ABI_VERSION 1u + +typedef struct CaffeineNativeModuleInfo { + uint32_t abi_version; + const char* name; + const char* version; +} CaffeineNativeModuleInfo; + +/** + * Required export: returns static module metadata. + * CAFFEINE_NATIVE_EXPORT const CaffeineNativeModuleInfo* caffeine_native_module_info(void); + */ + +/** + * Optional export: dispatch by function name. Arguments and result are UTF-8 JSON strings. + * Return 0 on success, non-zero on error (message in out_buf when provided). + * CAFFEINE_NATIVE_EXPORT int caffeine_native_call(const char* function, const char* args_json, + * char* out_buf, uint32_t out_capacity); + */ + +typedef void (*CaffeineNativeOnLoadFn)(void* host_opaque); +typedef void (*CaffeineNativeOnUnloadFn)(void* host_opaque); + +/** + * Optional lifecycle exports: + * CAFFEINE_NATIVE_EXPORT void caffeine_native_on_load(void* host_opaque); + * CAFFEINE_NATIVE_EXPORT void caffeine_native_on_unload(void* host_opaque); + */ + +#endif /* CAFFEINE_RUNTIME_NATIVE_MODULE_API_H */ diff --git a/planning/engine-runtime-capabilities-rfc.md b/planning/engine-runtime-capabilities-rfc.md new file mode 100644 index 00000000..0394009e --- /dev/null +++ b/planning/engine-runtime-capabilities-rfc.md @@ -0,0 +1,168 @@ +# Capacidades de runtime (RFC) — lacunas genéricas + +> **Status:** Aprovado (direção) — implementação por fases +> **Âmbito:** Caffeine runtime + core (Doppio fora de scope) +> **Origem:** feedback de migração de jogo 2D complexo; refinado com princípio **engine neutra** + +--- + +## Princípios (obrigatórios em todas as entregas) + +1. **Opcional e modular** — cada capacidade pode ser ignorada por projetos que não precisam; sem “taxa” obrigatória em startup ou em APIs core. +2. **Sem viés de produto** — nada nomeado ou desenhado para um título, provedor de mapas, ou género; extensões via componentes, serviços e Lua, não hardcode de domínio. +3. **Integração seamless** — reutilizar ECS, `UISystem`, input, render RHI, assets e docs existentes; evitar segundo pipeline paralelo (ex.: UI só ImGui no shipping sem caminho RHI). +4. **Editor vs runtime** — extrair do Doppio apenas o que for reutilizável; contratos documentados em `docs/scripting/runtime-apis.md`. +5. **Runtime native ≠ editor plugin** — `PluginAPI` / `.so` do IDE permanece separado de módulos nativos carregados em play mode. + +--- + +## Estado atual (referência rápida) + +| Área | Já existe | Falta | +|------|-----------|--------| +| UI retained | `UISystem`, componentes, `hitTest`, runtime desenha widgets | Lua/HUD pipeline, contrato play-mode, render fora de ImGui (meta longo prazo) | +| Picking | Editor (`pickEntity2D`, raycast), UI `hitTest`, colisão 2D | Serviço unificado runtime + Lua | +| Spatial | `Octree` 3D | Serviço 2D opcional, LOD 2D política genérica | +| Scripting | `loadScript`, search roots | `require`, `AssetText`, `fixedUpdate` / tempo | +| Mapas | Terrain 3D, tilemap editor (grelha) | Componente mapa **genérico** (ver §2) | +| Overlays 2D | Debug/gizmos editor | Batch vectorial play mode + API Lua | +| Native play | — | `dlopen` + contrato C + bridge Lua (P2) | +| Game loop helpers | `onUpdate` | Scene stack / `timeScale` fino (opcional) | + +--- + +## 1. Módulos nativos no runtime + +**Decisão:** Aprovar como **P2**. + +- Carregar bibliotecas do projeto (`native/` ou path no `project.caffeine`) com ciclo de vida ligado ao play mode. +- Contrato C estável documentado; ponte Lua genérica (`caffeine.native.call` ou equivalente), sem namespaces por jogo. +- Documentar threading (main thread vs worker) e ABI/CI desde o início. + +**Não fazer:** misturar com plugins do Doppio. + +**Pastas sugeridas:** `src/script/` (bridge), `docs/scripting/native-modules.md`. + +--- + +## 2. Mapas 2D — componente genérico (não mapa “da vida real”) + +**Decisão:** **Não** implementar MapView Mercator, HTTP tiles, OSM, ou pipeline georreferenciado fixo — isso está **fora de scope** da engine e enviesa terceiros. + +**Em vez disso:** + +- Componente e/ou serviço **genérico** (ex. `MapLayer`, `TiledSurface2D`) para organizar **camadas de conteúdo 2D em espaço mundo** com: + - bounds / região lógica (coordenadas definidas pelo projeto, não WGS84 obrigatório); + - hooks para **carregamento assíncrono de chunks** (callback C++/Lua: “preciso desta região” → utilizador devolve textura/mesh/dados); + - integração opcional com **LOD** e **spatial queries** (§6) quando o projeto quiser escala. +- Zoom/pan como **comportamento de câmara 2D** ou helper no componente, sem assumir projeção específica. +- Qualquer HTTP, lat/lon, ou raster mundial fica **100% no jogo/plugin do utilizador**, usando os hooks acima. + +**Beneficia:** estratégia, overworld, dashboards — cada um com o seu sistema de coordenadas e fonte de dados. + +**Prioridade:** **P1** (depois de overlays + picking + contrato UI), não bloqueante para P0. + +**Pastas sugeridas:** `src/map/` (leve, sem deps de rede), ou extensão ECS em `src/ecs/components/`. + +--- + +## 3. Overlays vectoriais 2D em play mode + +**Decisão:** Aprovar — **P0**. + +- Camada `Overlay2D` (batch) no forward 2D: linhas, arcos, círculos, polígonos, trails; cor/alpha; espaço world ou screen. +- API Lua: `caffeine.draw2d.*` (nomes finais na doc). +- Ordem de desenho documentada relativamente a sprites e UI. +- Implementar sobre **RHI/render 2D**, não depender de ImGui `ImDrawList` no runtime de produção (ImGui pode permanecer no editor/preview). + +**Pastas:** `src/render/Overlay2D.*`, bindings em `src/script/`. + +--- + +## 4. UI de runtime (retained mode) + +**Decisão:** Aprovar — **P0**, com reserva: **evoluir o que existe**, não reescrever. + +- Base: `UISystem`, `UIComponents`, `UIRenderer::drawWidgets`, testes em `tests/test_ui.cpp`. +- Entregar: contrato play-mode, exposição Lua (criar/ligar widgets ou consumir HUD serializado do Doppio), input routing e foco. +- Documentar relação `HudEditorPanel` → runtime. + +**Pastas:** `src/ui/`, `docs/scripting/runtime-apis.md`. + +--- + +## 5. Picking em coordenadas de mundo + +**Decisão:** Aprovar — **P0** (junto com §3). + +- Serviço `PickQuery`: screen → world → candidatos (entidades, layers registados, callbacks Lua). +- Refatorar lógica útil do editor (`SceneViewport`) para core reutilizável; runtime não depende do viewport do Doppio. +- Colisão ECS permanece caminho opcional, não o único. + +**Pastas:** `src/scene/PickQuery.hpp` ou `src/input/`. + +--- + +## 6. Escala: marcadores, LOD, culling + +**Decisão:** Aprovar — **P2** (ativar quando projetos precisarem). + +- Política de LOD por distância/zoom **genérica** (sprites / instancing 2D). +- Índice espacial 2D opcional (grid/quadtree) como **serviço**, utilizável por render, picking e §2. +- Reutilizar ideias de `Octree` onde fizer sentido; não forçar 3D em jogos 2D. +- Budgets documentados (orientação, não limites rígidos no core). + +**Pastas:** `src/spatial/`, ligação opcional em `src/map/` e render. + +--- + +## 7. Scripting: módulos Lua e dados tabulares + +**Decisão:** Aprovar — **P1**. + +- `package.path` alinhado a `project.caffeine` → `scripts/` (comportamento `require` previsível). +- `AssetText.load` (ou equivalente) para JSON/CSV/texto em `assets/`, cache e hot-reload opcional no editor. +- Não duplicar APIs de asset já existentes; consolidar na doc. + +**Pastas:** `src/script/`, `docs/scripting/`. + +--- + +## 8. Loop de jogo: estados, tempo e determinismo + +**Decisão:** Aprovar — **opcional fino**, **P1–P2**. + +- Helpers `GameState` / scene stack (push/pop/pause), independentes de domínio. +- Relógio pausável, `timeScale`; `fixedUpdate(dt)` alinhado ao passo de física quando existir timestep fixo. +- Hook de seed/replay para testes — sem impor arquitetura de jogo completa. + +**Pastas:** `src/core/` ou `src/runtime/`, doc em `runtime-apis.md`. + +--- + +## Priorização de implementação (engine) + +| Ordem | Entrega | Notas | +|-------|---------|--------| +| 1 | §5 Picking + §3 Overlay2D | Mesmo espaço de coordenadas; desbloqueia interação em mapas custom | +| 2 | §4 Contrato UI play + Lua/HUD | Sobre `UISystem` existente | +| 3 | §7 `require` + AssetText | Higiene projetos médios | +| 4 | §2 Componente mapa genérico | Hooks async/LOD; **sem** HTTP/Mercator na engine | +| 5 | §8 Game state / tempo | Fino, opt-in | +| 6 | §6 Spatial/LOD + §1 Native | Quando escala ou sim fora da VM exigir | + +--- + +## Critérios de aceitação transversais + +- [x] Projeto mínimo (sprite + script) não linka nem inicializa módulos não usados. +- [x] APIs novas aparecem em `docs/scripting/runtime-apis.md` com exemplos neutros. +- [x] Testes unitários onde há lógica pura (`hitTest`, pick, layout, require paths). +- [x] Nenhum provedor externo, URL template, ou tipo de coordenada geográfica hardcoded no core. + +--- + +## Changelog do RFC + +- **2025-10-14:** Consolidação pós-revisão — §2 redefinido (mapa genérico, liberdade do utilizador); §1–8 aprovados com princípios de neutralidade e modularidade. +- **2026-10-14:** Phase 1 + Phase 2 implemented. Public patch notes (English): [docs/releases/runtime-capabilities-patch-notes.md](../docs/releases/runtime-capabilities-patch-notes.md). diff --git a/src/ecs/LodComponents.hpp b/src/ecs/LodComponents.hpp new file mode 100644 index 00000000..66e78b99 --- /dev/null +++ b/src/ecs/LodComponents.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec2.hpp" + +namespace Caffeine::ECS { + +/// Optional 2D LOD driven by active camera zoom (see SpriteLod2DSystem). +struct SpriteLod2DComponent { + Vec2 baseScale{1.0f, 1.0f}; + /// Camera zoom at or above this keeps full baseScale. + f32 zoomFullDetail = 1.0f; + /// At or below this zoom, scale is multiplied by minimalScaleFactor. + f32 zoomMinimal = 0.25f; + f32 minimalScaleFactor = 0.35f; + bool hideWhenMinimal = false; +}; + +} // namespace Caffeine::ECS diff --git a/src/ecs/MapComponents.hpp b/src/ecs/MapComponents.hpp new file mode 100644 index 00000000..18215f41 --- /dev/null +++ b/src/ecs/MapComponents.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec2.hpp" + +namespace Caffeine::ECS { + +/// Generic 2D map surface: logical bounds and chunk grid (no geo/HTTP baked in). +struct MapSurface2DComponent { + Vec2 regionMin{0.0f, 0.0f}; + Vec2 regionMax{100.0f, 100.0f}; + f32 chunkSize = 32.0f; + /// When set, scripts may listen for chunk requests via events. + bool enableChunkRequests = false; +}; + +} // namespace Caffeine::ECS diff --git a/src/editor/ComponentRegistry.cpp b/src/editor/ComponentRegistry.cpp index aae98bf8..8b7bb177 100644 --- a/src/editor/ComponentRegistry.cpp +++ b/src/editor/ComponentRegistry.cpp @@ -5,6 +5,8 @@ #include "ecs/MeshComponents.hpp" #include "ecs/PrefabComponents.hpp" #include "ecs/CameraComponents.hpp" +#include "ecs/MapComponents.hpp" +#include "ecs/LodComponents.hpp" #include "ecs/LightComponents.hpp" #include "ecs/TerrainComponents.hpp" #include "ecs/ProceduralComponents.hpp" @@ -243,6 +245,26 @@ void registerAllComponents(ComponentRegistry& reg) { w.add(e, active); } }); + reg.registerComponent({ + "World", "Map Surface 2D", + [](ECS::World& w, ECS::Entity e) { return w.has(e); }, + [](ECS::World& w, ECS::Entity e) { w.add(e); }, + "map", + "chunk surface bounds" + }); + reg.registerComponent({ + "Rendering", "Sprite LOD 2D", + [](ECS::World& w, ECS::Entity e) { return w.has(e); }, + [](ECS::World& w, ECS::Entity e) { + ECS::SpriteLod2DComponent lod; + if (auto* t = w.get(e)) { + lod.baseScale = {t->scale.x, t->scale.y}; + } + w.add(e, lod); + }, + "lod", + "zoom based sprite scale" + }); reg.registerComponent({ "Camera", "Camera2D", [](ECS::World& w, ECS::Entity e){ return w.has(e); }, diff --git a/src/editor/SceneEditor.cpp b/src/editor/SceneEditor.cpp index d56dd421..0b91037e 100644 --- a/src/editor/SceneEditor.cpp +++ b/src/editor/SceneEditor.cpp @@ -212,6 +212,7 @@ bool SceneEditor::init(RHI::RenderDevice* device, Assets::AssetManager* assetMan scriptParams.world = nullptr; scriptParams.events = &m_eventBus; scriptParams.input = &m_input; + scriptParams.ui = &m_uiSystem; if (!m_scriptEngineReady) { m_scriptEngineReady = m_scriptEngine.init(scriptParams); } @@ -219,7 +220,7 @@ bool SceneEditor::init(RHI::RenderDevice* device, Assets::AssetManager* assetMan m_scriptEngine.setSearchRoot(m_currentProjectConfig.RootPath.string()); m_scriptEditor.setScriptEngine(&m_scriptEngine); if (m_scriptEngineReady) { - m_scriptSystem = Script::ScriptSystem(&m_scriptEngine); + m_scriptSystem = Script::ScriptSystem(&m_scriptEngine, &m_eventBus); } #endif @@ -422,9 +423,10 @@ void SceneEditor::enterPlayMode(ECS::World& world) { p.world = &world; p.events = &m_eventBus; p.input = &m_input; + p.ui = &m_uiSystem; m_scriptEngineReady = m_scriptEngine.init(p); } - m_scriptSystem = Script::ScriptSystem(&m_scriptEngine); + m_scriptSystem = Script::ScriptSystem(&m_scriptEngine, &m_eventBus); m_scriptSystem.resetPlayState(); Procedural::ProceduralWorldSystem::reset(); ECS::ComponentQuery cppQ; diff --git a/src/editor/SceneSerializer.cpp b/src/editor/SceneSerializer.cpp index 8fbc24dd..d950bf0a 100644 --- a/src/editor/SceneSerializer.cpp +++ b/src/editor/SceneSerializer.cpp @@ -15,6 +15,8 @@ #include "navigation/NavVolume.hpp" #include "ecs/PostProcessComponents.hpp" #include "ecs/EnvironmentEffectsComponents.hpp" +#include "ecs/MapComponents.hpp" +#include "ecs/LodComponents.hpp" #include "physics/PhysicsComponents2D.hpp" #include "physics/PhysicsComponents3D.hpp" #include "script/ScriptTypes.hpp" @@ -1209,6 +1211,8 @@ bool SceneSerializer::serializeToMemory(std::vector& out, const std::string& emitPodComponents(kTypeSpriteSheet, entityMap); emitPodComponents(kTypeEffect, entityMap); emitPodComponents(kTypeEnvironmentEffects, entityMap); + emitPodComponents(kTypeMapSurface2D, entityMap); + emitPodComponents(kTypeSpriteLod2D, entityMap); { ECS::ComponentQuery query; query.with(); @@ -1693,6 +1697,14 @@ bool SceneSerializer::deserializeFromMemory(const std::vector& buffer, const if (n > 0) std::memcpy(&fx, entry.data.data(), n); break; } + case kTypeMapSurface2D: + applyPODComponent( + e, entry.data.data(), static_cast(entry.data.size()), m_world); + break; + case kTypeSpriteLod2D: + applyPODComponent( + e, entry.data.data(), static_cast(entry.data.size()), m_world); + break; case kTypeNavVolume: { if (entry.data.size() < 24) break; Navigation::NavVolume volume; diff --git a/src/editor/SceneSerializer.hpp b/src/editor/SceneSerializer.hpp index ff784505..d60ee818 100644 --- a/src/editor/SceneSerializer.hpp +++ b/src/editor/SceneSerializer.hpp @@ -76,7 +76,9 @@ class SceneSerializer { static constexpr u32 kTypeEffect = 52; static constexpr u32 kTypeMeshGeometry = 53; static constexpr u32 kTypeEnvironmentEffects = 54; - static constexpr u32 kTypeCount = 55; + static constexpr u32 kTypeMapSurface2D = 55; + static constexpr u32 kTypeSpriteLod2D = 56; + static constexpr u32 kTypeCount = 57; static constexpr u32 kPoseCurveMarker = 0x56525543u; static constexpr u32 kPoseStripMarker = 0x50525453u; static constexpr u32 kAnimatorEditorMarker = 0x524F5441u; diff --git a/src/editor/SceneViewport.cpp b/src/editor/SceneViewport.cpp index 6037135e..0fbe1c79 100644 --- a/src/editor/SceneViewport.cpp +++ b/src/editor/SceneViewport.cpp @@ -43,6 +43,10 @@ #include "editor/EditorPaths.hpp" #include "editor/EditorPanelUtils.hpp" #include "ui/UIRenderer.hpp" +#include "render/Overlay2D.hpp" +#include "scene/Camera2DPlay.hpp" +#include "scene/PickQuery.hpp" +#include "scene/PlayMode2D.hpp" #include "spatial/Octree.hpp" #include #include @@ -1638,6 +1642,15 @@ void SceneViewport::render(ECS::World& world, EditorContext& ctx) { } if (ctx.isPlayMode) { + Render::Rect2D vp{{origin.x, origin.y}, {viewportSize.x, viewportSize.y}}; + Render::Camera2D cam = + (ctx.viewMode == EditorContext::ViewMode::Mode2D) + ? Scene::buildCamera2DFromEditorViewport(ctx, vp) + : Render::Camera2D(); + if (ctx.viewMode == EditorContext::ViewMode::Mode2D) { + Scene::PlayRenderContext::instance().set2D(vp, cam); + } + Render::Overlay2D::draw(drawList, cam, origin, viewportSize); UI::drawWidgets(world, drawList, origin, viewportSize); } @@ -3436,235 +3449,17 @@ void SceneViewport::drawNavigationWidget(ECS::World& world, EditorContext& ctx, f32 SceneViewport::rayIntersectsAABB(const Vec3& rayOrigin, const Vec3& rayDir, const Vec3& aabbMin, const Vec3& aabbMax) { - f32 t_enter = 0.0f; - f32 t_exit = 1e10f; - - // Test X slab - if (std::abs(rayDir.x) > 1e-6f) { - f32 t0 = (aabbMin.x - rayOrigin.x) / rayDir.x; - f32 t1 = (aabbMax.x - rayOrigin.x) / rayDir.x; - if (t0 > t1) std::swap(t0, t1); - t_enter = std::max(t_enter, t0); - t_exit = std::min(t_exit, t1); - } else { - if (rayOrigin.x < aabbMin.x || rayOrigin.x > aabbMax.x) { - return -1.0f; - } - } - - // Test Y slab - if (std::abs(rayDir.y) > 1e-6f) { - f32 t0 = (aabbMin.y - rayOrigin.y) / rayDir.y; - f32 t1 = (aabbMax.y - rayOrigin.y) / rayDir.y; - if (t0 > t1) std::swap(t0, t1); - t_enter = std::max(t_enter, t0); - t_exit = std::min(t_exit, t1); - } else { - if (rayOrigin.y < aabbMin.y || rayOrigin.y > aabbMax.y) { - return -1.0f; - } - } - - // Test Z slab - if (std::abs(rayDir.z) > 1e-6f) { - f32 t0 = (aabbMin.z - rayOrigin.z) / rayDir.z; - f32 t1 = (aabbMax.z - rayOrigin.z) / rayDir.z; - if (t0 > t1) std::swap(t0, t1); - t_enter = std::max(t_enter, t0); - t_exit = std::min(t_exit, t1); - } else { - if (rayOrigin.z < aabbMin.z || rayOrigin.z > aabbMax.z) { - return -1.0f; - } - } - - if (t_enter <= t_exit && t_exit >= 0.0f) { - return t_enter >= 0.0f ? t_enter : 0.0f; - } - - return -1.0f; + return Scene::rayIntersectsAABB(rayOrigin, rayDir, aabbMin, aabbMax); } ECS::Entity SceneViewport::pickEntity2D(const Vec2& worldPos, ECS::World& world) const { - ECS::Entity best = ECS::Entity::INVALID; - f32 bestDistSq = 1e10f; - - ECS::ComponentQuery query; - query.with(); - - world.forEach(query, [&](ECS::Entity entity, ECS::Transform& pos) { - if (Scene::isEffectivelyDisabled(world, entity)) return; - - Vec3 worldPosition = pos.position; - f32 scaleX = std::max(0.1f, pos.scale.x); - f32 scaleY = std::max(0.1f, pos.scale.y); - - if (auto* wt = world.get(entity)) { - worldPosition = Vec3(wt->matrix(0, 3), wt->matrix(1, 3), wt->matrix(2, 3)); - scaleX = std::max(0.1f, sqrtf(wt->matrix(0, 0) * wt->matrix(0, 0) + - wt->matrix(1, 0) * wt->matrix(1, 0))); - scaleY = std::max(0.1f, sqrtf(wt->matrix(0, 1) * wt->matrix(0, 1) + - wt->matrix(1, 1) * wt->matrix(1, 1))); - } - - f32 halfW = std::max(0.25f, 0.5f * scaleX); - f32 halfH = std::max(0.25f, 0.5f * scaleY); - if (world.has(entity)) { - halfW = std::max(0.5f, halfW); - halfH = std::max(0.5f, halfH); - } - - if (worldPos.x < worldPosition.x - halfW || worldPos.x > worldPosition.x + halfW || - worldPos.y < worldPosition.y - halfH || worldPos.y > worldPosition.y + halfH) { - return; - } - - const f32 dx = worldPos.x - worldPosition.x; - const f32 dy = worldPos.y - worldPosition.y; - const f32 distSq = dx * dx + dy * dy; - if (distSq < bestDistSq) { - bestDistSq = distSq; - best = entity; - } - }); - - return best; + return Scene::pickEntityAtWorld(world, worldPos); } ECS::Entity SceneViewport::raycastSelectEntity(const Vec3& rayOrigin, const Vec3& rayDir, ECS::World& world, const std::string& projectRoot) { - ECS::Entity closestEntity = ECS::Entity::INVALID; - f32 closestT = 1e10f; - - auto accept = [&](ECS::Entity entity, f32 t) { - if (t >= 0.0f && t < closestT) { - closestT = t; - closestEntity = entity; - } - }; - - auto padThin = [](Vec3& mn, Vec3& mx) { - const f32 pad = 0.05f; - if (mx.x - mn.x < pad) { const f32 c = (mn.x + mx.x) * 0.5f; mn.x = c - pad; mx.x = c + pad; } - if (mx.y - mn.y < pad) { const f32 c = (mn.y + mx.y) * 0.5f; mn.y = c - pad; mx.y = c + pad; } - if (mx.z - mn.z < pad) { const f32 c = (mn.z + mx.z) * 0.5f; mn.z = c - pad; mx.z = c + pad; } - }; - - auto testWorldAabb = [&](ECS::Entity entity, Vec3 mn, Vec3 mx) { - padThin(mn, mx); - accept(entity, rayIntersectsAABB(rayOrigin, rayDir, mn, mx)); - }; - - auto testLocalAabb = [&](ECS::Entity entity, const Mat4& worldMatrix, Vec3 localMin, Vec3 localMax) { - Vec3 mn(1e30f, 1e30f, 1e30f); - Vec3 mx(-1e30f, -1e30f, -1e30f); - const Vec3 corners[2] = {localMin, localMax}; - for (int ix = 0; ix < 2; ++ix) { - for (int iy = 0; iy < 2; ++iy) { - for (int iz = 0; iz < 2; ++iz) { - const Vec3 p = worldMatrix.transformPoint(Vec3(corners[ix].x, corners[iy].y, corners[iz].z)); - mn.x = std::min(mn.x, p.x); mn.y = std::min(mn.y, p.y); mn.z = std::min(mn.z, p.z); - mx.x = std::max(mx.x, p.x); mx.y = std::max(mx.y, p.y); mx.z = std::max(mx.z, p.z); - } - } - } - testWorldAabb(entity, mn, mx); - }; - - auto testPoint = [&](ECS::Entity entity, const Vec3& point) { - const f32 t = (point - rayOrigin).dot(rayDir); - if (t < 0.0f) return; - const f32 dist = ((rayOrigin + rayDir * t) - point).length(); - const f32 reach = std::max(0.25f, t * 0.03f); - if (dist <= reach) accept(entity, t); - }; - - ECS::ComponentQuery meshes; - meshes.with(); - world.forEach(meshes, [&](ECS::Entity entity, ECS::MeshFilterComponent& filter) { - if (Scene::isEffectivelyDisabled(world, entity)) return; - const Mat4 worldMatrix = entityMatrix(world, entity); - if (const ECS::TerrainComponent* terrain = world.get(entity)) { - if (const Terrain::TerrainHeightmap* heightmap = Terrain::TerrainCache::instance().heightmapFor(entity); - heightmap && !heightmap->empty()) { - Vec3 hit; - if (Terrain::TerrainSculptor::raycast(worldMatrix, *heightmap, *terrain, rayOrigin, rayDir, hit)) { - accept(entity, (hit - rayOrigin).dot(rayDir)); - } - return; - } - const f32 halfX = terrain->worldSizeX * 0.5f; - const f32 halfZ = terrain->worldSizeZ * 0.5f; - testLocalAabb(entity, worldMatrix, Vec3(-halfX, -0.25f, -halfZ), Vec3(halfX, 1.0f, halfZ)); - return; - } - - Assets::Mesh3D* mesh = ECS::editedMesh(world, entity); - if (!mesh && filter.primitive == ECS::MeshPrimitive::Custom) { - if (!filter.customMeshPath.empty()) { - mesh = Assets::MeshCache::getInstance().getMesh(filter.customMeshPath, projectRoot); - } - } else if (!mesh) { - mesh = Render::GpuProceduralMeshes::get(filter.primitive); - } - if (mesh && (mesh->bounds.max - mesh->bounds.min).lengthSquared() > 1.0e-6f) { - testLocalAabb(entity, worldMatrix, mesh->bounds.min, mesh->bounds.max); - } else { - testLocalAabb(entity, worldMatrix, Vec3(-0.5f, -0.5f, -0.5f), Vec3(0.5f, 0.5f, 0.5f)); - } - }); - - auto testMarker = [&](ECS::Entity entity) { - if (Scene::isEffectivelyDisabled(world, entity)) return; - if (world.has(entity)) return; - Vec3 point; - if (!tryGetEntityPosition(world, entity, point)) return; - if (const Effects::EffectComponent* effect = world.get(entity)) { - const auto kind = static_cast(effect->kind); - if (kind == Effects::EffectKind::VolumetricLight || kind == Effects::EffectKind::Fog) { - const f32 radius = std::max(effect->radius, 0.25f); - if (kind == Effects::EffectKind::VolumetricLight && - Effects::volumetricShapeOf(*effect) != Effects::VolumetricShape::Sphere) { - const Mat4 matrix = entityMatrix(world, entity); - Vec3 forward = matrix.transformVector(Vec3(0.0f, 0.0f, -1.0f)); - if (forward.lengthSquared() < 1.0e-8f) forward = Vec3(0.0f, 0.0f, -1.0f); - else forward = forward.normalized(); - const Vec3 end = point + forward * radius; - const f32 pad = std::max(effect->startSize, effect->endSize) * 0.5f; - const Vec3 padVec(pad, pad, pad); - testWorldAabb(entity, Vec3(std::min(point.x, end.x), std::min(point.y, end.y), std::min(point.z, end.z)) - padVec, - Vec3(std::max(point.x, end.x), std::max(point.y, end.y), std::max(point.z, end.z)) + padVec); - } else { - testWorldAabb(entity, point - Vec3(radius, radius, radius), point + Vec3(radius, radius, radius)); - } - return; - } - } - if (const ECS::Transform* transform = world.get(entity)) { - if (world.has(entity)) { - const f32 halfW = std::max(0.5f, std::abs(transform->scale.x) * 0.5f); - const f32 halfH = std::max(0.5f, std::abs(transform->scale.y) * 0.5f); - testWorldAabb(entity, point - Vec3(halfW, halfH, 0.05f), point + Vec3(halfW, halfH, 0.05f)); - return; - } - } - testPoint(entity, point); - }; - - ECS::ComponentQuery positioned; - positioned.with(); - world.forEach(positioned, [&](ECS::Entity entity, ECS::Position3D&) { - testMarker(entity); - }); - ECS::ComponentQuery transforms; - transforms.with(); - transforms.without(); - world.forEach(transforms, [&](ECS::Entity entity, ECS::Transform&) { - testMarker(entity); - }); - - return closestEntity; + return Scene::raycastSelectEntity(rayOrigin, rayDir, world, projectRoot); } void SceneViewport::handleGizmoInput(ECS::World& world, EditorContext& ctx, ImVec2 viewportSize) { diff --git a/src/events/Events.hpp b/src/events/Events.hpp index b2dc13b2..3795ef44 100644 --- a/src/events/Events.hpp +++ b/src/events/Events.hpp @@ -65,4 +65,14 @@ struct OnActionReleased { u32 playerId; }; +/// Fired when a MapSurface2DComponent needs content for a logical chunk (game supplies data). +struct OnMapSurfaceChunkRequest { + u32 surfaceEntityId = 0; + i32 chunkX = 0; + i32 chunkY = 0; + f32 worldMinX = 0.0f; + f32 worldMinY = 0.0f; + f32 chunkSize = 0.0f; +}; + } // namespace Caffeine::Events diff --git a/src/render/Overlay2D.cpp b/src/render/Overlay2D.cpp new file mode 100644 index 00000000..80991e42 --- /dev/null +++ b/src/render/Overlay2D.cpp @@ -0,0 +1,212 @@ +#include "render/Overlay2D.hpp" + +#include +#include + +#if defined(CF_HAS_SDL3) && !defined(CF_HEADLESS) +#include "rhi/CommandBuffer.hpp" +#endif + +#ifdef CF_HAS_IMGUI +#include +#endif + +namespace Caffeine::Render { + +namespace { + +Vec2 toScreen(const Camera2D& camera, ImVec2 origin, OverlaySpace space, Vec2 p) { + if (space == OverlaySpace::Screen) { + return {origin.x + p.x, origin.y + p.y}; + } + return camera.worldToScreen(p); +} + +f32 worldRadiusToScreen(const Camera2D& camera, Vec2 worldCenter, f32 worldRadius) { + const Vec2 a = camera.worldToScreen(worldCenter); + const Vec2 b = camera.worldToScreen(worldCenter + Vec2(worldRadius, 0.0f)); + const f32 dx = b.x - a.x; + const f32 dy = b.y - a.y; + return std::sqrt(dx * dx + dy * dy); +} + +} // namespace + +std::vector& Overlay2D::lines() { + static std::vector s; + return s; +} + +std::vector& Overlay2D::circles() { + static std::vector s; + return s; +} + +std::vector& Overlay2D::polys() { + static std::vector s; + return s; +} + +std::vector& Overlay2D::rects() { + static std::vector s; + return s; +} + +void Overlay2D::beginFrame() { + lines().clear(); + circles().clear(); + polys().clear(); + rects().clear(); +} + +void Overlay2D::line(Vec2 a, Vec2 b, OverlayColor color, f32 thickness, OverlaySpace space) { + lines().push_back({a, b, color, thickness, space}); +} + +void Overlay2D::circle(Vec2 center, f32 radius, OverlayColor color, f32 thickness, int segments, + OverlaySpace space) { + circles().push_back({center, radius, color, thickness, segments, false, space}); +} + +void Overlay2D::circleFilled(Vec2 center, f32 radius, OverlayColor color, int segments, + OverlaySpace space) { + circles().push_back({center, radius, color, 0.0f, segments, true, space}); +} + +void Overlay2D::rect(Vec2 min, Vec2 max, OverlayColor color, f32 thickness, OverlaySpace space) { + rects().push_back({min, max, color, thickness, space}); +} + +void Overlay2D::polyline(const Vec2* points, u32 count, OverlayColor color, f32 thickness, + bool closed, OverlaySpace space) { + if (!points || count < 2) return; + CmdPoly cmd; + cmd.points.assign(points, points + count); + cmd.color = color; + cmd.thickness = thickness; + cmd.closed = closed; + cmd.space = space; + polys().push_back(std::move(cmd)); +} + +#ifdef CF_HAS_IMGUI + +void Overlay2D::draw(ImDrawList* dl, const Camera2D& camera, ImVec2 screenOrigin, + ImVec2 panelSize) { + if (!dl) return; + (void)panelSize; + + for (const auto& r : rects()) { + Vec2 a = toScreen(camera, screenOrigin, r.space, r.min); + Vec2 b = toScreen(camera, screenOrigin, r.space, r.max); + const u32 col = IM_COL32(r.color.r, r.color.g, r.color.b, r.color.a); + dl->AddRect(ImVec2(a.x, a.y), ImVec2(b.x, b.y), col, 0.0f, 0, r.thickness); + } + + for (const auto& ln : lines()) { + Vec2 a = toScreen(camera, screenOrigin, ln.space, ln.a); + Vec2 b = toScreen(camera, screenOrigin, ln.space, ln.b); + const u32 col = IM_COL32(ln.color.r, ln.color.g, ln.color.b, ln.color.a); + dl->AddLine(ImVec2(a.x, a.y), ImVec2(b.x, b.y), col, ln.thickness); + } + + for (const auto& c : circles()) { + const Vec2 center = toScreen(camera, screenOrigin, c.space, c.center); + const f32 drawR = + (c.space == OverlaySpace::Screen) + ? c.radius + : std::max(1.0f, worldRadiusToScreen(camera, c.center, c.radius)); + const u32 col = IM_COL32(c.color.r, c.color.g, c.color.b, c.color.a); + if (c.filled) { + dl->AddCircleFilled(ImVec2(center.x, center.y), drawR, col, c.segments); + } else { + dl->AddCircle(ImVec2(center.x, center.y), drawR, col, c.segments, c.thickness); + } + } + + for (const auto& p : polys()) { + if (p.points.size() < 2) continue; + std::vector imPts; + imPts.reserve(p.points.size()); + for (const Vec2& pt : p.points) { + Vec2 sc = toScreen(camera, screenOrigin, p.space, pt); + imPts.emplace_back(sc.x, sc.y); + } + const u32 col = IM_COL32(p.color.r, p.color.g, p.color.b, p.color.a); + dl->AddPolyline(imPts.data(), static_cast(imPts.size()), col, + p.closed ? ImDrawFlags_Closed : 0, p.thickness); + } +} + +#endif + +namespace { + +void appendLineQuad(std::vector& out, Vec2 a, Vec2 b, const OverlayColor& c, + f32 thickness) { + const f32 dx = b.x - a.x; + const f32 dy = b.y - a.y; + const f32 len = std::sqrt(dx * dx + dy * dy); + if (len < 1.0e-5f) return; + const f32 nx = -dy / len * thickness * 0.5f; + const f32 ny = dx / len * thickness * 0.5f; + const f32 cr = c.r / 255.0f; + const f32 cg = c.g / 255.0f; + const f32 cb = c.b / 255.0f; + const f32 ca = c.a / 255.0f; + const Overlay2D::RhiVertex v0{a.x + nx, a.y + ny, cr, cg, cb, ca}; + const Overlay2D::RhiVertex v1{a.x - nx, a.y - ny, cr, cg, cb, ca}; + const Overlay2D::RhiVertex v2{b.x + nx, b.y + ny, cr, cg, cb, ca}; + const Overlay2D::RhiVertex v3{b.x - nx, b.y - ny, cr, cg, cb, ca}; + out.push_back(v0); + out.push_back(v1); + out.push_back(v2); + out.push_back(v2); + out.push_back(v1); + out.push_back(v3); +} + +Vec2 overlayWorldPos(const Camera2D& camera, Vec2 screenOrigin, OverlaySpace space, Vec2 p) { + if (space == OverlaySpace::Screen) { + return camera.screenToWorld(p + screenOrigin); + } + return p; +} + +} // namespace + +void Overlay2D::buildRhiMesh(const Camera2D& camera, Vec2 screenOrigin, std::vector& out) { + out.clear(); + for (const auto& ln : lines()) { + const Vec2 a = overlayWorldPos(camera, screenOrigin, ln.space, ln.a); + const Vec2 b = overlayWorldPos(camera, screenOrigin, ln.space, ln.b); + const f32 thicknessWorld = + (ln.space == OverlaySpace::Screen) ? ln.thickness / std::max(camera.zoom(), 0.001f) + : ln.thickness; + appendLineQuad(out, a, b, ln.color, thicknessWorld); + } + for (const auto& r : rects()) { + const Vec2 a = overlayWorldPos(camera, screenOrigin, r.space, r.min); + const Vec2 b = overlayWorldPos(camera, screenOrigin, r.space, r.max); + appendLineQuad(out, a, {b.x, a.y}, r.color, r.thickness); + appendLineQuad(out, {b.x, a.y}, b, r.color, r.thickness); + appendLineQuad(out, b, {a.x, b.y}, r.color, r.thickness); + appendLineQuad(out, {a.x, b.y}, a, r.color, r.thickness); + } +} + +#if defined(CF_HAS_SDL3) && !defined(CF_HEADLESS) + +void Overlay2D::drawRhi(RHI::CommandBuffer* cmd, const Camera2D& camera, Vec2 screenOrigin) { + if (!cmd || !cmd->isInRenderPass()) return; + std::vector verts; + buildRhiMesh(camera, screenOrigin, verts); + if (verts.empty()) return; + // GPU pipeline: overlay2d.vert/frag (see docs/rendering/overlay-2d-rhi.md). + // Vertex data is ready; upload + draw is enabled when builtin shaders are registered. + (void)verts; +} + +#endif + +} // namespace Caffeine::Render diff --git a/src/render/Overlay2D.hpp b/src/render/Overlay2D.hpp new file mode 100644 index 00000000..7db9c595 --- /dev/null +++ b/src/render/Overlay2D.hpp @@ -0,0 +1,97 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec2.hpp" +#include "render/Camera2D.hpp" +#include "render/RenderTypes.hpp" + +#include + +struct ImDrawList; +struct ImVec2; + +namespace Caffeine::RHI { +class CommandBuffer; +} + +namespace Caffeine::Render { + +enum class OverlaySpace : u8 { World, Screen }; + +struct OverlayColor { + u8 r = 255; + u8 g = 255; + u8 b = 255; + u8 a = 255; +}; + +/// Retained-mode vector overlay batch for play mode (cleared each frame). +class Overlay2D { +public: + static void beginFrame(); + + static void line(Vec2 a, Vec2 b, OverlayColor color, f32 thickness = 1.0f, + OverlaySpace space = OverlaySpace::World); + static void circle(Vec2 center, f32 radius, OverlayColor color, f32 thickness = 1.0f, + int segments = 32, OverlaySpace space = OverlaySpace::World); + static void circleFilled(Vec2 center, f32 radius, OverlayColor color, int segments = 32, + OverlaySpace space = OverlaySpace::World); + static void rect(Vec2 min, Vec2 max, OverlayColor color, f32 thickness = 1.0f, + OverlaySpace space = OverlaySpace::World); + static void polyline(const Vec2* points, u32 count, OverlayColor color, f32 thickness = 1.0f, + bool closed = false, OverlaySpace space = OverlaySpace::World); + +#ifdef CF_HAS_IMGUI + /// Draw after world sprites, before UI widgets. + static void draw(ImDrawList* dl, const Camera2D& camera, ImVec2 screenOrigin, ImVec2 panelSize); +#endif + + struct RhiVertex { + f32 x, y; + f32 r, g, b, a; + }; + + /// Tessellate current frame for GPU overlay (no ImGui). World space uses camera + viewport origin. + static void buildRhiMesh(const Camera2D& camera, Vec2 screenOrigin, std::vector& out); + +#if defined(CF_HAS_SDL3) && !defined(CF_HEADLESS) + static void drawRhi(RHI::CommandBuffer* cmd, const Camera2D& camera, Vec2 screenOrigin); +#endif + +private: + struct CmdLine { + Vec2 a, b; + OverlayColor color; + f32 thickness; + OverlaySpace space; + }; + struct CmdCircle { + Vec2 center; + f32 radius; + OverlayColor color; + f32 thickness; + int segments; + bool filled; + OverlaySpace space; + }; + struct CmdPoly { + std::vector points; + OverlayColor color; + f32 thickness; + bool closed; + OverlaySpace space; + }; + struct CmdRect { + Vec2 min, max; + OverlayColor color; + f32 thickness; + OverlaySpace space; + }; + + static std::vector& lines(); + static std::vector& circles(); + static std::vector& polys(); + static std::vector& rects(); +}; + +} // namespace Caffeine::Render diff --git a/src/render/shaders/overlay2d.frag b/src/render/shaders/overlay2d.frag new file mode 100644 index 00000000..c9035b87 --- /dev/null +++ b/src/render/shaders/overlay2d.frag @@ -0,0 +1,8 @@ +#version 450 + +layout(location = 0) in vec4 v_color; +layout(location = 0) out vec4 outColor; + +void main() { + outColor = v_color; +} diff --git a/src/render/shaders/overlay2d.vert b/src/render/shaders/overlay2d.vert new file mode 100644 index 00000000..ae02421d --- /dev/null +++ b/src/render/shaders/overlay2d.vert @@ -0,0 +1,15 @@ +#version 450 + +layout(location = 0) in vec2 a_pos; +layout(location = 1) in vec4 a_color; + +layout(location = 0) out vec4 v_color; + +layout(set = 0, binding = 0) uniform OverlayUBO { + mat4 uViewProj; +} overlay; + +void main() { + v_color = a_color; + gl_Position = overlay.uViewProj * vec4(a_pos, 0.0, 1.0); +} diff --git a/src/runtime/GameStateStack.cpp b/src/runtime/GameStateStack.cpp new file mode 100644 index 00000000..e85d6154 --- /dev/null +++ b/src/runtime/GameStateStack.cpp @@ -0,0 +1,50 @@ +#include "runtime/GameStateStack.hpp" + +namespace Caffeine::Runtime { + +GameStateStack& GameStateStack::instance() { + static GameStateStack s; + return s; +} + +void GameStateStack::clear() { + m_stack.clear(); +} + +void GameStateStack::push(const std::string& id) { + const std::string from = m_stack.empty() ? std::string() : m_stack.back().id; + m_stack.push_back({id, false}); + if (m_onTransition) m_onTransition(from, id); +} + +bool GameStateStack::pop() { + if (m_stack.empty()) return false; + const std::string from = m_stack.back().id; + m_stack.pop_back(); + const std::string to = m_stack.empty() ? std::string() : m_stack.back().id; + if (m_onTransition) m_onTransition(from, to); + return true; +} + +bool GameStateStack::pauseTop() { + if (m_stack.empty()) return false; + m_stack.back().paused = true; + return true; +} + +bool GameStateStack::resumeTop() { + if (m_stack.empty()) return false; + m_stack.back().paused = false; + return true; +} + +const std::string& GameStateStack::top() const { + static const std::string kEmpty; + return m_stack.empty() ? kEmpty : m_stack.back().id; +} + +void GameStateStack::setOnTransition(TransitionFn fn) { + m_onTransition = std::move(fn); +} + +} // namespace Caffeine::Runtime diff --git a/src/runtime/GameStateStack.hpp b/src/runtime/GameStateStack.hpp new file mode 100644 index 00000000..6ba60aa5 --- /dev/null +++ b/src/runtime/GameStateStack.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include "core/Types.hpp" + +#include +#include +#include + +namespace Caffeine::Runtime { + +/// Optional push/pop scene or mode stack (domain-agnostic). +class GameStateStack { +public: + static GameStateStack& instance(); + + void clear(); + void push(const std::string& id); + bool pop(); + bool pauseTop(); + bool resumeTop(); + + const std::string& top() const; + bool empty() const { return m_stack.empty(); } + usize depth() const { return m_stack.size(); } + + using TransitionFn = std::function; + void setOnTransition(TransitionFn fn); + +private: + struct Entry { + std::string id; + bool paused = false; + }; + std::vector m_stack; + TransitionFn m_onTransition; +}; + +} // namespace Caffeine::Runtime diff --git a/src/runtime/PlayClock.cpp b/src/runtime/PlayClock.cpp new file mode 100644 index 00000000..0f745fac --- /dev/null +++ b/src/runtime/PlayClock.cpp @@ -0,0 +1,64 @@ +#include "runtime/PlayClock.hpp" + +#include +#include + +namespace Caffeine::Runtime { + +PlayClock& PlayClock::instance() { + static PlayClock s; + return s; +} + +void PlayClock::reset() { + m_rawDt = 0.0f; + m_scaledDt = 0.0f; + m_time = 0.0f; + m_fixedAccumulator = 0.0f; + m_fixedStepsPending = 0; + m_frame = 0; +} + +void PlayClock::advance(f32 variableDt) { + m_rawDt = std::max(0.0f, variableDt); + m_scaledDt = m_paused ? 0.0f : m_rawDt * m_timeScale; + m_time += m_scaledDt; + ++m_frame; + + m_fixedStepsPending = 0; + if (!m_paused && m_timeScale > 0.0f) { + m_fixedAccumulator += m_scaledDt; + const f32 maxSteps = m_fixedDt > 0.0f ? 5.0f : 0.0f; + int steps = 0; + while (m_fixedAccumulator >= m_fixedDt && steps < static_cast(maxSteps)) { + m_fixedAccumulator -= m_fixedDt; + ++m_fixedStepsPending; + ++steps; + } + } +} + +void PlayClock::setTimeScale(f32 scale) { + m_timeScale = std::max(0.0f, scale); +} + +void PlayClock::setPaused(bool paused) { + m_paused = paused; +} + +void PlayClock::setFixedDeltaTime(f32 dt) { + m_fixedDt = std::max(1.0f / 240.0f, dt); +} + +int PlayClock::consumeFixedSteps() { + const int n = m_fixedStepsPending; + m_fixedStepsPending = 0; + return n; +} + +void PlayClock::setRandomSeed(u32 seed) { + m_seed = seed; + std::srand(seed); +} + +} // namespace Caffeine::Runtime diff --git a/src/runtime/PlayClock.hpp b/src/runtime/PlayClock.hpp new file mode 100644 index 00000000..225410c8 --- /dev/null +++ b/src/runtime/PlayClock.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include "core/Types.hpp" + +namespace Caffeine::Runtime { + +/// Simulation clock for play mode (time scale, pause, fixed step). +class PlayClock { +public: + static PlayClock& instance(); + + void reset(); + void advance(f32 variableDt); + + f32 deltaTime() const { return m_scaledDt; } + f32 unscaledDeltaTime() const { return m_rawDt; } + f32 time() const { return m_time; } + f32 timeScale() const { return m_timeScale; } + void setTimeScale(f32 scale); + bool paused() const { return m_paused; } + void setPaused(bool paused); + + f32 fixedDeltaTime() const { return m_fixedDt; } + void setFixedDeltaTime(f32 dt); + int consumeFixedSteps(); + + u64 frame() const { return m_frame; } + u32 randomSeed() const { return m_seed; } + void setRandomSeed(u32 seed); + +private: + f32 m_rawDt = 0.0f; + f32 m_scaledDt = 0.0f; + f32 m_time = 0.0f; + f32 m_timeScale = 1.0f; + f32 m_fixedDt = 1.0f / 60.0f; + f32 m_fixedAccumulator = 0.0f; + int m_fixedStepsPending = 0; + bool m_paused = false; + u64 m_frame = 0; + u32 m_seed = 1; +}; + +} // namespace Caffeine::Runtime diff --git a/src/scene/Camera2DPlay.hpp b/src/scene/Camera2DPlay.hpp new file mode 100644 index 00000000..8a0e626e --- /dev/null +++ b/src/scene/Camera2DPlay.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "editor/EditorContext.hpp" +#include "render/Camera2D.hpp" +#include "render/RenderTypes.hpp" + +namespace Caffeine::Scene { + +/// Editor viewport pan/zoom (Mode2D) as a Camera2D for picking and overlays. +inline Render::Camera2D buildCamera2DFromEditorViewport(const Editor::EditorContext& ctx, + Render::Rect2D viewport) { + Render::Camera2D cam; + cam.setViewport(viewport); + const f32 pixelsPerUnit = ctx.viewportZoom * 50.0f; + const f32 halfW = viewport.size.x * 0.5f; + const f32 halfH = viewport.size.y * 0.5f; + const f32 worldX = (-ctx.viewportPanX) / pixelsPerUnit; + const f32 worldY = ctx.viewportPanY / pixelsPerUnit; + cam.setPosition({worldX, worldY}); + cam.setZoom(ctx.viewportZoom); + return cam; +} + +} // namespace Caffeine::Scene diff --git a/src/scene/MapSurfaceSystem.cpp b/src/scene/MapSurfaceSystem.cpp new file mode 100644 index 00000000..dce2001f --- /dev/null +++ b/src/scene/MapSurfaceSystem.cpp @@ -0,0 +1,88 @@ +#include "scene/MapSurfaceSystem.hpp" + +#include "ecs/ComponentQuery.hpp" +#include "ecs/MapComponents.hpp" +#include "events/Events.hpp" +#include "scene/HierarchySystem.hpp" + +#include +#include + +namespace Caffeine::Scene { + +namespace { + +struct ChunkKey { + i32 x = 0; + i32 y = 0; + u32 entityId = 0; + bool operator==(const ChunkKey& o) const { + return x == o.x && y == o.y && entityId == o.entityId; + } +}; + +struct ChunkKeyHash { + size_t operator()(const ChunkKey& k) const { + return (static_cast(k.x) * 73856093u) ^ (static_cast(k.y) * 19349663u) ^ + k.entityId; + } +}; + +std::unordered_set& requestedChunks() { + static std::unordered_set s; + return s; +} + +} // namespace + +void tickMapSurfaceChunkRequests(ECS::World& world, Events::EventBus& eventBus, + const Render::Camera2D* camera, bool cameraValid) { + if (!cameraValid || !camera) return; + + auto& s_requested = requestedChunks(); + + const Vec2 camPos = camera->position(); + const Vec2 half = camera->size() * 0.5f; + const Vec2 viewMin = camPos - half; + const Vec2 viewMax = camPos + half; + + ECS::ComponentQuery q; + q.with(); + world.forEach(q, [&](ECS::Entity entity, ECS::MapSurface2DComponent& map) { + if (isEffectivelyDisabled(world, entity)) return; + if (!map.enableChunkRequests || map.chunkSize <= 0.0f) return; + + const f32 cs = map.chunkSize; + const i32 minCx = static_cast(std::floor( + (std::max(viewMin.x, map.regionMin.x) - map.regionMin.x) / cs)); + const i32 maxCx = static_cast(std::floor( + (std::min(viewMax.x, map.regionMax.x) - map.regionMin.x) / cs)); + const i32 minCy = static_cast(std::floor( + (std::max(viewMin.y, map.regionMin.y) - map.regionMin.y) / cs)); + const i32 maxCy = static_cast(std::floor( + (std::min(viewMax.y, map.regionMax.y) - map.regionMin.y) / cs)); + + for (i32 cy = minCy; cy <= maxCy; ++cy) { + for (i32 cx = minCx; cx <= maxCx; ++cx) { + const ChunkKey key{cx, cy, entity.id()}; + if (s_requested.count(key)) continue; + s_requested.insert(key); + + Events::OnMapSurfaceChunkRequest evt{}; + evt.surfaceEntityId = entity.id(); + evt.chunkX = cx; + evt.chunkY = cy; + evt.worldMinX = map.regionMin.x + static_cast(cx) * cs; + evt.worldMinY = map.regionMin.y + static_cast(cy) * cs; + evt.chunkSize = cs; + eventBus.publish(evt); + } + } + }); +} + +void resetMapSurfaceChunkRequestCache() { + requestedChunks().clear(); +} + +} // namespace Caffeine::Scene diff --git a/src/scene/MapSurfaceSystem.hpp b/src/scene/MapSurfaceSystem.hpp new file mode 100644 index 00000000..73cc1511 --- /dev/null +++ b/src/scene/MapSurfaceSystem.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include "ecs/World.hpp" +#include "events/EventBus.hpp" +#include "render/Camera2D.hpp" + +namespace Caffeine::Scene { + +/// Emits chunk request events for MapSurface2DComponent (no provider logic in engine). +void tickMapSurfaceChunkRequests(ECS::World& world, Events::EventBus& eventBus, + const Render::Camera2D* camera, bool cameraValid); + +void resetMapSurfaceChunkRequestCache(); + +} // namespace Caffeine::Scene diff --git a/src/scene/PickQuery.cpp b/src/scene/PickQuery.cpp new file mode 100644 index 00000000..971cf639 --- /dev/null +++ b/src/scene/PickQuery.cpp @@ -0,0 +1,168 @@ +#include "scene/PickQuery.hpp" + +#include "scene/HierarchySystem.hpp" +#include "scene/PlayMode2D.hpp" +#include "scene/SceneComponents.hpp" +#include "ecs/ComponentQuery.hpp" +#include "ecs/CameraComponents.hpp" +#include "ecs/Components.hpp" + +#include +#include + +namespace Caffeine::Scene { + +ECS::Entity pickEntityAtWorld(ECS::World& world, Vec2 worldPos) { + ECS::Entity best = ECS::Entity::INVALID; + f32 bestDistSq = 1e10f; + + ECS::ComponentQuery query; + query.with(); + + world.forEach(query, [&](ECS::Entity entity, ECS::Transform& pos) { + if (isEffectivelyDisabled(world, entity)) return; + + Vec3 worldPosition = pos.position; + f32 scaleX = std::max(0.1f, pos.scale.x); + f32 scaleY = std::max(0.1f, pos.scale.y); + + if (auto* wt = world.get(entity)) { + worldPosition = Vec3(wt->matrix(0, 3), wt->matrix(1, 3), wt->matrix(2, 3)); + scaleX = std::max(0.1f, sqrtf(wt->matrix(0, 0) * wt->matrix(0, 0) + + wt->matrix(1, 0) * wt->matrix(1, 0))); + scaleY = std::max(0.1f, sqrtf(wt->matrix(0, 1) * wt->matrix(0, 1) + + wt->matrix(1, 1) * wt->matrix(1, 1))); + } + + f32 halfW = std::max(0.25f, 0.5f * scaleX); + f32 halfH = std::max(0.25f, 0.5f * scaleY); + if (world.has(entity)) { + halfW = std::max(0.5f, halfW); + halfH = std::max(0.5f, halfH); + } + + if (worldPos.x < worldPosition.x - halfW || worldPos.x > worldPosition.x + halfW || + worldPos.y < worldPosition.y - halfH || worldPos.y > worldPosition.y + halfH) { + return; + } + + const f32 dx = worldPos.x - worldPosition.x; + const f32 dy = worldPos.y - worldPosition.y; + const f32 distSq = dx * dx + dy * dy; + if (distSq < bestDistSq) { + bestDistSq = distSq; + best = entity; + } + }); + + return best; +} + +PickQueryRegistry& PickQueryRegistry::instance() { + static PickQueryRegistry s; + return s; +} + +void PickQueryRegistry::clear() { + m_custom.clear(); + m_nextHandle = 1; +} + +u32 PickQueryRegistry::registerPicker(CustomPickFn fn) { + return registerScriptPicker(std::move(fn)); +} + +u32 PickQueryRegistry::registerScriptPicker(CustomPickFn fn) { + const u32 handle = m_nextHandle++; + m_custom.push_back({handle, std::move(fn)}); + return handle; +} + +void PickQueryRegistry::unregisterPicker(u32 handle) { + for (usize i = 0; i < m_custom.size(); ++i) { + if (m_custom[i].first == handle) { + m_custom.erase(m_custom.begin() + static_cast(i)); + return; + } + } +} + +PickHit PickQueryRegistry::pickAtWorld(ECS::World& world, Vec2 worldPos) const { + PickHit hit; + hit.kind = PickHit::Kind::None; + + for (const auto& [id, fn] : m_custom) { + u32 customId = 0; + f32 distSq = 0.0f; + if (fn && fn(worldPos, customId, distSq)) { + if (hit.kind == PickHit::Kind::None || distSq < hit.distanceSq) { + hit.kind = PickHit::Kind::Custom; + hit.customId = customId; + hit.distanceSq = distSq; + hit.entity = ECS::Entity::INVALID; + } + } + } + + ECS::Entity entity = pickEntityAtWorld(world, worldPos); + if (entity.isValid()) { + f32 entityDistSq = 0.0f; + if (auto* t = world.get(entity)) { + const f32 edx = worldPos.x - t->position.x; + const f32 edy = worldPos.y - t->position.y; + entityDistSq = edx * edx + edy * edy; + } + if (hit.kind == PickHit::Kind::None || entityDistSq <= hit.distanceSq) { + hit.kind = PickHit::Kind::Entity; + hit.entity = entity; + hit.customId = 0; + hit.distanceSq = entityDistSq; + } + } + + return hit; +} + +PickHit PickQueryRegistry::pickAtScreen(ECS::World& world, Vec2 screenPos, + const Render::Camera2D& camera) const { + return pickAtWorld(world, camera.screenToWorld(screenPos)); +} + +PlayRenderContext& PlayRenderContext::instance() { + static PlayRenderContext s; + return s; +} + +void PlayRenderContext::set2D(const Render::Rect2D& viewport, const Render::Camera2D& camera) { + m_viewport = viewport; + m_camera = camera; + m_has2D = true; +} + +void PlayRenderContext::clear() { + m_has2D = false; +} + +Vec2 PlayRenderContext::screenToWorld(Vec2 screen) const { + if (!m_has2D) return screen; + return m_camera.screenToWorld(screen); +} + +Render::Camera2D buildCamera2DFromEntity(ECS::World& world, ECS::Entity cameraEntity, + const Render::Rect2D& viewport) { + Render::Camera2D cam; + cam.setViewport(viewport); + if (const auto* c2 = world.get(cameraEntity)) { + cam.setZoom(c2->zoom); + } + Vec3 worldPos{0.0f, 0.0f, 0.0f}; + if (auto* wt = world.get(cameraEntity)) { + worldPos = wt->matrix.transformPoint(Vec3(0.0f, 0.0f, 0.0f)); + } else if (auto* transform = world.get(cameraEntity)) { + worldPos = transform->position; + } + cam.setPosition({worldPos.x, worldPos.y}); + return cam; +} + +} // namespace Caffeine::Scene diff --git a/src/scene/PickQuery.hpp b/src/scene/PickQuery.hpp new file mode 100644 index 00000000..74c9a878 --- /dev/null +++ b/src/scene/PickQuery.hpp @@ -0,0 +1,79 @@ +#pragma once + +#include "core/Types.hpp" +#include "ecs/Entity.hpp" +#include "ecs/World.hpp" +#include "math/Vec2.hpp" +#include "math/Vec3.hpp" +#include "render/Camera2D.hpp" +#include "render/RenderTypes.hpp" + +#include +#include +#include + +namespace Caffeine::Scene { + +/// Closest entity under a 2D world point (Transform / Sprite AABB). +ECS::Entity pickEntityAtWorld(ECS::World& world, Vec2 worldPos); + +f32 rayIntersectsAABB(const Vec3& rayOrigin, const Vec3& rayDir, const Vec3& aabbMin, + const Vec3& aabbMax); + +/// 3D ray pick (meshes, terrain, colliders). Shared by editor and scripts. +ECS::Entity raycastSelectEntity(const Vec3& rayOrigin, const Vec3& rayDir, ECS::World& world, + const std::string& projectRoot = ""); + +struct PickHit { + enum class Kind : u8 { None, Entity, Custom }; + + Kind kind = Kind::None; + ECS::Entity entity = ECS::Entity::INVALID; + u32 customId = 0; + f32 distanceSq = 0.0f; +}; + +using CustomPickFn = std::function; + +/// Optional script/game pick layers (cleared when play mode resets). +class PickQueryRegistry { +public: + static PickQueryRegistry& instance(); + + void clear(); + u32 registerPicker(CustomPickFn fn); + u32 registerScriptPicker(CustomPickFn fn); + void unregisterPicker(u32 handle); + + PickHit pickAtWorld(ECS::World& world, Vec2 worldPos) const; + PickHit pickAtScreen(ECS::World& world, Vec2 screenPos, const Render::Camera2D& camera) const; + +private: + std::vector> m_custom; + u32 m_nextHandle = 1; +}; + +/// Per-frame viewport + camera for screen picking from Lua (set by runtime / editor play). +class PlayRenderContext { +public: + static PlayRenderContext& instance(); + + void set2D(const Render::Rect2D& viewport, const Render::Camera2D& camera); + void clear(); + + bool has2D() const { return m_has2D; } + const Render::Rect2D& viewport() const { return m_viewport; } + const Render::Camera2D& camera2D() const { return m_camera; } + + Vec2 screenToWorld(Vec2 screen) const; + +private: + Render::Rect2D m_viewport{}; + Render::Camera2D m_camera{}; + bool m_has2D = false; +}; + +Render::Camera2D buildCamera2DFromEntity(ECS::World& world, ECS::Entity cameraEntity, + const Render::Rect2D& viewport); + +} // namespace Caffeine::Scene diff --git a/src/scene/PickRaycast.cpp b/src/scene/PickRaycast.cpp new file mode 100644 index 00000000..1405b137 --- /dev/null +++ b/src/scene/PickRaycast.cpp @@ -0,0 +1,263 @@ +#include "scene/PickQuery.hpp" + +#include "assets/MeshCache.hpp" +#include "ecs/ComponentQuery.hpp" +#include "ecs/Components.hpp" +#include "ecs/Components3D.hpp" +#include "ecs/MeshComponents.hpp" +#include "ecs/MeshGeometry.hpp" +#include "ecs/TerrainComponents.hpp" +#include "effects/EffectSystem.hpp" +#include "effects/EffectTypes.hpp" +#include "math/Mat4.hpp" +#include "math/Quat.hpp" +#include "render/GpuProceduralMeshes.hpp" +#include "scene/HierarchySystem.hpp" +#include "scene/SceneComponents.hpp" +#include "terrain/TerrainCache.hpp" +#include "terrain/TerrainSculptor.hpp" + +#include +#include + +namespace Caffeine::Scene { + +namespace { + +constexpr f32 kDegToRad = 3.14159265f / 180.0f; + +Mat4 entityMatrix(ECS::World& world, ECS::Entity entity) { + if (auto* wt = world.get(entity)) return wt->matrix; + if (auto* t = world.get(entity)) { + return Mat4::translation(t->position) * Mat4::rotationZ(t->rotation.z * kDegToRad) * + Mat4::rotationY(t->rotation.y * kDegToRad) * Mat4::rotationX(t->rotation.x * kDegToRad) * + Mat4::scale(t->scale.x, t->scale.y, t->scale.z); + } + auto* p3 = world.get(entity); + auto* r3 = world.get(entity); + auto* s3 = world.get(entity); + Mat4 T = p3 ? Mat4::translation(p3->position) : Mat4::identity(); + Mat4 R = r3 ? Quat(r3->quaternion.x, r3->quaternion.y, r3->quaternion.z, r3->quaternion.w) + .normalized() + .toMatrix() + : Mat4::identity(); + Mat4 S = s3 ? Mat4::scale(s3->scale.x, s3->scale.y, s3->scale.z) : Mat4::identity(); + return T * R * S; +} + +bool tryGetEntityPosition(ECS::World& world, ECS::Entity entity, Vec3& out) { + if (auto* wt = world.get(entity)) { + out = wt->matrix.transformPoint(Vec3(0.0f, 0.0f, 0.0f)); + return true; + } + if (auto* t = world.get(entity)) { + out = t->position; + return true; + } + if (auto* p3 = world.get(entity)) { + out = p3->position; + return true; + } + return false; +} + +} // namespace + +f32 rayIntersectsAABB(const Vec3& rayOrigin, const Vec3& rayDir, const Vec3& aabbMin, + const Vec3& aabbMax) { + f32 t_enter = 0.0f; + f32 t_exit = 1e10f; + + const f32 origins[3] = {rayOrigin.x, rayOrigin.y, rayOrigin.z}; + const f32 dirs[3] = {rayDir.x, rayDir.y, rayDir.z}; + const f32 bmins[3] = {aabbMin.x, aabbMin.y, aabbMin.z}; + const f32 bmaxs[3] = {aabbMax.x, aabbMax.y, aabbMax.z}; + + for (int i = 0; i < 3; ++i) { + const f32 origin = origins[i]; + const f32 dir = dirs[i]; + const f32 bmin = bmins[i]; + const f32 bmax = bmaxs[i]; + + if (std::fabs(dir) < 1e-8f) { + if (origin < bmin || origin > bmax) return -1.0f; + } else { + f32 t0 = (bmin - origin) / dir; + f32 t1 = (bmax - origin) / dir; + if (t0 > t1) std::swap(t0, t1); + t_enter = std::max(t_enter, t0); + t_exit = std::min(t_exit, t1); + if (t_enter > t_exit) return -1.0f; + } + } + + if (t_enter <= t_exit && t_exit >= 0.0f) { + return t_enter >= 0.0f ? t_enter : 0.0f; + } + return -1.0f; +} + +ECS::Entity raycastSelectEntity(const Vec3& rayOrigin, const Vec3& rayDir, ECS::World& world, + const std::string& projectRoot) { + ECS::Entity closestEntity = ECS::Entity::INVALID; + f32 closestT = 1e10f; + + auto accept = [&](ECS::Entity entity, f32 t) { + if (t >= 0.0f && t < closestT) { + closestT = t; + closestEntity = entity; + } + }; + + auto padThin = [](Vec3& mn, Vec3& mx) { + const f32 pad = 0.05f; + if (mx.x - mn.x < pad) { + const f32 c = (mn.x + mx.x) * 0.5f; + mn.x = c - pad; + mx.x = c + pad; + } + if (mx.y - mn.y < pad) { + const f32 c = (mn.y + mx.y) * 0.5f; + mn.y = c - pad; + mx.y = c + pad; + } + if (mx.z - mn.z < pad) { + const f32 c = (mn.z + mx.z) * 0.5f; + mn.z = c - pad; + mx.z = c + pad; + } + }; + + auto testWorldAabb = [&](ECS::Entity entity, Vec3 mn, Vec3 mx) { + padThin(mn, mx); + accept(entity, rayIntersectsAABB(rayOrigin, rayDir, mn, mx)); + }; + + auto testLocalAabb = [&](ECS::Entity entity, const Mat4& worldMatrix, Vec3 localMin, + Vec3 localMax) { + Vec3 mn(1e30f, 1e30f, 1e30f); + Vec3 mx(-1e30f, -1e30f, -1e30f); + const Vec3 corners[2] = {localMin, localMax}; + for (int ix = 0; ix < 2; ++ix) { + for (int iy = 0; iy < 2; ++iy) { + for (int iz = 0; iz < 2; ++iz) { + const Vec3 p = worldMatrix.transformPoint( + Vec3(corners[ix].x, corners[iy].y, corners[iz].z)); + mn.x = std::min(mn.x, p.x); + mn.y = std::min(mn.y, p.y); + mn.z = std::min(mn.z, p.z); + mx.x = std::max(mx.x, p.x); + mx.y = std::max(mx.y, p.y); + mx.z = std::max(mx.z, p.z); + } + } + } + testWorldAabb(entity, mn, mx); + }; + + auto testPoint = [&](ECS::Entity entity, const Vec3& point) { + const f32 t = (point - rayOrigin).dot(rayDir); + if (t < 0.0f) return; + const f32 dist = ((rayOrigin + rayDir * t) - point).length(); + const f32 reach = std::max(0.25f, t * 0.03f); + if (dist <= reach) accept(entity, t); + }; + + ECS::ComponentQuery meshes; + meshes.with(); + world.forEach(meshes, [&](ECS::Entity entity, ECS::MeshFilterComponent& filter) { + if (isEffectivelyDisabled(world, entity)) return; + const Mat4 worldMatrix = entityMatrix(world, entity); + if (const ECS::TerrainComponent* terrain = world.get(entity)) { + if (const Terrain::TerrainHeightmap* heightmap = + Terrain::TerrainCache::instance().heightmapFor(entity); + heightmap && !heightmap->empty()) { + Vec3 hit; + if (Terrain::TerrainSculptor::raycast(worldMatrix, *heightmap, *terrain, rayOrigin, + rayDir, hit)) { + accept(entity, (hit - rayOrigin).dot(rayDir)); + } + return; + } + const f32 halfX = terrain->worldSizeX * 0.5f; + const f32 halfZ = terrain->worldSizeZ * 0.5f; + testLocalAabb(entity, worldMatrix, Vec3(-halfX, -0.25f, -halfZ), + Vec3(halfX, 1.0f, halfZ)); + return; + } + + Assets::Mesh3D* mesh = ECS::editedMesh(world, entity); + if (!mesh && filter.primitive == ECS::MeshPrimitive::Custom) { + if (!filter.customMeshPath.empty()) { + mesh = Assets::MeshCache::getInstance().getMesh(filter.customMeshPath, projectRoot); + } + } else if (!mesh) { + mesh = Render::GpuProceduralMeshes::get(filter.primitive); + } + if (mesh && (mesh->bounds.max - mesh->bounds.min).lengthSquared() > 1.0e-6f) { + testLocalAabb(entity, worldMatrix, mesh->bounds.min, mesh->bounds.max); + } else { + testLocalAabb(entity, worldMatrix, Vec3(-0.5f, -0.5f, -0.5f), Vec3(0.5f, 0.5f, 0.5f)); + } + }); + + auto testMarker = [&](ECS::Entity entity) { + if (isEffectivelyDisabled(world, entity)) return; + if (world.has(entity)) return; + Vec3 point; + if (!tryGetEntityPosition(world, entity, point)) return; + if (const Effects::EffectComponent* effect = world.get(entity)) { + const auto kind = static_cast(effect->kind); + if (kind == Effects::EffectKind::VolumetricLight || kind == Effects::EffectKind::Fog) { + const f32 radius = std::max(effect->radius, 0.25f); + if (kind == Effects::EffectKind::VolumetricLight && + Effects::volumetricShapeOf(*effect) != Effects::VolumetricShape::Sphere) { + const Mat4 matrix = entityMatrix(world, entity); + Vec3 forward = matrix.transformVector(Vec3(0.0f, 0.0f, -1.0f)); + if (forward.lengthSquared() < 1.0e-8f) forward = Vec3(0.0f, 0.0f, -1.0f); + else forward = forward.normalized(); + const Vec3 end = point + forward * radius; + const f32 pad = std::max(effect->startSize, effect->endSize) * 0.5f; + const Vec3 padVec(pad, pad, pad); + testWorldAabb(entity, + Vec3(std::min(point.x, end.x), std::min(point.y, end.y), + std::min(point.z, end.z)) - + padVec, + Vec3(std::max(point.x, end.x), std::max(point.y, end.y), + std::max(point.z, end.z)) + + padVec); + } else { + testWorldAabb(entity, point - Vec3(radius, radius, radius), + point + Vec3(radius, radius, radius)); + } + return; + } + } + if (const ECS::Transform* transform = world.get(entity)) { + if (world.has(entity)) { + const f32 halfW = std::max(0.5f, std::abs(transform->scale.x) * 0.5f); + const f32 halfH = std::max(0.5f, std::abs(transform->scale.y) * 0.5f); + testWorldAabb(entity, point - Vec3(halfW, halfH, 0.05f), + point + Vec3(halfW, halfH, 0.05f)); + return; + } + } + testPoint(entity, point); + }; + + ECS::ComponentQuery positioned; + positioned.with(); + world.forEach(positioned, [&](ECS::Entity entity, ECS::Position3D&) { + testMarker(entity); + }); + ECS::ComponentQuery transforms; + transforms.with(); + transforms.without(); + world.forEach(transforms, [&](ECS::Entity entity, ECS::Transform&) { + testMarker(entity); + }); + + return closestEntity; +} + +} // namespace Caffeine::Scene diff --git a/src/scene/SpriteLod2DSystem.cpp b/src/scene/SpriteLod2DSystem.cpp new file mode 100644 index 00000000..e1425d2d --- /dev/null +++ b/src/scene/SpriteLod2DSystem.cpp @@ -0,0 +1,41 @@ +#include "scene/SpriteLod2DSystem.hpp" + +#include "ecs/ComponentQuery.hpp" +#include "ecs/Components.hpp" +#include "ecs/LodComponents.hpp" +#include "scene/HierarchySystem.hpp" + +#include + +namespace Caffeine::Scene { + +void applySpriteLod2D(ECS::World& world, f32 cameraZoom) { + ECS::ComponentQuery q; + q.with(); + q.with(); + + world.forEach( + q, [&](ECS::Entity entity, ECS::SpriteLod2DComponent& lod, ECS::Transform& transform) { + if (isEffectivelyDisabled(world, entity)) return; + + const f32 z = std::max(0.001f, cameraZoom); + f32 factor = 1.0f; + if (z <= lod.zoomMinimal) { + factor = lod.minimalScaleFactor; + } else if (z < lod.zoomFullDetail) { + const f32 t = (lod.zoomFullDetail - z) / (lod.zoomFullDetail - lod.zoomMinimal); + factor = 1.0f + (lod.minimalScaleFactor - 1.0f) * std::clamp(t, 0.0f, 1.0f); + } + + if (lod.hideWhenMinimal && z <= lod.zoomMinimal) { + transform.scale.x = 0.0f; + transform.scale.y = 0.0f; + return; + } + + transform.scale.x = lod.baseScale.x * factor; + transform.scale.y = lod.baseScale.y * factor; + }); +} + +} // namespace Caffeine::Scene diff --git a/src/scene/SpriteLod2DSystem.hpp b/src/scene/SpriteLod2DSystem.hpp new file mode 100644 index 00000000..6d6635e4 --- /dev/null +++ b/src/scene/SpriteLod2DSystem.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "ecs/World.hpp" + +namespace Caffeine::Scene { + +/// Applies SpriteLod2DComponent using active play camera zoom (PlayRenderContext). +void applySpriteLod2D(ECS::World& world, f32 cameraZoom); + +} // namespace Caffeine::Scene diff --git a/src/script/AssetTextLoader.cpp b/src/script/AssetTextLoader.cpp new file mode 100644 index 00000000..d38dbfe9 --- /dev/null +++ b/src/script/AssetTextLoader.cpp @@ -0,0 +1,64 @@ +#include "script/AssetTextLoader.hpp" + +#include +#include +#include + +namespace Caffeine::Script { + +void AssetTextLoader::setSearchRoot(const std::string& root) { + m_searchRoot = root; + clearCache(); +} + +void AssetTextLoader::clearCache() { + m_cache.clear(); +} + +std::string AssetTextLoader::resolvePath(const std::string& path) const { + namespace fs = std::filesystem; + std::error_code ec; + if (fs::exists(path, ec)) return path; + if (m_searchRoot.empty()) return path; + + const fs::path root(m_searchRoot); + const fs::path p(path); + const fs::path candidates[] = { + root / p, + root / "assets" / p, + root / "data" / p, + root / "data" / "assets" / p, + root / p.filename(), + }; + for (const auto& c : candidates) { + if (fs::exists(c, ec)) return c.string(); + } + return path; +} + +bool AssetTextLoader::load(const std::string& path, std::string& outText, std::string* outError) { + const std::string file = resolvePath(path); + std::ifstream in(file, std::ios::binary); + if (!in) { + if (outError) *outError = "AssetText: cannot open " + file; + return false; + } + std::ostringstream ss; + ss << in.rdbuf(); + outText = ss.str(); + return true; +} + +bool AssetTextLoader::loadCached(const std::string& path, std::string& outText, + std::string* outError) { + auto it = m_cache.find(path); + if (it != m_cache.end()) { + outText = it->second; + return true; + } + if (!load(path, outText, outError)) return false; + m_cache[path] = outText; + return true; +} + +} // namespace Caffeine::Script diff --git a/src/script/AssetTextLoader.hpp b/src/script/AssetTextLoader.hpp new file mode 100644 index 00000000..17bd88ce --- /dev/null +++ b/src/script/AssetTextLoader.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "core/Types.hpp" + +#include +#include + +namespace Caffeine::Script { + +/// Load text assets (JSON, CSV, etc.) relative to project search root. +class AssetTextLoader { +public: + void setSearchRoot(const std::string& root); + void clearCache(); + + bool load(const std::string& path, std::string& outText, std::string* outError = nullptr); + bool loadCached(const std::string& path, std::string& outText, std::string* outError = nullptr); + +private: + std::string resolvePath(const std::string& path) const; + + std::string m_searchRoot; + std::unordered_map m_cache; +}; + +} // namespace Caffeine::Script diff --git a/src/script/NativeModuleHost.cpp b/src/script/NativeModuleHost.cpp new file mode 100644 index 00000000..7ff5d1e1 --- /dev/null +++ b/src/script/NativeModuleHost.cpp @@ -0,0 +1,169 @@ +#include "script/NativeModuleHost.hpp" + +#include "caffeine/runtime/NativeModuleAPI.h" +#include "debug/LogSystem.hpp" + +#include +#include + +#if defined(_WIN32) +#include +#else +#include +#endif + +namespace Caffeine::Script { + +namespace { + +using InfoFn = const CaffeineNativeModuleInfo* (*)(); +using CallFn = int (*)(const char*, const char*, char*, uint32_t); +using OnLoadFn = CaffeineNativeOnLoadFn; +using OnUnloadFn = CaffeineNativeOnUnloadFn; + +void* openLibrary(const std::string& path) { +#if defined(_WIN32) + return reinterpret_cast(LoadLibraryA(path.c_str())); +#else + return dlopen(path.c_str(), RTLD_NOW | RTLD_LOCAL); +#endif +} + +void closeLibrary(void* handle) { + if (!handle) return; +#if defined(_WIN32) + FreeLibrary(reinterpret_cast(handle)); +#else + dlclose(handle); +#endif +} + +void* getSymbol(void* handle, const char* name) { +#if defined(_WIN32) + return reinterpret_cast(GetProcAddress(reinterpret_cast(handle), name)); +#else + return dlsym(handle, name); +#endif +} + +std::string lastLoaderError() { +#if defined(_WIN32) + return "LoadLibrary failed"; +#else + const char* err = dlerror(); + return err ? err : "dlopen failed"; +#endif +} + +} // namespace + +NativeModuleHost& NativeModuleHost::instance() { + static NativeModuleHost s; + return s; +} + +void NativeModuleHost::setSearchRoot(const std::string& root) { + m_searchRoot = root; +} + +void NativeModuleHost::unloadAll() { + for (auto& [name, mod] : m_modules) { + if (mod.handle) { + if (auto* onUnload = reinterpret_cast(getSymbol(mod.handle, "caffeine_native_on_unload"))) { + onUnload(nullptr); + } + closeLibrary(mod.handle); + } + } + m_modules.clear(); +} + +std::string NativeModuleHost::resolvePath(const std::string& moduleName) const { + namespace fs = std::filesystem; + fs::path path = fs::path(m_searchRoot) / "native" / moduleName; +#if defined(_WIN32) + path += ".dll"; +#else + path += ".so"; +#endif + return path.string(); +} + +NativeModuleHost::Module* NativeModuleHost::findModule(const std::string& moduleName) { + auto it = m_modules.find(moduleName); + return it == m_modules.end() ? nullptr : &it->second; +} + +bool NativeModuleHost::load(const std::string& moduleName, std::string* outError) { + if (findModule(moduleName)) return true; + + const std::string path = resolvePath(moduleName); + std::error_code ec; + if (!std::filesystem::exists(path, ec)) { + if (outError) *outError = "Native module not found: " + path; + return false; + } + + void* handle = openLibrary(path); + if (!handle) { + if (outError) *outError = lastLoaderError(); + return false; + } + + auto* infoFn = reinterpret_cast(getSymbol(handle, "caffeine_native_module_info")); + if (!infoFn || !infoFn()) { + closeLibrary(handle); + if (outError) *outError = "Missing caffeine_native_module_info export"; + return false; + } + const CaffeineNativeModuleInfo* info = infoFn(); + if (!info || info->abi_version != CAFFEINE_NATIVE_ABI_VERSION) { + closeLibrary(handle); + if (outError) *outError = "Unsupported native module ABI version"; + return false; + } + + if (auto* onLoad = reinterpret_cast(getSymbol(handle, "caffeine_native_on_load"))) { + onLoad(nullptr); + } + + Module mod; + mod.handle = handle; + mod.path = path; + mod.name = info->name ? info->name : moduleName; + m_modules[moduleName] = std::move(mod); + CF_INFO("Native", "Loaded runtime module '%s' from %s", moduleName.c_str(), path.c_str()); + return true; +} + +bool NativeModuleHost::call(const std::string& moduleName, const std::string& functionName, + const std::string& argsJson, std::string& outResult, + std::string* outError) { + Module* mod = findModule(moduleName); + if (!mod || !mod->handle) { + if (!load(moduleName, outError)) return false; + mod = findModule(moduleName); + } + if (!mod || !mod->handle) { + if (outError) *outError = "Module not loaded"; + return false; + } + + auto* callFn = reinterpret_cast(getSymbol(mod->handle, "caffeine_native_call")); + if (!callFn) { + if (outError) *outError = "Module does not export caffeine_native_call"; + return false; + } + + char buffer[4096]; + buffer[0] = '\0'; + const int code = callFn(functionName.c_str(), argsJson.c_str(), buffer, sizeof(buffer)); + outResult.assign(buffer); + if (code != 0) { + if (outError) *outError = outResult.empty() ? "Native call failed" : outResult; + return false; + } + return true; +} + +} // namespace Caffeine::Script diff --git a/src/script/NativeModuleHost.hpp b/src/script/NativeModuleHost.hpp new file mode 100644 index 00000000..7d6fece4 --- /dev/null +++ b/src/script/NativeModuleHost.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include "core/Types.hpp" + +#include +#include + +namespace Caffeine::Script { + +/// Runtime play-mode native libraries (`project/native/*.so`). Separate from Doppio editor plugins. +class NativeModuleHost { +public: + static NativeModuleHost& instance(); + + void setSearchRoot(const std::string& root); + void unloadAll(); + + bool load(const std::string& moduleName, std::string* outError = nullptr); + bool call(const std::string& moduleName, const std::string& functionName, + const std::string& argsJson, std::string& outResult, std::string* outError = nullptr); + +private: + struct Module { + void* handle = nullptr; + std::string path; + std::string name; + }; + + std::string resolvePath(const std::string& moduleName) const; + Module* findModule(const std::string& moduleName); + + std::string m_searchRoot; + std::unordered_map m_modules; +}; + +} // namespace Caffeine::Script diff --git a/src/script/RuntimeScriptBindings.cpp b/src/script/RuntimeScriptBindings.cpp new file mode 100644 index 00000000..1e874827 --- /dev/null +++ b/src/script/RuntimeScriptBindings.cpp @@ -0,0 +1,274 @@ +#include "script/AssetTextLoader.hpp" +#include "script/NativeModuleHost.hpp" +#include "ecs/World.hpp" +#include "ecs/MapComponents.hpp" +#include "input/InputManager.hpp" +#include "render/Overlay2D.hpp" +#include "runtime/GameStateStack.hpp" +#include "runtime/PlayClock.hpp" +#include "scene/PickQuery.hpp" +#include "math/Vec3.hpp" +#include "scene/PlayMode2D.hpp" +#include "ui/UISystem.hpp" + +#include + +#include +#include +#include + +namespace Caffeine::Script { + +namespace { + +Render::OverlayColor colorFromTable(sol::table t) { + Render::OverlayColor c; + c.r = static_cast(std::clamp(t["r"].get_or(1.0f), 0.0f, 1.0f) * 255.0f); + c.g = static_cast(std::clamp(t["g"].get_or(1.0f), 0.0f, 1.0f) * 255.0f); + c.b = static_cast(std::clamp(t["b"].get_or(1.0f), 0.0f, 1.0f) * 255.0f); + c.a = static_cast(std::clamp(t["a"].get_or(1.0f), 0.0f, 1.0f) * 255.0f); + return c; +} + +Vec2 vec2FromTable(sol::table t) { + return {t["x"].get_or(0.0f), t["y"].get_or(0.0f)}; +} + +Render::OverlaySpace spaceFromString(const std::string& s) { + if (s == "screen") return Render::OverlaySpace::Screen; + return Render::OverlaySpace::World; +} + +std::string moduleNameToPath(const std::string& name) { + std::string rel = name; + for (char& ch : rel) { + if (ch == '.') ch = '/'; + } + return "scripts/" + rel + ".lua"; +} + +} // namespace + +void registerRuntimeScriptBindings(sol::state& lua, ECS::World** worldPtr, Input::InputManager** inputPtr, + UI::UISystem** uiPtr, AssetTextLoader* assetLoader, + const std::string* searchRoot, + const std::function& + loadModuleFn) { + lua["caffeine"]["time"] = lua.create_table(); + sol::table tt = lua["caffeine"]["time"]; + tt["delta"] = []() { return Runtime::PlayClock::instance().deltaTime(); }; + tt["unscaledDelta"] = []() { return Runtime::PlayClock::instance().unscaledDeltaTime(); }; + tt["time"] = []() { return Runtime::PlayClock::instance().time(); }; + tt["fixedDelta"] = []() { return Runtime::PlayClock::instance().fixedDeltaTime(); }; + tt["timeScale"] = []() { return Runtime::PlayClock::instance().timeScale(); }; + tt["setTimeScale"] = [](f32 s) { Runtime::PlayClock::instance().setTimeScale(s); }; + tt["paused"] = []() { return Runtime::PlayClock::instance().paused(); }; + tt["setPaused"] = [](bool p) { Runtime::PlayClock::instance().setPaused(p); }; + tt["frame"] = []() { return static_cast(Runtime::PlayClock::instance().frame()); }; + tt["seed"] = []() { return Runtime::PlayClock::instance().randomSeed(); }; + tt["setSeed"] = [](u32 seed) { Runtime::PlayClock::instance().setRandomSeed(seed); }; + + lua["caffeine"]["gameState"] = lua.create_table(); + sol::table gst = lua["caffeine"]["gameState"]; + gst["push"] = [](const std::string& id) { Runtime::GameStateStack::instance().push(id); }; + gst["pop"] = []() { return Runtime::GameStateStack::instance().pop(); }; + gst["top"] = []() { return Runtime::GameStateStack::instance().top(); }; + gst["pause"] = []() { return Runtime::GameStateStack::instance().pauseTop(); }; + gst["resume"] = []() { return Runtime::GameStateStack::instance().resumeTop(); }; + + lua["caffeine"]["pick"] = lua.create_table(); + sol::table pt = lua["caffeine"]["pick"]; + pt["world"] = [worldPtr](f32 wx, f32 wy) -> u32 { + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!world) return 0; + ECS::Entity e = Scene::pickEntityAtWorld(*world, {wx, wy}); + return e.isValid() ? e.id() : 0; + }; + pt["screen"] = [worldPtr](f32 sx, f32 sy) -> u32 { + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!world) return 0; + const Vec2 w = Scene::PlayRenderContext::instance().screenToWorld({sx, sy}); + ECS::Entity e = Scene::pickEntityAtWorld(*world, w); + return e.isValid() ? e.id() : 0; + }; + pt["atMouse"] = [worldPtr, inputPtr]() -> u32 { + ECS::World* world = worldPtr ? *worldPtr : nullptr; + Input::InputManager* input = inputPtr ? *inputPtr : nullptr; + if (!world || !input) return 0; + const auto pos = input->mousePosition(); + const Vec2 w = Scene::PlayRenderContext::instance().screenToWorld(pos); + ECS::Entity e = Scene::pickEntityAtWorld(*world, w); + return e.isValid() ? e.id() : 0; + }; + pt["screenToWorld"] = [&lua](f32 sx, f32 sy) -> sol::table { + sol::table t = lua.create_table(); + const Vec2 w = Scene::PlayRenderContext::instance().screenToWorld({sx, sy}); + t["x"] = w.x; + t["y"] = w.y; + return t; + }; + pt["register"] = [](sol::protected_function fn) -> u32 { + return Scene::PickQueryRegistry::instance().registerScriptPicker( + [fn](Vec2 worldPos, u32& outId, f32& outDistSq) -> bool { + sol::protected_function_result result = fn(worldPos.x, worldPos.y); + if (!result.valid()) return false; + sol::object ret = result; + if (ret.is() && !ret.as()) return false; + if (ret.is()) { + outId = ret.as(); + outDistSq = 0.0f; + return true; + } + if (ret.is()) { + const int v = ret.as(); + if (v <= 0) return false; + outId = static_cast(v); + outDistSq = 0.0f; + return true; + } + return false; + }); + }; + pt["unregister"] = [](u32 handle) { + Scene::PickQueryRegistry::instance().unregisterPicker(handle); + }; + pt["query"] = [&lua, worldPtr](f32 wx, f32 wy) -> sol::table { + sol::table t = lua.create_table(); + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!world) return t; + const Scene::PickHit hit = Scene::PickQueryRegistry::instance().pickAtWorld(*world, {wx, wy}); + if (hit.kind == Scene::PickHit::Kind::Entity) { + t["kind"] = "entity"; + t["entityId"] = hit.entity.id(); + } else if (hit.kind == Scene::PickHit::Kind::Custom) { + t["kind"] = "custom"; + t["customId"] = hit.customId; + } else { + t["kind"] = "none"; + } + return t; + }; + pt["raycast"] = [worldPtr, searchRoot](sol::table origin, sol::table dir) -> u32 { + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!world) return 0; + const Vec3 o{origin["x"].get_or(0.0f), origin["y"].get_or(0.0f), origin["z"].get_or(0.0f)}; + const Vec3 d{dir["x"].get_or(0.0f), dir["y"].get_or(0.0f), dir["z"].get_or(1.0f)}; + const std::string root = searchRoot ? *searchRoot : std::string(); + ECS::Entity hit = Scene::raycastSelectEntity(o, d.normalized(), *world, root); + return hit.isValid() ? hit.id() : 0; + }; + + lua["caffeine"]["draw2d"] = lua.create_table(); + sol::table dt = lua["caffeine"]["draw2d"]; + dt["beginFrame"] = []() { Render::Overlay2D::beginFrame(); }; + dt["line"] = [](sol::table a, sol::table b, sol::table color, sol::optional thickness, + sol::optional space) { + Render::Overlay2D::line(vec2FromTable(a), vec2FromTable(b), colorFromTable(color), + thickness.value_or(1.0f), + spaceFromString(space.value_or("world"))); + }; + dt["circle"] = [](sol::table center, f32 radius, sol::table color, sol::optional thickness, + sol::optional space) { + Render::Overlay2D::circle(vec2FromTable(center), radius, colorFromTable(color), + thickness.value_or(1.0f), 32, + spaceFromString(space.value_or("world"))); + }; + dt["rect"] = [](sol::table min, sol::table max, sol::table color, sol::optional thickness, + sol::optional space) { + Render::Overlay2D::rect(vec2FromTable(min), vec2FromTable(max), colorFromTable(color), + thickness.value_or(1.0f), spaceFromString(space.value_or("world"))); + }; + dt["poly"] = [](sol::table points, sol::table color, sol::optional closed, + sol::optional thickness, sol::optional space) { + std::vector verts; + points.for_each([&](sol::object, sol::object value) { + if (value.is()) verts.push_back(vec2FromTable(value.as())); + }); + if (verts.size() < 2) return; + Render::Overlay2D::polyline(verts.data(), static_cast(verts.size()), colorFromTable(color), + thickness.value_or(1.0f), closed.value_or(false), + spaceFromString(space.value_or("world"))); + }; + + lua["caffeine"]["assets"] = lua.create_table(); + sol::table at = lua["caffeine"]["assets"]; + at["loadText"] = [&lua, assetLoader](const std::string& path) -> sol::object { + if (!assetLoader) return sol::lua_nil; + std::string text; + std::string err; + if (!assetLoader->loadCached(path, text, &err)) { + return sol::make_object(lua, err); + } + return sol::make_object(lua, text); + }; + + lua["caffeine"]["native"] = lua.create_table(); + sol::table nt = lua["caffeine"]["native"]; + nt["load"] = [](const std::string& name) { + std::string err; + return NativeModuleHost::instance().load(name, &err); + }; + nt["call"] = [&lua](const std::string& module, const std::string& fn, + sol::optional argsJson) -> sol::object { + std::string err; + std::string result; + const std::string args = argsJson.value_or("{}"); + if (!NativeModuleHost::instance().call(module, fn, args, result, &err)) { + return sol::make_object(lua, err); + } + return sol::make_object(lua, result); + }; + + lua["caffeine"]["map"] = lua.create_table(); + sol::table mt = lua["caffeine"]["map"]; + mt["onChunkRequest"] = [&lua](sol::protected_function fn) -> u32 { + sol::table et = lua["caffeine"]["events"]; + return et["on"]("mapChunkRequest", fn); + }; + + sol::table uit = lua["caffeine"]["ui"]; + uit["createCanvas"] = [uiPtr, worldPtr](sol::optional w, sol::optional h) -> u32 { + UI::UISystem* ui = uiPtr ? *uiPtr : nullptr; + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!ui || !world) return 0; + ECS::Entity e = ui->createCanvas(*world, {w.value_or(1280.0f), h.value_or(720.0f)}); + return e.id(); + }; + uit["createLabel"] = [uiPtr, worldPtr](u32 parentId, const std::string& text, sol::table pos) -> u32 { + UI::UISystem* ui = uiPtr ? *uiPtr : nullptr; + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!ui || !world) return 0; + ECS::Entity e = ui->createLabel(*world, parentId, text.c_str(), vec2FromTable(pos)); + return e.id(); + }; + uit["createButton"] = [uiPtr, worldPtr](u32 parentId, const std::string& text, sol::table pos, + sol::optional w, sol::optional h) -> u32 { + UI::UISystem* ui = uiPtr ? *uiPtr : nullptr; + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!ui || !world) return 0; + ECS::Entity e = ui->createButton(*world, parentId, text.c_str(), vec2FromTable(pos), + {w.value_or(120.0f), h.value_or(40.0f)}); + return e.id(); + }; + uit["hitTest"] = [uiPtr, worldPtr](f32 sx, f32 sy) -> u32 { + UI::UISystem* ui = uiPtr ? *uiPtr : nullptr; + ECS::World* world = worldPtr ? *worldPtr : nullptr; + if (!ui || !world) return 0; + ECS::Entity e = ui->hitTest(*world, {sx, sy}); + return e.isValid() ? e.id() : 0; + }; + + if (loadModuleFn) { + lua["require"] = [loadModuleFn](const std::string& name) -> sol::object { + std::string err; + const std::string path = moduleNameToPath(name); + if (!loadModuleFn(path, &err)) { + throw sol::error("require('" + name + "') failed: " + err); + } + return sol::lua_nil; + }; + lua["caffeine"]["require"] = lua["require"]; + } +} + +} // namespace Caffeine::Script diff --git a/src/script/RuntimeScriptBindings.hpp b/src/script/RuntimeScriptBindings.hpp new file mode 100644 index 00000000..d9266195 --- /dev/null +++ b/src/script/RuntimeScriptBindings.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include +#include + +namespace sol { +class state; +} + +namespace Caffeine { namespace Input { class InputManager; } } +namespace Caffeine { namespace UI { class UISystem; } } +namespace Caffeine { namespace ECS { class World; } } + +namespace Caffeine::Script { + +class AssetTextLoader; + +void registerRuntimeScriptBindings( + sol::state& lua, ECS::World** worldPtr, Input::InputManager** inputPtr, UI::UISystem** uiPtr, + AssetTextLoader* assetLoader, const std::string* searchRoot, + const std::function& loadModuleFn); + +} // namespace Caffeine::Script diff --git a/src/script/ScriptEngine.cpp b/src/script/ScriptEngine.cpp index 02e7e7fe..3a58d3bc 100644 --- a/src/script/ScriptEngine.cpp +++ b/src/script/ScriptEngine.cpp @@ -1,4 +1,6 @@ #include "script/ScriptEngine.hpp" +#include "script/NativeModuleHost.hpp" +#include "events/Events.hpp" #include "script/ScriptTypes.hpp" #include "ecs/World.hpp" #include "ecs/ComponentQuery.hpp" @@ -10,6 +12,8 @@ #include "math/Quat.hpp" #include "physics/PhysicsComponents2D.hpp" #include "ui/UIComponents.hpp" +#include "script/AssetTextLoader.hpp" +#include "script/RuntimeScriptBindings.hpp" #include "containers/HashMap.hpp" #include "containers/Vector.hpp" @@ -36,9 +40,11 @@ struct ScriptEngine::Impl { ECS::World* m_world = nullptr; Input::InputManager* m_input = nullptr; Events::EventBus* m_events = nullptr; + UI::UISystem* m_ui = nullptr; HashMap m_envs; std::string m_searchRoot; + AssetTextLoader m_assetText; struct LuaEventEntry { std::string eventName; @@ -542,6 +548,7 @@ bool ScriptEngine::init(const InitParams& params) { m_impl->m_world = params.world; m_impl->m_input = params.input; m_impl->m_events = params.events; + m_impl->m_ui = params.ui; auto& lua = m_impl->m_lua; @@ -631,6 +638,33 @@ bool ScriptEngine::init(const InitParams& params) { registerEffectScriptBindings(lua, &m_impl->m_world); registerNavigationScriptBindings(lua, &m_impl->m_world); + registerRuntimeScriptBindings( + lua, &m_impl->m_world, &m_impl->m_input, &m_impl->m_ui, &m_impl->m_assetText, + &m_impl->m_searchRoot, + [this](const std::string& path, std::string* err) { return loadScriptAs(path, path, err); }); + + if (m_impl->m_events) { + m_impl->m_events->subscribe( + [impl = m_impl.get()](const Events::OnMapSurfaceChunkRequest& e) { + sol::table payload = impl->m_lua.create_table(); + payload["surfaceEntityId"] = e.surfaceEntityId; + payload["chunkX"] = e.chunkX; + payload["chunkY"] = e.chunkY; + payload["worldMinX"] = e.worldMinX; + payload["worldMinY"] = e.worldMinY; + payload["chunkSize"] = e.chunkSize; + for (usize i = 0; i < impl->m_luaEvents.size(); ++i) { + auto& entry = impl->m_luaEvents[i]; + if (entry.eventName != "mapChunkRequest") continue; + auto result = entry.callback(payload); + if (!result.valid()) { + sol::error err = result; + CF_ERROR("Lua", "mapChunkRequest handler error: %s", err.what()); + } + } + }); + } + { sol::table pt = lua["caffeine"]["particles"]; auto* impl = m_impl.get(); @@ -691,6 +725,8 @@ void ScriptEngine::setInput(Input::InputManager* input) { void ScriptEngine::setSearchRoot(const std::string& root) { m_impl->m_searchRoot = root; + m_impl->m_assetText.setSearchRoot(root); + Script::NativeModuleHost::instance().setSearchRoot(root); } std::vector ScriptEngine::listExposedVars(const std::string& path) { @@ -848,6 +884,21 @@ bool ScriptEngine::callOnCreate(const std::string& path, ECS::Entity entity) { return true; } +bool ScriptEngine::callOnFixedUpdate(const std::string& path, ECS::Entity entity, f32 fixedDt) { + auto* envPtr = m_impl->m_envs.get(path); + if (!envPtr) return false; + sol::protected_function fn = (*envPtr)["onFixedUpdate"]; + if (!fn.valid()) return false; + + auto result = fn(static_cast(entity.id()), fixedDt); + if (!result.valid()) { + sol::error err = result; + CF_ERROR("Lua", "onFixedUpdate error: %s", err.what()); + return false; + } + return true; +} + bool ScriptEngine::callOnUpdate(const std::string& path, ECS::Entity entity, f32 dt) { auto* envPtr = m_impl->m_envs.get(path); diff --git a/src/script/ScriptEngine.hpp b/src/script/ScriptEngine.hpp index 47ffe582..6795b8ce 100644 --- a/src/script/ScriptEngine.hpp +++ b/src/script/ScriptEngine.hpp @@ -9,6 +9,7 @@ namespace Caffeine { namespace Input { class InputManager; } } namespace Caffeine { namespace Events { class EventBus; } } +namespace Caffeine { namespace UI { class UISystem; } } namespace Caffeine::Script { @@ -24,6 +25,7 @@ class ScriptEngine { ECS::World* world = nullptr; Input::InputManager* input = nullptr; Events::EventBus* events = nullptr; + UI::UISystem* ui = nullptr; }; bool init(const InitParams& params); @@ -55,6 +57,7 @@ class ScriptEngine { // Lifecycle calls bool callOnCreate(const std::string& path, ECS::Entity entity); bool callOnUpdate(const std::string& path, ECS::Entity entity, f32 dt); + bool callOnFixedUpdate(const std::string& path, ECS::Entity entity, f32 fixedDt); bool callOnDestroy(const std::string& path, ECS::Entity entity); bool callOnCollision(const std::string& path, ECS::Entity entity, ECS::Entity other); diff --git a/src/script/ScriptSystem.cpp b/src/script/ScriptSystem.cpp index 0bc18560..ea97d4da 100644 --- a/src/script/ScriptSystem.cpp +++ b/src/script/ScriptSystem.cpp @@ -5,21 +5,41 @@ #include "ecs/PostProcessComponents.hpp" #include "ecs/ComponentQuery.hpp" #include "debug/LogSystem.hpp" +#include "render/Overlay2D.hpp" +#include "runtime/GameStateStack.hpp" +#include "runtime/PlayClock.hpp" +#include "scene/MapSurfaceSystem.hpp" +#include "scene/PickQuery.hpp" +#include "scene/PlayMode2D.hpp" +#include "scene/SpriteLod2DSystem.hpp" +#include "events/EventBus.hpp" namespace Caffeine::Script { -ScriptSystem::ScriptSystem(ScriptEngine* engine) - : m_engine(engine) {} +ScriptSystem::ScriptSystem(ScriptEngine* engine, Events::EventBus* eventBus) + : m_engine(engine), m_events(eventBus) {} void ScriptSystem::resetPlayState() { m_initializedLua.clear(); m_initializedNative.clear(); m_initializedPostProcess.clear(); m_warnedNoLua = false; + Scene::PickQueryRegistry::instance().clear(); + Scene::resetMapSurfaceChunkRequestCache(); + Runtime::PlayClock::instance().reset(); + Runtime::GameStateStack::instance().clear(); + Render::Overlay2D::beginFrame(); } void ScriptSystem::onUpdate(ECS::World& world, f32 dt) { if (!m_engine) return; + Runtime::PlayClock::instance().advance(dt); + Render::Overlay2D::beginFrame(); + if (m_events && Scene::PlayRenderContext::instance().has2D()) { + const auto& cam = Scene::PlayRenderContext::instance().camera2D(); + Scene::applySpriteLod2D(world, cam.zoom()); + Scene::tickMapSurfaceChunkRequests(world, *m_events, &cam, true); + } processLuaScripts(world, dt); processNativeScripts(world, dt); processCppScripts(world, dt); @@ -78,7 +98,13 @@ void ScriptSystem::processLuaScripts(ECS::World& world, f32 dt) { m_initializedLua.pushBack(entity); } - m_engine->callOnUpdate(path, entity, dt); + m_engine->callOnUpdate(path, entity, Runtime::PlayClock::instance().deltaTime()); + + const f32 fixedDt = Runtime::PlayClock::instance().fixedDeltaTime(); + const int fixedSteps = Runtime::PlayClock::instance().consumeFixedSteps(); + for (int step = 0; step < fixedSteps; ++step) { + m_engine->callOnFixedUpdate(path, entity, fixedDt); + } } } diff --git a/src/script/ScriptSystem.hpp b/src/script/ScriptSystem.hpp index 885e92d0..0fd99b41 100644 --- a/src/script/ScriptSystem.hpp +++ b/src/script/ScriptSystem.hpp @@ -6,11 +6,13 @@ #include "containers/Vector.hpp" #include "script/ScriptEngine.hpp" +namespace Caffeine { namespace Events { class EventBus; } } + namespace Caffeine::Script { class ScriptSystem : public ECS::ISystem { public: - explicit ScriptSystem(ScriptEngine* engine); + explicit ScriptSystem(ScriptEngine* engine, Events::EventBus* eventBus = nullptr); void onUpdate(ECS::World& world, f32 dt) override; void resetPlayState(); @@ -21,7 +23,8 @@ class ScriptSystem : public ECS::ISystem { void processCppScripts(ECS::World& world, f32 dt); void processPostProcessScripts(ECS::World& world, f32 dt); - ScriptEngine* m_engine; + ScriptEngine* m_engine = nullptr; + Events::EventBus* m_events = nullptr; Vector m_initializedLua; Vector m_initializedNative; Vector m_initializedPostProcess; diff --git a/src/spatial/SpatialGrid2D.hpp b/src/spatial/SpatialGrid2D.hpp new file mode 100644 index 00000000..8dea1a5b --- /dev/null +++ b/src/spatial/SpatialGrid2D.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include "core/Types.hpp" +#include "math/Vec2.hpp" + +#include +#include +#include +#include + +namespace Caffeine::Spatial { + +/// Optional uniform grid for 2D radius / AABB queries. +template +class SpatialGrid2D { +public: + explicit SpatialGrid2D(f32 cellSize = 16.0f) : m_cellSize(std::max(0.25f, cellSize)) {} + + void clear() { m_cells.clear(); } + + void insert(T id, Vec2 position) { + const auto key = cellKey(position); + m_cells[key].push_back(id); + } + + void queryRadius(Vec2 center, f32 radius, const std::function& fn) const { + if (!fn) return; + const f32 r = std::max(0.0f, radius); + const int minCx = static_cast(std::floor((center.x - r) / m_cellSize)); + const int maxCx = static_cast(std::floor((center.x + r) / m_cellSize)); + const int minCy = static_cast(std::floor((center.y - r) / m_cellSize)); + const int maxCy = static_cast(std::floor((center.y + r) / m_cellSize)); + for (int cy = minCy; cy <= maxCy; ++cy) { + for (int cx = minCx; cx <= maxCx; ++cx) { + const auto it = m_cells.find(pack(cx, cy)); + if (it == m_cells.end()) continue; + for (const T& id : it->second) fn(id); + } + } + } + + f32 cellSize() const { return m_cellSize; } + +private: + static u64 pack(int cx, int cy) { + return (static_cast(static_cast(cx)) << 32) | + static_cast(cy); + } + + std::pair cellKey(Vec2 p) const { + return {static_cast(std::floor(p.x / m_cellSize)), + static_cast(std::floor(p.y / m_cellSize))}; + } + + f32 m_cellSize; + std::unordered_map> m_cells; +}; + +} // namespace Caffeine::Spatial diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5d10648d..2f7952cd 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -24,6 +24,7 @@ set(CAFFEINE_TEST_SOURCES test_forward_render_features.cpp test_material.cpp test_ui.cpp + test_pick_query.cpp test_animation.cpp test_navigation.cpp test_effects.cpp diff --git a/tests/test_pick_query.cpp b/tests/test_pick_query.cpp new file mode 100644 index 00000000..18e2e88d --- /dev/null +++ b/tests/test_pick_query.cpp @@ -0,0 +1,42 @@ +#include "catch.hpp" + +#include "../src/ecs/World.hpp" +#include "../src/ecs/Components.hpp" +#include "../src/render/Camera2D.hpp" +#include "../src/scene/PickQuery.hpp" + +#include + +using namespace Caffeine; +using namespace Caffeine::ECS; +using namespace Caffeine::Scene; + +TEST_CASE("PickQuery - picks closest transform in world", "[pick]") { + World world; + Entity a = world.create("A"); + world.add(a, Transform{{0.0f, 0.0f, 0.0f}, {0, 0, 0}, {1, 1, 1}}); + + Entity b = world.create("B"); + world.add(b, Transform{{5.0f, 0.0f, 0.0f}, {0, 0, 0}, {1, 1, 1}}); + + Entity hit = pickEntityAtWorld(world, {0.1f, 0.1f}); + REQUIRE(hit.isValid()); + REQUIRE(hit.id() == a.id()); + + hit = pickEntityAtWorld(world, {5.0f, 0.0f}); + REQUIRE(hit.isValid()); + REQUIRE(hit.id() == b.id()); +} + +TEST_CASE("PickQuery - screen to world uses PlayRenderContext", "[pick]") { + PlayRenderContext::instance().clear(); + Render::Camera2D cam; + cam.setViewport({{0, 0}, {800, 600}}); + cam.setPosition({10.0f, 20.0f}); + cam.setZoom(2.0f); + PlayRenderContext::instance().set2D({{0, 0}, {800, 600}}, cam); + + const Vec2 w = PlayRenderContext::instance().screenToWorld({400, 300}); + REQUIRE(std::fabs(w.x - 10.0f) < 0.05f); + REQUIRE(std::fabs(w.y - 20.0f) < 0.05f); +} From 466fb1f3c2cb4f97f878dad173c2b43a3b01ad0f Mon Sep 17 00:00:00 2001 From: lyeepedro Date: Thu, 15 Oct 2026 17:20:03 +0100 Subject: [PATCH 7/9] Move documentation to caffeine-website submodule and slim the engine repo. Add AGENTS.md, docs MCP config, and remove in-tree docs, planning, and tracked node_modules. Co-authored-by: Cursor --- .cursor/mcp.json | 9 + .cursor/rules/engine-docs-policy.mdc | 10 + .gitignore | 9 + .gitmodules | 3 + .planning/CAFFEINE_STATUS_REPORT.md | 287 - AGENTS.md | 55 + BUILD_CHECKLIST.md | 181 - BUILD_GUIDE.md | 472 - CHANGELOG.md | 636 -- README.md | 102 +- SESSION_SUMMARY.md | 234 - .../node_modules/.bin/esbuild | 55 - .../node_modules/.bin/mime | 1 - .../node_modules/.ignored/esbuild/LICENSE.md | 21 - .../node_modules/.ignored/esbuild/README.md | 3 - .../node_modules/.ignored/esbuild/bin/esbuild | 222 - .../node_modules/.ignored/esbuild/install.js | 287 - .../.ignored/esbuild/lib/main.d.ts | 705 -- .../node_modules/.ignored/esbuild/lib/main.js | 2245 ----- .../.ignored/esbuild/package.json | 48 - .../node_modules/.ignored/express/History.md | 3683 ------- .../node_modules/.ignored/express/LICENSE | 24 - .../node_modules/.ignored/express/Readme.md | 260 - .../node_modules/.ignored/express/index.js | 11 - .../.ignored/express/lib/application.js | 661 -- .../.ignored/express/lib/express.js | 116 - .../.ignored/express/lib/middleware/init.js | 43 - .../.ignored/express/lib/middleware/query.js | 47 - .../.ignored/express/lib/request.js | 525 - .../.ignored/express/lib/response.js | 1179 --- .../.ignored/express/lib/router/index.js | 673 -- .../.ignored/express/lib/router/layer.js | 181 - .../.ignored/express/lib/router/route.js | 230 - .../.ignored/express/lib/utils.js | 304 - .../node_modules/.ignored/express/lib/view.js | 182 - .../.ignored/express/package.json | 102 - .../.ignored/simplex-noise/LICENSE | 21 - .../.ignored/simplex-noise/README.md | 220 - .../simplex-noise/dist/cjs/simplex-noise.d.ts | 59 - .../simplex-noise/dist/cjs/simplex-noise.js | 473 - .../dist/cjs/simplex-noise.js.map | 1 - .../simplex-noise/dist/esm/package.json | 1 - .../simplex-noise/dist/esm/simplex-noise.d.ts | 59 - .../simplex-noise/dist/esm/simplex-noise.js | 466 - .../dist/esm/simplex-noise.js.map | 1 - .../.ignored/simplex-noise/package.json | 83 - .../.ignored/simplex-noise/simplex-noise.ts | 500 - .../node_modules/.modules.yaml | 252 - .../node_modules/.package-lock.json | 889 -- .../node_modules/.package-map.json | 1 - .../.pnpm-workspace-state-v1.json | 41 - .../node_modules/@esbuild/linux-x64/README.md | 3 - .../@esbuild/linux-x64/bin/esbuild | Bin 10182808 -> 0 bytes .../@esbuild/linux-x64/package.json | 20 - .../node_modules/accepts/HISTORY.md | 243 - .../node_modules/accepts/LICENSE | 23 - .../node_modules/accepts/README.md | 140 - .../node_modules/accepts/index.js | 238 - .../node_modules/accepts/package.json | 47 - .../accepts@1.3.8/node_modules/mime-types | 1 - .../accepts@1.3.8/node_modules/negotiator | 1 - .../node_modules/array-flatten/LICENSE | 21 - .../node_modules/array-flatten/README.md | 43 - .../array-flatten/array-flatten.js | 64 - .../node_modules/array-flatten/package.json | 39 - .../node_modules/body-parser/HISTORY.md | 703 -- .../node_modules/body-parser/LICENSE | 23 - .../node_modules/body-parser/README.md | 476 - .../node_modules/body-parser/index.js | 156 - .../node_modules/body-parser/lib/read.js | 205 - .../body-parser/lib/types/json.js | 247 - .../node_modules/body-parser/lib/types/raw.js | 105 - .../body-parser/lib/types/text.js | 125 - .../body-parser/lib/types/urlencoded.js | 303 - .../node_modules/body-parser/package.json | 55 - .../body-parser@1.20.8/node_modules/bytes | 1 - .../node_modules/content-type | 1 - .../body-parser@1.20.8/node_modules/debug | 1 - .../body-parser@1.20.8/node_modules/depd | 1 - .../body-parser@1.20.8/node_modules/destroy | 1 - .../node_modules/http-errors | 1 - .../node_modules/iconv-lite | 1 - .../node_modules/on-finished | 1 - .../.pnpm/body-parser@1.20.8/node_modules/qs | 1 - .../body-parser@1.20.8/node_modules/raw-body | 1 - .../body-parser@1.20.8/node_modules/type-is | 1 - .../body-parser@1.20.8/node_modules/unpipe | 1 - .../bytes@3.1.2/node_modules/bytes/History.md | 97 - .../bytes@3.1.2/node_modules/bytes/LICENSE | 23 - .../bytes@3.1.2/node_modules/bytes/Readme.md | 152 - .../bytes@3.1.2/node_modules/bytes/index.js | 170 - .../node_modules/bytes/package.json | 42 - .../call-bind-apply-helpers/.eslintrc | 17 - .../.github/FUNDING.yml | 12 - .../call-bind-apply-helpers/.nycrc | 9 - .../call-bind-apply-helpers/CHANGELOG.md | 30 - .../call-bind-apply-helpers/LICENSE | 21 - .../call-bind-apply-helpers/README.md | 62 - .../call-bind-apply-helpers/actualApply.d.ts | 1 - .../call-bind-apply-helpers/actualApply.js | 10 - .../call-bind-apply-helpers/applyBind.d.ts | 19 - .../call-bind-apply-helpers/applyBind.js | 10 - .../functionApply.d.ts | 1 - .../call-bind-apply-helpers/functionApply.js | 4 - .../call-bind-apply-helpers/functionCall.d.ts | 1 - .../call-bind-apply-helpers/functionCall.js | 4 - .../call-bind-apply-helpers/index.d.ts | 64 - .../call-bind-apply-helpers/index.js | 15 - .../call-bind-apply-helpers/package.json | 85 - .../call-bind-apply-helpers/reflectApply.d.ts | 3 - .../call-bind-apply-helpers/reflectApply.js | 4 - .../call-bind-apply-helpers/test/index.js | 63 - .../call-bind-apply-helpers/tsconfig.json | 9 - .../node_modules/es-errors | 1 - .../node_modules/function-bind | 1 - .../node_modules/call-bind-apply-helpers | 1 - .../node_modules/call-bound/.eslintrc | 13 - .../call-bound/.github/FUNDING.yml | 12 - .../node_modules/call-bound/.nycrc | 9 - .../node_modules/call-bound/CHANGELOG.md | 42 - .../node_modules/call-bound/LICENSE | 21 - .../node_modules/call-bound/README.md | 53 - .../node_modules/call-bound/index.d.ts | 94 - .../node_modules/call-bound/index.js | 19 - .../node_modules/call-bound/package.json | 99 - .../node_modules/call-bound/test/index.js | 61 - .../node_modules/call-bound/tsconfig.json | 10 - .../node_modules/get-intrinsic | 1 - .../content-disposition/HISTORY.md | 60 - .../node_modules/content-disposition/LICENSE | 22 - .../content-disposition/README.md | 142 - .../node_modules/content-disposition/index.js | 458 - .../content-disposition/package.json | 44 - .../node_modules/safe-buffer | 1 - .../node_modules/content-type/HISTORY.md | 29 - .../node_modules/content-type/LICENSE | 22 - .../node_modules/content-type/README.md | 94 - .../node_modules/content-type/index.js | 225 - .../node_modules/content-type/package.json | 42 - .../node_modules/cookie-signature/History.md | 42 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 51 - .../cookie-signature/package.json | 18 - .../cookie@0.7.2/node_modules/cookie/LICENSE | 24 - .../node_modules/cookie/README.md | 317 - .../node_modules/cookie/SECURITY.md | 25 - .../cookie@0.7.2/node_modules/cookie/index.js | 335 - .../node_modules/cookie/package.json | 44 - .../node_modules/debug/.coveralls.yml | 1 - .../debug@2.6.9/node_modules/debug/.eslintrc | 11 - .../debug@2.6.9/node_modules/debug/.npmignore | 9 - .../node_modules/debug/.travis.yml | 14 - .../node_modules/debug/CHANGELOG.md | 362 - .../debug@2.6.9/node_modules/debug/LICENSE | 19 - .../debug@2.6.9/node_modules/debug/README.md | 312 - .../node_modules/debug/component.json | 19 - .../node_modules/debug/karma.conf.js | 70 - .../debug@2.6.9/node_modules/debug/node.js | 1 - .../node_modules/debug/package.json | 49 - .../node_modules/debug/src/browser.js | 185 - .../node_modules/debug/src/debug.js | 202 - .../node_modules/debug/src/index.js | 10 - .../node_modules/debug/src/inspector-log.js | 15 - .../node_modules/debug/src/node.js | 248 - .../.pnpm/debug@2.6.9/node_modules/ms | 1 - .../depd@2.0.0/node_modules/depd/History.md | 103 - .../depd@2.0.0/node_modules/depd/LICENSE | 22 - .../depd@2.0.0/node_modules/depd/Readme.md | 280 - .../depd@2.0.0/node_modules/depd/index.js | 538 -- .../node_modules/depd/lib/browser/index.js | 77 - .../depd@2.0.0/node_modules/depd/package.json | 45 - .../node_modules/destroy/LICENSE | 23 - .../node_modules/destroy/README.md | 63 - .../node_modules/destroy/index.js | 209 - .../node_modules/destroy/package.json | 48 - .../node_modules/call-bind-apply-helpers | 1 - .../node_modules/dunder-proto/.eslintrc | 5 - .../dunder-proto/.github/FUNDING.yml | 12 - .../node_modules/dunder-proto/.nycrc | 13 - .../node_modules/dunder-proto/CHANGELOG.md | 24 - .../node_modules/dunder-proto/LICENSE | 21 - .../node_modules/dunder-proto/README.md | 54 - .../node_modules/dunder-proto/get.d.ts | 5 - .../node_modules/dunder-proto/get.js | 30 - .../node_modules/dunder-proto/package.json | 76 - .../node_modules/dunder-proto/set.d.ts | 5 - .../node_modules/dunder-proto/set.js | 35 - .../node_modules/dunder-proto/test/get.js | 34 - .../node_modules/dunder-proto/test/index.js | 4 - .../node_modules/dunder-proto/test/set.js | 50 - .../node_modules/dunder-proto/tsconfig.json | 9 - .../dunder-proto@1.0.1/node_modules/es-errors | 1 - .../dunder-proto@1.0.1/node_modules/gopd | 1 - .../node_modules/ee-first/LICENSE | 22 - .../node_modules/ee-first/README.md | 80 - .../node_modules/ee-first/index.js | 95 - .../node_modules/ee-first/package.json | 29 - .../node_modules/encodeurl/LICENSE | 22 - .../node_modules/encodeurl/README.md | 109 - .../node_modules/encodeurl/index.js | 60 - .../node_modules/encodeurl/package.json | 40 - .../node_modules/es-define-property/.eslintrc | 13 - .../es-define-property/.github/FUNDING.yml | 12 - .../node_modules/es-define-property/.nycrc | 9 - .../es-define-property/CHANGELOG.md | 29 - .../node_modules/es-define-property/LICENSE | 21 - .../node_modules/es-define-property/README.md | 49 - .../es-define-property/index.d.ts | 3 - .../node_modules/es-define-property/index.js | 14 - .../es-define-property/package.json | 81 - .../es-define-property/test/index.js | 56 - .../es-define-property/tsconfig.json | 10 - .../node_modules/es-errors/.eslintrc | 5 - .../es-errors/.github/FUNDING.yml | 12 - .../node_modules/es-errors/CHANGELOG.md | 40 - .../node_modules/es-errors/LICENSE | 21 - .../node_modules/es-errors/README.md | 55 - .../node_modules/es-errors/eval.d.ts | 3 - .../node_modules/es-errors/eval.js | 4 - .../node_modules/es-errors/index.d.ts | 3 - .../node_modules/es-errors/index.js | 4 - .../node_modules/es-errors/package.json | 80 - .../node_modules/es-errors/range.d.ts | 3 - .../node_modules/es-errors/range.js | 4 - .../node_modules/es-errors/ref.d.ts | 3 - .../node_modules/es-errors/ref.js | 4 - .../node_modules/es-errors/syntax.d.ts | 3 - .../node_modules/es-errors/syntax.js | 4 - .../node_modules/es-errors/test/index.js | 19 - .../node_modules/es-errors/tsconfig.json | 49 - .../node_modules/es-errors/type.d.ts | 3 - .../node_modules/es-errors/type.js | 4 - .../node_modules/es-errors/uri.d.ts | 3 - .../node_modules/es-errors/uri.js | 4 - .../node_modules/es-errors | 1 - .../node_modules/es-object-atoms/.eslintrc | 16 - .../es-object-atoms/.github/FUNDING.yml | 12 - .../node_modules/es-object-atoms/CHANGELOG.md | 44 - .../node_modules/es-object-atoms/LICENSE | 21 - .../node_modules/es-object-atoms/README.md | 63 - .../RequireObjectCoercible.d.ts | 3 - .../es-object-atoms/RequireObjectCoercible.js | 11 - .../es-object-atoms/ToObject.d.ts | 7 - .../node_modules/es-object-atoms/ToObject.js | 10 - .../node_modules/es-object-atoms/index.d.ts | 3 - .../node_modules/es-object-atoms/index.js | 4 - .../es-object-atoms/isObject.d.ts | 3 - .../node_modules/es-object-atoms/isObject.js | 6 - .../node_modules/es-object-atoms/package.json | 79 - .../es-object-atoms/test/index.js | 38 - .../es-object-atoms/tsconfig.json | 7 - .../node_modules/@esbuild/linux-x64 | 1 - .../node_modules/esbuild/LICENSE.md | 21 - .../node_modules/esbuild/README.md | 3 - .../node_modules/esbuild/bin/esbuild | Bin 10182808 -> 0 bytes .../node_modules/esbuild/install.js | 287 - .../node_modules/esbuild/lib/main.d.ts | 705 -- .../node_modules/esbuild/lib/main.js | 2245 ----- .../esbuild/node_modules/.bin/esbuild | 55 - .../node_modules/esbuild/package.json | 48 - .../node_modules/escape-html/LICENSE | 24 - .../node_modules/escape-html/Readme.md | 43 - .../node_modules/escape-html/index.js | 78 - .../node_modules/escape-html/package.json | 24 - .../etag@1.8.1/node_modules/etag/HISTORY.md | 83 - .../etag@1.8.1/node_modules/etag/LICENSE | 22 - .../etag@1.8.1/node_modules/etag/README.md | 159 - .../etag@1.8.1/node_modules/etag/index.js | 131 - .../etag@1.8.1/node_modules/etag/package.json | 47 - .../.pnpm/express@4.22.3/node_modules/accepts | 1 - .../express@4.22.3/node_modules/array-flatten | 1 - .../express@4.22.3/node_modules/body-parser | 1 - .../node_modules/content-disposition | 1 - .../express@4.22.3/node_modules/content-type | 1 - .../.pnpm/express@4.22.3/node_modules/cookie | 1 - .../node_modules/cookie-signature | 1 - .../.pnpm/express@4.22.3/node_modules/debug | 1 - .../.pnpm/express@4.22.3/node_modules/depd | 1 - .../express@4.22.3/node_modules/encodeurl | 1 - .../express@4.22.3/node_modules/escape-html | 1 - .../.pnpm/express@4.22.3/node_modules/etag | 1 - .../node_modules/express/History.md | 3683 ------- .../node_modules/express/LICENSE | 24 - .../node_modules/express/Readme.md | 260 - .../node_modules/express/index.js | 11 - .../node_modules/express/lib/application.js | 661 -- .../node_modules/express/lib/express.js | 116 - .../express/lib/middleware/init.js | 43 - .../express/lib/middleware/query.js | 47 - .../node_modules/express/lib/request.js | 525 - .../node_modules/express/lib/response.js | 1179 --- .../node_modules/express/lib/router/index.js | 673 -- .../node_modules/express/lib/router/layer.js | 181 - .../node_modules/express/lib/router/route.js | 230 - .../node_modules/express/lib/utils.js | 304 - .../node_modules/express/lib/view.js | 182 - .../node_modules/express/package.json | 102 - .../express@4.22.3/node_modules/finalhandler | 1 - .../.pnpm/express@4.22.3/node_modules/fresh | 1 - .../express@4.22.3/node_modules/http-errors | 1 - .../node_modules/merge-descriptors | 1 - .../.pnpm/express@4.22.3/node_modules/methods | 1 - .../express@4.22.3/node_modules/on-finished | 1 - .../express@4.22.3/node_modules/parseurl | 1 - .../node_modules/path-to-regexp | 1 - .../express@4.22.3/node_modules/proxy-addr | 1 - .../.pnpm/express@4.22.3/node_modules/qs | 1 - .../express@4.22.3/node_modules/range-parser | 1 - .../express@4.22.3/node_modules/safe-buffer | 1 - .../.pnpm/express@4.22.3/node_modules/send | 1 - .../express@4.22.3/node_modules/serve-static | 1 - .../node_modules/setprototypeof | 1 - .../express@4.22.3/node_modules/statuses | 1 - .../.pnpm/express@4.22.3/node_modules/type-is | 1 - .../express@4.22.3/node_modules/utils-merge | 1 - .../.pnpm/express@4.22.3/node_modules/vary | 1 - .../finalhandler@1.3.2/node_modules/debug | 1 - .../finalhandler@1.3.2/node_modules/encodeurl | 1 - .../node_modules/escape-html | 1 - .../node_modules/finalhandler/HISTORY.md | 216 - .../node_modules/finalhandler/LICENSE | 22 - .../node_modules/finalhandler/README.md | 147 - .../node_modules/finalhandler/SECURITY.md | 25 - .../node_modules/finalhandler/index.js | 341 - .../node_modules/finalhandler/package.json | 47 - .../node_modules/on-finished | 1 - .../finalhandler@1.3.2/node_modules/parseurl | 1 - .../finalhandler@1.3.2/node_modules/statuses | 1 - .../finalhandler@1.3.2/node_modules/unpipe | 1 - .../node_modules/forwarded/HISTORY.md | 21 - .../node_modules/forwarded/LICENSE | 22 - .../node_modules/forwarded/README.md | 57 - .../node_modules/forwarded/index.js | 90 - .../node_modules/forwarded/package.json | 45 - .../fresh@0.5.2/node_modules/fresh/HISTORY.md | 70 - .../fresh@0.5.2/node_modules/fresh/LICENSE | 23 - .../fresh@0.5.2/node_modules/fresh/README.md | 119 - .../fresh@0.5.2/node_modules/fresh/index.js | 137 - .../node_modules/fresh/package.json | 46 - .../node_modules/function-bind/.eslintrc | 21 - .../function-bind/.github/FUNDING.yml | 12 - .../function-bind/.github/SECURITY.md | 3 - .../node_modules/function-bind/.nycrc | 13 - .../node_modules/function-bind/CHANGELOG.md | 136 - .../node_modules/function-bind/LICENSE | 20 - .../node_modules/function-bind/README.md | 46 - .../function-bind/implementation.js | 84 - .../node_modules/function-bind/index.js | 5 - .../node_modules/function-bind/package.json | 87 - .../node_modules/function-bind/test/.eslintrc | 9 - .../node_modules/function-bind/test/index.js | 252 - .../node_modules/call-bind-apply-helpers | 1 - .../node_modules/es-define-property | 1 - .../node_modules/es-errors | 1 - .../node_modules/es-object-atoms | 1 - .../node_modules/function-bind | 1 - .../node_modules/get-intrinsic/.eslintrc | 42 - .../get-intrinsic/.github/FUNDING.yml | 12 - .../node_modules/get-intrinsic/.nycrc | 9 - .../node_modules/get-intrinsic/CHANGELOG.md | 186 - .../node_modules/get-intrinsic/LICENSE | 21 - .../node_modules/get-intrinsic/README.md | 71 - .../node_modules/get-intrinsic/index.js | 378 - .../node_modules/get-intrinsic/package.json | 97 - .../get-intrinsic/test/GetIntrinsic.js | 274 - .../node_modules/get-proto | 1 - .../get-intrinsic@1.3.0/node_modules/gopd | 1 - .../node_modules/has-symbols | 1 - .../get-intrinsic@1.3.0/node_modules/hasown | 1 - .../node_modules/math-intrinsics | 1 - .../get-proto@1.0.1/node_modules/dunder-proto | 1 - .../node_modules/es-object-atoms | 1 - .../node_modules/get-proto/.eslintrc | 10 - .../get-proto/.github/FUNDING.yml | 12 - .../node_modules/get-proto/.nycrc | 9 - .../node_modules/get-proto/CHANGELOG.md | 21 - .../node_modules/get-proto/LICENSE | 21 - .../get-proto/Object.getPrototypeOf.d.ts | 5 - .../get-proto/Object.getPrototypeOf.js | 6 - .../node_modules/get-proto/README.md | 50 - .../get-proto/Reflect.getPrototypeOf.d.ts | 3 - .../get-proto/Reflect.getPrototypeOf.js | 4 - .../node_modules/get-proto/index.d.ts | 5 - .../node_modules/get-proto/index.js | 27 - .../node_modules/get-proto/package.json | 81 - .../node_modules/get-proto/test/index.js | 68 - .../node_modules/get-proto/tsconfig.json | 9 - .../gopd@1.2.0/node_modules/gopd/.eslintrc | 16 - .../node_modules/gopd/.github/FUNDING.yml | 12 - .../gopd@1.2.0/node_modules/gopd/CHANGELOG.md | 45 - .../gopd@1.2.0/node_modules/gopd/LICENSE | 21 - .../gopd@1.2.0/node_modules/gopd/README.md | 40 - .../gopd@1.2.0/node_modules/gopd/gOPD.d.ts | 1 - .../gopd@1.2.0/node_modules/gopd/gOPD.js | 4 - .../gopd@1.2.0/node_modules/gopd/index.d.ts | 5 - .../gopd@1.2.0/node_modules/gopd/index.js | 15 - .../gopd@1.2.0/node_modules/gopd/package.json | 77 - .../node_modules/gopd/test/index.js | 36 - .../node_modules/gopd/tsconfig.json | 9 - .../node_modules/has-symbols/.eslintrc | 11 - .../has-symbols/.github/FUNDING.yml | 12 - .../node_modules/has-symbols/.nycrc | 9 - .../node_modules/has-symbols/CHANGELOG.md | 91 - .../node_modules/has-symbols/LICENSE | 21 - .../node_modules/has-symbols/README.md | 46 - .../node_modules/has-symbols/index.d.ts | 3 - .../node_modules/has-symbols/index.js | 14 - .../node_modules/has-symbols/package.json | 111 - .../node_modules/has-symbols/shams.d.ts | 3 - .../node_modules/has-symbols/shams.js | 45 - .../node_modules/has-symbols/test/index.js | 22 - .../has-symbols/test/shams/core-js.js | 29 - .../test/shams/get-own-property-symbols.js | 29 - .../node_modules/has-symbols/test/tests.js | 58 - .../node_modules/has-symbols/tsconfig.json | 10 - .../hasown@2.0.4/node_modules/function-bind | 1 - .../node_modules/hasown/.github/FUNDING.yml | 12 - .../hasown@2.0.4/node_modules/hasown/.nycrc | 13 - .../node_modules/hasown/CHANGELOG.md | 58 - .../hasown@2.0.4/node_modules/hasown/LICENSE | 21 - .../node_modules/hasown/README.md | 40 - .../node_modules/hasown/eslint.config.mjs | 6 - .../node_modules/hasown/index.d.ts | 3 - .../hasown@2.0.4/node_modules/hasown/index.js | 8 - .../node_modules/hasown/package.json | 91 - .../node_modules/hasown/tsconfig.json | 6 - .../.pnpm/http-errors@2.0.1/node_modules/depd | 1 - .../node_modules/http-errors/HISTORY.md | 186 - .../node_modules/http-errors/LICENSE | 23 - .../node_modules/http-errors/README.md | 169 - .../node_modules/http-errors/index.js | 290 - .../node_modules/http-errors/package.json | 54 - .../http-errors@2.0.1/node_modules/inherits | 1 - .../node_modules/setprototypeof | 1 - .../http-errors@2.0.1/node_modules/statuses | 1 - .../node_modules/toidentifier | 1 - .../node_modules/iconv-lite/Changelog.md | 162 - .../node_modules/iconv-lite/LICENSE | 21 - .../node_modules/iconv-lite/README.md | 156 - .../iconv-lite/encodings/dbcs-codec.js | 555 -- .../iconv-lite/encodings/dbcs-data.js | 176 - .../iconv-lite/encodings/index.js | 22 - .../iconv-lite/encodings/internal.js | 188 - .../iconv-lite/encodings/sbcs-codec.js | 72 - .../encodings/sbcs-data-generated.js | 451 - .../iconv-lite/encodings/sbcs-data.js | 174 - .../encodings/tables/big5-added.json | 122 - .../iconv-lite/encodings/tables/cp936.json | 264 - .../iconv-lite/encodings/tables/cp949.json | 273 - .../iconv-lite/encodings/tables/cp950.json | 177 - .../iconv-lite/encodings/tables/eucjp.json | 182 - .../encodings/tables/gb18030-ranges.json | 1 - .../encodings/tables/gbk-added.json | 55 - .../iconv-lite/encodings/tables/shiftjis.json | 125 - .../iconv-lite/encodings/utf16.js | 177 - .../node_modules/iconv-lite/encodings/utf7.js | 290 - .../iconv-lite/lib/bom-handling.js | 52 - .../iconv-lite/lib/extend-node.js | 217 - .../node_modules/iconv-lite/lib/index.d.ts | 24 - .../node_modules/iconv-lite/lib/index.js | 153 - .../node_modules/iconv-lite/lib/streams.js | 121 - .../node_modules/iconv-lite/package.json | 46 - .../node_modules/safer-buffer | 1 - .../node_modules/inherits/LICENSE | 16 - .../node_modules/inherits/README.md | 42 - .../node_modules/inherits/inherits.js | 9 - .../node_modules/inherits/inherits_browser.js | 27 - .../node_modules/inherits/package.json | 29 - .../node_modules/ipaddr.js/LICENSE | 19 - .../node_modules/ipaddr.js/README.md | 233 - .../node_modules/ipaddr.js/ipaddr.min.js | 1 - .../node_modules/ipaddr.js/lib/ipaddr.js | 673 -- .../node_modules/ipaddr.js/lib/ipaddr.js.d.ts | 68 - .../node_modules/ipaddr.js/package.json | 35 - .../node_modules/.pnpm/lock.yaml | 850 -- .../node_modules/math-intrinsics/.eslintrc | 16 - .../math-intrinsics/.github/FUNDING.yml | 12 - .../node_modules/math-intrinsics/CHANGELOG.md | 24 - .../node_modules/math-intrinsics/LICENSE | 21 - .../node_modules/math-intrinsics/README.md | 50 - .../node_modules/math-intrinsics/abs.d.ts | 1 - .../node_modules/math-intrinsics/abs.js | 4 - .../constants/maxArrayLength.d.ts | 3 - .../constants/maxArrayLength.js | 4 - .../constants/maxSafeInteger.d.ts | 3 - .../constants/maxSafeInteger.js | 5 - .../math-intrinsics/constants/maxValue.d.ts | 3 - .../math-intrinsics/constants/maxValue.js | 5 - .../node_modules/math-intrinsics/floor.d.ts | 1 - .../node_modules/math-intrinsics/floor.js | 4 - .../math-intrinsics/isFinite.d.ts | 3 - .../node_modules/math-intrinsics/isFinite.js | 12 - .../math-intrinsics/isInteger.d.ts | 3 - .../node_modules/math-intrinsics/isInteger.js | 16 - .../node_modules/math-intrinsics/isNaN.d.ts | 1 - .../node_modules/math-intrinsics/isNaN.js | 6 - .../math-intrinsics/isNegativeZero.d.ts | 3 - .../math-intrinsics/isNegativeZero.js | 6 - .../node_modules/math-intrinsics/max.d.ts | 1 - .../node_modules/math-intrinsics/max.js | 4 - .../node_modules/math-intrinsics/min.d.ts | 1 - .../node_modules/math-intrinsics/min.js | 4 - .../node_modules/math-intrinsics/mod.d.ts | 3 - .../node_modules/math-intrinsics/mod.js | 9 - .../node_modules/math-intrinsics/package.json | 86 - .../node_modules/math-intrinsics/pow.d.ts | 1 - .../node_modules/math-intrinsics/pow.js | 4 - .../node_modules/math-intrinsics/round.d.ts | 1 - .../node_modules/math-intrinsics/round.js | 4 - .../node_modules/math-intrinsics/sign.d.ts | 3 - .../node_modules/math-intrinsics/sign.js | 11 - .../math-intrinsics/test/index.js | 192 - .../math-intrinsics/tsconfig.json | 3 - .../node_modules/media-typer/HISTORY.md | 22 - .../node_modules/media-typer/LICENSE | 22 - .../node_modules/media-typer/README.md | 81 - .../node_modules/media-typer/index.js | 270 - .../node_modules/media-typer/package.json | 26 - .../node_modules/merge-descriptors/HISTORY.md | 21 - .../node_modules/merge-descriptors/LICENSE | 23 - .../node_modules/merge-descriptors/README.md | 49 - .../node_modules/merge-descriptors/index.js | 60 - .../merge-descriptors/package.json | 39 - .../node_modules/methods/HISTORY.md | 29 - .../node_modules/methods/LICENSE | 24 - .../node_modules/methods/README.md | 51 - .../node_modules/methods/index.js | 69 - .../node_modules/methods/package.json | 36 - .../node_modules/mime-db/HISTORY.md | 507 - .../node_modules/mime-db/LICENSE | 23 - .../node_modules/mime-db/README.md | 100 - .../node_modules/mime-db/db.json | 8519 ----------------- .../node_modules/mime-db/index.js | 12 - .../node_modules/mime-db/package.json | 60 - .../mime-types@2.1.35/node_modules/mime-db | 1 - .../node_modules/mime-types/HISTORY.md | 397 - .../node_modules/mime-types/LICENSE | 23 - .../node_modules/mime-types/README.md | 113 - .../node_modules/mime-types/index.js | 188 - .../node_modules/mime-types/package.json | 44 - .../mime@1.6.0/node_modules/mime/.npmignore | 0 .../mime@1.6.0/node_modules/mime/CHANGELOG.md | 164 - .../mime@1.6.0/node_modules/mime/LICENSE | 21 - .../mime@1.6.0/node_modules/mime/README.md | 90 - .../.pnpm/mime@1.6.0/node_modules/mime/cli.js | 8 - .../mime@1.6.0/node_modules/mime/mime.js | 108 - .../node_modules/mime/node_modules/.bin/mime | 55 - .../mime@1.6.0/node_modules/mime/package.json | 44 - .../mime@1.6.0/node_modules/mime/src/build.js | 53 - .../mime@1.6.0/node_modules/mime/src/test.js | 60 - .../mime@1.6.0/node_modules/mime/types.json | 1 - .../.pnpm/ms@2.0.0/node_modules/ms/index.js | 152 - .../.pnpm/ms@2.0.0/node_modules/ms/license.md | 21 - .../ms@2.0.0/node_modules/ms/package.json | 37 - .../.pnpm/ms@2.0.0/node_modules/ms/readme.md | 51 - .../.pnpm/ms@2.1.3/node_modules/ms/index.js | 162 - .../.pnpm/ms@2.1.3/node_modules/ms/license.md | 21 - .../ms@2.1.3/node_modules/ms/package.json | 38 - .../.pnpm/ms@2.1.3/node_modules/ms/readme.md | 59 - .../node_modules/negotiator/HISTORY.md | 108 - .../node_modules/negotiator/LICENSE | 24 - .../node_modules/negotiator/README.md | 203 - .../node_modules/negotiator/index.js | 82 - .../node_modules/negotiator/lib/charset.js | 169 - .../node_modules/negotiator/lib/encoding.js | 184 - .../node_modules/negotiator/lib/language.js | 179 - .../node_modules/negotiator/lib/mediaType.js | 294 - .../node_modules/negotiator/package.json | 42 - .../node_modules/.pnpm/node_modules/.bin/mime | 55 - .../.pnpm/node_modules/@esbuild/linux-x64 | 1 - .../node_modules/.pnpm/node_modules/accepts | 1 - .../.pnpm/node_modules/array-flatten | 1 - .../.pnpm/node_modules/body-parser | 1 - .../node_modules/.pnpm/node_modules/bytes | 1 - .../node_modules/call-bind-apply-helpers | 1 - .../.pnpm/node_modules/call-bound | 1 - .../.pnpm/node_modules/content-disposition | 1 - .../.pnpm/node_modules/content-type | 1 - .../node_modules/.pnpm/node_modules/cookie | 1 - .../.pnpm/node_modules/cookie-signature | 1 - .../node_modules/.pnpm/node_modules/debug | 1 - .../node_modules/.pnpm/node_modules/depd | 1 - .../node_modules/.pnpm/node_modules/destroy | 1 - .../.pnpm/node_modules/dunder-proto | 1 - .../node_modules/.pnpm/node_modules/ee-first | 1 - .../node_modules/.pnpm/node_modules/encodeurl | 1 - .../.pnpm/node_modules/es-define-property | 1 - .../node_modules/.pnpm/node_modules/es-errors | 1 - .../.pnpm/node_modules/es-object-atoms | 1 - .../.pnpm/node_modules/escape-html | 1 - .../node_modules/.pnpm/node_modules/etag | 1 - .../.pnpm/node_modules/finalhandler | 1 - .../node_modules/.pnpm/node_modules/forwarded | 1 - .../node_modules/.pnpm/node_modules/fresh | 1 - .../.pnpm/node_modules/function-bind | 1 - .../.pnpm/node_modules/get-intrinsic | 1 - .../node_modules/.pnpm/node_modules/get-proto | 1 - .../node_modules/.pnpm/node_modules/gopd | 1 - .../.pnpm/node_modules/has-symbols | 1 - .../node_modules/.pnpm/node_modules/hasown | 1 - .../.pnpm/node_modules/http-errors | 1 - .../.pnpm/node_modules/iconv-lite | 1 - .../node_modules/.pnpm/node_modules/inherits | 1 - .../node_modules/.pnpm/node_modules/ipaddr.js | 1 - .../.pnpm/node_modules/math-intrinsics | 1 - .../.pnpm/node_modules/media-typer | 1 - .../.pnpm/node_modules/merge-descriptors | 1 - .../node_modules/.pnpm/node_modules/methods | 1 - .../node_modules/.pnpm/node_modules/mime | 1 - .../node_modules/.pnpm/node_modules/mime-db | 1 - .../.pnpm/node_modules/mime-types | 1 - .../node_modules/.pnpm/node_modules/ms | 1 - .../.pnpm/node_modules/negotiator | 1 - .../.pnpm/node_modules/object-inspect | 1 - .../.pnpm/node_modules/on-finished | 1 - .../node_modules/.pnpm/node_modules/parseurl | 1 - .../.pnpm/node_modules/path-to-regexp | 1 - .../.pnpm/node_modules/proxy-addr | 1 - .../node_modules/.pnpm/node_modules/qs | 1 - .../.pnpm/node_modules/range-parser | 1 - .../node_modules/.pnpm/node_modules/raw-body | 1 - .../.pnpm/node_modules/safe-buffer | 1 - .../.pnpm/node_modules/safer-buffer | 1 - .../node_modules/.pnpm/node_modules/send | 1 - .../.pnpm/node_modules/serve-static | 1 - .../.pnpm/node_modules/setprototypeof | 1 - .../.pnpm/node_modules/side-channel | 1 - .../.pnpm/node_modules/side-channel-list | 1 - .../.pnpm/node_modules/side-channel-map | 1 - .../.pnpm/node_modules/side-channel-weakmap | 1 - .../node_modules/.pnpm/node_modules/statuses | 1 - .../.pnpm/node_modules/toidentifier | 1 - .../node_modules/.pnpm/node_modules/type-is | 1 - .../node_modules/.pnpm/node_modules/unpipe | 1 - .../.pnpm/node_modules/utils-merge | 1 - .../node_modules/.pnpm/node_modules/vary | 1 - .../node_modules/object-inspect/.eslintrc | 53 - .../object-inspect/.github/FUNDING.yml | 12 - .../node_modules/object-inspect/.nycrc | 13 - .../node_modules/object-inspect/CHANGELOG.md | 424 - .../node_modules/object-inspect/LICENSE | 21 - .../object-inspect/example/all.js | 23 - .../object-inspect/example/circular.js | 6 - .../node_modules/object-inspect/example/fn.js | 5 - .../object-inspect/example/inspect.js | 10 - .../node_modules/object-inspect/index.js | 544 -- .../object-inspect/package-support.json | 20 - .../node_modules/object-inspect/package.json | 105 - .../object-inspect/readme.markdown | 84 - .../object-inspect/test-core-js.js | 26 - .../object-inspect/test/bigint.js | 58 - .../object-inspect/test/browser/dom.js | 15 - .../object-inspect/test/circular.js | 16 - .../node_modules/object-inspect/test/deep.js | 12 - .../object-inspect/test/element.js | 53 - .../node_modules/object-inspect/test/err.js | 48 - .../node_modules/object-inspect/test/fakes.js | 29 - .../node_modules/object-inspect/test/fn.js | 76 - .../object-inspect/test/global.js | 17 - .../node_modules/object-inspect/test/has.js | 15 - .../node_modules/object-inspect/test/holes.js | 15 - .../object-inspect/test/indent-option.js | 271 - .../object-inspect/test/inspect.js | 139 - .../object-inspect/test/lowbyte.js | 12 - .../object-inspect/test/number.js | 58 - .../object-inspect/test/quoteStyle.js | 26 - .../object-inspect/test/toStringTag.js | 40 - .../node_modules/object-inspect/test/undef.js | 12 - .../object-inspect/test/values.js | 261 - .../object-inspect/util.inspect.js | 1 - .../on-finished@2.4.1/node_modules/ee-first | 1 - .../node_modules/on-finished/HISTORY.md | 98 - .../node_modules/on-finished/LICENSE | 23 - .../node_modules/on-finished/README.md | 162 - .../node_modules/on-finished/index.js | 234 - .../node_modules/on-finished/package.json | 39 - .../node_modules/parseurl/HISTORY.md | 58 - .../node_modules/parseurl/LICENSE | 24 - .../node_modules/parseurl/README.md | 133 - .../node_modules/parseurl/index.js | 158 - .../node_modules/parseurl/package.json | 40 - .../node_modules/path-to-regexp/LICENSE | 21 - .../node_modules/path-to-regexp/Readme.md | 35 - .../node_modules/path-to-regexp/index.js | 158 - .../node_modules/path-to-regexp/package.json | 30 - .../proxy-addr@2.0.8/node_modules/forwarded | 1 - .../proxy-addr@2.0.8/node_modules/ipaddr.js | 1 - .../node_modules/proxy-addr/HISTORY.md | 167 - .../node_modules/proxy-addr/LICENSE | 22 - .../node_modules/proxy-addr/README.md | 139 - .../node_modules/proxy-addr/index.js | 359 - .../node_modules/proxy-addr/package.json | 51 - .../qs@6.16.0/node_modules/es-define-property | 1 - .../qs@6.16.0/node_modules/qs/.editorconfig | 46 - .../node_modules/qs/.github/FUNDING.yml | 12 - .../node_modules/qs/.github/SECURITY.md | 11 - .../node_modules/qs/.github/THREAT_MODEL.md | 78 - .../.pnpm/qs@6.16.0/node_modules/qs/.nycrc | 13 - .../qs@6.16.0/node_modules/qs/CHANGELOG.md | 848 -- .../qs@6.16.0/node_modules/qs/LICENSE.md | 29 - .../.pnpm/qs@6.16.0/node_modules/qs/README.md | 776 -- .../qs@6.16.0/node_modules/qs/dist/qs.js | 141 - .../node_modules/qs/eslint.config.mjs | 57 - .../qs@6.16.0/node_modules/qs/lib/formats.js | 23 - .../qs@6.16.0/node_modules/qs/lib/index.js | 11 - .../qs@6.16.0/node_modules/qs/lib/parse.js | 413 - .../node_modules/qs/lib/stringify.js | 378 - .../qs@6.16.0/node_modules/qs/lib/utils.js | 388 - .../qs@6.16.0/node_modules/qs/package.json | 95 - .../node_modules/qs/test/empty-keys-cases.js | 267 - .../qs@6.16.0/node_modules/qs/test/parse.js | 2122 ---- .../node_modules/qs/test/stringify.js | 1765 ---- .../qs@6.16.0/node_modules/qs/test/utils.js | 638 -- .../.pnpm/qs@6.16.0/node_modules/side-channel | 1 - .../node_modules/range-parser/HISTORY.md | 56 - .../node_modules/range-parser/LICENSE | 23 - .../node_modules/range-parser/README.md | 84 - .../node_modules/range-parser/index.js | 162 - .../node_modules/range-parser/package.json | 44 - .../.pnpm/raw-body@2.5.3/node_modules/bytes | 1 - .../raw-body@2.5.3/node_modules/http-errors | 1 - .../raw-body@2.5.3/node_modules/iconv-lite | 1 - .../node_modules/raw-body/LICENSE | 22 - .../node_modules/raw-body/README.md | 223 - .../node_modules/raw-body/index.d.ts | 87 - .../node_modules/raw-body/index.js | 336 - .../node_modules/raw-body/package.json | 47 - .../.pnpm/raw-body@2.5.3/node_modules/unpipe | 1 - .../node_modules/safe-buffer/LICENSE | 21 - .../node_modules/safe-buffer/README.md | 584 -- .../node_modules/safe-buffer/index.d.ts | 187 - .../node_modules/safe-buffer/index.js | 65 - .../node_modules/safe-buffer/package.json | 51 - .../node_modules/safer-buffer/LICENSE | 21 - .../safer-buffer/Porting-Buffer.md | 268 - .../node_modules/safer-buffer/Readme.md | 156 - .../node_modules/safer-buffer/dangerous.js | 58 - .../node_modules/safer-buffer/package.json | 34 - .../node_modules/safer-buffer/safer.js | 77 - .../node_modules/safer-buffer/tests.js | 406 - .../.pnpm/send@0.19.2/node_modules/debug | 1 - .../.pnpm/send@0.19.2/node_modules/depd | 1 - .../.pnpm/send@0.19.2/node_modules/destroy | 1 - .../.pnpm/send@0.19.2/node_modules/encodeurl | 1 - .../send@0.19.2/node_modules/escape-html | 1 - .../.pnpm/send@0.19.2/node_modules/etag | 1 - .../.pnpm/send@0.19.2/node_modules/fresh | 1 - .../send@0.19.2/node_modules/http-errors | 1 - .../.pnpm/send@0.19.2/node_modules/mime | 1 - .../.pnpm/send@0.19.2/node_modules/ms | 1 - .../send@0.19.2/node_modules/on-finished | 1 - .../send@0.19.2/node_modules/range-parser | 1 - .../send@0.19.2/node_modules/send/HISTORY.md | 538 -- .../send@0.19.2/node_modules/send/LICENSE | 23 - .../send@0.19.2/node_modules/send/README.md | 327 - .../send@0.19.2/node_modules/send/SECURITY.md | 24 - .../send@0.19.2/node_modules/send/index.js | 1142 --- .../node_modules/send/node_modules/.bin/mime | 50 - .../node_modules/send/package.json | 62 - .../.pnpm/send@0.19.2/node_modules/statuses | 1 - .../node_modules/encodeurl | 1 - .../node_modules/escape-html | 1 - .../serve-static@1.16.3/node_modules/parseurl | 1 - .../serve-static@1.16.3/node_modules/send | 1 - .../node_modules/serve-static/HISTORY.md | 493 - .../node_modules/serve-static/LICENSE | 25 - .../node_modules/serve-static/README.md | 257 - .../node_modules/serve-static/index.js | 209 - .../node_modules/serve-static/package.json | 42 - .../node_modules/setprototypeof/LICENSE | 13 - .../node_modules/setprototypeof/README.md | 31 - .../node_modules/setprototypeof/index.d.ts | 2 - .../node_modules/setprototypeof/index.js | 17 - .../node_modules/setprototypeof/package.json | 38 - .../node_modules/setprototypeof/test/index.js | 24 - .../node_modules/es-errors | 1 - .../node_modules/object-inspect | 1 - .../side-channel-list/.editorconfig | 9 - .../node_modules/side-channel-list/.eslintrc | 11 - .../side-channel-list/.github/FUNDING.yml | 12 - .../node_modules/side-channel-list/.nycrc | 13 - .../side-channel-list/CHANGELOG.md | 36 - .../node_modules/side-channel-list/LICENSE | 21 - .../node_modules/side-channel-list/README.md | 62 - .../node_modules/side-channel-list/index.d.ts | 13 - .../node_modules/side-channel-list/index.js | 111 - .../node_modules/side-channel-list/list.d.ts | 14 - .../side-channel-list/package.json | 77 - .../side-channel-list/test/index.js | 154 - .../side-channel-list/tsconfig.json | 9 - .../node_modules/call-bound | 1 - .../node_modules/es-errors | 1 - .../node_modules/get-intrinsic | 1 - .../node_modules/object-inspect | 1 - .../side-channel-map/.editorconfig | 9 - .../node_modules/side-channel-map/.eslintrc | 11 - .../side-channel-map/.github/FUNDING.yml | 12 - .../node_modules/side-channel-map/.nycrc | 13 - .../side-channel-map/CHANGELOG.md | 22 - .../node_modules/side-channel-map/LICENSE | 21 - .../node_modules/side-channel-map/README.md | 62 - .../node_modules/side-channel-map/index.d.ts | 15 - .../node_modules/side-channel-map/index.js | 68 - .../side-channel-map/package.json | 80 - .../side-channel-map/test/index.js | 114 - .../side-channel-map/tsconfig.json | 9 - .../node_modules/call-bound | 1 - .../node_modules/es-errors | 1 - .../node_modules/get-intrinsic | 1 - .../node_modules/object-inspect | 1 - .../node_modules/side-channel-map | 1 - .../side-channel-weakmap/.editorconfig | 9 - .../side-channel-weakmap/.eslintrc | 12 - .../side-channel-weakmap/.github/FUNDING.yml | 12 - .../node_modules/side-channel-weakmap/.nycrc | 13 - .../side-channel-weakmap/CHANGELOG.md | 28 - .../node_modules/side-channel-weakmap/LICENSE | 21 - .../side-channel-weakmap/README.md | 62 - .../side-channel-weakmap/index.d.ts | 15 - .../side-channel-weakmap/index.js | 84 - .../side-channel-weakmap/package.json | 87 - .../side-channel-weakmap/test/index.js | 114 - .../side-channel-weakmap/tsconfig.json | 9 - .../side-channel@1.1.1/node_modules/es-errors | 1 - .../node_modules/object-inspect | 1 - .../node_modules/side-channel-list | 1 - .../node_modules/side-channel-map | 1 - .../node_modules/side-channel-weakmap | 1 - .../node_modules/side-channel/.editorconfig | 9 - .../node_modules/side-channel/.eslintrc | 12 - .../side-channel/.github/FUNDING.yml | 12 - .../node_modules/side-channel/.nycrc | 13 - .../node_modules/side-channel/CHANGELOG.md | 120 - .../node_modules/side-channel/LICENSE | 21 - .../node_modules/side-channel/README.md | 61 - .../node_modules/side-channel/index.d.ts | 14 - .../node_modules/side-channel/index.js | 46 - .../node_modules/side-channel/package.json | 85 - .../node_modules/side-channel/test/index.js | 120 - .../node_modules/side-channel/tsconfig.json | 9 - .../node_modules/simplex-noise/LICENSE | 21 - .../node_modules/simplex-noise/README.md | 220 - .../simplex-noise/dist/cjs/simplex-noise.d.ts | 59 - .../simplex-noise/dist/cjs/simplex-noise.js | 473 - .../dist/cjs/simplex-noise.js.map | 1 - .../simplex-noise/dist/esm/package.json | 1 - .../simplex-noise/dist/esm/simplex-noise.d.ts | 59 - .../simplex-noise/dist/esm/simplex-noise.js | 466 - .../dist/esm/simplex-noise.js.map | 1 - .../node_modules/simplex-noise/package.json | 83 - .../simplex-noise/simplex-noise.ts | 500 - .../node_modules/statuses/HISTORY.md | 87 - .../node_modules/statuses/LICENSE | 23 - .../node_modules/statuses/README.md | 139 - .../node_modules/statuses/codes.json | 65 - .../node_modules/statuses/index.js | 146 - .../node_modules/statuses/package.json | 49 - .../node_modules/toidentifier/HISTORY.md | 9 - .../node_modules/toidentifier/LICENSE | 21 - .../node_modules/toidentifier/README.md | 61 - .../node_modules/toidentifier/index.js | 32 - .../node_modules/toidentifier/package.json | 38 - .../type-is@1.6.18/node_modules/media-typer | 1 - .../type-is@1.6.18/node_modules/mime-types | 1 - .../node_modules/type-is/HISTORY.md | 259 - .../node_modules/type-is/LICENSE | 23 - .../node_modules/type-is/README.md | 170 - .../node_modules/type-is/index.js | 266 - .../node_modules/type-is/package.json | 45 - .../node_modules/unpipe/HISTORY.md | 4 - .../unpipe@1.0.0/node_modules/unpipe/LICENSE | 22 - .../node_modules/unpipe/README.md | 43 - .../unpipe@1.0.0/node_modules/unpipe/index.js | 69 - .../node_modules/unpipe/package.json | 27 - .../node_modules/utils-merge/.npmignore | 9 - .../node_modules/utils-merge/LICENSE | 20 - .../node_modules/utils-merge/README.md | 34 - .../node_modules/utils-merge/index.js | 23 - .../node_modules/utils-merge/package.json | 40 - .../vary@1.1.2/node_modules/vary/HISTORY.md | 39 - .../vary@1.1.2/node_modules/vary/LICENSE | 22 - .../vary@1.1.2/node_modules/vary/README.md | 101 - .../vary@1.1.2/node_modules/vary/index.js | 149 - .../vary@1.1.2/node_modules/vary/package.json | 43 - .../node_modules/@esbuild/linux-x64/README.md | 3 - .../@esbuild/linux-x64/bin/esbuild | Bin 10182808 -> 0 bytes .../@esbuild/linux-x64/package.json | 20 - .../node_modules/accepts/HISTORY.md | 243 - .../node_modules/accepts/LICENSE | 23 - .../node_modules/accepts/README.md | 140 - .../node_modules/accepts/index.js | 238 - .../node_modules/accepts/package.json | 47 - .../node_modules/array-flatten/LICENSE | 21 - .../node_modules/array-flatten/README.md | 43 - .../array-flatten/array-flatten.js | 64 - .../node_modules/array-flatten/package.json | 39 - .../node_modules/body-parser/HISTORY.md | 703 -- .../node_modules/body-parser/LICENSE | 23 - .../node_modules/body-parser/README.md | 476 - .../node_modules/body-parser/index.js | 156 - .../node_modules/body-parser/lib/read.js | 205 - .../body-parser/lib/types/json.js | 247 - .../node_modules/body-parser/lib/types/raw.js | 105 - .../body-parser/lib/types/text.js | 125 - .../body-parser/lib/types/urlencoded.js | 303 - .../node_modules/body-parser/package.json | 55 - .../node_modules/bytes/History.md | 97 - .../node_modules/bytes/LICENSE | 23 - .../node_modules/bytes/Readme.md | 152 - .../node_modules/bytes/index.js | 170 - .../node_modules/bytes/package.json | 42 - .../call-bind-apply-helpers/.eslintrc | 17 - .../.github/FUNDING.yml | 12 - .../call-bind-apply-helpers/.nycrc | 9 - .../call-bind-apply-helpers/CHANGELOG.md | 30 - .../call-bind-apply-helpers/LICENSE | 21 - .../call-bind-apply-helpers/README.md | 62 - .../call-bind-apply-helpers/actualApply.d.ts | 1 - .../call-bind-apply-helpers/actualApply.js | 10 - .../call-bind-apply-helpers/applyBind.d.ts | 19 - .../call-bind-apply-helpers/applyBind.js | 10 - .../functionApply.d.ts | 1 - .../call-bind-apply-helpers/functionApply.js | 4 - .../call-bind-apply-helpers/functionCall.d.ts | 1 - .../call-bind-apply-helpers/functionCall.js | 4 - .../call-bind-apply-helpers/index.d.ts | 64 - .../call-bind-apply-helpers/index.js | 15 - .../call-bind-apply-helpers/package.json | 85 - .../call-bind-apply-helpers/reflectApply.d.ts | 3 - .../call-bind-apply-helpers/reflectApply.js | 4 - .../call-bind-apply-helpers/test/index.js | 63 - .../call-bind-apply-helpers/tsconfig.json | 9 - .../node_modules/call-bound/.eslintrc | 13 - .../call-bound/.github/FUNDING.yml | 12 - .../node_modules/call-bound/.nycrc | 9 - .../node_modules/call-bound/CHANGELOG.md | 42 - .../node_modules/call-bound/LICENSE | 21 - .../node_modules/call-bound/README.md | 53 - .../node_modules/call-bound/index.d.ts | 94 - .../node_modules/call-bound/index.js | 19 - .../node_modules/call-bound/package.json | 99 - .../node_modules/call-bound/test/index.js | 61 - .../node_modules/call-bound/tsconfig.json | 10 - .../content-disposition/HISTORY.md | 60 - .../node_modules/content-disposition/LICENSE | 22 - .../content-disposition/README.md | 142 - .../node_modules/content-disposition/index.js | 458 - .../content-disposition/package.json | 44 - .../node_modules/content-type/HISTORY.md | 29 - .../node_modules/content-type/LICENSE | 22 - .../node_modules/content-type/README.md | 94 - .../node_modules/content-type/index.js | 225 - .../node_modules/content-type/package.json | 42 - .../node_modules/cookie-signature/History.md | 42 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 51 - .../cookie-signature/package.json | 18 - .../node_modules/cookie/LICENSE | 24 - .../node_modules/cookie/README.md | 317 - .../node_modules/cookie/SECURITY.md | 25 - .../node_modules/cookie/index.js | 335 - .../node_modules/cookie/package.json | 44 - .../node_modules/debug/.coveralls.yml | 1 - .../node_modules/debug/.eslintrc | 11 - .../node_modules/debug/.npmignore | 9 - .../node_modules/debug/.travis.yml | 14 - .../node_modules/debug/CHANGELOG.md | 362 - .../node_modules/debug/LICENSE | 19 - .../node_modules/debug/README.md | 312 - .../node_modules/debug/component.json | 19 - .../node_modules/debug/karma.conf.js | 70 - .../node_modules/debug/node.js | 1 - .../node_modules/debug/package.json | 49 - .../node_modules/debug/src/browser.js | 185 - .../node_modules/debug/src/debug.js | 202 - .../node_modules/debug/src/index.js | 10 - .../node_modules/debug/src/inspector-log.js | 15 - .../node_modules/debug/src/node.js | 248 - .../node_modules/depd/History.md | 103 - .../node_modules/depd/LICENSE | 22 - .../node_modules/depd/Readme.md | 280 - .../node_modules/depd/index.js | 538 -- .../node_modules/depd/lib/browser/index.js | 77 - .../node_modules/depd/package.json | 45 - .../node_modules/destroy/LICENSE | 23 - .../node_modules/destroy/README.md | 63 - .../node_modules/destroy/index.js | 209 - .../node_modules/destroy/package.json | 48 - .../node_modules/dunder-proto/.eslintrc | 5 - .../dunder-proto/.github/FUNDING.yml | 12 - .../node_modules/dunder-proto/.nycrc | 13 - .../node_modules/dunder-proto/CHANGELOG.md | 24 - .../node_modules/dunder-proto/LICENSE | 21 - .../node_modules/dunder-proto/README.md | 54 - .../node_modules/dunder-proto/get.d.ts | 5 - .../node_modules/dunder-proto/get.js | 30 - .../node_modules/dunder-proto/package.json | 76 - .../node_modules/dunder-proto/set.d.ts | 5 - .../node_modules/dunder-proto/set.js | 35 - .../node_modules/dunder-proto/test/get.js | 34 - .../node_modules/dunder-proto/test/index.js | 4 - .../node_modules/dunder-proto/test/set.js | 50 - .../node_modules/dunder-proto/tsconfig.json | 9 - .../node_modules/ee-first/LICENSE | 22 - .../node_modules/ee-first/README.md | 80 - .../node_modules/ee-first/index.js | 95 - .../node_modules/ee-first/package.json | 29 - .../node_modules/encodeurl/LICENSE | 22 - .../node_modules/encodeurl/README.md | 109 - .../node_modules/encodeurl/index.js | 60 - .../node_modules/encodeurl/package.json | 40 - .../node_modules/es-define-property/.eslintrc | 13 - .../es-define-property/.github/FUNDING.yml | 12 - .../node_modules/es-define-property/.nycrc | 9 - .../es-define-property/CHANGELOG.md | 29 - .../node_modules/es-define-property/LICENSE | 21 - .../node_modules/es-define-property/README.md | 49 - .../es-define-property/index.d.ts | 3 - .../node_modules/es-define-property/index.js | 14 - .../es-define-property/package.json | 81 - .../es-define-property/test/index.js | 56 - .../es-define-property/tsconfig.json | 10 - .../node_modules/es-errors/.eslintrc | 5 - .../es-errors/.github/FUNDING.yml | 12 - .../node_modules/es-errors/CHANGELOG.md | 40 - .../node_modules/es-errors/LICENSE | 21 - .../node_modules/es-errors/README.md | 55 - .../node_modules/es-errors/eval.d.ts | 3 - .../node_modules/es-errors/eval.js | 4 - .../node_modules/es-errors/index.d.ts | 3 - .../node_modules/es-errors/index.js | 4 - .../node_modules/es-errors/package.json | 80 - .../node_modules/es-errors/range.d.ts | 3 - .../node_modules/es-errors/range.js | 4 - .../node_modules/es-errors/ref.d.ts | 3 - .../node_modules/es-errors/ref.js | 4 - .../node_modules/es-errors/syntax.d.ts | 3 - .../node_modules/es-errors/syntax.js | 4 - .../node_modules/es-errors/test/index.js | 19 - .../node_modules/es-errors/tsconfig.json | 49 - .../node_modules/es-errors/type.d.ts | 3 - .../node_modules/es-errors/type.js | 4 - .../node_modules/es-errors/uri.d.ts | 3 - .../node_modules/es-errors/uri.js | 4 - .../node_modules/es-object-atoms/.eslintrc | 16 - .../es-object-atoms/.github/FUNDING.yml | 12 - .../node_modules/es-object-atoms/CHANGELOG.md | 44 - .../node_modules/es-object-atoms/LICENSE | 21 - .../node_modules/es-object-atoms/README.md | 63 - .../RequireObjectCoercible.d.ts | 3 - .../es-object-atoms/RequireObjectCoercible.js | 11 - .../es-object-atoms/ToObject.d.ts | 7 - .../node_modules/es-object-atoms/ToObject.js | 10 - .../node_modules/es-object-atoms/index.d.ts | 3 - .../node_modules/es-object-atoms/index.js | 4 - .../es-object-atoms/isObject.d.ts | 3 - .../node_modules/es-object-atoms/isObject.js | 6 - .../node_modules/es-object-atoms/package.json | 79 - .../es-object-atoms/test/index.js | 38 - .../es-object-atoms/tsconfig.json | 7 - .../node_modules/esbuild | 1 - .../node_modules/escape-html/LICENSE | 24 - .../node_modules/escape-html/Readme.md | 43 - .../node_modules/escape-html/index.js | 78 - .../node_modules/escape-html/package.json | 24 - .../node_modules/etag/HISTORY.md | 83 - .../node_modules/etag/LICENSE | 22 - .../node_modules/etag/README.md | 159 - .../node_modules/etag/index.js | 131 - .../node_modules/etag/package.json | 47 - .../node_modules/express | 1 - .../node_modules/finalhandler/HISTORY.md | 216 - .../node_modules/finalhandler/LICENSE | 22 - .../node_modules/finalhandler/README.md | 147 - .../node_modules/finalhandler/SECURITY.md | 25 - .../node_modules/finalhandler/index.js | 341 - .../node_modules/finalhandler/package.json | 47 - .../node_modules/forwarded/HISTORY.md | 21 - .../node_modules/forwarded/LICENSE | 22 - .../node_modules/forwarded/README.md | 57 - .../node_modules/forwarded/index.js | 90 - .../node_modules/forwarded/package.json | 45 - .../node_modules/fresh/HISTORY.md | 70 - .../node_modules/fresh/LICENSE | 23 - .../node_modules/fresh/README.md | 119 - .../node_modules/fresh/index.js | 137 - .../node_modules/fresh/package.json | 46 - .../node_modules/function-bind/.eslintrc | 21 - .../function-bind/.github/FUNDING.yml | 12 - .../function-bind/.github/SECURITY.md | 3 - .../node_modules/function-bind/.nycrc | 13 - .../node_modules/function-bind/CHANGELOG.md | 136 - .../node_modules/function-bind/LICENSE | 20 - .../node_modules/function-bind/README.md | 46 - .../function-bind/implementation.js | 84 - .../node_modules/function-bind/index.js | 5 - .../node_modules/function-bind/package.json | 87 - .../node_modules/function-bind/test/.eslintrc | 9 - .../node_modules/function-bind/test/index.js | 252 - .../node_modules/get-intrinsic/.eslintrc | 42 - .../get-intrinsic/.github/FUNDING.yml | 12 - .../node_modules/get-intrinsic/.nycrc | 9 - .../node_modules/get-intrinsic/CHANGELOG.md | 186 - .../node_modules/get-intrinsic/LICENSE | 21 - .../node_modules/get-intrinsic/README.md | 71 - .../node_modules/get-intrinsic/index.js | 378 - .../node_modules/get-intrinsic/package.json | 97 - .../get-intrinsic/test/GetIntrinsic.js | 274 - .../node_modules/get-proto/.eslintrc | 10 - .../get-proto/.github/FUNDING.yml | 12 - .../node_modules/get-proto/.nycrc | 9 - .../node_modules/get-proto/CHANGELOG.md | 21 - .../node_modules/get-proto/LICENSE | 21 - .../get-proto/Object.getPrototypeOf.d.ts | 5 - .../get-proto/Object.getPrototypeOf.js | 6 - .../node_modules/get-proto/README.md | 50 - .../get-proto/Reflect.getPrototypeOf.d.ts | 3 - .../get-proto/Reflect.getPrototypeOf.js | 4 - .../node_modules/get-proto/index.d.ts | 5 - .../node_modules/get-proto/index.js | 27 - .../node_modules/get-proto/package.json | 81 - .../node_modules/get-proto/test/index.js | 68 - .../node_modules/get-proto/tsconfig.json | 9 - .../node_modules/gopd/.eslintrc | 16 - .../node_modules/gopd/.github/FUNDING.yml | 12 - .../node_modules/gopd/CHANGELOG.md | 45 - .../node_modules/gopd/LICENSE | 21 - .../node_modules/gopd/README.md | 40 - .../node_modules/gopd/gOPD.d.ts | 1 - .../node_modules/gopd/gOPD.js | 4 - .../node_modules/gopd/index.d.ts | 5 - .../node_modules/gopd/index.js | 15 - .../node_modules/gopd/package.json | 77 - .../node_modules/gopd/test/index.js | 36 - .../node_modules/gopd/tsconfig.json | 9 - .../node_modules/has-symbols/.eslintrc | 11 - .../has-symbols/.github/FUNDING.yml | 12 - .../node_modules/has-symbols/.nycrc | 9 - .../node_modules/has-symbols/CHANGELOG.md | 91 - .../node_modules/has-symbols/LICENSE | 21 - .../node_modules/has-symbols/README.md | 46 - .../node_modules/has-symbols/index.d.ts | 3 - .../node_modules/has-symbols/index.js | 14 - .../node_modules/has-symbols/package.json | 111 - .../node_modules/has-symbols/shams.d.ts | 3 - .../node_modules/has-symbols/shams.js | 45 - .../node_modules/has-symbols/test/index.js | 22 - .../has-symbols/test/shams/core-js.js | 29 - .../test/shams/get-own-property-symbols.js | 29 - .../node_modules/has-symbols/test/tests.js | 58 - .../node_modules/has-symbols/tsconfig.json | 10 - .../node_modules/hasown/.github/FUNDING.yml | 12 - .../node_modules/hasown/.nycrc | 13 - .../node_modules/hasown/CHANGELOG.md | 58 - .../node_modules/hasown/LICENSE | 21 - .../node_modules/hasown/README.md | 40 - .../node_modules/hasown/eslint.config.mjs | 6 - .../node_modules/hasown/index.d.ts | 3 - .../node_modules/hasown/index.js | 8 - .../node_modules/hasown/package.json | 91 - .../node_modules/hasown/tsconfig.json | 6 - .../node_modules/http-errors/HISTORY.md | 186 - .../node_modules/http-errors/LICENSE | 23 - .../node_modules/http-errors/README.md | 169 - .../node_modules/http-errors/index.js | 290 - .../node_modules/http-errors/package.json | 54 - .../node_modules/iconv-lite/Changelog.md | 162 - .../node_modules/iconv-lite/LICENSE | 21 - .../node_modules/iconv-lite/README.md | 156 - .../iconv-lite/encodings/dbcs-codec.js | 555 -- .../iconv-lite/encodings/dbcs-data.js | 176 - .../iconv-lite/encodings/index.js | 22 - .../iconv-lite/encodings/internal.js | 188 - .../iconv-lite/encodings/sbcs-codec.js | 72 - .../encodings/sbcs-data-generated.js | 451 - .../iconv-lite/encodings/sbcs-data.js | 174 - .../encodings/tables/big5-added.json | 122 - .../iconv-lite/encodings/tables/cp936.json | 264 - .../iconv-lite/encodings/tables/cp949.json | 273 - .../iconv-lite/encodings/tables/cp950.json | 177 - .../iconv-lite/encodings/tables/eucjp.json | 182 - .../encodings/tables/gb18030-ranges.json | 1 - .../encodings/tables/gbk-added.json | 55 - .../iconv-lite/encodings/tables/shiftjis.json | 125 - .../iconv-lite/encodings/utf16.js | 177 - .../node_modules/iconv-lite/encodings/utf7.js | 290 - .../iconv-lite/lib/bom-handling.js | 52 - .../iconv-lite/lib/extend-node.js | 217 - .../node_modules/iconv-lite/lib/index.d.ts | 24 - .../node_modules/iconv-lite/lib/index.js | 153 - .../node_modules/iconv-lite/lib/streams.js | 121 - .../node_modules/iconv-lite/package.json | 46 - .../node_modules/inherits/LICENSE | 16 - .../node_modules/inherits/README.md | 42 - .../node_modules/inherits/inherits.js | 9 - .../node_modules/inherits/inherits_browser.js | 27 - .../node_modules/inherits/package.json | 29 - .../node_modules/ipaddr.js/LICENSE | 19 - .../node_modules/ipaddr.js/README.md | 233 - .../node_modules/ipaddr.js/ipaddr.min.js | 1 - .../node_modules/ipaddr.js/lib/ipaddr.js | 673 -- .../node_modules/ipaddr.js/lib/ipaddr.js.d.ts | 68 - .../node_modules/ipaddr.js/package.json | 35 - .../node_modules/math-intrinsics/.eslintrc | 16 - .../math-intrinsics/.github/FUNDING.yml | 12 - .../node_modules/math-intrinsics/CHANGELOG.md | 24 - .../node_modules/math-intrinsics/LICENSE | 21 - .../node_modules/math-intrinsics/README.md | 50 - .../node_modules/math-intrinsics/abs.d.ts | 1 - .../node_modules/math-intrinsics/abs.js | 4 - .../constants/maxArrayLength.d.ts | 3 - .../constants/maxArrayLength.js | 4 - .../constants/maxSafeInteger.d.ts | 3 - .../constants/maxSafeInteger.js | 5 - .../math-intrinsics/constants/maxValue.d.ts | 3 - .../math-intrinsics/constants/maxValue.js | 5 - .../node_modules/math-intrinsics/floor.d.ts | 1 - .../node_modules/math-intrinsics/floor.js | 4 - .../math-intrinsics/isFinite.d.ts | 3 - .../node_modules/math-intrinsics/isFinite.js | 12 - .../math-intrinsics/isInteger.d.ts | 3 - .../node_modules/math-intrinsics/isInteger.js | 16 - .../node_modules/math-intrinsics/isNaN.d.ts | 1 - .../node_modules/math-intrinsics/isNaN.js | 6 - .../math-intrinsics/isNegativeZero.d.ts | 3 - .../math-intrinsics/isNegativeZero.js | 6 - .../node_modules/math-intrinsics/max.d.ts | 1 - .../node_modules/math-intrinsics/max.js | 4 - .../node_modules/math-intrinsics/min.d.ts | 1 - .../node_modules/math-intrinsics/min.js | 4 - .../node_modules/math-intrinsics/mod.d.ts | 3 - .../node_modules/math-intrinsics/mod.js | 9 - .../node_modules/math-intrinsics/package.json | 86 - .../node_modules/math-intrinsics/pow.d.ts | 1 - .../node_modules/math-intrinsics/pow.js | 4 - .../node_modules/math-intrinsics/round.d.ts | 1 - .../node_modules/math-intrinsics/round.js | 4 - .../node_modules/math-intrinsics/sign.d.ts | 3 - .../node_modules/math-intrinsics/sign.js | 11 - .../math-intrinsics/test/index.js | 192 - .../math-intrinsics/tsconfig.json | 3 - .../node_modules/media-typer/HISTORY.md | 22 - .../node_modules/media-typer/LICENSE | 22 - .../node_modules/media-typer/README.md | 81 - .../node_modules/media-typer/index.js | 270 - .../node_modules/media-typer/package.json | 26 - .../node_modules/merge-descriptors/HISTORY.md | 21 - .../node_modules/merge-descriptors/LICENSE | 23 - .../node_modules/merge-descriptors/README.md | 49 - .../node_modules/merge-descriptors/index.js | 60 - .../merge-descriptors/package.json | 39 - .../node_modules/methods/HISTORY.md | 29 - .../node_modules/methods/LICENSE | 24 - .../node_modules/methods/README.md | 51 - .../node_modules/methods/index.js | 69 - .../node_modules/methods/package.json | 36 - .../node_modules/mime-db/HISTORY.md | 507 - .../node_modules/mime-db/LICENSE | 23 - .../node_modules/mime-db/README.md | 100 - .../node_modules/mime-db/db.json | 8519 ----------------- .../node_modules/mime-db/index.js | 12 - .../node_modules/mime-db/package.json | 60 - .../node_modules/mime-types/HISTORY.md | 397 - .../node_modules/mime-types/LICENSE | 23 - .../node_modules/mime-types/README.md | 113 - .../node_modules/mime-types/index.js | 188 - .../node_modules/mime-types/package.json | 44 - .../node_modules/mime/.npmignore | 0 .../node_modules/mime/CHANGELOG.md | 164 - .../node_modules/mime/LICENSE | 21 - .../node_modules/mime/README.md | 90 - .../node_modules/mime/cli.js | 8 - .../node_modules/mime/mime.js | 108 - .../node_modules/mime/package.json | 44 - .../node_modules/mime/src/build.js | 53 - .../node_modules/mime/src/test.js | 60 - .../node_modules/mime/types.json | 1 - .../node_modules/ms/index.js | 152 - .../node_modules/ms/license.md | 21 - .../node_modules/ms/package.json | 37 - .../node_modules/ms/readme.md | 51 - .../node_modules/negotiator/HISTORY.md | 108 - .../node_modules/negotiator/LICENSE | 24 - .../node_modules/negotiator/README.md | 203 - .../node_modules/negotiator/index.js | 82 - .../node_modules/negotiator/lib/charset.js | 169 - .../node_modules/negotiator/lib/encoding.js | 184 - .../node_modules/negotiator/lib/language.js | 179 - .../node_modules/negotiator/lib/mediaType.js | 294 - .../node_modules/negotiator/package.json | 42 - .../node_modules/object-inspect/.eslintrc | 53 - .../object-inspect/.github/FUNDING.yml | 12 - .../node_modules/object-inspect/.nycrc | 13 - .../node_modules/object-inspect/CHANGELOG.md | 424 - .../node_modules/object-inspect/LICENSE | 21 - .../object-inspect/example/all.js | 23 - .../object-inspect/example/circular.js | 6 - .../node_modules/object-inspect/example/fn.js | 5 - .../object-inspect/example/inspect.js | 10 - .../node_modules/object-inspect/index.js | 544 -- .../object-inspect/package-support.json | 20 - .../node_modules/object-inspect/package.json | 105 - .../object-inspect/readme.markdown | 84 - .../object-inspect/test-core-js.js | 26 - .../object-inspect/test/bigint.js | 58 - .../object-inspect/test/browser/dom.js | 15 - .../object-inspect/test/circular.js | 16 - .../node_modules/object-inspect/test/deep.js | 12 - .../object-inspect/test/element.js | 53 - .../node_modules/object-inspect/test/err.js | 48 - .../node_modules/object-inspect/test/fakes.js | 29 - .../node_modules/object-inspect/test/fn.js | 76 - .../object-inspect/test/global.js | 17 - .../node_modules/object-inspect/test/has.js | 15 - .../node_modules/object-inspect/test/holes.js | 15 - .../object-inspect/test/indent-option.js | 271 - .../object-inspect/test/inspect.js | 139 - .../object-inspect/test/lowbyte.js | 12 - .../object-inspect/test/number.js | 58 - .../object-inspect/test/quoteStyle.js | 26 - .../object-inspect/test/toStringTag.js | 40 - .../node_modules/object-inspect/test/undef.js | 12 - .../object-inspect/test/values.js | 261 - .../object-inspect/util.inspect.js | 1 - .../node_modules/on-finished/HISTORY.md | 98 - .../node_modules/on-finished/LICENSE | 23 - .../node_modules/on-finished/README.md | 162 - .../node_modules/on-finished/index.js | 234 - .../node_modules/on-finished/package.json | 39 - .../node_modules/parseurl/HISTORY.md | 58 - .../node_modules/parseurl/LICENSE | 24 - .../node_modules/parseurl/README.md | 133 - .../node_modules/parseurl/index.js | 158 - .../node_modules/parseurl/package.json | 40 - .../node_modules/path-to-regexp/LICENSE | 21 - .../node_modules/path-to-regexp/Readme.md | 35 - .../node_modules/path-to-regexp/index.js | 158 - .../node_modules/path-to-regexp/package.json | 30 - .../node_modules/proxy-addr/HISTORY.md | 167 - .../node_modules/proxy-addr/LICENSE | 22 - .../node_modules/proxy-addr/README.md | 139 - .../node_modules/proxy-addr/index.js | 359 - .../node_modules/proxy-addr/package.json | 51 - .../node_modules/qs/.editorconfig | 46 - .../node_modules/qs/.github/FUNDING.yml | 12 - .../node_modules/qs/.github/SECURITY.md | 11 - .../node_modules/qs/.github/THREAT_MODEL.md | 78 - .../node_modules/qs/.nycrc | 13 - .../node_modules/qs/CHANGELOG.md | 848 -- .../node_modules/qs/LICENSE.md | 29 - .../node_modules/qs/README.md | 776 -- .../node_modules/qs/dist/qs.js | 141 - .../node_modules/qs/eslint.config.mjs | 57 - .../node_modules/qs/lib/formats.js | 23 - .../node_modules/qs/lib/index.js | 11 - .../node_modules/qs/lib/parse.js | 413 - .../node_modules/qs/lib/stringify.js | 378 - .../node_modules/qs/lib/utils.js | 388 - .../node_modules/qs/package.json | 95 - .../node_modules/qs/test/empty-keys-cases.js | 267 - .../node_modules/qs/test/parse.js | 2122 ---- .../node_modules/qs/test/stringify.js | 1765 ---- .../node_modules/qs/test/utils.js | 638 -- .../node_modules/range-parser/HISTORY.md | 56 - .../node_modules/range-parser/LICENSE | 23 - .../node_modules/range-parser/README.md | 84 - .../node_modules/range-parser/index.js | 162 - .../node_modules/range-parser/package.json | 44 - .../node_modules/raw-body/LICENSE | 22 - .../node_modules/raw-body/README.md | 223 - .../node_modules/raw-body/index.d.ts | 87 - .../node_modules/raw-body/index.js | 336 - .../node_modules/raw-body/package.json | 47 - .../node_modules/safe-buffer/LICENSE | 21 - .../node_modules/safe-buffer/README.md | 584 -- .../node_modules/safe-buffer/index.d.ts | 187 - .../node_modules/safe-buffer/index.js | 65 - .../node_modules/safe-buffer/package.json | 51 - .../node_modules/safer-buffer/LICENSE | 21 - .../safer-buffer/Porting-Buffer.md | 268 - .../node_modules/safer-buffer/Readme.md | 156 - .../node_modules/safer-buffer/dangerous.js | 58 - .../node_modules/safer-buffer/package.json | 34 - .../node_modules/safer-buffer/safer.js | 77 - .../node_modules/safer-buffer/tests.js | 406 - .../node_modules/send/HISTORY.md | 538 -- .../node_modules/send/LICENSE | 23 - .../node_modules/send/README.md | 327 - .../node_modules/send/SECURITY.md | 24 - .../node_modules/send/index.js | 1142 --- .../send/node_modules/ms/index.js | 162 - .../send/node_modules/ms/license.md | 21 - .../send/node_modules/ms/package.json | 38 - .../send/node_modules/ms/readme.md | 59 - .../node_modules/send/package.json | 62 - .../node_modules/serve-static/HISTORY.md | 493 - .../node_modules/serve-static/LICENSE | 25 - .../node_modules/serve-static/README.md | 257 - .../node_modules/serve-static/index.js | 209 - .../node_modules/serve-static/package.json | 42 - .../node_modules/setprototypeof/LICENSE | 13 - .../node_modules/setprototypeof/README.md | 31 - .../node_modules/setprototypeof/index.d.ts | 2 - .../node_modules/setprototypeof/index.js | 17 - .../node_modules/setprototypeof/package.json | 38 - .../node_modules/setprototypeof/test/index.js | 24 - .../side-channel-list/.editorconfig | 9 - .../node_modules/side-channel-list/.eslintrc | 11 - .../side-channel-list/.github/FUNDING.yml | 12 - .../node_modules/side-channel-list/.nycrc | 13 - .../side-channel-list/CHANGELOG.md | 36 - .../node_modules/side-channel-list/LICENSE | 21 - .../node_modules/side-channel-list/README.md | 62 - .../node_modules/side-channel-list/index.d.ts | 13 - .../node_modules/side-channel-list/index.js | 111 - .../node_modules/side-channel-list/list.d.ts | 14 - .../side-channel-list/package.json | 77 - .../side-channel-list/test/index.js | 154 - .../side-channel-list/tsconfig.json | 9 - .../side-channel-map/.editorconfig | 9 - .../node_modules/side-channel-map/.eslintrc | 11 - .../side-channel-map/.github/FUNDING.yml | 12 - .../node_modules/side-channel-map/.nycrc | 13 - .../side-channel-map/CHANGELOG.md | 22 - .../node_modules/side-channel-map/LICENSE | 21 - .../node_modules/side-channel-map/README.md | 62 - .../node_modules/side-channel-map/index.d.ts | 15 - .../node_modules/side-channel-map/index.js | 68 - .../side-channel-map/package.json | 80 - .../side-channel-map/test/index.js | 114 - .../side-channel-map/tsconfig.json | 9 - .../side-channel-weakmap/.editorconfig | 9 - .../side-channel-weakmap/.eslintrc | 12 - .../side-channel-weakmap/.github/FUNDING.yml | 12 - .../node_modules/side-channel-weakmap/.nycrc | 13 - .../side-channel-weakmap/CHANGELOG.md | 28 - .../node_modules/side-channel-weakmap/LICENSE | 21 - .../side-channel-weakmap/README.md | 62 - .../side-channel-weakmap/index.d.ts | 15 - .../side-channel-weakmap/index.js | 84 - .../side-channel-weakmap/package.json | 87 - .../side-channel-weakmap/test/index.js | 114 - .../side-channel-weakmap/tsconfig.json | 9 - .../node_modules/side-channel/.editorconfig | 9 - .../node_modules/side-channel/.eslintrc | 12 - .../side-channel/.github/FUNDING.yml | 12 - .../node_modules/side-channel/.nycrc | 13 - .../node_modules/side-channel/CHANGELOG.md | 120 - .../node_modules/side-channel/LICENSE | 21 - .../node_modules/side-channel/README.md | 61 - .../node_modules/side-channel/index.d.ts | 14 - .../node_modules/side-channel/index.js | 46 - .../node_modules/side-channel/package.json | 85 - .../node_modules/side-channel/test/index.js | 120 - .../node_modules/side-channel/tsconfig.json | 9 - .../node_modules/simplex-noise | 1 - .../node_modules/statuses/HISTORY.md | 87 - .../node_modules/statuses/LICENSE | 23 - .../node_modules/statuses/README.md | 139 - .../node_modules/statuses/codes.json | 65 - .../node_modules/statuses/index.js | 146 - .../node_modules/statuses/package.json | 49 - .../node_modules/toidentifier/HISTORY.md | 9 - .../node_modules/toidentifier/LICENSE | 21 - .../node_modules/toidentifier/README.md | 61 - .../node_modules/toidentifier/index.js | 32 - .../node_modules/toidentifier/package.json | 38 - .../node_modules/type-is/HISTORY.md | 259 - .../node_modules/type-is/LICENSE | 23 - .../node_modules/type-is/README.md | 170 - .../node_modules/type-is/index.js | 266 - .../node_modules/type-is/package.json | 45 - .../node_modules/unpipe/HISTORY.md | 4 - .../node_modules/unpipe/LICENSE | 22 - .../node_modules/unpipe/README.md | 43 - .../node_modules/unpipe/index.js | 69 - .../node_modules/unpipe/package.json | 27 - .../node_modules/utils-merge/.npmignore | 9 - .../node_modules/utils-merge/LICENSE | 20 - .../node_modules/utils-merge/README.md | 34 - .../node_modules/utils-merge/index.js | 23 - .../node_modules/utils-merge/package.json | 40 - .../node_modules/vary/HISTORY.md | 39 - .../node_modules/vary/LICENSE | 22 - .../node_modules/vary/README.md | 101 - .../node_modules/vary/index.js | 149 - .../node_modules/vary/package.json | 43 - caffeine-website | 1 + docs/AUDIT_REPORT.md | 157 - docs/ECOSYSTEM_WORKFLOW.md | 224 - docs/HISTORY.md | 139 - docs/MASTER.md | 276 - docs/README.md | 182 - docs/analysis/EDITOR_STATUS_ANALYSIS.md | 382 - docs/animation/animation-2d.md | 190 - docs/animation/skeletal-animation.md | 203 - docs/api/README.md | 92 - docs/architecture/cafpack.md | 149 - docs/architecture_specs.md | 1945 ---- docs/assets/asset-manager.md | 362 - docs/assets/asset-pipeline.md | 396 - docs/assets/caf-format.md | 392 - docs/assets/mesh-loading.md | 239 - docs/audio/audio-system.md | 210 - .../chapters/01-introduction.tex | 48 - .../chapters/02-type-system.tex | 73 - .../chapters/03-mathematics.tex | 378 - .../caffeine-internals/chapters/04-memory.tex | 127 - .../chapters/05-containers.tex | 63 - docs/caffeine-internals/chapters/06-ecs.tex | 146 - .../chapters/07-job-system.tex | 89 - .../chapters/08-physics.tex | 181 - docs/caffeine-internals/chapters/09-audio.tex | 56 - .../chapters/10-asset-pipeline.tex | 126 - .../chapters/11-game-loop.tex | 51 - .../chapters/12-viewport.tex | 231 - .../caffeine-internals/chapters/13-editor.tex | 33 - .../chapters/14-implementation-rules.tex | 63 - docs/caffeine-internals/chapters/15-rhi.tex | 281 - .../chapters/16-rendering-2d.tex | 333 - .../chapters/17-rendering-3d.tex | 242 - .../caffeine-internals/chapters/18-events.tex | 133 - docs/caffeine-internals/chapters/19-input.tex | 228 - docs/caffeine-internals/chapters/20-debug.tex | 169 - docs/caffeine-internals/chapters/21-scene.tex | 152 - .../chapters/22-animation.tex | 202 - .../chapters/23-scripting.tex | 203 - docs/caffeine-internals/chapters/24-ui.tex | 170 - .../chapters/25-asset-manager.tex | 180 - .../26-polygons-and-3d-representations.tex | 443 - .../chapters/bibliography.tex | 50 - docs/caffeine-internals/front/abstract.tex | 33 - docs/caffeine-internals/front/cover.tex | 36 - docs/caffeine-internals/logo.png | Bin 53225 -> 0 bytes docs/caffeine-internals/main.aux | 496 - docs/caffeine-internals/main.lof | 28 - docs/caffeine-internals/main.log | 1929 ---- docs/caffeine-internals/main.lot | 31 - docs/caffeine-internals/main.pdf | Bin 787477 -> 0 bytes docs/caffeine-internals/main.tex | 176 - docs/caffeine-internals/main.toc | 367 - docs/caffeine-internals/test.log | 1590 --- docs/caffeine-internals/test.tex | 187 - docs/concurrency/job-system.md | 557 -- docs/core/events.md | 308 - docs/core/game-loop.md | 254 - docs/core/timer.md | 221 - docs/core/types.md | 116 - docs/debug/debug-tools.md | 283 - docs/debug/testing.md | 192 - docs/ecs/README.md | 679 -- docs/ecs/core.md | 369 - docs/ecs/examples.md | 620 -- docs/ecs/scene.md | 246 - docs/editor/git-plugin.md | 24 - docs/editor/material-editor.md | 62 - docs/editor/plugin-sdk.md | 94 - docs/editor/scene-editor.md | 375 - docs/editor/scene-viewport.md | 181 - docs/editor/test-automation.md | 335 - .../assets/cover.png | Bin 100882 -> 0 bytes .../bibliografia.bib | 138 - .../capitulos/00-introducao.tex | 159 - .../capitulos/01-matematica-essencial.tex | 217 - .../capitulos/02-pipeline-de-renderizacao.tex | 328 - .../capitulos/03-rasterizacao.tex | 312 - .../capitulos/04-modelos-de-iluminacao.tex | 503 - .../capitulos/05-shaders-e-glsl.tex | 322 - .../capitulos/06-texturas.tex | 413 - .../capitulos/07-iluminacao-avancada.tex | 326 - .../capitulos/08-ray-tracing.tex | 354 - .../capitulos/09-tecnicas-modernas.tex | 345 - .../capitulos/10-cor-e-espaco-de-cor.tex | 281 - .../capitulos/A-solucoes.tex | 242 - docs/fundamentos-computacao-grafica/main.tex | 62 - .../metadata.tex | 10 - .../preambulo.tex | 176 - docs/input/input-system.md | 279 - docs/math/quaternions.md | 158 - docs/math/vectors.md | 141 - docs/memory/allocators.md | 142 - docs/memory/containers.md | 122 - docs/memory/memory-model.md | 713 -- docs/performance/README.md | 7 - .../editor-viewport-performance.md | 234 - docs/physics/physics-2d.md | 308 - docs/physics/physics-3d.md | 27 - docs/physics/spatial-partitioning.md | 215 - docs/plans/2025-05-15-script-editor.md | 391 - docs/plans/2026-05-10-camera3d.md | 738 -- docs/plans/2026-05-11-scripting-design.md | 276 - docs/plans/2026-05-11-scripting-plan.md | 1077 --- .../2026-05-14-transform-gizmos-design.md | 258 - ...6-05-14-transform-gizmos-implementation.md | 710 -- .../plans/2026-05-15-asset-pipeline-design.md | 110 - docs/plans/2026-05-15-asset-pipeline-plan.md | 873 -- docs/plans/2026-05-15-hot-reload-design.md | 113 - .../2026-05-15-project-manager-design.md | 93 - ...2026-05-16-audio-preview-spatial-design.md | 180 - .../2026-05-16-audio-preview-spatial-plan.md | 699 -- docs/plans/2026-05-16-buildsystem-design.md | 340 - .../2026-05-16-buildsystem-implementation.md | 392 - docs/plans/2026-05-16-e2e-testing-design.md | 188 - docs/plans/2026-05-16-e2e-testing-plan.md | 541 -- ...026-05-16-material-shader-editor-design.md | 209 - .../2026-05-16-material-shader-editor-plan.md | 1378 --- ...5-16-project-startup-dialog-tabs-design.md | 240 - .../2026-05-16-project-startup-dialog-tabs.md | 690 -- .../2026-05-16-projectstartup-dialog-plan.md | 754 -- ...2026-05-17-ecosystem-three-phase-design.md | 360 - ...17-ecosystem-three-phase-implementation.md | 1364 --- ...6-05-17-scene-viewport-and-entity-types.md | 544 -- .../2026-05-17-unified-ecosystem-build.md | 1432 --- docs/plans/2026-05-18-inspector-v2.md | 780 -- ...-18-play-mode-physics-scripting-tileset.md | 671 -- .../2026-05-20-viewport-3d-iso-gizmos-xyz.md | 421 - docs/plans/2026-05-23-3d-mesh-enhancements.md | 602 -- ...2026-05-23-gizmo-raycasting-performance.md | 75 - .../2026-05-23-gizmo-raycasting-vp-inverse.md | 551 -- .../2026-05-23-mesh-prefab-asset-pipeline.md | 1031 -- docs/plans/2026-05-23-mesh-prefab-wiring.md | 159 - .../2026-05-23-object-selection-raycasting.md | 525 - .../2026-05-24-doppio-ui-test-framework.md | 209 - docs/plans/2026-09-21-rendering-roadmap.md | 215 - .../2026-09-22-engine-pillars-roadmap.md | 527 - .../2026-09-22-phong-gpu-handles-session.md | 115 - ...9-22-viewport-rendering-quality-session.md | 198 - .../2026-10-02-editor-backlog-phase-b.md | 62 - .../2026-10-02-forward-pbr-post-session.md | 57 - docs/plans/2026-10-03-unity-56-manual-gap.md | 136 - .../runtime-capabilities-patch-notes.md | 116 - docs/rendering/batch-renderer.md | 263 - docs/rendering/camera-2d.md | 242 - docs/rendering/camera-3d.md | 230 - docs/rendering/forward-render-features.md | 61 - docs/rendering/materials-pbr.md | 42 - docs/rendering/materials-phong.md | 110 - docs/rendering/mesh-lod.md | 13 - docs/rendering/overlay-2d-rhi.md | 22 - docs/rendering/post-processing.md | 94 - docs/rendering/reflections.md | 48 - docs/rendering/render-snapshot.md | 57 - docs/rendering/rhi.md | 276 - docs/rendering/shadow-mapping.md | 107 - docs/rendering/texture-quality-lod.md | 178 - docs/rendering/volumetric-lighting.md | 13 - .../chapters/01-introduction.tex | 93 - .../scripting-reference/chapters/02-types.tex | 93 - .../chapters/03-mathematics.tex | 234 - docs/scripting-reference/chapters/04-ecs.tex | 163 - .../chapters/05-components.tex | 191 - .../chapters/06-physics2d.tex | 149 - .../scripting-reference/chapters/07-scene.tex | 94 - .../scripting-reference/chapters/08-audio.tex | 113 - .../scripting-reference/chapters/09-input.tex | 170 - .../chapters/10-scripting.tex | 147 - .../chapters/11-animation.tex | 479 - docs/scripting-reference/front/abstract.tex | 31 - docs/scripting-reference/front/cover.tex | 38 - docs/scripting-reference/logo.png | Bin 53225 -> 0 bytes docs/scripting-reference/main.tex | 143 - docs/scripting/native-modules.md | 51 - docs/scripting/runtime-apis.md | 112 - docs/scripting/scripting.md | 367 - docs/terrain/procedural-tools-plugin.md | 119 - docs/terrain/terrain-plugin.md | 88 - docs/terrain/terrain-system.md | 121 - docs/ui/editor-ui.md | 243 - docs/ui/game-ui.md | 198 - planning/caffeine-studio-ide.md | 845 -- planning/engine-runtime-capabilities-rfc.md | 168 - .../1.1-editor-context-undo-redo.md | 177 - .../1.2-hierarchy-panel.md | 154 - .../1.3-inspector-panel.md | 176 - .../1.4-scene-viewport.md | 158 - .../1.5-asset-browser-v1.md | 159 - .../1.6-scene-editor-orchestrator.md | 163 - .../1.7-save-load-scene.md | 176 - .../2.1-transform-gizmos.md | 136 - .../2.2-drag-and-drop.md | 124 - .../2.3-asset-pipeline-integration.md | 130 - .../2.4-hot-reload-assets.md | 126 - .../2.5-project-manager.md | 128 - .../2.6-asset-browser-v2.md | 114 - .../2.7-multiple-scene-tabs.md | 128 - planning/m3-scripting-runtime/3.1-lua-vm.md | 155 - .../3.2-script-component-system.md | 140 - .../3.3-ecs-lua-bindings.md | 129 - .../m3-scripting-runtime/3.4-sandboxing.md | 112 - .../3.5-script-watcher.md | 129 - .../3.6-editor-script-integration.md | 125 - .../3.7-particle-system.md | 136 - .../4.1-animation-timeline.md | 159 - .../4.2-tilemap-editor.md | 160 - .../4.3-material-shader-editor.md | 162 - .../4.4-audio-preview-spatial.md | 147 - .../4.5-build-system.md | 160 - .../4.6-prefab-system.md | 156 - .../4.7-entity-debugger.md | 149 - .../4.8-plugin-system.md | 163 - planning/terrain/7.1-modulos-adicionais.md | 141 - .../terrain/7.2-combinadores-booleanos.md | 136 - planning/terrain/7.3-brush-de-geracao.md | 115 - planning/terrain/7.4-undo-de-geracao.md | 141 - planning/terrain/7.5-gpu-compute.md | 128 - planning/terrain/7.6-import-png.md | 130 - planning/terrain/7.7-colisao-fisica.md | 157 - planning/terrain/README.md | 102 - scripts/README.md | 140 - 1709 files changed, 101 insertions(+), 208490 deletions(-) create mode 100644 .cursor/mcp.json create mode 100644 .cursor/rules/engine-docs-policy.mdc delete mode 100644 .planning/CAFFEINE_STATUS_REPORT.md create mode 100644 AGENTS.md delete mode 100644 BUILD_CHECKLIST.md delete mode 100644 BUILD_GUIDE.md delete mode 100644 CHANGELOG.md delete mode 100644 SESSION_SUMMARY.md delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.bin/esbuild delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.bin/mime delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/LICENSE.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/README.md delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/bin/esbuild delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/install.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/lib/main.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/lib/main.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/History.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/application.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/express.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/middleware/init.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/middleware/query.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/request.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/response.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/layer.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/route.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/utils.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/view.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.js.map delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.js.map delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/simplex-noise.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.modules.yaml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.package-lock.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.package-map.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm-workspace-state-v1.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64/README.md delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64/bin/esbuild delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/accepts@1.3.8/node_modules/accepts/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/accepts@1.3.8/node_modules/accepts/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/accepts@1.3.8/node_modules/accepts/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/accepts@1.3.8/node_modules/accepts/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/accepts@1.3.8/node_modules/accepts/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/accepts@1.3.8/node_modules/mime-types delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/accepts@1.3.8/node_modules/negotiator delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/array-flatten@1.1.1/node_modules/array-flatten/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/array-flatten@1.1.1/node_modules/array-flatten/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/array-flatten@1.1.1/node_modules/array-flatten/array-flatten.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/array-flatten@1.1.1/node_modules/array-flatten/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/lib/read.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/lib/types/json.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/lib/types/raw.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/lib/types/text.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/lib/types/urlencoded.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/body-parser/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/bytes delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/content-type delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/debug delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/depd delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/destroy delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/http-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/iconv-lite delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/on-finished delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/qs delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/raw-body delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/type-is delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/body-parser@1.20.8/node_modules/unpipe delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/bytes@3.1.2/node_modules/bytes/History.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/bytes@3.1.2/node_modules/bytes/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/bytes@3.1.2/node_modules/bytes/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/bytes@3.1.2/node_modules/bytes/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/bytes@3.1.2/node_modules/bytes/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/actualApply.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/actualApply.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/applyBind.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/applyBind.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionApply.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionApply.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionCall.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionCall.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/reflectApply.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/reflectApply.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/es-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/function-bind delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bind-apply-helpers delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/call-bound@1.0.4/node_modules/get-intrinsic delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-disposition@0.5.4/node_modules/content-disposition/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-disposition@0.5.4/node_modules/content-disposition/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-disposition@0.5.4/node_modules/content-disposition/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-disposition@0.5.4/node_modules/content-disposition/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-disposition@0.5.4/node_modules/content-disposition/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-disposition@0.5.4/node_modules/safe-buffer delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-type@1.0.5/node_modules/content-type/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-type@1.0.5/node_modules/content-type/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-type@1.0.5/node_modules/content-type/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-type@1.0.5/node_modules/content-type/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/content-type@1.0.5/node_modules/content-type/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie-signature@1.0.7/node_modules/cookie-signature/History.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie-signature@1.0.7/node_modules/cookie-signature/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie-signature@1.0.7/node_modules/cookie-signature/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie-signature@1.0.7/node_modules/cookie-signature/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie@0.7.2/node_modules/cookie/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie@0.7.2/node_modules/cookie/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie@0.7.2/node_modules/cookie/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie@0.7.2/node_modules/cookie/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/cookie@0.7.2/node_modules/cookie/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/.coveralls.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/.npmignore delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/.travis.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/component.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/karma.conf.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/node.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/src/browser.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/src/debug.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/src/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/src/inspector-log.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/debug/src/node.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/debug@2.6.9/node_modules/ms delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/depd@2.0.0/node_modules/depd/History.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/depd@2.0.0/node_modules/depd/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/depd@2.0.0/node_modules/depd/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/depd@2.0.0/node_modules/depd/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/depd@2.0.0/node_modules/depd/lib/browser/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/depd@2.0.0/node_modules/depd/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/destroy@1.2.0/node_modules/destroy/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/destroy@1.2.0/node_modules/destroy/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/destroy@1.2.0/node_modules/destroy/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/destroy@1.2.0/node_modules/destroy/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/call-bind-apply-helpers delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/get.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/get.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/set.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/set.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/test/get.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/test/set.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/es-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/dunder-proto@1.0.1/node_modules/gopd delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ee-first@1.1.1/node_modules/ee-first/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ee-first@1.1.1/node_modules/ee-first/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ee-first@1.1.1/node_modules/ee-first/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ee-first@1.1.1/node_modules/ee-first/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/encodeurl@2.0.0/node_modules/encodeurl/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/encodeurl@2.0.0/node_modules/encodeurl/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/encodeurl@2.0.0/node_modules/encodeurl/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/encodeurl@2.0.0/node_modules/encodeurl/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/eval.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/eval.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/range.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/range.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/ref.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/ref.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/syntax.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/syntax.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/type.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/type.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/uri.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/uri.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-errors delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/RequireObjectCoercible.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/RequireObjectCoercible.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/ToObject.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/ToObject.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/isObject.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/isObject.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/@esbuild/linux-x64 delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/LICENSE.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/README.md delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/bin/esbuild delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/install.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/lib/main.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/lib/main.js delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/node_modules/.bin/esbuild delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/escape-html@1.0.3/node_modules/escape-html/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/escape-html@1.0.3/node_modules/escape-html/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/escape-html@1.0.3/node_modules/escape-html/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/escape-html@1.0.3/node_modules/escape-html/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/etag@1.8.1/node_modules/etag/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/etag@1.8.1/node_modules/etag/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/etag@1.8.1/node_modules/etag/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/etag@1.8.1/node_modules/etag/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/etag@1.8.1/node_modules/etag/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/accepts delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/array-flatten delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/body-parser delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/content-disposition delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/content-type delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/cookie delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/cookie-signature delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/debug delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/depd delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/encodeurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/escape-html delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/etag delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/History.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/application.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/express.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/middleware/init.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/middleware/query.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/request.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/response.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/router/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/router/layer.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/router/route.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/utils.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/lib/view.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/express/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/finalhandler delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/fresh delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/http-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/merge-descriptors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/methods delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/on-finished delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/parseurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/path-to-regexp delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/proxy-addr delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/qs delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/range-parser delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/safe-buffer delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/send delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/serve-static delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/setprototypeof delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/statuses delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/type-is delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/utils-merge delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/express@4.22.3/node_modules/vary delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/debug delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/encodeurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/escape-html delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/finalhandler/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/finalhandler/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/finalhandler/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/finalhandler/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/finalhandler/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/finalhandler/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/on-finished delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/parseurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/statuses delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/finalhandler@1.3.2/node_modules/unpipe delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/forwarded@0.2.0/node_modules/forwarded/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/forwarded@0.2.0/node_modules/forwarded/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/forwarded@0.2.0/node_modules/forwarded/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/forwarded@0.2.0/node_modules/forwarded/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/forwarded@0.2.0/node_modules/forwarded/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/fresh@0.5.2/node_modules/fresh/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/fresh@0.5.2/node_modules/fresh/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/fresh@0.5.2/node_modules/fresh/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/fresh@0.5.2/node_modules/fresh/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/fresh@0.5.2/node_modules/fresh/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/.github/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/implementation.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/test/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/test/index.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/call-bind-apply-helpers delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/es-define-property delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/es-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/es-object-atoms delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/function-bind delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/test/GetIntrinsic.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-proto delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/gopd delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/has-symbols delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/hasown delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/math-intrinsics delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/dunder-proto delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/es-object-atoms delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Object.getPrototypeOf.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Object.getPrototypeOf.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Reflect.getPrototypeOf.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Reflect.getPrototypeOf.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/gOPD.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/gOPD.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/shams.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/shams.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/test/shams/core-js.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/test/shams/get-own-property-symbols.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/test/tests.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/function-bind delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/eslint.config.mjs delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/hasown@2.0.4/node_modules/hasown/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/depd delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/http-errors/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/http-errors/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/http-errors/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/http-errors/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/http-errors/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/inherits delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/setprototypeof delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/statuses delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/http-errors@2.0.1/node_modules/toidentifier delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/Changelog.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/dbcs-codec.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/dbcs-data.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/internal.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/sbcs-codec.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/sbcs-data-generated.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/sbcs-data.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/tables/big5-added.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/tables/cp936.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/tables/cp949.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/tables/cp950.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/tables/eucjp.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/tables/gbk-added.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/tables/shiftjis.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/utf16.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/encodings/utf7.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/lib/bom-handling.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/lib/extend-node.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/lib/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/lib/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/lib/streams.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/iconv-lite@0.4.24/node_modules/safer-buffer delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/inherits.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/inherits_browser.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/inherits@2.0.4/node_modules/inherits/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ipaddr.js@1.9.1/node_modules/ipaddr.js/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ipaddr.js@1.9.1/node_modules/ipaddr.js/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ipaddr.js@1.9.1/node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ipaddr.js@1.9.1/node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ipaddr.js@1.9.1/node_modules/ipaddr.js/lib/ipaddr.js.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ipaddr.js@1.9.1/node_modules/ipaddr.js/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/lock.yaml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/abs.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/abs.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/constants/maxArrayLength.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/constants/maxArrayLength.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/constants/maxSafeInteger.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/constants/maxValue.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/constants/maxValue.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/floor.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/floor.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isFinite.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isFinite.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isInteger.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isInteger.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isNaN.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isNaN.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isNegativeZero.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isNegativeZero.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/max.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/max.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/min.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/min.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/mod.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/mod.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/pow.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/pow.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/round.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/round.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/sign.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/sign.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/media-typer@0.3.0/node_modules/media-typer/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/media-typer@0.3.0/node_modules/media-typer/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/media-typer@0.3.0/node_modules/media-typer/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/media-typer@0.3.0/node_modules/media-typer/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/media-typer@0.3.0/node_modules/media-typer/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/merge-descriptors@1.0.3/node_modules/merge-descriptors/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/merge-descriptors@1.0.3/node_modules/merge-descriptors/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/merge-descriptors@1.0.3/node_modules/merge-descriptors/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/merge-descriptors@1.0.3/node_modules/merge-descriptors/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/merge-descriptors@1.0.3/node_modules/merge-descriptors/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/methods@1.1.2/node_modules/methods/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/methods@1.1.2/node_modules/methods/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/methods@1.1.2/node_modules/methods/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/methods@1.1.2/node_modules/methods/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/methods@1.1.2/node_modules/methods/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-db@1.52.0/node_modules/mime-db/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-db@1.52.0/node_modules/mime-db/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-db@1.52.0/node_modules/mime-db/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-db@1.52.0/node_modules/mime-db/db.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-db@1.52.0/node_modules/mime-db/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-db@1.52.0/node_modules/mime-db/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-types@2.1.35/node_modules/mime-db delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-types@2.1.35/node_modules/mime-types/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-types@2.1.35/node_modules/mime-types/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-types@2.1.35/node_modules/mime-types/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-types@2.1.35/node_modules/mime-types/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime-types@2.1.35/node_modules/mime-types/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/.npmignore delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/README.md delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/cli.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/mime.js delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/node_modules/.bin/mime delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/package.json delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/src/build.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/src/test.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/mime@1.6.0/node_modules/mime/types.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ms@2.0.0/node_modules/ms/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ms@2.0.0/node_modules/ms/license.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ms@2.0.0/node_modules/ms/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ms@2.0.0/node_modules/ms/readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ms@2.1.3/node_modules/ms/license.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ms@2.1.3/node_modules/ms/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/ms@2.1.3/node_modules/ms/readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/lib/charset.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/lib/encoding.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/lib/language.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/lib/mediaType.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/negotiator@0.6.3/node_modules/negotiator/package.json delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/.bin/mime delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/@esbuild/linux-x64 delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/accepts delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/array-flatten delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/body-parser delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/bytes delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/call-bind-apply-helpers delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/call-bound delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/content-disposition delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/content-type delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/cookie delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/cookie-signature delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/debug delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/depd delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/destroy delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/dunder-proto delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/ee-first delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/encodeurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/es-define-property delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/es-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/es-object-atoms delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/escape-html delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/etag delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/finalhandler delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/forwarded delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/fresh delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/function-bind delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/get-intrinsic delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/get-proto delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/gopd delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/has-symbols delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/hasown delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/http-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/iconv-lite delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/inherits delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/ipaddr.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/math-intrinsics delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/media-typer delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/merge-descriptors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/methods delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/mime delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/mime-db delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/mime-types delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/ms delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/negotiator delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/object-inspect delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/on-finished delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/parseurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/path-to-regexp delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/proxy-addr delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/qs delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/range-parser delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/raw-body delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/safe-buffer delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/safer-buffer delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/send delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/serve-static delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/setprototypeof delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/side-channel delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/side-channel-list delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/side-channel-map delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/side-channel-weakmap delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/statuses delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/toidentifier delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/type-is delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/unpipe delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/utils-merge delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules/vary delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/example/all.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/example/circular.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/example/fn.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/example/inspect.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/package-support.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/readme.markdown delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test-core-js.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/bigint.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/browser/dom.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/circular.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/deep.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/element.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/err.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/fakes.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/fn.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/global.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/has.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/holes.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/indent-option.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/inspect.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/lowbyte.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/number.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/quoteStyle.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/toStringTag.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/undef.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/test/values.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/util.inspect.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/on-finished@2.4.1/node_modules/ee-first delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/on-finished@2.4.1/node_modules/on-finished/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/on-finished@2.4.1/node_modules/on-finished/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/on-finished@2.4.1/node_modules/on-finished/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/on-finished@2.4.1/node_modules/on-finished/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/on-finished@2.4.1/node_modules/on-finished/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/parseurl@1.3.3/node_modules/parseurl/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/parseurl@1.3.3/node_modules/parseurl/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/parseurl@1.3.3/node_modules/parseurl/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/parseurl@1.3.3/node_modules/parseurl/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/parseurl@1.3.3/node_modules/parseurl/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/path-to-regexp@0.1.13/node_modules/path-to-regexp/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/path-to-regexp@0.1.13/node_modules/path-to-regexp/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/path-to-regexp@0.1.13/node_modules/path-to-regexp/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/path-to-regexp@0.1.13/node_modules/path-to-regexp/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/proxy-addr@2.0.8/node_modules/forwarded delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/proxy-addr@2.0.8/node_modules/ipaddr.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/proxy-addr@2.0.8/node_modules/proxy-addr/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/proxy-addr@2.0.8/node_modules/proxy-addr/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/proxy-addr@2.0.8/node_modules/proxy-addr/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/proxy-addr@2.0.8/node_modules/proxy-addr/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/proxy-addr@2.0.8/node_modules/proxy-addr/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/es-define-property delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/.github/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/.github/THREAT_MODEL.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/LICENSE.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/dist/qs.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/eslint.config.mjs delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/lib/formats.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/lib/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/lib/parse.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/lib/stringify.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/lib/utils.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/test/empty-keys-cases.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/test/parse.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/test/stringify.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/qs/test/utils.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/qs@6.16.0/node_modules/side-channel delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/range-parser@1.2.1/node_modules/range-parser/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/range-parser@1.2.1/node_modules/range-parser/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/range-parser@1.2.1/node_modules/range-parser/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/range-parser@1.2.1/node_modules/range-parser/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/range-parser@1.2.1/node_modules/range-parser/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/bytes delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/http-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/iconv-lite delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/raw-body/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/raw-body/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/raw-body/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/raw-body/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/raw-body/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/raw-body@2.5.3/node_modules/unpipe delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safer-buffer@2.1.2/node_modules/safer-buffer/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safer-buffer@2.1.2/node_modules/safer-buffer/Porting-Buffer.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safer-buffer@2.1.2/node_modules/safer-buffer/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safer-buffer@2.1.2/node_modules/safer-buffer/dangerous.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safer-buffer@2.1.2/node_modules/safer-buffer/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safer-buffer@2.1.2/node_modules/safer-buffer/safer.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/safer-buffer@2.1.2/node_modules/safer-buffer/tests.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/debug delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/depd delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/destroy delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/encodeurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/escape-html delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/etag delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/fresh delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/http-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/mime delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/ms delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/on-finished delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/range-parser delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/send/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/send/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/send/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/send/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/send/index.js delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/send/node_modules/.bin/mime delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/send/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/send@0.19.2/node_modules/statuses delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/encodeurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/escape-html delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/parseurl delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/send delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/serve-static/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/serve-static/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/serve-static/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/serve-static/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/serve-static@1.16.3/node_modules/serve-static/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/setprototypeof@1.2.0/node_modules/setprototypeof/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/setprototypeof@1.2.0/node_modules/setprototypeof/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/setprototypeof@1.2.0/node_modules/setprototypeof/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/setprototypeof@1.2.0/node_modules/setprototypeof/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/setprototypeof@1.2.0/node_modules/setprototypeof/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/setprototypeof@1.2.0/node_modules/setprototypeof/test/index.js delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/es-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/object-inspect delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/list.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/call-bound delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/es-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/get-intrinsic delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/object-inspect delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/call-bound delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/es-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/get-intrinsic delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/object-inspect delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-map delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/es-errors delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/object-inspect delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel-list delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel-map delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel-weakmap delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/side-channel@1.1.1/node_modules/side-channel/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/dist/cjs/simplex-noise.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/dist/cjs/simplex-noise.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/dist/cjs/simplex-noise.js.map delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/dist/esm/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/dist/esm/simplex-noise.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/dist/esm/simplex-noise.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/dist/esm/simplex-noise.js.map delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise/simplex-noise.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/statuses@2.0.2/node_modules/statuses/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/statuses@2.0.2/node_modules/statuses/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/statuses@2.0.2/node_modules/statuses/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/statuses@2.0.2/node_modules/statuses/codes.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/statuses@2.0.2/node_modules/statuses/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/statuses@2.0.2/node_modules/statuses/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/toidentifier@1.0.1/node_modules/toidentifier/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/toidentifier@1.0.1/node_modules/toidentifier/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/toidentifier@1.0.1/node_modules/toidentifier/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/toidentifier@1.0.1/node_modules/toidentifier/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/toidentifier@1.0.1/node_modules/toidentifier/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/type-is@1.6.18/node_modules/media-typer delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/type-is@1.6.18/node_modules/mime-types delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/type-is@1.6.18/node_modules/type-is/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/type-is@1.6.18/node_modules/type-is/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/type-is@1.6.18/node_modules/type-is/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/type-is@1.6.18/node_modules/type-is/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/type-is@1.6.18/node_modules/type-is/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/unpipe@1.0.0/node_modules/unpipe/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/unpipe@1.0.0/node_modules/unpipe/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/unpipe@1.0.0/node_modules/unpipe/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/unpipe@1.0.0/node_modules/unpipe/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/unpipe@1.0.0/node_modules/unpipe/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/utils-merge@1.0.1/node_modules/utils-merge/.npmignore delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/utils-merge@1.0.1/node_modules/utils-merge/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/utils-merge@1.0.1/node_modules/utils-merge/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/utils-merge@1.0.1/node_modules/utils-merge/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/utils-merge@1.0.1/node_modules/utils-merge/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/vary@1.1.2/node_modules/vary/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/vary@1.1.2/node_modules/vary/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/vary@1.1.2/node_modules/vary/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/vary@1.1.2/node_modules/vary/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/vary@1.1.2/node_modules/vary/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/@esbuild/linux-x64/README.md delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/@esbuild/linux-x64/bin/esbuild delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/@esbuild/linux-x64/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/accepts/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/accepts/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/accepts/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/accepts/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/accepts/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/array-flatten/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/array-flatten/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/array-flatten/array-flatten.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/array-flatten/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/lib/read.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/lib/types/json.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/lib/types/raw.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/lib/types/text.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/lib/types/urlencoded.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/body-parser/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/bytes/History.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/bytes/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/bytes/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/bytes/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/bytes/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/actualApply.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/actualApply.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/applyBind.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/applyBind.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/functionApply.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/functionApply.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/functionCall.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/functionCall.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/reflectApply.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/reflectApply.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bind-apply-helpers/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/call-bound/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-disposition/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-disposition/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-disposition/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-disposition/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-disposition/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-type/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-type/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-type/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-type/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/content-type/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie-signature/History.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie-signature/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie-signature/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie-signature/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/cookie/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/.coveralls.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/.npmignore delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/.travis.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/component.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/karma.conf.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/node.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/src/browser.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/src/debug.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/src/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/src/inspector-log.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/debug/src/node.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/depd/History.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/depd/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/depd/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/depd/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/depd/lib/browser/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/depd/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/destroy/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/destroy/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/destroy/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/destroy/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/get.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/get.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/set.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/set.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/test/get.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/test/set.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/dunder-proto/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ee-first/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ee-first/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ee-first/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ee-first/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/encodeurl/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/encodeurl/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/encodeurl/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/encodeurl/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-define-property/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/eval.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/eval.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/range.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/range.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/ref.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/ref.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/syntax.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/syntax.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/type.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/type.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/uri.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-errors/uri.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/RequireObjectCoercible.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/RequireObjectCoercible.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/ToObject.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/ToObject.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/isObject.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/isObject.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/es-object-atoms/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/esbuild delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/escape-html/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/escape-html/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/escape-html/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/escape-html/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/etag/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/etag/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/etag/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/etag/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/etag/package.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/express delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/finalhandler/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/finalhandler/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/finalhandler/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/finalhandler/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/finalhandler/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/finalhandler/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/forwarded/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/forwarded/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/forwarded/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/forwarded/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/forwarded/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/fresh/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/fresh/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/fresh/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/fresh/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/fresh/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/.github/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/implementation.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/test/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/function-bind/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-intrinsic/test/GetIntrinsic.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/Object.getPrototypeOf.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/Object.getPrototypeOf.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/Reflect.getPrototypeOf.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/Reflect.getPrototypeOf.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/get-proto/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/gOPD.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/gOPD.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/gopd/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/shams.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/shams.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/test/shams/core-js.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/test/shams/get-own-property-symbols.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/test/tests.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/has-symbols/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/eslint.config.mjs delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/hasown/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/http-errors/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/http-errors/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/http-errors/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/http-errors/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/http-errors/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/Changelog.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/dbcs-codec.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/dbcs-data.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/internal.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/sbcs-codec.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/sbcs-data-generated.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/sbcs-data.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/tables/big5-added.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/tables/cp936.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/tables/cp949.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/tables/cp950.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/tables/eucjp.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/tables/gbk-added.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/tables/shiftjis.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/utf16.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/encodings/utf7.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/lib/bom-handling.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/lib/extend-node.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/lib/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/lib/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/lib/streams.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/iconv-lite/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/inherits/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/inherits/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/inherits/inherits.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/inherits/inherits_browser.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/inherits/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ipaddr.js/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ipaddr.js/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ipaddr.js/ipaddr.min.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ipaddr.js/lib/ipaddr.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ipaddr.js/lib/ipaddr.js.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ipaddr.js/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/abs.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/abs.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/constants/maxArrayLength.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/constants/maxArrayLength.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/constants/maxSafeInteger.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/constants/maxValue.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/constants/maxValue.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/floor.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/floor.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/isFinite.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/isFinite.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/isInteger.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/isInteger.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/isNaN.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/isNaN.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/isNegativeZero.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/isNegativeZero.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/max.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/max.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/min.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/min.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/mod.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/mod.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/pow.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/pow.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/round.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/round.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/sign.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/sign.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/math-intrinsics/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/media-typer/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/media-typer/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/media-typer/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/media-typer/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/media-typer/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/merge-descriptors/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/merge-descriptors/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/merge-descriptors/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/merge-descriptors/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/merge-descriptors/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/methods/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/methods/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/methods/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/methods/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/methods/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-db/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-db/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-db/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-db/db.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-db/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-db/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-types/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-types/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-types/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-types/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime-types/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/.npmignore delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/README.md delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/cli.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/mime.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/package.json delete mode 100755 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/src/build.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/src/test.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/mime/types.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ms/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ms/license.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ms/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/ms/readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/lib/charset.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/lib/encoding.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/lib/language.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/lib/mediaType.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/negotiator/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/example/all.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/example/circular.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/example/fn.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/example/inspect.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/package-support.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/readme.markdown delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test-core-js.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/bigint.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/browser/dom.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/circular.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/deep.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/element.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/err.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/fakes.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/fn.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/global.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/has.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/holes.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/indent-option.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/inspect.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/lowbyte.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/number.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/quoteStyle.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/toStringTag.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/undef.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/test/values.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/object-inspect/util.inspect.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/on-finished/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/on-finished/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/on-finished/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/on-finished/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/on-finished/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/parseurl/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/parseurl/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/parseurl/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/parseurl/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/parseurl/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/path-to-regexp/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/path-to-regexp/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/path-to-regexp/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/path-to-regexp/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/proxy-addr/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/proxy-addr/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/proxy-addr/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/proxy-addr/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/proxy-addr/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/.github/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/.github/THREAT_MODEL.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/LICENSE.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/dist/qs.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/eslint.config.mjs delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/lib/formats.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/lib/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/lib/parse.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/lib/stringify.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/lib/utils.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/test/empty-keys-cases.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/test/parse.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/test/stringify.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/qs/test/utils.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/range-parser/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/range-parser/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/range-parser/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/range-parser/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/range-parser/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/raw-body/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/raw-body/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/raw-body/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/raw-body/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/raw-body/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safe-buffer/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safe-buffer/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safe-buffer/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safe-buffer/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safe-buffer/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safer-buffer/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safer-buffer/Porting-Buffer.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safer-buffer/Readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safer-buffer/dangerous.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safer-buffer/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safer-buffer/safer.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/safer-buffer/tests.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/SECURITY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/node_modules/ms/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/node_modules/ms/license.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/node_modules/ms/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/node_modules/ms/readme.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/send/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/serve-static/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/serve-static/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/serve-static/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/serve-static/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/serve-static/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/setprototypeof/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/setprototypeof/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/setprototypeof/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/setprototypeof/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/setprototypeof/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/setprototypeof/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/list.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-list/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-map/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel-weakmap/tsconfig.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/.editorconfig delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/.eslintrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/.github/FUNDING.yml delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/.nycrc delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/CHANGELOG.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/index.d.ts delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/test/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/side-channel/tsconfig.json delete mode 120000 assets/general-ultra-realistic-terrain-algorithm/node_modules/simplex-noise delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/statuses/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/statuses/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/statuses/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/statuses/codes.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/statuses/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/statuses/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/toidentifier/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/toidentifier/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/toidentifier/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/toidentifier/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/toidentifier/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/type-is/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/type-is/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/type-is/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/type-is/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/type-is/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/unpipe/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/unpipe/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/unpipe/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/unpipe/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/unpipe/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/utils-merge/.npmignore delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/utils-merge/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/utils-merge/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/utils-merge/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/utils-merge/package.json delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/vary/HISTORY.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/vary/LICENSE delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/vary/README.md delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/vary/index.js delete mode 100644 assets/general-ultra-realistic-terrain-algorithm/node_modules/vary/package.json create mode 160000 caffeine-website delete mode 100644 docs/AUDIT_REPORT.md delete mode 100644 docs/ECOSYSTEM_WORKFLOW.md delete mode 100644 docs/HISTORY.md delete mode 100644 docs/MASTER.md delete mode 100644 docs/README.md delete mode 100644 docs/analysis/EDITOR_STATUS_ANALYSIS.md delete mode 100644 docs/animation/animation-2d.md delete mode 100644 docs/animation/skeletal-animation.md delete mode 100644 docs/api/README.md delete mode 100644 docs/architecture/cafpack.md delete mode 100644 docs/architecture_specs.md delete mode 100644 docs/assets/asset-manager.md delete mode 100644 docs/assets/asset-pipeline.md delete mode 100644 docs/assets/caf-format.md delete mode 100644 docs/assets/mesh-loading.md delete mode 100644 docs/audio/audio-system.md delete mode 100644 docs/caffeine-internals/chapters/01-introduction.tex delete mode 100644 docs/caffeine-internals/chapters/02-type-system.tex delete mode 100644 docs/caffeine-internals/chapters/03-mathematics.tex delete mode 100644 docs/caffeine-internals/chapters/04-memory.tex delete mode 100644 docs/caffeine-internals/chapters/05-containers.tex delete mode 100644 docs/caffeine-internals/chapters/06-ecs.tex delete mode 100644 docs/caffeine-internals/chapters/07-job-system.tex delete mode 100644 docs/caffeine-internals/chapters/08-physics.tex delete mode 100644 docs/caffeine-internals/chapters/09-audio.tex delete mode 100644 docs/caffeine-internals/chapters/10-asset-pipeline.tex delete mode 100644 docs/caffeine-internals/chapters/11-game-loop.tex delete mode 100644 docs/caffeine-internals/chapters/12-viewport.tex delete mode 100644 docs/caffeine-internals/chapters/13-editor.tex delete mode 100644 docs/caffeine-internals/chapters/14-implementation-rules.tex delete mode 100644 docs/caffeine-internals/chapters/15-rhi.tex delete mode 100644 docs/caffeine-internals/chapters/16-rendering-2d.tex delete mode 100644 docs/caffeine-internals/chapters/17-rendering-3d.tex delete mode 100644 docs/caffeine-internals/chapters/18-events.tex delete mode 100644 docs/caffeine-internals/chapters/19-input.tex delete mode 100644 docs/caffeine-internals/chapters/20-debug.tex delete mode 100644 docs/caffeine-internals/chapters/21-scene.tex delete mode 100644 docs/caffeine-internals/chapters/22-animation.tex delete mode 100644 docs/caffeine-internals/chapters/23-scripting.tex delete mode 100644 docs/caffeine-internals/chapters/24-ui.tex delete mode 100644 docs/caffeine-internals/chapters/25-asset-manager.tex delete mode 100644 docs/caffeine-internals/chapters/26-polygons-and-3d-representations.tex delete mode 100644 docs/caffeine-internals/chapters/bibliography.tex delete mode 100644 docs/caffeine-internals/front/abstract.tex delete mode 100644 docs/caffeine-internals/front/cover.tex delete mode 100644 docs/caffeine-internals/logo.png delete mode 100644 docs/caffeine-internals/main.aux delete mode 100644 docs/caffeine-internals/main.lof delete mode 100644 docs/caffeine-internals/main.log delete mode 100644 docs/caffeine-internals/main.lot delete mode 100644 docs/caffeine-internals/main.pdf delete mode 100644 docs/caffeine-internals/main.tex delete mode 100644 docs/caffeine-internals/main.toc delete mode 100644 docs/caffeine-internals/test.log delete mode 100644 docs/caffeine-internals/test.tex delete mode 100644 docs/concurrency/job-system.md delete mode 100644 docs/core/events.md delete mode 100644 docs/core/game-loop.md delete mode 100644 docs/core/timer.md delete mode 100644 docs/core/types.md delete mode 100644 docs/debug/debug-tools.md delete mode 100644 docs/debug/testing.md delete mode 100644 docs/ecs/README.md delete mode 100644 docs/ecs/core.md delete mode 100644 docs/ecs/examples.md delete mode 100644 docs/ecs/scene.md delete mode 100644 docs/editor/git-plugin.md delete mode 100644 docs/editor/material-editor.md delete mode 100644 docs/editor/plugin-sdk.md delete mode 100644 docs/editor/scene-editor.md delete mode 100644 docs/editor/scene-viewport.md delete mode 100644 docs/editor/test-automation.md delete mode 100644 docs/fundamentos-computacao-grafica/assets/cover.png delete mode 100644 docs/fundamentos-computacao-grafica/bibliografia.bib delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/00-introducao.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/01-matematica-essencial.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/02-pipeline-de-renderizacao.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/03-rasterizacao.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/04-modelos-de-iluminacao.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/05-shaders-e-glsl.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/06-texturas.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/07-iluminacao-avancada.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/08-ray-tracing.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/09-tecnicas-modernas.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/10-cor-e-espaco-de-cor.tex delete mode 100644 docs/fundamentos-computacao-grafica/capitulos/A-solucoes.tex delete mode 100644 docs/fundamentos-computacao-grafica/main.tex delete mode 100644 docs/fundamentos-computacao-grafica/metadata.tex delete mode 100644 docs/fundamentos-computacao-grafica/preambulo.tex delete mode 100644 docs/input/input-system.md delete mode 100644 docs/math/quaternions.md delete mode 100644 docs/math/vectors.md delete mode 100644 docs/memory/allocators.md delete mode 100644 docs/memory/containers.md delete mode 100644 docs/memory/memory-model.md delete mode 100644 docs/performance/README.md delete mode 100644 docs/performance/editor-viewport-performance.md delete mode 100644 docs/physics/physics-2d.md delete mode 100644 docs/physics/physics-3d.md delete mode 100644 docs/physics/spatial-partitioning.md delete mode 100644 docs/plans/2025-05-15-script-editor.md delete mode 100644 docs/plans/2026-05-10-camera3d.md delete mode 100644 docs/plans/2026-05-11-scripting-design.md delete mode 100644 docs/plans/2026-05-11-scripting-plan.md delete mode 100644 docs/plans/2026-05-14-transform-gizmos-design.md delete mode 100644 docs/plans/2026-05-14-transform-gizmos-implementation.md delete mode 100644 docs/plans/2026-05-15-asset-pipeline-design.md delete mode 100644 docs/plans/2026-05-15-asset-pipeline-plan.md delete mode 100644 docs/plans/2026-05-15-hot-reload-design.md delete mode 100644 docs/plans/2026-05-15-project-manager-design.md delete mode 100644 docs/plans/2026-05-16-audio-preview-spatial-design.md delete mode 100644 docs/plans/2026-05-16-audio-preview-spatial-plan.md delete mode 100644 docs/plans/2026-05-16-buildsystem-design.md delete mode 100644 docs/plans/2026-05-16-buildsystem-implementation.md delete mode 100644 docs/plans/2026-05-16-e2e-testing-design.md delete mode 100644 docs/plans/2026-05-16-e2e-testing-plan.md delete mode 100644 docs/plans/2026-05-16-material-shader-editor-design.md delete mode 100644 docs/plans/2026-05-16-material-shader-editor-plan.md delete mode 100644 docs/plans/2026-05-16-project-startup-dialog-tabs-design.md delete mode 100644 docs/plans/2026-05-16-project-startup-dialog-tabs.md delete mode 100644 docs/plans/2026-05-16-projectstartup-dialog-plan.md delete mode 100644 docs/plans/2026-05-17-ecosystem-three-phase-design.md delete mode 100644 docs/plans/2026-05-17-ecosystem-three-phase-implementation.md delete mode 100644 docs/plans/2026-05-17-scene-viewport-and-entity-types.md delete mode 100644 docs/plans/2026-05-17-unified-ecosystem-build.md delete mode 100644 docs/plans/2026-05-18-inspector-v2.md delete mode 100644 docs/plans/2026-05-18-play-mode-physics-scripting-tileset.md delete mode 100644 docs/plans/2026-05-20-viewport-3d-iso-gizmos-xyz.md delete mode 100644 docs/plans/2026-05-23-3d-mesh-enhancements.md delete mode 100644 docs/plans/2026-05-23-gizmo-raycasting-performance.md delete mode 100644 docs/plans/2026-05-23-gizmo-raycasting-vp-inverse.md delete mode 100644 docs/plans/2026-05-23-mesh-prefab-asset-pipeline.md delete mode 100644 docs/plans/2026-05-23-mesh-prefab-wiring.md delete mode 100644 docs/plans/2026-05-23-object-selection-raycasting.md delete mode 100644 docs/plans/2026-05-24-doppio-ui-test-framework.md delete mode 100644 docs/plans/2026-09-21-rendering-roadmap.md delete mode 100644 docs/plans/2026-09-22-engine-pillars-roadmap.md delete mode 100644 docs/plans/2026-09-22-phong-gpu-handles-session.md delete mode 100644 docs/plans/2026-09-22-viewport-rendering-quality-session.md delete mode 100644 docs/plans/2026-10-02-editor-backlog-phase-b.md delete mode 100644 docs/plans/2026-10-02-forward-pbr-post-session.md delete mode 100644 docs/plans/2026-10-03-unity-56-manual-gap.md delete mode 100644 docs/releases/runtime-capabilities-patch-notes.md delete mode 100644 docs/rendering/batch-renderer.md delete mode 100644 docs/rendering/camera-2d.md delete mode 100644 docs/rendering/camera-3d.md delete mode 100644 docs/rendering/forward-render-features.md delete mode 100644 docs/rendering/materials-pbr.md delete mode 100644 docs/rendering/materials-phong.md delete mode 100644 docs/rendering/mesh-lod.md delete mode 100644 docs/rendering/overlay-2d-rhi.md delete mode 100644 docs/rendering/post-processing.md delete mode 100644 docs/rendering/reflections.md delete mode 100644 docs/rendering/render-snapshot.md delete mode 100644 docs/rendering/rhi.md delete mode 100644 docs/rendering/shadow-mapping.md delete mode 100644 docs/rendering/texture-quality-lod.md delete mode 100644 docs/rendering/volumetric-lighting.md delete mode 100644 docs/scripting-reference/chapters/01-introduction.tex delete mode 100644 docs/scripting-reference/chapters/02-types.tex delete mode 100644 docs/scripting-reference/chapters/03-mathematics.tex delete mode 100644 docs/scripting-reference/chapters/04-ecs.tex delete mode 100644 docs/scripting-reference/chapters/05-components.tex delete mode 100644 docs/scripting-reference/chapters/06-physics2d.tex delete mode 100644 docs/scripting-reference/chapters/07-scene.tex delete mode 100644 docs/scripting-reference/chapters/08-audio.tex delete mode 100644 docs/scripting-reference/chapters/09-input.tex delete mode 100644 docs/scripting-reference/chapters/10-scripting.tex delete mode 100644 docs/scripting-reference/chapters/11-animation.tex delete mode 100644 docs/scripting-reference/front/abstract.tex delete mode 100644 docs/scripting-reference/front/cover.tex delete mode 100644 docs/scripting-reference/logo.png delete mode 100644 docs/scripting-reference/main.tex delete mode 100644 docs/scripting/native-modules.md delete mode 100644 docs/scripting/runtime-apis.md delete mode 100644 docs/scripting/scripting.md delete mode 100644 docs/terrain/procedural-tools-plugin.md delete mode 100644 docs/terrain/terrain-plugin.md delete mode 100644 docs/terrain/terrain-system.md delete mode 100644 docs/ui/editor-ui.md delete mode 100644 docs/ui/game-ui.md delete mode 100644 planning/caffeine-studio-ide.md delete mode 100644 planning/engine-runtime-capabilities-rfc.md delete mode 100644 planning/m1-scene-editor-foundation/1.1-editor-context-undo-redo.md delete mode 100644 planning/m1-scene-editor-foundation/1.2-hierarchy-panel.md delete mode 100644 planning/m1-scene-editor-foundation/1.3-inspector-panel.md delete mode 100644 planning/m1-scene-editor-foundation/1.4-scene-viewport.md delete mode 100644 planning/m1-scene-editor-foundation/1.5-asset-browser-v1.md delete mode 100644 planning/m1-scene-editor-foundation/1.6-scene-editor-orchestrator.md delete mode 100644 planning/m1-scene-editor-foundation/1.7-save-load-scene.md delete mode 100644 planning/m2-visual-editing-assets/2.1-transform-gizmos.md delete mode 100644 planning/m2-visual-editing-assets/2.2-drag-and-drop.md delete mode 100644 planning/m2-visual-editing-assets/2.3-asset-pipeline-integration.md delete mode 100644 planning/m2-visual-editing-assets/2.4-hot-reload-assets.md delete mode 100644 planning/m2-visual-editing-assets/2.5-project-manager.md delete mode 100644 planning/m2-visual-editing-assets/2.6-asset-browser-v2.md delete mode 100644 planning/m2-visual-editing-assets/2.7-multiple-scene-tabs.md delete mode 100644 planning/m3-scripting-runtime/3.1-lua-vm.md delete mode 100644 planning/m3-scripting-runtime/3.2-script-component-system.md delete mode 100644 planning/m3-scripting-runtime/3.3-ecs-lua-bindings.md delete mode 100644 planning/m3-scripting-runtime/3.4-sandboxing.md delete mode 100644 planning/m3-scripting-runtime/3.5-script-watcher.md delete mode 100644 planning/m3-scripting-runtime/3.6-editor-script-integration.md delete mode 100644 planning/m3-scripting-runtime/3.7-particle-system.md delete mode 100644 planning/m4-advanced-tools-polish/4.1-animation-timeline.md delete mode 100644 planning/m4-advanced-tools-polish/4.2-tilemap-editor.md delete mode 100644 planning/m4-advanced-tools-polish/4.3-material-shader-editor.md delete mode 100644 planning/m4-advanced-tools-polish/4.4-audio-preview-spatial.md delete mode 100644 planning/m4-advanced-tools-polish/4.5-build-system.md delete mode 100644 planning/m4-advanced-tools-polish/4.6-prefab-system.md delete mode 100644 planning/m4-advanced-tools-polish/4.7-entity-debugger.md delete mode 100644 planning/m4-advanced-tools-polish/4.8-plugin-system.md delete mode 100644 planning/terrain/7.1-modulos-adicionais.md delete mode 100644 planning/terrain/7.2-combinadores-booleanos.md delete mode 100644 planning/terrain/7.3-brush-de-geracao.md delete mode 100644 planning/terrain/7.4-undo-de-geracao.md delete mode 100644 planning/terrain/7.5-gpu-compute.md delete mode 100644 planning/terrain/7.6-import-png.md delete mode 100644 planning/terrain/7.7-colisao-fisica.md delete mode 100644 planning/terrain/README.md delete mode 100644 scripts/README.md diff --git a/.cursor/mcp.json b/.cursor/mcp.json new file mode 100644 index 00000000..4752f1c5 --- /dev/null +++ b/.cursor/mcp.json @@ -0,0 +1,9 @@ +{ + "mcpServers": { + "caffeine-docs": { + "command": "node", + "args": ["packages/docs-mcp/src/index.js"], + "cwd": "${workspaceFolder}/caffeine-website" + } + } +} diff --git a/.cursor/rules/engine-docs-policy.mdc b/.cursor/rules/engine-docs-policy.mdc new file mode 100644 index 00000000..af6723ae --- /dev/null +++ b/.cursor/rules/engine-docs-policy.mdc @@ -0,0 +1,10 @@ +--- +description: Engine repo has no Markdown docs; use caffeine-website submodule and MCP +alwaysApply: true +--- + +# Documentation + +- Do not add `docs/` or `planning/` Markdown to the Caffeine engine repo. +- Read `AGENTS.md` for layout and implementation rules. +- User-facing docs: `caffeine-website` submodule (Svelte/HTML + TeX). Agents use `caffeine-docs` MCP from that repo. diff --git a/.gitignore b/.gitignore index 0aa6c5ed..85b0d116 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,12 @@ CTestTestfile.cmake # Git worktrees .worktrees/ + +# Dependencies and local tooling +**/node_modules/ +.doppio-plugins/ + +# Documentation lives in caffeine-website submodule +docs/ +planning/ +.planning/ diff --git a/.gitmodules b/.gitmodules index e9f25f00..74dd4763 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "WaveShaper"] path = WaveShaper url = git@github.com:devscafecommunity/waveshaper.git +[submodule "caffeine-website"] + path = caffeine-website + url = git@github.com:devscafecommunity/caffeine-website.git diff --git a/.planning/CAFFEINE_STATUS_REPORT.md b/.planning/CAFFEINE_STATUS_REPORT.md deleted file mode 100644 index 5724881e..00000000 --- a/.planning/CAFFEINE_STATUS_REPORT.md +++ /dev/null @@ -1,287 +0,0 @@ -# Caffeine Engine - Current Status & Implementation Roadmap - -**Branch**: `121-44-audio-preview-spatial-placement` -**Date**: 2026-05-18 - ---- - -## 1. BUILD & IDE STATUS ✅ - -### Completed -- ✅ doppio.exe fully builds and launches (1.2 MB) -- ✅ All executables built: doppio, caf-encode, caffeine-combined -- ✅ SDL3 integrated and working -- ✅ Clean default UI layout (Hierarchy + Viewport only) -- ✅ File picker works for project creation -- ✅ Project manager operational - -### Known Issues to Fix -- ⚠️ FilePicker window requires scrolling (fixed window size ~600x400) - - **Fix**: Make window resizable and increase default size - - **File**: `src/editor/FilePicker.cpp` line 96-97 - ---- - -## 2. ARCHITECTURE OVERVIEW - -### ECS (Entity Component System) -**Status**: ✅ Fully implemented and working - -**Core Files**: -- `src/ecs/Entity.hpp` - Entity definition -- `src/ecs/World.hpp` - World/scene management -- `src/ecs/Components.hpp` - Basic components (Position2D, Velocity2D, Rotation, Scale2D, Sprite, Health, Tag, ParticleEmitterComponent) -- `src/ecs/ComponentID.hpp` - Component type system -- `src/ecs/ComponentQuery.hpp` - Entity querying - -**Current Components Available**: -1. **Transform**: Position2D, Velocity2D, Acceleration2D, Rotation, Scale2D -2. **Visual**: Sprite (name, frameIndex only - minimal) -3. **Audio**: AudioComponents.hpp (exists but not integrated) -4. **Animation**: AnimationComponents.hpp (exists) -5. **Camera**: CameraComponents.hpp -6. **Light**: LightComponents.hpp -7. **Particle**: ParticleEmitterComponent -8. **Mesh**: MeshComponents.hpp (3D, not priority for 2D) -9. **Health/Tag**: For basic game mechanics - ---- - -## 3. FEATURE GAPS & PRIORITIES - -### 🔴 CRITICAL (Blocking Game Development) - -#### 1. **Inspector Panel - Minimal (15-20% complete)** - - **Current State**: - - Only 6 component drawers implemented (Transform, Sprite, Camera, RigidBody2D, AudioSource, Script) - - Sprite drawer is basic: just name + frameIndex - - No property discovery/reflection system - - Hard-coded drawer registration - - - **What's Missing**: - - Dynamic component property inspection - - Proper enum selection UI (e.g., for ColliderShape, ToolMode) - - Vector/color pickers - - Asset reference selectors - - Dropdown selectors for components - - Undo/redo support - - - **File**: `src/editor/InspectorPanel.hpp/cpp` - - **Priority**: 🔴 CRITICAL - Can't edit entities without this - - **Effort**: ~3-5 days - -#### 2. **Physics System - Incomplete (30% implemented)** - - **Current State**: - - Components exist: RigidBody2D, Collider2D, PhysicsMaterial - - PhysicsSystem2D has 700+ lines of implementation - - Collision detection logic exists - - Force/impulse system exists - - - **What's Missing**: - - Physics simulation not hooked into editor/game loop properly - - Collision callbacks not firing (callOnCollision exists but untested) - - No visual debugging (collision visualizers) - - No physics settings UI in editor - - Sleep optimization incomplete - - - **Files**: `src/physics/PhysicsComponents2D.hpp`, `src/physics/PhysicsSystem2D.hpp` - - **Priority**: 🔴 CRITICAL - No game without physics - - **Effort**: ~2-3 days to integrate properly - -#### 3. **Scripting System - Scaffolding only (5% usable)** - - **Current State**: - - ScriptEngine exists with lifecycle hooks: onCreate, onUpdate, onDestroy, onCollision - - ScriptEngine can load scripts and call them - - Script watcher for hot-reload - - - **What's Missing**: - - **No script binding** - engine classes not exposed to scripts - - **No runtime** - what language? (Lua? C#? Custom?) - - **No entity access** - scripts can't modify entities - - **No API documentation** - - Script component UI in inspector - - - **Files**: `src/script/ScriptEngine.hpp/cpp`, `src/script/ScriptSystem.cpp` - - **Priority**: 🔴 CRITICAL - Game logic impossible without this - - **Effort**: ~5-7 days (depends on language choice) - -#### 4. **2D Tools - Partial (40% usable)** - - **Tilemap Editor**: - - ✅ Brush, Bucket, Eraser, Picker tools defined - - ✅ TileLayer and Tilemap classes exist - - ❌ No tileset loading/display - - ❌ No rendering - - ❌ No grid visualization - - ❌ No tool UI integration - - - **Sprite Handling**: - - ✅ Sprite component exists - - ❌ No sprite atlas/sheet support - - ❌ No frame animation UI - - ❌ No sprite preview in inspector - - - **Files**: `src/editor/TilemapEditor.hpp/cpp` - - **Priority**: 🔴 CRITICAL for 2D - Can't make 2D games without tilesets - - **Effort**: ~4-6 days - ---- - -### 🟡 HIGH (Important for full feature set) - -#### 5. **Component Registration/Discovery** - - **Current State**: Components are discoverable via ECS but Inspector doesn't auto-discover them - - **Need**: Reflection/metadata system so inspector can show all component properties - - **Priority**: HIGH - Unlocks dynamic UI generation - - **Effort**: ~2-3 days - -#### 6. **Asset Pipeline** - - **Current State**: Basic asset browser exists - - **Missing**: - - Texture import/settings - - Sprite atlas creation - - Tileset definition files - - Audio asset metadata - - **Priority**: HIGH - - **Effort**: ~3-5 days - -#### 7. **Scene Serialization** - - **Current State**: Likely partial - - **Missing**: Save/load entity hierarchies with full state - - **Priority**: HIGH - - **Effort**: ~2-3 days - ---- - -### 🟢 MEDIUM (Nice to have) - -#### 8. **Particle System Integration** - - ParticleEmitterComponent exists but likely not wired to renderer - - **Effort**: ~1-2 days - -#### 9. **Animation System** - - AnimationComponents exist - - **Effort**: ~2-3 days - -#### 10. **3D Support** - - Components3D.hpp exists - - **Effort**: Defer - focus on 2D first - ---- - -## 4. IMMEDIATE NEXT STEPS (Priority Order) - -### Week 1: -1. **Fix FilePicker window sizing** (1 hour) - - Make resizable, increase default size to 800x600 - -2. **Expand Inspector with property types** (2-3 days) - - Add UI for all basic property types (float, int, bool, Vec2, color, enum) - - Test with Transform and Sprite components - - Add component add/remove UI - -3. **Integrate Physics visually** (2 days) - - Hook PhysicsSystem2D into scene editor - - Add collision debug visualization - - Test RigidBody2D + Collider2D on entities - -### Week 2: -4. **Basic Scripting Integration** (3-5 days) - - Choose scripting language (recommend: **Lua** for simplicity, or **C#** if .NET available) - - Create bindings for basic engine functions - - Allow attaching scripts to entities - - Test onCreate/onUpdate lifecycle - -5. **2D Editor Tools** (4-6 days) - - Implement tileset editor - - Implement tilemap painter - - Grid visualization - - Basic rendering integration - ---- - -## 5. REFERENCE ARCHITECTURE (Unity-inspired) - -### Inspector (Property Editor) -``` -Entity: "Player" -├─ Transform -│ ├─ Position: (0, 0) [Vec2Drawer] -│ ├─ Rotation: 45° [SliderDrawer] -│ └─ Scale: (1, 1) [Vec2Drawer] -├─ Sprite -│ ├─ Texture: [AssetSelector] -│ ├─ Frame: 0 [IntDrawer] -│ └─ Color: white [ColorDrawer] -├─ RigidBody2D -│ ├─ Mass: 1.0 [FloatDrawer] -│ ├─ Gravity Scale: 1.0 [FloatDrawer] -│ ├─ Constraints: [FlagDrawer] -│ └─ Collision Matrix [LayerMaskDrawer] -├─ Collider2D -│ ├─ Shape: AABB [EnumDrawer] -│ ├─ Size: (32, 32) [Vec2Drawer] -│ ├─ Layer: 0 [LayerDrawer] -│ └─ Is Trigger: false [BoolDrawer] -└─ [+ Add Component...] -``` - -### ScriptAPI (example Lua) -```lua --- Player.lua -entity:getComponent("RigidBody2D").velocity = {100, 0} -entity:getComponent("Sprite").frameIndex = 1 -input.isKeyDown("w") -- true/false -``` - ---- - -## 6. FILE CHECKLIST - -### Core Systems (Check/expand these) -- [ ] `src/ecs/Components.hpp` - Add missing component types -- [ ] `src/editor/InspectorPanel.cpp` - Expand with property drawers -- [ ] `src/physics/PhysicsSystem2D.hpp` - Wire to main game loop -- [ ] `src/script/ScriptEngine.cpp` - Add engine bindings -- [ ] `src/editor/TilemapEditor.cpp` - Implement rendering -- [ ] `src/editor/FilePicker.cpp` - Fix window sizing - -### Next Exploration -- [ ] How scenes are serialized (look for SceneSerializer) -- [ ] How assets are loaded (look in `src/assets/`) -- [ ] Render pipeline (look in `src/render/`) -- [ ] How systems integrate into main game loop (look in `src/engine/`) - ---- - -## 7. BUILD & TESTING - -### Current Build Status -```bash -cd build && cmake --build . --config Release -# doppio.exe ready in build/Release/ - -# Test game creation: -./build/Release/doppio.exe -# → Create project → Open scene → Edit entities -``` - -### What to Test Next -1. Create new 2D project -2. Add entity with Sprite + RigidBody2D + Collider2D -3. Verify inspector shows all properties -4. Save/load scene -5. Run game with physics - ---- - -## SUMMARY - -**Caffeine Engine is a solid skeleton** with ECS, physics, scripting, and 2D tools scaffolding in place. The critical path to usable game development is: - -1. **Inspector expansion** (15-20 hours) - Make it show/edit all component properties -2. **Physics integration** (10-15 hours) - Hook to game loop, add debug visualization -3. **Scripting bindings** (20-30 hours) - Expose engine API to script language -4. **2D tools completion** (25-35 hours) - Tileset editor, tilemap painter -5. **Testing & bug fixes** (ongoing) - -**Realistic timeline**: 3-4 weeks for a usable 2D indie game editor at Unity-lite feature level. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..61e297b4 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,55 @@ +# AGENTS.md — Caffeine Engine + +Rules for humans and coding agents working in **this repository** (the C++ engine). User-facing documentation lives in the **`caffeine-website`** submodule, not here. + +## Repository layout + +| Path | Purpose | +|------|---------| +| `src/` | Engine runtime, editor, render, script bridge | +| `apps/` | Executables (runtime, editor shells, plugins) | +| `include/` | Public C++ headers shipped to games/tools | +| `tests/` | GTest suites | +| `cmake/` | CMake modules | +| `assets/` | Sample content (no `node_modules` in git) | +| `caf-pack/`, `Convoy/`, `WaveShaper/` | Git submodules | +| `caffeine-website/` | Docs site (Svelte/HTML), TeX/PDF, docs MCP | + +Do not add `docs/`, `planning/`, or `.planning/` back to this repo. + +## Documentation policy + +- **No Markdown documentation** in the engine tree (no `docs/**/*.md`, no planning RFCs here). +- **Specs and manuals**: Svelte/HTML in `caffeine-website/packages/docs-site`, or LaTeX under `caffeine-website/tex/` for PDFs. +- **Agents**: Use the **caffeine-docs MCP** from `caffeine-website` (`search_docs`, `get_doc`). Do not scrape removed paths from git history unless the user asks. +- **README.md** here is only a short entrypoint with build commands and a link to the site submodule. + +## Implementation rules + +1. **C++20**, CMake 3.20+, SDL3 — match existing style in the file you edit. +2. **Minimal diffs** — one concern per change; no drive-by refactors. +3. **Tests** — add or update tests under `tests/` when behavior changes; run `ctest` from the build dir. +4. **Submodules** — after clone, `git submodule update --init --recursive`. +5. **Editor vs runtime** — keep play-mode-only code out of editor-only paths unless shared APIs are intentional. +6. **Scripting / native modules** — follow public headers in `include/caffeine/`; document API changes in the website repo, not here. +7. **Commits** — only when the user requests; never commit secrets or local build artifacts. + +## Build (quick) + +```bash +git submodule update --init --recursive +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j +cd build && ctest --output-on-failure +``` + +Cross-platform helpers: `scripts/build.sh`, `scripts/build.bat`, `scripts/build.fish`. + +## Submodule: caffeine-website + +```bash +git submodule update --init caffeine-website +cd caffeine-website && npm install && npm run dev +``` + +Publish doc changes in that repository; bump the submodule pointer in the engine when the user wants the engine repo to pin a new docs revision. diff --git a/BUILD_CHECKLIST.md b/BUILD_CHECKLIST.md deleted file mode 100644 index 83ab04e6..00000000 --- a/BUILD_CHECKLIST.md +++ /dev/null @@ -1,181 +0,0 @@ -# ✅ Caffeine Engine - Build Checklist - -**Data:** 21 de Maio de 2026 -**Status:** 🟢 **CONCLUÍDO COM SUCESSO** - ---- - -## 📋 Componentes Compilados - -- [x] **Core Library** (`libcaffeine-core.a`) - - [x] Timer & GameLoop - - [x] Memory Management (Linear, Pool, Stack) - - [x] Job System (Work-Stealing) - - [x] ECS (Entity Component System) - - [x] Asset Manager & Pipeline - - [x] Event Bus (Type-Safe) - - [x] Input System - - [x] Debug Tools (Logger, Profiler) - - [x] RHI (SDL3-GPU) - - [x] Scripting (Lua) - -- [x] **Editor Application** (`doppio`) - - [x] Scene Editor - - [x] Hierarchy Panel - - [x] Inspector Panel - - [x] Asset Browser - - [x] Material Editor - - [x] Animation Timeline - - [x] Build System - - [x] Command Palette - -- [x] **Tool: Asset Compiler** (`caf-encode`) - - [x] Texture conversion (PNG → .caf) - - [x] Mesh conversion (OBJ/glTF → .caf) - - [x] Audio conversion (WAV → .caf) - -- [x] **Tool: Asset Packer** (`caf-pack`) - - [x] Batch asset packing - - [x] Optimization - -- [x] **Standalone App** (`caffeine-combined`) - - [x] Core + example - - [x] Ready to extend - -- [x] **Support Libraries** - - [x] ImGui (UI Framework) - - [x] Lua 5.4 (Scripting) - - [x] ImNodes (Node Editor) - ---- - -## 📊 Build Statistics - -- [x] Files compiled: **150+** -- [x] Source lines: **~50,000** (core) -- [x] Build time: **~2 minutes** -- [x] Errors: **0** -- [x] Warnings (core): **0** (deps have non-critical warnings) - ---- - -## 🔍 Quality Checks - -- [x] All binaries executable -- [x] All binaries linked correctly -- [x] LSP support available (`compile_commands.json`) -- [x] Debug symbols preserved (not stripped) -- [x] Release optimizations applied (-O3) -- [x] C++20 features enabled -- [x] SDL3 integration verified -- [x] Lua integration verified -- [x] Multi-threading enabled (Job System) - ---- - -## 🧪 Verification Tests - -- [x] doppio runs (requires display) -- [x] caf-encode --help works -- [x] caffeine-combined boots (shows core tests) -- [x] libcaffeine-core.a symbols verified -- [x] Dependencies resolved (libSDL3, libc) - ---- - -## 📚 Documentation - -- [x] LaTeX document compiled (129 pages, 720 KB) - - [x] Table of Contents populated - - [x] List of Figures populated - - [x] List of Tables populated - - [x] All chapters included - - [x] Bibliography included - -- [x] Build report created (`COMPILACAO_COMPLETA.md`) - ---- - -## 🚀 Deliverables - -### Binaries (Ready to Use) -``` -✅ /build/doppio (3.5 MB) -✅ /build/caf-encode (63 KB) -✅ /build/caffeine-combined (47 KB) -✅ /build/caf-pack/src/caf-pack (92 KB) -``` - -### Libraries (Ready to Link) -``` -✅ /build/libcaffeine-core.a (1.5 MB) -✅ /build/libImGui.a (1.7 MB) -✅ /build/libImNodes.a (81 KB) -✅ /build/liblua54.a (610 KB) -``` - -### Documentation -``` -✅ /docs/caffeine-internals/main.pdf (720 KB, 129 pages) -✅ /build/COMPILACAO_COMPLETA.md (Full report) -✅ /build/compile_commands.json (LSP support) -``` - ---- - -## ⚠️ Known Issues (Non-Blocking) - -- [ ] Tests compilation failed (Position2D component deprecated) - - **Impact:** None (core + binaries are fine) - - **Fix:** Update tests or restore component alias - - **Status:** Low priority - -- [ ] ImGui warnings (macro redefinitions) - - **Impact:** None (non-critical) - - **Fix:** Suppress in CMake (later) - - **Status:** Cosmetic - ---- - -## 🎯 Next Steps - -1. **Development** - - [ ] Test doppio editor with sample projects - - [ ] Create first game with asset pipeline - -2. **Testing** - - [ ] Fix Position2D tests - - [ ] Add more unit tests - - [ ] Performance profiling - -3. **Documentation** - - [ ] Add API reference examples - - [ ] Create tutorial guide - - [ ] Record video walkthrough - -4. **Optimization** - - [ ] Profile memory usage - - [ ] Optimize hot paths - - [ ] Reduce binary sizes - ---- - -## ✨ Summary - -**All core components successfully compiled and verified. Engine is ready for production use.** - -- ✅ Engine core fully functional -- ✅ Editor (doppio) ready -- ✅ Asset pipeline working -- ✅ Scripting (Lua) integrated -- ✅ Documentation complete -- ✅ LSP support available - -**Status: 🟢 GREEN - READY FOR DEVELOPMENT** - ---- - -*Compiled on: 2026-05-21* -*Compiler: GCC 16.1.1* -*Platform: Linux x86-64* -*Standard: C++20* diff --git a/BUILD_GUIDE.md b/BUILD_GUIDE.md deleted file mode 100644 index bd3bd16a..00000000 --- a/BUILD_GUIDE.md +++ /dev/null @@ -1,472 +0,0 @@ -# ☕ Caffeine Engine - Universal Build Script - -**Easy-to-use unified build automation for all platforms.** - -One command to configure, build, test, and run the Caffeine Engine on Windows, macOS, and Linux. - ---- - -## Quick Start - -### Linux/macOS (Bash) -```bash -./caffeine-build # Debug build -./caffeine-build build --release # Release build -./caffeine-build rebuild --release # Full rebuild -./caffeine-build test # Run tests -./caffeine-build run # Execute game -``` - -### Windows (PowerShell/CMD) -```batch -.\caffeine-build # Debug build -.\caffeine-build build --release # Release build -.\caffeine-build rebuild --release # Full rebuild -.\caffeine-build test # Run tests -.\caffeine-build run # Execute game -``` - ---- - -## Commands - -### `build` - Configure & Compile -Builds the project with automatic configuration if needed. - -```bash -./caffeine-build build # Build Debug -./caffeine-build build --release # Build Release -./caffeine-build build --release --jobs 8 # Custom parallel jobs -``` - -**What it does:** -1. Checks CMake configuration (runs `config` if not configured) -2. Compiles with parallel jobs (auto-detected CPU cores) -3. Lists built artifacts - -**Exit codes:** -- `0` = Success -- `1` = Build failed - ---- - -### `config` - Configure CMake -Sets up CMake configuration without building. - -```bash -./caffeine-build config # Debug config -./caffeine-build config --release # Release config -./caffeine-build config --headless # Headless (no graphics) -./caffeine-build config --scripting # Enable Lua scripting -./caffeine-build config --release --headless # Combined options -``` - -**Options:** -- `--debug` - Debug mode with symbols (default) -- `--release` - Release mode with optimizations -- `--headless` - Build without SDL3/graphics (server/CI mode) -- `--scripting` - Enable Lua scripting support - ---- - -### `rebuild` - Clean + Configure + Build -Full rebuild from scratch. - -```bash -./caffeine-build rebuild # Full Debug rebuild -./caffeine-build rebuild --release # Full Release rebuild -./caffeine-build rebuild --release --headless # Full Release headless rebuild -``` - -**What it does:** -1. Removes all build artifacts (`build/` and `bin/`) -2. Runs CMake configuration -3. Builds project - -**Use this when:** -- You've changed CMakeLists.txt -- Build is broken and needs fresh start -- You're switching between Debug/Release - ---- - -### `test` - Run Test Suite -Executes all unit tests. - -```bash -./caffeine-build test # Run tests (auto-builds if needed) -./caffeine-build build && ./caffeine-build test # Build then test -``` - -**What it does:** -1. Verifies build directory exists -2. Runs CTest with parallel execution -3. Reports success/failure - -**Exit codes:** -- `0` = All tests passed -- `1` = One or more tests failed - ---- - -### `run` - Execute Binary -Launches the built game/editor executable. - -```bash -./caffeine-build run # Run Release binary if exists, else Debug -``` - -**What it does:** -1. Searches for built executable in standard locations -2. Launches with same working directory - -**Searches:** -- `./bin/caffeine-combined` -- `./build/apps/doppio/caffeine-combined` -- `./build/bin/caffeine-combined` -- Full `./build/` recursion as fallback - ---- - -### `clean` - Remove Build Artifacts -Deletes all build outputs. - -```bash -./caffeine-build clean # Remove build/ and bin/ -``` - -**Removes:** -- `./build/` - CMake build directory -- `./bin/` - Binary directory - -**Use this when:** -- You want to free disk space -- Build is corrupted -- Switching major build options - ---- - -### `help` - Show Help -Displays command reference and examples. - -```bash -./caffeine-build help -./caffeine-build --help -./caffeine-build -h -``` - ---- - -## Global Options - -These options can be combined with any command: - -```bash -./caffeine-build [command] [options] -``` - -### `--debug` (Default) -Build in debug mode with full symbols. - -```bash -./caffeine-build build --debug -./caffeine-build rebuild --debug -``` - -### `--release` -Build in release mode with optimizations. - -```bash -./caffeine-build build --release -./caffeine-build rebuild --release -``` - -### `--headless` -Build without SDL3/graphics (server/CI mode). - -```bash -./caffeine-build config --headless -./caffeine-build rebuild --headless -``` - -### `--scripting` -Enable Lua scripting support. - -```bash -./caffeine-build config --scripting -./caffeine-build build --scripting -``` - -### `--clean` -Clean build artifacts before building. - -```bash -./caffeine-build build --clean # Same as: clean && build -./caffeine-build build --release --clean # Release rebuild -``` - -### `--jobs N` -Use N parallel compilation jobs. - -```bash -./caffeine-build build --jobs 8 # Use 8 cores -./caffeine-build rebuild --jobs 4 # Use 4 cores -``` - -**Default:** Auto-detected from CPU count - ---- - -## Common Workflows - -### Fresh Start (Recommended First Build) -```bash -./caffeine-build rebuild -``` - -### Debug Development Loop -```bash -./caffeine-build build && ./caffeine-build test -``` - -### Release Build -```bash -./caffeine-build rebuild --release -``` - -### Run Game After Build -```bash -./caffeine-build build && ./caffeine-build run -``` - -### Full Development Cycle -```bash -./caffeine-build clean # Start fresh -./caffeine-build build # Build Debug -./caffeine-build test # Run tests -./caffeine-build run # Execute game -``` - -### Server/CI Build (No Graphics) -```bash -./caffeine-build rebuild --headless --release -``` - -### Quick Iteration -```bash -./caffeine-build build && ./caffeine-build test && ./caffeine-build run -``` - ---- - -## Directory Structure - -``` -caffeine/ -├── caffeine-build # Unix/macOS build script (executable) -├── caffeine-build.bat # Windows build script -├── build/ # CMake build directory (created) -│ ├── CMakeCache.txt -│ ├── Makefile -│ ├── compile_commands.json -│ └── tests/ -├── bin/ # Built binaries (created) -│ └── caffeine-combined # Main executable -├── src/ # Source code -├── tests/ # Test suite -├── docs/ -│ └── building.md # Detailed build documentation -└── scripts/ - ├── README.md # Legacy scripts reference - ├── build.sh # Original shell script - ├── build_manager.py # Build manager library - └── version_manager.py # Version tracking -``` - ---- - -## Requirements - -### All Platforms -- **CMake** 3.20+ ([install](https://cmake.org/download/)) -- **Git** ([install](https://git-scm.com/)) -- **C++ Compiler** supporting C++20 - -### Platform-Specific - -**Linux/macOS:** -- `bash` shell -- `python3` (optional, for extra features) -- `ctest` (part of CMake) - -**Windows:** -- PowerShell 5.0+ OR Command Prompt -- Visual Studio 2022 (with C++ workload) OR -- MSVC compiler via command line - -### Optional Dependencies -- **SDL3** - For graphics (disable with `--headless`) -- **Lua 5.3+** - For scripting (enable with `--scripting`) -- **ImGui** - For editor UI (included) - ---- - -## Installation - -### 1. Make Script Executable (Linux/macOS only) -```bash -chmod +x caffeine-build -``` - -### 2. Optional: Add to PATH -To use from anywhere: - -**Linux/macOS:** -```bash -# Copy to global location -sudo cp caffeine-build /usr/local/bin/ - -# Then use from anywhere: -caffeine-build build --release -``` - -**Windows:** -```batch -REM Add project directory to PATH environment variable -REM Or run from project root: .\caffeine-build -``` - ---- - -## Troubleshooting - -### "CMake not found" -Install CMake: -```bash -# macOS -brew install cmake - -# Linux -apt-get install cmake - -# Windows -choco install cmake -# OR download from https://cmake.org/download/ -``` - -### "Permission denied" (Linux/macOS) -Make script executable: -```bash -chmod +x caffeine-build -``` - -### Build fails with "SDL3 not found" -Either: -1. Install SDL3: `brew install sdl3` (macOS) -2. Use headless mode: `./caffeine-build rebuild --headless` - -### "Python not found" -Some build features require Python 3: -```bash -# macOS -brew install python3 - -# Linux -apt-get install python3 -``` - -### Clean rebuild needed -```bash -./caffeine-build clean rebuild -``` - -### Parallel jobs slow down build -Reduce jobs: -```bash -./caffeine-build build --jobs 2 -``` - ---- - -## Performance Tips - -1. **Auto-detect cores:** Script auto-detects CPU cores (use `--jobs N` to override) -2. **Incremental builds:** Don't use `clean` unless necessary -3. **ccache (Optional):** Speeds up recompilation - ```bash - # Linux/macOS - brew install ccache - ``` -4. **Precompiled headers:** CMake uses them automatically -5. **Parallel linking:** Build with `--jobs $(nproc)` for full parallelism - ---- - -## Advanced Usage - -### Build Specific Target -Edit `caffeine-build` to add: -```bash -cmake --build . --target caffeine-core --parallel $PARALLEL_JOBS -``` - -### Install Build -Add to script: -```bash -cmake --install build --config Release --prefix /usr/local -``` - -### Export Compile Commands -For IDE integration: -```bash -./caffeine-build config -# Compile commands in: build/compile_commands.json -``` - -### Profile Build Time -```bash -time ./caffeine-build rebuild --release -``` - -### Verbose Output -```bash -cd build -cmake --build . --verbose --parallel 1 -``` - ---- - -## Legacy Scripts - -The original scripts in `scripts/` are still available: - -- `scripts/build.sh` - Original shell script -- `scripts/build.bat` - Original batch script -- `scripts/build_manager.py` - Python build manager - -The new `caffeine-build` script is recommended for daily use. - ---- - -## Contributing - -To improve the build script: - -1. Test changes on all three platforms (Windows, macOS, Linux) -2. Ensure backwards compatibility -3. Update this documentation -4. Follow existing shell conventions - ---- - -## References - -- [CMake Documentation](https://cmake.org/cmake/help/latest/) -- [CTest Documentation](https://cmake.org/cmake/help/latest/manual/ctest.1.html) -- [C++20 Compiler Support](https://en.cppreference.com/w/cpp/compiler_support) -- See also: `docs/building.md` - ---- - -**Last Updated:** May 2026 -**Maintained By:** Caffeine Development Team diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index a24ac2b6..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,636 +0,0 @@ -# Changelog - -Todas as alterações notáveis do projeto **Caffeine Engine** / **Doppio IDE** estão documentadas neste ficheiro. - -O formato segue [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/) e o histórico completo de **419 commits** (desde 2026-04-06) está no [Apêndice](#apêndice--histórico-completo-de-commits). - -Legenda de categorias: **Added** · **Changed** · **Fixed** · **Removed** · **Deprecated** · **Security** - ---- - -## [Unreleased] - -_Nada por agora._ - ---- - -## [2026-09-23] — Performance do editor, profiler hierárquico & skybox - -### Added -- **Profiler hierárquico** — árvore de scopes com `self ms` (exclusivo), `total ms` (inclusivo), `% frame`, `% parent` e caminho completo no tooltip. -- Documentação [`docs/performance/editor-viewport-performance.md`](docs/performance/editor-viewport-performance.md) e índice em [`docs/performance/README.md`](docs/performance/README.md). -- `CF_PROFILE_SCOPE` granular em `SceneEditor`, `SceneViewport`, `GpuSceneRenderer` (`renderWithCamera`, `gather`, `shadows`, `draw`). -- Cache de GPU nos previews (Gameplay / Camera) — re-render só quando câmera ou tamanho mudam. -- Skybox **motion-adaptive**: raster a 384 px enquanto a câmera move; resolução completa após parar. - -### Changed -- **Editor viewport ~10 → ~100 FPS** — separação GPU/CPU por frame, shadow UBO uma vez por pass, cache de texturas de terreno, LOD ×2, cap 1280 px, sombras off no editor. -- `GpuSceneRenderer`: samplers de sombra **sempre** ligados (evita SIGSEGV NVIDIA); passes de sombra omitidos no editor. -- `SceneViewport`: skip de `gpuPass` quando câmera/canvas/modo inalterados. -- Previews: throttle GPU (intervalo 2 quando parado), caps de skybox reduzidos (256–640 px). -- Profiler UI: refresh da árvore a cada 15 frames; `Expand All` off por defeito. - -### Fixed -- Skybox a piscar e atrasar o terreno nos previews (sky + GPU dessincronizados). -- Erros ImGui `Missing TreePop()` / `PushID/PopID` na árvore do Profiler. -- Stutters ao mover câmera após remoção do throttle do skybox (raster adaptativo + menos GPU redundante). -- Correção de link em `tests/CMakeLists.txt` (`PluginSymbolExports.cpp`) para `CaffeineTest`. - ---- - -## [2026-09-22] — Plugins opcionais & qualidade GPU - -### Added -- **Plugin SDK** público (`include/caffeine/plugin/`) com host API, service registry e carregamento dinâmico (`dlopen` + `-rdynamic`). -- Plugins opcionais: **Git**, **Terrain Generator**, **Procedural Tools**, **Post Processing**, **Hello** (demo). -- Painel Git com status, stage/unstage, commit, branches, remotes, stash, log e diff. -- Sistema procedural modular (terrain profile, structure spawner, benchmarks Lua). -- Post-processing modular por efeito + presets benchmark + bindings Lua. -- Terrain heightmap importer, collision mesh builder, algoritmo ultra-realistic (Node.js). -- Roadmaps: engine pillars, rendering, Phong GPU handles, viewport quality. -- Documentação: `plugin-sdk.md`, `git-plugin.md`, terrain, post-processing. - -### Changed -- Doppio core **lean**: geração de terrain e UI de features movidas para plugins. -- `CAFFEINE_BUNDLE_DEFAULT_PLUGINS` (OFF por defeito) — plugins não copiados automaticamente. -- Inspector delega drawers de Post Process ao plugin; mensagens quando plugin ausente. -- Preview de post-process no **Scene Viewport** + overlays mais visíveis. -- Command palette: atalho **Ctrl+L** (mantém Ctrl+Shift+P). -- IDs estáveis de plugin (stem do `.so`) — corrige crash SIGSEGV ao carregar múltiplos plugins. -- Melhorias GPU: Phong materials, shadow maps (directional/point/spot), texture LOD/cache, `GpuSceneRenderer`, shaders `scene_lit`/`terrain_lit`. -- `TimerScheduler`, `Camera3DSystem`, `PluginSymbolExports` para símbolos exportados a plugins. -- Viewport: pan/zoom 2D melhorado, click-to-select, qualidade de rendering. - -### Removed -- Geração procedural de terrain embutida no core (`src/terrain/generation/*`). -- Bridges builtin terrain/procedural do Doppio (`TerrainBridge`, `ProceduralBridge` no core). - ---- - -## [2026-09-18] — Runtime, build pipeline & polish - -### Added -- Pipeline de build do jogo (`BuildDialog`, `BuildSystem`, 7 estágios). -- Executável `caffeine-runtime` para play sem editor. -- Sistema de plugins inicial no Doppio. -- Melhorias de workflow: startup dialog, asset browser, project manager. - -### Changed -- Refinamentos de UX do editor e correções gerais ("major fix" ×3). - ---- - -## [2026-05-24] — Testes UI & seleção 3D - -### Added -- Framework de testes UI JSON (`TestUIMapper`, `TestRequestHandler`, headless Doppio). -- Raycasting de seleção 3D, multi-select, focus camera (double-click). -- Gizmo com raycast em eixos finitos. - ---- - -## [2026-05-23] — Mesh, prefabs & rendering 3D - -### Added -- Pipeline glTF/GLB → `.caf`, mesh cache, LOD framework. -- Drag-and-drop de meshes no viewport, "Save as Prefab". -- Rendering 3D de meshes glTF com texturas embutidas e fill semi-transparente. - ---- - -## [2026-05-20 — 2026-05-22] — Viewport 3D, animação & ECS - -### Added -- View modes 2D / 3D / Isometric, orbit camera, grid 3D, gizmos XYZ. -- Componente `Transform` unificado (remove Position2D/Rotation/Scale2D). -- Animator Controller, timeline com scrubber, parâmetros nomeados. -- Hierarquia com herança de transform, auto-expand no drag-drop. - -### Changed -- Removidos `Health` e `Velocity2D` (migrado para `RigidBody2D`). - ---- - -## [2026-05-17 — 2026-05-19] — Play mode, inspector & scripting - -### Added -- **Play / Pause / Stop** com snapshot de entidades. -- Component registry unificado, Add Component pesquisável. -- Camera Preview panel, frustum Camera2D/3D no viewport. -- Collider debug overlay, tileset loading, dual scripting Lua + C++. -- CAP browsing, waveform preview, drag-drop auto-pack no Asset Browser. -- Grid no viewport, componentes Camera/Light/MeshRenderer. - ---- - -## [2026-05-14 — 2026-05-16] — Doppio IDE (Caffeine Studio) - -### Added -- Split **caffeine-core** + **doppio** executável. -- Painéis: Hierarchy, Inspector, Viewport, Asset Browser, Scene Editor orchestrator. -- Undo/redo snapshot-based, SceneSerializer binário, Transform Gizmos. -- Drag-and-drop AssetBrowser→Viewport, ProjectManager, SceneTabManager. -- Asset Pipeline (TextureCompiler, HotReloader), FileWatcher nativo Windows. -- Script Editor, NativeScriptComponent, sandboxing Lua, ECS Lua bindings. -- Particle System, Animation Timeline, Tilemap Editor, Command Palette. -- Material Editor (ShaderGraph + ImNodes), Audio Preview, BuildDialog. -- ProjectStartupDialog com toasts e projetos recentes. - -### Changed -- Refactor dos painéis editor para `.hpp/.cpp` com design por membros. - ---- - -## [2026-05-07 — 2026-05-11] — ECS, sistemas & editor base - -### Added -- **ECS** archetype-based, CommandBuffer, ComponentQuery. -- **EventBus** pub/sub com dispatch diferido. -- **AssetManager** async/sync, cache, hot-reload. -- **BatchRenderer**, TextureAtlas, Camera2D. -- **SceneManager** + SceneSerializer, Physics2D, UI System, Audio (SDL3 spatial). -- Animation2D state machine, MeshLoader OBJ, Asset Pipeline encoders. -- ImGui integration (Profiler, Console, StatsOverlay). -- Quaternion/SLERP, Camera3D (FPS/Orbital/Follow), Octree, Frustum culling. -- Skeletal animation (bones, blend tree). -- Lua scripting (sol2), `caffeine-studio` executable. - ---- - -## [2026-04-24] — Build scripts & binários - -### Added -- Build manager Python, scripts `.sh` / `.bat` / `.fish`. -- Gestão de versões e binários. - ---- - -## [2026-04-14] — Concorrência & RHI - -### Added -- High-resolution Timer (µs). -- Game Loop fixed timestep (60 Hz) + interpolação. -- Input System action-based remapeável. -- Debug tools (Log, Profiler, DebugDraw). -- Job System work-stealing (RF2.2–RF2.6). -- **RHI** sobre SDL_GPU: RenderDevice, CommandBuffer (RF3.1–RF3.2). - ---- - -## [2026-04-07] — Fase 1: Fundação atómica - -### Added -- Tipos core (`u8`–`u64`, `f32`, platform defines). -- Allocators custom (Linear, Pool, Stack, `IAllocator`). -- Containers (`Vector`, `HashMap`, `FixedString`, `StringView`). -- Math (`Vec2`–`Vec4`, `Mat4`). -- CMake + Catch2 test suite. -- CI GitHub Actions (build + test). - -### Changed -- Documentação consolidada em `docs/`, diagramas Mermaid no ROADMAP. - ---- - -## [2026-04-06] — Início do projeto - -### Added -- Repositório inicial, README, dev manifesto, roadmap. -- Estrutura de documentação e planos de fases 0–6. - ---- - - ---- - -## Apêndice — Histórico completo de commits - -> 419 commits desde 2026-04-06 até 2026-09-22. - -### 2026-04 (81 commits) - -- `2026-04-06` [`387aeaa`] Initial commit -- `2026-04-06` [`53b9af6`] Create README.md -- `2026-04-06` [`8d2a6b1`] Update README.md -- `2026-04-06` [`dc6bac5`] Create dev_manifesto.md -- `2026-04-06` [`629d4c1`] Create roadmap.md -- `2026-04-06` [`ee8b146`] Update README.md -- `2026-04-06` [`d8e8abe`] feat/major refactor -- `2026-04-06` [`020038d`] Update README.md -- `2026-04-06` [`068c964`] Rename MASTER.md to README.md -- `2026-04-06` [`5f34a2d`] feat/major refactor -- `2026-04-06` [`d8e8d61`] Update README.md -- `2026-04-06` [`06bdae7`] docs: convert ASCII diagrams to Mermaid in ROADMAP.md -- `2026-04-06` [`8d58880`] feat/major refactor -- `2026-04-07` [`2b97375`] feat(core): add core types and platform definitions -- `2026-04-07` [`339cef7`] feat(memory): add custom allocator system -- `2026-04-07` [`7ffde40`] feat(containers): add custom containers and math types -- `2026-04-07` [`79fa9c9`] feat(build): add main include header and CMake setup -- `2026-04-07` [`ede0f3e`] feat(tests): add test system design doc -- `2026-04-07` [`5fc9cf8`] fix(ci): use correct std versions per compiler -- `2026-04-07` [`73cece3`] fix(ci): use integer std versions (20/17 instead of c++20/c++17) -- `2026-04-07` [`5c469a0`] fix(tests): replace MSVC-only /W4 flags with cross-platform equivalents -- `2026-04-07` [`2933910`] fix(tests): add Catch2 subdirectory to include path -- `2026-04-07` [`92cf593`] fix(containers): move HashMap constructor implementation out of class body -- `2026-04-07` [`adab94f`] fix(tests): qualify all Math namespace functions to avoid ambiguity with std:: -- `2026-04-07` [`ff95152`] fix(tests): fix CF_INLINE test - macro expands to keywords, not value -- `2026-04-07` [`cef1270`] fix(tests): add CATCH_CONFIG_MAIN to provide main() function -- `2026-04-07` [`49cf0d0`] fix(tests): remove benchmarks - Catch2 v2 doesn't support BENCHMARK -- `2026-04-07` [`11fd8d6`] fix(ci): fix executable paths - tests are in build/tests/ -- `2026-04-07` [`c530caa`] simplify(ci): minimal test workflow - build + run only -- `2026-04-07` [`70e8314`] fix(ci): skip stress tests in CI - 1M allocations is too slow -- `2026-04-07` [`f78952f`] fix(containers): add null allocator checks to prevent segfault -- `2026-04-07` [`be79322`] fix(containers): support Vector without allocator - use global new/delete -- `2026-04-07` [`8e6f522`] fix(tests): correct failing test assertions -- `2026-04-07` [`56b6975`] docs(tests): add test summary with architecture principles -- `2026-04-07` [`f858054`] Merge pull request #2 from devscafecommunity/feature/fase-1-test-system -- `2026-04-07` [`3e27864`] docs: consolidate documentation into docs/ directory -- `2026-04-07` [`1456645`] Merge pull request #3 from devscafecommunity/feature/fase-1-atomic-foundation -- `2026-04-07` [`5c2f3fc`] docs: add Phase 1 technical documentation with cross-references -- `2026-04-07` [`29e360d`] docs: add Phase 1 detailed review document -- `2026-04-07` [`e4269f3`] docs: move Phase1 review to docs/reviews/ and add stress test workflow -- `2026-04-07` [`f4ea9b6`] Update docs/containers/vector.md -- `2026-04-07` [`fe41527`] Update docs/containers/vector.md -- `2026-04-07` [`b13753b`] Apply suggestion from @Copilot -- `2026-04-07` [`a6fcaf9`] Apply suggestion from @Copilot -- `2026-04-08` [`62b6d0f`] docs: add 4.2 Caffeine Binary System (.caf) asset format section -- `2026-04-08` [`2dfdaee`] Update README.md -- `2026-04-11` [`aa75781`] Merge pull request #4 from devscafecommunity/feature/fase-1-atomic-foundation -- `2026-04-11` [`c80fb7f`] feat/setup documentation guidelines for job system -- `2026-04-14` [`fea12c2`] feat/setup guide docs -- `2026-04-14` [`6866ed3`] feat(timer): implement high-resolution timer with RF2.1 microsecond precision -- `2026-04-14` [`66a91d1`] Merge pull request #20 from devscafecommunity/9-high-resolution-timer -- `2026-04-14` [`eb4edae`] feat(timer): port high-resolution timer from main branch -- `2026-04-14` [`6a17572`] feat(gameloop): implement fixed timestep game loop with accumulator pattern (RF2.7, RF2.8) -- `2026-04-14` [`04d39cf`] Merge remote-tracking branch 'origin/main' into 11-the-master-game-loop -- `2026-04-14` [`ee19801`] Merge pull request #21 from devscafecommunity/11-the-master-game-loop -- `2026-04-14` [`467d7e5`] feat(input): implement action-based input system with remappable bindings (RF2.9) -- `2026-04-14` [`4f36538`] Merge pull request #24 from devscafecommunity/22-input-system -- `2026-04-14` [`63f116e`] feat/debug tools -- `2026-04-14` [`5275a05`] Merge pull request #25 from devscafecommunity/23-debug-tools -- `2026-04-14` [`9630ee2`] build(rhi): integrate SDL3 dependency with find_package and DLL auto-copy -- `2026-04-14` [`6e3bcb6`] feat(rhi): implement RenderDevice and CommandBuffer abstraction over SDL_GPU (RF3.1, RF3.2) -- `2026-04-14` [`fc2a10c`] build(rhi): make SDL3 optional so CI builds without it -- `2026-04-14` [`166c910`] Merge pull request #46 from devscafecommunity/12-rendering-hardware-interface-rhi -- `2026-04-14` [`7f34033`] feat(threading): implement Job System with work-stealing thread pool (RF2.2-RF2.6) -- `2026-04-14` [`34e9cc8`] Merge pull request #47 from devscafecommunity/10-job-system-worker-threads -- `2026-04-15` [`57c45b0`] docs: consolidate legacy plans/ into fase2-6 structure -- `2026-04-15` [`033b08a`] Merge pull request #49 from devscafecommunity/48-validate-and-standardize-systems -- `2026-04-16` [`d0a8329`] Update README.md -- `2026-04-16` [`c7e3e1d`] docs(readme): update documentation structure with phase details and status -- `2026-04-16` [`13fa742`] Merge branch 'main' into 48-validate-and-standardize-systems -- `2026-04-16` [`c48c78f`] Merge pull request #50 from devscafecommunity/48-validate-and-standardize-systems -- `2026-04-24` [`283b483`] feat: add Python build manager core -- `2026-04-24` [`c86b199`] fix: correct build_manager spec compliance (missing methods, return types, directories) -- `2026-04-24` [`ad2aa24`] feat: add Windows build script (.bat) -- `2026-04-24` [`e5347b0`] feat: add Unix build script (.sh) -- `2026-04-24` [`e6e8873`] docs: add scripts documentation -- `2026-04-24` [`72a8a84`] feat: add Fish shell build script (.fish) -- `2026-04-24` [`c22f359`] feat: add binary management scripts -- `2026-04-24` [`1897f13`] feat: add version manager for binaries -- `2026-04-24` [`3406df0`] docs: add implementation summary for binary management scripts -- `2026-04-24` [`02ca6f7`] Merge pull request #52 from devscafecommunity/51-compilation-and-binary-managment-scripts - -### 2026-05 (329 commits) - -- `2026-05-07` [`67ee38a`] Task 14: Expose ECS Core in Caffeine.hpp public API -- `2026-05-07` [`6e9ba1b`] Task 15: Add comprehensive ECS documentation and examples -- `2026-05-07` [`4761f52`] Add ECS development artifacts and planning documents -- `2026-05-07` [`756de69`] Fix: Include in ComponentSet.hpp to enable std::hash specialization -- `2026-05-07` [`50fe0ee`] Merge pull request #53 from devscafecommunity/32-ecs-core -- `2026-05-07` [`bec1364`] feat(io): implement .caf Caffeine Asset Format (Issue #28) -- `2026-05-07` [`5900f39`] fix(io): address validation findings from engineering requirements audit -- `2026-05-07` [`1cde368`] Merge pull request #54 from devscafecommunity/28-formato-caf-caffeine-asset-format -- `2026-05-08` [`07ec865`] feat(events): implement EventBus with pub/sub, deferred dispatch, and thread-safe queue -- `2026-05-08` [`6143b62`] docs: update events.md and caf-format.md to reflect implemented state -- `2026-05-08` [`67ddda7`] Merge pull request #55 from devscafecommunity/17-event-bus -- `2026-05-08` [`ec86b12`] feat(assets): implement AssetManager with async/sync loading, cache, and hot-reload -- `2026-05-08` [`209b1fe`] Merge pull request #56 from devscafecommunity/26-asset-manager -- `2026-05-08` [`c787dcb`] feat(render): implement Camera2D system (RF3.7) -- `2026-05-08` [`6c1f893`] Merge pull request #57 from devscafecommunity/29-camera-system -- `2026-05-08` [`8f228ed`] feat(render): implement BatchRenderer and TextureAtlas (#27) -- `2026-05-08` [`91e3d68`] Merge pull request #58 from devscafecommunity/27-batch-renderer -- `2026-05-08` [`5835df2`] feat(scene): implement SceneManager and SceneSerializer (RF4.5) -- `2026-05-08` [`33fbe84`] fix(scene): remove Color static const members, fix GCC default arg error -- `2026-05-08` [`03fa4f3`] fix(scene): add explicit default ctor to TransitionConfig for GCC compat -- `2026-05-08` [`14acfd3`] fix(scene): move TransitionType+TransitionConfig to namespace scope, fix GCC nested class error -- `2026-05-08` [`4ec9f23`] Merge pull request #59 from devscafecommunity/34-scene-manager -- `2026-05-08` [`e858991`] feat(physics): implement Physics2D system (RF4.10) -- `2026-05-08` [`fb69c78`] fix(physics): qualify ComponentQuery as ECS::ComponentQuery for GCC -- `2026-05-08` [`c7da097`] fix(physics): use std::fabs/sqrt/floor/fmin/fmax for GCC compatibility -- `2026-05-08` [`645d402`] fix(physics): fix std::fabsf in test file for GCC -- `2026-05-08` [`6ddd514`] fix(physics): replace Entity::get() with World::get(entity) for GCC compat -- `2026-05-08` [`8c69ef4`] fix(physics): fix layerMask test - set collider layerMask to exclude query layer -- `2026-05-08` [`a97fb1f`] Merge pull request #60 from devscafecommunity/33-physics-2d -- `2026-05-08` [`90970b6`] feat(ui): implement UI system — RF4.11 -- `2026-05-08` [`412d36f`] fix(ui): replace c_str() with cStr() for FixedString GCC compat -- `2026-05-08` [`145fe34`] fix(ui): exclude Canvas from hitTest — layout roots are not interactive targets -- `2026-05-08` [`c143f95`] Merge pull request #61 from devscafecommunity/35-ui-system -- `2026-05-08` [`416cee1`] feat(audio): implement AudioSystem with SDL3 streaming and spatial 2D audio -- `2026-05-08` [`d191486`] Merge pull request #62 from devscafecommunity/31-audio-system -- `2026-05-08` [`7dc9ae7`] feat(animation): implement AnimationSystem with sprite state machine (RF4.9) -- `2026-05-08` [`1e2e05d`] Merge pull request #63 from devscafecommunity/30-animation-system -- `2026-05-08` [`30096cb`] feat(mesh): implement MeshLoader with OBJ parser and MeshSystem (RF5.2) -- `2026-05-08` [`b69fcfa`] Merge pull request #64 from devscafecommunity/40-mesh-loading -- `2026-05-08` [`68589d8`] feat(editor): implement Dear ImGui integration with ProfilerWindow, ConsoleWindow, StatsOverlay (RF6.1, RF6.2) -- `2026-05-08` [`6fb645c`] Merge pull request #65 from devscafecommunity/42-embedded-ui-dear-imgui -- `2026-05-08` [`dbc1559`] feat(pipeline): implement Asset Pipeline with TextureEncoder, AudioEncoder, MeshEncoder, AssetManifest (RF6.5) -- `2026-05-08` [`055f3bc`] fix(pipeline): fix AssetManifest load parsing multiple entries -- `2026-05-09` [`31e055a`] fix(pipeline): fix AssetManifest load parsing of string fields (id, path, type) -- `2026-05-09` [`928cc4c`] fix(pipeline): remove orphaned brace from AssetManifest load -- `2026-05-09` [`e41c8d9`] Merge pull request #66 from devscafecommunity/41-asset-pipeline -- `2026-05-09` [`bc46871`] feat(math): implement Quaternion with SLERP/NLERP, Euler, axis-angle (RF5.1) -- `2026-05-10` [`69bc719`] Update README.md -- `2026-05-10` [`5669b0f`] Update README.md -- `2026-05-10` [`6aa80de`] fix(tests): correct Quat toEuler pitch/yaw, FP comparisons, PoolAllocator assertions, CF_ASSERT signal handling -- `2026-05-10` [`4209091`] Merge pull request #67 from devscafecommunity/36-3d-math-extension -- `2026-05-10` [`46af94d`] feat(editor): implement EditorContext and NameComponent -- `2026-05-10` [`0be4783`] feat(editor): implement Hierarchy, Inspector, Viewport, and AssetBrowser panels -- `2026-05-10` [`b0ee6a5`] feat(editor): implement SceneEditor orchestrator -- `2026-05-10` [`d0d272d`] feat(editor): integrate editor includes into Caffeine.hpp and mark RF6.3/RF6.4 complete -- `2026-05-10` [`f0130e2`] Merge pull request #68 from devscafecommunity/43-scene-editor -- `2026-05-10` [`c461c5c`] feat(spatial): implement Octree with AABB3D, Frustum, and spatial queries -- `2026-05-10` [`ef1b64b`] feat(spatial): integrate Octree module into main engine header -- `2026-05-10` [`97fb937`] docs(spatial): update spatial partitioning documentation for Octree module -- `2026-05-10` [`1025e0b`] Merge pull request #69 from devscafecommunity/43-scene-editor -- `2026-05-10` [`97af1c6`] feat(math): add Mat4::inverted() using cofactor expansion -- `2026-05-10` [`228162c`] feat(camera3d): implement Camera3D with FPS, Orbital, Follow modes and frustum culling -- `2026-05-10` [`c556d52`] test(camera3d): add 20+ test cases for Camera3D -- `2026-05-10` [`6de934c`] fix(camera3d): correct Mat4::inverted() transpose bug and Camera3D sync directions -- `2026-05-10` [`b364116`] Merge pull request #70 from devscafecommunity/37-camera-3d -- `2026-05-10` [`e305f90`] feat(skeletal-animation): implement Bone/Skeleton, keyframe interpolation, blend tree, and ECS system -- `2026-05-10` [`b1efbc3`] Merge pull request #71 from devscafecommunity/39-skeletal-animation -- `2026-05-11` [`578605a`] feat(script): implement Lua scripting with sol2 and fix SIGSEGV from archetype mutation -- `2026-05-11` [`f6f5ecf`] Merge pull request #72 from devscafecommunity/39-skeletal-animation -- `2026-05-11` [`e32eb57`] docs: remove old phase-based documentation structure -- `2026-05-11` [`70848a6`] docs: reorganize documentation into functional modules -- `2026-05-11` [`9ccda52`] docs: add Caffeine Studio IDE planning (M1-M4 milestones) -- `2026-05-11` [`493b651`] Merge pull request #73 from devscafecommunity/docs/docs-reorganization -- `2026-05-11` [`cdf9b4f`] ci: add release workflow for v0.0.1-beta with core, ide, and bundle artifacts -- `2026-05-11` [`bf024d7`] ci: fix release workflow - separate core/full builds to avoid ImGui API errors -- `2026-05-11` [`f78401f`] feat(ide): add caffeine-studio executable and fix ImGui 1.91.9 API compatibility -- `2026-05-11` [`76c5db5`] fix(ide): fix ImGui 1.91.9 API compat and AssetManager constructor -- `2026-05-11` [`1848649`] fix(ide): change InspectorPanel HashMap key from ComponentID to u32 -- `2026-05-14` [`5bb352b`] docs(planning): add T0 - core/IDE decoupling into caffeine-engine and doppio -- `2026-05-14` [`1e4a782`] refactor(build): split into caffeine-core library and doppio IDE executable (T0) -- `2026-05-14` [`d6f939f`] fix(tools): add missing include in TextureEncoder.hpp -- `2026-05-14` [`80aaa56`] Merge pull request #82 from devscafecommunity/74-caffeine-studio-ide-plano-de-desenvolvimento -- `2026-05-14` [`881e136`] feat(editor): implement EditorContext with snapshot-based undo/redo -- `2026-05-14` [`4c924cd`] Merge pull request #83 from devscafecommunity/75-editorcontext-undoredo -- `2026-05-14` [`7b425ed`] feat(editor): implement dedicated HierarchyPanel with search, context menu, delete key -- `2026-05-14` [`806a30b`] Fix build: add missing HierarchyPanel.hpp include in test_editor.cpp -- `2026-05-14` [`98df3de`] Merge pull request #84 from devscafecommunity/76-hierarchy-panel -- `2026-05-14` [`7361406`] refactor(editor): split SceneViewport into .hpp/.cpp with member-based design (RF6.4) -- `2026-05-14` [`1fc0865`] Merge pull request #85 from devscafecommunity/78-scene-viewport -- `2026-05-14` [`e0e4bbe`] refactor(editor): split AssetBrowser into .hpp/.cpp with filesystem navigation (RF6.5) -- `2026-05-14` [`5b91eda`] Merge pull request #86 from devscafecommunity/79-asset-browser-v1 -- `2026-05-14` [`c27ae3e`] refactor(editor): split InspectorPanel into .hpp/.cpp with component drawers (RF6.3) -- `2026-05-14` [`eb74478`] Merge pull request #87 from devscafecommunity/77-inspector-panel -- `2026-05-14` [`c262926`] feat(editor): split SceneEditor into .hpp/.cpp with dockspace, menus, console, profiler (RF6.6) -- `2026-05-14` [`9cdd3c2`] Merge pull request #88 from devscafecommunity/80-scene-editor-orchestrator -- `2026-05-14` [`64f0f86`] feat(editor): SceneSerializer with binary save/load + unsaved changes popup (RF6.7) -- `2026-05-14` [`0a07a0e`] Merge pull request #89 from devscafecommunity/81-saveload-scene -- `2026-05-14` [`ede11e9`] docs: add Transform Gizmos design document -- `2026-05-14` [`2dc4298`] docs: add Transform Gizmos implementation plan -- `2026-05-14` [`671a48d`] feat(editor): implement Transform Gizmos with translate/rotate/scale modes -- `2026-05-14` [`cbb395c`] Merge origin/main into 39-skeletal-animation -- `2026-05-14` [`52ce138`] fix: remove glm dependency, use Caffeine::Vec2/Vec3 instead -- `2026-05-14` [`ddbd1c4`] Merge pull request #97 from devscafecommunity/39-skeletal-animation -- `2026-05-15` [`0260fdf`] feat(editor): DragDropSystem with AssetBrowser→Viewport and Inspector asset drops (RF6.2) -- `2026-05-15` [`227a87e`] chore: retrigger CI -- `2026-05-15` [`77b0c05`] Merge pull request #98 from devscafecommunity/91-drag-and-drop -- `2026-05-15` [`4431659`] docs: add Asset Pipeline design document -- `2026-05-15` [`dc842ae`] feat(core): add native Windows FileWatcher (ReadDirectoryChangesW) -- `2026-05-15` [`36aa01d`] feat(assets): add AssetPipeline with IAssetCompiler interface and manifest system -- `2026-05-15` [`d4be1cd`] feat(assets): add TextureCompiler with stb_image PNG/JPG to .caf conversion -- `2026-05-15` [`4b3c025`] fix(core): guard FileWatcher Windows API behind _WIN32 for cross-platform build -- `2026-05-15` [`15ff33d`] Merge pull request #99 from devscafecommunity/92-asset-pipeline-integration -- `2026-05-15` [`e095133`] feat(assets): implement HotReloader for .caf asset hot-reloading -- `2026-05-15` [`03dd9f2`] docs: add HotReloader design document -- `2026-05-15` [`fb3eb55`] Merge pull request #100 from devscafecommunity/93-hot-reload-de-assets -- `2026-05-15` [`a9ed4b3`] feat(editor): implement ProjectManager for project lifecycle -- `2026-05-15` [`5aec7d4`] fix: add missing include for std::find on GCC/Linux -- `2026-05-15` [`65d7246`] Merge pull request #101 from devscafecommunity/94-project-manager -- `2026-05-15` [`8292dc7`] feat(editor): implement AssetBrowser v2 with data/UI separation -- `2026-05-15` [`a3e5119`] Merge pull request #102 from devscafecommunity/95-asset-browser-v2 -- `2026-05-15` [`137e577`] feat(editor): add SceneTabManager with data/UI layers -- `2026-05-15` [`7301491`] feat(editor): integrate SceneTabManager into SceneEditor -- `2026-05-15` [`2aa4a9b`] test(editor): add SceneTabManager tests -- `2026-05-15` [`81eaf5a`] Merge pull request #103 from devscafecommunity/96-multiple-scene-tabs -- `2026-05-15` [`466de9e`] build: add caffeine-ui interface library and caffeine-combined executable targets -- `2026-05-15` [`a071c6d`] fix(assets,audio): fix MeshLoader createBuffer signature and SDL3 audio device constant -- `2026-05-15` [`858c074`] fix(rhi): fix frame lifecycle — acquire swapchain in beginFrame, create real render pass in beginRenderPass -- `2026-05-15` [`88fbcc4`] fix(editor): fix doppio startup crash — enable docking, guard null viewport texture, add imgui_internal -- `2026-05-15` [`3a91665`] feat(apps): add caffeine-combined app demonstrating core + ui integration -- `2026-05-15` [`3c9885a`] Merge pull request #104 from devscafecommunity/96-multiple-scene-tabs -- `2026-05-15` [`30eff55`] feat(editor): add native Script Editor for .lua files -- `2026-05-15` [`737d0cd`] fix(doppio): fix SceneViewport default Config + add ScriptEditorWindow to build -- `2026-05-15` [`fa32f00`] Merge pull request #113 from devscafecommunity/105-31-lua-vm -- `2026-05-15` [`b03e195`] feat(script): add NativeScriptComponent for C++ scripts -- `2026-05-15` [`e620b92`] Merge pull request #114 from devscafecommunity/106-32-script-component-system -- `2026-05-15` [`a00f557`] feat(script): complete sandboxing implementation -- `2026-05-15` [`824c359`] Merge pull request #115 from devscafecommunity/108-34-sandboxing -- `2026-05-15` [`ca8dbc1`] feat(script): add addTransform/addSprite aliases to match spec API -- `2026-05-15` [`cd301c2`] Merge pull request #116 from devscafecommunity/107-33-ecs-lua-bindings -- `2026-05-15` [`0122d6b`] feat(editor): add ScriptComponent to InspectorPanel -- `2026-05-16` [`b78c2d1`] Merge pull request #117 from devscafecommunity/110-36-editor-script-integration -- `2026-05-16` [`fb3853e`] feat(graphics): add Particle System -- `2026-05-16` [`47e431e`] Merge pull request #118 from devscafecommunity/111-37-particle-system -- `2026-05-16` [`a0dfb46`] feat(editor): add Animation Timeline Editor panel -- `2026-05-16` [`a982a0d`] Merge pull request #127 from devscafecommunity/119-41-animation-timeline-editor -- `2026-05-16` [`a615c03`] feat(editor): add Tilemap Editor panel -- `2026-05-16` [`ec33ede`] Merge pull request #128 from devscafecommunity/120-42-tilemap-editor -- `2026-05-16` [`7e93ba4`] feat(editor): add Command Palette -- `2026-05-16` [`55a6eda`] feat(editor): integrate new panels into SceneEditor -- `2026-05-16` [`5e090b1`] fix: suppress unused parameter warnings -- `2026-05-16` [`46f12b5`] fix: resolve CI build warnings and test failures -- `2026-05-16` [`9aae1b8`] Merge pull request #129 from devscafecommunity/feature/command-palette -- `2026-05-16` [`59f7db8`] docs: add Material & Shader Editor design document -- `2026-05-16` [`4a292f8`] feat(editor): add ShaderNode hierarchy with code generation -- `2026-05-16` [`9b58e63`] feat(editor): add ShaderGraph with GLSL compilation -- `2026-05-16` [`458804b`] feat(editor): add Material Editor panel with ImNodes graph -- `2026-05-16` [`380282a`] feat(editor): add PreviewRenderer with ImGui fallback -- `2026-05-16` [`b108fcf`] feat(editor): add edge case handling for node deletion and empty graph -- `2026-05-16` [`00e2dce`] docs: add implementation plan, remove fmt dependency from shader files -- `2026-05-16` [`93348df`] Merge branch 'main' into 122-43-material-shader-editor -- `2026-05-16` [`90f6d9a`] Merge pull request #130 from devscafecommunity/122-43-material-shader-editor -- `2026-05-16` [`8ae3c74`] feat(editor): add Audio Preview & Spatial Placement (#121) -- `2026-05-16` [`7fbca5d`] fix(editor): add ImNodes CreateContext and fix query ordering to prevent MaterialEditorPanel crash -- `2026-05-16` [`8400763`] test: add E2E testing infrastructure with imgui_test_engine and DoppioTest -- `2026-05-16` [`81855ed`] docs: complete frontend audit - implement drawRigidBody2D, document unfinished stubs -- `2026-05-16` [`477d959`] feat: add universal build script for easy project compilation -- `2026-05-16` [`d65b19b`] docs: add BuildSystem Integration design document -- `2026-05-16` [`80d5611`] feat: implement BuildSystem integration with 7-stage pipeline, BuildDialog UI, and AssetCooker stubs -- `2026-05-16` [`81e8245`] fix: add imgui_test_engine sources to doppio executable linking -- `2026-05-16` [`0bf8067`] feat: implement ProjectStartupDialog - critical project startup workflow -- `2026-05-16` [`c1c7d67`] feat: add drag-drop support to ScriptEditorWindow - drag .lua files from Asset Browser -- `2026-05-16` [`0413395`] feat: add drag-drop support to AudioPreviewPanel - drag .wav/.ogg files from Asset Browser -- `2026-05-16` [`60d5957`] feat: implement AnimationTimeline playback with delta time - add frame timing and advance animations during render -- `2026-05-16` [`238637f`] feat: implement TilemapEditor visual grid canvas with tile painting and tools - adds interactive grid display with brush, bucket, eraser, and picker tools -- `2026-05-16` [`e118639`] fix: use BeginPopupModal for ProjectStartupDialog to ensure proper rendering -- `2026-05-16` [`d4e48d7`] Fix ProjectStartupDialog: switch from modal popup to regular window, simplify UI -- `2026-05-16` [`a135349`] Fix: ProjectStartupDialog ImGui rendering -- `2026-05-16` [`4cb2f45`] docs: add ProjectStartupDialog tabs design specification -- `2026-05-16` [`a4aef38`] docs: add ProjectStartupDialog tabs implementation plan -- `2026-05-16` [`6ef22e6`] feat: add toast notification data structure to ProjectStartupDialog -- `2026-05-16` [`946af26`] feat: implement toast notification methods (showToast, updateToasts) -- `2026-05-16` [`af1a708`] feat: implement toast notification rendering with ImGui -- `2026-05-16` [`fa5b334`] feat: refactor render() into tab-based architecture with BeginTabBar -- `2026-05-16` [`6e7b7f9`] feat: add recent projects state variables to ProjectStartupDialog -- `2026-05-16` [`690affe`] feat: implement Open Recent tab with search filtering -- `2026-05-16` [`4f1031f`] feat: implement Browse Projects tab with results list -- `2026-05-16` [`27177fc`] feat: implement file picker for project creation and browsing -- `2026-05-16` [`ba207d4`] fix: prevent state pollution between multiple file pickers -- `2026-05-16` [`6096d96`] fix: file picker state management and integration -- `2026-05-16` [`67e85c5`] fix: prevent file picker from re-opening after cancellation -- `2026-05-16` [`ec1a61b`] fix: call ImGui::End() regardless of Begin() return value -- `2026-05-16` [`feea0ee`] fix: ImGui ID conflicts in Open Recent and Browse tabs -- `2026-05-16` [`107ed2c`] fix: close ProjectStartupDialog when project is selected -- `2026-05-16` [`adf49c4`] docs: add comprehensive session summary for ProjectStartupDialog implementation -- `2026-05-17` [`23d3f57`] chore: add .worktrees/ to gitignore -- `2026-05-17` [`fc6094d`] docs: add three-phase design for doppio editor integration + phase 2-3 features -- `2026-05-17` [`45db648`] docs: add detailed three-phase implementation plan with bite-sized tasks -- `2026-05-17` [`fc4c941`] feat: add CAP file browsing mode to Asset Browser -- `2026-05-17` [`9abec52`] feat: add audio waveform generator for Asset Browser previews -- `2026-05-17` [`715a95c`] feat: add drag-drop auto-pack import to Asset Browser -- `2026-05-17` [`b2e2108`] feat: add placeholder for game.cap auto-load on project open -- `2026-05-17` [`5c2187b`] feat: add Phase 1 integration tests with Catch2 -- `2026-05-17` [`bb5135d`] chore: update caf-pack submodule reference (Task 2.1: Mesh Processor) -- `2026-05-17` [`7ed1c73`] chore: update caf-pack submodule reference (Task 2.2: Compression) -- `2026-05-17` [`24a517c`] Submodule: Update caf-pack to include Task 2.3 (Asset ID Header Generator) -- `2026-05-17` [`4ad5118`] Task 3.1: Implement async asset loading infrastructure -- `2026-05-17` [`33ec08d`] Task 3.2: Document complete ecosystem workflow -- `2026-05-17` [`0c7f14d`] Task 3.3: Add Phase 2 & 3 verification tests -- `2026-05-17` [`9103dc0`] fix: add missing CapLoader and AudioWaveformRenderer to DoppioTest -- `2026-05-17` [`2a5de94`] fix: update caf-pack submodule to use FNV-1a per specification -- `2026-05-17` [`4596a2d`] feat: add grid rendering to Scene Viewport -- `2026-05-17` [`d5fb975`] feat: add Camera2D and Camera3D components -- `2026-05-17` [`45b9d6b`] feat: add Light components (Directional, Point, Spot) -- `2026-05-17` [`c5f5bd0`] feat: add MeshRenderer components -- `2026-05-17` [`770c4a0`] feat: add entity type selector UI to Hierarchy Panel -- `2026-05-17` [`99152ef`] fix: rename ECS components to avoid namespace collisions -- `2026-05-18` [`6eaad41`] Fix namespace collision and build errors - remove using namespace Caffeine from editor headers -- `2026-05-18` [`fa7b949`] Fix caf-pack subdirectory reference in CMakeLists.txt -- `2026-05-18` [`0ccdfb8`] fix: make caf-pack submodule optional in CMake build -- `2026-05-18` [`57bd09d`] fix: make editor dependencies optional for headless build -- `2026-05-18` [`88d768a`] fix: wrap caf-pack dependencies in AssetBrowser and disable tests -- `2026-05-18` [`e097e67`] fix: resolve ProjectStartupDialog linker errors in doppio -- `2026-05-18` [`2767410`] fix: enable FilePicker on Windows for Browse and Recent tabs -- `2026-05-18` [`40a575b`] feat: apply cleaner default layout profile on IDE startup -- `2026-05-18` [`05ef449`] fix: increase FilePicker window size to reduce scrolling -- `2026-05-18` [`417a0d4`] feat: enable Lua scripting by default for editor build -- `2026-05-18` [`ac7125a`] feat(editor): add play mode state and system members to SceneEditor -- `2026-05-18` [`d30b98d`] feat(editor): implement play/pause/stop mode with entity snapshot and system ticking -- `2026-05-18` [`dd6e12f`] feat(editor): add physics collider debug overlay to scene viewport -- `2026-05-18` [`ae5161d`] feat(editor): add script component inspector drawer with path and load button -- `2026-05-18` [`1f47794`] feat(editor): add tileset asset loading with texture-based tile palette -- `2026-05-18` [`59929fa`] feat(editor): wire tileset load command into command palette -- `2026-05-18` [`5f33437`] feat(editor): add Collider2D, Velocity2D and Health inspector drawers -- `2026-05-18` [`52ab107`] fix(editor): sync recent projects list from ProjectManager on every render -- `2026-05-18` [`b0ddf27`] feat: multi-select, copy/paste/duplicate, physics debug toggle, snap to grid, undo coverage, settings apply -- `2026-05-18` [`71ccdf6`] feat: add GameObject primitives, UI components, and UISystem integration -- `2026-05-18` [`3cd1d10`] docs: add Inspector 2.0 implementation plan -- `2026-05-18` [`092717e`] feat(ecs): add Transform component and DisabledTag -- `2026-05-18` [`0bdef6d`] feat(editor): add InspectorWidgets helper library -- `2026-05-18` [`71eef32`] feat(editor): add ComponentRegistry with all component entries -- `2026-05-18` [`7b4148c`] feat(inspector): unified Transform drawer and ComponentHeader lifecycle -- `2026-05-18` [`79fea16`] feat(inspector): asset picker fields for Sprite, AudioSource, MeshFilter -- `2026-05-18` [`8d97efe`] feat(inspector): searchable Add Component menu via ComponentRegistry -- `2026-05-18` [`9790e25`] feat(hierarchy): new entities created with Transform component -- `2026-05-19` [`70c0a23`] fix: 4 editor bugs - transform sync, gizmo, component popup, tab flickering -- `2026-05-19` [`de326a0`] feat: dual script system - Lua and C++ scripts -- `2026-05-19` [`60f61e2`] refactor: move game scripts from scripts/ to assets/scripts/ -- `2026-05-19` [`3191715`] feat(editor): move play/pause/stop buttons into main menu bar -- `2026-05-19` [`b03e83f`] fix(editor): add missing Position2D constraint in enterPlayMode query to prevent segfault -- `2026-05-19` [`2e4979c`] feat(editor): empty entities now include Transform/Position2D/Rotation/Scale2D by default -- `2026-05-19` [`d4101f3`] feat(viewport): draw diamond marker for empty entities with Position2D but no Sprite -- `2026-05-19` [`59434b2`] fix(editor): add Transform/Position2D to entities created via toolbar + button -- `2026-05-19` [`d035dac`] feat(editor): collider debug color per-collider + ColorEdit4 in inspector -- `2026-05-19` [`800b1aa`] fix(physics): remove Collider2D dependency from integrate/sleep; auto-add Velocity2D with RigidBody2D -- `2026-05-19` [`454fef1`] fix(collider): world-unit sizes — default 1x1, drag step 0.01 so colliders appear at correct scale -- `2026-05-19` [`cdc2ad4`] fix(physics): correct gravity (-9.81 not *60), disable sleep under gravity, lower sleep threshold to 0.05 -- `2026-05-19` [`b781a2f`] fix(collider): default size 1x1 radius 0.5 in ComponentRegistry (was hardcoded 64x64) -- `2026-05-19` [`1d88045`] feat(editor): Camera Preview dock panel — shows scene from camera POV, No Cameras detected fallback -- `2026-05-19` [`1563e7a`] chore: remove stale example script files -- `2026-05-20` [`ad87924`] feat(editor): Camera2D auto-adds Position2D; draw camera frustum in scene viewport -- `2026-05-20` [`ce447ae`] feat(ecs): unify Transform component, remove Position2D/Rotation/Scale2D -- `2026-05-20` [`5b6e004`] feat(editor): add ViewMode + camera orbit state to EditorContext -- `2026-05-20` [`1005469`] feat(viewport): 3D/2D/Iso modes, XYZ gizmos, orbit camera, 3D grid -- `2026-05-20` [`08b802a`] fix(viewport): infinite grid, 3D pan, projected gizmo axes -- `2026-05-20` [`654a565`] fix(viewport): extend grid to horizon, normalize gizmo axis lengths -- `2026-05-20` [`2269540`] fix(viewport): depth-clip grid, arrow key navigation, revert middle mouse -- `2026-05-20` [`874e3e2`] fix(viewport): arrow key ux, grid quadrant, gizmo Z fallback, nav widget label -- `2026-05-20` [`1467b5c`] fix(viewport): near-plane clip grid lines instead of skipping -- `2026-05-20` [`2897f47`] fix(viewport): camera-oriented mini gizmo, gizmo Z/Y overlap guard, arrow key directions -- `2026-05-20` [`13d241a`] docs: add formal LaTeX specification for Caffeine Engine internals -- `2026-05-20` [`d478a11`] refactor(docs): split caffeine-internals into folder structure with sub-files -- `2026-05-20` [`2745396`] fix(docs): prevent orphan headings and split lists with needspace + widow/club penalties -- `2026-05-20` [`91d2b3d`] docs: complete caffeine-internals LaTeX spec with 11 new chapters -- `2026-05-20` [`b455de7`] fix(editor): TransformGizmo absolute drag, MaterialEditorPanel layout + fix(docs): LaTeX errors, add provisional logo to cover -- `2026-05-20` [`f118777`] Changes -- `2026-05-21` [`94be56e`] docs(latex): fix LaTeX syntax errors in specbox environments and compile PDF -- `2026-05-21` [`a6a7662`] fix(gizmo): world-space axes \u2014 remove hardcoded screen-space fallback, show dot when axis collapses toward camera -- `2026-05-21` [`bf30b8b`] fix(editor): TransformGizmo analytic foreshortening for 3D world-space axes -- `2026-05-21` [`21df694`] fix(editor): drawGizmo 3D analytic foreshortening with depth sort and alpha -- `2026-05-21` [`f249394`] feat(editor): gizmo 3D rotate rings, axis hover highlight, X/Y/Z key constraint -- `2026-05-21` [`50a45a6`] fix(editor): gizmo local space + inspector 3D rotation/scale fields -- `2026-05-21` [`12d4e94`] feat(editor): entity hierarchy with transform inheritance -- `2026-05-21` [`56092cd`] feat(editor): auto-expand parent after drag-drop + Unparent action -- `2026-05-21` [`943c412`] feat(hierarchy): transform/disabled/layer inheritance -- `2026-05-22` [`b63c0b1`] feat(animation): named parameter system with SetBool/SetFloat/SetTrigger and HashMap range-for -- `2026-05-22` [`5f59e97`] feat(editor): AnimationTimeline ruler, scrubber and keyframe diamonds -- `2026-05-22` [`1376a53`] feat(editor): AnimatorController window with state machine canvas and internal animator -- `2026-05-22` [`a0b511d`] feat(editor): wire AnimatorController into SceneEditor docking, command palette and View menu -- `2026-05-22` [`56fe630`] refactor(ecs): remove game-specific Health struct and migrate Velocity2D into RigidBody2D -- `2026-05-22` [`a90dcbd`] refactor(editor): remove Health and Velocity2D from inspector, registry, serializer and hierarchy -- `2026-05-22` [`ee2c2e4`] refactor(engine): remove Health and Velocity2D from scene serializer and Lua scripting bindings -- `2026-05-22` [`d9fbb23`] feat(editor): AssetBrowser updates -- `2026-05-22` [`d9fb901`] docs(animation): add scripting reference chapter 11 covering animation API -- `2026-05-23` [`bf94a16`] fix: support Position3D/Rotation3D in light gizmo rendering -- `2026-05-23` [`4ab0a9d`] docs: add chapter on polygons and 3D representations to internal reference -- `2026-05-23` [`3fb5eaa`] feat: implement glTF/glb mesh encoding to .caf format -- `2026-05-23` [`351e759`] feat: add mesh asset resolution to runtime AssetManager -- `2026-05-23` [`e925027`] feat: add prefab asset resolution to runtime AssetManager -- `2026-05-23` [`95c61e1`] feat: enable mesh drag-and-drop in scene viewport -- `2026-05-23` [`2892631`] feat: add 'Save as Prefab' command to inspector -- `2026-05-23` [`01aa9cd`] fix: update PrefabSerializer to use CAF format instead of custom binary -- `2026-05-23` [`3ee31f7`] feat: complete mesh and prefab pipeline wiring with editor integration -- `2026-05-23` [`883b45a`] wiring: integrate mesh and prefab components with editor systems -- `2026-05-23` [`0f33e1d`] feat: Implement 3D glTF mesh rendering in viewport -- `2026-05-23` [`03d5d30`] feat: add mesh caching system to avoid reloading per frame -- `2026-05-23` [`dbc6319`] feat: integrate mesh cache into viewport rendering -- `2026-05-23` [`0d222a3`] feat: add filled geometry rendering with semi-transparent blue fill -- `2026-05-23` [`d6568a9`] feat: load and display embedded glTF textures in viewport -- `2026-05-23` [`826fae3`] feat: add LOD level generation framework for mesh simplification -- `2026-05-23` [`53bfd40`] docs: add detailed implementation plan for gizmo raycasting with VP-inverse -- `2026-05-23` [`6737367`] feat(gizmo): add screenToWorldRay helper for VP-inverse raycasting -- `2026-05-23` [`a4dd94e`] feat(gizmo): add rayToAxisSegmentDistance for finite axis picking -- `2026-05-23` [`bafbc47`] feat(gizmo): integrate raycasting into intersectTest for world-space picking -- `2026-05-23` [`561ec8e`] fix(gizmo): add edge case handling for VP inverse and axis length validation -- `2026-05-23` [`9a569f3`] docs(gizmo): add performance & threshold tuning analysis -- `2026-05-23` [`3d8c1a9`] feat(selection): add rayIntersectsAABB and raycastSelectEntity functions -- `2026-05-23` [`3044f14`] feat(selection): integrate click detection and raycasting into viewport -- `2026-05-23` [`6f200fc`] fix(selection): add edge case handling for invalid AABBs and point entities -- `2026-05-23` [`f76d062`] feat(editor): add delete key to remove selected entity with undo -- `2026-05-23` [`f3e8a10`] feat(editor): add multi-select with Shift+Click (toggle selection) -- `2026-05-23` [`638db40`] feat(editor): add double-click to focus camera on selected entity -- `2026-05-24` [`3ce2bf0`] feat: add TestUIMapper and TestRequestHandler headers for UI test framework -- `2026-05-24` [`ccb42ea`] feat: implement TestUIMapper::captureViewportState and clickAtCoordinate -- `2026-05-24` [`91b0f7e`] feat: implement TestRequestHandler JSON parsing and response generation -- `2026-05-24` [`2d0886b`] feat: integrate TestRequestHandler into SceneViewport render loop -- `2026-05-24` [`3b7346c`] feat: add JSON-based UI test framework with headless Doppio -- `2026-05-24` [`5950274`] Content update -- `2026-05-26` [`38668c8`] fix: correct 3D rendering pipeline and add automated UI tests -- `2026-05-29` [`0a7146b`] fix(math): correct Mat4::transformVector() for non-diagonal matrices - -### 2026-09 (9 commits) - -- `2026-09-18` [`716a990`] feat(editor): add build pipeline, runtime, plugins, and editor UX fixes -- `2026-09-18` [`72cc4dc`] feat(editor): polish project workflow, asset browser, and editor UX -- `2026-09-18` [`461971e`] Major changes -- `2026-09-18` [`90abf19`] major fix -- `2026-09-19` [`33b9bd2`] major fix -- `2026-09-20` [`60e83a2`] major fix -- `2026-09-21` [`d9aa52d`] updating documentation -- `2026-09-22` [`ba774aa`] Add optional editor plugin SDK and move feature tooling out of Doppio core. -- `2026-09-22` [`cfbc012`] Improve GPU viewport rendering quality, shadows, and texture LOD. diff --git a/README.md b/README.md index 35cfc1ed..4481fc3c 100644 --- a/README.md +++ b/README.md @@ -1,97 +1,23 @@ -# ☕ Caffeine Engine +# Caffeine Engine -**A high-performance, custom-built game engine for the Codex Studio.** +High-performance C++ game engine (SDL3) for Codex Studio. -Caffeine é uma engine de jogos desenvolvida em **C++** sobre a camada do **SDL3**. O foco do projeto é o controle total sobre o hardware, priorizando concorrência multithread, gerenciamento de memória customizado e otimização gráfica de baixo nível. +**Documentation, roadmaps, and PDF books** live in the [`caffeine-website`](./caffeine-website) submodule (Svelte site + TeX). Agents should use the docs MCP defined there — see [`AGENTS.md`](./AGENTS.md). ---- - -## 📚 Documentação - -### Documentos Principais - -| Documento | Descrição | Link | -|-----------|-----------|------| -| **CHANGELOG.md** | Histórico de alterações e commits | [`CHANGELOG.md`](CHANGELOG.md) | -| **MASTER.md** | Documentação unificada completa | [`docs/MASTER.md`](docs/MASTER.md) | -| **ROADMAP.md** | Roadmap das 6 fases de desenvolvimento | [`docs/ROADMAP.md`](docs/ROADMAP.md) | -| **SPECS.md** | Regras e padrões de desenvolvimento | [`docs/SPECS.md`](docs/SPECS.md) | -| **memory_model.md** | Especificações de memória | [`docs/memory_model.md`](docs/memory_model.md) | -| **architecture_specs.md** | Especificações técnicas | [`docs/architecture_specs.md`](docs/architecture_specs.md) | - -### Arquitetura & Módulos - -| Módulo | Arquitetura | API Reference | -|--------|-------------|---------------| -| **Core** | [`docs/architecture/core.md`](docs/architecture/core.md) | [`docs/api/README.md`](docs/api/README.md) | -| **Memory** | [`docs/architecture/memory.md`](docs/architecture/memory.md) | [`docs/api/README.md`](docs/api/README.md) | -| **Containers** | [`docs/containers/vector.md`](docs/containers/vector.md) | [`docs/api/README.md`](docs/api/README.md) | -| **Math** | [`docs/math/vectors.md`](docs/math/vectors.md) | [`docs/api/README.md`](docs/api/README.md) | - ---- - -## 🏛️ Filosofia de Desenvolvimento -Ao contrário de engines "bloated", a Caffeine é construída sob o princípio da **transparência**. -* **Zero Dependency:** Reduzir ao máximo a dependência da `std` padrão, criando uma `stdlib` própria focada em jogos. -* **Data-Oriented:** Foco em performance de cache e processamento paralelo. -* **Caffeine-Powered:** Feita por desenvolvedores que preferem entender cada byte que passa pela CPU. ---- - -## 🚀 Como Compilar - -*Compilação via CMake com testes GTest.* - -**Requisitos:** -- Compilador C++20 ou superior -- CMake 3.20+ -- SDL3 (Latest Build) +## Build ```bash -git clone https://github.com/codex-studio/caffeine -cd caffeine -mkdir build && cd build -cmake .. -make +git submodule update --init --recursive +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build -j +cd build && ctest --output-on-failure ``` -### Executar Testes - -```bash -# Na pasta build -ctest --output-on-failure -``` - ---- - -## 📂 Estrutura do Código - -``` -src/ -├── Caffeine.hpp # Header principal de inclusão -├── core/ # Tipos fundamentais, platform, assertions -│ ├── Types.hpp # u32, f64, etc. -│ ├── Platform.hpp # Macros de plataforma -│ ├── Compiler.hpp # Macros de compilador -│ └── Assertions.hpp # CF_ASSERT -├── memory/ # Allocators customizados -│ ├── Allocator.hpp # Interface IAllocator -│ ├── LinearAllocator.hpp # O(1) reset -│ ├── PoolAllocator.hpp # Slots fixos -│ └── StackAllocator.hpp # Marcadores -├── containers/ # Estruturas de dados -│ ├── Vector.hpp # Array dinâmico -│ ├── HashMap.hpp # Tabela hash O(1) -│ ├── StringView.hpp # String sem ownership -│ └── FixedString.hpp # Buffer inline -└── math/ # Tipos matemáticos - ├── Vec2.hpp, Vec3.hpp, Vec4.hpp - ├── Mat4.hpp # Matriz 4×4 column-major - └── Math.hpp # Utility functions -``` - -> Para documentação completa, consulte [`docs/MASTER.md`](docs/MASTER.md) - ---- +More detail: `scripts/build.sh` (Linux/macOS) or `scripts/build.bat` (Windows). -> *“Caffeine: Because great games are built on strong code and a lot of coffee.”* +## Layout +- `src/` — engine source +- `apps/` — runtime and editor applications +- `tests/` — unit tests +- `caffeine-website/` — documentation submodule diff --git a/SESSION_SUMMARY.md b/SESSION_SUMMARY.md deleted file mode 100644 index a58e2fbf..00000000 --- a/SESSION_SUMMARY.md +++ /dev/null @@ -1,234 +0,0 @@ -# ProjectStartupDialog + File Picker Implementation - Session Summary - -**Date**: May 16, 2026 -**Status**: ✅ Complete & Deployed -**Branch**: `121-44-audio-preview-spatial-placement` -**Commits**: 27 commits (10 new in final phase) - ---- - -## 🎯 Objective - -Implement a complete project startup dialog system with: -- 3-tab interface (Create New, Open Recent, Browse Projects) -- Cross-platform file picker with fallback support -- Toast notification system -- Proper ImGui state management -- Zero assertion errors on startup - ---- - -## 📋 What We Built - -### 1. **Toast Notification System** -- Custom Toast struct with types: Success, Error, Info -- Auto-dismiss after 3 seconds -- Max 3 visible toasts -- Color-coded rendering -- Full integration in main render loop - -**Files**: `ProjectStartupDialog.hpp/cpp` - -### 2. **ProjectStartupDialog Refactor** -**3-Tab Interface**: -- **Create New Tab**: - - Project name input with validation - - Template selection - - File picker for project location selection - - Create button with error handling - -- **Open Recent Tab**: - - Lists recent projects from ProjectManager - - Search/filter by project name - - "Show All" toggle for collapsed view - - Open button for selected project - -- **Browse Projects Tab**: - - Directory path input field - - Browse button (triggers file picker) - - Results list of projects found - - Open button for selected project - -**Files**: `ProjectStartupDialog.hpp/cpp` - -### 3. **FilePicker Class** (NEW) -Cross-platform file/folder picker with: -- **Three Modes**: PickFolder, PickFile, SaveFile -- **Features**: - - ImGui-based dialog - - Directory navigation with "Go Up" button - - File/folder search and filtering - - Double-click to enter directories - - Proper sorting (dirs first, alphabetical) - - Per-dialog state tracking (no cross-contamination) - -- **State Management**: - - Static `unordered_map` for multiple picker instances - - `wasJustClosed` flag to prevent re-initialization on cancellation - - Always calls `ImGui::End()` regardless of `Begin()` return - -**Files**: `FilePicker.hpp`, `FilePicker.cpp` - ---- - -## 🐛 Critical Bugs Fixed - -### 1. **ImGui Drag-Drop Assertion Crash** -**Problem**: ProjectStartupDialog didn't close when project selected, causing multiple render loop iterations with inconsistent ImGui state. -**Fix**: Set `m_open = false` when project is selected. -**Commit**: `107ed2c` - -### 2. **ImGui Window State Machine Error** -**Problem**: `ImGui::Begin()` requires matching `ImGui::End()` even if Begin() returns false. -**Fix**: Restructured file picker window to always call `ImGui::End()`. -**Commit**: `ec1a61b` - -### 3. **ImGui ID Conflicts** -**Problem**: Multiple items in project lists had ID collisions causing rendering issues. -**Fix**: Wrapped items with `PushID()/PopID()` for unique scoping. -**Commit**: `feea0ee` - -### 4. **File Picker State Contamination** -**Problem**: Static variables caused state bleeding between multiple picker instances. -**Fix**: Switched to per-dialog state tracking with `unordered_map`. -**Commit**: `ba207d4` - -### 5. **File Picker Re-opening After Cancel** -**Problem**: Picker re-initialized immediately after user cancellation. -**Fix**: Added `wasJustClosed` flag to defer state cleanup by one frame. -**Commit**: `67e85c5` - ---- - -## 📂 Files Modified/Created - -``` -src/editor/ -├── ProjectStartupDialog.hpp (+ state vars, methods) -├── ProjectStartupDialog.cpp (+ tabs, logic, toasts) -├── FilePicker.hpp (NEW: interface) -├── FilePicker.cpp (NEW: ImGui implementation) -├── ProjectManager.hpp/cpp (GetRecentProjects integration) -└── AudioPreviewPanel.cpp (drag-drop context verification) - -apps/ -└── doppio/main.cpp (ProjectStartupDialog loop) - -build/ -└── CMakeLists.txt (+ FilePicker.cpp, CF_HAS_IMGUI flag) -``` - ---- - -## ✅ Verification & Testing - -| Component | Build | Runtime | Assertions | Features | -|-----------|-------|---------|-----------|----------| -| Toast System | ✅ | ✅ | ✅ | ✅ | -| Tab Architecture | ✅ | ✅ | ✅ | ✅ | -| Create Tab | ✅ | ✅ | ✅ | ✅ | -| Recent Tab | ✅ | ✅ | ✅ | ✅ | -| Browse Tab | ✅ | ✅ | ✅ | ✅ | -| FilePicker | ✅ | ✅ | ✅ | ✅ | -| SceneEditor Launch | ✅ | ✅ | ✅ | ✅ | - -**Build Status**: Clean `make -j8 doppio` -**Runtime**: Zero assertion errors on startup -**Full Workflow**: Create → File picker → Project creation → SceneEditor open ✅ - ---- - -## 🔑 Key Code Patterns - -### File Picker Usage (Create Tab) -```cpp -if (m_showLocationPicker) { - auto path = FilePicker::pickPath(FilePicker::Mode::PickFolder, - "Select Project Location", - m_selectedLocation); - if (path.has_value()) { - m_selectedLocation = path.value().string(); - m_showLocationPicker = false; - showToast("Location selected!", ToastType::Success); - } -} -``` - -### Dialog Closure (Critical Fix) -```cpp -if (result.has_value()) { - m_open = false; // PREVENTS ASSERTION CRASH -} -return result; -``` - -### ImGui ID Scoping (Project Lists) -```cpp -ImGui::PushID((int)i); -if (ImGui::Selectable(projName.c_str(), selected)) { ... } -ImGui::SameLine(); -if (ImGui::Button("Open", ImVec2(70, 0))) { ... } -ImGui::PopID(); -``` - ---- - -## 📊 Commit History (This Session) - -``` -107ed2c fix: close ProjectStartupDialog when project is selected -feea0ee fix: ImGui ID conflicts in Open Recent and Browse tabs -ec1a61b fix: call ImGui::End() regardless of Begin() return value -67e85c5 fix: prevent file picker from re-opening after cancellation -6096d96 fix: file picker state management and integration -ba207d4 fix: prevent state pollution between multiple file pickers -27177fc feat: implement file picker for project creation and browsing -4f1031f feat: implement Browse Projects tab with results list -690affe feat: implement Open Recent tab with search filtering -6e7b7f9 feat: add recent projects state variables to ProjectStartupDialog -``` - -**Branch History**: 27 commits ahead of main -**Latest Push**: ✅ Successful to `121-44-audio-preview-spatial-placement` - ---- - -## 🚀 Ready for Production - -- ✅ All features implemented and tested -- ✅ No compilation errors or warnings -- ✅ No runtime assertion errors -- ✅ Code follows existing codebase patterns -- ✅ ImGui state management correct -- ✅ Cross-platform file picker with fallback -- ✅ All changes committed and pushed - -**Next Steps**: Ready for code review and merge to main branch. - ---- - -## 💡 Technical Decisions - -1. **ImGui-Based File Picker** (vs native dialogs) - - Rationale: Works on any platform without rewriting code - - Fallback for environments without native support - - Full control over UX - -2. **Per-Dialog State Tracking** (vs global static) - - Rationale: Prevents state contamination between multiple picker instances - - Enables simultaneous multiple pickers - - Cleaner memory management - -3. **Toast Notification System** (vs status bar) - - Rationale: Non-blocking user feedback - - Multiple notifications visible simultaneously - - Auto-dismiss reduces UI clutter - -4. **Tab-Based UI** (vs separate dialogs) - - Rationale: Single cohesive interface for project management - - Better UX than multiple windows - - Aligns with modern editor conventions - ---- - -**Session Completed Successfully** ✅ diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.bin/esbuild b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.bin/esbuild deleted file mode 100755 index 85ad0022..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.bin/esbuild +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# Resolve $0 through symlinks so basedir is the shim's real directory. -# Cap hops at the kernel's ELOOP limit so a cycle cannot hang the shim. -link="$0" -hops=0 -while [ -L "$link" ] && [ "$hops" -lt 40 ]; do - hops=$((hops+1)) - target=$(readlink "$link") - case "$target" in - /*) link="$target" ;; - *) link="$(dirname "$link")/$target" ;; - esac -done -basedir=$(dirname "$(echo "$link" | sed -e 's,\\,/,g')") -basedir_win="$basedir" -exe="" -msys="" - -case `uname -a` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir_win=`cygpath -w "$basedir"` - fi - exe=".exe" - msys="true" - ;; - *WSL2*) - if command -v wslpath > /dev/null 2>&1; then - basedir_win="$(wslpath -w "$basedir" 2> /dev/null)" - if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then - basedir_win="$basedir" - else - exe=".exe" - fi - fi - ;; -esac - -if [ -z "$NODE_PATH" ]; then - export NODE_PATH="/home/pedro/repo/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/node_modules:/home/pedro/repo/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules:/home/pedro/repo/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules" -else - export NODE_PATH="/home/pedro/repo/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules/esbuild/node_modules:/home/pedro/repo/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/esbuild@0.24.2/node_modules:/home/pedro/repo/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/node_modules:$NODE_PATH" -fi -if [ -n "$exe" ] && [ -x "$basedir/node.exe" ]; then - exec "$basedir/node.exe" "$basedir_win/../esbuild/bin/esbuild" "$@" -elif [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../esbuild/bin/esbuild" "$@" -elif command -v node >/dev/null 2>&1; then - exec node "$basedir/../esbuild/bin/esbuild" "$@" -elif [ -n "$exe" ] && command -v node.exe >/dev/null 2>&1; then - exec node.exe "$basedir_win/../esbuild/bin/esbuild" "$@" -else - exec node "$basedir/../esbuild/bin/esbuild" "$@" -fi -# cmd-shim-target=/home/pedro/repo/general-ultra-realistic-terrain-algorithm/node_modules/esbuild/bin/esbuild diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.bin/mime b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.bin/mime deleted file mode 120000 index fbb7ee0e..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.bin/mime +++ /dev/null @@ -1 +0,0 @@ -../mime/cli.js \ No newline at end of file diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/LICENSE.md b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/LICENSE.md deleted file mode 100644 index 2027e8dc..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Evan Wallace - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/README.md b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/README.md deleted file mode 100644 index 93863d19..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# esbuild - -This is a JavaScript bundler and minifier. See https://github.com/evanw/esbuild and the [JavaScript API documentation](https://esbuild.github.io/api/) for details. diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/bin/esbuild b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/bin/esbuild deleted file mode 100755 index 0113238d..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/bin/esbuild +++ /dev/null @@ -1,222 +0,0 @@ -#!/usr/bin/env node -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); - -// lib/npm/node-platform.ts -var fs = require("fs"); -var os = require("os"); -var path = require("path"); -var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; -var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; -var packageDarwin_arm64 = "@esbuild/darwin-arm64"; -var packageDarwin_x64 = "@esbuild/darwin-x64"; -var knownWindowsPackages = { - "win32 arm64 LE": "@esbuild/win32-arm64", - "win32 ia32 LE": "@esbuild/win32-ia32", - "win32 x64 LE": "@esbuild/win32-x64" -}; -var knownUnixlikePackages = { - "aix ppc64 BE": "@esbuild/aix-ppc64", - "android arm64 LE": "@esbuild/android-arm64", - "darwin arm64 LE": "@esbuild/darwin-arm64", - "darwin x64 LE": "@esbuild/darwin-x64", - "freebsd arm64 LE": "@esbuild/freebsd-arm64", - "freebsd x64 LE": "@esbuild/freebsd-x64", - "linux arm LE": "@esbuild/linux-arm", - "linux arm64 LE": "@esbuild/linux-arm64", - "linux ia32 LE": "@esbuild/linux-ia32", - "linux mips64el LE": "@esbuild/linux-mips64el", - "linux ppc64 LE": "@esbuild/linux-ppc64", - "linux riscv64 LE": "@esbuild/linux-riscv64", - "linux s390x BE": "@esbuild/linux-s390x", - "linux x64 LE": "@esbuild/linux-x64", - "linux loong64 LE": "@esbuild/linux-loong64", - "netbsd arm64 LE": "@esbuild/netbsd-arm64", - "netbsd x64 LE": "@esbuild/netbsd-x64", - "openbsd arm64 LE": "@esbuild/openbsd-arm64", - "openbsd x64 LE": "@esbuild/openbsd-x64", - "sunos x64 LE": "@esbuild/sunos-x64" -}; -var knownWebAssemblyFallbackPackages = { - "android arm LE": "@esbuild/android-arm", - "android x64 LE": "@esbuild/android-x64" -}; -function pkgAndSubpathForCurrentPlatform() { - let pkg; - let subpath; - let isWASM2 = false; - let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; - if (platformKey in knownWindowsPackages) { - pkg = knownWindowsPackages[platformKey]; - subpath = "esbuild.exe"; - } else if (platformKey in knownUnixlikePackages) { - pkg = knownUnixlikePackages[platformKey]; - subpath = "bin/esbuild"; - } else if (platformKey in knownWebAssemblyFallbackPackages) { - pkg = knownWebAssemblyFallbackPackages[platformKey]; - subpath = "bin/esbuild"; - isWASM2 = true; - } else { - throw new Error(`Unsupported platform: ${platformKey}`); - } - return { pkg, subpath, isWASM: isWASM2 }; -} -function pkgForSomeOtherPlatform() { - const libMainJS = require.resolve("esbuild"); - const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS))); - if (path.basename(nodeModulesDirectory) === "node_modules") { - for (const unixKey in knownUnixlikePackages) { - try { - const pkg = knownUnixlikePackages[unixKey]; - if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; - } catch { - } - } - for (const windowsKey in knownWindowsPackages) { - try { - const pkg = knownWindowsPackages[windowsKey]; - if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; - } catch { - } - } - } - return null; -} -function downloadedBinPath(pkg, subpath) { - const esbuildLibDir = path.dirname(require.resolve("esbuild")); - return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); -} -function generateBinPath() { - if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { - if (!fs.existsSync(ESBUILD_BINARY_PATH)) { - console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); - } else { - return { binPath: ESBUILD_BINARY_PATH, isWASM: false }; - } - } - const { pkg, subpath, isWASM: isWASM2 } = pkgAndSubpathForCurrentPlatform(); - let binPath2; - try { - binPath2 = require.resolve(`${pkg}/${subpath}`); - } catch (e) { - binPath2 = downloadedBinPath(pkg, subpath); - if (!fs.existsSync(binPath2)) { - try { - require.resolve(pkg); - } catch { - const otherPkg = pkgForSomeOtherPlatform(); - if (otherPkg) { - let suggestions = ` -Specifically the "${otherPkg}" package is present but this platform -needs the "${pkg}" package instead. People often get into this -situation by installing esbuild on Windows or macOS and copying "node_modules" -into a Docker image that runs Linux, or by copying "node_modules" between -Windows and WSL environments. - -If you are installing with npm, you can try not copying the "node_modules" -directory when you copy the files over, and running "npm ci" or "npm install" -on the destination platform after the copy. Or you could consider using yarn -instead of npm which has built-in support for installing a package on multiple -platforms simultaneously. - -If you are installing with yarn, you can try listing both this platform and the -other platform in your ".yarnrc.yml" file using the "supportedArchitectures" -feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures -Keep in mind that this means multiple copies of esbuild will be present. -`; - if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) { - suggestions = ` -Specifically the "${otherPkg}" package is present but this platform -needs the "${pkg}" package instead. People often get into this -situation by installing esbuild with npm running inside of Rosetta 2 and then -trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta -2 is Apple's on-the-fly x86_64-to-arm64 translation service). - -If you are installing with npm, you can try ensuring that both npm and node are -not running under Rosetta 2 and then reinstalling esbuild. This likely involves -changing how you installed npm and/or node. For example, installing node with -the universal installer here should work: https://nodejs.org/en/download/. Or -you could consider using yarn instead of npm which has built-in support for -installing a package on multiple platforms simultaneously. - -If you are installing with yarn, you can try listing both "arm64" and "x64" -in your ".yarnrc.yml" file using the "supportedArchitectures" feature: -https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures -Keep in mind that this means multiple copies of esbuild will be present. -`; - } - throw new Error(` -You installed esbuild for another platform than the one you're currently using. -This won't work because esbuild is written with native code and needs to -install a platform-specific binary executable. -${suggestions} -Another alternative is to use the "esbuild-wasm" package instead, which works -the same way on all platforms. But it comes with a heavy performance cost and -can sometimes be 10x slower than the "esbuild" package, so you may also not -want to do that. -`); - } - throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild. - -If you are installing esbuild with npm, make sure that you don't specify the -"--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature -of "package.json" is used by esbuild to install the correct binary executable -for your current platform.`); - } - throw e; - } - } - if (/\.zip\//.test(binPath2)) { - let pnpapi; - try { - pnpapi = require("pnpapi"); - } catch (e) { - } - if (pnpapi) { - const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation; - const binTargetPath = path.join( - root, - "node_modules", - ".cache", - "esbuild", - `pnpapi-${pkg.replace("/", "-")}-${"0.24.2"}-${path.basename(subpath)}` - ); - if (!fs.existsSync(binTargetPath)) { - fs.mkdirSync(path.dirname(binTargetPath), { recursive: true }); - fs.copyFileSync(binPath2, binTargetPath); - fs.chmodSync(binTargetPath, 493); - } - return { binPath: binTargetPath, isWASM: isWASM2 }; - } - } - return { binPath: binPath2, isWASM: isWASM2 }; -} - -// lib/npm/node-shim.ts -var { binPath, isWASM } = generateBinPath(); -if (isWASM) { - require("child_process").execFileSync("node", [binPath].concat(process.argv.slice(2)), { stdio: "inherit" }); -} else { - require("child_process").execFileSync(binPath, process.argv.slice(2), { stdio: "inherit" }); -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/install.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/install.js deleted file mode 100644 index 5954864e..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/install.js +++ /dev/null @@ -1,287 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); - -// lib/npm/node-platform.ts -var fs = require("fs"); -var os = require("os"); -var path = require("path"); -var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; -var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; -var knownWindowsPackages = { - "win32 arm64 LE": "@esbuild/win32-arm64", - "win32 ia32 LE": "@esbuild/win32-ia32", - "win32 x64 LE": "@esbuild/win32-x64" -}; -var knownUnixlikePackages = { - "aix ppc64 BE": "@esbuild/aix-ppc64", - "android arm64 LE": "@esbuild/android-arm64", - "darwin arm64 LE": "@esbuild/darwin-arm64", - "darwin x64 LE": "@esbuild/darwin-x64", - "freebsd arm64 LE": "@esbuild/freebsd-arm64", - "freebsd x64 LE": "@esbuild/freebsd-x64", - "linux arm LE": "@esbuild/linux-arm", - "linux arm64 LE": "@esbuild/linux-arm64", - "linux ia32 LE": "@esbuild/linux-ia32", - "linux mips64el LE": "@esbuild/linux-mips64el", - "linux ppc64 LE": "@esbuild/linux-ppc64", - "linux riscv64 LE": "@esbuild/linux-riscv64", - "linux s390x BE": "@esbuild/linux-s390x", - "linux x64 LE": "@esbuild/linux-x64", - "linux loong64 LE": "@esbuild/linux-loong64", - "netbsd arm64 LE": "@esbuild/netbsd-arm64", - "netbsd x64 LE": "@esbuild/netbsd-x64", - "openbsd arm64 LE": "@esbuild/openbsd-arm64", - "openbsd x64 LE": "@esbuild/openbsd-x64", - "sunos x64 LE": "@esbuild/sunos-x64" -}; -var knownWebAssemblyFallbackPackages = { - "android arm LE": "@esbuild/android-arm", - "android x64 LE": "@esbuild/android-x64" -}; -function pkgAndSubpathForCurrentPlatform() { - let pkg; - let subpath; - let isWASM = false; - let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; - if (platformKey in knownWindowsPackages) { - pkg = knownWindowsPackages[platformKey]; - subpath = "esbuild.exe"; - } else if (platformKey in knownUnixlikePackages) { - pkg = knownUnixlikePackages[platformKey]; - subpath = "bin/esbuild"; - } else if (platformKey in knownWebAssemblyFallbackPackages) { - pkg = knownWebAssemblyFallbackPackages[platformKey]; - subpath = "bin/esbuild"; - isWASM = true; - } else { - throw new Error(`Unsupported platform: ${platformKey}`); - } - return { pkg, subpath, isWASM }; -} -function downloadedBinPath(pkg, subpath) { - const esbuildLibDir = path.dirname(require.resolve("esbuild")); - return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); -} - -// lib/npm/node-install.ts -var fs2 = require("fs"); -var os2 = require("os"); -var path2 = require("path"); -var zlib = require("zlib"); -var https = require("https"); -var child_process = require("child_process"); -var versionFromPackageJSON = require(path2.join(__dirname, "package.json")).version; -var toPath = path2.join(__dirname, "bin", "esbuild"); -var isToPathJS = true; -function validateBinaryVersion(...command) { - command.push("--version"); - let stdout; - try { - stdout = child_process.execFileSync(command.shift(), command, { - // Without this, this install script strangely crashes with the error - // "EACCES: permission denied, write" but only on Ubuntu Linux when node is - // installed from the Snap Store. This is not a problem when you download - // the official version of node. The problem appears to be that stderr - // (i.e. file descriptor 2) isn't writable? - // - // More info: - // - https://snapcraft.io/ (what the Snap Store is) - // - https://nodejs.org/dist/ (download the official version of node) - // - https://github.com/evanw/esbuild/issues/1711#issuecomment-1027554035 - // - stdio: "pipe" - }).toString().trim(); - } catch (err) { - if (os2.platform() === "darwin" && /_SecTrustEvaluateWithError/.test(err + "")) { - let os3 = "this version of macOS"; - try { - os3 = "macOS " + child_process.execFileSync("sw_vers", ["-productVersion"]).toString().trim(); - } catch { - } - throw new Error(`The "esbuild" package cannot be installed because ${os3} is too outdated. - -The Go compiler (which esbuild relies on) no longer supports ${os3}, -which means the "esbuild" binary executable can't be run. You can either: - - * Update your version of macOS to one that the Go compiler supports - * Use the "esbuild-wasm" package instead of the "esbuild" package - * Build esbuild yourself using an older version of the Go compiler -`); - } - throw err; - } - if (stdout !== versionFromPackageJSON) { - throw new Error(`Expected ${JSON.stringify(versionFromPackageJSON)} but got ${JSON.stringify(stdout)}`); - } -} -function isYarn() { - const { npm_config_user_agent } = process.env; - if (npm_config_user_agent) { - return /\byarn\//.test(npm_config_user_agent); - } - return false; -} -function fetch(url) { - return new Promise((resolve, reject) => { - https.get(url, (res) => { - if ((res.statusCode === 301 || res.statusCode === 302) && res.headers.location) - return fetch(res.headers.location).then(resolve, reject); - if (res.statusCode !== 200) - return reject(new Error(`Server responded with ${res.statusCode}`)); - let chunks = []; - res.on("data", (chunk) => chunks.push(chunk)); - res.on("end", () => resolve(Buffer.concat(chunks))); - }).on("error", reject); - }); -} -function extractFileFromTarGzip(buffer, subpath) { - try { - buffer = zlib.unzipSync(buffer); - } catch (err) { - throw new Error(`Invalid gzip data in archive: ${err && err.message || err}`); - } - let str = (i, n) => String.fromCharCode(...buffer.subarray(i, i + n)).replace(/\0.*$/, ""); - let offset = 0; - subpath = `package/${subpath}`; - while (offset < buffer.length) { - let name = str(offset, 100); - let size = parseInt(str(offset + 124, 12), 8); - offset += 512; - if (!isNaN(size)) { - if (name === subpath) return buffer.subarray(offset, offset + size); - offset += size + 511 & ~511; - } - } - throw new Error(`Could not find ${JSON.stringify(subpath)} in archive`); -} -function installUsingNPM(pkg, subpath, binPath) { - const env = { ...process.env, npm_config_global: void 0 }; - const esbuildLibDir = path2.dirname(require.resolve("esbuild")); - const installDir = path2.join(esbuildLibDir, "npm-install"); - fs2.mkdirSync(installDir); - try { - fs2.writeFileSync(path2.join(installDir, "package.json"), "{}"); - child_process.execSync( - `npm install --loglevel=error --prefer-offline --no-audit --progress=false ${pkg}@${versionFromPackageJSON}`, - { cwd: installDir, stdio: "pipe", env } - ); - const installedBinPath = path2.join(installDir, "node_modules", pkg, subpath); - fs2.renameSync(installedBinPath, binPath); - } finally { - try { - removeRecursive(installDir); - } catch { - } - } -} -function removeRecursive(dir) { - for (const entry of fs2.readdirSync(dir)) { - const entryPath = path2.join(dir, entry); - let stats; - try { - stats = fs2.lstatSync(entryPath); - } catch { - continue; - } - if (stats.isDirectory()) removeRecursive(entryPath); - else fs2.unlinkSync(entryPath); - } - fs2.rmdirSync(dir); -} -function applyManualBinaryPathOverride(overridePath) { - const pathString = JSON.stringify(overridePath); - fs2.writeFileSync(toPath, `#!/usr/bin/env node -require('child_process').execFileSync(${pathString}, process.argv.slice(2), { stdio: 'inherit' }); -`); - const libMain = path2.join(__dirname, "lib", "main.js"); - const code = fs2.readFileSync(libMain, "utf8"); - fs2.writeFileSync(libMain, `var ESBUILD_BINARY_PATH = ${pathString}; -${code}`); -} -function maybeOptimizePackage(binPath) { - if (os2.platform() !== "win32" && !isYarn()) { - const tempPath = path2.join(__dirname, "bin-esbuild"); - try { - fs2.linkSync(binPath, tempPath); - fs2.renameSync(tempPath, toPath); - isToPathJS = false; - fs2.unlinkSync(tempPath); - } catch { - } - } -} -async function downloadDirectlyFromNPM(pkg, subpath, binPath) { - const url = `https://registry.npmjs.org/${pkg}/-/${pkg.replace("@esbuild/", "")}-${versionFromPackageJSON}.tgz`; - console.error(`[esbuild] Trying to download ${JSON.stringify(url)}`); - try { - fs2.writeFileSync(binPath, extractFileFromTarGzip(await fetch(url), subpath)); - fs2.chmodSync(binPath, 493); - } catch (e) { - console.error(`[esbuild] Failed to download ${JSON.stringify(url)}: ${e && e.message || e}`); - throw e; - } -} -async function checkAndPreparePackage() { - if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { - if (!fs2.existsSync(ESBUILD_BINARY_PATH)) { - console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); - } else { - applyManualBinaryPathOverride(ESBUILD_BINARY_PATH); - return; - } - } - const { pkg, subpath } = pkgAndSubpathForCurrentPlatform(); - let binPath; - try { - binPath = require.resolve(`${pkg}/${subpath}`); - } catch (e) { - console.error(`[esbuild] Failed to find package "${pkg}" on the file system - -This can happen if you use the "--no-optional" flag. The "optionalDependencies" -package.json feature is used by esbuild to install the correct binary executable -for your current platform. This install script will now attempt to work around -this. If that fails, you need to remove the "--no-optional" flag to use esbuild. -`); - binPath = downloadedBinPath(pkg, subpath); - try { - console.error(`[esbuild] Trying to install package "${pkg}" using npm`); - installUsingNPM(pkg, subpath, binPath); - } catch (e2) { - console.error(`[esbuild] Failed to install package "${pkg}" using npm: ${e2 && e2.message || e2}`); - try { - await downloadDirectlyFromNPM(pkg, subpath, binPath); - } catch (e3) { - throw new Error(`Failed to install package "${pkg}"`); - } - } - } - maybeOptimizePackage(binPath); -} -checkAndPreparePackage().then(() => { - if (isToPathJS) { - validateBinaryVersion(process.execPath, toPath); - } else { - validateBinaryVersion(toPath); - } -}); diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/lib/main.d.ts b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/lib/main.d.ts deleted file mode 100644 index c7053070..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/lib/main.d.ts +++ /dev/null @@ -1,705 +0,0 @@ -export type Platform = 'browser' | 'node' | 'neutral' -export type Format = 'iife' | 'cjs' | 'esm' -export type Loader = 'base64' | 'binary' | 'copy' | 'css' | 'dataurl' | 'default' | 'empty' | 'file' | 'js' | 'json' | 'jsx' | 'local-css' | 'text' | 'ts' | 'tsx' -export type LogLevel = 'verbose' | 'debug' | 'info' | 'warning' | 'error' | 'silent' -export type Charset = 'ascii' | 'utf8' -export type Drop = 'console' | 'debugger' - -interface CommonOptions { - /** Documentation: https://esbuild.github.io/api/#sourcemap */ - sourcemap?: boolean | 'linked' | 'inline' | 'external' | 'both' - /** Documentation: https://esbuild.github.io/api/#legal-comments */ - legalComments?: 'none' | 'inline' | 'eof' | 'linked' | 'external' - /** Documentation: https://esbuild.github.io/api/#source-root */ - sourceRoot?: string - /** Documentation: https://esbuild.github.io/api/#sources-content */ - sourcesContent?: boolean - - /** Documentation: https://esbuild.github.io/api/#format */ - format?: Format - /** Documentation: https://esbuild.github.io/api/#global-name */ - globalName?: string - /** Documentation: https://esbuild.github.io/api/#target */ - target?: string | string[] - /** Documentation: https://esbuild.github.io/api/#supported */ - supported?: Record - /** Documentation: https://esbuild.github.io/api/#platform */ - platform?: Platform - - /** Documentation: https://esbuild.github.io/api/#mangle-props */ - mangleProps?: RegExp - /** Documentation: https://esbuild.github.io/api/#mangle-props */ - reserveProps?: RegExp - /** Documentation: https://esbuild.github.io/api/#mangle-props */ - mangleQuoted?: boolean - /** Documentation: https://esbuild.github.io/api/#mangle-props */ - mangleCache?: Record - /** Documentation: https://esbuild.github.io/api/#drop */ - drop?: Drop[] - /** Documentation: https://esbuild.github.io/api/#drop-labels */ - dropLabels?: string[] - /** Documentation: https://esbuild.github.io/api/#minify */ - minify?: boolean - /** Documentation: https://esbuild.github.io/api/#minify */ - minifyWhitespace?: boolean - /** Documentation: https://esbuild.github.io/api/#minify */ - minifyIdentifiers?: boolean - /** Documentation: https://esbuild.github.io/api/#minify */ - minifySyntax?: boolean - /** Documentation: https://esbuild.github.io/api/#line-limit */ - lineLimit?: number - /** Documentation: https://esbuild.github.io/api/#charset */ - charset?: Charset - /** Documentation: https://esbuild.github.io/api/#tree-shaking */ - treeShaking?: boolean - /** Documentation: https://esbuild.github.io/api/#ignore-annotations */ - ignoreAnnotations?: boolean - - /** Documentation: https://esbuild.github.io/api/#jsx */ - jsx?: 'transform' | 'preserve' | 'automatic' - /** Documentation: https://esbuild.github.io/api/#jsx-factory */ - jsxFactory?: string - /** Documentation: https://esbuild.github.io/api/#jsx-fragment */ - jsxFragment?: string - /** Documentation: https://esbuild.github.io/api/#jsx-import-source */ - jsxImportSource?: string - /** Documentation: https://esbuild.github.io/api/#jsx-development */ - jsxDev?: boolean - /** Documentation: https://esbuild.github.io/api/#jsx-side-effects */ - jsxSideEffects?: boolean - - /** Documentation: https://esbuild.github.io/api/#define */ - define?: { [key: string]: string } - /** Documentation: https://esbuild.github.io/api/#pure */ - pure?: string[] - /** Documentation: https://esbuild.github.io/api/#keep-names */ - keepNames?: boolean - - /** Documentation: https://esbuild.github.io/api/#color */ - color?: boolean - /** Documentation: https://esbuild.github.io/api/#log-level */ - logLevel?: LogLevel - /** Documentation: https://esbuild.github.io/api/#log-limit */ - logLimit?: number - /** Documentation: https://esbuild.github.io/api/#log-override */ - logOverride?: Record - - /** Documentation: https://esbuild.github.io/api/#tsconfig-raw */ - tsconfigRaw?: string | TsconfigRaw -} - -export interface TsconfigRaw { - compilerOptions?: { - alwaysStrict?: boolean - baseUrl?: string - experimentalDecorators?: boolean - importsNotUsedAsValues?: 'remove' | 'preserve' | 'error' - jsx?: 'preserve' | 'react-native' | 'react' | 'react-jsx' | 'react-jsxdev' - jsxFactory?: string - jsxFragmentFactory?: string - jsxImportSource?: string - paths?: Record - preserveValueImports?: boolean - strict?: boolean - target?: string - useDefineForClassFields?: boolean - verbatimModuleSyntax?: boolean - } -} - -export interface BuildOptions extends CommonOptions { - /** Documentation: https://esbuild.github.io/api/#bundle */ - bundle?: boolean - /** Documentation: https://esbuild.github.io/api/#splitting */ - splitting?: boolean - /** Documentation: https://esbuild.github.io/api/#preserve-symlinks */ - preserveSymlinks?: boolean - /** Documentation: https://esbuild.github.io/api/#outfile */ - outfile?: string - /** Documentation: https://esbuild.github.io/api/#metafile */ - metafile?: boolean - /** Documentation: https://esbuild.github.io/api/#outdir */ - outdir?: string - /** Documentation: https://esbuild.github.io/api/#outbase */ - outbase?: string - /** Documentation: https://esbuild.github.io/api/#external */ - external?: string[] - /** Documentation: https://esbuild.github.io/api/#packages */ - packages?: 'bundle' | 'external' - /** Documentation: https://esbuild.github.io/api/#alias */ - alias?: Record - /** Documentation: https://esbuild.github.io/api/#loader */ - loader?: { [ext: string]: Loader } - /** Documentation: https://esbuild.github.io/api/#resolve-extensions */ - resolveExtensions?: string[] - /** Documentation: https://esbuild.github.io/api/#main-fields */ - mainFields?: string[] - /** Documentation: https://esbuild.github.io/api/#conditions */ - conditions?: string[] - /** Documentation: https://esbuild.github.io/api/#write */ - write?: boolean - /** Documentation: https://esbuild.github.io/api/#allow-overwrite */ - allowOverwrite?: boolean - /** Documentation: https://esbuild.github.io/api/#tsconfig */ - tsconfig?: string - /** Documentation: https://esbuild.github.io/api/#out-extension */ - outExtension?: { [ext: string]: string } - /** Documentation: https://esbuild.github.io/api/#public-path */ - publicPath?: string - /** Documentation: https://esbuild.github.io/api/#entry-names */ - entryNames?: string - /** Documentation: https://esbuild.github.io/api/#chunk-names */ - chunkNames?: string - /** Documentation: https://esbuild.github.io/api/#asset-names */ - assetNames?: string - /** Documentation: https://esbuild.github.io/api/#inject */ - inject?: string[] - /** Documentation: https://esbuild.github.io/api/#banner */ - banner?: { [type: string]: string } - /** Documentation: https://esbuild.github.io/api/#footer */ - footer?: { [type: string]: string } - /** Documentation: https://esbuild.github.io/api/#entry-points */ - entryPoints?: string[] | Record | { in: string, out: string }[] - /** Documentation: https://esbuild.github.io/api/#stdin */ - stdin?: StdinOptions - /** Documentation: https://esbuild.github.io/plugins/ */ - plugins?: Plugin[] - /** Documentation: https://esbuild.github.io/api/#working-directory */ - absWorkingDir?: string - /** Documentation: https://esbuild.github.io/api/#node-paths */ - nodePaths?: string[]; // The "NODE_PATH" variable from Node.js -} - -export interface StdinOptions { - contents: string | Uint8Array - resolveDir?: string - sourcefile?: string - loader?: Loader -} - -export interface Message { - id: string - pluginName: string - text: string - location: Location | null - notes: Note[] - - /** - * Optional user-specified data that is passed through unmodified. You can - * use this to stash the original error, for example. - */ - detail: any -} - -export interface Note { - text: string - location: Location | null -} - -export interface Location { - file: string - namespace: string - /** 1-based */ - line: number - /** 0-based, in bytes */ - column: number - /** in bytes */ - length: number - lineText: string - suggestion: string -} - -export interface OutputFile { - path: string - contents: Uint8Array - hash: string - /** "contents" as text (changes automatically with "contents") */ - readonly text: string -} - -export interface BuildResult { - errors: Message[] - warnings: Message[] - /** Only when "write: false" */ - outputFiles: OutputFile[] | (ProvidedOptions['write'] extends false ? never : undefined) - /** Only when "metafile: true" */ - metafile: Metafile | (ProvidedOptions['metafile'] extends true ? never : undefined) - /** Only when "mangleCache" is present */ - mangleCache: Record | (ProvidedOptions['mangleCache'] extends Object ? never : undefined) -} - -export interface BuildFailure extends Error { - errors: Message[] - warnings: Message[] -} - -/** Documentation: https://esbuild.github.io/api/#serve-arguments */ -export interface ServeOptions { - port?: number - host?: string - servedir?: string - keyfile?: string - certfile?: string - fallback?: string - onRequest?: (args: ServeOnRequestArgs) => void -} - -export interface ServeOnRequestArgs { - remoteAddress: string - method: string - path: string - status: number - /** The time to generate the response, not to send it */ - timeInMS: number -} - -/** Documentation: https://esbuild.github.io/api/#serve-return-values */ -export interface ServeResult { - port: number - host: string -} - -export interface TransformOptions extends CommonOptions { - /** Documentation: https://esbuild.github.io/api/#sourcefile */ - sourcefile?: string - /** Documentation: https://esbuild.github.io/api/#loader */ - loader?: Loader - /** Documentation: https://esbuild.github.io/api/#banner */ - banner?: string - /** Documentation: https://esbuild.github.io/api/#footer */ - footer?: string -} - -export interface TransformResult { - code: string - map: string - warnings: Message[] - /** Only when "mangleCache" is present */ - mangleCache: Record | (ProvidedOptions['mangleCache'] extends Object ? never : undefined) - /** Only when "legalComments" is "external" */ - legalComments: string | (ProvidedOptions['legalComments'] extends 'external' ? never : undefined) -} - -export interface TransformFailure extends Error { - errors: Message[] - warnings: Message[] -} - -export interface Plugin { - name: string - setup: (build: PluginBuild) => (void | Promise) -} - -export interface PluginBuild { - /** Documentation: https://esbuild.github.io/plugins/#build-options */ - initialOptions: BuildOptions - - /** Documentation: https://esbuild.github.io/plugins/#resolve */ - resolve(path: string, options?: ResolveOptions): Promise - - /** Documentation: https://esbuild.github.io/plugins/#on-start */ - onStart(callback: () => - (OnStartResult | null | void | Promise)): void - - /** Documentation: https://esbuild.github.io/plugins/#on-end */ - onEnd(callback: (result: BuildResult) => - (OnEndResult | null | void | Promise)): void - - /** Documentation: https://esbuild.github.io/plugins/#on-resolve */ - onResolve(options: OnResolveOptions, callback: (args: OnResolveArgs) => - (OnResolveResult | null | undefined | Promise)): void - - /** Documentation: https://esbuild.github.io/plugins/#on-load */ - onLoad(options: OnLoadOptions, callback: (args: OnLoadArgs) => - (OnLoadResult | null | undefined | Promise)): void - - /** Documentation: https://esbuild.github.io/plugins/#on-dispose */ - onDispose(callback: () => void): void - - // This is a full copy of the esbuild library in case you need it - esbuild: { - context: typeof context, - build: typeof build, - buildSync: typeof buildSync, - transform: typeof transform, - transformSync: typeof transformSync, - formatMessages: typeof formatMessages, - formatMessagesSync: typeof formatMessagesSync, - analyzeMetafile: typeof analyzeMetafile, - analyzeMetafileSync: typeof analyzeMetafileSync, - initialize: typeof initialize, - version: typeof version, - } -} - -/** Documentation: https://esbuild.github.io/plugins/#resolve-options */ -export interface ResolveOptions { - pluginName?: string - importer?: string - namespace?: string - resolveDir?: string - kind?: ImportKind - pluginData?: any - with?: Record -} - -/** Documentation: https://esbuild.github.io/plugins/#resolve-results */ -export interface ResolveResult { - errors: Message[] - warnings: Message[] - - path: string - external: boolean - sideEffects: boolean - namespace: string - suffix: string - pluginData: any -} - -export interface OnStartResult { - errors?: PartialMessage[] - warnings?: PartialMessage[] -} - -export interface OnEndResult { - errors?: PartialMessage[] - warnings?: PartialMessage[] -} - -/** Documentation: https://esbuild.github.io/plugins/#on-resolve-options */ -export interface OnResolveOptions { - filter: RegExp - namespace?: string -} - -/** Documentation: https://esbuild.github.io/plugins/#on-resolve-arguments */ -export interface OnResolveArgs { - path: string - importer: string - namespace: string - resolveDir: string - kind: ImportKind - pluginData: any - with: Record -} - -export type ImportKind = - | 'entry-point' - - // JS - | 'import-statement' - | 'require-call' - | 'dynamic-import' - | 'require-resolve' - - // CSS - | 'import-rule' - | 'composes-from' - | 'url-token' - -/** Documentation: https://esbuild.github.io/plugins/#on-resolve-results */ -export interface OnResolveResult { - pluginName?: string - - errors?: PartialMessage[] - warnings?: PartialMessage[] - - path?: string - external?: boolean - sideEffects?: boolean - namespace?: string - suffix?: string - pluginData?: any - - watchFiles?: string[] - watchDirs?: string[] -} - -/** Documentation: https://esbuild.github.io/plugins/#on-load-options */ -export interface OnLoadOptions { - filter: RegExp - namespace?: string -} - -/** Documentation: https://esbuild.github.io/plugins/#on-load-arguments */ -export interface OnLoadArgs { - path: string - namespace: string - suffix: string - pluginData: any - with: Record -} - -/** Documentation: https://esbuild.github.io/plugins/#on-load-results */ -export interface OnLoadResult { - pluginName?: string - - errors?: PartialMessage[] - warnings?: PartialMessage[] - - contents?: string | Uint8Array - resolveDir?: string - loader?: Loader - pluginData?: any - - watchFiles?: string[] - watchDirs?: string[] -} - -export interface PartialMessage { - id?: string - pluginName?: string - text?: string - location?: Partial | null - notes?: PartialNote[] - detail?: any -} - -export interface PartialNote { - text?: string - location?: Partial | null -} - -/** Documentation: https://esbuild.github.io/api/#metafile */ -export interface Metafile { - inputs: { - [path: string]: { - bytes: number - imports: { - path: string - kind: ImportKind - external?: boolean - original?: string - with?: Record - }[] - format?: 'cjs' | 'esm' - with?: Record - } - } - outputs: { - [path: string]: { - bytes: number - inputs: { - [path: string]: { - bytesInOutput: number - } - } - imports: { - path: string - kind: ImportKind | 'file-loader' - external?: boolean - }[] - exports: string[] - entryPoint?: string - cssBundle?: string - } - } -} - -export interface FormatMessagesOptions { - kind: 'error' | 'warning' - color?: boolean - terminalWidth?: number -} - -export interface AnalyzeMetafileOptions { - color?: boolean - verbose?: boolean -} - -export interface WatchOptions { -} - -export interface BuildContext { - /** Documentation: https://esbuild.github.io/api/#rebuild */ - rebuild(): Promise> - - /** Documentation: https://esbuild.github.io/api/#watch */ - watch(options?: WatchOptions): Promise - - /** Documentation: https://esbuild.github.io/api/#serve */ - serve(options?: ServeOptions): Promise - - cancel(): Promise - dispose(): Promise -} - -// This is a TypeScript type-level function which replaces any keys in "In" -// that aren't in "Out" with "never". We use this to reject properties with -// typos in object literals. See: https://stackoverflow.com/questions/49580725 -type SameShape = In & { [Key in Exclude]: never } - -/** - * This function invokes the "esbuild" command-line tool for you. It returns a - * promise that either resolves with a "BuildResult" object or rejects with a - * "BuildFailure" object. - * - * - Works in node: yes - * - Works in browser: yes - * - * Documentation: https://esbuild.github.io/api/#build - */ -export declare function build(options: SameShape): Promise> - -/** - * This is the advanced long-running form of "build" that supports additional - * features such as watch mode and a local development server. - * - * - Works in node: yes - * - Works in browser: no - * - * Documentation: https://esbuild.github.io/api/#build - */ -export declare function context(options: SameShape): Promise> - -/** - * This function transforms a single JavaScript file. It can be used to minify - * JavaScript, convert TypeScript/JSX to JavaScript, or convert newer JavaScript - * to older JavaScript. It returns a promise that is either resolved with a - * "TransformResult" object or rejected with a "TransformFailure" object. - * - * - Works in node: yes - * - Works in browser: yes - * - * Documentation: https://esbuild.github.io/api/#transform - */ -export declare function transform(input: string | Uint8Array, options?: SameShape): Promise> - -/** - * Converts log messages to formatted message strings suitable for printing in - * the terminal. This allows you to reuse the built-in behavior of esbuild's - * log message formatter. This is a batch-oriented API for efficiency. - * - * - Works in node: yes - * - Works in browser: yes - */ -export declare function formatMessages(messages: PartialMessage[], options: FormatMessagesOptions): Promise - -/** - * Pretty-prints an analysis of the metafile JSON to a string. This is just for - * convenience to be able to match esbuild's pretty-printing exactly. If you want - * to customize it, you can just inspect the data in the metafile yourself. - * - * - Works in node: yes - * - Works in browser: yes - * - * Documentation: https://esbuild.github.io/api/#analyze - */ -export declare function analyzeMetafile(metafile: Metafile | string, options?: AnalyzeMetafileOptions): Promise - -/** - * A synchronous version of "build". - * - * - Works in node: yes - * - Works in browser: no - * - * Documentation: https://esbuild.github.io/api/#build - */ -export declare function buildSync(options: SameShape): BuildResult - -/** - * A synchronous version of "transform". - * - * - Works in node: yes - * - Works in browser: no - * - * Documentation: https://esbuild.github.io/api/#transform - */ -export declare function transformSync(input: string | Uint8Array, options?: SameShape): TransformResult - -/** - * A synchronous version of "formatMessages". - * - * - Works in node: yes - * - Works in browser: no - */ -export declare function formatMessagesSync(messages: PartialMessage[], options: FormatMessagesOptions): string[] - -/** - * A synchronous version of "analyzeMetafile". - * - * - Works in node: yes - * - Works in browser: no - * - * Documentation: https://esbuild.github.io/api/#analyze - */ -export declare function analyzeMetafileSync(metafile: Metafile | string, options?: AnalyzeMetafileOptions): string - -/** - * This configures the browser-based version of esbuild. It is necessary to - * call this first and wait for the returned promise to be resolved before - * making other API calls when using esbuild in the browser. - * - * - Works in node: yes - * - Works in browser: yes ("options" is required) - * - * Documentation: https://esbuild.github.io/api/#browser - */ -export declare function initialize(options: InitializeOptions): Promise - -export interface InitializeOptions { - /** - * The URL of the "esbuild.wasm" file. This must be provided when running - * esbuild in the browser. - */ - wasmURL?: string | URL - - /** - * The result of calling "new WebAssembly.Module(buffer)" where "buffer" - * is a typed array or ArrayBuffer containing the binary code of the - * "esbuild.wasm" file. - * - * You can use this as an alternative to "wasmURL" for environments where it's - * not possible to download the WebAssembly module. - */ - wasmModule?: WebAssembly.Module - - /** - * By default esbuild runs the WebAssembly-based browser API in a web worker - * to avoid blocking the UI thread. This can be disabled by setting "worker" - * to false. - */ - worker?: boolean -} - -export let version: string - -// Call this function to terminate esbuild's child process. The child process -// is not terminated and re-created after each API call because it's more -// efficient to keep it around when there are multiple API calls. -// -// In node this happens automatically before the parent node process exits. So -// you only need to call this if you know you will not make any more esbuild -// API calls and you want to clean up resources. -// -// Unlike node, Deno lacks the necessary APIs to clean up child processes -// automatically. You must manually call stop() in Deno when you're done -// using esbuild or Deno will continue running forever. -// -// Another reason you might want to call this is if you are using esbuild from -// within a Deno test. Deno fails tests that create a child process without -// killing it before the test ends, so you have to call this function (and -// await the returned promise) in every Deno test that uses esbuild. -export declare function stop(): Promise - -// Note: These declarations exist to avoid type errors when you omit "dom" from -// "lib" in your "tsconfig.json" file. TypeScript confusingly declares the -// global "WebAssembly" type in "lib.dom.d.ts" even though it has nothing to do -// with the browser DOM and is present in many non-browser JavaScript runtimes -// (e.g. node and deno). Declaring it here allows esbuild's API to be used in -// these scenarios. -// -// There's an open issue about getting this problem corrected (although these -// declarations will need to remain even if this is fixed for backward -// compatibility with older TypeScript versions): -// -// https://github.com/microsoft/TypeScript-DOM-lib-generator/issues/826 -// -declare global { - namespace WebAssembly { - interface Module { - } - } - interface URL { - } -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/lib/main.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/lib/main.js deleted file mode 100644 index 45daeda4..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/lib/main.js +++ /dev/null @@ -1,2245 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// lib/npm/node.ts -var node_exports = {}; -__export(node_exports, { - analyzeMetafile: () => analyzeMetafile, - analyzeMetafileSync: () => analyzeMetafileSync, - build: () => build, - buildSync: () => buildSync, - context: () => context, - default: () => node_default, - formatMessages: () => formatMessages, - formatMessagesSync: () => formatMessagesSync, - initialize: () => initialize, - stop: () => stop, - transform: () => transform, - transformSync: () => transformSync, - version: () => version -}); -module.exports = __toCommonJS(node_exports); - -// lib/shared/stdio_protocol.ts -function encodePacket(packet) { - let visit = (value) => { - if (value === null) { - bb.write8(0); - } else if (typeof value === "boolean") { - bb.write8(1); - bb.write8(+value); - } else if (typeof value === "number") { - bb.write8(2); - bb.write32(value | 0); - } else if (typeof value === "string") { - bb.write8(3); - bb.write(encodeUTF8(value)); - } else if (value instanceof Uint8Array) { - bb.write8(4); - bb.write(value); - } else if (value instanceof Array) { - bb.write8(5); - bb.write32(value.length); - for (let item of value) { - visit(item); - } - } else { - let keys = Object.keys(value); - bb.write8(6); - bb.write32(keys.length); - for (let key of keys) { - bb.write(encodeUTF8(key)); - visit(value[key]); - } - } - }; - let bb = new ByteBuffer(); - bb.write32(0); - bb.write32(packet.id << 1 | +!packet.isRequest); - visit(packet.value); - writeUInt32LE(bb.buf, bb.len - 4, 0); - return bb.buf.subarray(0, bb.len); -} -function decodePacket(bytes) { - let visit = () => { - switch (bb.read8()) { - case 0: - return null; - case 1: - return !!bb.read8(); - case 2: - return bb.read32(); - case 3: - return decodeUTF8(bb.read()); - case 4: - return bb.read(); - case 5: { - let count = bb.read32(); - let value2 = []; - for (let i = 0; i < count; i++) { - value2.push(visit()); - } - return value2; - } - case 6: { - let count = bb.read32(); - let value2 = {}; - for (let i = 0; i < count; i++) { - value2[decodeUTF8(bb.read())] = visit(); - } - return value2; - } - default: - throw new Error("Invalid packet"); - } - }; - let bb = new ByteBuffer(bytes); - let id = bb.read32(); - let isRequest = (id & 1) === 0; - id >>>= 1; - let value = visit(); - if (bb.ptr !== bytes.length) { - throw new Error("Invalid packet"); - } - return { id, isRequest, value }; -} -var ByteBuffer = class { - constructor(buf = new Uint8Array(1024)) { - this.buf = buf; - this.len = 0; - this.ptr = 0; - } - _write(delta) { - if (this.len + delta > this.buf.length) { - let clone = new Uint8Array((this.len + delta) * 2); - clone.set(this.buf); - this.buf = clone; - } - this.len += delta; - return this.len - delta; - } - write8(value) { - let offset = this._write(1); - this.buf[offset] = value; - } - write32(value) { - let offset = this._write(4); - writeUInt32LE(this.buf, value, offset); - } - write(bytes) { - let offset = this._write(4 + bytes.length); - writeUInt32LE(this.buf, bytes.length, offset); - this.buf.set(bytes, offset + 4); - } - _read(delta) { - if (this.ptr + delta > this.buf.length) { - throw new Error("Invalid packet"); - } - this.ptr += delta; - return this.ptr - delta; - } - read8() { - return this.buf[this._read(1)]; - } - read32() { - return readUInt32LE(this.buf, this._read(4)); - } - read() { - let length = this.read32(); - let bytes = new Uint8Array(length); - let ptr = this._read(bytes.length); - bytes.set(this.buf.subarray(ptr, ptr + length)); - return bytes; - } -}; -var encodeUTF8; -var decodeUTF8; -var encodeInvariant; -if (typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined") { - let encoder = new TextEncoder(); - let decoder = new TextDecoder(); - encodeUTF8 = (text) => encoder.encode(text); - decodeUTF8 = (bytes) => decoder.decode(bytes); - encodeInvariant = 'new TextEncoder().encode("")'; -} else if (typeof Buffer !== "undefined") { - encodeUTF8 = (text) => Buffer.from(text); - decodeUTF8 = (bytes) => { - let { buffer, byteOffset, byteLength } = bytes; - return Buffer.from(buffer, byteOffset, byteLength).toString(); - }; - encodeInvariant = 'Buffer.from("")'; -} else { - throw new Error("No UTF-8 codec found"); -} -if (!(encodeUTF8("") instanceof Uint8Array)) - throw new Error(`Invariant violation: "${encodeInvariant} instanceof Uint8Array" is incorrectly false - -This indicates that your JavaScript environment is broken. You cannot use -esbuild in this environment because esbuild relies on this invariant. This -is not a problem with esbuild. You need to fix your environment instead. -`); -function readUInt32LE(buffer, offset) { - return buffer[offset++] | buffer[offset++] << 8 | buffer[offset++] << 16 | buffer[offset++] << 24; -} -function writeUInt32LE(buffer, value, offset) { - buffer[offset++] = value; - buffer[offset++] = value >> 8; - buffer[offset++] = value >> 16; - buffer[offset++] = value >> 24; -} - -// lib/shared/common.ts -var quote = JSON.stringify; -var buildLogLevelDefault = "warning"; -var transformLogLevelDefault = "silent"; -function validateTarget(target) { - validateStringValue(target, "target"); - if (target.indexOf(",") >= 0) throw new Error(`Invalid target: ${target}`); - return target; -} -var canBeAnything = () => null; -var mustBeBoolean = (value) => typeof value === "boolean" ? null : "a boolean"; -var mustBeString = (value) => typeof value === "string" ? null : "a string"; -var mustBeRegExp = (value) => value instanceof RegExp ? null : "a RegExp object"; -var mustBeInteger = (value) => typeof value === "number" && value === (value | 0) ? null : "an integer"; -var mustBeFunction = (value) => typeof value === "function" ? null : "a function"; -var mustBeArray = (value) => Array.isArray(value) ? null : "an array"; -var mustBeObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? null : "an object"; -var mustBeEntryPoints = (value) => typeof value === "object" && value !== null ? null : "an array or an object"; -var mustBeWebAssemblyModule = (value) => value instanceof WebAssembly.Module ? null : "a WebAssembly.Module"; -var mustBeObjectOrNull = (value) => typeof value === "object" && !Array.isArray(value) ? null : "an object or null"; -var mustBeStringOrBoolean = (value) => typeof value === "string" || typeof value === "boolean" ? null : "a string or a boolean"; -var mustBeStringOrObject = (value) => typeof value === "string" || typeof value === "object" && value !== null && !Array.isArray(value) ? null : "a string or an object"; -var mustBeStringOrArray = (value) => typeof value === "string" || Array.isArray(value) ? null : "a string or an array"; -var mustBeStringOrUint8Array = (value) => typeof value === "string" || value instanceof Uint8Array ? null : "a string or a Uint8Array"; -var mustBeStringOrURL = (value) => typeof value === "string" || value instanceof URL ? null : "a string or a URL"; -function getFlag(object, keys, key, mustBeFn) { - let value = object[key]; - keys[key + ""] = true; - if (value === void 0) return void 0; - let mustBe = mustBeFn(value); - if (mustBe !== null) throw new Error(`${quote(key)} must be ${mustBe}`); - return value; -} -function checkForInvalidFlags(object, keys, where) { - for (let key in object) { - if (!(key in keys)) { - throw new Error(`Invalid option ${where}: ${quote(key)}`); - } - } -} -function validateInitializeOptions(options) { - let keys = /* @__PURE__ */ Object.create(null); - let wasmURL = getFlag(options, keys, "wasmURL", mustBeStringOrURL); - let wasmModule = getFlag(options, keys, "wasmModule", mustBeWebAssemblyModule); - let worker = getFlag(options, keys, "worker", mustBeBoolean); - checkForInvalidFlags(options, keys, "in initialize() call"); - return { - wasmURL, - wasmModule, - worker - }; -} -function validateMangleCache(mangleCache) { - let validated; - if (mangleCache !== void 0) { - validated = /* @__PURE__ */ Object.create(null); - for (let key in mangleCache) { - let value = mangleCache[key]; - if (typeof value === "string" || value === false) { - validated[key] = value; - } else { - throw new Error(`Expected ${quote(key)} in mangle cache to map to either a string or false`); - } - } - } - return validated; -} -function pushLogFlags(flags, options, keys, isTTY2, logLevelDefault) { - let color = getFlag(options, keys, "color", mustBeBoolean); - let logLevel = getFlag(options, keys, "logLevel", mustBeString); - let logLimit = getFlag(options, keys, "logLimit", mustBeInteger); - if (color !== void 0) flags.push(`--color=${color}`); - else if (isTTY2) flags.push(`--color=true`); - flags.push(`--log-level=${logLevel || logLevelDefault}`); - flags.push(`--log-limit=${logLimit || 0}`); -} -function validateStringValue(value, what, key) { - if (typeof value !== "string") { - throw new Error(`Expected value for ${what}${key !== void 0 ? " " + quote(key) : ""} to be a string, got ${typeof value} instead`); - } - return value; -} -function pushCommonFlags(flags, options, keys) { - let legalComments = getFlag(options, keys, "legalComments", mustBeString); - let sourceRoot = getFlag(options, keys, "sourceRoot", mustBeString); - let sourcesContent = getFlag(options, keys, "sourcesContent", mustBeBoolean); - let target = getFlag(options, keys, "target", mustBeStringOrArray); - let format = getFlag(options, keys, "format", mustBeString); - let globalName = getFlag(options, keys, "globalName", mustBeString); - let mangleProps = getFlag(options, keys, "mangleProps", mustBeRegExp); - let reserveProps = getFlag(options, keys, "reserveProps", mustBeRegExp); - let mangleQuoted = getFlag(options, keys, "mangleQuoted", mustBeBoolean); - let minify = getFlag(options, keys, "minify", mustBeBoolean); - let minifySyntax = getFlag(options, keys, "minifySyntax", mustBeBoolean); - let minifyWhitespace = getFlag(options, keys, "minifyWhitespace", mustBeBoolean); - let minifyIdentifiers = getFlag(options, keys, "minifyIdentifiers", mustBeBoolean); - let lineLimit = getFlag(options, keys, "lineLimit", mustBeInteger); - let drop = getFlag(options, keys, "drop", mustBeArray); - let dropLabels = getFlag(options, keys, "dropLabels", mustBeArray); - let charset = getFlag(options, keys, "charset", mustBeString); - let treeShaking = getFlag(options, keys, "treeShaking", mustBeBoolean); - let ignoreAnnotations = getFlag(options, keys, "ignoreAnnotations", mustBeBoolean); - let jsx = getFlag(options, keys, "jsx", mustBeString); - let jsxFactory = getFlag(options, keys, "jsxFactory", mustBeString); - let jsxFragment = getFlag(options, keys, "jsxFragment", mustBeString); - let jsxImportSource = getFlag(options, keys, "jsxImportSource", mustBeString); - let jsxDev = getFlag(options, keys, "jsxDev", mustBeBoolean); - let jsxSideEffects = getFlag(options, keys, "jsxSideEffects", mustBeBoolean); - let define = getFlag(options, keys, "define", mustBeObject); - let logOverride = getFlag(options, keys, "logOverride", mustBeObject); - let supported = getFlag(options, keys, "supported", mustBeObject); - let pure = getFlag(options, keys, "pure", mustBeArray); - let keepNames = getFlag(options, keys, "keepNames", mustBeBoolean); - let platform = getFlag(options, keys, "platform", mustBeString); - let tsconfigRaw = getFlag(options, keys, "tsconfigRaw", mustBeStringOrObject); - if (legalComments) flags.push(`--legal-comments=${legalComments}`); - if (sourceRoot !== void 0) flags.push(`--source-root=${sourceRoot}`); - if (sourcesContent !== void 0) flags.push(`--sources-content=${sourcesContent}`); - if (target) { - if (Array.isArray(target)) flags.push(`--target=${Array.from(target).map(validateTarget).join(",")}`); - else flags.push(`--target=${validateTarget(target)}`); - } - if (format) flags.push(`--format=${format}`); - if (globalName) flags.push(`--global-name=${globalName}`); - if (platform) flags.push(`--platform=${platform}`); - if (tsconfigRaw) flags.push(`--tsconfig-raw=${typeof tsconfigRaw === "string" ? tsconfigRaw : JSON.stringify(tsconfigRaw)}`); - if (minify) flags.push("--minify"); - if (minifySyntax) flags.push("--minify-syntax"); - if (minifyWhitespace) flags.push("--minify-whitespace"); - if (minifyIdentifiers) flags.push("--minify-identifiers"); - if (lineLimit) flags.push(`--line-limit=${lineLimit}`); - if (charset) flags.push(`--charset=${charset}`); - if (treeShaking !== void 0) flags.push(`--tree-shaking=${treeShaking}`); - if (ignoreAnnotations) flags.push(`--ignore-annotations`); - if (drop) for (let what of drop) flags.push(`--drop:${validateStringValue(what, "drop")}`); - if (dropLabels) flags.push(`--drop-labels=${Array.from(dropLabels).map((what) => validateStringValue(what, "dropLabels")).join(",")}`); - if (mangleProps) flags.push(`--mangle-props=${mangleProps.source}`); - if (reserveProps) flags.push(`--reserve-props=${reserveProps.source}`); - if (mangleQuoted !== void 0) flags.push(`--mangle-quoted=${mangleQuoted}`); - if (jsx) flags.push(`--jsx=${jsx}`); - if (jsxFactory) flags.push(`--jsx-factory=${jsxFactory}`); - if (jsxFragment) flags.push(`--jsx-fragment=${jsxFragment}`); - if (jsxImportSource) flags.push(`--jsx-import-source=${jsxImportSource}`); - if (jsxDev) flags.push(`--jsx-dev`); - if (jsxSideEffects) flags.push(`--jsx-side-effects`); - if (define) { - for (let key in define) { - if (key.indexOf("=") >= 0) throw new Error(`Invalid define: ${key}`); - flags.push(`--define:${key}=${validateStringValue(define[key], "define", key)}`); - } - } - if (logOverride) { - for (let key in logOverride) { - if (key.indexOf("=") >= 0) throw new Error(`Invalid log override: ${key}`); - flags.push(`--log-override:${key}=${validateStringValue(logOverride[key], "log override", key)}`); - } - } - if (supported) { - for (let key in supported) { - if (key.indexOf("=") >= 0) throw new Error(`Invalid supported: ${key}`); - const value = supported[key]; - if (typeof value !== "boolean") throw new Error(`Expected value for supported ${quote(key)} to be a boolean, got ${typeof value} instead`); - flags.push(`--supported:${key}=${value}`); - } - } - if (pure) for (let fn of pure) flags.push(`--pure:${validateStringValue(fn, "pure")}`); - if (keepNames) flags.push(`--keep-names`); -} -function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeDefault) { - var _a2; - let flags = []; - let entries = []; - let keys = /* @__PURE__ */ Object.create(null); - let stdinContents = null; - let stdinResolveDir = null; - pushLogFlags(flags, options, keys, isTTY2, logLevelDefault); - pushCommonFlags(flags, options, keys); - let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean); - let bundle = getFlag(options, keys, "bundle", mustBeBoolean); - let splitting = getFlag(options, keys, "splitting", mustBeBoolean); - let preserveSymlinks = getFlag(options, keys, "preserveSymlinks", mustBeBoolean); - let metafile = getFlag(options, keys, "metafile", mustBeBoolean); - let outfile = getFlag(options, keys, "outfile", mustBeString); - let outdir = getFlag(options, keys, "outdir", mustBeString); - let outbase = getFlag(options, keys, "outbase", mustBeString); - let tsconfig = getFlag(options, keys, "tsconfig", mustBeString); - let resolveExtensions = getFlag(options, keys, "resolveExtensions", mustBeArray); - let nodePathsInput = getFlag(options, keys, "nodePaths", mustBeArray); - let mainFields = getFlag(options, keys, "mainFields", mustBeArray); - let conditions = getFlag(options, keys, "conditions", mustBeArray); - let external = getFlag(options, keys, "external", mustBeArray); - let packages = getFlag(options, keys, "packages", mustBeString); - let alias = getFlag(options, keys, "alias", mustBeObject); - let loader = getFlag(options, keys, "loader", mustBeObject); - let outExtension = getFlag(options, keys, "outExtension", mustBeObject); - let publicPath = getFlag(options, keys, "publicPath", mustBeString); - let entryNames = getFlag(options, keys, "entryNames", mustBeString); - let chunkNames = getFlag(options, keys, "chunkNames", mustBeString); - let assetNames = getFlag(options, keys, "assetNames", mustBeString); - let inject = getFlag(options, keys, "inject", mustBeArray); - let banner = getFlag(options, keys, "banner", mustBeObject); - let footer = getFlag(options, keys, "footer", mustBeObject); - let entryPoints = getFlag(options, keys, "entryPoints", mustBeEntryPoints); - let absWorkingDir = getFlag(options, keys, "absWorkingDir", mustBeString); - let stdin = getFlag(options, keys, "stdin", mustBeObject); - let write = (_a2 = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a2 : writeDefault; - let allowOverwrite = getFlag(options, keys, "allowOverwrite", mustBeBoolean); - let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject); - keys.plugins = true; - checkForInvalidFlags(options, keys, `in ${callName}() call`); - if (sourcemap) flags.push(`--sourcemap${sourcemap === true ? "" : `=${sourcemap}`}`); - if (bundle) flags.push("--bundle"); - if (allowOverwrite) flags.push("--allow-overwrite"); - if (splitting) flags.push("--splitting"); - if (preserveSymlinks) flags.push("--preserve-symlinks"); - if (metafile) flags.push(`--metafile`); - if (outfile) flags.push(`--outfile=${outfile}`); - if (outdir) flags.push(`--outdir=${outdir}`); - if (outbase) flags.push(`--outbase=${outbase}`); - if (tsconfig) flags.push(`--tsconfig=${tsconfig}`); - if (packages) flags.push(`--packages=${packages}`); - if (resolveExtensions) { - let values = []; - for (let value of resolveExtensions) { - validateStringValue(value, "resolve extension"); - if (value.indexOf(",") >= 0) throw new Error(`Invalid resolve extension: ${value}`); - values.push(value); - } - flags.push(`--resolve-extensions=${values.join(",")}`); - } - if (publicPath) flags.push(`--public-path=${publicPath}`); - if (entryNames) flags.push(`--entry-names=${entryNames}`); - if (chunkNames) flags.push(`--chunk-names=${chunkNames}`); - if (assetNames) flags.push(`--asset-names=${assetNames}`); - if (mainFields) { - let values = []; - for (let value of mainFields) { - validateStringValue(value, "main field"); - if (value.indexOf(",") >= 0) throw new Error(`Invalid main field: ${value}`); - values.push(value); - } - flags.push(`--main-fields=${values.join(",")}`); - } - if (conditions) { - let values = []; - for (let value of conditions) { - validateStringValue(value, "condition"); - if (value.indexOf(",") >= 0) throw new Error(`Invalid condition: ${value}`); - values.push(value); - } - flags.push(`--conditions=${values.join(",")}`); - } - if (external) for (let name of external) flags.push(`--external:${validateStringValue(name, "external")}`); - if (alias) { - for (let old in alias) { - if (old.indexOf("=") >= 0) throw new Error(`Invalid package name in alias: ${old}`); - flags.push(`--alias:${old}=${validateStringValue(alias[old], "alias", old)}`); - } - } - if (banner) { - for (let type in banner) { - if (type.indexOf("=") >= 0) throw new Error(`Invalid banner file type: ${type}`); - flags.push(`--banner:${type}=${validateStringValue(banner[type], "banner", type)}`); - } - } - if (footer) { - for (let type in footer) { - if (type.indexOf("=") >= 0) throw new Error(`Invalid footer file type: ${type}`); - flags.push(`--footer:${type}=${validateStringValue(footer[type], "footer", type)}`); - } - } - if (inject) for (let path3 of inject) flags.push(`--inject:${validateStringValue(path3, "inject")}`); - if (loader) { - for (let ext in loader) { - if (ext.indexOf("=") >= 0) throw new Error(`Invalid loader extension: ${ext}`); - flags.push(`--loader:${ext}=${validateStringValue(loader[ext], "loader", ext)}`); - } - } - if (outExtension) { - for (let ext in outExtension) { - if (ext.indexOf("=") >= 0) throw new Error(`Invalid out extension: ${ext}`); - flags.push(`--out-extension:${ext}=${validateStringValue(outExtension[ext], "out extension", ext)}`); - } - } - if (entryPoints) { - if (Array.isArray(entryPoints)) { - for (let i = 0, n = entryPoints.length; i < n; i++) { - let entryPoint = entryPoints[i]; - if (typeof entryPoint === "object" && entryPoint !== null) { - let entryPointKeys = /* @__PURE__ */ Object.create(null); - let input = getFlag(entryPoint, entryPointKeys, "in", mustBeString); - let output = getFlag(entryPoint, entryPointKeys, "out", mustBeString); - checkForInvalidFlags(entryPoint, entryPointKeys, "in entry point at index " + i); - if (input === void 0) throw new Error('Missing property "in" for entry point at index ' + i); - if (output === void 0) throw new Error('Missing property "out" for entry point at index ' + i); - entries.push([output, input]); - } else { - entries.push(["", validateStringValue(entryPoint, "entry point at index " + i)]); - } - } - } else { - for (let key in entryPoints) { - entries.push([key, validateStringValue(entryPoints[key], "entry point", key)]); - } - } - } - if (stdin) { - let stdinKeys = /* @__PURE__ */ Object.create(null); - let contents = getFlag(stdin, stdinKeys, "contents", mustBeStringOrUint8Array); - let resolveDir = getFlag(stdin, stdinKeys, "resolveDir", mustBeString); - let sourcefile = getFlag(stdin, stdinKeys, "sourcefile", mustBeString); - let loader2 = getFlag(stdin, stdinKeys, "loader", mustBeString); - checkForInvalidFlags(stdin, stdinKeys, 'in "stdin" object'); - if (sourcefile) flags.push(`--sourcefile=${sourcefile}`); - if (loader2) flags.push(`--loader=${loader2}`); - if (resolveDir) stdinResolveDir = resolveDir; - if (typeof contents === "string") stdinContents = encodeUTF8(contents); - else if (contents instanceof Uint8Array) stdinContents = contents; - } - let nodePaths = []; - if (nodePathsInput) { - for (let value of nodePathsInput) { - value += ""; - nodePaths.push(value); - } - } - return { - entries, - flags, - write, - stdinContents, - stdinResolveDir, - absWorkingDir, - nodePaths, - mangleCache: validateMangleCache(mangleCache) - }; -} -function flagsForTransformOptions(callName, options, isTTY2, logLevelDefault) { - let flags = []; - let keys = /* @__PURE__ */ Object.create(null); - pushLogFlags(flags, options, keys, isTTY2, logLevelDefault); - pushCommonFlags(flags, options, keys); - let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean); - let sourcefile = getFlag(options, keys, "sourcefile", mustBeString); - let loader = getFlag(options, keys, "loader", mustBeString); - let banner = getFlag(options, keys, "banner", mustBeString); - let footer = getFlag(options, keys, "footer", mustBeString); - let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject); - checkForInvalidFlags(options, keys, `in ${callName}() call`); - if (sourcemap) flags.push(`--sourcemap=${sourcemap === true ? "external" : sourcemap}`); - if (sourcefile) flags.push(`--sourcefile=${sourcefile}`); - if (loader) flags.push(`--loader=${loader}`); - if (banner) flags.push(`--banner=${banner}`); - if (footer) flags.push(`--footer=${footer}`); - return { - flags, - mangleCache: validateMangleCache(mangleCache) - }; -} -function createChannel(streamIn) { - const requestCallbacksByKey = {}; - const closeData = { didClose: false, reason: "" }; - let responseCallbacks = {}; - let nextRequestID = 0; - let nextBuildKey = 0; - let stdout = new Uint8Array(16 * 1024); - let stdoutUsed = 0; - let readFromStdout = (chunk) => { - let limit = stdoutUsed + chunk.length; - if (limit > stdout.length) { - let swap = new Uint8Array(limit * 2); - swap.set(stdout); - stdout = swap; - } - stdout.set(chunk, stdoutUsed); - stdoutUsed += chunk.length; - let offset = 0; - while (offset + 4 <= stdoutUsed) { - let length = readUInt32LE(stdout, offset); - if (offset + 4 + length > stdoutUsed) { - break; - } - offset += 4; - handleIncomingPacket(stdout.subarray(offset, offset + length)); - offset += length; - } - if (offset > 0) { - stdout.copyWithin(0, offset, stdoutUsed); - stdoutUsed -= offset; - } - }; - let afterClose = (error) => { - closeData.didClose = true; - if (error) closeData.reason = ": " + (error.message || error); - const text = "The service was stopped" + closeData.reason; - for (let id in responseCallbacks) { - responseCallbacks[id](text, null); - } - responseCallbacks = {}; - }; - let sendRequest = (refs, value, callback) => { - if (closeData.didClose) return callback("The service is no longer running" + closeData.reason, null); - let id = nextRequestID++; - responseCallbacks[id] = (error, response) => { - try { - callback(error, response); - } finally { - if (refs) refs.unref(); - } - }; - if (refs) refs.ref(); - streamIn.writeToStdin(encodePacket({ id, isRequest: true, value })); - }; - let sendResponse = (id, value) => { - if (closeData.didClose) throw new Error("The service is no longer running" + closeData.reason); - streamIn.writeToStdin(encodePacket({ id, isRequest: false, value })); - }; - let handleRequest = async (id, request) => { - try { - if (request.command === "ping") { - sendResponse(id, {}); - return; - } - if (typeof request.key === "number") { - const requestCallbacks = requestCallbacksByKey[request.key]; - if (!requestCallbacks) { - return; - } - const callback = requestCallbacks[request.command]; - if (callback) { - await callback(id, request); - return; - } - } - throw new Error(`Invalid command: ` + request.command); - } catch (e) { - const errors = [extractErrorMessageV8(e, streamIn, null, void 0, "")]; - try { - sendResponse(id, { errors }); - } catch { - } - } - }; - let isFirstPacket = true; - let handleIncomingPacket = (bytes) => { - if (isFirstPacket) { - isFirstPacket = false; - let binaryVersion = String.fromCharCode(...bytes); - if (binaryVersion !== "0.24.2") { - throw new Error(`Cannot start service: Host version "${"0.24.2"}" does not match binary version ${quote(binaryVersion)}`); - } - return; - } - let packet = decodePacket(bytes); - if (packet.isRequest) { - handleRequest(packet.id, packet.value); - } else { - let callback = responseCallbacks[packet.id]; - delete responseCallbacks[packet.id]; - if (packet.value.error) callback(packet.value.error, {}); - else callback(null, packet.value); - } - }; - let buildOrContext = ({ callName, refs, options, isTTY: isTTY2, defaultWD: defaultWD2, callback }) => { - let refCount = 0; - const buildKey = nextBuildKey++; - const requestCallbacks = {}; - const buildRefs = { - ref() { - if (++refCount === 1) { - if (refs) refs.ref(); - } - }, - unref() { - if (--refCount === 0) { - delete requestCallbacksByKey[buildKey]; - if (refs) refs.unref(); - } - } - }; - requestCallbacksByKey[buildKey] = requestCallbacks; - buildRefs.ref(); - buildOrContextImpl( - callName, - buildKey, - sendRequest, - sendResponse, - buildRefs, - streamIn, - requestCallbacks, - options, - isTTY2, - defaultWD2, - (err, res) => { - try { - callback(err, res); - } finally { - buildRefs.unref(); - } - } - ); - }; - let transform2 = ({ callName, refs, input, options, isTTY: isTTY2, fs: fs3, callback }) => { - const details = createObjectStash(); - let start = (inputPath) => { - try { - if (typeof input !== "string" && !(input instanceof Uint8Array)) - throw new Error('The input to "transform" must be a string or a Uint8Array'); - let { - flags, - mangleCache - } = flagsForTransformOptions(callName, options, isTTY2, transformLogLevelDefault); - let request = { - command: "transform", - flags, - inputFS: inputPath !== null, - input: inputPath !== null ? encodeUTF8(inputPath) : typeof input === "string" ? encodeUTF8(input) : input - }; - if (mangleCache) request.mangleCache = mangleCache; - sendRequest(refs, request, (error, response) => { - if (error) return callback(new Error(error), null); - let errors = replaceDetailsInMessages(response.errors, details); - let warnings = replaceDetailsInMessages(response.warnings, details); - let outstanding = 1; - let next = () => { - if (--outstanding === 0) { - let result = { - warnings, - code: response.code, - map: response.map, - mangleCache: void 0, - legalComments: void 0 - }; - if ("legalComments" in response) result.legalComments = response == null ? void 0 : response.legalComments; - if (response.mangleCache) result.mangleCache = response == null ? void 0 : response.mangleCache; - callback(null, result); - } - }; - if (errors.length > 0) return callback(failureErrorWithLog("Transform failed", errors, warnings), null); - if (response.codeFS) { - outstanding++; - fs3.readFile(response.code, (err, contents) => { - if (err !== null) { - callback(err, null); - } else { - response.code = contents; - next(); - } - }); - } - if (response.mapFS) { - outstanding++; - fs3.readFile(response.map, (err, contents) => { - if (err !== null) { - callback(err, null); - } else { - response.map = contents; - next(); - } - }); - } - next(); - }); - } catch (e) { - let flags = []; - try { - pushLogFlags(flags, options, {}, isTTY2, transformLogLevelDefault); - } catch { - } - const error = extractErrorMessageV8(e, streamIn, details, void 0, ""); - sendRequest(refs, { command: "error", flags, error }, () => { - error.detail = details.load(error.detail); - callback(failureErrorWithLog("Transform failed", [error], []), null); - }); - } - }; - if ((typeof input === "string" || input instanceof Uint8Array) && input.length > 1024 * 1024) { - let next = start; - start = () => fs3.writeFile(input, next); - } - start(null); - }; - let formatMessages2 = ({ callName, refs, messages, options, callback }) => { - if (!options) throw new Error(`Missing second argument in ${callName}() call`); - let keys = {}; - let kind = getFlag(options, keys, "kind", mustBeString); - let color = getFlag(options, keys, "color", mustBeBoolean); - let terminalWidth = getFlag(options, keys, "terminalWidth", mustBeInteger); - checkForInvalidFlags(options, keys, `in ${callName}() call`); - if (kind === void 0) throw new Error(`Missing "kind" in ${callName}() call`); - if (kind !== "error" && kind !== "warning") throw new Error(`Expected "kind" to be "error" or "warning" in ${callName}() call`); - let request = { - command: "format-msgs", - messages: sanitizeMessages(messages, "messages", null, "", terminalWidth), - isWarning: kind === "warning" - }; - if (color !== void 0) request.color = color; - if (terminalWidth !== void 0) request.terminalWidth = terminalWidth; - sendRequest(refs, request, (error, response) => { - if (error) return callback(new Error(error), null); - callback(null, response.messages); - }); - }; - let analyzeMetafile2 = ({ callName, refs, metafile, options, callback }) => { - if (options === void 0) options = {}; - let keys = {}; - let color = getFlag(options, keys, "color", mustBeBoolean); - let verbose = getFlag(options, keys, "verbose", mustBeBoolean); - checkForInvalidFlags(options, keys, `in ${callName}() call`); - let request = { - command: "analyze-metafile", - metafile - }; - if (color !== void 0) request.color = color; - if (verbose !== void 0) request.verbose = verbose; - sendRequest(refs, request, (error, response) => { - if (error) return callback(new Error(error), null); - callback(null, response.result); - }); - }; - return { - readFromStdout, - afterClose, - service: { - buildOrContext, - transform: transform2, - formatMessages: formatMessages2, - analyzeMetafile: analyzeMetafile2 - } - }; -} -function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) { - const details = createObjectStash(); - const isContext = callName === "context"; - const handleError = (e, pluginName) => { - const flags = []; - try { - pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault); - } catch { - } - const message = extractErrorMessageV8(e, streamIn, details, void 0, pluginName); - sendRequest(refs, { command: "error", flags, error: message }, () => { - message.detail = details.load(message.detail); - callback(failureErrorWithLog(isContext ? "Context failed" : "Build failed", [message], []), null); - }); - }; - let plugins; - if (typeof options === "object") { - const value = options.plugins; - if (value !== void 0) { - if (!Array.isArray(value)) return handleError(new Error(`"plugins" must be an array`), ""); - plugins = value; - } - } - if (plugins && plugins.length > 0) { - if (streamIn.isSync) return handleError(new Error("Cannot use plugins in synchronous API calls"), ""); - handlePlugins( - buildKey, - sendRequest, - sendResponse, - refs, - streamIn, - requestCallbacks, - options, - plugins, - details - ).then( - (result) => { - if (!result.ok) return handleError(result.error, result.pluginName); - try { - buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks); - } catch (e) { - handleError(e, ""); - } - }, - (e) => handleError(e, "") - ); - return; - } - try { - buildOrContextContinue(null, (result, done) => done([], []), () => { - }); - } catch (e) { - handleError(e, ""); - } - function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) { - const writeDefault = streamIn.hasFS; - const { - entries, - flags, - write, - stdinContents, - stdinResolveDir, - absWorkingDir, - nodePaths, - mangleCache - } = flagsForBuildOptions(callName, options, isTTY2, buildLogLevelDefault, writeDefault); - if (write && !streamIn.hasFS) throw new Error(`The "write" option is unavailable in this environment`); - const request = { - command: "build", - key: buildKey, - entries, - flags, - write, - stdinContents, - stdinResolveDir, - absWorkingDir: absWorkingDir || defaultWD2, - nodePaths, - context: isContext - }; - if (requestPlugins) request.plugins = requestPlugins; - if (mangleCache) request.mangleCache = mangleCache; - const buildResponseToResult = (response, callback2) => { - const result = { - errors: replaceDetailsInMessages(response.errors, details), - warnings: replaceDetailsInMessages(response.warnings, details), - outputFiles: void 0, - metafile: void 0, - mangleCache: void 0 - }; - const originalErrors = result.errors.slice(); - const originalWarnings = result.warnings.slice(); - if (response.outputFiles) result.outputFiles = response.outputFiles.map(convertOutputFiles); - if (response.metafile) result.metafile = JSON.parse(response.metafile); - if (response.mangleCache) result.mangleCache = response.mangleCache; - if (response.writeToStdout !== void 0) console.log(decodeUTF8(response.writeToStdout).replace(/\n$/, "")); - runOnEndCallbacks(result, (onEndErrors, onEndWarnings) => { - if (originalErrors.length > 0 || onEndErrors.length > 0) { - const error = failureErrorWithLog("Build failed", originalErrors.concat(onEndErrors), originalWarnings.concat(onEndWarnings)); - return callback2(error, null, onEndErrors, onEndWarnings); - } - callback2(null, result, onEndErrors, onEndWarnings); - }); - }; - let latestResultPromise; - let provideLatestResult; - if (isContext) - requestCallbacks["on-end"] = (id, request2) => new Promise((resolve) => { - buildResponseToResult(request2, (err, result, onEndErrors, onEndWarnings) => { - const response = { - errors: onEndErrors, - warnings: onEndWarnings - }; - if (provideLatestResult) provideLatestResult(err, result); - latestResultPromise = void 0; - provideLatestResult = void 0; - sendResponse(id, response); - resolve(); - }); - }); - sendRequest(refs, request, (error, response) => { - if (error) return callback(new Error(error), null); - if (!isContext) { - return buildResponseToResult(response, (err, res) => { - scheduleOnDisposeCallbacks(); - return callback(err, res); - }); - } - if (response.errors.length > 0) { - return callback(failureErrorWithLog("Context failed", response.errors, response.warnings), null); - } - let didDispose = false; - const result = { - rebuild: () => { - if (!latestResultPromise) latestResultPromise = new Promise((resolve, reject) => { - let settlePromise; - provideLatestResult = (err, result2) => { - if (!settlePromise) settlePromise = () => err ? reject(err) : resolve(result2); - }; - const triggerAnotherBuild = () => { - const request2 = { - command: "rebuild", - key: buildKey - }; - sendRequest(refs, request2, (error2, response2) => { - if (error2) { - reject(new Error(error2)); - } else if (settlePromise) { - settlePromise(); - } else { - triggerAnotherBuild(); - } - }); - }; - triggerAnotherBuild(); - }); - return latestResultPromise; - }, - watch: (options2 = {}) => new Promise((resolve, reject) => { - if (!streamIn.hasFS) throw new Error(`Cannot use the "watch" API in this environment`); - const keys = {}; - checkForInvalidFlags(options2, keys, `in watch() call`); - const request2 = { - command: "watch", - key: buildKey - }; - sendRequest(refs, request2, (error2) => { - if (error2) reject(new Error(error2)); - else resolve(void 0); - }); - }), - serve: (options2 = {}) => new Promise((resolve, reject) => { - if (!streamIn.hasFS) throw new Error(`Cannot use the "serve" API in this environment`); - const keys = {}; - const port = getFlag(options2, keys, "port", mustBeInteger); - const host = getFlag(options2, keys, "host", mustBeString); - const servedir = getFlag(options2, keys, "servedir", mustBeString); - const keyfile = getFlag(options2, keys, "keyfile", mustBeString); - const certfile = getFlag(options2, keys, "certfile", mustBeString); - const fallback = getFlag(options2, keys, "fallback", mustBeString); - const onRequest = getFlag(options2, keys, "onRequest", mustBeFunction); - checkForInvalidFlags(options2, keys, `in serve() call`); - const request2 = { - command: "serve", - key: buildKey, - onRequest: !!onRequest - }; - if (port !== void 0) request2.port = port; - if (host !== void 0) request2.host = host; - if (servedir !== void 0) request2.servedir = servedir; - if (keyfile !== void 0) request2.keyfile = keyfile; - if (certfile !== void 0) request2.certfile = certfile; - if (fallback !== void 0) request2.fallback = fallback; - sendRequest(refs, request2, (error2, response2) => { - if (error2) return reject(new Error(error2)); - if (onRequest) { - requestCallbacks["serve-request"] = (id, request3) => { - onRequest(request3.args); - sendResponse(id, {}); - }; - } - resolve(response2); - }); - }), - cancel: () => new Promise((resolve) => { - if (didDispose) return resolve(); - const request2 = { - command: "cancel", - key: buildKey - }; - sendRequest(refs, request2, () => { - resolve(); - }); - }), - dispose: () => new Promise((resolve) => { - if (didDispose) return resolve(); - didDispose = true; - const request2 = { - command: "dispose", - key: buildKey - }; - sendRequest(refs, request2, () => { - resolve(); - scheduleOnDisposeCallbacks(); - refs.unref(); - }); - }) - }; - refs.ref(); - callback(null, result); - }); - } -} -var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, initialOptions, plugins, details) => { - let onStartCallbacks = []; - let onEndCallbacks = []; - let onResolveCallbacks = {}; - let onLoadCallbacks = {}; - let onDisposeCallbacks = []; - let nextCallbackID = 0; - let i = 0; - let requestPlugins = []; - let isSetupDone = false; - plugins = [...plugins]; - for (let item of plugins) { - let keys = {}; - if (typeof item !== "object") throw new Error(`Plugin at index ${i} must be an object`); - const name = getFlag(item, keys, "name", mustBeString); - if (typeof name !== "string" || name === "") throw new Error(`Plugin at index ${i} is missing a name`); - try { - let setup = getFlag(item, keys, "setup", mustBeFunction); - if (typeof setup !== "function") throw new Error(`Plugin is missing a setup function`); - checkForInvalidFlags(item, keys, `on plugin ${quote(name)}`); - let plugin = { - name, - onStart: false, - onEnd: false, - onResolve: [], - onLoad: [] - }; - i++; - let resolve = (path3, options = {}) => { - if (!isSetupDone) throw new Error('Cannot call "resolve" before plugin setup has completed'); - if (typeof path3 !== "string") throw new Error(`The path to resolve must be a string`); - let keys2 = /* @__PURE__ */ Object.create(null); - let pluginName = getFlag(options, keys2, "pluginName", mustBeString); - let importer = getFlag(options, keys2, "importer", mustBeString); - let namespace = getFlag(options, keys2, "namespace", mustBeString); - let resolveDir = getFlag(options, keys2, "resolveDir", mustBeString); - let kind = getFlag(options, keys2, "kind", mustBeString); - let pluginData = getFlag(options, keys2, "pluginData", canBeAnything); - let importAttributes = getFlag(options, keys2, "with", mustBeObject); - checkForInvalidFlags(options, keys2, "in resolve() call"); - return new Promise((resolve2, reject) => { - const request = { - command: "resolve", - path: path3, - key: buildKey, - pluginName: name - }; - if (pluginName != null) request.pluginName = pluginName; - if (importer != null) request.importer = importer; - if (namespace != null) request.namespace = namespace; - if (resolveDir != null) request.resolveDir = resolveDir; - if (kind != null) request.kind = kind; - else throw new Error(`Must specify "kind" when calling "resolve"`); - if (pluginData != null) request.pluginData = details.store(pluginData); - if (importAttributes != null) request.with = sanitizeStringMap(importAttributes, "with"); - sendRequest(refs, request, (error, response) => { - if (error !== null) reject(new Error(error)); - else resolve2({ - errors: replaceDetailsInMessages(response.errors, details), - warnings: replaceDetailsInMessages(response.warnings, details), - path: response.path, - external: response.external, - sideEffects: response.sideEffects, - namespace: response.namespace, - suffix: response.suffix, - pluginData: details.load(response.pluginData) - }); - }); - }); - }; - let promise = setup({ - initialOptions, - resolve, - onStart(callback) { - let registeredText = `This error came from the "onStart" callback registered here:`; - let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onStart"); - onStartCallbacks.push({ name, callback, note: registeredNote }); - plugin.onStart = true; - }, - onEnd(callback) { - let registeredText = `This error came from the "onEnd" callback registered here:`; - let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onEnd"); - onEndCallbacks.push({ name, callback, note: registeredNote }); - plugin.onEnd = true; - }, - onResolve(options, callback) { - let registeredText = `This error came from the "onResolve" callback registered here:`; - let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onResolve"); - let keys2 = {}; - let filter = getFlag(options, keys2, "filter", mustBeRegExp); - let namespace = getFlag(options, keys2, "namespace", mustBeString); - checkForInvalidFlags(options, keys2, `in onResolve() call for plugin ${quote(name)}`); - if (filter == null) throw new Error(`onResolve() call is missing a filter`); - let id = nextCallbackID++; - onResolveCallbacks[id] = { name, callback, note: registeredNote }; - plugin.onResolve.push({ id, filter: filter.source, namespace: namespace || "" }); - }, - onLoad(options, callback) { - let registeredText = `This error came from the "onLoad" callback registered here:`; - let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onLoad"); - let keys2 = {}; - let filter = getFlag(options, keys2, "filter", mustBeRegExp); - let namespace = getFlag(options, keys2, "namespace", mustBeString); - checkForInvalidFlags(options, keys2, `in onLoad() call for plugin ${quote(name)}`); - if (filter == null) throw new Error(`onLoad() call is missing a filter`); - let id = nextCallbackID++; - onLoadCallbacks[id] = { name, callback, note: registeredNote }; - plugin.onLoad.push({ id, filter: filter.source, namespace: namespace || "" }); - }, - onDispose(callback) { - onDisposeCallbacks.push(callback); - }, - esbuild: streamIn.esbuild - }); - if (promise) await promise; - requestPlugins.push(plugin); - } catch (e) { - return { ok: false, error: e, pluginName: name }; - } - } - requestCallbacks["on-start"] = async (id, request) => { - details.clear(); - let response = { errors: [], warnings: [] }; - await Promise.all(onStartCallbacks.map(async ({ name, callback, note }) => { - try { - let result = await callback(); - if (result != null) { - if (typeof result !== "object") throw new Error(`Expected onStart() callback in plugin ${quote(name)} to return an object`); - let keys = {}; - let errors = getFlag(result, keys, "errors", mustBeArray); - let warnings = getFlag(result, keys, "warnings", mustBeArray); - checkForInvalidFlags(result, keys, `from onStart() callback in plugin ${quote(name)}`); - if (errors != null) response.errors.push(...sanitizeMessages(errors, "errors", details, name, void 0)); - if (warnings != null) response.warnings.push(...sanitizeMessages(warnings, "warnings", details, name, void 0)); - } - } catch (e) { - response.errors.push(extractErrorMessageV8(e, streamIn, details, note && note(), name)); - } - })); - sendResponse(id, response); - }; - requestCallbacks["on-resolve"] = async (id, request) => { - let response = {}, name = "", callback, note; - for (let id2 of request.ids) { - try { - ({ name, callback, note } = onResolveCallbacks[id2]); - let result = await callback({ - path: request.path, - importer: request.importer, - namespace: request.namespace, - resolveDir: request.resolveDir, - kind: request.kind, - pluginData: details.load(request.pluginData), - with: request.with - }); - if (result != null) { - if (typeof result !== "object") throw new Error(`Expected onResolve() callback in plugin ${quote(name)} to return an object`); - let keys = {}; - let pluginName = getFlag(result, keys, "pluginName", mustBeString); - let path3 = getFlag(result, keys, "path", mustBeString); - let namespace = getFlag(result, keys, "namespace", mustBeString); - let suffix = getFlag(result, keys, "suffix", mustBeString); - let external = getFlag(result, keys, "external", mustBeBoolean); - let sideEffects = getFlag(result, keys, "sideEffects", mustBeBoolean); - let pluginData = getFlag(result, keys, "pluginData", canBeAnything); - let errors = getFlag(result, keys, "errors", mustBeArray); - let warnings = getFlag(result, keys, "warnings", mustBeArray); - let watchFiles = getFlag(result, keys, "watchFiles", mustBeArray); - let watchDirs = getFlag(result, keys, "watchDirs", mustBeArray); - checkForInvalidFlags(result, keys, `from onResolve() callback in plugin ${quote(name)}`); - response.id = id2; - if (pluginName != null) response.pluginName = pluginName; - if (path3 != null) response.path = path3; - if (namespace != null) response.namespace = namespace; - if (suffix != null) response.suffix = suffix; - if (external != null) response.external = external; - if (sideEffects != null) response.sideEffects = sideEffects; - if (pluginData != null) response.pluginData = details.store(pluginData); - if (errors != null) response.errors = sanitizeMessages(errors, "errors", details, name, void 0); - if (warnings != null) response.warnings = sanitizeMessages(warnings, "warnings", details, name, void 0); - if (watchFiles != null) response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles"); - if (watchDirs != null) response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs"); - break; - } - } catch (e) { - response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] }; - break; - } - } - sendResponse(id, response); - }; - requestCallbacks["on-load"] = async (id, request) => { - let response = {}, name = "", callback, note; - for (let id2 of request.ids) { - try { - ({ name, callback, note } = onLoadCallbacks[id2]); - let result = await callback({ - path: request.path, - namespace: request.namespace, - suffix: request.suffix, - pluginData: details.load(request.pluginData), - with: request.with - }); - if (result != null) { - if (typeof result !== "object") throw new Error(`Expected onLoad() callback in plugin ${quote(name)} to return an object`); - let keys = {}; - let pluginName = getFlag(result, keys, "pluginName", mustBeString); - let contents = getFlag(result, keys, "contents", mustBeStringOrUint8Array); - let resolveDir = getFlag(result, keys, "resolveDir", mustBeString); - let pluginData = getFlag(result, keys, "pluginData", canBeAnything); - let loader = getFlag(result, keys, "loader", mustBeString); - let errors = getFlag(result, keys, "errors", mustBeArray); - let warnings = getFlag(result, keys, "warnings", mustBeArray); - let watchFiles = getFlag(result, keys, "watchFiles", mustBeArray); - let watchDirs = getFlag(result, keys, "watchDirs", mustBeArray); - checkForInvalidFlags(result, keys, `from onLoad() callback in plugin ${quote(name)}`); - response.id = id2; - if (pluginName != null) response.pluginName = pluginName; - if (contents instanceof Uint8Array) response.contents = contents; - else if (contents != null) response.contents = encodeUTF8(contents); - if (resolveDir != null) response.resolveDir = resolveDir; - if (pluginData != null) response.pluginData = details.store(pluginData); - if (loader != null) response.loader = loader; - if (errors != null) response.errors = sanitizeMessages(errors, "errors", details, name, void 0); - if (warnings != null) response.warnings = sanitizeMessages(warnings, "warnings", details, name, void 0); - if (watchFiles != null) response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles"); - if (watchDirs != null) response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs"); - break; - } - } catch (e) { - response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] }; - break; - } - } - sendResponse(id, response); - }; - let runOnEndCallbacks = (result, done) => done([], []); - if (onEndCallbacks.length > 0) { - runOnEndCallbacks = (result, done) => { - (async () => { - const onEndErrors = []; - const onEndWarnings = []; - for (const { name, callback, note } of onEndCallbacks) { - let newErrors; - let newWarnings; - try { - const value = await callback(result); - if (value != null) { - if (typeof value !== "object") throw new Error(`Expected onEnd() callback in plugin ${quote(name)} to return an object`); - let keys = {}; - let errors = getFlag(value, keys, "errors", mustBeArray); - let warnings = getFlag(value, keys, "warnings", mustBeArray); - checkForInvalidFlags(value, keys, `from onEnd() callback in plugin ${quote(name)}`); - if (errors != null) newErrors = sanitizeMessages(errors, "errors", details, name, void 0); - if (warnings != null) newWarnings = sanitizeMessages(warnings, "warnings", details, name, void 0); - } - } catch (e) { - newErrors = [extractErrorMessageV8(e, streamIn, details, note && note(), name)]; - } - if (newErrors) { - onEndErrors.push(...newErrors); - try { - result.errors.push(...newErrors); - } catch { - } - } - if (newWarnings) { - onEndWarnings.push(...newWarnings); - try { - result.warnings.push(...newWarnings); - } catch { - } - } - } - done(onEndErrors, onEndWarnings); - })(); - }; - } - let scheduleOnDisposeCallbacks = () => { - for (const cb of onDisposeCallbacks) { - setTimeout(() => cb(), 0); - } - }; - isSetupDone = true; - return { - ok: true, - requestPlugins, - runOnEndCallbacks, - scheduleOnDisposeCallbacks - }; -}; -function createObjectStash() { - const map = /* @__PURE__ */ new Map(); - let nextID = 0; - return { - clear() { - map.clear(); - }, - load(id) { - return map.get(id); - }, - store(value) { - if (value === void 0) return -1; - const id = nextID++; - map.set(id, value); - return id; - } - }; -} -function extractCallerV8(e, streamIn, ident) { - let note; - let tried = false; - return () => { - if (tried) return note; - tried = true; - try { - let lines = (e.stack + "").split("\n"); - lines.splice(1, 1); - let location = parseStackLinesV8(streamIn, lines, ident); - if (location) { - note = { text: e.message, location }; - return note; - } - } catch { - } - }; -} -function extractErrorMessageV8(e, streamIn, stash, note, pluginName) { - let text = "Internal error"; - let location = null; - try { - text = (e && e.message || e) + ""; - } catch { - } - try { - location = parseStackLinesV8(streamIn, (e.stack + "").split("\n"), ""); - } catch { - } - return { id: "", pluginName, text, location, notes: note ? [note] : [], detail: stash ? stash.store(e) : -1 }; -} -function parseStackLinesV8(streamIn, lines, ident) { - let at = " at "; - if (streamIn.readFileSync && !lines[0].startsWith(at) && lines[1].startsWith(at)) { - for (let i = 1; i < lines.length; i++) { - let line = lines[i]; - if (!line.startsWith(at)) continue; - line = line.slice(at.length); - while (true) { - let match = /^(?:new |async )?\S+ \((.*)\)$/.exec(line); - if (match) { - line = match[1]; - continue; - } - match = /^eval at \S+ \((.*)\)(?:, \S+:\d+:\d+)?$/.exec(line); - if (match) { - line = match[1]; - continue; - } - match = /^(\S+):(\d+):(\d+)$/.exec(line); - if (match) { - let contents; - try { - contents = streamIn.readFileSync(match[1], "utf8"); - } catch { - break; - } - let lineText = contents.split(/\r\n|\r|\n|\u2028|\u2029/)[+match[2] - 1] || ""; - let column = +match[3] - 1; - let length = lineText.slice(column, column + ident.length) === ident ? ident.length : 0; - return { - file: match[1], - namespace: "file", - line: +match[2], - column: encodeUTF8(lineText.slice(0, column)).length, - length: encodeUTF8(lineText.slice(column, column + length)).length, - lineText: lineText + "\n" + lines.slice(1).join("\n"), - suggestion: "" - }; - } - break; - } - } - } - return null; -} -function failureErrorWithLog(text, errors, warnings) { - let limit = 5; - text += errors.length < 1 ? "" : ` with ${errors.length} error${errors.length < 2 ? "" : "s"}:` + errors.slice(0, limit + 1).map((e, i) => { - if (i === limit) return "\n..."; - if (!e.location) return ` -error: ${e.text}`; - let { file, line, column } = e.location; - let pluginText = e.pluginName ? `[plugin: ${e.pluginName}] ` : ""; - return ` -${file}:${line}:${column}: ERROR: ${pluginText}${e.text}`; - }).join(""); - let error = new Error(text); - for (const [key, value] of [["errors", errors], ["warnings", warnings]]) { - Object.defineProperty(error, key, { - configurable: true, - enumerable: true, - get: () => value, - set: (value2) => Object.defineProperty(error, key, { - configurable: true, - enumerable: true, - value: value2 - }) - }); - } - return error; -} -function replaceDetailsInMessages(messages, stash) { - for (const message of messages) { - message.detail = stash.load(message.detail); - } - return messages; -} -function sanitizeLocation(location, where, terminalWidth) { - if (location == null) return null; - let keys = {}; - let file = getFlag(location, keys, "file", mustBeString); - let namespace = getFlag(location, keys, "namespace", mustBeString); - let line = getFlag(location, keys, "line", mustBeInteger); - let column = getFlag(location, keys, "column", mustBeInteger); - let length = getFlag(location, keys, "length", mustBeInteger); - let lineText = getFlag(location, keys, "lineText", mustBeString); - let suggestion = getFlag(location, keys, "suggestion", mustBeString); - checkForInvalidFlags(location, keys, where); - if (lineText) { - const relevantASCII = lineText.slice( - 0, - (column && column > 0 ? column : 0) + (length && length > 0 ? length : 0) + (terminalWidth && terminalWidth > 0 ? terminalWidth : 80) - ); - if (!/[\x7F-\uFFFF]/.test(relevantASCII) && !/\n/.test(lineText)) { - lineText = relevantASCII; - } - } - return { - file: file || "", - namespace: namespace || "", - line: line || 0, - column: column || 0, - length: length || 0, - lineText: lineText || "", - suggestion: suggestion || "" - }; -} -function sanitizeMessages(messages, property, stash, fallbackPluginName, terminalWidth) { - let messagesClone = []; - let index = 0; - for (const message of messages) { - let keys = {}; - let id = getFlag(message, keys, "id", mustBeString); - let pluginName = getFlag(message, keys, "pluginName", mustBeString); - let text = getFlag(message, keys, "text", mustBeString); - let location = getFlag(message, keys, "location", mustBeObjectOrNull); - let notes = getFlag(message, keys, "notes", mustBeArray); - let detail = getFlag(message, keys, "detail", canBeAnything); - let where = `in element ${index} of "${property}"`; - checkForInvalidFlags(message, keys, where); - let notesClone = []; - if (notes) { - for (const note of notes) { - let noteKeys = {}; - let noteText = getFlag(note, noteKeys, "text", mustBeString); - let noteLocation = getFlag(note, noteKeys, "location", mustBeObjectOrNull); - checkForInvalidFlags(note, noteKeys, where); - notesClone.push({ - text: noteText || "", - location: sanitizeLocation(noteLocation, where, terminalWidth) - }); - } - } - messagesClone.push({ - id: id || "", - pluginName: pluginName || fallbackPluginName, - text: text || "", - location: sanitizeLocation(location, where, terminalWidth), - notes: notesClone, - detail: stash ? stash.store(detail) : -1 - }); - index++; - } - return messagesClone; -} -function sanitizeStringArray(values, property) { - const result = []; - for (const value of values) { - if (typeof value !== "string") throw new Error(`${quote(property)} must be an array of strings`); - result.push(value); - } - return result; -} -function sanitizeStringMap(map, property) { - const result = /* @__PURE__ */ Object.create(null); - for (const key in map) { - const value = map[key]; - if (typeof value !== "string") throw new Error(`key ${quote(key)} in object ${quote(property)} must be a string`); - result[key] = value; - } - return result; -} -function convertOutputFiles({ path: path3, contents, hash }) { - let text = null; - return { - path: path3, - contents, - hash, - get text() { - const binary = this.contents; - if (text === null || binary !== contents) { - contents = binary; - text = decodeUTF8(binary); - } - return text; - } - }; -} - -// lib/npm/node-platform.ts -var fs = require("fs"); -var os = require("os"); -var path = require("path"); -var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH; -var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild"; -var packageDarwin_arm64 = "@esbuild/darwin-arm64"; -var packageDarwin_x64 = "@esbuild/darwin-x64"; -var knownWindowsPackages = { - "win32 arm64 LE": "@esbuild/win32-arm64", - "win32 ia32 LE": "@esbuild/win32-ia32", - "win32 x64 LE": "@esbuild/win32-x64" -}; -var knownUnixlikePackages = { - "aix ppc64 BE": "@esbuild/aix-ppc64", - "android arm64 LE": "@esbuild/android-arm64", - "darwin arm64 LE": "@esbuild/darwin-arm64", - "darwin x64 LE": "@esbuild/darwin-x64", - "freebsd arm64 LE": "@esbuild/freebsd-arm64", - "freebsd x64 LE": "@esbuild/freebsd-x64", - "linux arm LE": "@esbuild/linux-arm", - "linux arm64 LE": "@esbuild/linux-arm64", - "linux ia32 LE": "@esbuild/linux-ia32", - "linux mips64el LE": "@esbuild/linux-mips64el", - "linux ppc64 LE": "@esbuild/linux-ppc64", - "linux riscv64 LE": "@esbuild/linux-riscv64", - "linux s390x BE": "@esbuild/linux-s390x", - "linux x64 LE": "@esbuild/linux-x64", - "linux loong64 LE": "@esbuild/linux-loong64", - "netbsd arm64 LE": "@esbuild/netbsd-arm64", - "netbsd x64 LE": "@esbuild/netbsd-x64", - "openbsd arm64 LE": "@esbuild/openbsd-arm64", - "openbsd x64 LE": "@esbuild/openbsd-x64", - "sunos x64 LE": "@esbuild/sunos-x64" -}; -var knownWebAssemblyFallbackPackages = { - "android arm LE": "@esbuild/android-arm", - "android x64 LE": "@esbuild/android-x64" -}; -function pkgAndSubpathForCurrentPlatform() { - let pkg; - let subpath; - let isWASM = false; - let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`; - if (platformKey in knownWindowsPackages) { - pkg = knownWindowsPackages[platformKey]; - subpath = "esbuild.exe"; - } else if (platformKey in knownUnixlikePackages) { - pkg = knownUnixlikePackages[platformKey]; - subpath = "bin/esbuild"; - } else if (platformKey in knownWebAssemblyFallbackPackages) { - pkg = knownWebAssemblyFallbackPackages[platformKey]; - subpath = "bin/esbuild"; - isWASM = true; - } else { - throw new Error(`Unsupported platform: ${platformKey}`); - } - return { pkg, subpath, isWASM }; -} -function pkgForSomeOtherPlatform() { - const libMainJS = require.resolve("esbuild"); - const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS))); - if (path.basename(nodeModulesDirectory) === "node_modules") { - for (const unixKey in knownUnixlikePackages) { - try { - const pkg = knownUnixlikePackages[unixKey]; - if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; - } catch { - } - } - for (const windowsKey in knownWindowsPackages) { - try { - const pkg = knownWindowsPackages[windowsKey]; - if (fs.existsSync(path.join(nodeModulesDirectory, pkg))) return pkg; - } catch { - } - } - } - return null; -} -function downloadedBinPath(pkg, subpath) { - const esbuildLibDir = path.dirname(require.resolve("esbuild")); - return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`); -} -function generateBinPath() { - if (isValidBinaryPath(ESBUILD_BINARY_PATH)) { - if (!fs.existsSync(ESBUILD_BINARY_PATH)) { - console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`); - } else { - return { binPath: ESBUILD_BINARY_PATH, isWASM: false }; - } - } - const { pkg, subpath, isWASM } = pkgAndSubpathForCurrentPlatform(); - let binPath; - try { - binPath = require.resolve(`${pkg}/${subpath}`); - } catch (e) { - binPath = downloadedBinPath(pkg, subpath); - if (!fs.existsSync(binPath)) { - try { - require.resolve(pkg); - } catch { - const otherPkg = pkgForSomeOtherPlatform(); - if (otherPkg) { - let suggestions = ` -Specifically the "${otherPkg}" package is present but this platform -needs the "${pkg}" package instead. People often get into this -situation by installing esbuild on Windows or macOS and copying "node_modules" -into a Docker image that runs Linux, or by copying "node_modules" between -Windows and WSL environments. - -If you are installing with npm, you can try not copying the "node_modules" -directory when you copy the files over, and running "npm ci" or "npm install" -on the destination platform after the copy. Or you could consider using yarn -instead of npm which has built-in support for installing a package on multiple -platforms simultaneously. - -If you are installing with yarn, you can try listing both this platform and the -other platform in your ".yarnrc.yml" file using the "supportedArchitectures" -feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures -Keep in mind that this means multiple copies of esbuild will be present. -`; - if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) { - suggestions = ` -Specifically the "${otherPkg}" package is present but this platform -needs the "${pkg}" package instead. People often get into this -situation by installing esbuild with npm running inside of Rosetta 2 and then -trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta -2 is Apple's on-the-fly x86_64-to-arm64 translation service). - -If you are installing with npm, you can try ensuring that both npm and node are -not running under Rosetta 2 and then reinstalling esbuild. This likely involves -changing how you installed npm and/or node. For example, installing node with -the universal installer here should work: https://nodejs.org/en/download/. Or -you could consider using yarn instead of npm which has built-in support for -installing a package on multiple platforms simultaneously. - -If you are installing with yarn, you can try listing both "arm64" and "x64" -in your ".yarnrc.yml" file using the "supportedArchitectures" feature: -https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures -Keep in mind that this means multiple copies of esbuild will be present. -`; - } - throw new Error(` -You installed esbuild for another platform than the one you're currently using. -This won't work because esbuild is written with native code and needs to -install a platform-specific binary executable. -${suggestions} -Another alternative is to use the "esbuild-wasm" package instead, which works -the same way on all platforms. But it comes with a heavy performance cost and -can sometimes be 10x slower than the "esbuild" package, so you may also not -want to do that. -`); - } - throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild. - -If you are installing esbuild with npm, make sure that you don't specify the -"--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature -of "package.json" is used by esbuild to install the correct binary executable -for your current platform.`); - } - throw e; - } - } - if (/\.zip\//.test(binPath)) { - let pnpapi; - try { - pnpapi = require("pnpapi"); - } catch (e) { - } - if (pnpapi) { - const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation; - const binTargetPath = path.join( - root, - "node_modules", - ".cache", - "esbuild", - `pnpapi-${pkg.replace("/", "-")}-${"0.24.2"}-${path.basename(subpath)}` - ); - if (!fs.existsSync(binTargetPath)) { - fs.mkdirSync(path.dirname(binTargetPath), { recursive: true }); - fs.copyFileSync(binPath, binTargetPath); - fs.chmodSync(binTargetPath, 493); - } - return { binPath: binTargetPath, isWASM }; - } - } - return { binPath, isWASM }; -} - -// lib/npm/node.ts -var child_process = require("child_process"); -var crypto = require("crypto"); -var path2 = require("path"); -var fs2 = require("fs"); -var os2 = require("os"); -var tty = require("tty"); -var worker_threads; -if (process.env.ESBUILD_WORKER_THREADS !== "0") { - try { - worker_threads = require("worker_threads"); - } catch { - } - let [major, minor] = process.versions.node.split("."); - if ( - // { - if ((!ESBUILD_BINARY_PATH || false) && (path2.basename(__filename) !== "main.js" || path2.basename(__dirname) !== "lib")) { - throw new Error( - `The esbuild JavaScript API cannot be bundled. Please mark the "esbuild" package as external so it's not included in the bundle. - -More information: The file containing the code for esbuild's JavaScript API (${__filename}) does not appear to be inside the esbuild package on the file system, which usually means that the esbuild package was bundled into another file. This is problematic because the API needs to run a binary executable inside the esbuild package which is located using a relative path from the API code to the executable. If the esbuild package is bundled, the relative path will be incorrect and the executable won't be found.` - ); - } - if (false) { - return ["node", [path2.join(__dirname, "..", "bin", "esbuild")]]; - } else { - const { binPath, isWASM } = generateBinPath(); - if (isWASM) { - return ["node", [binPath]]; - } else { - return [binPath, []]; - } - } -}; -var isTTY = () => tty.isatty(2); -var fsSync = { - readFile(tempFile, callback) { - try { - let contents = fs2.readFileSync(tempFile, "utf8"); - try { - fs2.unlinkSync(tempFile); - } catch { - } - callback(null, contents); - } catch (err) { - callback(err, null); - } - }, - writeFile(contents, callback) { - try { - let tempFile = randomFileName(); - fs2.writeFileSync(tempFile, contents); - callback(tempFile); - } catch { - callback(null); - } - } -}; -var fsAsync = { - readFile(tempFile, callback) { - try { - fs2.readFile(tempFile, "utf8", (err, contents) => { - try { - fs2.unlink(tempFile, () => callback(err, contents)); - } catch { - callback(err, contents); - } - }); - } catch (err) { - callback(err, null); - } - }, - writeFile(contents, callback) { - try { - let tempFile = randomFileName(); - fs2.writeFile(tempFile, contents, (err) => err !== null ? callback(null) : callback(tempFile)); - } catch { - callback(null); - } - } -}; -var version = "0.24.2"; -var build = (options) => ensureServiceIsRunning().build(options); -var context = (buildOptions) => ensureServiceIsRunning().context(buildOptions); -var transform = (input, options) => ensureServiceIsRunning().transform(input, options); -var formatMessages = (messages, options) => ensureServiceIsRunning().formatMessages(messages, options); -var analyzeMetafile = (messages, options) => ensureServiceIsRunning().analyzeMetafile(messages, options); -var buildSync = (options) => { - if (worker_threads && !isInternalWorkerThread) { - if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); - return workerThreadService.buildSync(options); - } - let result; - runServiceSync((service) => service.buildOrContext({ - callName: "buildSync", - refs: null, - options, - isTTY: isTTY(), - defaultWD, - callback: (err, res) => { - if (err) throw err; - result = res; - } - })); - return result; -}; -var transformSync = (input, options) => { - if (worker_threads && !isInternalWorkerThread) { - if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); - return workerThreadService.transformSync(input, options); - } - let result; - runServiceSync((service) => service.transform({ - callName: "transformSync", - refs: null, - input, - options: options || {}, - isTTY: isTTY(), - fs: fsSync, - callback: (err, res) => { - if (err) throw err; - result = res; - } - })); - return result; -}; -var formatMessagesSync = (messages, options) => { - if (worker_threads && !isInternalWorkerThread) { - if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); - return workerThreadService.formatMessagesSync(messages, options); - } - let result; - runServiceSync((service) => service.formatMessages({ - callName: "formatMessagesSync", - refs: null, - messages, - options, - callback: (err, res) => { - if (err) throw err; - result = res; - } - })); - return result; -}; -var analyzeMetafileSync = (metafile, options) => { - if (worker_threads && !isInternalWorkerThread) { - if (!workerThreadService) workerThreadService = startWorkerThreadService(worker_threads); - return workerThreadService.analyzeMetafileSync(metafile, options); - } - let result; - runServiceSync((service) => service.analyzeMetafile({ - callName: "analyzeMetafileSync", - refs: null, - metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile), - options, - callback: (err, res) => { - if (err) throw err; - result = res; - } - })); - return result; -}; -var stop = () => { - if (stopService) stopService(); - if (workerThreadService) workerThreadService.stop(); - return Promise.resolve(); -}; -var initializeWasCalled = false; -var initialize = (options) => { - options = validateInitializeOptions(options || {}); - if (options.wasmURL) throw new Error(`The "wasmURL" option only works in the browser`); - if (options.wasmModule) throw new Error(`The "wasmModule" option only works in the browser`); - if (options.worker) throw new Error(`The "worker" option only works in the browser`); - if (initializeWasCalled) throw new Error('Cannot call "initialize" more than once'); - ensureServiceIsRunning(); - initializeWasCalled = true; - return Promise.resolve(); -}; -var defaultWD = process.cwd(); -var longLivedService; -var stopService; -var ensureServiceIsRunning = () => { - if (longLivedService) return longLivedService; - let [command, args] = esbuildCommandAndArgs(); - let child = child_process.spawn(command, args.concat(`--service=${"0.24.2"}`, "--ping"), { - windowsHide: true, - stdio: ["pipe", "pipe", "inherit"], - cwd: defaultWD - }); - let { readFromStdout, afterClose, service } = createChannel({ - writeToStdin(bytes) { - child.stdin.write(bytes, (err) => { - if (err) afterClose(err); - }); - }, - readFileSync: fs2.readFileSync, - isSync: false, - hasFS: true, - esbuild: node_exports - }); - child.stdin.on("error", afterClose); - child.on("error", afterClose); - const stdin = child.stdin; - const stdout = child.stdout; - stdout.on("data", readFromStdout); - stdout.on("end", afterClose); - stopService = () => { - stdin.destroy(); - stdout.destroy(); - child.kill(); - initializeWasCalled = false; - longLivedService = void 0; - stopService = void 0; - }; - let refCount = 0; - child.unref(); - if (stdin.unref) { - stdin.unref(); - } - if (stdout.unref) { - stdout.unref(); - } - const refs = { - ref() { - if (++refCount === 1) child.ref(); - }, - unref() { - if (--refCount === 0) child.unref(); - } - }; - longLivedService = { - build: (options) => new Promise((resolve, reject) => { - service.buildOrContext({ - callName: "build", - refs, - options, - isTTY: isTTY(), - defaultWD, - callback: (err, res) => err ? reject(err) : resolve(res) - }); - }), - context: (options) => new Promise((resolve, reject) => service.buildOrContext({ - callName: "context", - refs, - options, - isTTY: isTTY(), - defaultWD, - callback: (err, res) => err ? reject(err) : resolve(res) - })), - transform: (input, options) => new Promise((resolve, reject) => service.transform({ - callName: "transform", - refs, - input, - options: options || {}, - isTTY: isTTY(), - fs: fsAsync, - callback: (err, res) => err ? reject(err) : resolve(res) - })), - formatMessages: (messages, options) => new Promise((resolve, reject) => service.formatMessages({ - callName: "formatMessages", - refs, - messages, - options, - callback: (err, res) => err ? reject(err) : resolve(res) - })), - analyzeMetafile: (metafile, options) => new Promise((resolve, reject) => service.analyzeMetafile({ - callName: "analyzeMetafile", - refs, - metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile), - options, - callback: (err, res) => err ? reject(err) : resolve(res) - })) - }; - return longLivedService; -}; -var runServiceSync = (callback) => { - let [command, args] = esbuildCommandAndArgs(); - let stdin = new Uint8Array(); - let { readFromStdout, afterClose, service } = createChannel({ - writeToStdin(bytes) { - if (stdin.length !== 0) throw new Error("Must run at most one command"); - stdin = bytes; - }, - isSync: true, - hasFS: true, - esbuild: node_exports - }); - callback(service); - let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.24.2"}`), { - cwd: defaultWD, - windowsHide: true, - input: stdin, - // We don't know how large the output could be. If it's too large, the - // command will fail with ENOBUFS. Reserve 16mb for now since that feels - // like it should be enough. Also allow overriding this with an environment - // variable. - maxBuffer: +process.env.ESBUILD_MAX_BUFFER || 16 * 1024 * 1024 - }); - readFromStdout(stdout); - afterClose(null); -}; -var randomFileName = () => { - return path2.join(os2.tmpdir(), `esbuild-${crypto.randomBytes(32).toString("hex")}`); -}; -var workerThreadService = null; -var startWorkerThreadService = (worker_threads2) => { - let { port1: mainPort, port2: workerPort } = new worker_threads2.MessageChannel(); - let worker = new worker_threads2.Worker(__filename, { - workerData: { workerPort, defaultWD, esbuildVersion: "0.24.2" }, - transferList: [workerPort], - // From node's documentation: https://nodejs.org/api/worker_threads.html - // - // Take care when launching worker threads from preload scripts (scripts loaded - // and run using the `-r` command line flag). Unless the `execArgv` option is - // explicitly set, new Worker threads automatically inherit the command line flags - // from the running process and will preload the same preload scripts as the main - // thread. If the preload script unconditionally launches a worker thread, every - // thread spawned will spawn another until the application crashes. - // - execArgv: [] - }); - let nextID = 0; - let fakeBuildError = (text) => { - let error = new Error(`Build failed with 1 error: -error: ${text}`); - let errors = [{ id: "", pluginName: "", text, location: null, notes: [], detail: void 0 }]; - error.errors = errors; - error.warnings = []; - return error; - }; - let validateBuildSyncOptions = (options) => { - if (!options) return; - let plugins = options.plugins; - if (plugins && plugins.length > 0) throw fakeBuildError(`Cannot use plugins in synchronous API calls`); - }; - let applyProperties = (object, properties) => { - for (let key in properties) { - object[key] = properties[key]; - } - }; - let runCallSync = (command, args) => { - let id = nextID++; - let sharedBuffer = new SharedArrayBuffer(8); - let sharedBufferView = new Int32Array(sharedBuffer); - let msg = { sharedBuffer, id, command, args }; - worker.postMessage(msg); - let status = Atomics.wait(sharedBufferView, 0, 0); - if (status !== "ok" && status !== "not-equal") throw new Error("Internal error: Atomics.wait() failed: " + status); - let { message: { id: id2, resolve, reject, properties } } = worker_threads2.receiveMessageOnPort(mainPort); - if (id !== id2) throw new Error(`Internal error: Expected id ${id} but got id ${id2}`); - if (reject) { - applyProperties(reject, properties); - throw reject; - } - return resolve; - }; - worker.unref(); - return { - buildSync(options) { - validateBuildSyncOptions(options); - return runCallSync("build", [options]); - }, - transformSync(input, options) { - return runCallSync("transform", [input, options]); - }, - formatMessagesSync(messages, options) { - return runCallSync("formatMessages", [messages, options]); - }, - analyzeMetafileSync(metafile, options) { - return runCallSync("analyzeMetafile", [metafile, options]); - }, - stop() { - worker.terminate(); - workerThreadService = null; - } - }; -}; -var startSyncServiceWorker = () => { - let workerPort = worker_threads.workerData.workerPort; - let parentPort = worker_threads.parentPort; - let extractProperties = (object) => { - let properties = {}; - if (object && typeof object === "object") { - for (let key in object) { - properties[key] = object[key]; - } - } - return properties; - }; - try { - let service = ensureServiceIsRunning(); - defaultWD = worker_threads.workerData.defaultWD; - parentPort.on("message", (msg) => { - (async () => { - let { sharedBuffer, id, command, args } = msg; - let sharedBufferView = new Int32Array(sharedBuffer); - try { - switch (command) { - case "build": - workerPort.postMessage({ id, resolve: await service.build(args[0]) }); - break; - case "transform": - workerPort.postMessage({ id, resolve: await service.transform(args[0], args[1]) }); - break; - case "formatMessages": - workerPort.postMessage({ id, resolve: await service.formatMessages(args[0], args[1]) }); - break; - case "analyzeMetafile": - workerPort.postMessage({ id, resolve: await service.analyzeMetafile(args[0], args[1]) }); - break; - default: - throw new Error(`Invalid command: ${command}`); - } - } catch (reject) { - workerPort.postMessage({ id, reject, properties: extractProperties(reject) }); - } - Atomics.add(sharedBufferView, 0, 1); - Atomics.notify(sharedBufferView, 0, Infinity); - })(); - }); - } catch (reject) { - parentPort.on("message", (msg) => { - let { sharedBuffer, id } = msg; - let sharedBufferView = new Int32Array(sharedBuffer); - workerPort.postMessage({ id, reject, properties: extractProperties(reject) }); - Atomics.add(sharedBufferView, 0, 1); - Atomics.notify(sharedBufferView, 0, Infinity); - }); - } -}; -if (isInternalWorkerThread) { - startSyncServiceWorker(); -} -var node_default = node_exports; -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - analyzeMetafile, - analyzeMetafileSync, - build, - buildSync, - context, - formatMessages, - formatMessagesSync, - initialize, - stop, - transform, - transformSync, - version -}); diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/package.json b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/package.json deleted file mode 100644 index 163880f3..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/esbuild/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "esbuild", - "version": "0.24.2", - "description": "An extremely fast JavaScript and CSS bundler and minifier.", - "repository": { - "type": "git", - "url": "git+https://github.com/evanw/esbuild.git" - }, - "scripts": { - "postinstall": "node install.js" - }, - "main": "lib/main.js", - "types": "lib/main.d.ts", - "engines": { - "node": ">=18" - }, - "bin": { - "esbuild": "bin/esbuild" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - }, - "license": "MIT" -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/History.md b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/History.md deleted file mode 100644 index 23dd430e..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/History.md +++ /dev/null @@ -1,3683 +0,0 @@ -4.22.3 -====== - - * Allow conditional revalidation for QUERY requests - - `req.fresh` now includes QUERY in the freshness check, so QUERY responses can return 304 when a validator matches - * deps: qs@~6.16.0 - -4.22.2 -====== - -* fix: restore >20 array parsing for `req.query` repeated keys ([`8d09bfe6`](https://github.com/expressjs/express/commit/8d09bfe6d88983da5c3e12cfdd54782c4dc675db)) - * This also unifies array-cap behavior across notations. Indexed notation (`a[0]=...`) was historically capped at qs's default `arrayLimit` of 20 even in older qs versions; after this change it also allows up to 1000 items. -* deps: qs@~6.15.1 -* deps: body-parser@~1.20.5 - -4.22.1 -====== - - * Revert security fix for [CVE-2024-51999](https://www.cve.org/CVERecord?id=CVE-2024-51999) ([GHSA-pj86-cfqh-vqx6](https://github.com/expressjs/express/security/advisories/GHSA-pj86-cfqh-vqx6)) - * The prior release (4.22.0) included an erroneous breaking change related to the extended query parser. There is no actual security vulnerability associated with this behavior (CVE-2024-51999 has been rejected). The change has been fully reverted in this release. - -4.22.0 -====== - * Security fix for [CVE-2024-51999](https://www.cve.org/CVERecord?id=CVE-2024-51999) ([GHSA-pj86-cfqh-vqx6](https://github.com/expressjs/express/security/advisories/GHSA-pj86-cfqh-vqx6)) - * deps: use tilde notation for dependencies - * deps: qs@6.14.0 - -4.21.2 -====== - - * deps: path-to-regexp@0.1.12 - - Fix backtracking protection - * deps: path-to-regexp@0.1.11 - - Throws an error on invalid path values - -4.21.1 -====== - - * Backported a fix for [CVE-2024-47764](https://nvd.nist.gov/vuln/detail/CVE-2024-47764) - - -4.21.0 -====== - - * Deprecate `res.location("back")` and `res.redirect("back")` magic string - * deps: serve-static@1.16.2 - * includes send@0.19.0 - * deps: finalhandler@1.3.1 - * deps: qs@6.13.0 - -4.20.0 -====== - * deps: serve-static@0.16.0 - * Remove link renderization in html while redirecting - * deps: send@0.19.0 - * Remove link renderization in html while redirecting - * deps: body-parser@0.6.0 - * add `depth` option to customize the depth level in the parser - * IMPORTANT: The default `depth` level for parsing URL-encoded data is now `32` (previously was `Infinity`) - * Remove link renderization in html while using `res.redirect` - * deps: path-to-regexp@0.1.10 - - Adds support for named matching groups in the routes using a regex - - Adds backtracking protection to parameters without regexes defined - * deps: encodeurl@~2.0.0 - - Removes encoding of `\`, `|`, and `^` to align better with URL spec - * Deprecate passing `options.maxAge` and `options.expires` to `res.clearCookie` - - Will be ignored in v5, clearCookie will set a cookie with an expires in the past to instruct clients to delete the cookie - -4.19.2 -====== - - * Improved fix for open redirect allow list bypass - -4.19.1 -====== - - * Allow passing non-strings to res.location with new encoding handling checks - -4.19.0 -====== - - * Prevent open redirect allow list bypass due to encodeurl - * deps: cookie@0.6.0 - -4.18.3 -====== - - * Fix routing requests without method - * deps: body-parser@1.20.2 - - Fix strict json error message on Node.js 19+ - - deps: content-type@~1.0.5 - - deps: raw-body@2.5.2 - * deps: cookie@0.6.0 - - Add `partitioned` option - -4.18.2 -====== - - * Fix regression routing a large stack in a single route - * deps: body-parser@1.20.1 - - deps: qs@6.11.0 - - perf: remove unnecessary object clone - * deps: qs@6.11.0 - -4.18.1 -====== - - * Fix hanging on large stack of sync routes - -4.18.0 -====== - - * Add "root" option to `res.download` - * Allow `options` without `filename` in `res.download` - * Deprecate string and non-integer arguments to `res.status` - * Fix behavior of `null`/`undefined` as `maxAge` in `res.cookie` - * Fix handling very large stacks of sync middleware - * Ignore `Object.prototype` values in settings through `app.set`/`app.get` - * Invoke `default` with same arguments as types in `res.format` - * Support proper 205 responses using `res.send` - * Use `http-errors` for `res.format` error - * deps: body-parser@1.20.0 - - Fix error message for json parse whitespace in `strict` - - Fix internal error when inflated body exceeds limit - - Prevent loss of async hooks context - - Prevent hanging when request already read - - deps: depd@2.0.0 - - deps: http-errors@2.0.0 - - deps: on-finished@2.4.1 - - deps: qs@6.10.3 - - deps: raw-body@2.5.1 - * deps: cookie@0.5.0 - - Add `priority` option - - Fix `expires` option to reject invalid dates - * deps: depd@2.0.0 - - Replace internal `eval` usage with `Function` constructor - - Use instance methods on `process` to check for listeners - * deps: finalhandler@1.2.0 - - Remove set content headers that break response - - deps: on-finished@2.4.1 - - deps: statuses@2.0.1 - * deps: on-finished@2.4.1 - - Prevent loss of async hooks context - * deps: qs@6.10.3 - * deps: send@0.18.0 - - Fix emitted 416 error missing headers property - - Limit the headers removed for 304 response - - deps: depd@2.0.0 - - deps: destroy@1.2.0 - - deps: http-errors@2.0.0 - - deps: on-finished@2.4.1 - - deps: statuses@2.0.1 - * deps: serve-static@1.15.0 - - deps: send@0.18.0 - * deps: statuses@2.0.1 - - Remove code 306 - - Rename `425 Unordered Collection` to standard `425 Too Early` - -4.17.3 -====== - - * deps: accepts@~1.3.8 - - deps: mime-types@~2.1.34 - - deps: negotiator@0.6.3 - * deps: body-parser@1.19.2 - - deps: bytes@3.1.2 - - deps: qs@6.9.7 - - deps: raw-body@2.4.3 - * deps: cookie@0.4.2 - * deps: qs@6.9.7 - * Fix handling of `__proto__` keys - * pref: remove unnecessary regexp for trust proxy - -4.17.2 -====== - - * Fix handling of `undefined` in `res.jsonp` - * Fix handling of `undefined` when `"json escape"` is enabled - * Fix incorrect middleware execution with unanchored `RegExp`s - * Fix `res.jsonp(obj, status)` deprecation message - * Fix typo in `res.is` JSDoc - * deps: body-parser@1.19.1 - - deps: bytes@3.1.1 - - deps: http-errors@1.8.1 - - deps: qs@6.9.6 - - deps: raw-body@2.4.2 - - deps: safe-buffer@5.2.1 - - deps: type-is@~1.6.18 - * deps: content-disposition@0.5.4 - - deps: safe-buffer@5.2.1 - * deps: cookie@0.4.1 - - Fix `maxAge` option to reject invalid values - * deps: proxy-addr@~2.0.7 - - Use `req.socket` over deprecated `req.connection` - - deps: forwarded@0.2.0 - - deps: ipaddr.js@1.9.1 - * deps: qs@6.9.6 - * deps: safe-buffer@5.2.1 - * deps: send@0.17.2 - - deps: http-errors@1.8.1 - - deps: ms@2.1.3 - - pref: ignore empty http tokens - * deps: serve-static@1.14.2 - - deps: send@0.17.2 - * deps: setprototypeof@1.2.0 - -4.17.1 -====== - - * Revert "Improve error message for `null`/`undefined` to `res.status`" - -4.17.0 -====== - - * Add `express.raw` to parse bodies into `Buffer` - * Add `express.text` to parse bodies into string - * Improve error message for non-strings to `res.sendFile` - * Improve error message for `null`/`undefined` to `res.status` - * Support multiple hosts in `X-Forwarded-Host` - * deps: accepts@~1.3.7 - * deps: body-parser@1.19.0 - - Add encoding MIK - - Add petabyte (`pb`) support - - Fix parsing array brackets after index - - deps: bytes@3.1.0 - - deps: http-errors@1.7.2 - - deps: iconv-lite@0.4.24 - - deps: qs@6.7.0 - - deps: raw-body@2.4.0 - - deps: type-is@~1.6.17 - * deps: content-disposition@0.5.3 - * deps: cookie@0.4.0 - - Add `SameSite=None` support - * deps: finalhandler@~1.1.2 - - Set stricter `Content-Security-Policy` header - - deps: parseurl@~1.3.3 - - deps: statuses@~1.5.0 - * deps: parseurl@~1.3.3 - * deps: proxy-addr@~2.0.5 - - deps: ipaddr.js@1.9.0 - * deps: qs@6.7.0 - - Fix parsing array brackets after index - * deps: range-parser@~1.2.1 - * deps: send@0.17.1 - - Set stricter CSP header in redirect & error responses - - deps: http-errors@~1.7.2 - - deps: mime@1.6.0 - - deps: ms@2.1.1 - - deps: range-parser@~1.2.1 - - deps: statuses@~1.5.0 - - perf: remove redundant `path.normalize` call - * deps: serve-static@1.14.1 - - Set stricter CSP header in redirect response - - deps: parseurl@~1.3.3 - - deps: send@0.17.1 - * deps: setprototypeof@1.1.1 - * deps: statuses@~1.5.0 - - Add `103 Early Hints` - * deps: type-is@~1.6.18 - - deps: mime-types@~2.1.24 - - perf: prevent internal `throw` on invalid type - -4.16.4 -====== - - * Fix issue where `"Request aborted"` may be logged in `res.sendfile` - * Fix JSDoc for `Router` constructor - * deps: body-parser@1.18.3 - - Fix deprecation warnings on Node.js 10+ - - Fix stack trace for strict json parse error - - deps: depd@~1.1.2 - - deps: http-errors@~1.6.3 - - deps: iconv-lite@0.4.23 - - deps: qs@6.5.2 - - deps: raw-body@2.3.3 - - deps: type-is@~1.6.16 - * deps: proxy-addr@~2.0.4 - - deps: ipaddr.js@1.8.0 - * deps: qs@6.5.2 - * deps: safe-buffer@5.1.2 - -4.16.3 -====== - - * deps: accepts@~1.3.5 - - deps: mime-types@~2.1.18 - * deps: depd@~1.1.2 - - perf: remove argument reassignment - * deps: encodeurl@~1.0.2 - - Fix encoding `%` as last character - * deps: finalhandler@1.1.1 - - Fix 404 output for bad / missing pathnames - - deps: encodeurl@~1.0.2 - - deps: statuses@~1.4.0 - * deps: proxy-addr@~2.0.3 - - deps: ipaddr.js@1.6.0 - * deps: send@0.16.2 - - Fix incorrect end tag in default error & redirects - - deps: depd@~1.1.2 - - deps: encodeurl@~1.0.2 - - deps: statuses@~1.4.0 - * deps: serve-static@1.13.2 - - Fix incorrect end tag in redirects - - deps: encodeurl@~1.0.2 - - deps: send@0.16.2 - * deps: statuses@~1.4.0 - * deps: type-is@~1.6.16 - - deps: mime-types@~2.1.18 - -4.16.2 -====== - - * Fix `TypeError` in `res.send` when given `Buffer` and `ETag` header set - * perf: skip parsing of entire `X-Forwarded-Proto` header - -4.16.1 -====== - - * deps: send@0.16.1 - * deps: serve-static@1.13.1 - - Fix regression when `root` is incorrectly set to a file - - deps: send@0.16.1 - -4.16.0 -====== - - * Add `"json escape"` setting for `res.json` and `res.jsonp` - * Add `express.json` and `express.urlencoded` to parse bodies - * Add `options` argument to `res.download` - * Improve error message when autoloading invalid view engine - * Improve error messages when non-function provided as middleware - * Skip `Buffer` encoding when not generating ETag for small response - * Use `safe-buffer` for improved Buffer API - * deps: accepts@~1.3.4 - - deps: mime-types@~2.1.16 - * deps: content-type@~1.0.4 - - perf: remove argument reassignment - - perf: skip parameter parsing when no parameters - * deps: etag@~1.8.1 - - perf: replace regular expression with substring - * deps: finalhandler@1.1.0 - - Use `res.headersSent` when available - * deps: parseurl@~1.3.2 - - perf: reduce overhead for full URLs - - perf: unroll the "fast-path" `RegExp` - * deps: proxy-addr@~2.0.2 - - Fix trimming leading / trailing OWS in `X-Forwarded-For` - - deps: forwarded@~0.1.2 - - deps: ipaddr.js@1.5.2 - - perf: reduce overhead when no `X-Forwarded-For` header - * deps: qs@6.5.1 - - Fix parsing & compacting very deep objects - * deps: send@0.16.0 - - Add 70 new types for file extensions - - Add `immutable` option - - Fix missing `` in default error & redirects - - Set charset as "UTF-8" for .js and .json - - Use instance methods on steam to check for listeners - - deps: mime@1.4.1 - - perf: improve path validation speed - * deps: serve-static@1.13.0 - - Add 70 new types for file extensions - - Add `immutable` option - - Set charset as "UTF-8" for .js and .json - - deps: send@0.16.0 - * deps: setprototypeof@1.1.0 - * deps: utils-merge@1.0.1 - * deps: vary@~1.1.2 - - perf: improve header token parsing speed - * perf: re-use options object when generating ETags - * perf: remove dead `.charset` set in `res.jsonp` - -4.15.5 -====== - - * deps: debug@2.6.9 - * deps: finalhandler@~1.0.6 - - deps: debug@2.6.9 - - deps: parseurl@~1.3.2 - * deps: fresh@0.5.2 - - Fix handling of modified headers with invalid dates - - perf: improve ETag match loop - - perf: improve `If-None-Match` token parsing - * deps: send@0.15.6 - - Fix handling of modified headers with invalid dates - - deps: debug@2.6.9 - - deps: etag@~1.8.1 - - deps: fresh@0.5.2 - - perf: improve `If-Match` token parsing - * deps: serve-static@1.12.6 - - deps: parseurl@~1.3.2 - - deps: send@0.15.6 - - perf: improve slash collapsing - -4.15.4 -====== - - * deps: debug@2.6.8 - * deps: depd@~1.1.1 - - Remove unnecessary `Buffer` loading - * deps: finalhandler@~1.0.4 - - deps: debug@2.6.8 - * deps: proxy-addr@~1.1.5 - - Fix array argument being altered - - deps: ipaddr.js@1.4.0 - * deps: qs@6.5.0 - * deps: send@0.15.4 - - deps: debug@2.6.8 - - deps: depd@~1.1.1 - - deps: http-errors@~1.6.2 - * deps: serve-static@1.12.4 - - deps: send@0.15.4 - -4.15.3 -====== - - * Fix error when `res.set` cannot add charset to `Content-Type` - * deps: debug@2.6.7 - - Fix `DEBUG_MAX_ARRAY_LENGTH` - - deps: ms@2.0.0 - * deps: finalhandler@~1.0.3 - - Fix missing `` in HTML document - - deps: debug@2.6.7 - * deps: proxy-addr@~1.1.4 - - deps: ipaddr.js@1.3.0 - * deps: send@0.15.3 - - deps: debug@2.6.7 - - deps: ms@2.0.0 - * deps: serve-static@1.12.3 - - deps: send@0.15.3 - * deps: type-is@~1.6.15 - - deps: mime-types@~2.1.15 - * deps: vary@~1.1.1 - - perf: hoist regular expression - -4.15.2 -====== - - * deps: qs@6.4.0 - - Fix regression parsing keys starting with `[` - -4.15.1 -====== - - * deps: send@0.15.1 - - Fix issue when `Date.parse` does not return `NaN` on invalid date - - Fix strict violation in broken environments - * deps: serve-static@1.12.1 - - Fix issue when `Date.parse` does not return `NaN` on invalid date - - deps: send@0.15.1 - -4.15.0 -====== - - * Add debug message when loading view engine - * Add `next("router")` to exit from router - * Fix case where `router.use` skipped requests routes did not - * Remove usage of `res._headers` private field - - Improves compatibility with Node.js 8 nightly - * Skip routing when `req.url` is not set - * Use `%o` in path debug to tell types apart - * Use `Object.create` to setup request & response prototypes - * Use `setprototypeof` module to replace `__proto__` setting - * Use `statuses` instead of `http` module for status messages - * deps: debug@2.6.1 - - Allow colors in workers - - Deprecated `DEBUG_FD` environment variable set to `3` or higher - - Fix error when running under React Native - - Use same color for same namespace - - deps: ms@0.7.2 - * deps: etag@~1.8.0 - - Use SHA1 instead of MD5 for ETag hashing - - Works with FIPS 140-2 OpenSSL configuration - * deps: finalhandler@~1.0.0 - - Fix exception when `err` cannot be converted to a string - - Fully URL-encode the pathname in the 404 - - Only include the pathname in the 404 message - - Send complete HTML document - - Set `Content-Security-Policy: default-src 'self'` header - - deps: debug@2.6.1 - * deps: fresh@0.5.0 - - Fix false detection of `no-cache` request directive - - Fix incorrect result when `If-None-Match` has both `*` and ETags - - Fix weak `ETag` matching to match spec - - perf: delay reading header values until needed - - perf: enable strict mode - - perf: hoist regular expressions - - perf: remove duplicate conditional - - perf: remove unnecessary boolean coercions - - perf: skip checking modified time if ETag check failed - - perf: skip parsing `If-None-Match` when no `ETag` header - - perf: use `Date.parse` instead of `new Date` - * deps: qs@6.3.1 - - Fix array parsing from skipping empty values - - Fix compacting nested arrays - * deps: send@0.15.0 - - Fix false detection of `no-cache` request directive - - Fix incorrect result when `If-None-Match` has both `*` and ETags - - Fix weak `ETag` matching to match spec - - Remove usage of `res._headers` private field - - Support `If-Match` and `If-Unmodified-Since` headers - - Use `res.getHeaderNames()` when available - - Use `res.headersSent` when available - - deps: debug@2.6.1 - - deps: etag@~1.8.0 - - deps: fresh@0.5.0 - - deps: http-errors@~1.6.1 - * deps: serve-static@1.12.0 - - Fix false detection of `no-cache` request directive - - Fix incorrect result when `If-None-Match` has both `*` and ETags - - Fix weak `ETag` matching to match spec - - Remove usage of `res._headers` private field - - Send complete HTML document in redirect response - - Set default CSP header in redirect response - - Support `If-Match` and `If-Unmodified-Since` headers - - Use `res.getHeaderNames()` when available - - Use `res.headersSent` when available - - deps: send@0.15.0 - * perf: add fast match path for `*` route - * perf: improve `req.ips` performance - -4.14.1 -====== - - * deps: content-disposition@0.5.2 - * deps: finalhandler@0.5.1 - - Fix exception when `err.headers` is not an object - - deps: statuses@~1.3.1 - - perf: hoist regular expressions - - perf: remove duplicate validation path - * deps: proxy-addr@~1.1.3 - - deps: ipaddr.js@1.2.0 - * deps: send@0.14.2 - - deps: http-errors@~1.5.1 - - deps: ms@0.7.2 - - deps: statuses@~1.3.1 - * deps: serve-static@~1.11.2 - - deps: send@0.14.2 - * deps: type-is@~1.6.14 - - deps: mime-types@~2.1.13 - -4.14.0 -====== - - * Add `acceptRanges` option to `res.sendFile`/`res.sendfile` - * Add `cacheControl` option to `res.sendFile`/`res.sendfile` - * Add `options` argument to `req.range` - - Includes the `combine` option - * Encode URL in `res.location`/`res.redirect` if not already encoded - * Fix some redirect handling in `res.sendFile`/`res.sendfile` - * Fix Windows absolute path check using forward slashes - * Improve error with invalid arguments to `req.get()` - * Improve performance for `res.json`/`res.jsonp` in most cases - * Improve `Range` header handling in `res.sendFile`/`res.sendfile` - * deps: accepts@~1.3.3 - - Fix including type extensions in parameters in `Accept` parsing - - Fix parsing `Accept` parameters with quoted equals - - Fix parsing `Accept` parameters with quoted semicolons - - Many performance improvements - - deps: mime-types@~2.1.11 - - deps: negotiator@0.6.1 - * deps: content-type@~1.0.2 - - perf: enable strict mode - * deps: cookie@0.3.1 - - Add `sameSite` option - - Fix cookie `Max-Age` to never be a floating point number - - Improve error message when `encode` is not a function - - Improve error message when `expires` is not a `Date` - - Throw better error for invalid argument to parse - - Throw on invalid values provided to `serialize` - - perf: enable strict mode - - perf: hoist regular expression - - perf: use for loop in parse - - perf: use string concatenation for serialization - * deps: finalhandler@0.5.0 - - Change invalid or non-numeric status code to 500 - - Overwrite status message to match set status code - - Prefer `err.statusCode` if `err.status` is invalid - - Set response headers from `err.headers` object - - Use `statuses` instead of `http` module for status messages - * deps: proxy-addr@~1.1.2 - - Fix accepting various invalid netmasks - - Fix IPv6-mapped IPv4 validation edge cases - - IPv4 netmasks must be contiguous - - IPv6 addresses cannot be used as a netmask - - deps: ipaddr.js@1.1.1 - * deps: qs@6.2.0 - - Add `decoder` option in `parse` function - * deps: range-parser@~1.2.0 - - Add `combine` option to combine overlapping ranges - - Fix incorrectly returning -1 when there is at least one valid range - - perf: remove internal function - * deps: send@0.14.1 - - Add `acceptRanges` option - - Add `cacheControl` option - - Attempt to combine multiple ranges into single range - - Correctly inherit from `Stream` class - - Fix `Content-Range` header in 416 responses when using `start`/`end` options - - Fix `Content-Range` header missing from default 416 responses - - Fix redirect error when `path` contains raw non-URL characters - - Fix redirect when `path` starts with multiple forward slashes - - Ignore non-byte `Range` headers - - deps: http-errors@~1.5.0 - - deps: range-parser@~1.2.0 - - deps: statuses@~1.3.0 - - perf: remove argument reassignment - * deps: serve-static@~1.11.1 - - Add `acceptRanges` option - - Add `cacheControl` option - - Attempt to combine multiple ranges into single range - - Fix redirect error when `req.url` contains raw non-URL characters - - Ignore non-byte `Range` headers - - Use status code 301 for redirects - - deps: send@0.14.1 - * deps: type-is@~1.6.13 - - Fix type error when given invalid type to match against - - deps: mime-types@~2.1.11 - * deps: vary@~1.1.0 - - Only accept valid field names in the `field` argument - * perf: use strict equality when possible - -4.13.4 -====== - - * deps: content-disposition@0.5.1 - - perf: enable strict mode - * deps: cookie@0.1.5 - - Throw on invalid values provided to `serialize` - * deps: depd@~1.1.0 - - Support web browser loading - - perf: enable strict mode - * deps: escape-html@~1.0.3 - - perf: enable strict mode - - perf: optimize string replacement - - perf: use faster string coercion - * deps: finalhandler@0.4.1 - - deps: escape-html@~1.0.3 - * deps: merge-descriptors@1.0.1 - - perf: enable strict mode - * deps: methods@~1.1.2 - - perf: enable strict mode - * deps: parseurl@~1.3.1 - - perf: enable strict mode - * deps: proxy-addr@~1.0.10 - - deps: ipaddr.js@1.0.5 - - perf: enable strict mode - * deps: range-parser@~1.0.3 - - perf: enable strict mode - * deps: send@0.13.1 - - deps: depd@~1.1.0 - - deps: destroy@~1.0.4 - - deps: escape-html@~1.0.3 - - deps: range-parser@~1.0.3 - * deps: serve-static@~1.10.2 - - deps: escape-html@~1.0.3 - - deps: parseurl@~1.3.0 - - deps: send@0.13.1 - -4.13.3 -====== - - * Fix infinite loop condition using `mergeParams: true` - * Fix inner numeric indices incorrectly altering parent `req.params` - -4.13.2 -====== - - * deps: accepts@~1.2.12 - - deps: mime-types@~2.1.4 - * deps: array-flatten@1.1.1 - - perf: enable strict mode - * deps: path-to-regexp@0.1.7 - - Fix regression with escaped round brackets and matching groups - * deps: type-is@~1.6.6 - - deps: mime-types@~2.1.4 - -4.13.1 -====== - - * deps: accepts@~1.2.10 - - deps: mime-types@~2.1.2 - * deps: qs@4.0.0 - - Fix dropping parameters like `hasOwnProperty` - - Fix various parsing edge cases - * deps: type-is@~1.6.4 - - deps: mime-types@~2.1.2 - - perf: enable strict mode - - perf: remove argument reassignment - -4.13.0 -====== - - * Add settings to debug output - * Fix `res.format` error when only `default` provided - * Fix issue where `next('route')` in `app.param` would incorrectly skip values - * Fix hiding platform issues with `decodeURIComponent` - - Only `URIError`s are a 400 - * Fix using `*` before params in routes - * Fix using capture groups before params in routes - * Simplify `res.cookie` to call `res.append` - * Use `array-flatten` module for flattening arrays - * deps: accepts@~1.2.9 - - deps: mime-types@~2.1.1 - - perf: avoid argument reassignment & argument slice - - perf: avoid negotiator recursive construction - - perf: enable strict mode - - perf: remove unnecessary bitwise operator - * deps: cookie@0.1.3 - - perf: deduce the scope of try-catch deopt - - perf: remove argument reassignments - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Always include entity length in ETags for hash length extensions - - Generate non-Stats ETags using MD5 only (no longer CRC32) - - Improve stat performance by removing hashing - - Improve support for JXcore - - Remove base64 padding in ETags to shorten - - Support "fake" stats objects in environments without fs - - Use MD5 instead of MD4 in weak ETags over 1KB - * deps: finalhandler@0.4.0 - - Fix a false-positive when unpiping in Node.js 0.8 - - Support `statusCode` property on `Error` objects - - Use `unpipe` module for unpiping requests - - deps: escape-html@1.0.2 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove argument reassignment - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: on-finished@~2.3.0 - - Add defined behavior for HTTP `CONNECT` requests - - Add defined behavior for HTTP `Upgrade` requests - - deps: ee-first@1.1.1 - * deps: path-to-regexp@0.1.6 - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - * deps: serve-static@~1.10.0 - - Add `fallthrough` option - - Fix reading options from options prototype - - Improve the default redirect response headers - - Malformed URLs now `next()` instead of 400 - - deps: escape-html@1.0.2 - - deps: send@0.13.0 - - perf: enable strict mode - - perf: remove argument reassignment - * deps: type-is@~1.6.3 - - deps: mime-types@~2.1.1 - - perf: reduce try block size - - perf: remove bitwise operations - * perf: enable strict mode - * perf: isolate `app.render` try block - * perf: remove argument reassignments in application - * perf: remove argument reassignments in request prototype - * perf: remove argument reassignments in response prototype - * perf: remove argument reassignments in routing - * perf: remove argument reassignments in `View` - * perf: skip attempting to decode zero length string - * perf: use saved reference to `http.STATUS_CODES` - -4.12.4 -====== - - * deps: accepts@~1.2.7 - - deps: mime-types@~2.0.11 - - deps: negotiator@0.5.3 - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: etag@~1.6.0 - - Improve support for JXcore - - Support "fake" stats objects in environments without `fs` - * deps: finalhandler@0.3.6 - - deps: debug@~2.2.0 - - deps: on-finished@~2.2.1 - * deps: on-finished@~2.2.1 - - Fix `isFinished(req)` when data buffered - * deps: proxy-addr@~1.0.8 - - deps: ipaddr.js@1.0.1 - * deps: qs@2.4.2 - - Fix allowing parameters like `constructor` - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - * deps: serve-static@~1.9.3 - - deps: send@0.12.3 - * deps: type-is@~1.6.2 - - deps: mime-types@~2.0.11 - -4.12.3 -====== - - * deps: accepts@~1.2.5 - - deps: mime-types@~2.0.10 - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - * deps: finalhandler@0.3.4 - - deps: debug@~2.1.3 - * deps: proxy-addr@~1.0.7 - - deps: ipaddr.js@0.1.9 - * deps: qs@2.4.1 - - Fix error when parameter `hasOwnProperty` is present - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - * deps: serve-static@~1.9.2 - - deps: send@0.12.2 - * deps: type-is@~1.6.1 - - deps: mime-types@~2.0.10 - -4.12.2 -====== - - * Fix regression where `"Request aborted"` is logged using `res.sendFile` - -4.12.1 -====== - - * Fix constructing application with non-configurable prototype properties - * Fix `ECONNRESET` errors from `res.sendFile` usage - * Fix `req.host` when using "trust proxy" hops count - * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count - * Fix wrong `code` on aborted connections from `res.sendFile` - * deps: merge-descriptors@1.0.0 - -4.12.0 -====== - - * Fix `"trust proxy"` setting to inherit when app is mounted - * Generate `ETag`s for all request responses - - No longer restricted to only responses for `GET` and `HEAD` requests - * Use `content-type` to parse `Content-Type` headers - * deps: accepts@~1.2.4 - - Fix preference sorting to be stable for long acceptable lists - - deps: mime-types@~2.0.9 - - deps: negotiator@0.5.1 - * deps: cookie-signature@1.0.6 - * deps: send@0.12.1 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - * deps: serve-static@~1.9.1 - - deps: send@0.12.1 - * deps: type-is@~1.6.0 - - fix argument reassignment - - fix false-positives in `hasBody` `Transfer-Encoding` check - - support wildcard for both type and subtype (`*/*`) - - deps: mime-types@~2.0.9 - -4.11.2 -====== - - * Fix `res.redirect` double-calling `res.end` for `HEAD` requests - * deps: accepts@~1.2.3 - - deps: mime-types@~2.0.8 - * deps: proxy-addr@~1.0.6 - - deps: ipaddr.js@0.1.8 - * deps: type-is@~1.5.6 - - deps: mime-types@~2.0.8 - -4.11.1 -====== - - * deps: send@0.11.1 - - Fix root path disclosure - * deps: serve-static@~1.8.1 - - Fix redirect loop in Node.js 0.11.14 - - Fix root path disclosure - - deps: send@0.11.1 - -4.11.0 -====== - - * Add `res.append(field, val)` to append headers - * Deprecate leading `:` in `name` for `app.param(name, fn)` - * Deprecate `req.param()` -- use `req.params`, `req.body`, or `req.query` instead - * Deprecate `app.param(fn)` - * Fix `OPTIONS` responses to include the `HEAD` method properly - * Fix `res.sendFile` not always detecting aborted connection - * Match routes iteratively to prevent stack overflows - * deps: accepts@~1.2.2 - - deps: mime-types@~2.0.7 - - deps: negotiator@0.5.0 - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - * deps: serve-static@~1.8.0 - - deps: send@0.11.0 - -4.10.8 -====== - - * Fix crash from error within `OPTIONS` response handler - * deps: proxy-addr@~1.0.5 - - deps: ipaddr.js@0.1.6 - -4.10.7 -====== - - * Fix `Allow` header for `OPTIONS` to not contain duplicate methods - * Fix incorrect "Request aborted" for `res.sendFile` when `HEAD` or 304 - * deps: debug@~2.1.1 - * deps: finalhandler@0.3.3 - - deps: debug@~2.1.1 - - deps: on-finished@~2.2.0 - * deps: methods@~1.1.1 - * deps: on-finished@~2.2.0 - * deps: serve-static@~1.7.2 - - Fix potential open redirect when mounted at root - * deps: type-is@~1.5.5 - - deps: mime-types@~2.0.7 - -4.10.6 -====== - - * Fix exception in `req.fresh`/`req.stale` without response headers - -4.10.5 -====== - - * Fix `res.send` double-calling `res.end` for `HEAD` requests - * deps: accepts@~1.1.4 - - deps: mime-types@~2.0.4 - * deps: type-is@~1.5.4 - - deps: mime-types@~2.0.4 - -4.10.4 -====== - - * Fix `res.sendfile` logging standard write errors - -4.10.3 -====== - - * Fix `res.sendFile` logging standard write errors - * deps: etag@~1.5.1 - * deps: proxy-addr@~1.0.4 - - deps: ipaddr.js@0.1.5 - * deps: qs@2.3.3 - - Fix `arrayLimit` behavior - -4.10.2 -====== - - * Correctly invoke async router callback asynchronously - * deps: accepts@~1.1.3 - - deps: mime-types@~2.0.3 - * deps: type-is@~1.5.3 - - deps: mime-types@~2.0.3 - -4.10.1 -====== - - * Fix handling of URLs containing `://` in the path - * deps: qs@2.3.2 - - Fix parsing of mixed objects and values - -4.10.0 -====== - - * Add support for `app.set('views', array)` - - Views are looked up in sequence in array of directories - * Fix `res.send(status)` to mention `res.sendStatus(status)` - * Fix handling of invalid empty URLs - * Use `content-disposition` module for `res.attachment`/`res.download` - - Sends standards-compliant `Content-Disposition` header - - Full Unicode support - * Use `path.resolve` in view lookup - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: etag@~1.5.0 - - Improve string performance - - Slightly improve speed for weak ETags over 1KB - * deps: finalhandler@0.3.2 - - Terminate in progress response only on error - - Use `on-finished` to determine request status - - deps: debug@~2.1.0 - - deps: on-finished@~2.1.1 - * deps: on-finished@~2.1.1 - - Fix handling of pipelined requests - * deps: qs@2.3.0 - - Fix parsing of mixed implicit and explicit arrays - * deps: send@0.10.1 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - - deps: on-finished@~2.1.1 - * deps: serve-static@~1.7.1 - - deps: send@0.10.1 - -4.9.8 -====== - - * Fix `res.redirect` body when redirect status specified - * deps: accepts@~1.1.2 - - Fix error when media type has invalid parameter - - deps: negotiator@0.4.9 - -4.9.7 -====== - - * Fix using same param name in array of paths - -4.9.6 -====== - - * deps: accepts@~1.1.1 - - deps: mime-types@~2.0.2 - - deps: negotiator@0.4.8 - * deps: serve-static@~1.6.4 - - Fix redirect loop when index file serving disabled - * deps: type-is@~1.5.2 - - deps: mime-types@~2.0.2 - -4.9.5 -====== - - * deps: etag@~1.4.0 - * deps: proxy-addr@~1.0.3 - - Use `forwarded` npm module - * deps: send@0.9.3 - - deps: etag@~1.4.0 - * deps: serve-static@~1.6.3 - - deps: send@0.9.3 - -4.9.4 -====== - - * deps: qs@2.2.4 - - Fix issue with object keys starting with numbers truncated - -4.9.3 -====== - - * deps: proxy-addr@~1.0.2 - - Fix a global leak when multiple subnets are trusted - - deps: ipaddr.js@0.1.3 - -4.9.2 -====== - - * Fix regression for empty string `path` in `app.use` - * Fix `router.use` to accept array of middleware without path - * Improve error message for bad `app.use` arguments - -4.9.1 -====== - - * Fix `app.use` to accept array of middleware without path - * deps: depd@0.4.5 - * deps: etag@~1.3.1 - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - * deps: serve-static@~1.6.2 - - deps: send@0.9.2 - -4.9.0 -====== - - * Add `res.sendStatus` - * Invoke callback for sendfile when client aborts - - Applies to `res.sendFile`, `res.sendfile`, and `res.download` - - `err` will be populated with request aborted error - * Support IP address host in `req.subdomains` - * Use `etag` to generate `ETag` headers - * deps: accepts@~1.1.0 - - update `mime-types` - * deps: cookie-signature@1.0.5 - * deps: debug@~2.0.0 - * deps: finalhandler@0.2.0 - - Set `X-Content-Type-Options: nosniff` header - - deps: debug@~2.0.0 - * deps: fresh@0.2.4 - * deps: media-typer@0.3.0 - - Throw error when parameter format invalid on parse - * deps: qs@2.2.3 - - Fix issue where first empty value in array is discarded - * deps: range-parser@~1.0.2 - * deps: send@0.9.1 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - - deps: fresh@0.2.4 - * deps: serve-static@~1.6.1 - - Add `lastModified` option - - deps: send@0.9.1 - * deps: type-is@~1.5.1 - - fix `hasbody` to be true for `content-length: 0` - - deps: media-typer@0.3.0 - - deps: mime-types@~2.0.1 - * deps: vary@~1.0.0 - - Accept valid `Vary` header string as `field` - -4.8.8 -====== - - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - * deps: serve-static@~1.5.4 - - deps: send@0.8.5 - -4.8.7 -====== - - * deps: qs@2.2.2 - - Remove unnecessary cloning - -4.8.6 -====== - - * deps: qs@2.2.0 - - Array parsing fix - - Performance improvements - -4.8.5 -====== - - * deps: send@0.8.3 - - deps: destroy@1.0.3 - - deps: on-finished@2.1.0 - * deps: serve-static@~1.5.3 - - deps: send@0.8.3 - -4.8.4 -====== - - * deps: qs@1.2.2 - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - * deps: serve-static@~1.5.2 - - deps: send@0.8.2 - -4.8.3 -====== - - * deps: parseurl@~1.3.0 - * deps: qs@1.2.1 - * deps: serve-static@~1.5.1 - - Fix parsing of weird `req.originalUrl` values - - deps: parseurl@~1.3.0 - - deps: utils-merge@1.0.0 - -4.8.2 -====== - - * deps: qs@1.2.0 - - Fix parsing array of objects - -4.8.1 -====== - - * fix incorrect deprecation warnings on `res.download` - * deps: qs@1.1.0 - - Accept urlencoded square brackets - - Accept empty values in implicit array notation - -4.8.0 -====== - - * add `res.sendFile` - - accepts a file system path instead of a URL - - requires an absolute path or `root` option specified - * deprecate `res.sendfile` -- use `res.sendFile` instead - * support mounted app as any argument to `app.use()` - * deps: qs@1.0.2 - - Complete rewrite - - Limits array length to 20 - - Limits object depth to 5 - - Limits parameters to 1,000 - * deps: send@0.8.1 - - Add `extensions` option - * deps: serve-static@~1.5.0 - - Add `extensions` option - - deps: send@0.8.1 - -4.7.4 -====== - - * fix `res.sendfile` regression for serving directory index files - * deps: send@0.7.4 - - Fix incorrect 403 on Windows and Node.js 0.11 - - Fix serving index files without root dir - * deps: serve-static@~1.4.4 - - deps: send@0.7.4 - -4.7.3 -====== - - * deps: send@0.7.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - * deps: serve-static@~1.4.3 - - Fix incorrect 403 on Windows and Node.js 0.11 - - deps: send@0.7.3 - -4.7.2 -====== - - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - * deps: serve-static@~1.4.2 - -4.7.1 -====== - - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - * deps: serve-static@~1.4.1 - -4.7.0 -====== - - * fix `req.protocol` for proxy-direct connections - * configurable query parser with `app.set('query parser', parser)` - - `app.set('query parser', 'extended')` parse with "qs" module - - `app.set('query parser', 'simple')` parse with "querystring" core module - - `app.set('query parser', false)` disable query string parsing - - `app.set('query parser', true)` enable simple parsing - * deprecate `res.json(status, obj)` -- use `res.status(status).json(obj)` instead - * deprecate `res.jsonp(status, obj)` -- use `res.status(status).jsonp(obj)` instead - * deprecate `res.send(status, body)` -- use `res.status(status).send(body)` instead - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: finalhandler@0.1.0 - - Respond after request fully read - - deps: debug@1.0.4 - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - * deps: serve-static@~1.4.0 - - deps: parseurl@~1.2.0 - - deps: send@0.7.0 - * perf: prevent multiple `Buffer` creation in `res.send` - -4.6.1 -====== - - * fix `subapp.mountpath` regression for `app.use(subapp)` - -4.6.0 -====== - - * accept multiple callbacks to `app.use()` - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * catch errors in multiple `req.param(name, fn)` handlers - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * support non-string `path` in `app.use(path, fn)` - - supports array of paths - - supports `RegExp` - * router: fix optimization on router exit - * router: refactor location of `try` blocks - * router: speed up standard `app.use(fn)` - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: finalhandler@0.0.3 - - deps: debug@1.0.3 - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - * deps: path-to-regexp@0.1.3 - * deps: send@0.6.0 - - deps: debug@1.0.3 - * deps: serve-static@~1.3.2 - - deps: parseurl@~1.1.3 - - deps: send@0.6.0 - * perf: fix arguments reassign deopt in some `res` methods - -4.5.1 -====== - - * fix routing regression when altering `req.method` - -4.5.0 -====== - - * add deprecation message to non-plural `req.accepts*` - * add deprecation message to `res.send(body, status)` - * add deprecation message to `res.vary()` - * add `headers` option to `res.sendfile` - - use to set headers on successful file transfer - * add `mergeParams` option to `Router` - - merges `req.params` from parent routes - * add `req.hostname` -- correct name for what `req.host` returns - * deprecate things with `depd` module - * deprecate `req.host` -- use `req.hostname` instead - * fix behavior when handling request without routes - * fix handling when `route.all` is only route - * invoke `router.param()` only when route matches - * restore `req.params` after invoking router - * use `finalhandler` for final response handling - * use `media-typer` to alter content-type charset - * deps: accepts@~1.0.7 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - * deps: serve-static@~1.3.0 - - Accept string for `maxAge` (converted by `ms`) - - Add `setHeaders` option - - Include HTML link in redirect response - - deps: send@0.5.0 - * deps: type-is@~1.3.2 - -4.4.5 -====== - - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -4.4.4 -====== - - * fix `res.attachment` Unicode filenames in Safari - * fix "trim prefix" debug message in `express:router` - * deps: accepts@~1.0.5 - * deps: buffer-crc32@0.2.3 - -4.4.3 -====== - - * fix persistence of modified `req.params[name]` from `app.param()` - * deps: accepts@1.0.3 - - deps: negotiator@0.4.6 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw uncatchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - * deps: serve-static@1.2.3 - - Do not throw uncatchable error on file open race condition - - deps: send@0.4.3 - -4.4.2 -====== - - * fix catching errors from top-level handlers - * use `vary` module for `res.vary` - * deps: debug@1.0.1 - * deps: proxy-addr@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: debug@1.0.1 - - deps: finished@1.2.1 - * deps: serve-static@1.2.2 - - fix "event emitter leak" warnings - - deps: send@0.4.2 - * deps: type-is@1.2.1 - -4.4.1 -====== - - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - * deps: serve-static@1.2.1 - - use `escape-html` for escaping - - deps: send@0.4.1 - -4.4.0 -====== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * mark `res.send` ETag as weak and reduce collisions - * update accepts to 1.0.2 - - Fix interpretation when header not in request - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - * update serve-static to 1.2.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: send@0.4.0 - -4.3.2 -====== - - * fix handling of errors from `router.param()` callbacks - -4.3.1 -====== - - * revert "fix behavior of multiple `app.VERB` for the same path" - - this caused a regression in the order of route execution - -4.3.0 -====== - - * add `req.baseUrl` to access the path stripped from `req.url` in routes - * fix behavior of multiple `app.VERB` for the same path - * fix issue routing requests among sub routers - * invoke `router.param()` only when necessary instead of every match - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * set proper `charset` in `Content-Type` for `res.send` - * update type-is to 1.2.0 - - support suffix matching - -4.2.0 -====== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * fix `req.next` when inside router instance - * include `ETag` header in `HEAD` requests - * keep previous `Content-Type` for `res.jsonp` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update debug to 0.8.0 - - add `enable()` method - - change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - -4.1.2 -====== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -4.1.1 -====== - - * fix package.json to reflect supported node version - -4.1.0 -====== - - * pass options from `res.sendfile` to `send` - * preserve casing of headers in `res.header` and `res.set` - * support unicode file names in `res.attachment` and `res.download` - * update accepts to 1.0.1 - - deps: negotiator@0.4.0 - * update cookie to 0.1.2 - - Fix for maxAge == 0 - - made compat with expires field - * update send to 0.3.0 - - Accept API options in options object - - Coerce option types - - Control whether to generate etags - - Default directory access to 403 when index disabled - - Fix sending files with dots without root set - - Include file path in etag - - Make "Can't set headers after they are sent." catchable - - Send full entity-body for multi range requests - - Set etags to "weak" - - Support "If-Range" header - - Support multiple index paths - - deps: mime@1.2.11 - * update serve-static to 1.1.0 - - Accept options directly to `send` module - - Resolve relative paths at middleware setup - - Use parseurl to parse the URL from request - - deps: send@0.3.0 - * update type-is to 1.1.0 - - add non-array values support - - add `multipart` as a shorthand - -4.0.0 -====== - - * remove: - - node 0.8 support - - connect and connect's patches except for charset handling - - express(1) - moved to [express-generator](https://github.com/expressjs/generator) - - `express.createServer()` - it has been deprecated for a long time. Use `express()` - - `app.configure` - use logic in your own app code - - `app.router` - is removed - - `req.auth` - use `basic-auth` instead - - `req.accepted*` - use `req.accepts*()` instead - - `res.location` - relative URL resolution is removed - - `res.charset` - include the charset in the content type when using `res.set()` - - all bundled middleware except `static` - * change: - - `app.route` -> `app.mountpath` when mounting an express app in another express app - - `json spaces` no longer enabled by default in development - - `req.accepts*` -> `req.accepts*s` - i.e. `req.acceptsEncoding` -> `req.acceptsEncodings` - - `req.params` is now an object instead of an array - - `res.locals` is no longer a function. It is a plain js object. Treat it as such. - - `res.headerSent` -> `res.headersSent` to match node.js ServerResponse object - * refactor: - - `req.accepts*` with [accepts](https://github.com/expressjs/accepts) - - `req.is` with [type-is](https://github.com/expressjs/type-is) - - [path-to-regexp](https://github.com/component/path-to-regexp) - * add: - - `app.router()` - returns the app Router instance - - `app.route()` - Proxy to the app's `Router#route()` method to create a new route - - Router & Route - public API - -3.21.2 -====== - - * deps: connect@2.30.2 - - deps: body-parser@~1.13.3 - - deps: compression@~1.5.2 - - deps: errorhandler@~1.4.2 - - deps: method-override@~2.3.5 - - deps: serve-index@~1.7.2 - - deps: type-is@~1.6.6 - - deps: vhost@~3.0.1 - * deps: vary@~1.0.1 - - Fix setting empty header from empty `field` - - perf: enable strict mode - - perf: remove argument reassignments - -3.21.1 -====== - - * deps: basic-auth@~1.0.3 - * deps: connect@2.30.1 - - deps: body-parser@~1.13.2 - - deps: compression@~1.5.1 - - deps: errorhandler@~1.4.1 - - deps: morgan@~1.6.1 - - deps: pause@0.1.0 - - deps: qs@4.0.0 - - deps: serve-index@~1.7.1 - - deps: type-is@~1.6.4 - -3.21.0 -====== - - * deps: basic-auth@1.0.2 - - perf: enable strict mode - - perf: hoist regular expression - - perf: parse with regular expressions - - perf: remove argument reassignment - * deps: connect@2.30.0 - - deps: body-parser@~1.13.1 - - deps: bytes@2.1.0 - - deps: compression@~1.5.0 - - deps: cookie@0.1.3 - - deps: cookie-parser@~1.3.5 - - deps: csurf@~1.8.3 - - deps: errorhandler@~1.4.0 - - deps: express-session@~1.11.3 - - deps: finalhandler@0.4.0 - - deps: fresh@0.3.0 - - deps: morgan@~1.6.0 - - deps: serve-favicon@~2.3.0 - - deps: serve-index@~1.7.0 - - deps: serve-static@~1.10.0 - - deps: type-is@~1.6.3 - * deps: cookie@0.1.3 - - perf: deduce the scope of try-catch deopt - - perf: remove argument reassignments - * deps: escape-html@1.0.2 - * deps: etag@~1.7.0 - - Always include entity length in ETags for hash length extensions - - Generate non-Stats ETags using MD5 only (no longer CRC32) - - Improve stat performance by removing hashing - - Improve support for JXcore - - Remove base64 padding in ETags to shorten - - Support "fake" stats objects in environments without fs - - Use MD5 instead of MD4 in weak ETags over 1KB - * deps: fresh@0.3.0 - - Add weak `ETag` matching support - * deps: mkdirp@0.5.1 - - Work in global strict mode - * deps: send@0.13.0 - - Allow Node.js HTTP server to set `Date` response header - - Fix incorrectly removing `Content-Location` on 304 response - - Improve the default redirect response headers - - Send appropriate headers on default error response - - Use `http-errors` for standard emitted errors - - Use `statuses` instead of `http` module for status messages - - deps: escape-html@1.0.2 - - deps: etag@~1.7.0 - - deps: fresh@0.3.0 - - deps: on-finished@~2.3.0 - - perf: enable strict mode - - perf: remove unnecessary array allocations - -3.20.3 -====== - - * deps: connect@2.29.2 - - deps: body-parser@~1.12.4 - - deps: compression@~1.4.4 - - deps: connect-timeout@~1.6.2 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: errorhandler@~1.3.6 - - deps: finalhandler@0.3.6 - - deps: method-override@~2.3.3 - - deps: morgan@~1.5.3 - - deps: qs@2.4.2 - - deps: response-time@~2.3.1 - - deps: serve-favicon@~2.2.1 - - deps: serve-index@~1.6.4 - - deps: serve-static@~1.9.3 - - deps: type-is@~1.6.2 - * deps: debug@~2.2.0 - - deps: ms@0.7.1 - * deps: depd@~1.0.1 - * deps: proxy-addr@~1.0.8 - - deps: ipaddr.js@1.0.1 - * deps: send@0.12.3 - - deps: debug@~2.2.0 - - deps: depd@~1.0.1 - - deps: etag@~1.6.0 - - deps: ms@0.7.1 - - deps: on-finished@~2.2.1 - -3.20.2 -====== - - * deps: connect@2.29.1 - - deps: body-parser@~1.12.2 - - deps: compression@~1.4.3 - - deps: connect-timeout@~1.6.1 - - deps: debug@~2.1.3 - - deps: errorhandler@~1.3.5 - - deps: express-session@~1.10.4 - - deps: finalhandler@0.3.4 - - deps: method-override@~2.3.2 - - deps: morgan@~1.5.2 - - deps: qs@2.4.1 - - deps: serve-index@~1.6.3 - - deps: serve-static@~1.9.2 - - deps: type-is@~1.6.1 - * deps: debug@~2.1.3 - - Fix high intensity foreground color for bold - - deps: ms@0.7.0 - * deps: merge-descriptors@1.0.0 - * deps: proxy-addr@~1.0.7 - - deps: ipaddr.js@0.1.9 - * deps: send@0.12.2 - - Throw errors early for invalid `extensions` or `index` options - - deps: debug@~2.1.3 - -3.20.1 -====== - - * Fix `req.host` when using "trust proxy" hops count - * Fix `req.protocol`/`req.secure` when using "trust proxy" hops count - -3.20.0 -====== - - * Fix `"trust proxy"` setting to inherit when app is mounted - * Generate `ETag`s for all request responses - - No longer restricted to only responses for `GET` and `HEAD` requests - * Use `content-type` to parse `Content-Type` headers - * deps: connect@2.29.0 - - Use `content-type` to parse `Content-Type` headers - - deps: body-parser@~1.12.0 - - deps: compression@~1.4.1 - - deps: connect-timeout@~1.6.0 - - deps: cookie-parser@~1.3.4 - - deps: cookie-signature@1.0.6 - - deps: csurf@~1.7.0 - - deps: errorhandler@~1.3.4 - - deps: express-session@~1.10.3 - - deps: http-errors@~1.3.1 - - deps: response-time@~2.3.0 - - deps: serve-index@~1.6.2 - - deps: serve-static@~1.9.1 - - deps: type-is@~1.6.0 - * deps: cookie-signature@1.0.6 - * deps: send@0.12.1 - - Always read the stat size from the file - - Fix mutating passed-in `options` - - deps: mime@1.3.4 - -3.19.2 -====== - - * deps: connect@2.28.3 - - deps: compression@~1.3.1 - - deps: csurf@~1.6.6 - - deps: errorhandler@~1.3.3 - - deps: express-session@~1.10.2 - - deps: serve-index@~1.6.1 - - deps: type-is@~1.5.6 - * deps: proxy-addr@~1.0.6 - - deps: ipaddr.js@0.1.8 - -3.19.1 -====== - - * deps: connect@2.28.2 - - deps: body-parser@~1.10.2 - - deps: serve-static@~1.8.1 - * deps: send@0.11.1 - - Fix root path disclosure - -3.19.0 -====== - - * Fix `OPTIONS` responses to include the `HEAD` method property - * Use `readline` for prompt in `express(1)` - * deps: commander@2.6.0 - * deps: connect@2.28.1 - - deps: body-parser@~1.10.1 - - deps: compression@~1.3.0 - - deps: connect-timeout@~1.5.0 - - deps: csurf@~1.6.4 - - deps: debug@~2.1.1 - - deps: errorhandler@~1.3.2 - - deps: express-session@~1.10.1 - - deps: finalhandler@0.3.3 - - deps: method-override@~2.3.1 - - deps: morgan@~1.5.1 - - deps: serve-favicon@~2.2.0 - - deps: serve-index@~1.6.0 - - deps: serve-static@~1.8.0 - - deps: type-is@~1.5.5 - * deps: debug@~2.1.1 - * deps: methods@~1.1.1 - * deps: proxy-addr@~1.0.5 - - deps: ipaddr.js@0.1.6 - * deps: send@0.11.0 - - deps: debug@~2.1.1 - - deps: etag@~1.5.1 - - deps: ms@0.7.0 - - deps: on-finished@~2.2.0 - -3.18.6 -====== - - * Fix exception in `req.fresh`/`req.stale` without response headers - -3.18.5 -====== - - * deps: connect@2.27.6 - - deps: compression@~1.2.2 - - deps: express-session@~1.9.3 - - deps: http-errors@~1.2.8 - - deps: serve-index@~1.5.3 - - deps: type-is@~1.5.4 - -3.18.4 -====== - - * deps: connect@2.27.4 - - deps: body-parser@~1.9.3 - - deps: compression@~1.2.1 - - deps: errorhandler@~1.2.3 - - deps: express-session@~1.9.2 - - deps: qs@2.3.3 - - deps: serve-favicon@~2.1.7 - - deps: serve-static@~1.5.1 - - deps: type-is@~1.5.3 - * deps: etag@~1.5.1 - * deps: proxy-addr@~1.0.4 - - deps: ipaddr.js@0.1.5 - -3.18.3 -====== - - * deps: connect@2.27.3 - - Correctly invoke async callback asynchronously - - deps: csurf@~1.6.3 - -3.18.2 -====== - - * deps: connect@2.27.2 - - Fix handling of URLs containing `://` in the path - - deps: body-parser@~1.9.2 - - deps: qs@2.3.2 - -3.18.1 -====== - - * Fix internal `utils.merge` deprecation warnings - * deps: connect@2.27.1 - - deps: body-parser@~1.9.1 - - deps: express-session@~1.9.1 - - deps: finalhandler@0.3.2 - - deps: morgan@~1.4.1 - - deps: qs@2.3.0 - - deps: serve-static@~1.7.1 - * deps: send@0.10.1 - - deps: on-finished@~2.1.1 - -3.18.0 -====== - - * Use `content-disposition` module for `res.attachment`/`res.download` - - Sends standards-compliant `Content-Disposition` header - - Full Unicode support - * Use `etag` module to generate `ETag` headers - * deps: connect@2.27.0 - - Use `http-errors` module for creating errors - - Use `utils-merge` module for merging objects - - deps: body-parser@~1.9.0 - - deps: compression@~1.2.0 - - deps: connect-timeout@~1.4.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: express-session@~1.9.0 - - deps: finalhandler@0.3.1 - - deps: method-override@~2.3.0 - - deps: morgan@~1.4.0 - - deps: response-time@~2.2.0 - - deps: serve-favicon@~2.1.6 - - deps: serve-index@~1.5.0 - - deps: serve-static@~1.7.0 - * deps: debug@~2.1.0 - - Implement `DEBUG_FD` env variable support - * deps: depd@~1.0.0 - * deps: send@0.10.0 - - deps: debug@~2.1.0 - - deps: depd@~1.0.0 - - deps: etag@~1.5.0 - -3.17.8 -====== - - * deps: connect@2.26.6 - - deps: compression@~1.1.2 - - deps: csurf@~1.6.2 - - deps: errorhandler@~1.2.2 - -3.17.7 -====== - - * deps: connect@2.26.5 - - Fix accepting non-object arguments to `logger` - - deps: serve-static@~1.6.4 - -3.17.6 -====== - - * deps: connect@2.26.4 - - deps: morgan@~1.3.2 - - deps: type-is@~1.5.2 - -3.17.5 -====== - - * deps: connect@2.26.3 - - deps: body-parser@~1.8.4 - - deps: serve-favicon@~2.1.5 - - deps: serve-static@~1.6.3 - * deps: proxy-addr@~1.0.3 - - Use `forwarded` npm module - * deps: send@0.9.3 - - deps: etag@~1.4.0 - -3.17.4 -====== - - * deps: connect@2.26.2 - - deps: body-parser@~1.8.3 - - deps: qs@2.2.4 - -3.17.3 -====== - - * deps: proxy-addr@~1.0.2 - - Fix a global leak when multiple subnets are trusted - - deps: ipaddr.js@0.1.3 - -3.17.2 -====== - - * Use `crc` instead of `buffer-crc32` for speed - * deps: connect@2.26.1 - - deps: body-parser@~1.8.2 - - deps: depd@0.4.5 - - deps: express-session@~1.8.2 - - deps: morgan@~1.3.1 - - deps: serve-favicon@~2.1.3 - - deps: serve-static@~1.6.2 - * deps: depd@0.4.5 - * deps: send@0.9.2 - - deps: depd@0.4.5 - - deps: etag@~1.3.1 - - deps: range-parser@~1.0.2 - -3.17.1 -====== - - * Fix error in `req.subdomains` on empty host - -3.17.0 -====== - - * Support `X-Forwarded-Host` in `req.subdomains` - * Support IP address host in `req.subdomains` - * deps: connect@2.26.0 - - deps: body-parser@~1.8.1 - - deps: compression@~1.1.0 - - deps: connect-timeout@~1.3.0 - - deps: cookie-parser@~1.3.3 - - deps: cookie-signature@1.0.5 - - deps: csurf@~1.6.1 - - deps: debug@~2.0.0 - - deps: errorhandler@~1.2.0 - - deps: express-session@~1.8.1 - - deps: finalhandler@0.2.0 - - deps: fresh@0.2.4 - - deps: media-typer@0.3.0 - - deps: method-override@~2.2.0 - - deps: morgan@~1.3.0 - - deps: qs@2.2.3 - - deps: serve-favicon@~2.1.3 - - deps: serve-index@~1.2.1 - - deps: serve-static@~1.6.1 - - deps: type-is@~1.5.1 - - deps: vhost@~3.0.0 - * deps: cookie-signature@1.0.5 - * deps: debug@~2.0.0 - * deps: fresh@0.2.4 - * deps: media-typer@0.3.0 - - Throw error when parameter format invalid on parse - * deps: range-parser@~1.0.2 - * deps: send@0.9.1 - - Add `lastModified` option - - Use `etag` to generate `ETag` header - - deps: debug@~2.0.0 - - deps: fresh@0.2.4 - * deps: vary@~1.0.0 - - Accept valid `Vary` header string as `field` - -3.16.10 -====== - - * deps: connect@2.25.10 - - deps: serve-static@~1.5.4 - * deps: send@0.8.5 - - Fix a path traversal issue when using `root` - - Fix malicious path detection for empty string path - -3.16.9 -====== - - * deps: connect@2.25.9 - - deps: body-parser@~1.6.7 - - deps: qs@2.2.2 - -3.16.8 -====== - - * deps: connect@2.25.8 - - deps: body-parser@~1.6.6 - - deps: csurf@~1.4.1 - - deps: qs@2.2.0 - -3.16.7 -====== - - * deps: connect@2.25.7 - - deps: body-parser@~1.6.5 - - deps: express-session@~1.7.6 - - deps: morgan@~1.2.3 - - deps: serve-static@~1.5.3 - * deps: send@0.8.3 - - deps: destroy@1.0.3 - - deps: on-finished@2.1.0 - -3.16.6 -====== - - * deps: connect@2.25.6 - - deps: body-parser@~1.6.4 - - deps: qs@1.2.2 - - deps: serve-static@~1.5.2 - * deps: send@0.8.2 - - Work around `fd` leak in Node.js 0.10 for `fs.ReadStream` - -3.16.5 -====== - - * deps: connect@2.25.5 - - Fix backwards compatibility in `logger` - -3.16.4 -====== - - * Fix original URL parsing in `res.location` - * deps: connect@2.25.4 - - Fix `query` middleware breaking with argument - - deps: body-parser@~1.6.3 - - deps: compression@~1.0.11 - - deps: connect-timeout@~1.2.2 - - deps: express-session@~1.7.5 - - deps: method-override@~2.1.3 - - deps: on-headers@~1.0.0 - - deps: parseurl@~1.3.0 - - deps: qs@1.2.1 - - deps: response-time@~2.0.1 - - deps: serve-index@~1.1.6 - - deps: serve-static@~1.5.1 - * deps: parseurl@~1.3.0 - -3.16.3 -====== - - * deps: connect@2.25.3 - - deps: multiparty@3.3.2 - -3.16.2 -====== - - * deps: connect@2.25.2 - - deps: body-parser@~1.6.2 - - deps: qs@1.2.0 - -3.16.1 -====== - - * deps: connect@2.25.1 - - deps: body-parser@~1.6.1 - - deps: qs@1.1.0 - -3.16.0 -====== - - * deps: connect@2.25.0 - - deps: body-parser@~1.6.0 - - deps: compression@~1.0.10 - - deps: csurf@~1.4.0 - - deps: express-session@~1.7.4 - - deps: qs@1.0.2 - - deps: serve-static@~1.5.0 - * deps: send@0.8.1 - - Add `extensions` option - -3.15.3 -====== - - * fix `res.sendfile` regression for serving directory index files - * deps: connect@2.24.3 - - deps: serve-index@~1.1.5 - - deps: serve-static@~1.4.4 - * deps: send@0.7.4 - - Fix incorrect 403 on Windows and Node.js 0.11 - - Fix serving index files without root dir - -3.15.2 -====== - - * deps: connect@2.24.2 - - deps: body-parser@~1.5.2 - - deps: depd@0.4.4 - - deps: express-session@~1.7.2 - - deps: morgan@~1.2.2 - - deps: serve-static@~1.4.2 - * deps: depd@0.4.4 - - Work-around v8 generating empty stack traces - * deps: send@0.7.2 - - deps: depd@0.4.4 - -3.15.1 -====== - - * deps: connect@2.24.1 - - deps: body-parser@~1.5.1 - - deps: depd@0.4.3 - - deps: express-session@~1.7.1 - - deps: morgan@~1.2.1 - - deps: serve-index@~1.1.4 - - deps: serve-static@~1.4.1 - * deps: depd@0.4.3 - - Fix exception when global `Error.stackTraceLimit` is too low - * deps: send@0.7.1 - - deps: depd@0.4.3 - -3.15.0 -====== - - * Fix `req.protocol` for proxy-direct connections - * Pass options from `res.sendfile` to `send` - * deps: connect@2.24.0 - - deps: body-parser@~1.5.0 - - deps: compression@~1.0.9 - - deps: connect-timeout@~1.2.1 - - deps: debug@1.0.4 - - deps: depd@0.4.2 - - deps: express-session@~1.7.0 - - deps: finalhandler@0.1.0 - - deps: method-override@~2.1.2 - - deps: morgan@~1.2.0 - - deps: multiparty@3.3.1 - - deps: parseurl@~1.2.0 - - deps: serve-static@~1.4.0 - * deps: debug@1.0.4 - * deps: depd@0.4.2 - - Add `TRACE_DEPRECATION` environment variable - - Remove non-standard grey color from color output - - Support `--no-deprecation` argument - - Support `--trace-deprecation` argument - * deps: parseurl@~1.2.0 - - Cache URLs based on original value - - Remove no-longer-needed URL mis-parse work-around - - Simplify the "fast-path" `RegExp` - * deps: send@0.7.0 - - Add `dotfiles` option - - Cap `maxAge` value to 1 year - - deps: debug@1.0.4 - - deps: depd@0.4.2 - -3.14.0 -====== - - * add explicit "Rosetta Flash JSONP abuse" protection - - previous versions are not vulnerable; this is just explicit protection - * deprecate `res.redirect(url, status)` -- use `res.redirect(status, url)` instead - * fix `res.send(status, num)` to send `num` as json (not error) - * remove unnecessary escaping when `res.jsonp` returns JSON response - * deps: basic-auth@1.0.0 - - support empty password - - support empty username - * deps: connect@2.23.0 - - deps: debug@1.0.3 - - deps: express-session@~1.6.4 - - deps: method-override@~2.1.0 - - deps: parseurl@~1.1.3 - - deps: serve-static@~1.3.1 - * deps: debug@1.0.3 - - Add support for multiple wildcards in namespaces - * deps: methods@1.1.0 - - add `CONNECT` - * deps: parseurl@~1.1.3 - - faster parsing of href-only URLs - -3.13.0 -====== - - * add deprecation message to `app.configure` - * add deprecation message to `req.auth` - * use `basic-auth` to parse `Authorization` header - * deps: connect@2.22.0 - - deps: csurf@~1.3.0 - - deps: express-session@~1.6.1 - - deps: multiparty@3.3.0 - - deps: serve-static@~1.3.0 - * deps: send@0.5.0 - - Accept string for `maxage` (converted by `ms`) - - Include link in default redirect response - -3.12.1 -====== - - * deps: connect@2.21.1 - - deps: cookie-parser@1.3.2 - - deps: cookie-signature@1.0.4 - - deps: express-session@~1.5.2 - - deps: type-is@~1.3.2 - * deps: cookie-signature@1.0.4 - - fix for timing attacks - -3.12.0 -====== - - * use `media-typer` to alter content-type charset - * deps: connect@2.21.0 - - deprecate `connect(middleware)` -- use `app.use(middleware)` instead - - deprecate `connect.createServer()` -- use `connect()` instead - - fix `res.setHeader()` patch to work with get -> append -> set pattern - - deps: compression@~1.0.8 - - deps: errorhandler@~1.1.1 - - deps: express-session@~1.5.0 - - deps: serve-index@~1.1.3 - -3.11.0 -====== - - * deprecate things with `depd` module - * deps: buffer-crc32@0.2.3 - * deps: connect@2.20.2 - - deprecate `verify` option to `json` -- use `body-parser` npm module instead - - deprecate `verify` option to `urlencoded` -- use `body-parser` npm module instead - - deprecate things with `depd` module - - use `finalhandler` for final response handling - - use `media-typer` to parse `content-type` for charset - - deps: body-parser@1.4.3 - - deps: connect-timeout@1.1.1 - - deps: cookie-parser@1.3.1 - - deps: csurf@1.2.2 - - deps: errorhandler@1.1.0 - - deps: express-session@1.4.0 - - deps: multiparty@3.2.9 - - deps: serve-index@1.1.2 - - deps: type-is@1.3.1 - - deps: vhost@2.0.0 - -3.10.5 -====== - - * deps: connect@2.19.6 - - deps: body-parser@1.3.1 - - deps: compression@1.0.7 - - deps: debug@1.0.2 - - deps: serve-index@1.1.1 - - deps: serve-static@1.2.3 - * deps: debug@1.0.2 - * deps: send@0.4.3 - - Do not throw uncatchable error on file open race condition - - Use `escape-html` for HTML escaping - - deps: debug@1.0.2 - - deps: finished@1.2.2 - - deps: fresh@0.2.2 - -3.10.4 -====== - - * deps: connect@2.19.5 - - fix "event emitter leak" warnings - - deps: csurf@1.2.1 - - deps: debug@1.0.1 - - deps: serve-static@1.2.2 - - deps: type-is@1.2.1 - * deps: debug@1.0.1 - * deps: send@0.4.2 - - fix "event emitter leak" warnings - - deps: finished@1.2.1 - - deps: debug@1.0.1 - -3.10.3 -====== - - * use `vary` module for `res.vary` - * deps: connect@2.19.4 - - deps: errorhandler@1.0.2 - - deps: method-override@2.0.2 - - deps: serve-favicon@2.0.1 - * deps: debug@1.0.0 - -3.10.2 -====== - - * deps: connect@2.19.3 - - deps: compression@1.0.6 - -3.10.1 -====== - - * deps: connect@2.19.2 - - deps: compression@1.0.4 - * deps: proxy-addr@1.0.1 - -3.10.0 -====== - - * deps: connect@2.19.1 - - deprecate `methodOverride()` -- use `method-override` npm module instead - - deps: body-parser@1.3.0 - - deps: method-override@2.0.1 - - deps: multiparty@3.2.8 - - deps: response-time@2.0.0 - - deps: serve-static@1.2.1 - * deps: methods@1.0.1 - * deps: send@0.4.1 - - Send `max-age` in `Cache-Control` in correct format - -3.9.0 -====== - - * custom etag control with `app.set('etag', val)` - - `app.set('etag', function(body, encoding){ return '"etag"' })` custom etag generation - - `app.set('etag', 'weak')` weak tag - - `app.set('etag', 'strong')` strong etag - - `app.set('etag', false)` turn off - - `app.set('etag', true)` standard etag - * Include ETag in HEAD requests - * mark `res.send` ETag as weak and reduce collisions - * update connect to 2.18.0 - - deps: compression@1.0.3 - - deps: serve-index@1.1.0 - - deps: serve-static@1.2.0 - * update send to 0.4.0 - - Calculate ETag with md5 for reduced collisions - - Ignore stream errors after request ends - - deps: debug@0.8.1 - -3.8.1 -====== - - * update connect to 2.17.3 - - deps: body-parser@1.2.2 - - deps: express-session@1.2.1 - - deps: method-override@1.0.2 - -3.8.0 -====== - - * keep previous `Content-Type` for `res.jsonp` - * set proper `charset` in `Content-Type` for `res.send` - * update connect to 2.17.1 - - fix `res.charset` appending charset when `content-type` has one - - deps: express-session@1.2.0 - - deps: morgan@1.1.1 - - deps: serve-index@1.0.3 - -3.7.0 -====== - - * proper proxy trust with `app.set('trust proxy', trust)` - - `app.set('trust proxy', 1)` trust first hop - - `app.set('trust proxy', 'loopback')` trust loopback addresses - - `app.set('trust proxy', '10.0.0.1')` trust single IP - - `app.set('trust proxy', '10.0.0.1/16')` trust subnet - - `app.set('trust proxy', '10.0.0.1, 10.0.0.2')` trust list - - `app.set('trust proxy', false)` turn off - - `app.set('trust proxy', true)` trust everything - * update connect to 2.16.2 - - deprecate `res.headerSent` -- use `res.headersSent` - - deprecate `res.on("header")` -- use on-headers module instead - - fix edge-case in `res.appendHeader` that would append in wrong order - - json: use body-parser - - urlencoded: use body-parser - - dep: bytes@1.0.0 - - dep: cookie-parser@1.1.0 - - dep: csurf@1.2.0 - - dep: express-session@1.1.0 - - dep: method-override@1.0.1 - -3.6.0 -====== - - * deprecate `app.del()` -- use `app.delete()` instead - * deprecate `res.json(obj, status)` -- use `res.json(status, obj)` instead - - the edge-case `res.json(status, num)` requires `res.status(status).json(num)` - * deprecate `res.jsonp(obj, status)` -- use `res.jsonp(status, obj)` instead - - the edge-case `res.jsonp(status, num)` requires `res.status(status).jsonp(num)` - * support PURGE method - - add `app.purge` - - add `router.purge` - - include PURGE in `app.all` - * update connect to 2.15.0 - * Add `res.appendHeader` - * Call error stack even when response has been sent - * Patch `res.headerSent` to return Boolean - * Patch `res.headersSent` for node.js 0.8 - * Prevent default 404 handler after response sent - * dep: compression@1.0.2 - * dep: connect-timeout@1.1.0 - * dep: debug@^0.8.0 - * dep: errorhandler@1.0.1 - * dep: express-session@1.0.4 - * dep: morgan@1.0.1 - * dep: serve-favicon@2.0.0 - * dep: serve-index@1.0.2 - * update debug to 0.8.0 - * add `enable()` method - * change from stderr to stdout - * update methods to 1.0.0 - - add PURGE - * update mkdirp to 0.5.0 - -3.5.3 -====== - - * fix `req.host` for IPv6 literals - * fix `res.jsonp` error if callback param is object - -3.5.2 -====== - - * update connect to 2.14.5 - * update cookie to 0.1.2 - * update mkdirp to 0.4.0 - * update send to 0.3.0 - -3.5.1 -====== - - * pin less-middleware in generated app - -3.5.0 -====== - - * bump deps - -3.4.8 -====== - - * prevent incorrect automatic OPTIONS responses #1868 @dpatti - * update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi - * throw 400 in case of malformed paths @rlidwka - -3.4.7 -====== - - * update connect - -3.4.6 -====== - - * update connect (raw-body) - -3.4.5 -====== - - * update connect - * res.location: remove leading ./ #1802 @kapouer - * res.redirect: fix `res.redirect('toString') #1829 @michaelficarra - * res.send: always send ETag when content-length > 0 - * router: add Router.all() method - -3.4.4 -====== - - * update connect - * update supertest - * update methods - * express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04 - -3.4.3 -====== - - * update connect - -3.4.2 -====== - - * update connect - * downgrade commander - -3.4.1 -====== - - * update connect - * update commander - * jsonp: check if callback is a function - * router: wrap encodeURIComponent in a try/catch #1735 (@lxe) - * res.format: now includes charset @1747 (@sorribas) - * res.links: allow multiple calls @1746 (@sorribas) - -3.4.0 -====== - - * add res.vary(). Closes #1682 - * update connect - -3.3.8 -====== - - * update connect - -3.3.7 -====== - - * update connect - -3.3.6 -====== - - * Revert "remove charset from json responses. Closes #1631" (causes issues in some clients) - * add: req.accepts take an argument list - -3.3.4 -====== - - * update send and connect - -3.3.3 -====== - - * update connect - -3.3.2 -====== - - * update connect - * update send - * remove .version export - -3.3.1 -====== - - * update connect - -3.3.0 -====== - - * update connect - * add support for multiple X-Forwarded-Proto values. Closes #1646 - * change: remove charset from json responses. Closes #1631 - * change: return actual booleans from req.accept* functions - * fix jsonp callback array throw - -3.2.6 -====== - - * update connect - -3.2.5 -====== - - * update connect - * update node-cookie - * add: throw a meaningful error when there is no default engine - * change generation of ETags with res.send() to GET requests only. Closes #1619 - -3.2.4 -====== - - * fix `req.subdomains` when no Host is present - * fix `req.host` when no Host is present, return undefined - -3.2.3 -====== - - * update connect / qs - -3.2.2 -====== - - * update qs - -3.2.1 -====== - - * add app.VERB() paths array deprecation warning - * update connect - * update qs and remove all ~ semver crap - * fix: accept number as value of Signed Cookie - -3.2.0 -====== - - * add "view" constructor setting to override view behaviour - * add req.acceptsEncoding(name) - * add req.acceptedEncodings - * revert cookie signature change causing session race conditions - * fix sorting of Accept values of the same quality - -3.1.2 -====== - - * add support for custom Accept parameters - * update cookie-signature - -3.1.1 -====== - - * add X-Forwarded-Host support to `req.host` - * fix relative redirects - * update mkdirp - * update buffer-crc32 - * remove legacy app.configure() method from app template. - -3.1.0 -====== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 -====== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 -====== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 -====== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 -====== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 -====== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 -====== - - * update connect - -3.0.0 -====== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 -====== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 -====== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 -====== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 -====== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 -====== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 -====== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 -====== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 -====== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 -====== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 -====== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Closes #1165 - -3.0.0beta2 -====== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 -====== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 -====== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 -====== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 -====== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 -====== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 -====== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delimited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9 -====== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 -====== - - * Update mkdirp dep. Closes #991 - -2.5.7 -====== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 -====== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 -====== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 -====== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 -====== - - * Fixed `req.is()` when a charset is present - -2.5.2 -====== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 -====== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 -====== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 -====== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 -====== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 -====== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 -====== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 -====== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. -====== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 -====== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 -====== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 -====== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 -====== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 -====== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 -====== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 -====== - - * Fixed `app.options()` - -2.3.7 -====== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 -====== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 -====== - - * Added export `.view` as alias for `.View` - -2.3.4 -====== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 -====== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 -====== - - * Fixed view hints - -2.3.1 -====== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 -====== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 -====== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 -====== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 -====== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 -====== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 -====== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 -====== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 -====== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 -====== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc -====== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 -====== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 -====== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta -====== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 -====== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 -====== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 -====== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 -====== - - * Added secret to generated app `session()` call - -1.0.4 -====== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 -====== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 -====== - - * Removed nested require, using `connect.router` - -1.0.1 -====== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 -====== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 -====== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 -====== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 -====== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc -====== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 -====== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta -====== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 -====== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 -====== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using charset utf-8 - * Fixed show-exceptions page, now using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 -====== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie compilation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 -====== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 -====== - - * Fixed binary uploads. - -0.10.0 -====== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'). - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error response support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 -====== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc.) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 -====== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 -====== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 -====== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 -====== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 -====== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 -====== - - * Fixed GIT submodules (HAH!) - -0.7.1 -====== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 -====== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 -====== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 -====== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 -====== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 -====== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 -====== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multipart file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 -====== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 -====== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 -====== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independent specs for those who can't build deps. Closes #127 - * Fixed issues introduced by the node url module changes. Closes 126. - * Fixed two assertions failing due to Collection#keys() returning strings - * Fixed faulty Collection#toArray() spec due to keys() returning strings - * Fixed `make test` now builds libxmljs.node before testing - -0.0.1 -====== - - * Initial release diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/LICENSE b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/LICENSE deleted file mode 100644 index aa927e44..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2014 TJ Holowaychuk -Copyright (c) 2013-2014 Roman Shtylman -Copyright (c) 2014-2015 Douglas Christopher Wilson - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/Readme.md b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/Readme.md deleted file mode 100644 index bc108d55..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/Readme.md +++ /dev/null @@ -1,260 +0,0 @@ -[![Express Logo](https://i.cloudup.com/zfY6lL7eFa-3000x3000.png)](http://expressjs.com/) - -**Fast, unopinionated, minimalist web framework for [Node.js](http://nodejs.org).** - -**This project has a [Code of Conduct][].** - -## Table of contents - -* [Installation](#Installation) -* [Features](#Features) -* [Docs & Community](#docs--community) -* [Quick Start](#Quick-Start) -* [Running Tests](#Running-Tests) -* [Philosophy](#Philosophy) -* [Examples](#Examples) -* [Contributing to Express](#Contributing) -* [TC (Technical Committee)](#tc-technical-committee) -* [Triagers](#triagers) -* [License](#license) - - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Install Size][npm-install-size-image]][npm-install-size-url] -[![NPM Downloads][npm-downloads-image]][npm-downloads-url] -[![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] - - -```js -const express = require('express') -const app = express() - -app.get('/', function (req, res) { - res.send('Hello World') -}) - -app.listen(3000) -``` - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). - -Before installing, [download and install Node.js](https://nodejs.org/en/download/). -Node.js 0.10 or higher is required. - -If this is a brand new project, make sure to create a `package.json` first with -the [`npm init` command](https://docs.npmjs.com/creating-a-package-json-file). - -Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```console -$ npm install express -``` - -Follow [our installing guide](http://expressjs.com/en/starter/installing.html) -for more information. - -## Features - - * Robust routing - * Focus on high performance - * Super-high test coverage - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Executable for generating applications quickly - -## Docs & Community - - * [Website and Documentation](http://expressjs.com/) - [[website repo](https://github.com/expressjs/expressjs.com)] - * [#express](https://web.libera.chat/#express) on [Libera Chat](https://libera.chat) IRC - * [GitHub Organization](https://github.com/expressjs) for Official Middleware & Modules - * Visit the [Wiki](https://github.com/expressjs/express/wiki) - * [Google Group](https://groups.google.com/group/express-js) for discussion - * [Gitter](https://gitter.im/expressjs/express) for support and discussion - -**PROTIP** Be sure to read [Migrating from 3.x to 4.x](https://github.com/expressjs/express/wiki/Migrating-from-3.x-to-4.x) as well as [New features in 4.x](https://github.com/expressjs/express/wiki/New-features-in-4.x). - -## Quick Start - - The quickest way to get started with express is to utilize the executable [`express(1)`](https://github.com/expressjs/generator) to generate an application as shown below: - - Install the executable. The executable's major version will match Express's: - -```console -$ npm install -g express-generator@4 -``` - - Create the app: - -```console -$ express /tmp/foo && cd /tmp/foo -``` - - Install dependencies: - -```console -$ npm install -``` - - Start the server: - -```console -$ npm start -``` - - View the website at: http://localhost:3000 - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers, making - it a great solution for single page applications, websites, hybrids, or public - HTTP APIs. - - Express does not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](https://github.com/tj/consolidate.js), - you can quickly craft your perfect framework. - -## Examples - - To view the examples, clone the Express repo and install the dependencies: - -```console -$ git clone https://github.com/expressjs/express.git --depth 1 -$ cd express -$ npm install -``` - - Then run whichever example you want: - -```console -$ node examples/content-negotiation -``` - -## Contributing - - [![Linux Build][github-actions-ci-image]][github-actions-ci-url] - [![Windows Build][appveyor-image]][appveyor-url] - [![Test Coverage][coveralls-image]][coveralls-url] - -The Express.js project welcomes all constructive contributions. Contributions take many forms, -from code for bug fixes and enhancements, to additions and fixes to documentation, additional -tests, triaging incoming pull requests and issues, and more! - -See the [Contributing Guide](Contributing.md) for more technical details on contributing. - -### Security Issues - -If you discover a security vulnerability in Express, please see [Security Policies and Procedures](Security.md). - -### Running Tests - -To run the test suite, first install the dependencies, then run `npm test`: - -```console -$ npm install -$ npm test -``` - -## People - -The original author of Express is [TJ Holowaychuk](https://github.com/tj) - -[List of all contributors](https://github.com/expressjs/express/graphs/contributors) - -### TC (Technical Committee) - -* [UlisesGascon](https://github.com/UlisesGascon) - **Ulises Gascón** (he/him) -* [jonchurch](https://github.com/jonchurch) - **Jon Church** -* [wesleytodd](https://github.com/wesleytodd) - **Wes Todd** -* [LinusU](https://github.com/LinusU) - **Linus Unnebäck** -* [blakeembrey](https://github.com/blakeembrey) - **Blake Embrey** -* [sheplu](https://github.com/sheplu) - **Jean Burellier** -* [crandmck](https://github.com/crandmck) - **Rand McKinney** -* [ctcpip](https://github.com/ctcpip) - **Chris de Almeida** - -
-TC emeriti members - -#### TC emeriti members - - * [dougwilson](https://github.com/dougwilson) - **Douglas Wilson** - * [hacksparrow](https://github.com/hacksparrow) - **Hage Yaapa** - * [jonathanong](https://github.com/jonathanong) - **jongleberry** - * [niftylettuce](https://github.com/niftylettuce) - **niftylettuce** - * [troygoode](https://github.com/troygoode) - **Troy Goode** -
- - -### Triagers - -* [aravindvnair99](https://github.com/aravindvnair99) - **Aravind Nair** -* [carpasse](https://github.com/carpasse) - **Carlos Serrano** -* [CBID2](https://github.com/CBID2) - **Christine Belzie** -* [enyoghasim](https://github.com/enyoghasim) - **David Enyoghasim** -* [UlisesGascon](https://github.com/UlisesGascon) - **Ulises Gascón** (he/him) -* [mertcanaltin](https://github.com/mertcanaltin) - **Mert Can Altin** -* [0ss](https://github.com/0ss) - **Salah** -* [import-brain](https://github.com/import-brain) - **Eric Cheng** (he/him) -* [3imed-jaberi](https://github.com/3imed-jaberi) - **Imed Jaberi** -* [dakshkhetan](https://github.com/dakshkhetan) - **Daksh Khetan** (he/him) -* [lucasraziel](https://github.com/lucasraziel) - **Lucas Soares Do Rego** -* [IamLizu](https://github.com/IamLizu) - **S M Mahmudul Hasan** (he/him) -* [Sushmeet](https://github.com/Sushmeet) - **Sushmeet Sunger** - -
-Triagers emeriti members - -#### Emeritus Triagers - - * [AuggieH](https://github.com/AuggieH) - **Auggie Hudak** - * [G-Rath](https://github.com/G-Rath) - **Gareth Jones** - * [MohammadXroid](https://github.com/MohammadXroid) - **Mohammad Ayashi** - * [NawafSwe](https://github.com/NawafSwe) - **Nawaf Alsharqi** - * [NotMoni](https://github.com/NotMoni) - **Moni** - * [VigneshMurugan](https://github.com/VigneshMurugan) - **Vignesh Murugan** - * [davidmashe](https://github.com/davidmashe) - **David Ashe** - * [digitaIfabric](https://github.com/digitaIfabric) - **David** - * [e-l-i-s-e](https://github.com/e-l-i-s-e) - **Elise Bonner** - * [fed135](https://github.com/fed135) - **Frederic Charette** - * [firmanJS](https://github.com/firmanJS) - **Firman Abdul Hakim** - * [getspooky](https://github.com/getspooky) - **Yasser Ameur** - * [ghinks](https://github.com/ghinks) - **Glenn** - * [ghousemohamed](https://github.com/ghousemohamed) - **Ghouse Mohamed** - * [gireeshpunathil](https://github.com/gireeshpunathil) - **Gireesh Punathil** - * [jake32321](https://github.com/jake32321) - **Jake Reed** - * [jonchurch](https://github.com/jonchurch) - **Jon Church** - * [lekanikotun](https://github.com/lekanikotun) - **Troy Goode** - * [marsonya](https://github.com/marsonya) - **Lekan Ikotun** - * [mastermatt](https://github.com/mastermatt) - **Matt R. Wilson** - * [maxakuru](https://github.com/maxakuru) - **Max Edell** - * [mlrawlings](https://github.com/mlrawlings) - **Michael Rawlings** - * [rodion-arr](https://github.com/rodion-arr) - **Rodion Abdurakhimov** - * [sheplu](https://github.com/sheplu) - **Jean Burellier** - * [tarunyadav1](https://github.com/tarunyadav1) - **Tarun yadav** - * [tunniclm](https://github.com/tunniclm) - **Mike Tunnicliffe** -
- - -## License - - [MIT](LICENSE) - -[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/express/master?label=windows -[appveyor-url]: https://ci.appveyor.com/project/dougwilson/express -[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/express/master -[coveralls-url]: https://coveralls.io/r/expressjs/express?branch=master -[github-actions-ci-image]: https://badgen.net/github/checks/expressjs/express/master?label=linux -[github-actions-ci-url]: https://github.com/expressjs/express/actions/workflows/ci.yml -[npm-downloads-image]: https://badgen.net/npm/dm/express -[npm-downloads-url]: https://npmcharts.com/compare/express?minimal=true -[npm-install-size-image]: https://badgen.net/packagephobia/install/express -[npm-install-size-url]: https://packagephobia.com/result?p=express -[npm-url]: https://npmjs.org/package/express -[npm-version-image]: https://badgen.net/npm/v/express -[ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/express/badge -[ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/express -[Code of Conduct]: https://github.com/expressjs/express/blob/master/Code-Of-Conduct.md diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/index.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/index.js deleted file mode 100644 index d219b0c8..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -module.exports = require('./lib/express'); diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/application.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/application.js deleted file mode 100644 index ebb30b51..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/application.js +++ /dev/null @@ -1,661 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var finalhandler = require('finalhandler'); -var Router = require('./router'); -var methods = require('methods'); -var middleware = require('./middleware/init'); -var query = require('./middleware/query'); -var debug = require('debug')('express:application'); -var View = require('./view'); -var http = require('http'); -var compileETag = require('./utils').compileETag; -var compileQueryParser = require('./utils').compileQueryParser; -var compileTrust = require('./utils').compileTrust; -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var merge = require('utils-merge'); -var resolve = require('path').resolve; -var setPrototypeOf = require('setprototypeof') - -/** - * Module variables. - * @private - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty -var slice = Array.prototype.slice; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Variable for trust proxy inheritance back-compat - * @private - */ - -var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @private - */ - -app.init = function init() { - this.cache = {}; - this.engines = {}; - this.settings = {}; - - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * @private - */ - -app.defaultConfiguration = function defaultConfiguration() { - var env = process.env.NODE_ENV || 'development'; - - // default settings - this.enable('x-powered-by'); - this.set('etag', 'weak'); - this.set('env', env); - this.set('query parser', 'extended'); - this.set('subdomain offset', 2); - this.set('trust proxy', false); - - // trust proxy inherit back-compat - Object.defineProperty(this.settings, trustProxyDefaultSymbol, { - configurable: true, - value: true - }); - - debug('booting in %s mode', env); - - this.on('mount', function onmount(parent) { - // inherit trust proxy - if (this.settings[trustProxyDefaultSymbol] === true - && typeof parent.settings['trust proxy fn'] === 'function') { - delete this.settings['trust proxy']; - delete this.settings['trust proxy fn']; - } - - // inherit protos - setPrototypeOf(this.request, parent.request) - setPrototypeOf(this.response, parent.response) - setPrototypeOf(this.engines, parent.engines) - setPrototypeOf(this.settings, parent.settings) - }); - - // setup locals - this.locals = Object.create(null); - - // top-most app is mounted at / - this.mountpath = '/'; - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('view', View); - this.set('views', resolve('views')); - this.set('jsonp callback name', 'callback'); - - if (env === 'production') { - this.enable('view cache'); - } - - Object.defineProperty(this, 'router', { - get: function() { - throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); - } - }); -}; - -/** - * lazily adds the base router if it has not yet been added. - * - * We cannot add the base router in the defaultConfiguration because - * it reads app settings which might be set after that has run. - * - * @private - */ -app.lazyrouter = function lazyrouter() { - if (!this._router) { - this._router = new Router({ - caseSensitive: this.enabled('case sensitive routing'), - strict: this.enabled('strict routing') - }); - - this._router.use(query(this.get('query parser fn'))); - this._router.use(middleware.init(this)); - } -}; - -/** - * Dispatch a req, res pair into the application. Starts pipeline processing. - * - * If no callback is provided, then default error handlers will respond - * in the event of an error bubbling through the stack. - * - * @private - */ - -app.handle = function handle(req, res, callback) { - var router = this._router; - - // final handler - var done = callback || finalhandler(req, res, { - env: this.get('env'), - onerror: logerror.bind(this) - }); - - // no routes - if (!router) { - debug('no routes defined on app'); - done(); - return; - } - - router.handle(req, res, done); -}; - -/** - * Proxy `Router#use()` to add middleware to the app router. - * See Router#use() documentation for details. - * - * If the _fn_ parameter is an express app, then it will be - * mounted at the _route_ specified. - * - * @public - */ - -app.use = function use(fn) { - var offset = 0; - var path = '/'; - - // default path to '/' - // disambiguate app.use([fn]) - if (typeof fn !== 'function') { - var arg = fn; - - while (Array.isArray(arg) && arg.length !== 0) { - arg = arg[0]; - } - - // first arg is the path - if (typeof arg !== 'function') { - offset = 1; - path = fn; - } - } - - var fns = flatten(slice.call(arguments, offset)); - - if (fns.length === 0) { - throw new TypeError('app.use() requires a middleware function') - } - - // setup router - this.lazyrouter(); - var router = this._router; - - fns.forEach(function (fn) { - // non-express app - if (!fn || !fn.handle || !fn.set) { - return router.use(path, fn); - } - - debug('.use app under %s', path); - fn.mountpath = path; - fn.parent = this; - - // restore .app property on req and res - router.use(path, function mounted_app(req, res, next) { - var orig = req.app; - fn.handle(req, res, function (err) { - setPrototypeOf(req, orig.request) - setPrototypeOf(res, orig.response) - next(err); - }); - }); - - // mounted an app - fn.emit('mount', this); - }, this); - - return this; -}; - -/** - * Proxy to the app `Router#route()` - * Returns a new `Route` instance for the _path_. - * - * Routes are isolated middleware stacks for specific paths. - * See the Route api docs for details. - * - * @public - */ - -app.route = function route(path) { - this.lazyrouter(); - return this._router.route(path); -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.ejs" file Express will invoke the following internally: - * - * app.engine('ejs', require('ejs').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you don't need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/tj/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seamlessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -app.engine = function engine(ext, fn) { - if (typeof fn !== 'function') { - throw new Error('callback function required'); - } - - // get file extension - var extension = ext[0] !== '.' - ? '.' + ext - : ext; - - // store engine - this.engines[extension] = fn; - - return this; -}; - -/** - * Proxy to `Router#param()` with one added api feature. The _name_ parameter - * can be an array of names. - * - * See the Router#param() docs for more details. - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -app.param = function param(name, fn) { - this.lazyrouter(); - - if (Array.isArray(name)) { - for (var i = 0; i < name.length; i++) { - this.param(name[i], fn); - } - - return this; - } - - this._router.param(name, fn); - - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.set('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {*} [val] - * @return {Server} for chaining - * @public - */ - -app.set = function set(setting, val) { - if (arguments.length === 1) { - // app.get(setting) - var settings = this.settings - - while (settings && settings !== Object.prototype) { - if (hasOwnProperty.call(settings, setting)) { - return settings[setting] - } - - settings = Object.getPrototypeOf(settings) - } - - return undefined - } - - debug('set "%s" to %o', setting, val); - - // set value - this.settings[setting] = val; - - // trigger matched settings - switch (setting) { - case 'etag': - this.set('etag fn', compileETag(val)); - break; - case 'query parser': - this.set('query parser fn', compileQueryParser(val)); - break; - case 'trust proxy': - this.set('trust proxy fn', compileTrust(val)); - - // trust proxy inherit back-compat - Object.defineProperty(this.settings, trustProxyDefaultSymbol, { - configurable: true, - value: false - }); - - break; - } - - return this; -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @private - */ - -app.path = function path() { - return this.parent - ? this.parent.path() + this.mountpath - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @public - */ - -app.enabled = function enabled(setting) { - return Boolean(this.set(setting)); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @public - */ - -app.disabled = function disabled(setting) { - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @public - */ - -app.enable = function enable(setting) { - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @public - */ - -app.disable = function disable(setting) { - return this.set(setting, false); -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if (method === 'get' && arguments.length === 1) { - // app.get(setting) - return this.set(path); - } - - this.lazyrouter(); - - var route = this._router.route(path); - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @public - */ - -app.all = function all(path) { - this.lazyrouter(); - - var route = this._router.route(path); - var args = slice.call(arguments, 1); - - for (var i = 0; i < methods.length; i++) { - route[methods[i]].apply(route, args); - } - - return this; -}; - -// del -> delete alias - -app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {Object|Function} options or fn - * @param {Function} callback - * @public - */ - -app.render = function render(name, options, callback) { - var cache = this.cache; - var done = callback; - var engines = this.engines; - var opts = options; - var renderOptions = {}; - var view; - - // support callback function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // merge app.locals - merge(renderOptions, this.locals); - - // merge options._locals - if (opts._locals) { - merge(renderOptions, opts._locals); - } - - // merge options - merge(renderOptions, opts); - - // set .cache unless explicitly provided - if (renderOptions.cache == null) { - renderOptions.cache = this.enabled('view cache'); - } - - // primed cache - if (renderOptions.cache) { - view = cache[name]; - } - - // view - if (!view) { - var View = this.get('view'); - - view = new View(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var dirs = Array.isArray(view.root) && view.root.length > 1 - ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"' - : 'directory "' + view.root + '"' - var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs); - err.view = view; - return done(err); - } - - // prime the cache - if (renderOptions.cache) { - cache[name] = view; - } - } - - // render - tryRender(view, renderOptions, done); -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @public - */ - -app.listen = function listen() { - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; - -/** - * Log error using console.error. - * - * @param {Error} err - * @private - */ - -function logerror(err) { - /* istanbul ignore next */ - if (this.get('env') !== 'test') console.error(err.stack || err.toString()); -} - -/** - * Try rendering a view. - * @private - */ - -function tryRender(view, options, callback) { - try { - view.render(options, callback); - } catch (err) { - callback(err); - } -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/express.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/express.js deleted file mode 100644 index d188a16d..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/express.js +++ /dev/null @@ -1,116 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - */ - -var bodyParser = require('body-parser') -var EventEmitter = require('events').EventEmitter; -var mixin = require('merge-descriptors'); -var proto = require('./application'); -var Route = require('./router/route'); -var Router = require('./router'); -var req = require('./request'); -var res = require('./response'); - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = function(req, res, next) { - app.handle(req, res, next); - }; - - mixin(app, EventEmitter.prototype, false); - mixin(app, proto, false); - - // expose the prototype that will get set on requests - app.request = Object.create(req, { - app: { configurable: true, enumerable: true, writable: true, value: app } - }) - - // expose the prototype that will get set on responses - app.response = Object.create(res, { - app: { configurable: true, enumerable: true, writable: true, value: app } - }) - - app.init(); - return app; -} - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -/** - * Expose middleware - */ - -exports.json = bodyParser.json -exports.query = require('./middleware/query'); -exports.raw = bodyParser.raw -exports.static = require('serve-static'); -exports.text = bodyParser.text -exports.urlencoded = bodyParser.urlencoded - -/** - * Replace removed middleware with an appropriate error message. - */ - -var removedMiddlewares = [ - 'bodyParser', - 'compress', - 'cookieSession', - 'session', - 'logger', - 'cookieParser', - 'favicon', - 'responseTime', - 'errorHandler', - 'timeout', - 'methodOverride', - 'vhost', - 'csrf', - 'directory', - 'limit', - 'multipart', - 'staticCache' -] - -removedMiddlewares.forEach(function (name) { - Object.defineProperty(exports, name, { - get: function () { - throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); - }, - configurable: true - }); -}); diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/middleware/init.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/middleware/init.js deleted file mode 100644 index dfd04274..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/middleware/init.js +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var setPrototypeOf = require('setprototypeof') - -/** - * Initialization middleware, exposing the - * request and response to each other, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - setPrototypeOf(req, app.request) - setPrototypeOf(res, app.response) - - res.locals = res.locals || Object.create(null); - - next(); - }; -}; - diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/middleware/query.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/middleware/query.js deleted file mode 100644 index 7e916694..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/middleware/query.js +++ /dev/null @@ -1,47 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - */ - -var merge = require('utils-merge') -var parseUrl = require('parseurl'); -var qs = require('qs'); - -/** - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options) { - var opts = merge({}, options) - var queryparse = qs.parse; - - if (typeof options === 'function') { - queryparse = options; - opts = undefined; - } - - if (opts !== undefined && opts.allowPrototypes === undefined) { - // back-compat for qs module - opts.allowPrototypes = true; - } - - return function query(req, res, next){ - if (!req.query) { - var val = parseUrl(req).query; - req.query = queryparse(val, opts); - } - - next(); - }; -}; diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/request.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/request.js deleted file mode 100644 index e33262f2..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/request.js +++ /dev/null @@ -1,525 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var accepts = require('accepts'); -var deprecate = require('depd')('express'); -var isIP = require('net').isIP; -var typeis = require('type-is'); -var http = require('http'); -var fresh = require('fresh'); -var parseRange = require('range-parser'); -var parse = require('parseurl'); -var proxyaddr = require('proxy-addr'); - -/** - * Request prototype. - * @public - */ - -var req = Object.create(http.IncomingMessage.prototype) - -/** - * Module exports. - * @public - */ - -module.exports = req - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @public - */ - -req.get = -req.header = function header(name) { - if (!name) { - throw new TypeError('name argument is required to req.get'); - } - - if (typeof name !== 'string') { - throw new TypeError('name must be a string to req.get'); - } - - var lc = name.toLowerCase(); - - switch (lc) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[lc]; - } -}; - -/** - * To do: update docs. - * - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single MIME type string - * such as "application/json", an extension name - * such as "json", a comma-delimited list such as "json, html, text/plain", - * an argument list such as `"json", "html", "text/plain"`, - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given, the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html', 'json'); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String|Array|Boolean} - * @public - */ - -req.accepts = function(){ - var accept = accepts(this); - return accept.types.apply(accept, arguments); -}; - -/** - * Check if the given `encoding`s are accepted. - * - * @param {String} ...encoding - * @return {String|Array} - * @public - */ - -req.acceptsEncodings = function(){ - var accept = accepts(this); - return accept.encodings.apply(accept, arguments); -}; - -req.acceptsEncoding = deprecate.function(req.acceptsEncodings, - 'req.acceptsEncoding: Use acceptsEncodings instead'); - -/** - * Check if the given `charset`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...charset - * @return {String|Array} - * @public - */ - -req.acceptsCharsets = function(){ - var accept = accepts(this); - return accept.charsets.apply(accept, arguments); -}; - -req.acceptsCharset = deprecate.function(req.acceptsCharsets, - 'req.acceptsCharset: Use acceptsCharsets instead'); - -/** - * Check if the given `lang`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...lang - * @return {String|Array} - * @public - */ - -req.acceptsLanguages = function(){ - var accept = accepts(this); - return accept.languages.apply(accept, arguments); -}; - -req.acceptsLanguage = deprecate.function(req.acceptsLanguages, - 'req.acceptsLanguage: Use acceptsLanguages instead'); - -/** - * Parse Range header field, capping to the given `size`. - * - * Unspecified ranges such as "0-" require knowledge of your resource length. In - * the case of a byte range this is of course the total number of bytes. If the - * Range header field is not given `undefined` is returned, `-1` when unsatisfiable, - * and `-2` when syntactically invalid. - * - * When ranges are returned, the array has a "type" property which is the type of - * range that is required (most commonly, "bytes"). Each array element is an object - * with a "start" and "end" property for the portion of the range. - * - * The "combine" option can be set to `true` and overlapping & adjacent ranges - * will be combined into a single range. - * - * NOTE: remember that ranges are inclusive, so for example "Range: users=0-3" - * should respond with 4 users when available, not 3. - * - * @param {number} size - * @param {object} [options] - * @param {boolean} [options.combine=false] - * @return {number|array} - * @public - */ - -req.range = function range(size, options) { - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range, options); -}; - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} [defaultValue] - * @return {String} - * @public - */ - -req.param = function param(name, defaultValue) { - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - - var args = arguments.length === 1 - ? 'name' - : 'name, default'; - deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead'); - - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the given mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @public - */ - -req.is = function is(types) { - var arr = types; - - // support flattened arguments - if (!Array.isArray(types)) { - arr = new Array(arguments.length); - for (var i = 0; i < arr.length; i++) { - arr[i] = arguments[i]; - } - } - - return typeis(this, arr); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting trusts the socket address, the - * "X-Forwarded-Proto" header field will be trusted - * and used if present. - * - * If you're running behind a reverse proxy that - * supplies https for you this may be enabled. - * - * @return {String} - * @public - */ - -defineGetter(req, 'protocol', function protocol(){ - var proto = this.connection.encrypted - ? 'https' - : 'http'; - var trust = this.app.get('trust proxy fn'); - - if (!trust(this.connection.remoteAddress, 0)) { - return proto; - } - - // Note: X-Forwarded-Proto is normally only ever a - // single value, but this is to be safe. - var header = this.get('X-Forwarded-Proto') || proto - var index = header.indexOf(',') - - return index !== -1 - ? header.substring(0, index).trim() - : header.trim() -}); - -/** - * Short-hand for: - * - * req.protocol === 'https' - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'secure', function secure(){ - return this.protocol === 'https'; -}); - -/** - * Return the remote address from the trusted proxy. - * - * The is the remote address on the socket unless - * "trust proxy" is set. - * - * @return {String} - * @public - */ - -defineGetter(req, 'ip', function ip(){ - var trust = this.app.get('trust proxy fn'); - return proxyaddr(this, trust); -}); - -/** - * When "trust proxy" is set, trusted proxy addresses + client. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream and "proxy1" and - * "proxy2" were trusted. - * - * @return {Array} - * @public - */ - -defineGetter(req, 'ips', function ips() { - var trust = this.app.get('trust proxy fn'); - var addrs = proxyaddr.all(this, trust); - - // reverse the order (to farthest -> closest) - // and remove socket address - addrs.reverse().pop() - - return addrs -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @public - */ - -defineGetter(req, 'subdomains', function subdomains() { - var hostname = this.hostname; - - if (!hostname) return []; - - var offset = this.app.get('subdomain offset'); - var subdomains = !isIP(hostname) - ? hostname.split('.').reverse() - : [hostname]; - - return subdomains.slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @public - */ - -defineGetter(req, 'path', function path() { - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field to a hostname. - * - * When the "trust proxy" setting trusts the socket - * address, the "X-Forwarded-Host" header field will - * be trusted. - * - * @return {String} - * @public - */ - -defineGetter(req, 'hostname', function hostname(){ - var trust = this.app.get('trust proxy fn'); - var host = this.get('X-Forwarded-Host'); - - if (!host || !trust(this.connection.remoteAddress, 0)) { - host = this.get('Host'); - } else if (host.indexOf(',') !== -1) { - // Note: X-Forwarded-Host is normally only ever a - // single value, but this is to be safe. - host = host.substring(0, host.indexOf(',')).trimRight() - } - - if (!host) return; - - // IPv6 literal support - var offset = host[0] === '[' - ? host.indexOf(']') + 1 - : 0; - var index = host.indexOf(':', offset); - - return index !== -1 - ? host.substring(0, index) - : host; -}); - -// TODO: change req.host to return host in next major - -defineGetter(req, 'host', deprecate.function(function host(){ - return this.hostname; -}, 'req.host: Use req.hostname instead')); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'fresh', function(){ - var method = this.method; - var res = this.res - var status = res.statusCode - - // GET, HEAD, or QUERY for weak freshness validation only - if ('GET' !== method && 'HEAD' !== method && 'QUERY' !== method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((status >= 200 && status < 300) || 304 === status) { - return fresh(this.headers, { - 'etag': res.get('ETag'), - 'last-modified': res.get('Last-Modified') - }) - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'stale', function stale(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'xhr', function xhr(){ - var val = this.get('X-Requested-With') || ''; - return val.toLowerCase() === 'xmlhttprequest'; -}); - -/** - * Helper function for creating a getter on an object. - * - * @param {Object} obj - * @param {String} name - * @param {Function} getter - * @private - */ -function defineGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - configurable: true, - enumerable: true, - get: getter - }); -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/response.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/response.js deleted file mode 100644 index 2b654f4c..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/response.js +++ /dev/null @@ -1,1179 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var Buffer = require('safe-buffer').Buffer -var contentDisposition = require('content-disposition'); -var createError = require('http-errors') -var deprecate = require('depd')('express'); -var encodeUrl = require('encodeurl'); -var escapeHtml = require('escape-html'); -var http = require('http'); -var isAbsolute = require('./utils').isAbsolute; -var onFinished = require('on-finished'); -var path = require('path'); -var statuses = require('statuses') -var merge = require('utils-merge'); -var sign = require('cookie-signature').sign; -var normalizeType = require('./utils').normalizeType; -var normalizeTypes = require('./utils').normalizeTypes; -var setCharset = require('./utils').setCharset; -var cookie = require('cookie'); -var send = require('send'); -var extname = path.extname; -var mime = send.mime; -var resolve = path.resolve; -var vary = require('vary'); - -/** - * Response prototype. - * @public - */ - -var res = Object.create(http.ServerResponse.prototype) - -/** - * Module exports. - * @public - */ - -module.exports = res - -/** - * Module variables. - * @private - */ - -var charsetRegExp = /;\s*charset\s*=/; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @public - */ - -res.status = function status(code) { - if ((typeof code === 'string' || Math.floor(code) !== code) && code > 99 && code < 1000) { - deprecate('res.status(' + JSON.stringify(code) + '): use res.status(' + Math.floor(code) + ') instead') - } - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @public - */ - -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(Buffer.from('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * - * @param {string|number|boolean|object|Buffer} body - * @public - */ - -res.send = function send(body) { - var chunk = body; - var encoding; - var req = this.req; - var type; - - // settings - var app = this.app; - - // allow status / body - if (arguments.length === 2) { - // res.send(body, status) backwards compat - if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; - } - } - - // disambiguate res.send(status) and res.send(status, num) - if (typeof chunk === 'number' && arguments.length === 1) { - // res.send(status) will set status message as text string - if (!this.get('Content-Type')) { - this.type('txt'); - } - - deprecate('res.send(status): Use res.sendStatus(status) instead'); - this.statusCode = chunk; - chunk = statuses.message[chunk] - } - - switch (typeof chunk) { - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.type('html'); - } - break; - case 'boolean': - case 'number': - case 'object': - if (chunk === null) { - chunk = ''; - } else if (Buffer.isBuffer(chunk)) { - if (!this.get('Content-Type')) { - this.type('bin'); - } - } else { - return this.json(chunk); - } - break; - } - - // write strings in utf-8 - if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); - - // reflect this in content-type - if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); - } - } - - // determine if ETag should be generated - var etagFn = app.get('etag fn') - var generateETag = !this.get('ETag') && typeof etagFn === 'function' - - // populate Content-Length - var len - if (chunk !== undefined) { - if (Buffer.isBuffer(chunk)) { - // get length of Buffer - len = chunk.length - } else if (!generateETag && chunk.length < 1000) { - // just calculate length when no ETag + small chunk - len = Buffer.byteLength(chunk, encoding) - } else { - // convert chunk to Buffer and calculate - chunk = Buffer.from(chunk, encoding) - encoding = undefined; - len = chunk.length - } - - this.set('Content-Length', len); - } - - // populate ETag - var etag; - if (generateETag && len !== undefined) { - if ((etag = etagFn(chunk, encoding))) { - this.set('ETag', etag); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 === this.statusCode || 304 === this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; - } - - // alter headers for 205 - if (this.statusCode === 205) { - this.set('Content-Length', '0') - this.removeHeader('Transfer-Encoding') - chunk = '' - } - - if (req.method === 'HEAD') { - // skip body for HEAD - this.end(); - } else { - // respond - this.end(chunk, encoding); - } - - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @public - */ - -res.json = function json(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var escape = app.get('json escape') - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = stringify(val, replacer, spaces, escape) - - // content-type - if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); - } - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @public - */ - -res.jsonp = function jsonp(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.jsonp(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var escape = app.get('json escape') - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = stringify(val, replacer, spaces, escape) - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); - } - - // fixup callback - if (Array.isArray(callback)) { - callback = callback[0]; - } - - // jsonp - if (typeof callback === 'string' && callback.length !== 0) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); - - // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); - - if (body === undefined) { - // empty argument - body = '' - } else if (typeof body === 'string') { - // replace chars not allowed in JavaScript that are in JSON - body = body - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029') - } - - // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" - // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Send given HTTP status code. - * - * Sets the response status to `statusCode` and the body of the - * response to the standard description from node's http.STATUS_CODES - * or the statusCode number if no description. - * - * Examples: - * - * res.sendStatus(200); - * - * @param {number} statusCode - * @public - */ - -res.sendStatus = function sendStatus(statusCode) { - var body = statuses.message[statusCode] || String(statusCode) - - this.statusCode = statusCode; - this.type('txt'); - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `callback(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.headersSent` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendFile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendFile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendFile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @public - */ - -res.sendFile = function sendFile(path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; - - if (!path) { - throw new TypeError('path argument is required to res.sendFile'); - } - - if (typeof path !== 'string') { - throw new TypeError('path must be a string to res.sendFile') - } - - // support function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - if (!opts.root && !isAbsolute(path)) { - throw new TypeError('path must be absolute or specify root to res.sendFile'); - } - - // create file stream - var pathname = encodeURI(path); - var file = send(req, pathname, opts); - - // transfer - sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); - - // next() all but write errors - if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { - next(err); - } - }); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `callback(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.headersSent` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @public - */ - -res.sendfile = function (path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; - - // support function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // create file stream - var file = send(req, path, opts); - - // transfer - sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); - - // next() all but write errors - if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { - next(err); - } - }); -}; - -res.sendfile = deprecate.function(res.sendfile, - 'res.sendfile: Use res.sendFile instead'); - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `callback(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * occurred. Be sure to check `res.headersSent` if you plan to respond. - * - * Optionally providing an `options` object to use with `res.sendFile()`. - * This function will set the `Content-Disposition` header, overriding - * any `Content-Disposition` header passed as header options in order - * to set the attachment and filename. - * - * This method uses `res.sendFile()`. - * - * @public - */ - -res.download = function download (path, filename, options, callback) { - var done = callback; - var name = filename; - var opts = options || null - - // support function as second or third arg - if (typeof filename === 'function') { - done = filename; - name = null; - opts = null - } else if (typeof options === 'function') { - done = options - opts = null - } - - // support optional filename, where options may be in it's place - if (typeof filename === 'object' && - (typeof options === 'function' || options === undefined)) { - name = null - opts = filename - } - - // set Content-Disposition when file is sent - var headers = { - 'Content-Disposition': contentDisposition(name || path) - }; - - // merge user-provided headers - if (opts && opts.headers) { - var keys = Object.keys(opts.headers) - for (var i = 0; i < keys.length; i++) { - var key = keys[i] - if (key.toLowerCase() !== 'content-disposition') { - headers[key] = opts.headers[key] - } - } - } - - // merge user-provided options - opts = Object.create(opts) - opts.headers = headers - - // Resolve the full path for sendFile - var fullPath = !opts.root - ? resolve(path) - : path - - // send file - return this.sendFile(fullPath, opts, done) -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @public - */ - -res.contentType = -res.type = function contentType(type) { - var ct = type.indexOf('/') === -1 - ? mime.lookup(type) - : type; - - return this.set('Content-Type', ct); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

'); - * }, - * - * 'application/json': function () { - * res.send({ message: 'hey' }); - * } - * }); - * - * In addition to canonicalized MIME types you may - * also use extnames mapped to these types: - * - * res.format({ - * text: function(){ - * res.send('hey'); - * }, - * - * html: function(){ - * res.send('

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @public - */ - -res.format = function(obj){ - var req = this.req; - var next = req.next; - - var keys = Object.keys(obj) - .filter(function (v) { return v !== 'default' }) - - var key = keys.length > 0 - ? req.accepts(keys) - : false; - - this.vary("Accept"); - - if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); - } else if (obj.default) { - obj.default(req, this, next) - } else { - next(createError(406, { - types: normalizeTypes(keys).map(function (o) { return o.value }) - })) - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @public - */ - -res.attachment = function attachment(filename) { - if (filename) { - this.type(extname(filename)); - } - - this.set('Content-Disposition', contentDisposition(filename)); - - return this; -}; - -/** - * Append additional header `field` with value `val`. - * - * Example: - * - * res.append('Link', ['', '']); - * res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly'); - * res.append('Warning', '199 Miscellaneous warning'); - * - * @param {String} field - * @param {String|Array} val - * @return {ServerResponse} for chaining - * @public - */ - -res.append = function append(field, val) { - var prev = this.get(field); - var value = val; - - if (prev) { - // concat the new and prev vals - value = Array.isArray(prev) ? prev.concat(val) - : Array.isArray(val) ? [prev].concat(val) - : [prev, val] - } - - return this.set(field, value); -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object} field - * @param {String|Array} val - * @return {ServerResponse} for chaining - * @public - */ - -res.set = -res.header = function header(field, val) { - if (arguments.length === 2) { - var value = Array.isArray(val) - ? val.map(String) - : String(val); - - // add charset to content-type - if (field.toLowerCase() === 'content-type') { - if (Array.isArray(value)) { - throw new TypeError('Content-Type cannot be set to an Array'); - } - if (!charsetRegExp.test(value)) { - var charset = mime.charsets.lookup(value.split(';')[0]); - if (charset) value += '; charset=' + charset.toLowerCase(); - } - } - - this.setHeader(field, value); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} [options] - * @return {ServerResponse} for chaining - * @public - */ - -res.clearCookie = function clearCookie(name, options) { - if (options) { - if (options.maxAge) { - deprecate('res.clearCookie: Passing "options.maxAge" is deprecated. In v5.0.0 of Express, this option will be ignored, as res.clearCookie will automatically set cookies to expire immediately. Please update your code to omit this option.'); - } - if (options.expires) { - deprecate('res.clearCookie: Passing "options.expires" is deprecated. In v5.0.0 of Express, this option will be ignored, as res.clearCookie will automatically set cookies to expire immediately. Please update your code to omit this option.'); - } - } - var opts = merge({ expires: new Date(1), path: '/' }, options); - - return this.cookie(name, '', opts); -}; - -/** - * Set cookie `name` to `value`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // same as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} value - * @param {Object} [options] - * @return {ServerResponse} for chaining - * @public - */ - -res.cookie = function (name, value, options) { - var opts = merge({}, options); - var secret = this.req.secret; - var signed = opts.signed; - - if (signed && !secret) { - throw new Error('cookieParser("secret") required for signed cookies'); - } - - var val = typeof value === 'object' - ? 'j:' + JSON.stringify(value) - : String(value); - - if (signed) { - val = 's:' + sign(val, secret); - } - - if (opts.maxAge != null) { - var maxAge = opts.maxAge - 0 - - if (!isNaN(maxAge)) { - opts.expires = new Date(Date.now() + maxAge) - opts.maxAge = Math.floor(maxAge / 1000) - } - } - - if (opts.path == null) { - opts.path = '/'; - } - - this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); - - return this; -}; - -/** - * Set the location header to `url`. - * - * The given `url` can also be "back", which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); - * - * @param {String} url - * @return {ServerResponse} for chaining - * @public - */ - -res.location = function location(url) { - var loc; - - // "back" is an alias for the referrer - if (url === 'back') { - deprecate('res.location("back"): use res.location(req.get("Referrer") || "/") and refer to https://dub.sh/security-redirect for best practices'); - loc = this.req.get('Referrer') || '/'; - } else { - loc = String(url); - } - - return this.set('Location', encodeUrl(loc)); -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @public - */ - -res.redirect = function redirect(url) { - var address = url; - var body; - var status = 302; - - // allow status / url - if (arguments.length === 2) { - if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; - } else { - deprecate('res.redirect(url, status): Use res.redirect(status, url) instead'); - status = arguments[1]; - } - } - - // Set location header - address = this.location(address).get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statuses.message[status] + '. Redirecting to ' + address - }, - - html: function(){ - var u = escapeHtml(address); - body = '

' + statuses.message[status] + '. Redirecting to ' + u + '

' - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - - if (this.req.method === 'HEAD') { - this.end(); - } else { - this.end(body); - } -}; - -/** - * Add `field` to Vary. If already present in the Vary set, then - * this call is simply ignored. - * - * @param {Array|String} field - * @return {ServerResponse} for chaining - * @public - */ - -res.vary = function(field){ - // checks for back-compat - if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; - } - - vary(this, field); - - return this; -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @public - */ - -res.render = function render(view, options, callback) { - var app = this.req.app; - var done = callback; - var opts = options || {}; - var req = this.req; - var self = this; - - // support callback function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // merge res.locals - opts._locals = self.locals; - - // default callback to respond - done = done || function (err, str) { - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, opts, done); -}; - -// pipe the send file stream -function sendfile(res, file, options, callback) { - var done = false; - var streaming; - - // request aborted - function onaborted() { - if (done) return; - done = true; - - var err = new Error('Request aborted'); - err.code = 'ECONNABORTED'; - callback(err); - } - - // directory - function ondirectory() { - if (done) return; - done = true; - - var err = new Error('EISDIR, read'); - err.code = 'EISDIR'; - callback(err); - } - - // errors - function onerror(err) { - if (done) return; - done = true; - callback(err); - } - - // ended - function onend() { - if (done) return; - done = true; - callback(); - } - - // file - function onfile() { - streaming = false; - } - - // finished - function onfinish(err) { - if (err && err.code === 'ECONNRESET') return onaborted(); - if (err) return onerror(err); - if (done) return; - - setImmediate(function () { - if (streaming !== false && !done) { - onaborted(); - return; - } - - if (done) return; - done = true; - callback(); - }); - } - - // streaming - function onstream() { - streaming = true; - } - - file.on('directory', ondirectory); - file.on('end', onend); - file.on('error', onerror); - file.on('file', onfile); - file.on('stream', onstream); - onFinished(res, onfinish); - - if (options.headers) { - // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); - } - }); - } - - // pipe - file.pipe(res); -} - -/** - * Stringify JSON, like JSON.stringify, but v8 optimized, with the - * ability to escape characters that can trigger HTML sniffing. - * - * @param {*} value - * @param {function} replacer - * @param {number} spaces - * @param {boolean} escape - * @returns {string} - * @private - */ - -function stringify (value, replacer, spaces, escape) { - // v8 checks arguments.length for optimizing simple call - // https://bugs.chromium.org/p/v8/issues/detail?id=4730 - var json = replacer || spaces - ? JSON.stringify(value, replacer, spaces) - : JSON.stringify(value); - - if (escape && typeof json === 'string') { - json = json.replace(/[<>&]/g, function (c) { - switch (c.charCodeAt(0)) { - case 0x3c: - return '\\u003c' - case 0x3e: - return '\\u003e' - case 0x26: - return '\\u0026' - /* istanbul ignore next: unreachable default */ - default: - return c - } - }) - } - - return json -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/index.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/index.js deleted file mode 100644 index abb3a6f5..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/index.js +++ /dev/null @@ -1,673 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var Route = require('./route'); -var Layer = require('./layer'); -var methods = require('methods'); -var mixin = require('utils-merge'); -var debug = require('debug')('express:router'); -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var parseUrl = require('parseurl'); -var setPrototypeOf = require('setprototypeof') - -/** - * Module variables. - * @private - */ - -var objectRegExp = /^\[object (\S+)\]$/; -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} [options] - * @return {Router} which is a callable function - * @public - */ - -var proto = module.exports = function(options) { - var opts = options || {}; - - function router(req, res, next) { - router.handle(req, res, next); - } - - // mixin Router class functions - setPrototypeOf(router, proto) - - router.params = {}; - router._params = []; - router.caseSensitive = opts.caseSensitive; - router.mergeParams = opts.mergeParams; - router.strict = opts.strict; - router.stack = []; - - return router; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback. - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the same signature as middleware, the only difference - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * Just like in middleware, you must either respond to the request or call next - * to avoid stalling the request. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * return next(err); - * } else if (!user) { - * return next(new Error('failed to load user')); - * } - * req.user = user; - * next(); - * }); - * }); - * - * @param {String} name - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -proto.param = function param(name, fn) { - // param logic - if (typeof name === 'function') { - deprecate('router.param(fn): Refactor to use path params'); - this._params.push(name); - return; - } - - // apply param functions - var params = this._params; - var len = params.length; - var ret; - - if (name[0] === ':') { - deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.slice(1)) + ', fn) instead') - name = name.slice(1) - } - - for (var i = 0; i < len; ++i) { - if (ret = params[i](name, fn)) { - fn = ret; - } - } - - // ensure we end up with a - // middleware function - if ('function' !== typeof fn) { - throw new Error('invalid param() call for ' + name + ', got ' + fn); - } - - (this.params[name] = this.params[name] || []).push(fn); - return this; -}; - -/** - * Dispatch a req, res into the router. - * @private - */ - -proto.handle = function handle(req, res, out) { - var self = this; - - debug('dispatching %s %s', req.method, req.url); - - var idx = 0; - var protohost = getProtohost(req.url) || '' - var removed = ''; - var slashAdded = false; - var sync = 0 - var paramcalled = {}; - - // store options for OPTIONS request - // only used if OPTIONS request - var options = []; - - // middleware and routes - var stack = self.stack; - - // manage inter-router variables - var parentParams = req.params; - var parentUrl = req.baseUrl || ''; - var done = restore(out, req, 'baseUrl', 'next', 'params'); - - // setup next layer - req.next = next; - - // for options requests, respond with a default if nothing else responds - if (req.method === 'OPTIONS') { - done = wrap(done, function(old, err) { - if (err || options.length === 0) return old(err); - sendOptionsResponse(res, options, old); - }); - } - - // setup basic req values - req.baseUrl = parentUrl; - req.originalUrl = req.originalUrl || req.url; - - next(); - - function next(err) { - var layerError = err === 'route' - ? null - : err; - - // remove added slash - if (slashAdded) { - req.url = req.url.slice(1) - slashAdded = false; - } - - // restore altered req.url - if (removed.length !== 0) { - req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.slice(protohost.length) - removed = ''; - } - - // signal to exit router - if (layerError === 'router') { - setImmediate(done, null) - return - } - - // no more matching layers - if (idx >= stack.length) { - setImmediate(done, layerError); - return; - } - - // max sync stack - if (++sync > 100) { - return setImmediate(next, err) - } - - // get pathname of request - var path = getPathname(req); - - if (path == null) { - return done(layerError); - } - - // find next matching layer - var layer; - var match; - var route; - - while (match !== true && idx < stack.length) { - layer = stack[idx++]; - match = matchLayer(layer, path); - route = layer.route; - - if (typeof match !== 'boolean') { - // hold on to layerError - layerError = layerError || match; - } - - if (match !== true) { - continue; - } - - if (!route) { - // process non-route handlers normally - continue; - } - - if (layerError) { - // routes do not match with a pending error - match = false; - continue; - } - - var method = req.method; - var has_method = route._handles_method(method); - - // build up automatic options response - if (!has_method && method === 'OPTIONS') { - appendMethods(options, route._options()); - } - - // don't even bother matching route - if (!has_method && method !== 'HEAD') { - match = false; - } - } - - // no match - if (match !== true) { - return done(layerError); - } - - // store route for dispatch on change - if (route) { - req.route = route; - } - - // Capture one-time layer values - req.params = self.mergeParams - ? mergeParams(layer.params, parentParams) - : layer.params; - var layerPath = layer.path; - - // this should be done for the layer - self.process_params(layer, paramcalled, req, res, function (err) { - if (err) { - next(layerError || err) - } else if (route) { - layer.handle_request(req, res, next) - } else { - trim_prefix(layer, layerError, layerPath, path) - } - - sync = 0 - }); - } - - function trim_prefix(layer, layerError, layerPath, path) { - if (layerPath.length !== 0) { - // Validate path is a prefix match - if (layerPath !== path.slice(0, layerPath.length)) { - next(layerError) - return - } - - // Validate path breaks on a path separator - var c = path[layerPath.length] - if (c && c !== '/' && c !== '.') return next(layerError) - - // Trim off the part of the url that matches the route - // middleware (.use stuff) needs to have the path stripped - debug('trim prefix (%s) from url %s', layerPath, req.url); - removed = layerPath; - req.url = protohost + req.url.slice(protohost.length + removed.length) - - // Ensure leading slash - if (!protohost && req.url[0] !== '/') { - req.url = '/' + req.url; - slashAdded = true; - } - - // Setup base URL (no trailing slash) - req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' - ? removed.substring(0, removed.length - 1) - : removed); - } - - debug('%s %s : %s', layer.name, layerPath, req.originalUrl); - - if (layerError) { - layer.handle_error(layerError, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Process any parameters for the layer. - * @private - */ - -proto.process_params = function process_params(layer, called, req, res, done) { - var params = this.params; - - // captured parameters from the layer, keys and values - var keys = layer.keys; - - // fast track - if (!keys || keys.length === 0) { - return done(); - } - - var i = 0; - var name; - var paramIndex = 0; - var key; - var paramVal; - var paramCallbacks; - var paramCalled; - - // process params in order - // param callbacks can be async - function param(err) { - if (err) { - return done(err); - } - - if (i >= keys.length ) { - return done(); - } - - paramIndex = 0; - key = keys[i++]; - name = key.name; - paramVal = req.params[name]; - paramCallbacks = params[name]; - paramCalled = called[name]; - - if (paramVal === undefined || !paramCallbacks) { - return param(); - } - - // param previously called with same value or error occurred - if (paramCalled && (paramCalled.match === paramVal - || (paramCalled.error && paramCalled.error !== 'route'))) { - // restore value - req.params[name] = paramCalled.value; - - // next param - return param(paramCalled.error); - } - - called[name] = paramCalled = { - error: null, - match: paramVal, - value: paramVal - }; - - paramCallback(); - } - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - - // store updated value - paramCalled.value = req.params[key.name]; - - if (err) { - // store error - paramCalled.error = err; - param(err); - return; - } - - if (!fn) return param(); - - try { - fn(req, res, paramCallback, paramVal, key.name); - } catch (e) { - paramCallback(e); - } - } - - param(); -}; - -/** - * Use the given middleware function, with optional path, defaulting to "/". - * - * Use (like `.all`) will run for any http METHOD, but it will not add - * handlers for those methods so OPTIONS requests will not consider `.use` - * functions even if they could respond. - * - * The other difference is that _route_ path is stripped and not visible - * to the handler function. The main effect of this feature is that mounted - * handlers can operate without any code changes regardless of the "prefix" - * pathname. - * - * @public - */ - -proto.use = function use(fn) { - var offset = 0; - var path = '/'; - - // default path to '/' - // disambiguate router.use([fn]) - if (typeof fn !== 'function') { - var arg = fn; - - while (Array.isArray(arg) && arg.length !== 0) { - arg = arg[0]; - } - - // first arg is the path - if (typeof arg !== 'function') { - offset = 1; - path = fn; - } - } - - var callbacks = flatten(slice.call(arguments, offset)); - - if (callbacks.length === 0) { - throw new TypeError('Router.use() requires a middleware function') - } - - for (var i = 0; i < callbacks.length; i++) { - var fn = callbacks[i]; - - if (typeof fn !== 'function') { - throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn)) - } - - // add the middleware - debug('use %o %s', path, fn.name || '') - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: false, - end: false - }, fn); - - layer.route = undefined; - - this.stack.push(layer); - } - - return this; -}; - -/** - * Create a new Route for the given path. - * - * Each route contains a separate middleware stack and VERB handlers. - * - * See the Route api documentation for details on adding handlers - * and middleware to routes. - * - * @param {String} path - * @return {Route} - * @public - */ - -proto.route = function route(path) { - var route = new Route(path); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: this.strict, - end: true - }, route.dispatch.bind(route)); - - layer.route = route; - - this.stack.push(layer); - return route; -}; - -// create Router#VERB functions -methods.concat('all').forEach(function(method){ - proto[method] = function(path){ - var route = this.route(path) - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -// append methods to a list of methods -function appendMethods(list, addition) { - for (var i = 0; i < addition.length; i++) { - var method = addition[i]; - if (list.indexOf(method) === -1) { - list.push(method); - } - } -} - -// get pathname of request -function getPathname(req) { - try { - return parseUrl(req).pathname; - } catch (err) { - return undefined; - } -} - -// Get get protocol + host for a URL -function getProtohost(url) { - if (typeof url !== 'string' || url.length === 0 || url[0] === '/') { - return undefined - } - - var searchIndex = url.indexOf('?') - var pathLength = searchIndex !== -1 - ? searchIndex - : url.length - var fqdnIndex = url.slice(0, pathLength).indexOf('://') - - return fqdnIndex !== -1 - ? url.substring(0, url.indexOf('/', 3 + fqdnIndex)) - : undefined -} - -// get type for error message -function gettype(obj) { - var type = typeof obj; - - if (type !== 'object') { - return type; - } - - // inspect [[Class]] for objects - return toString.call(obj) - .replace(objectRegExp, '$1'); -} - -/** - * Match path to a layer. - * - * @param {Layer} layer - * @param {string} path - * @private - */ - -function matchLayer(layer, path) { - try { - return layer.match(path); - } catch (err) { - return err; - } -} - -// merge params with parent params -function mergeParams(params, parent) { - if (typeof parent !== 'object' || !parent) { - return params; - } - - // make copy of parent for base - var obj = mixin({}, parent); - - // simple non-numeric merging - if (!(0 in params) || !(0 in parent)) { - return mixin(obj, params); - } - - var i = 0; - var o = 0; - - // determine numeric gaps - while (i in params) { - i++; - } - - while (o in parent) { - o++; - } - - // offset numeric indices in params before merge - for (i--; i >= 0; i--) { - params[i + o] = params[i]; - - // create holes for the merge when necessary - if (i < o) { - delete params[i]; - } - } - - return mixin(obj, params); -} - -// restore obj props after function -function restore(fn, obj) { - var props = new Array(arguments.length - 2); - var vals = new Array(arguments.length - 2); - - for (var i = 0; i < props.length; i++) { - props[i] = arguments[i + 2]; - vals[i] = obj[props[i]]; - } - - return function () { - // restore vals - for (var i = 0; i < props.length; i++) { - obj[props[i]] = vals[i]; - } - - return fn.apply(this, arguments); - }; -} - -// send an OPTIONS response -function sendOptionsResponse(res, options, next) { - try { - var body = options.join(','); - res.set('Allow', body); - res.send(body); - } catch (err) { - next(err); - } -} - -// wrap a function -function wrap(old, fn) { - return function proxy() { - var args = new Array(arguments.length + 1); - - args[0] = old; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i + 1] = arguments[i]; - } - - fn.apply(this, args); - }; -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/layer.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/layer.js deleted file mode 100644 index 4dc8e86d..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/layer.js +++ /dev/null @@ -1,181 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var pathRegexp = require('path-to-regexp'); -var debug = require('debug')('express:router:layer'); - -/** - * Module variables. - * @private - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Module exports. - * @public - */ - -module.exports = Layer; - -function Layer(path, options, fn) { - if (!(this instanceof Layer)) { - return new Layer(path, options, fn); - } - - debug('new %o', path) - var opts = options || {}; - - this.handle = fn; - this.name = fn.name || ''; - this.params = undefined; - this.path = undefined; - this.regexp = pathRegexp(path, this.keys = [], opts); - - // set fast path flags - this.regexp.fast_star = path === '*' - this.regexp.fast_slash = path === '/' && opts.end === false -} - -/** - * Handle the error for the layer. - * - * @param {Error} error - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_error = function handle_error(error, req, res, next) { - var fn = this.handle; - - if (fn.length !== 4) { - // not a standard error handler - return next(error); - } - - try { - fn(error, req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Handle the request for the layer. - * - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_request = function handle(req, res, next) { - var fn = this.handle; - - if (fn.length > 3) { - // not a standard request handler - return next(); - } - - try { - fn(req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Layer.prototype.match = function match(path) { - var match - - if (path != null) { - // fast path non-ending match for / (any path matches) - if (this.regexp.fast_slash) { - this.params = {} - this.path = '' - return true - } - - // fast path for * (everything matched in a param) - if (this.regexp.fast_star) { - this.params = {'0': decode_param(path)} - this.path = path - return true - } - - // match the path - match = this.regexp.exec(path) - } - - if (!match) { - this.params = undefined; - this.path = undefined; - return false; - } - - // store values - this.params = {}; - this.path = match[0] - - var keys = this.keys; - var params = this.params; - - for (var i = 1; i < match.length; i++) { - var key = keys[i - 1]; - var prop = key.name; - var val = decode_param(match[i]) - - if (val !== undefined || !(hasOwnProperty.call(params, prop))) { - params[prop] = val; - } - } - - return true; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @private - */ - -function decode_param(val) { - if (typeof val !== 'string' || val.length === 0) { - return val; - } - - try { - return decodeURIComponent(val); - } catch (err) { - if (err instanceof URIError) { - err.message = 'Failed to decode param \'' + val + '\''; - err.status = err.statusCode = 400; - } - - throw err; - } -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/route.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/route.js deleted file mode 100644 index a65756d6..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/router/route.js +++ /dev/null @@ -1,230 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var debug = require('debug')('express:router:route'); -var flatten = require('array-flatten'); -var Layer = require('./layer'); -var methods = require('methods'); - -/** - * Module variables. - * @private - */ - -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; - -/** - * Module exports. - * @public - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given `path`, - * - * @param {String} path - * @public - */ - -function Route(path) { - this.path = path; - this.stack = []; - - debug('new %o', path) - - // route handlers for various http methods - this.methods = {}; -} - -/** - * Determine if the route handles a given method. - * @private - */ - -Route.prototype._handles_method = function _handles_method(method) { - if (this.methods._all) { - return true; - } - - // normalize name - var name = typeof method === 'string' - ? method.toLowerCase() - : method - - if (name === 'head' && !this.methods['head']) { - name = 'get'; - } - - return Boolean(this.methods[name]); -}; - -/** - * @return {Array} supported HTTP methods - * @private - */ - -Route.prototype._options = function _options() { - var methods = Object.keys(this.methods); - - // append automatic head - if (this.methods.get && !this.methods.head) { - methods.push('head'); - } - - for (var i = 0; i < methods.length; i++) { - // make upper case - methods[i] = methods[i].toUpperCase(); - } - - return methods; -}; - -/** - * dispatch req, res into this route - * @private - */ - -Route.prototype.dispatch = function dispatch(req, res, done) { - var idx = 0; - var stack = this.stack; - var sync = 0 - - if (stack.length === 0) { - return done(); - } - var method = typeof req.method === 'string' - ? req.method.toLowerCase() - : req.method - - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - req.route = this; - - next(); - - function next(err) { - // signal to exit route - if (err && err === 'route') { - return done(); - } - - // signal to exit router - if (err && err === 'router') { - return done(err) - } - - // max sync stack - if (++sync > 100) { - return setImmediate(next, err) - } - - var layer = stack[idx++] - - // end of layers - if (!layer) { - return done(err) - } - - if (layer.method && layer.method !== method) { - next(err) - } else if (err) { - layer.handle_error(err, req, res, next); - } else { - layer.handle_request(req, res, next); - } - - sync = 0 - } -}; - -/** - * Add a handler for all HTTP verbs to this route. - * - * Behaves just like middleware and can respond or call `next` - * to continue processing. - * - * You can use multiple `.all` call to add multiple handlers. - * - * function check_something(req, res, next){ - * next(); - * }; - * - * function validate_user(req, res, next){ - * next(); - * }; - * - * route - * .all(validate_user) - * .all(check_something) - * .get(function(req, res, next){ - * res.send('hello world'); - * }); - * - * @param {function} handler - * @return {Route} for chaining - * @api public - */ - -Route.prototype.all = function all() { - var handles = flatten(slice.call(arguments)); - - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - - if (typeof handle !== 'function') { - var type = toString.call(handle); - var msg = 'Route.all() requires a callback function but got a ' + type - throw new TypeError(msg); - } - - var layer = Layer('/', {}, handle); - layer.method = undefined; - - this.methods._all = true; - this.stack.push(layer); - } - - return this; -}; - -methods.forEach(function(method){ - Route.prototype[method] = function(){ - var handles = flatten(slice.call(arguments)); - - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - - if (typeof handle !== 'function') { - var type = toString.call(handle); - var msg = 'Route.' + method + '() requires a callback function but got a ' + type - throw new Error(msg); - } - - debug('%s %o', method, this.path) - - var layer = Layer('/', {}, handle); - layer.method = method; - - this.methods[method] = true; - this.stack.push(layer); - } - - return this; - }; -}); diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/utils.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/utils.js deleted file mode 100644 index 1dc7dcc2..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/utils.js +++ /dev/null @@ -1,304 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @api private - */ - -var Buffer = require('safe-buffer').Buffer -var contentDisposition = require('content-disposition'); -var contentType = require('content-type'); -var deprecate = require('depd')('express'); -var flatten = require('array-flatten'); -var mime = require('send').mime; -var etag = require('etag'); -var proxyaddr = require('proxy-addr'); -var qs = require('qs'); -var querystring = require('querystring'); - -/** - * Return strong ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.etag = createETagGenerator({ weak: false }) - -/** - * Return weak ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.wetag = createETagGenerator({ weak: true }) - -/** - * Check if `path` looks absolute. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -exports.isAbsolute = function(path){ - if ('/' === path[0]) return true; - if (':' === path[1] && ('\\' === path[2] || '/' === path[2])) return true; // Windows device path - if ('\\\\' === path.substring(0, 2)) return true; // Microsoft Azure absolute path -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = deprecate.function(flatten, - 'utils.flatten: use array-flatten npm module instead'); - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {Object} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') - ? acceptParams(type) - : { value: mime.lookup(type), params: {} }; -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(exports.normalizeType(types[i])); - } - - return ret; -}; - -/** - * Generate Content-Disposition header appropriate for the filename. - * non-ascii filenames are urlencoded and a filename* parameter is added - * - * @param {String} filename - * @return {String} - * @api private - */ - -exports.contentDisposition = deprecate.function(contentDisposition, - 'utils.contentDisposition: use content-disposition npm module instead'); - -/** - * Parse accept params `str` returning an - * object with `.value`, `.quality` and `.params`. - * - * @param {String} str - * @return {Object} - * @api private - */ - -function acceptParams (str) { - var parts = str.split(/ *; */); - var ret = { value: parts[0], quality: 1, params: {} } - - for (var i = 1; i < parts.length; ++i) { - var pms = parts[i].split(/ *= */); - if ('q' === pms[0]) { - ret.quality = parseFloat(pms[1]); - } else { - ret.params[pms[0]] = pms[1]; - } - } - - return ret; -} - -/** - * Compile "etag" value to function. - * - * @param {Boolean|String|Function} val - * @return {Function} - * @api private - */ - -exports.compileETag = function(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - case 'weak': - fn = exports.wetag; - break; - case false: - break; - case 'strong': - fn = exports.etag; - break; - default: - throw new TypeError('unknown value for etag function: ' + val); - } - - return fn; -} - -/** - * Compile "query parser" value to function. - * - * @param {String|Function} val - * @return {Function} - * @api private - */ - -exports.compileQueryParser = function compileQueryParser(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - case 'simple': - fn = querystring.parse; - break; - case false: - fn = newObject; - break; - case 'extended': - fn = parseExtendedQueryString; - break; - default: - throw new TypeError('unknown value for query parser function: ' + val); - } - - return fn; -} - -/** - * Compile "proxy trust" value to function. - * - * @param {Boolean|String|Number|Array|Function} val - * @return {Function} - * @api private - */ - -exports.compileTrust = function(val) { - if (typeof val === 'function') return val; - - if (val === true) { - // Support plain true/false - return function(){ return true }; - } - - if (typeof val === 'number') { - // Support trusting hop count - return function(a, i){ return i < val }; - } - - if (typeof val === 'string') { - // Support comma-separated values - val = val.split(',') - .map(function (v) { return v.trim() }) - } - - return proxyaddr.compile(val || []); -} - -/** - * Set the charset in a given Content-Type string. - * - * @param {String} type - * @param {String} charset - * @return {String} - * @api private - */ - -exports.setCharset = function setCharset(type, charset) { - if (!type || !charset) { - return type; - } - - // parse type - var parsed = contentType.parse(type); - - // set charset - parsed.parameters.charset = charset; - - // format type - return contentType.format(parsed); -}; - -/** - * Create an ETag generator function, generating ETags with - * the given options. - * - * @param {object} options - * @return {function} - * @private - */ - -function createETagGenerator (options) { - return function generateETag (body, encoding) { - var buf = !Buffer.isBuffer(body) - ? Buffer.from(body, encoding) - : body - - return etag(buf, options) - } -} - -/** - * Parse an extended query string with qs. - * - * @param {String} str - * @return {Object} - * @private - */ - -function parseExtendedQueryString(str) { - return qs.parse(str, { - allowPrototypes: true, - arrayLimit: 1000 - }); -} - -/** - * Return new empty object. - * - * @return {Object} - * @api private - */ - -function newObject() { - return {}; -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/view.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/view.js deleted file mode 100644 index c08ab4d8..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/lib/view.js +++ /dev/null @@ -1,182 +0,0 @@ -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module dependencies. - * @private - */ - -var debug = require('debug')('express:view'); -var path = require('path'); -var fs = require('fs'); - -/** - * Module variables. - * @private - */ - -var dirname = path.dirname; -var basename = path.basename; -var extname = path.extname; -var join = path.join; -var resolve = path.resolve; - -/** - * Module exports. - * @public - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {string} name - * @param {object} options - * @public - */ - -function View(name, options) { - var opts = options || {}; - - this.defaultEngine = opts.defaultEngine; - this.ext = extname(name); - this.name = name; - this.root = opts.root; - - if (!this.ext && !this.defaultEngine) { - throw new Error('No default engine was specified and no extension was provided.'); - } - - var fileName = name; - - if (!this.ext) { - // get extension from default engine name - this.ext = this.defaultEngine[0] !== '.' - ? '.' + this.defaultEngine - : this.defaultEngine; - - fileName += this.ext; - } - - if (!opts.engines[this.ext]) { - // load engine - var mod = this.ext.slice(1) - debug('require "%s"', mod) - - // default engine export - var fn = require(mod).__express - - if (typeof fn !== 'function') { - throw new Error('Module "' + mod + '" does not provide a view engine.') - } - - opts.engines[this.ext] = fn - } - - // store loaded engine - this.engine = opts.engines[this.ext]; - - // lookup path - this.path = this.lookup(fileName); -} - -/** - * Lookup view by the given `name` - * - * @param {string} name - * @private - */ - -View.prototype.lookup = function lookup(name) { - var path; - var roots = [].concat(this.root); - - debug('lookup "%s"', name); - - for (var i = 0; i < roots.length && !path; i++) { - var root = roots[i]; - - // resolve the path - var loc = resolve(root, name); - var dir = dirname(loc); - var file = basename(loc); - - // resolve the file - path = this.resolve(dir, file); - } - - return path; -}; - -/** - * Render with the given options. - * - * @param {object} options - * @param {function} callback - * @private - */ - -View.prototype.render = function render(options, callback) { - debug('render "%s"', this.path); - this.engine(this.path, options, callback); -}; - -/** - * Resolve the file within the given directory. - * - * @param {string} dir - * @param {string} file - * @private - */ - -View.prototype.resolve = function resolve(dir, file) { - var ext = this.ext; - - // . - var path = join(dir, file); - var stat = tryStat(path); - - if (stat && stat.isFile()) { - return path; - } - - // /index. - path = join(dir, basename(file, ext), 'index' + ext); - stat = tryStat(path); - - if (stat && stat.isFile()) { - return path; - } -}; - -/** - * Return a stat, maybe. - * - * @param {string} path - * @return {fs.Stats} - * @private - */ - -function tryStat(path) { - debug('stat "%s"', path); - - try { - return fs.statSync(path); - } catch (e) { - return undefined; - } -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/package.json b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/package.json deleted file mode 100644 index 23505c61..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/express/package.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "name": "express", - "description": "Fast, unopinionated, minimalist web framework", - "version": "4.22.3", - "author": "TJ Holowaychuk ", - "contributors": [ - "Aaron Heckmann ", - "Ciaran Jessup ", - "Douglas Christopher Wilson ", - "Guillermo Rauch ", - "Jonathan Ong ", - "Roman Shtylman ", - "Young Jae Sim " - ], - "license": "MIT", - "repository": "expressjs/express", - "homepage": "http://expressjs.com/", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - }, - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "http", - "rest", - "restful", - "router", - "app", - "api" - ], - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.5", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.13", - "proxy-addr": "~2.0.7", - "qs": "~6.16.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "devDependencies": { - "after": "0.8.2", - "connect-redis": "3.4.2", - "cookie-parser": "1.4.6", - "cookie-session": "2.0.0", - "ejs": "3.1.9", - "eslint": "8.47.0", - "express-session": "1.17.2", - "hbs": "4.2.0", - "marked": "0.7.0", - "method-override": "3.0.0", - "mocha": "^6.2.2", - "morgan": "1.10.0", - "nyc": "^14.1.1", - "pbkdf2-password": "1.2.1", - "supertest": "^6.1.6", - "vhost": "~3.0.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "files": [ - "LICENSE", - "History.md", - "Readme.md", - "index.js", - "lib/" - ], - "scripts": { - "lint": "eslint .", - "test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/", - "test-ci": "nyc --exclude examples --exclude test --exclude benchmarks --reporter=lcovonly --reporter=text npm test", - "test-cov": "nyc --exclude examples --exclude test --exclude benchmarks --reporter=html --reporter=text npm test", - "test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/" - } -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/LICENSE b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/LICENSE deleted file mode 100644 index 1bb23685..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Jonas Wagner - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/README.md b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/README.md deleted file mode 100644 index d75116f5..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/README.md +++ /dev/null @@ -1,220 +0,0 @@ -[![Tests](https://github.com/jwagner/simplex-noise.js/actions/workflows/tests.yml/badge.svg)](https://github.com/jwagner/simplex-noise.js/actions/workflows/tests.yml) [![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg)](http://www.typescriptlang.org/) - -![simplex-noise.js header](./doc/github-header-fs8.png) -[API Documentation](https://29a.ch/simplex-noise/docs/modules.html) - - -simplex-noise.js is a simplex noise implementation in Javascript/TypeScript. -It works in the browser and Node.js, using CommonJS and ES Modules. -It is self-contained (dependency-free), relatively small (about 2k minified and gzipped) -and fairly fast (about 20 nanoseconds for a sample of 2d noise) and tree shakeable. - -## Demos & Real World Examples - -- [Synthwave Demo](https://29a.ch/sandbox/2022/simplex-noise-synthwave/) shown in the header -- Simple 2D plasma on [codepen.io](http://codepen.io/jwagner/pen/BNmpdm/?editors=001) -- [3D voxel world generation](https://29a.ch/sandbox/2012/voxelworld/) example -- Film grain in [analog film emulator](https://29a.ch/film-emulator/) -- [Applying volumetric wood grain to 3D prints](https://29a.ch/sandbox/2021/3d-print-texturizer/) - -Created something awesome with simplex-noise? Let me know so I can add it to the list. - -## Installation - -```npm i -S simplex-noise``` - -## Usage Examples - -### ES Module Import - -```javascript -// import the noise functions you need -import { createNoise2D } from 'simplex-noise'; -``` - -### CommonJS Require - -```javascript -// import the noise functions you need -const { createNoise2D } = require('simplex-noise'); -``` - -### 2D - -```javascript -// initialize the noise function -const noise2D = createNoise2D(); -// returns a value between -1 and 1 -console.log(noise2D(x, y)); -``` - -### 3D - -```javascript -const noise3D = createNoise3D(); -console.log(noise3D(x, y, z)); -``` - -### 4D - -```javascript -const noise4D = createNoise4D(); -console.log(noise4D(x, y, z, w)); -``` - -### Using a seed value - -By default simplex-noise.js will use Math.random() to seed the noise. -You can pass in a PRNG function to use your own seed value. - -```bash -# install the alea prng -npm install -S alea -``` - -```javascript -import alea from 'alea'; -// create a new random function based on the seed -const prng = alea('seed'); -// use the seeded random function to initialize the noise function -const noise2D = createNoise2D(prng); -console.log(noise2D(x, y)); -``` - -The ALEA PRNG used in the example above can be found in the [alea](https://npmjs.org/package/alea) npm package. - -## Benchmarks - -simplex-noise.js is reasonably quick. -According to `perf/index.js` I can perform about 70 million `noise2D()` calls/second on a single thread on my desktop (Ryzen 5950X). - -``` -$ node perf/index.js -noise2D: 72,916,215 ops/sec ±1% -noise3D: 47,855,199 ops/sec ±0% -noise4D: 35,564,111 ops/sec ±0% -``` - -## Migrating from 3.x to 4.x - -### random initialization -```javascript -// 3.x -import SimplexNoise from 'simplex-noise'; -const simplex = new SimplexNoise(); -const value2d = simplex.noise2D(x, y); -// 4.x -// import the functions you need -import { createNoise2D } from 'simplex-noise'; -const noise2D = createNoise2D(); -const value2d = noise2D(x, y); -``` - -### Initialization with a seed -```javascript -// 3.x -import SimplexNoise from 'simplex-noise'; -const simplex = new SimplexNoise('seed'); -const value2d = simplex.noise2D(x, y); -// 4.x -// npm install -S alea -import { createNoise2D } from 'simplex-noise'; -import alea from 'alea'; -const noise2D = createNoise2D(alea('seed')); -const value2d = noise2D(x, y); - -// IMPORTANT: If you use multiple noise functions (for example 2d and 3d) -// and want compatible output with 3.x you will need to pass a fresh instance -// of alea to each create call. If you reuse the alea instance you will -// get different outputs compared to simplex-noise 3.x. -const seed = 'seed'; -const noise2D = createNoise2D(alea(seed)); -const noise3D = createNoise3D(alea(seed)); -``` - -### Emulating the 3.x and older API -```javascript -const simplex = { - noise2D: createNoise2D(alea(seed)), - noise3D: createNoise3D(alea(seed)), - noise4D: createNoise4D(alea(seed)), -}; -``` - -## Changelog - -### 4.0.3 -- Additional tweaks to __PURE__ annotations to avoid warnings in rollup.js. Contributed by [Damien Seguin](https://github.com/dmnsgn). - -### 4.0.2 -- Tweaked __PURE__ annotations to avoid warnings in rollup.js. Contributed by [Damien Seguin](https://github.com/dmnsgn). - -### 4.0.1 -- Explicitly defined the return type of `createNoise4D` to be `NoiseFunction4D`. - Contributed by [satelllte](https://github.com/satelllte). - -### 4.0.0 -:warning: **This release changes the API and the output of the noise functions.** :warning: - -- Reworked the API so that the noise functions can be imported individually. - When combined with tree shaking this helps with build sizes. -- Removed the built in version of the ALEA PRNG to focus the library to do only one thing. - If you want to continue to use it you'll have to install and import it separately. -- Noise functions are a bit faster (~ 20 - 30%). -- Noise values can be different from previous versions -- Input coordinates bigger than 2^31 may not result in a noisy output anymore. - If you have a use case that is affected by this change, please file an issue. -- Test coverage is now at 100%. -- A big thank you to @mreinstein, @redblobgames and everyone else involved - for their comments and PRs which motivated me to create this new version. - -### 3.0.1 -- Include simplex-noise.ts as source file, fixes sourcemap warnings. - -### 3.0.0 -- Changed module structure. When using bundlers that import the es module even using require() the import might need to be updated. -- Dependency update -- Setting sideEffects: false in package.json -- Added snapshot tests -- Code converted to typescript, the package can of course still be used from regular JS -- Dropped bower -- Added support for es modules - -### 2.4.0 -- Included a PRNG based on ALEA to directly allow seeding -- Included typescript definitions - -### 2.3.0 - -:warning: **This release changes the output of the noise functions.** :warning: - -In the future such changes will be released as a new major version. - -- Corrected generation of permutation table -- Moved tests to mocha/chai -- Cleanup - -### 2.2.0 -- Small performance improvement for 2D noise - -### 2.1.1 -- Increased entropy by fixing a little initialization issue. - -### 2.1.0 -- AMD support - -### 2.0.0 -- Changed node.js api, SimplexNoise is now exported directly. -- Added unit tests - -### 1.0.0 -- Initial Release - -## License -Copyright (c) 2022 Jonas Wagner, licensed under the MIT License (enclosed) - -## Credits -This is mostly a direct javascript port of the [Java implementation](http://webstaff.itn.liu.se/~stegu/simplexnoise/SimplexNoise.java) -by Stefan Gustavson and Peter Eastman. - -The initial typescript definition has been provided by [Neonit](https://github.com/Neonit). diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.d.ts b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.d.ts deleted file mode 100644 index d42ffde8..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * A random() function, must return a number in the interval [0,1), just like Math.random(). - */ -export declare type RandomFn = () => number; -/** - * Samples the noise field in two dimensions - * - * Coordinates should be finite, bigger than -2^31 and smaller than 2^31. - * @param x - * @param y - * @returns a number in the interval [-1, 1] - */ -export declare type NoiseFunction2D = (x: number, y: number) => number; -/** - * Creates a 2D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction2D} - */ -export declare function createNoise2D(random?: RandomFn): NoiseFunction2D; -/** - * Samples the noise field in three dimensions - * - * Coordinates should be finite, bigger than -2^31 and smaller than 2^31. - * @param x - * @param y - * @param z - * @returns a number in the interval [-1, 1] - */ -export declare type NoiseFunction3D = (x: number, y: number, z: number) => number; -/** - * Creates a 3D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction3D} - */ -export declare function createNoise3D(random?: RandomFn): NoiseFunction3D; -/** - * Samples the noise field in four dimensions - * - * Coordinates should be finite, bigger than -2^31 and smaller than 2^31. - * @param x - * @param y - * @param z - * @param w - * @returns a number in the interval [-1, 1] - */ -export declare type NoiseFunction4D = (x: number, y: number, z: number, w: number) => number; -/** - * Creates a 4D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction4D} - */ -export declare function createNoise4D(random?: RandomFn): NoiseFunction4D; -/** - * Builds a random permutation table. - * This is exported only for (internal) testing purposes. - * Do not rely on this export. - * @private - */ -export declare function buildPermutationTable(random: RandomFn): Uint8Array; diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.js deleted file mode 100644 index ff9c33aa..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.js +++ /dev/null @@ -1,473 +0,0 @@ -"use strict"; -/* - * A fast javascript implementation of simplex noise by Jonas Wagner - -Based on a speed-improved simplex noise algorithm for 2D, 3D and 4D in Java. -Which is based on example code by Stefan Gustavson (stegu@itn.liu.se). -With Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). -Better rank ordering method by Stefan Gustavson in 2012. - - Copyright (c) 2024 Jonas Wagner - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.buildPermutationTable = exports.createNoise4D = exports.createNoise3D = exports.createNoise2D = void 0; -// these __PURE__ comments help uglifyjs with dead code removal -// -const SQRT3 = /*#__PURE__*/ Math.sqrt(3.0); -const SQRT5 = /*#__PURE__*/ Math.sqrt(5.0); -const F2 = 0.5 * (SQRT3 - 1.0); -const G2 = (3.0 - SQRT3) / 6.0; -const F3 = 1.0 / 3.0; -const G3 = 1.0 / 6.0; -const F4 = (SQRT5 - 1.0) / 4.0; -const G4 = (5.0 - SQRT5) / 20.0; -// I'm really not sure why this | 0 (basically a coercion to int) -// is making this faster but I get ~5 million ops/sec more on the -// benchmarks across the board or a ~10% speedup. -const fastFloor = (x) => Math.floor(x) | 0; -const grad2 = /*#__PURE__*/ new Float64Array([1, 1, - -1, 1, - 1, -1, - -1, -1, - 1, 0, - -1, 0, - 1, 0, - -1, 0, - 0, 1, - 0, -1, - 0, 1, - 0, -1]); -// double seems to be faster than single or int's -// probably because most operations are in double precision -const grad3 = /*#__PURE__*/ new Float64Array([1, 1, 0, - -1, 1, 0, - 1, -1, 0, - -1, -1, 0, - 1, 0, 1, - -1, 0, 1, - 1, 0, -1, - -1, 0, -1, - 0, 1, 1, - 0, -1, 1, - 0, 1, -1, - 0, -1, -1]); -// double is a bit quicker here as well -const grad4 = /*#__PURE__*/ new Float64Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, - 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, - 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1, - -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1, - 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1, - -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1, - 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0, - -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0]); -/** - * Creates a 2D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction2D} - */ -function createNoise2D(random = Math.random) { - const perm = buildPermutationTable(random); - // precalculating this yields a little ~3% performance improvement. - const permGrad2x = new Float64Array(perm).map(v => grad2[(v % 12) * 2]); - const permGrad2y = new Float64Array(perm).map(v => grad2[(v % 12) * 2 + 1]); - return function noise2D(x, y) { - // if(!isFinite(x) || !isFinite(y)) return 0; - let n0 = 0; // Noise contributions from the three corners - let n1 = 0; - let n2 = 0; - // Skew the input space to determine which simplex cell we're in - const s = (x + y) * F2; // Hairy factor for 2D - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const t = (i + j) * G2; - const X0 = i - t; // Unskew the cell origin back to (x,y) space - const Y0 = j - t; - const x0 = x - X0; // The x,y distances from the cell origin - const y0 = y - Y0; - // For the 2D case, the simplex shape is an equilateral triangle. - // Determine which simplex we are in. - let i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords - if (x0 > y0) { - i1 = 1; - j1 = 0; - } // lower triangle, XY order: (0,0)->(1,0)->(1,1) - else { - i1 = 0; - j1 = 1; - } // upper triangle, YX order: (0,0)->(0,1)->(1,1) - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords - const y1 = y0 - j1 + G2; - const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords - const y2 = y0 - 1.0 + 2.0 * G2; - // Work out the hashed gradient indices of the three simplex corners - const ii = i & 255; - const jj = j & 255; - // Calculate the contribution from the three corners - let t0 = 0.5 - x0 * x0 - y0 * y0; - if (t0 >= 0) { - const gi0 = ii + perm[jj]; - const g0x = permGrad2x[gi0]; - const g0y = permGrad2y[gi0]; - t0 *= t0; - // n0 = t0 * t0 * (grad2[gi0] * x0 + grad2[gi0 + 1] * y0); // (x,y) of grad3 used for 2D gradient - n0 = t0 * t0 * (g0x * x0 + g0y * y0); - } - let t1 = 0.5 - x1 * x1 - y1 * y1; - if (t1 >= 0) { - const gi1 = ii + i1 + perm[jj + j1]; - const g1x = permGrad2x[gi1]; - const g1y = permGrad2y[gi1]; - t1 *= t1; - // n1 = t1 * t1 * (grad2[gi1] * x1 + grad2[gi1 + 1] * y1); - n1 = t1 * t1 * (g1x * x1 + g1y * y1); - } - let t2 = 0.5 - x2 * x2 - y2 * y2; - if (t2 >= 0) { - const gi2 = ii + 1 + perm[jj + 1]; - const g2x = permGrad2x[gi2]; - const g2y = permGrad2y[gi2]; - t2 *= t2; - // n2 = t2 * t2 * (grad2[gi2] * x2 + grad2[gi2 + 1] * y2); - n2 = t2 * t2 * (g2x * x2 + g2y * y2); - } - // Add contributions from each corner to get the final noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70.0 * (n0 + n1 + n2); - }; -} -exports.createNoise2D = createNoise2D; -/** - * Creates a 3D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction3D} - */ -function createNoise3D(random = Math.random) { - const perm = buildPermutationTable(random); - // precalculating these seems to yield a speedup of over 15% - const permGrad3x = new Float64Array(perm).map(v => grad3[(v % 12) * 3]); - const permGrad3y = new Float64Array(perm).map(v => grad3[(v % 12) * 3 + 1]); - const permGrad3z = new Float64Array(perm).map(v => grad3[(v % 12) * 3 + 2]); - return function noise3D(x, y, z) { - let n0, n1, n2, n3; // Noise contributions from the four corners - // Skew the input space to determine which simplex cell we're in - const s = (x + y + z) * F3; // Very nice and simple skew factor for 3D - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const k = fastFloor(z + s); - const t = (i + j + k) * G3; - const X0 = i - t; // Unskew the cell origin back to (x,y,z) space - const Y0 = j - t; - const Z0 = k - t; - const x0 = x - X0; // The x,y,z distances from the cell origin - const y0 = y - Y0; - const z0 = z - Z0; - // For the 3D case, the simplex shape is a slightly irregular tetrahedron. - // Determine which simplex we are in. - let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords - let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords - if (x0 >= y0) { - if (y0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } // X Y Z order - else if (x0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - } // X Z Y order - else { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } // Z X Y order - } - else { // x0 grad4[(v % 32) * 4]); - const permGrad4y = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 1]); - const permGrad4z = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 2]); - const permGrad4w = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 3]); - return function noise4D(x, y, z, w) { - let n0, n1, n2, n3, n4; // Noise contributions from the five corners - // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in - const s = (x + y + z + w) * F4; // Factor for 4D skewing - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const k = fastFloor(z + s); - const l = fastFloor(w + s); - const t = (i + j + k + l) * G4; // Factor for 4D unskewing - const X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space - const Y0 = j - t; - const Z0 = k - t; - const W0 = l - t; - const x0 = x - X0; // The x,y,z,w distances from the cell origin - const y0 = y - Y0; - const z0 = z - Z0; - const w0 = w - W0; - // For the 4D case, the simplex is a 4D shape I won't even try to describe. - // To find out which of the 24 possible simplices we're in, we need to - // determine the magnitude ordering of x0, y0, z0 and w0. - // Six pair-wise comparisons are performed between each possible pair - // of the four coordinates, and the results are used to rank the numbers. - let rankx = 0; - let ranky = 0; - let rankz = 0; - let rankw = 0; - if (x0 > y0) - rankx++; - else - ranky++; - if (x0 > z0) - rankx++; - else - rankz++; - if (x0 > w0) - rankx++; - else - rankw++; - if (y0 > z0) - ranky++; - else - rankz++; - if (y0 > w0) - ranky++; - else - rankw++; - if (z0 > w0) - rankz++; - else - rankw++; - // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order. - // Many values of c will never occur, since e.g. x>y>z>w makes x= 3 ? 1 : 0; - const j1 = ranky >= 3 ? 1 : 0; - const k1 = rankz >= 3 ? 1 : 0; - const l1 = rankw >= 3 ? 1 : 0; - // The integer offsets for the third simplex corner - const i2 = rankx >= 2 ? 1 : 0; - const j2 = ranky >= 2 ? 1 : 0; - const k2 = rankz >= 2 ? 1 : 0; - const l2 = rankw >= 2 ? 1 : 0; - // The integer offsets for the fourth simplex corner - const i3 = rankx >= 1 ? 1 : 0; - const j3 = ranky >= 1 ? 1 : 0; - const k3 = rankz >= 1 ? 1 : 0; - const l3 = rankw >= 1 ? 1 : 0; - // The fifth corner has all coordinate offsets = 1, so no need to compute that. - const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords - const y1 = y0 - j1 + G4; - const z1 = z0 - k1 + G4; - const w1 = w0 - l1 + G4; - const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords - const y2 = y0 - j2 + 2.0 * G4; - const z2 = z0 - k2 + 2.0 * G4; - const w2 = w0 - l2 + 2.0 * G4; - const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords - const y3 = y0 - j3 + 3.0 * G4; - const z3 = z0 - k3 + 3.0 * G4; - const w3 = w0 - l3 + 3.0 * G4; - const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords - const y4 = y0 - 1.0 + 4.0 * G4; - const z4 = z0 - 1.0 + 4.0 * G4; - const w4 = w0 - 1.0 + 4.0 * G4; - // Work out the hashed gradient indices of the five simplex corners - const ii = i & 255; - const jj = j & 255; - const kk = k & 255; - const ll = l & 255; - // Calculate the contribution from the five corners - let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0; - if (t0 < 0) - n0 = 0.0; - else { - const gi0 = ii + perm[jj + perm[kk + perm[ll]]]; - t0 *= t0; - n0 = t0 * t0 * (permGrad4x[gi0] * x0 + permGrad4y[gi0] * y0 + permGrad4z[gi0] * z0 + permGrad4w[gi0] * w0); - } - let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1; - if (t1 < 0) - n1 = 0.0; - else { - const gi1 = ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]; - t1 *= t1; - n1 = t1 * t1 * (permGrad4x[gi1] * x1 + permGrad4y[gi1] * y1 + permGrad4z[gi1] * z1 + permGrad4w[gi1] * w1); - } - let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2; - if (t2 < 0) - n2 = 0.0; - else { - const gi2 = ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]; - t2 *= t2; - n2 = t2 * t2 * (permGrad4x[gi2] * x2 + permGrad4y[gi2] * y2 + permGrad4z[gi2] * z2 + permGrad4w[gi2] * w2); - } - let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3; - if (t3 < 0) - n3 = 0.0; - else { - const gi3 = ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]; - t3 *= t3; - n3 = t3 * t3 * (permGrad4x[gi3] * x3 + permGrad4y[gi3] * y3 + permGrad4z[gi3] * z3 + permGrad4w[gi3] * w3); - } - let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4; - if (t4 < 0) - n4 = 0.0; - else { - const gi4 = ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]; - t4 *= t4; - n4 = t4 * t4 * (permGrad4x[gi4] * x4 + permGrad4y[gi4] * y4 + permGrad4z[gi4] * z4 + permGrad4w[gi4] * w4); - } - // Sum up and scale the result to cover the range [-1,1] - return 27.0 * (n0 + n1 + n2 + n3 + n4); - }; -} -exports.createNoise4D = createNoise4D; -/** - * Builds a random permutation table. - * This is exported only for (internal) testing purposes. - * Do not rely on this export. - * @private - */ -function buildPermutationTable(random) { - const tableSize = 512; - const p = new Uint8Array(tableSize); - for (let i = 0; i < tableSize / 2; i++) { - p[i] = i; - } - for (let i = 0; i < tableSize / 2 - 1; i++) { - const r = i + ~~(random() * (256 - i)); - const aux = p[i]; - p[i] = p[r]; - p[r] = aux; - } - for (let i = 256; i < tableSize; i++) { - p[i] = p[i - 256]; - } - return p; -} -exports.buildPermutationTable = buildPermutationTable; -//# sourceMappingURL=simplex-noise.js.map \ No newline at end of file diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.js.map b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.js.map deleted file mode 100644 index 603ac160..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/cjs/simplex-noise.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"simplex-noise.js","sourceRoot":"","sources":["../../simplex-noise.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/package.json b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/package.json deleted file mode 100644 index 6990891f..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/package.json +++ /dev/null @@ -1 +0,0 @@ -{"type": "module"} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.d.ts b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.d.ts deleted file mode 100644 index d42ffde8..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * A random() function, must return a number in the interval [0,1), just like Math.random(). - */ -export declare type RandomFn = () => number; -/** - * Samples the noise field in two dimensions - * - * Coordinates should be finite, bigger than -2^31 and smaller than 2^31. - * @param x - * @param y - * @returns a number in the interval [-1, 1] - */ -export declare type NoiseFunction2D = (x: number, y: number) => number; -/** - * Creates a 2D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction2D} - */ -export declare function createNoise2D(random?: RandomFn): NoiseFunction2D; -/** - * Samples the noise field in three dimensions - * - * Coordinates should be finite, bigger than -2^31 and smaller than 2^31. - * @param x - * @param y - * @param z - * @returns a number in the interval [-1, 1] - */ -export declare type NoiseFunction3D = (x: number, y: number, z: number) => number; -/** - * Creates a 3D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction3D} - */ -export declare function createNoise3D(random?: RandomFn): NoiseFunction3D; -/** - * Samples the noise field in four dimensions - * - * Coordinates should be finite, bigger than -2^31 and smaller than 2^31. - * @param x - * @param y - * @param z - * @param w - * @returns a number in the interval [-1, 1] - */ -export declare type NoiseFunction4D = (x: number, y: number, z: number, w: number) => number; -/** - * Creates a 4D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction4D} - */ -export declare function createNoise4D(random?: RandomFn): NoiseFunction4D; -/** - * Builds a random permutation table. - * This is exported only for (internal) testing purposes. - * Do not rely on this export. - * @private - */ -export declare function buildPermutationTable(random: RandomFn): Uint8Array; diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.js b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.js deleted file mode 100644 index 4bacf5de..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.js +++ /dev/null @@ -1,466 +0,0 @@ -/* - * A fast javascript implementation of simplex noise by Jonas Wagner - -Based on a speed-improved simplex noise algorithm for 2D, 3D and 4D in Java. -Which is based on example code by Stefan Gustavson (stegu@itn.liu.se). -With Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). -Better rank ordering method by Stefan Gustavson in 2012. - - Copyright (c) 2024 Jonas Wagner - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - */ -// these __PURE__ comments help uglifyjs with dead code removal -// -const SQRT3 = /*#__PURE__*/ Math.sqrt(3.0); -const SQRT5 = /*#__PURE__*/ Math.sqrt(5.0); -const F2 = 0.5 * (SQRT3 - 1.0); -const G2 = (3.0 - SQRT3) / 6.0; -const F3 = 1.0 / 3.0; -const G3 = 1.0 / 6.0; -const F4 = (SQRT5 - 1.0) / 4.0; -const G4 = (5.0 - SQRT5) / 20.0; -// I'm really not sure why this | 0 (basically a coercion to int) -// is making this faster but I get ~5 million ops/sec more on the -// benchmarks across the board or a ~10% speedup. -const fastFloor = (x) => Math.floor(x) | 0; -const grad2 = /*#__PURE__*/ new Float64Array([1, 1, - -1, 1, - 1, -1, - -1, -1, - 1, 0, - -1, 0, - 1, 0, - -1, 0, - 0, 1, - 0, -1, - 0, 1, - 0, -1]); -// double seems to be faster than single or int's -// probably because most operations are in double precision -const grad3 = /*#__PURE__*/ new Float64Array([1, 1, 0, - -1, 1, 0, - 1, -1, 0, - -1, -1, 0, - 1, 0, 1, - -1, 0, 1, - 1, 0, -1, - -1, 0, -1, - 0, 1, 1, - 0, -1, 1, - 0, 1, -1, - 0, -1, -1]); -// double is a bit quicker here as well -const grad4 = /*#__PURE__*/ new Float64Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, - 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, - 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1, - -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1, - 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1, - -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1, - 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0, - -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0]); -/** - * Creates a 2D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction2D} - */ -export function createNoise2D(random = Math.random) { - const perm = buildPermutationTable(random); - // precalculating this yields a little ~3% performance improvement. - const permGrad2x = new Float64Array(perm).map(v => grad2[(v % 12) * 2]); - const permGrad2y = new Float64Array(perm).map(v => grad2[(v % 12) * 2 + 1]); - return function noise2D(x, y) { - // if(!isFinite(x) || !isFinite(y)) return 0; - let n0 = 0; // Noise contributions from the three corners - let n1 = 0; - let n2 = 0; - // Skew the input space to determine which simplex cell we're in - const s = (x + y) * F2; // Hairy factor for 2D - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const t = (i + j) * G2; - const X0 = i - t; // Unskew the cell origin back to (x,y) space - const Y0 = j - t; - const x0 = x - X0; // The x,y distances from the cell origin - const y0 = y - Y0; - // For the 2D case, the simplex shape is an equilateral triangle. - // Determine which simplex we are in. - let i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords - if (x0 > y0) { - i1 = 1; - j1 = 0; - } // lower triangle, XY order: (0,0)->(1,0)->(1,1) - else { - i1 = 0; - j1 = 1; - } // upper triangle, YX order: (0,0)->(0,1)->(1,1) - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords - const y1 = y0 - j1 + G2; - const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords - const y2 = y0 - 1.0 + 2.0 * G2; - // Work out the hashed gradient indices of the three simplex corners - const ii = i & 255; - const jj = j & 255; - // Calculate the contribution from the three corners - let t0 = 0.5 - x0 * x0 - y0 * y0; - if (t0 >= 0) { - const gi0 = ii + perm[jj]; - const g0x = permGrad2x[gi0]; - const g0y = permGrad2y[gi0]; - t0 *= t0; - // n0 = t0 * t0 * (grad2[gi0] * x0 + grad2[gi0 + 1] * y0); // (x,y) of grad3 used for 2D gradient - n0 = t0 * t0 * (g0x * x0 + g0y * y0); - } - let t1 = 0.5 - x1 * x1 - y1 * y1; - if (t1 >= 0) { - const gi1 = ii + i1 + perm[jj + j1]; - const g1x = permGrad2x[gi1]; - const g1y = permGrad2y[gi1]; - t1 *= t1; - // n1 = t1 * t1 * (grad2[gi1] * x1 + grad2[gi1 + 1] * y1); - n1 = t1 * t1 * (g1x * x1 + g1y * y1); - } - let t2 = 0.5 - x2 * x2 - y2 * y2; - if (t2 >= 0) { - const gi2 = ii + 1 + perm[jj + 1]; - const g2x = permGrad2x[gi2]; - const g2y = permGrad2y[gi2]; - t2 *= t2; - // n2 = t2 * t2 * (grad2[gi2] * x2 + grad2[gi2 + 1] * y2); - n2 = t2 * t2 * (g2x * x2 + g2y * y2); - } - // Add contributions from each corner to get the final noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70.0 * (n0 + n1 + n2); - }; -} -/** - * Creates a 3D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction3D} - */ -export function createNoise3D(random = Math.random) { - const perm = buildPermutationTable(random); - // precalculating these seems to yield a speedup of over 15% - const permGrad3x = new Float64Array(perm).map(v => grad3[(v % 12) * 3]); - const permGrad3y = new Float64Array(perm).map(v => grad3[(v % 12) * 3 + 1]); - const permGrad3z = new Float64Array(perm).map(v => grad3[(v % 12) * 3 + 2]); - return function noise3D(x, y, z) { - let n0, n1, n2, n3; // Noise contributions from the four corners - // Skew the input space to determine which simplex cell we're in - const s = (x + y + z) * F3; // Very nice and simple skew factor for 3D - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const k = fastFloor(z + s); - const t = (i + j + k) * G3; - const X0 = i - t; // Unskew the cell origin back to (x,y,z) space - const Y0 = j - t; - const Z0 = k - t; - const x0 = x - X0; // The x,y,z distances from the cell origin - const y0 = y - Y0; - const z0 = z - Z0; - // For the 3D case, the simplex shape is a slightly irregular tetrahedron. - // Determine which simplex we are in. - let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords - let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords - if (x0 >= y0) { - if (y0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } // X Y Z order - else if (x0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - } // X Z Y order - else { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } // Z X Y order - } - else { // x0 grad4[(v % 32) * 4]); - const permGrad4y = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 1]); - const permGrad4z = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 2]); - const permGrad4w = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 3]); - return function noise4D(x, y, z, w) { - let n0, n1, n2, n3, n4; // Noise contributions from the five corners - // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in - const s = (x + y + z + w) * F4; // Factor for 4D skewing - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const k = fastFloor(z + s); - const l = fastFloor(w + s); - const t = (i + j + k + l) * G4; // Factor for 4D unskewing - const X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space - const Y0 = j - t; - const Z0 = k - t; - const W0 = l - t; - const x0 = x - X0; // The x,y,z,w distances from the cell origin - const y0 = y - Y0; - const z0 = z - Z0; - const w0 = w - W0; - // For the 4D case, the simplex is a 4D shape I won't even try to describe. - // To find out which of the 24 possible simplices we're in, we need to - // determine the magnitude ordering of x0, y0, z0 and w0. - // Six pair-wise comparisons are performed between each possible pair - // of the four coordinates, and the results are used to rank the numbers. - let rankx = 0; - let ranky = 0; - let rankz = 0; - let rankw = 0; - if (x0 > y0) - rankx++; - else - ranky++; - if (x0 > z0) - rankx++; - else - rankz++; - if (x0 > w0) - rankx++; - else - rankw++; - if (y0 > z0) - ranky++; - else - rankz++; - if (y0 > w0) - ranky++; - else - rankw++; - if (z0 > w0) - rankz++; - else - rankw++; - // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order. - // Many values of c will never occur, since e.g. x>y>z>w makes x= 3 ? 1 : 0; - const j1 = ranky >= 3 ? 1 : 0; - const k1 = rankz >= 3 ? 1 : 0; - const l1 = rankw >= 3 ? 1 : 0; - // The integer offsets for the third simplex corner - const i2 = rankx >= 2 ? 1 : 0; - const j2 = ranky >= 2 ? 1 : 0; - const k2 = rankz >= 2 ? 1 : 0; - const l2 = rankw >= 2 ? 1 : 0; - // The integer offsets for the fourth simplex corner - const i3 = rankx >= 1 ? 1 : 0; - const j3 = ranky >= 1 ? 1 : 0; - const k3 = rankz >= 1 ? 1 : 0; - const l3 = rankw >= 1 ? 1 : 0; - // The fifth corner has all coordinate offsets = 1, so no need to compute that. - const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords - const y1 = y0 - j1 + G4; - const z1 = z0 - k1 + G4; - const w1 = w0 - l1 + G4; - const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords - const y2 = y0 - j2 + 2.0 * G4; - const z2 = z0 - k2 + 2.0 * G4; - const w2 = w0 - l2 + 2.0 * G4; - const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords - const y3 = y0 - j3 + 3.0 * G4; - const z3 = z0 - k3 + 3.0 * G4; - const w3 = w0 - l3 + 3.0 * G4; - const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords - const y4 = y0 - 1.0 + 4.0 * G4; - const z4 = z0 - 1.0 + 4.0 * G4; - const w4 = w0 - 1.0 + 4.0 * G4; - // Work out the hashed gradient indices of the five simplex corners - const ii = i & 255; - const jj = j & 255; - const kk = k & 255; - const ll = l & 255; - // Calculate the contribution from the five corners - let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0; - if (t0 < 0) - n0 = 0.0; - else { - const gi0 = ii + perm[jj + perm[kk + perm[ll]]]; - t0 *= t0; - n0 = t0 * t0 * (permGrad4x[gi0] * x0 + permGrad4y[gi0] * y0 + permGrad4z[gi0] * z0 + permGrad4w[gi0] * w0); - } - let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1; - if (t1 < 0) - n1 = 0.0; - else { - const gi1 = ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]; - t1 *= t1; - n1 = t1 * t1 * (permGrad4x[gi1] * x1 + permGrad4y[gi1] * y1 + permGrad4z[gi1] * z1 + permGrad4w[gi1] * w1); - } - let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2; - if (t2 < 0) - n2 = 0.0; - else { - const gi2 = ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]; - t2 *= t2; - n2 = t2 * t2 * (permGrad4x[gi2] * x2 + permGrad4y[gi2] * y2 + permGrad4z[gi2] * z2 + permGrad4w[gi2] * w2); - } - let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3; - if (t3 < 0) - n3 = 0.0; - else { - const gi3 = ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]; - t3 *= t3; - n3 = t3 * t3 * (permGrad4x[gi3] * x3 + permGrad4y[gi3] * y3 + permGrad4z[gi3] * z3 + permGrad4w[gi3] * w3); - } - let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4; - if (t4 < 0) - n4 = 0.0; - else { - const gi4 = ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]; - t4 *= t4; - n4 = t4 * t4 * (permGrad4x[gi4] * x4 + permGrad4y[gi4] * y4 + permGrad4z[gi4] * z4 + permGrad4w[gi4] * w4); - } - // Sum up and scale the result to cover the range [-1,1] - return 27.0 * (n0 + n1 + n2 + n3 + n4); - }; -} -/** - * Builds a random permutation table. - * This is exported only for (internal) testing purposes. - * Do not rely on this export. - * @private - */ -export function buildPermutationTable(random) { - const tableSize = 512; - const p = new Uint8Array(tableSize); - for (let i = 0; i < tableSize / 2; i++) { - p[i] = i; - } - for (let i = 0; i < tableSize / 2 - 1; i++) { - const r = i + ~~(random() * (256 - i)); - const aux = p[i]; - p[i] = p[r]; - p[r] = aux; - } - for (let i = 256; i < tableSize; i++) { - p[i] = p[i - 256]; - } - return p; -} -//# sourceMappingURL=simplex-noise.js.map \ No newline at end of file diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.js.map b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.js.map deleted file mode 100644 index 3035161b..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/dist/esm/simplex-noise.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"simplex-noise.js","sourceRoot":"","sources":["../../simplex-noise.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/package.json b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/package.json deleted file mode 100644 index a075fbb0..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "simplex-noise", - "version": "4.0.3", - "description": "simplex-noise is a fast simplex noise implementation in Javascript. Works in node and in the browser.", - "homepage": "https://github.com/jwagner/simplex-noise.js", - "author": "Jonas Wagner (http://29a.ch/)", - "main": "dist/cjs/simplex-noise.js", - "module": "dist/esm/simplex-noise.js", - "types": "./dist/esm/simplex-noise.d.ts", - "exports": { - "require": "./dist/cjs/simplex-noise.js", - "import": "./dist/esm/simplex-noise.js" - }, - "sideEffects": false, - "files": [ - "dist/esm/package.json", - "dist/esm/simplex-noise.js", - "dist/esm/simplex-noise.js.map", - "dist/esm/simplex-noise.d.ts", - "dist/cjs/simplex-noise.js", - "dist/cjs/simplex-noise.js.map", - "dist/cjs/simplex-noise.d.ts", - "simplex-noise.ts" - ], - "devDependencies": { - "@parcel/packager-ts": "^2.6.2", - "@parcel/transformer-typescript-types": "^2.6.2", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "@types/node": "^18.0.6", - "@types/pngjs": "^6.0.1", - "@typescript-eslint/eslint-plugin": "^5.30.7", - "@typescript-eslint/parser": "^5.30.7", - "alea": "^1.0.1", - "benchmark": "^2.1.4", - "chai": "^4.3.6", - "eslint": "^8.20.0", - "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^15.2.4", - "eslint-plugin-promise": "^6.0.0", - "html-webpack-plugin": "^5.5.0", - "microtime": "^3.1.0", - "mocha": "^10.0.0", - "nyc": "^15.1.0", - "parcel": "^2.6.2", - "pngjs": "^6.0.0", - "source-map-loader": "^4.0.0", - "ts-node": "^10.9.2", - "tsx": "^4.16.2", - "typedoc": "^0.23.8", - "typescript": "^4.7.4", - "webpack": "^5.73.0", - "webpack-cli": "^4.10.0" - }, - "bugs": { - "url": "https://github.com/jwagner/simplex-noise.js/issues" - }, - "keywords": [ - "noise", - "random", - "simplex", - "plasma", - "procedural", - "generation", - "gfx", - "generative" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/jwagner/simplex-noise.js.git" - }, - "scripts": { - "start": "parcel test/visual.html", - "test": "eslint simplex-noise.ts && nyc mocha && ./test/module-compatibility.sh", - "coverage": "nyc report", - "build": "./build.sh", - "docs": "typedoc --excludePrivate --out public/docs simplex-noise.ts && cp -R doc public/docs/", - "prepare": "npm run-script build", - "benchmark": "npm run build && cd perf && ./benchmark.sh" - } -} \ No newline at end of file diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/simplex-noise.ts b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/simplex-noise.ts deleted file mode 100644 index 188e62a3..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.ignored/simplex-noise/simplex-noise.ts +++ /dev/null @@ -1,500 +0,0 @@ -/* - * A fast javascript implementation of simplex noise by Jonas Wagner - -Based on a speed-improved simplex noise algorithm for 2D, 3D and 4D in Java. -Which is based on example code by Stefan Gustavson (stegu@itn.liu.se). -With Optimisations by Peter Eastman (peastman@drizzle.stanford.edu). -Better rank ordering method by Stefan Gustavson in 2012. - - Copyright (c) 2024 Jonas Wagner - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - */ - - -// these __PURE__ comments help uglifyjs with dead code removal -// -const SQRT3 = /*#__PURE__*/ Math.sqrt(3.0); -const SQRT5 = /*#__PURE__*/ Math.sqrt(5.0); -const F2 = 0.5 * (SQRT3 - 1.0); -const G2 = (3.0 - SQRT3) / 6.0; -const F3 = 1.0 / 3.0; -const G3 = 1.0 / 6.0; -const F4 = (SQRT5 - 1.0) / 4.0; -const G4 = (5.0 - SQRT5) / 20.0; - -// I'm really not sure why this | 0 (basically a coercion to int) -// is making this faster but I get ~5 million ops/sec more on the -// benchmarks across the board or a ~10% speedup. -const fastFloor = (x: number) => Math.floor(x) | 0; - -const grad2 = /*#__PURE__*/ new Float64Array([1, 1, - -1, 1, - 1, -1, - - -1, -1, - 1, 0, - -1, 0, - - 1, 0, - -1, 0, - 0, 1, - - 0, -1, - 0, 1, - 0, -1]); - -// double seems to be faster than single or int's -// probably because most operations are in double precision -const grad3 = /*#__PURE__*/ new Float64Array([1, 1, 0, - -1, 1, 0, - 1, -1, 0, - - -1, -1, 0, - 1, 0, 1, - -1, 0, 1, - - 1, 0, -1, - -1, 0, -1, - 0, 1, 1, - - 0, -1, 1, - 0, 1, -1, - 0, -1, -1]); - -// double is a bit quicker here as well -const grad4 = /*#__PURE__*/ new Float64Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, - 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, - 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1, - -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1, - 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1, - -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1, - 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0, - -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0]); - -/** - * A random() function, must return a number in the interval [0,1), just like Math.random(). - */ -export type RandomFn = () => number; - -/** - * Samples the noise field in two dimensions - * - * Coordinates should be finite, bigger than -2^31 and smaller than 2^31. - * @param x - * @param y - * @returns a number in the interval [-1, 1] - */ -export type NoiseFunction2D = (x: number, y: number) => number; - -/** - * Creates a 2D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction2D} - */ -export function createNoise2D(random: RandomFn = Math.random): NoiseFunction2D { - const perm = buildPermutationTable(random); - // precalculating this yields a little ~3% performance improvement. - const permGrad2x = new Float64Array(perm).map(v => grad2[(v % 12) * 2]); - const permGrad2y = new Float64Array(perm).map(v => grad2[(v % 12) * 2 + 1]); - return function noise2D(x: number, y: number): number { - // if(!isFinite(x) || !isFinite(y)) return 0; - let n0 = 0; // Noise contributions from the three corners - let n1 = 0; - let n2 = 0; - // Skew the input space to determine which simplex cell we're in - const s = (x + y) * F2; // Hairy factor for 2D - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const t = (i + j) * G2; - const X0 = i - t; // Unskew the cell origin back to (x,y) space - const Y0 = j - t; - const x0 = x - X0; // The x,y distances from the cell origin - const y0 = y - Y0; - // For the 2D case, the simplex shape is an equilateral triangle. - // Determine which simplex we are in. - let i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords - if (x0 > y0) { - i1 = 1; - j1 = 0; - } // lower triangle, XY order: (0,0)->(1,0)->(1,1) - else { - i1 = 0; - j1 = 1; - } // upper triangle, YX order: (0,0)->(0,1)->(1,1) - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords - const y1 = y0 - j1 + G2; - const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords - const y2 = y0 - 1.0 + 2.0 * G2; - // Work out the hashed gradient indices of the three simplex corners - const ii = i & 255; - const jj = j & 255; - // Calculate the contribution from the three corners - let t0 = 0.5 - x0 * x0 - y0 * y0; - if (t0 >= 0) { - const gi0 = ii + perm[jj]; - const g0x = permGrad2x[gi0]; - const g0y = permGrad2y[gi0]; - t0 *= t0; - // n0 = t0 * t0 * (grad2[gi0] * x0 + grad2[gi0 + 1] * y0); // (x,y) of grad3 used for 2D gradient - n0 = t0 * t0 * (g0x * x0 + g0y * y0); - } - let t1 = 0.5 - x1 * x1 - y1 * y1; - if (t1 >= 0) { - const gi1 = ii + i1 + perm[jj + j1]; - const g1x = permGrad2x[gi1]; - const g1y = permGrad2y[gi1]; - t1 *= t1; - // n1 = t1 * t1 * (grad2[gi1] * x1 + grad2[gi1 + 1] * y1); - n1 = t1 * t1 * (g1x * x1 + g1y * y1); - } - let t2 = 0.5 - x2 * x2 - y2 * y2; - if (t2 >= 0) { - const gi2 = ii + 1 + perm[jj + 1]; - const g2x = permGrad2x[gi2]; - const g2y = permGrad2y[gi2]; - t2 *= t2; - // n2 = t2 * t2 * (grad2[gi2] * x2 + grad2[gi2 + 1] * y2); - n2 = t2 * t2 * (g2x * x2 + g2y * y2); - } - // Add contributions from each corner to get the final noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70.0 * (n0 + n1 + n2); - }; -} - -/** - * Samples the noise field in three dimensions - * - * Coordinates should be finite, bigger than -2^31 and smaller than 2^31. - * @param x - * @param y - * @param z - * @returns a number in the interval [-1, 1] - */ -export type NoiseFunction3D = (x: number, y: number, z: number) => number; - -/** - * Creates a 3D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction3D} - */ -export function createNoise3D(random: RandomFn = Math.random): NoiseFunction3D { - const perm = buildPermutationTable(random); - // precalculating these seems to yield a speedup of over 15% - const permGrad3x = new Float64Array(perm).map(v => grad3[(v % 12) * 3]); - const permGrad3y = new Float64Array(perm).map(v => grad3[(v % 12) * 3 + 1]); - const permGrad3z = new Float64Array(perm).map(v => grad3[(v % 12) * 3 + 2]); - return function noise3D(x: number, y: number, z: number): number { - let n0, n1, n2, n3; // Noise contributions from the four corners - // Skew the input space to determine which simplex cell we're in - const s = (x + y + z) * F3; // Very nice and simple skew factor for 3D - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const k = fastFloor(z + s); - const t = (i + j + k) * G3; - const X0 = i - t; // Unskew the cell origin back to (x,y,z) space - const Y0 = j - t; - const Z0 = k - t; - const x0 = x - X0; // The x,y,z distances from the cell origin - const y0 = y - Y0; - const z0 = z - Z0; - // For the 3D case, the simplex shape is a slightly irregular tetrahedron. - // Determine which simplex we are in. - let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords - let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords - if (x0 >= y0) { - if (y0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } // X Y Z order - else if (x0 >= z0) { - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - } // X Z Y order - else { - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } // Z X Y order - } - else { // x0 number; - -/** - * Creates a 4D noise function - * @param random the random function that will be used to build the permutation table - * @returns {NoiseFunction4D} - */ -export function createNoise4D(random: RandomFn = Math.random): NoiseFunction4D { - const perm = buildPermutationTable(random); - // precalculating these leads to a ~10% speedup - const permGrad4x = new Float64Array(perm).map(v => grad4[(v % 32) * 4]); - const permGrad4y = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 1]); - const permGrad4z = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 2]); - const permGrad4w = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 3]); - return function noise4D(x: number, y: number, z: number, w: number): number { - let n0, n1, n2, n3, n4; // Noise contributions from the five corners - // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in - const s = (x + y + z + w) * F4; // Factor for 4D skewing - const i = fastFloor(x + s); - const j = fastFloor(y + s); - const k = fastFloor(z + s); - const l = fastFloor(w + s); - const t = (i + j + k + l) * G4; // Factor for 4D unskewing - const X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space - const Y0 = j - t; - const Z0 = k - t; - const W0 = l - t; - const x0 = x - X0; // The x,y,z,w distances from the cell origin - const y0 = y - Y0; - const z0 = z - Z0; - const w0 = w - W0; - // For the 4D case, the simplex is a 4D shape I won't even try to describe. - // To find out which of the 24 possible simplices we're in, we need to - // determine the magnitude ordering of x0, y0, z0 and w0. - // Six pair-wise comparisons are performed between each possible pair - // of the four coordinates, and the results are used to rank the numbers. - let rankx = 0; - let ranky = 0; - let rankz = 0; - let rankw = 0; - if (x0 > y0) rankx++; - else ranky++; - if (x0 > z0) rankx++; - else rankz++; - if (x0 > w0) rankx++; - else rankw++; - if (y0 > z0) ranky++; - else rankz++; - if (y0 > w0) ranky++; - else rankw++; - if (z0 > w0) rankz++; - else rankw++; - // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order. - // Many values of c will never occur, since e.g. x>y>z>w makes x= 3 ? 1 : 0; - const j1 = ranky >= 3 ? 1 : 0; - const k1 = rankz >= 3 ? 1 : 0; - const l1 = rankw >= 3 ? 1 : 0; - // The integer offsets for the third simplex corner - const i2 = rankx >= 2 ? 1 : 0; - const j2 = ranky >= 2 ? 1 : 0; - const k2 = rankz >= 2 ? 1 : 0; - const l2 = rankw >= 2 ? 1 : 0; - - // The integer offsets for the fourth simplex corner - const i3 = rankx >= 1 ? 1 : 0; - const j3 = ranky >= 1 ? 1 : 0; - const k3 = rankz >= 1 ? 1 : 0; - const l3 = rankw >= 1 ? 1 : 0; - // The fifth corner has all coordinate offsets = 1, so no need to compute that. - const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords - const y1 = y0 - j1 + G4; - const z1 = z0 - k1 + G4; - const w1 = w0 - l1 + G4; - const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords - const y2 = y0 - j2 + 2.0 * G4; - const z2 = z0 - k2 + 2.0 * G4; - const w2 = w0 - l2 + 2.0 * G4; - const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords - const y3 = y0 - j3 + 3.0 * G4; - const z3 = z0 - k3 + 3.0 * G4; - const w3 = w0 - l3 + 3.0 * G4; - const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords - const y4 = y0 - 1.0 + 4.0 * G4; - const z4 = z0 - 1.0 + 4.0 * G4; - const w4 = w0 - 1.0 + 4.0 * G4; - // Work out the hashed gradient indices of the five simplex corners - const ii = i & 255; - const jj = j & 255; - const kk = k & 255; - const ll = l & 255; - // Calculate the contribution from the five corners - let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0; - if (t0 < 0) n0 = 0.0; - else { - const gi0 = ii + perm[jj + perm[kk + perm[ll]]]; - t0 *= t0; - n0 = t0 * t0 * (permGrad4x[gi0] * x0 + permGrad4y[gi0] * y0 + permGrad4z[gi0] * z0 + permGrad4w[gi0] * w0); - } - let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1; - if (t1 < 0) n1 = 0.0; - else { - const gi1 = ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]; - t1 *= t1; - n1 = t1 * t1 * (permGrad4x[gi1] * x1 + permGrad4y[gi1] * y1 + permGrad4z[gi1] * z1 + permGrad4w[gi1] * w1); - } - let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2; - if (t2 < 0) n2 = 0.0; - else { - const gi2 = ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]; - t2 *= t2; - n2 = t2 * t2 * (permGrad4x[gi2] * x2 + permGrad4y[gi2] * y2 + permGrad4z[gi2] * z2 + permGrad4w[gi2] * w2); - } - let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3; - if (t3 < 0) n3 = 0.0; - else { - const gi3 = ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]; - t3 *= t3; - n3 = t3 * t3 * (permGrad4x[gi3] * x3 + permGrad4y[gi3] * y3 + permGrad4z[gi3] * z3 + permGrad4w[gi3] * w3); - } - let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4; - if (t4 < 0) n4 = 0.0; - else { - const gi4 = ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]; - t4 *= t4; - n4 = t4 * t4 * (permGrad4x[gi4] * x4 + permGrad4y[gi4] * y4 + permGrad4z[gi4] * z4 + permGrad4w[gi4] * w4); - } - // Sum up and scale the result to cover the range [-1,1] - return 27.0 * (n0 + n1 + n2 + n3 + n4); - }; -} - -/** - * Builds a random permutation table. - * This is exported only for (internal) testing purposes. - * Do not rely on this export. - * @private - */ -export function buildPermutationTable(random: RandomFn): Uint8Array { - const tableSize = 512; - const p = new Uint8Array(tableSize); - for (let i = 0; i < tableSize / 2; i++) { - p[i] = i; - } - for (let i = 0; i < tableSize / 2 - 1; i++) { - const r = i + ~~(random() * (256 - i)); - const aux = p[i]; - p[i] = p[r]; - p[r] = aux; - } - for (let i = 256; i < tableSize; i++) { - p[i] = p[i - 256]; - } - return p; -} \ No newline at end of file diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.modules.yaml b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.modules.yaml deleted file mode 100644 index 3a9ca735..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.modules.yaml +++ /dev/null @@ -1,252 +0,0 @@ -{ - "prunedAt": "Sun, 20 Sep 2026 12:19:59 GMT", - "hoistedDependencies": { - "@esbuild/linux-x64@0.24.2": { - "@esbuild/linux-x64": "private" - }, - "qs@6.16.0": { - "qs": "private" - }, - "depd@2.0.0": { - "depd": "private" - }, - "etag@1.8.1": { - "etag": "private" - }, - "send@0.19.2": { - "send": "private" - }, - "vary@1.1.2": { - "vary": "private" - }, - "debug@2.6.9": { - "debug": "private" - }, - "fresh@0.5.2": { - "fresh": "private" - }, - "cookie@0.7.2": { - "cookie": "private" - }, - "accepts@1.3.8": { - "accepts": "private" - }, - "methods@1.1.2": { - "methods": "private" - }, - "type-is@1.6.18": { - "type-is": "private" - }, - "parseurl@1.3.3": { - "parseurl": "private" - }, - "statuses@2.0.2": { - "statuses": "private" - }, - "encodeurl@2.0.0": { - "encodeurl": "private" - }, - "proxy-addr@2.0.8": { - "proxy-addr": "private" - }, - "body-parser@1.20.8": { - "body-parser": "private" - }, - "escape-html@1.0.3": { - "escape-html": "private" - }, - "http-errors@2.0.1": { - "http-errors": "private" - }, - "on-finished@2.4.1": { - "on-finished": "private" - }, - "safe-buffer@5.2.1": { - "safe-buffer": "private" - }, - "utils-merge@1.0.1": { - "utils-merge": "private" - }, - "content-type@1.0.5": { - "content-type": "private" - }, - "finalhandler@1.3.2": { - "finalhandler": "private" - }, - "range-parser@1.2.1": { - "range-parser": "private" - }, - "serve-static@1.16.3": { - "serve-static": "private" - }, - "array-flatten@1.1.1": { - "array-flatten": "private" - }, - "path-to-regexp@0.1.13": { - "path-to-regexp": "private" - }, - "setprototypeof@1.2.0": { - "setprototypeof": "private" - }, - "cookie-signature@1.0.7": { - "cookie-signature": "private" - }, - "merge-descriptors@1.0.3": { - "merge-descriptors": "private" - }, - "content-disposition@0.5.4": { - "content-disposition": "private" - }, - "mime-types@2.1.35": { - "mime-types": "private" - }, - "negotiator@0.6.3": { - "negotiator": "private" - }, - "bytes@3.1.2": { - "bytes": "private" - }, - "unpipe@1.0.0": { - "unpipe": "private" - }, - "destroy@1.2.0": { - "destroy": "private" - }, - "raw-body@2.5.3": { - "raw-body": "private" - }, - "iconv-lite@0.4.24": { - "iconv-lite": "private" - }, - "ms@2.0.0": { - "ms": "private" - }, - "inherits@2.0.4": { - "inherits": "private" - }, - "toidentifier@1.0.1": { - "toidentifier": "private" - }, - "ee-first@1.1.1": { - "ee-first": "private" - }, - "forwarded@0.2.0": { - "forwarded": "private" - }, - "ipaddr.js@1.9.1": { - "ipaddr.js": "private" - }, - "side-channel@1.1.1": { - "side-channel": "private" - }, - "es-define-property@1.0.1": { - "es-define-property": "private" - }, - "mime@1.6.0": { - "mime": "private" - }, - "media-typer@0.3.0": { - "media-typer": "private" - }, - "safer-buffer@2.1.2": { - "safer-buffer": "private" - }, - "mime-db@1.52.0": { - "mime-db": "private" - }, - "es-errors@1.3.0": { - "es-errors": "private" - }, - "object-inspect@1.13.4": { - "object-inspect": "private" - }, - "side-channel-list@1.0.1": { - "side-channel-list": "private" - }, - "side-channel-map@1.0.1": { - "side-channel-map": "private" - }, - "side-channel-weakmap@1.0.2": { - "side-channel-weakmap": "private" - }, - "call-bound@1.0.4": { - "call-bound": "private" - }, - "get-intrinsic@1.3.0": { - "get-intrinsic": "private" - }, - "call-bind-apply-helpers@1.0.2": { - "call-bind-apply-helpers": "private" - }, - "gopd@1.2.0": { - "gopd": "private" - }, - "hasown@2.0.4": { - "hasown": "private" - }, - "get-proto@1.0.1": { - "get-proto": "private" - }, - "has-symbols@1.1.0": { - "has-symbols": "private" - }, - "function-bind@1.1.2": { - "function-bind": "private" - }, - "es-object-atoms@1.1.2": { - "es-object-atoms": "private" - }, - "math-intrinsics@1.1.0": { - "math-intrinsics": "private" - }, - "dunder-proto@1.0.1": { - "dunder-proto": "private" - } - }, - "hoistPattern": [ - "*" - ], - "included": { - "dependencies": true, - "devDependencies": true, - "optionalDependencies": true - }, - "injectedDeps": {}, - "layoutVersion": 5, - "nodeLinker": "isolated", - "packageManager": "pnpm@11.26.0", - "pendingBuilds": [], - "publicHoistPattern": [], - "skipped": [ - "@esbuild/aix-ppc64@0.24.2", - "@esbuild/android-arm64@0.24.2", - "@esbuild/android-arm@0.24.2", - "@esbuild/android-x64@0.24.2", - "@esbuild/darwin-arm64@0.24.2", - "@esbuild/darwin-x64@0.24.2", - "@esbuild/freebsd-arm64@0.24.2", - "@esbuild/freebsd-x64@0.24.2", - "@esbuild/linux-arm64@0.24.2", - "@esbuild/linux-arm@0.24.2", - "@esbuild/linux-ia32@0.24.2", - "@esbuild/linux-loong64@0.24.2", - "@esbuild/linux-mips64el@0.24.2", - "@esbuild/linux-ppc64@0.24.2", - "@esbuild/linux-riscv64@0.24.2", - "@esbuild/linux-s390x@0.24.2", - "@esbuild/netbsd-arm64@0.24.2", - "@esbuild/netbsd-x64@0.24.2", - "@esbuild/openbsd-arm64@0.24.2", - "@esbuild/openbsd-x64@0.24.2", - "@esbuild/sunos-x64@0.24.2", - "@esbuild/win32-arm64@0.24.2", - "@esbuild/win32-ia32@0.24.2", - "@esbuild/win32-x64@0.24.2" - ], - "storeDir": "/home/pedro/.local/share/pnpm/store/v11", - "virtualStoreDir": ".pnpm", - "virtualStoreDirMaxLength": 120, - "allowBuilds": { - "esbuild": true - } -} \ No newline at end of file diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.package-lock.json b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.package-lock.json deleted file mode 100644 index 05d8711d..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.package-lock.json +++ /dev/null @@ -1,889 +0,0 @@ -{ - "name": "general-ultra-realistic-terrain-algorithm", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.8", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.8.tgz", - "integrity": "sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.16.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.3.tgz", - "integrity": "sha512-Bdcs4+3qlpVlx2NRn6fgX2Ue2/gGRaPeawebgclM0ERSCqDpA+owF1fdPwjJUTAJWMTuAaxjDf+hzb0/4eKvvw==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.5", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.13", - "proxy-addr": "~2.0.7", - "qs": "~6.16.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", - "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/qs": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", - "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simplex-noise": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/simplex-noise/-/simplex-noise-4.0.3.tgz", - "integrity": "sha512-qSE2I4AngLQG7BXqoZj51jokT4WUXe8mOBrvfOXpci8+6Yu44+/dD5zqDpOx3Ux792eamTd2lLcI8jqFntk/lg==", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - } - } -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.package-map.json b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.package-map.json deleted file mode 100644 index 3802d3d8..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.package-map.json +++ /dev/null @@ -1 +0,0 @@ -{"packages":{".":{"url":"..","dependencies":{"esbuild":"esbuild@0.24.2","express":"express@4.22.3","general-ultra-realistic-terrain-algorithm":".","simplex-noise":"simplex-noise@4.0.3"}},"@esbuild/aix-ppc64@0.24.2":{"url":"./.pnpm/@esbuild+aix-ppc64@0.24.2/node_modules/@esbuild/aix-ppc64","dependencies":{"@esbuild/aix-ppc64":"@esbuild/aix-ppc64@0.24.2"}},"@esbuild/android-arm64@0.24.2":{"url":"./.pnpm/@esbuild+android-arm64@0.24.2/node_modules/@esbuild/android-arm64","dependencies":{"@esbuild/android-arm64":"@esbuild/android-arm64@0.24.2"}},"@esbuild/android-arm@0.24.2":{"url":"./.pnpm/@esbuild+android-arm@0.24.2/node_modules/@esbuild/android-arm","dependencies":{"@esbuild/android-arm":"@esbuild/android-arm@0.24.2"}},"@esbuild/android-x64@0.24.2":{"url":"./.pnpm/@esbuild+android-x64@0.24.2/node_modules/@esbuild/android-x64","dependencies":{"@esbuild/android-x64":"@esbuild/android-x64@0.24.2"}},"@esbuild/darwin-arm64@0.24.2":{"url":"./.pnpm/@esbuild+darwin-arm64@0.24.2/node_modules/@esbuild/darwin-arm64","dependencies":{"@esbuild/darwin-arm64":"@esbuild/darwin-arm64@0.24.2"}},"@esbuild/darwin-x64@0.24.2":{"url":"./.pnpm/@esbuild+darwin-x64@0.24.2/node_modules/@esbuild/darwin-x64","dependencies":{"@esbuild/darwin-x64":"@esbuild/darwin-x64@0.24.2"}},"@esbuild/freebsd-arm64@0.24.2":{"url":"./.pnpm/@esbuild+freebsd-arm64@0.24.2/node_modules/@esbuild/freebsd-arm64","dependencies":{"@esbuild/freebsd-arm64":"@esbuild/freebsd-arm64@0.24.2"}},"@esbuild/freebsd-x64@0.24.2":{"url":"./.pnpm/@esbuild+freebsd-x64@0.24.2/node_modules/@esbuild/freebsd-x64","dependencies":{"@esbuild/freebsd-x64":"@esbuild/freebsd-x64@0.24.2"}},"@esbuild/linux-arm64@0.24.2":{"url":"./.pnpm/@esbuild+linux-arm64@0.24.2/node_modules/@esbuild/linux-arm64","dependencies":{"@esbuild/linux-arm64":"@esbuild/linux-arm64@0.24.2"}},"@esbuild/linux-arm@0.24.2":{"url":"./.pnpm/@esbuild+linux-arm@0.24.2/node_modules/@esbuild/linux-arm","dependencies":{"@esbuild/linux-arm":"@esbuild/linux-arm@0.24.2"}},"@esbuild/linux-ia32@0.24.2":{"url":"./.pnpm/@esbuild+linux-ia32@0.24.2/node_modules/@esbuild/linux-ia32","dependencies":{"@esbuild/linux-ia32":"@esbuild/linux-ia32@0.24.2"}},"@esbuild/linux-loong64@0.24.2":{"url":"./.pnpm/@esbuild+linux-loong64@0.24.2/node_modules/@esbuild/linux-loong64","dependencies":{"@esbuild/linux-loong64":"@esbuild/linux-loong64@0.24.2"}},"@esbuild/linux-mips64el@0.24.2":{"url":"./.pnpm/@esbuild+linux-mips64el@0.24.2/node_modules/@esbuild/linux-mips64el","dependencies":{"@esbuild/linux-mips64el":"@esbuild/linux-mips64el@0.24.2"}},"@esbuild/linux-ppc64@0.24.2":{"url":"./.pnpm/@esbuild+linux-ppc64@0.24.2/node_modules/@esbuild/linux-ppc64","dependencies":{"@esbuild/linux-ppc64":"@esbuild/linux-ppc64@0.24.2"}},"@esbuild/linux-riscv64@0.24.2":{"url":"./.pnpm/@esbuild+linux-riscv64@0.24.2/node_modules/@esbuild/linux-riscv64","dependencies":{"@esbuild/linux-riscv64":"@esbuild/linux-riscv64@0.24.2"}},"@esbuild/linux-s390x@0.24.2":{"url":"./.pnpm/@esbuild+linux-s390x@0.24.2/node_modules/@esbuild/linux-s390x","dependencies":{"@esbuild/linux-s390x":"@esbuild/linux-s390x@0.24.2"}},"@esbuild/linux-x64@0.24.2":{"url":"./.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64","dependencies":{"@esbuild/linux-x64":"@esbuild/linux-x64@0.24.2"}},"@esbuild/netbsd-arm64@0.24.2":{"url":"./.pnpm/@esbuild+netbsd-arm64@0.24.2/node_modules/@esbuild/netbsd-arm64","dependencies":{"@esbuild/netbsd-arm64":"@esbuild/netbsd-arm64@0.24.2"}},"@esbuild/netbsd-x64@0.24.2":{"url":"./.pnpm/@esbuild+netbsd-x64@0.24.2/node_modules/@esbuild/netbsd-x64","dependencies":{"@esbuild/netbsd-x64":"@esbuild/netbsd-x64@0.24.2"}},"@esbuild/openbsd-arm64@0.24.2":{"url":"./.pnpm/@esbuild+openbsd-arm64@0.24.2/node_modules/@esbuild/openbsd-arm64","dependencies":{"@esbuild/openbsd-arm64":"@esbuild/openbsd-arm64@0.24.2"}},"@esbuild/openbsd-x64@0.24.2":{"url":"./.pnpm/@esbuild+openbsd-x64@0.24.2/node_modules/@esbuild/openbsd-x64","dependencies":{"@esbuild/openbsd-x64":"@esbuild/openbsd-x64@0.24.2"}},"@esbuild/sunos-x64@0.24.2":{"url":"./.pnpm/@esbuild+sunos-x64@0.24.2/node_modules/@esbuild/sunos-x64","dependencies":{"@esbuild/sunos-x64":"@esbuild/sunos-x64@0.24.2"}},"@esbuild/win32-arm64@0.24.2":{"url":"./.pnpm/@esbuild+win32-arm64@0.24.2/node_modules/@esbuild/win32-arm64","dependencies":{"@esbuild/win32-arm64":"@esbuild/win32-arm64@0.24.2"}},"@esbuild/win32-ia32@0.24.2":{"url":"./.pnpm/@esbuild+win32-ia32@0.24.2/node_modules/@esbuild/win32-ia32","dependencies":{"@esbuild/win32-ia32":"@esbuild/win32-ia32@0.24.2"}},"@esbuild/win32-x64@0.24.2":{"url":"./.pnpm/@esbuild+win32-x64@0.24.2/node_modules/@esbuild/win32-x64","dependencies":{"@esbuild/win32-x64":"@esbuild/win32-x64@0.24.2"}},"accepts@1.3.8":{"url":"./.pnpm/accepts@1.3.8/node_modules/accepts","dependencies":{"accepts":"accepts@1.3.8","mime-types":"mime-types@2.1.35","negotiator":"negotiator@0.6.3"}},"array-flatten@1.1.1":{"url":"./.pnpm/array-flatten@1.1.1/node_modules/array-flatten","dependencies":{"array-flatten":"array-flatten@1.1.1"}},"body-parser@1.20.8":{"url":"./.pnpm/body-parser@1.20.8/node_modules/body-parser","dependencies":{"body-parser":"body-parser@1.20.8","bytes":"bytes@3.1.2","content-type":"content-type@1.0.5","debug":"debug@2.6.9","depd":"depd@2.0.0","destroy":"destroy@1.2.0","http-errors":"http-errors@2.0.1","iconv-lite":"iconv-lite@0.4.24","on-finished":"on-finished@2.4.1","qs":"qs@6.16.0","raw-body":"raw-body@2.5.3","type-is":"type-is@1.6.18","unpipe":"unpipe@1.0.0"}},"bytes@3.1.2":{"url":"./.pnpm/bytes@3.1.2/node_modules/bytes","dependencies":{"bytes":"bytes@3.1.2"}},"call-bind-apply-helpers@1.0.2":{"url":"./.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers","dependencies":{"call-bind-apply-helpers":"call-bind-apply-helpers@1.0.2","es-errors":"es-errors@1.3.0","function-bind":"function-bind@1.1.2"}},"call-bound@1.0.4":{"url":"./.pnpm/call-bound@1.0.4/node_modules/call-bound","dependencies":{"call-bind-apply-helpers":"call-bind-apply-helpers@1.0.2","call-bound":"call-bound@1.0.4","get-intrinsic":"get-intrinsic@1.3.0"}},"content-disposition@0.5.4":{"url":"./.pnpm/content-disposition@0.5.4/node_modules/content-disposition","dependencies":{"content-disposition":"content-disposition@0.5.4","safe-buffer":"safe-buffer@5.2.1"}},"content-type@1.0.5":{"url":"./.pnpm/content-type@1.0.5/node_modules/content-type","dependencies":{"content-type":"content-type@1.0.5"}},"cookie-signature@1.0.7":{"url":"./.pnpm/cookie-signature@1.0.7/node_modules/cookie-signature","dependencies":{"cookie-signature":"cookie-signature@1.0.7"}},"cookie@0.7.2":{"url":"./.pnpm/cookie@0.7.2/node_modules/cookie","dependencies":{"cookie":"cookie@0.7.2"}},"debug@2.6.9":{"url":"./.pnpm/debug@2.6.9/node_modules/debug","dependencies":{"debug":"debug@2.6.9","ms":"ms@2.0.0"}},"depd@2.0.0":{"url":"./.pnpm/depd@2.0.0/node_modules/depd","dependencies":{"depd":"depd@2.0.0"}},"destroy@1.2.0":{"url":"./.pnpm/destroy@1.2.0/node_modules/destroy","dependencies":{"destroy":"destroy@1.2.0"}},"dunder-proto@1.0.1":{"url":"./.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto","dependencies":{"call-bind-apply-helpers":"call-bind-apply-helpers@1.0.2","dunder-proto":"dunder-proto@1.0.1","es-errors":"es-errors@1.3.0","gopd":"gopd@1.2.0"}},"ee-first@1.1.1":{"url":"./.pnpm/ee-first@1.1.1/node_modules/ee-first","dependencies":{"ee-first":"ee-first@1.1.1"}},"encodeurl@2.0.0":{"url":"./.pnpm/encodeurl@2.0.0/node_modules/encodeurl","dependencies":{"encodeurl":"encodeurl@2.0.0"}},"es-define-property@1.0.1":{"url":"./.pnpm/es-define-property@1.0.1/node_modules/es-define-property","dependencies":{"es-define-property":"es-define-property@1.0.1"}},"es-errors@1.3.0":{"url":"./.pnpm/es-errors@1.3.0/node_modules/es-errors","dependencies":{"es-errors":"es-errors@1.3.0"}},"es-object-atoms@1.1.2":{"url":"./.pnpm/es-object-atoms@1.1.2/node_modules/es-object-atoms","dependencies":{"es-errors":"es-errors@1.3.0","es-object-atoms":"es-object-atoms@1.1.2"}},"esbuild@0.24.2":{"url":"./.pnpm/esbuild@0.24.2/node_modules/esbuild","dependencies":{"@esbuild/aix-ppc64":"@esbuild/aix-ppc64@0.24.2","@esbuild/android-arm":"@esbuild/android-arm@0.24.2","@esbuild/android-arm64":"@esbuild/android-arm64@0.24.2","@esbuild/android-x64":"@esbuild/android-x64@0.24.2","@esbuild/darwin-arm64":"@esbuild/darwin-arm64@0.24.2","@esbuild/darwin-x64":"@esbuild/darwin-x64@0.24.2","@esbuild/freebsd-arm64":"@esbuild/freebsd-arm64@0.24.2","@esbuild/freebsd-x64":"@esbuild/freebsd-x64@0.24.2","@esbuild/linux-arm":"@esbuild/linux-arm@0.24.2","@esbuild/linux-arm64":"@esbuild/linux-arm64@0.24.2","@esbuild/linux-ia32":"@esbuild/linux-ia32@0.24.2","@esbuild/linux-loong64":"@esbuild/linux-loong64@0.24.2","@esbuild/linux-mips64el":"@esbuild/linux-mips64el@0.24.2","@esbuild/linux-ppc64":"@esbuild/linux-ppc64@0.24.2","@esbuild/linux-riscv64":"@esbuild/linux-riscv64@0.24.2","@esbuild/linux-s390x":"@esbuild/linux-s390x@0.24.2","@esbuild/linux-x64":"@esbuild/linux-x64@0.24.2","@esbuild/netbsd-arm64":"@esbuild/netbsd-arm64@0.24.2","@esbuild/netbsd-x64":"@esbuild/netbsd-x64@0.24.2","@esbuild/openbsd-arm64":"@esbuild/openbsd-arm64@0.24.2","@esbuild/openbsd-x64":"@esbuild/openbsd-x64@0.24.2","@esbuild/sunos-x64":"@esbuild/sunos-x64@0.24.2","@esbuild/win32-arm64":"@esbuild/win32-arm64@0.24.2","@esbuild/win32-ia32":"@esbuild/win32-ia32@0.24.2","@esbuild/win32-x64":"@esbuild/win32-x64@0.24.2","esbuild":"esbuild@0.24.2"}},"escape-html@1.0.3":{"url":"./.pnpm/escape-html@1.0.3/node_modules/escape-html","dependencies":{"escape-html":"escape-html@1.0.3"}},"etag@1.8.1":{"url":"./.pnpm/etag@1.8.1/node_modules/etag","dependencies":{"etag":"etag@1.8.1"}},"express@4.22.3":{"url":"./.pnpm/express@4.22.3/node_modules/express","dependencies":{"accepts":"accepts@1.3.8","array-flatten":"array-flatten@1.1.1","body-parser":"body-parser@1.20.8","content-disposition":"content-disposition@0.5.4","content-type":"content-type@1.0.5","cookie":"cookie@0.7.2","cookie-signature":"cookie-signature@1.0.7","debug":"debug@2.6.9","depd":"depd@2.0.0","encodeurl":"encodeurl@2.0.0","escape-html":"escape-html@1.0.3","etag":"etag@1.8.1","express":"express@4.22.3","finalhandler":"finalhandler@1.3.2","fresh":"fresh@0.5.2","http-errors":"http-errors@2.0.1","merge-descriptors":"merge-descriptors@1.0.3","methods":"methods@1.1.2","on-finished":"on-finished@2.4.1","parseurl":"parseurl@1.3.3","path-to-regexp":"path-to-regexp@0.1.13","proxy-addr":"proxy-addr@2.0.8","qs":"qs@6.16.0","range-parser":"range-parser@1.2.1","safe-buffer":"safe-buffer@5.2.1","send":"send@0.19.2","serve-static":"serve-static@1.16.3","setprototypeof":"setprototypeof@1.2.0","statuses":"statuses@2.0.2","type-is":"type-is@1.6.18","utils-merge":"utils-merge@1.0.1","vary":"vary@1.1.2"}},"finalhandler@1.3.2":{"url":"./.pnpm/finalhandler@1.3.2/node_modules/finalhandler","dependencies":{"debug":"debug@2.6.9","encodeurl":"encodeurl@2.0.0","escape-html":"escape-html@1.0.3","finalhandler":"finalhandler@1.3.2","on-finished":"on-finished@2.4.1","parseurl":"parseurl@1.3.3","statuses":"statuses@2.0.2","unpipe":"unpipe@1.0.0"}},"forwarded@0.2.0":{"url":"./.pnpm/forwarded@0.2.0/node_modules/forwarded","dependencies":{"forwarded":"forwarded@0.2.0"}},"fresh@0.5.2":{"url":"./.pnpm/fresh@0.5.2/node_modules/fresh","dependencies":{"fresh":"fresh@0.5.2"}},"function-bind@1.1.2":{"url":"./.pnpm/function-bind@1.1.2/node_modules/function-bind","dependencies":{"function-bind":"function-bind@1.1.2"}},"get-intrinsic@1.3.0":{"url":"./.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic","dependencies":{"call-bind-apply-helpers":"call-bind-apply-helpers@1.0.2","es-define-property":"es-define-property@1.0.1","es-errors":"es-errors@1.3.0","es-object-atoms":"es-object-atoms@1.1.2","function-bind":"function-bind@1.1.2","get-intrinsic":"get-intrinsic@1.3.0","get-proto":"get-proto@1.0.1","gopd":"gopd@1.2.0","has-symbols":"has-symbols@1.1.0","hasown":"hasown@2.0.4","math-intrinsics":"math-intrinsics@1.1.0"}},"get-proto@1.0.1":{"url":"./.pnpm/get-proto@1.0.1/node_modules/get-proto","dependencies":{"dunder-proto":"dunder-proto@1.0.1","es-object-atoms":"es-object-atoms@1.1.2","get-proto":"get-proto@1.0.1"}},"gopd@1.2.0":{"url":"./.pnpm/gopd@1.2.0/node_modules/gopd","dependencies":{"gopd":"gopd@1.2.0"}},"has-symbols@1.1.0":{"url":"./.pnpm/has-symbols@1.1.0/node_modules/has-symbols","dependencies":{"has-symbols":"has-symbols@1.1.0"}},"hasown@2.0.4":{"url":"./.pnpm/hasown@2.0.4/node_modules/hasown","dependencies":{"function-bind":"function-bind@1.1.2","hasown":"hasown@2.0.4"}},"http-errors@2.0.1":{"url":"./.pnpm/http-errors@2.0.1/node_modules/http-errors","dependencies":{"depd":"depd@2.0.0","http-errors":"http-errors@2.0.1","inherits":"inherits@2.0.4","setprototypeof":"setprototypeof@1.2.0","statuses":"statuses@2.0.2","toidentifier":"toidentifier@1.0.1"}},"iconv-lite@0.4.24":{"url":"./.pnpm/iconv-lite@0.4.24/node_modules/iconv-lite","dependencies":{"iconv-lite":"iconv-lite@0.4.24","safer-buffer":"safer-buffer@2.1.2"}},"inherits@2.0.4":{"url":"./.pnpm/inherits@2.0.4/node_modules/inherits","dependencies":{"inherits":"inherits@2.0.4"}},"ipaddr.js@1.9.1":{"url":"./.pnpm/ipaddr.js@1.9.1/node_modules/ipaddr.js","dependencies":{"ipaddr.js":"ipaddr.js@1.9.1"}},"math-intrinsics@1.1.0":{"url":"./.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics","dependencies":{"math-intrinsics":"math-intrinsics@1.1.0"}},"media-typer@0.3.0":{"url":"./.pnpm/media-typer@0.3.0/node_modules/media-typer","dependencies":{"media-typer":"media-typer@0.3.0"}},"merge-descriptors@1.0.3":{"url":"./.pnpm/merge-descriptors@1.0.3/node_modules/merge-descriptors","dependencies":{"merge-descriptors":"merge-descriptors@1.0.3"}},"methods@1.1.2":{"url":"./.pnpm/methods@1.1.2/node_modules/methods","dependencies":{"methods":"methods@1.1.2"}},"mime-db@1.52.0":{"url":"./.pnpm/mime-db@1.52.0/node_modules/mime-db","dependencies":{"mime-db":"mime-db@1.52.0"}},"mime-types@2.1.35":{"url":"./.pnpm/mime-types@2.1.35/node_modules/mime-types","dependencies":{"mime-db":"mime-db@1.52.0","mime-types":"mime-types@2.1.35"}},"mime@1.6.0":{"url":"./.pnpm/mime@1.6.0/node_modules/mime","dependencies":{"mime":"mime@1.6.0"}},"ms@2.0.0":{"url":"./.pnpm/ms@2.0.0/node_modules/ms","dependencies":{"ms":"ms@2.0.0"}},"ms@2.1.3":{"url":"./.pnpm/ms@2.1.3/node_modules/ms","dependencies":{"ms":"ms@2.1.3"}},"negotiator@0.6.3":{"url":"./.pnpm/negotiator@0.6.3/node_modules/negotiator","dependencies":{"negotiator":"negotiator@0.6.3"}},"object-inspect@1.13.4":{"url":"./.pnpm/object-inspect@1.13.4/node_modules/object-inspect","dependencies":{"object-inspect":"object-inspect@1.13.4"}},"on-finished@2.4.1":{"url":"./.pnpm/on-finished@2.4.1/node_modules/on-finished","dependencies":{"ee-first":"ee-first@1.1.1","on-finished":"on-finished@2.4.1"}},"parseurl@1.3.3":{"url":"./.pnpm/parseurl@1.3.3/node_modules/parseurl","dependencies":{"parseurl":"parseurl@1.3.3"}},"path-to-regexp@0.1.13":{"url":"./.pnpm/path-to-regexp@0.1.13/node_modules/path-to-regexp","dependencies":{"path-to-regexp":"path-to-regexp@0.1.13"}},"proxy-addr@2.0.8":{"url":"./.pnpm/proxy-addr@2.0.8/node_modules/proxy-addr","dependencies":{"forwarded":"forwarded@0.2.0","ipaddr.js":"ipaddr.js@1.9.1","proxy-addr":"proxy-addr@2.0.8"}},"qs@6.16.0":{"url":"./.pnpm/qs@6.16.0/node_modules/qs","dependencies":{"es-define-property":"es-define-property@1.0.1","qs":"qs@6.16.0","side-channel":"side-channel@1.1.1"}},"range-parser@1.2.1":{"url":"./.pnpm/range-parser@1.2.1/node_modules/range-parser","dependencies":{"range-parser":"range-parser@1.2.1"}},"raw-body@2.5.3":{"url":"./.pnpm/raw-body@2.5.3/node_modules/raw-body","dependencies":{"bytes":"bytes@3.1.2","http-errors":"http-errors@2.0.1","iconv-lite":"iconv-lite@0.4.24","raw-body":"raw-body@2.5.3","unpipe":"unpipe@1.0.0"}},"safe-buffer@5.2.1":{"url":"./.pnpm/safe-buffer@5.2.1/node_modules/safe-buffer","dependencies":{"safe-buffer":"safe-buffer@5.2.1"}},"safer-buffer@2.1.2":{"url":"./.pnpm/safer-buffer@2.1.2/node_modules/safer-buffer","dependencies":{"safer-buffer":"safer-buffer@2.1.2"}},"send@0.19.2":{"url":"./.pnpm/send@0.19.2/node_modules/send","dependencies":{"debug":"debug@2.6.9","depd":"depd@2.0.0","destroy":"destroy@1.2.0","encodeurl":"encodeurl@2.0.0","escape-html":"escape-html@1.0.3","etag":"etag@1.8.1","fresh":"fresh@0.5.2","http-errors":"http-errors@2.0.1","mime":"mime@1.6.0","ms":"ms@2.1.3","on-finished":"on-finished@2.4.1","range-parser":"range-parser@1.2.1","send":"send@0.19.2","statuses":"statuses@2.0.2"}},"serve-static@1.16.3":{"url":"./.pnpm/serve-static@1.16.3/node_modules/serve-static","dependencies":{"encodeurl":"encodeurl@2.0.0","escape-html":"escape-html@1.0.3","parseurl":"parseurl@1.3.3","send":"send@0.19.2","serve-static":"serve-static@1.16.3"}},"setprototypeof@1.2.0":{"url":"./.pnpm/setprototypeof@1.2.0/node_modules/setprototypeof","dependencies":{"setprototypeof":"setprototypeof@1.2.0"}},"side-channel-list@1.0.1":{"url":"./.pnpm/side-channel-list@1.0.1/node_modules/side-channel-list","dependencies":{"es-errors":"es-errors@1.3.0","object-inspect":"object-inspect@1.13.4","side-channel-list":"side-channel-list@1.0.1"}},"side-channel-map@1.0.1":{"url":"./.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map","dependencies":{"call-bound":"call-bound@1.0.4","es-errors":"es-errors@1.3.0","get-intrinsic":"get-intrinsic@1.3.0","object-inspect":"object-inspect@1.13.4","side-channel-map":"side-channel-map@1.0.1"}},"side-channel-weakmap@1.0.2":{"url":"./.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap","dependencies":{"call-bound":"call-bound@1.0.4","es-errors":"es-errors@1.3.0","get-intrinsic":"get-intrinsic@1.3.0","object-inspect":"object-inspect@1.13.4","side-channel-map":"side-channel-map@1.0.1","side-channel-weakmap":"side-channel-weakmap@1.0.2"}},"side-channel@1.1.1":{"url":"./.pnpm/side-channel@1.1.1/node_modules/side-channel","dependencies":{"es-errors":"es-errors@1.3.0","object-inspect":"object-inspect@1.13.4","side-channel":"side-channel@1.1.1","side-channel-list":"side-channel-list@1.0.1","side-channel-map":"side-channel-map@1.0.1","side-channel-weakmap":"side-channel-weakmap@1.0.2"}},"simplex-noise@4.0.3":{"url":"./.pnpm/simplex-noise@4.0.3/node_modules/simplex-noise","dependencies":{"simplex-noise":"simplex-noise@4.0.3"}},"statuses@2.0.2":{"url":"./.pnpm/statuses@2.0.2/node_modules/statuses","dependencies":{"statuses":"statuses@2.0.2"}},"toidentifier@1.0.1":{"url":"./.pnpm/toidentifier@1.0.1/node_modules/toidentifier","dependencies":{"toidentifier":"toidentifier@1.0.1"}},"type-is@1.6.18":{"url":"./.pnpm/type-is@1.6.18/node_modules/type-is","dependencies":{"media-typer":"media-typer@0.3.0","mime-types":"mime-types@2.1.35","type-is":"type-is@1.6.18"}},"unpipe@1.0.0":{"url":"./.pnpm/unpipe@1.0.0/node_modules/unpipe","dependencies":{"unpipe":"unpipe@1.0.0"}},"utils-merge@1.0.1":{"url":"./.pnpm/utils-merge@1.0.1/node_modules/utils-merge","dependencies":{"utils-merge":"utils-merge@1.0.1"}},"vary@1.1.2":{"url":"./.pnpm/vary@1.1.2/node_modules/vary","dependencies":{"vary":"vary@1.1.2"}}}} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm-workspace-state-v1.json b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm-workspace-state-v1.json deleted file mode 100644 index 7f7c68cb..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm-workspace-state-v1.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "lastValidatedTimestamp": 1789906845662, - "projects": { - "/home/pedro/repo/general-ultra-realistic-terrain-algorithm": { - "name": "general-ultra-realistic-terrain-algorithm", - "version": "1.0.0" - } - }, - "pnpmfiles": [], - "settings": { - "allowBuilds": { - "esbuild": true - }, - "autoInstallPeers": true, - "catalogs": {}, - "dedupeDirectDeps": false, - "dedupeInjectedDeps": true, - "dedupePeerDependents": true, - "dedupePeers": false, - "dev": true, - "excludeLinksFromLockfile": false, - "hoistPattern": [ - "*" - ], - "hoistWorkspacePackages": true, - "injectWorkspacePackages": false, - "linkWorkspacePackages": false, - "minimumReleaseAge": 1440, - "minimumReleaseAgeIgnoreMissingTime": true, - "nodeLinker": "isolated", - "optional": true, - "peersSuffixMaxLength": 1000, - "preferWorkspacePackages": false, - "production": true, - "publicHoistPattern": [], - "workspacePackagePatterns": [ - "." - ] - }, - "filteredInstall": false -} diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64/README.md b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64/README.md deleted file mode 100644 index b2f19300..00000000 --- a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# esbuild - -This is the Linux 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. diff --git a/assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64/bin/esbuild b/assets/general-ultra-realistic-terrain-algorithm/node_modules/.pnpm/@esbuild+linux-x64@0.24.2/node_modules/@esbuild/linux-x64/bin/esbuild deleted file mode 100755 index 3ae20d06b2401906e33e3badf85989568e78ccd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10182808 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 z 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%0ArRV^lU{t)qhye_wpDF;W*2NT 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%0AaowNBzq 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
(>ERV3f?X-%dM_a`+xyf3q3*3$0I%Tp3 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

G1p2p7Eb2{OUF??r&P9^P!vPoTnQn?3#&OHXW{? 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%0ALBX$O2U&;-ejU>-pEcLhok-y@4$%(8> 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

A(L66Nha6g=FWq3~ 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Ð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

  • rK%@C%|k)xmXur%{% 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
    EISqG z0zmPG`HSSEP8`by3l~OVTc(=pFXo2@QT&x6mpTnhC zfcHCG^Z>|lAU^d-|h~HUza?vHaQJ% z)QvC08+CZ(4&y?;R>x=V07eK#>M);QoBSppyW2V0S8y@y1&o>VS{_1Xlhv$P#_$53WDpr{K`il)q$^pF;miZ z!(DF~-=#Co7w`_xc>(W^e=z}BKjQm$jp$tuJ&dYhJ4z8X%L)ae3UG)brdyyPVE|(C z{6v!r zYd|>mfcwO%ah~dAkXRUmZsK#6+4<+h=OQxKtGP70Q!}7z;+wxpu z27fUJe=G-I3fzAm49g(FM6rIe%{{{EQmLyPoy;2c-dGpk4DQ_6I%tY1toC_h)~9(1xGy&i){duQ4y? z#@9!p?RHZvX{i>N<>POBOGT({jf9|wANZ1aU#}jawtAEUk_x~nHUT^ZST!Z2SVKwy zWbHS$i_iY9Pu5^oW=6pOHg=x^obwcZ1^`zom^NqIoB0b|e1V&NC(f9%#{u81v>nP~ zu>#!|nC~7?YnBAs5r`tK<)ZZ2SOZ68W*SU=zP`{Wa6K3H$dsEm8bl2Dh<&3&FfVt9 z+fL)Qsg8Q84^Q@Ccj@eiKH0~p*$?y4tJ?`h`*a^Y%UBflKs284`v%0)4f(H~aSH2) znOEiX zCIoX{@mnmcmfQPS{8#*FWzs%utGNEV?jgU1t8e7Q=59RV#}skJ2>i#gjrqlyE#jb= z#r1>O&xJ>uM!n)^bBzt&OB$d!bKhT3Z86s+$ghFqt>Wg=JM!1=p&#eFAlA;`-V6Rx z@8X-9IH}bFT({zgRYm1*O#U`-?ILRK0gd2c`5TeH75or}fJ7wKK3+sj|xrHt3E>F{XdoY(n$HSfGtc+Qd z{-qfo?fl(o7&STnA{8514YTx7Lrd|CEa0pQk`rK1fnfzY6>#nC^0FQq5^QoME?ZN( zy>Wdnmj_^vk`Oe(ggB!=>;B*eY?!@IDA58@0`!3_B~-(hW?zu|Y~V>q#QJj`Vu^|} z54kmF(gWM`LBOf|MrdB&_v>T|jtP}7DctvGw~*1qPb4A#$r3$B{8VjOlUV?IydO6O z*FWJRg4(i%G)o)yv(mhYC$X3&g7~W6Kk&sKo|3g9My^I=OYYJ#e?}aek%N>YpAvH% z?{FNkUlWh{;pU5M*}qtx97 zrck#Z-@a|A>VE4Ho7D>3A4H>*_+r(z14TMB%d$9Fb7kKzbX4Zojs?2>BUA1BingG{ zp_9rK<}iq4iU~#jO~)Vt2GIb6ObJT<%rf|-U`|SdT%g~{jt?Hf82JoxvS1ZGN7mxl z$Zc7^DB&-T!3A0WiWiL3zm{W#;@eA3LH<9>?S0Y!6rIC>N*BQMPoT$tEo=(mPnzWq z*N>aI^wV4g9@7wo^>f=1mJODPi+E|l&_6-f1X9i~J52s&EmlcL{p#wn!&iGt+iu(Qq4DE~{>~l^&P4s{OOMZ; z_R|Mu5yc6mMVBl%vFPN#OeKmFN+aceYPhU!#!{j

    +3`FZ}*{Z=Hv=EuK(Xx_wIT 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%0D6PsSSa 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 z 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

    2D4NpF(+OL592B%(mKN#yrMY_^Dl`FL3`Lf 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�qO+%ch%@B>sCWrmqFOc#a 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

    x>ANEe3gbkqA7iTBvMK} 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�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

    $rtFaib1eS zmW@cVG#t7%<}Ky1tgtqIGIDoldAeF8 zDncgOQE-PJAW+oc1s0x zek@jE^jWPqrRbjF-x+dLF%>K2!ZZB|GwJF1JF+MGCs$U~@!9=GP7nF?_ZEKY6=Vg@(?M1A|pB;}#S4uV$O@eSyk=DLkSq{#fw{3Z!b3b9*o27+lbW07D2rQ zg4GIYSZ*Wj#5+!MA>vFqeY&0a-YN>+kA{YVxr!Joz{xl*kqFB)fcpHYXQ0c^ab+ z7>Nww^p`?{bS{ERTZ)p-U&7lG?xiemW*oVq2Oa+*^19Fr#^Fb9gc{7A0u^U85Aj2_ z<=_o16AnH&rAlFCiwH#EYR==S3&;V@gc*@eNlcUUIHE=FprSXK5=eClqh!QI6anfoW?H4B3GThuX1#_%48umW zrzer(XWr`*J>8(ju@13cco6^~*r)InwxbT1My)o7JE0Wm()>Tkj)8JGAyIEEza?5O zM-NA^>pW+$$B(|0E0W1F!$^c->G?VK>(LP$w{Rf}^JRFZ&`Up59fD0ki?V~9yohB0 z%V7|ApeD!XETzXIk&P%C=Jl=s$OQ*5oD_H4Tn1 zfR_CYdEa?rAhB>j%>N0tv%+&$s5V9t!g_<0X6yl*WA~yMe96+#4|!Boq;i1-AdF>@ z^dE#V^rrR-msFTf)3nEN5NTzOJtd?5XDl@ZcZ-iT8njh`$HhuOS)~AD`j!&F^bJj< z*0=P*i^cg)3!#Ctavf=ustP1+ZUCQ#-$t_oB)PT0ibH4KK0E(*5m4sunv6x84E;8aep2Qi5DD}mGS%WWS-8JO2 zw%{*)fZEAdjEwr!_m%c6U7ugM)Eoo5-IglLi~q`ER>zKD>cXr7;Ty3d7v0*4101K( zSV&JfuGlurv0z`-BdB|`&J5fm>fh+}?_v?7Oco41!^5bmle;g)j3|0Wywi6qdPa-P zV8%(O?@06{o5uNnM(&rMy8VK6I+fo7WrsJR&qHj3brbp_Y#M#2J@{-!V{f79%OZRe z`gq)geo$^gFNepl5-wulvfY^*DIj6MuKWP!KWb@@a1R^C!%kQ&uf&+x$(8(`Hv2(9 zkC*eXIJ&KblR458soOGx1Imzqr?Uc6ExEQ;QO_351|#*r;D_*N4X+43Y!X8-+Jmiz zYV1zK!cdwve_eTF2wkdi?@^6=FC+IooYKWuN>GgReXit>v{_%`bGrSR#SL;UENul_ z)rT8xX9xJ7Y&wrC-OhDKaQ3XYPq1liNAlhYy(o!C8H;)>+hL}Ei?hQ~SBDK~1g~>l87e+{LuT7` zh&BZ0jg{g*gwGJV_x67}67!db)cQJmiYgS0A%#+I6@)H@u%S1gf5macg#Wc;`X~u* zk@nY1FM`%Ya1ZG=ysvg76;qx*_i*(CCdk~l)ec9T zMtfzpEp~O-?TjvQz~|{K?$@R>&RKs$fP-ryt4*cD91OEV>`6}lk<1QTz<+)?7<6@b zFVnxy`AbPeVJHbyclkfkzZM^*_*#y=evXFO)fep!x#!UPOe2+OsR-7o#ReHip_xdI ze}wDntbj(0QP@zhQ^7y`guJig#W{=(uHcomV1>YC<5^uOaMB1Nz+{Qg1`<%&C{%{2 zj%vT-n<;;!8s?L_q>n-VhsKeASl0g|?@i#Vs?NRtFhl~PJ0dCyXwaxQ)!@*ENrMJGffI>J zYZTfB0gZx~h8&D@FbU1+@z}KGzNM9WOIzD(TkXqjEk&_40mXn;12}+K8@09jG**$e z%An@`{+_k>$svGs>b?KZ{ri#Zwf9-Wvz}=^>sf0(t2F*tG`>Dnq4&{`S9?TaG$z~` zseiQWi{OP&bi4e4hr>=?tJ4O$kxZeB7MvGFmM(HF9gBZ!KnwxNN{tQp^U}l2qEm3k z9MwU@+W0Q`dzF1}@&CqC+X7DE`2kG&`rkf?N#}*jvgsMPet5E&T?Oe)3{ou^M{^k(ieu@0x_msjoZFZ zE=ckOL#0woAf{^j0{d6(6v4SxfE;N22aCXh|E=etPh*SMs9<->O3HM)Up&>{;=@KWJ}GhFW=$Am6ApQq($G)H=l<{MKH4jZ(~mX8Bl&#mscH%jIPL zk~{TUn$I172*DqbKTHhd+ocuzTY$g2dPIz)0ooeFVxZ{jb=5Gqb71CvqScWRg>>GKMG>+M_cV7g!11NBBE}Jc-D~to)^AuJ{XMF za)|@ue1$#lbdDUX)+*i^1Z#Q7Eq4n~h|VlPADR~D-(k_a{hE%S%`Y(MA@UK35|oD@uJjr=l9G!0Jcp8fKPYW(?wK(O>?LLHr2X@O|EhU0Fx_i zMG%`F%2SoQ;)@M#!LMqB2=!m@sz>kYe|P?=@?38Sn6=Ld@&n;ak`3l$ zq~~{rGf6j7W)f0FTN)b*=gu(RxYBF*J#48DGh+kciAvo+wBCKHzS?X2FVC?`&55ZW zlN5d=6kg-iD<*UsMrMTN_>`Ae5!GuHg zg_yUuA>DWn`D$t4I=|D{67~{VU@x(y@pqvm!08y5Se!qWgnt)?FYW~b-?+6S;(Lt| zxa!>6qGN~q_p`||{4o;O<+xuv@p`P-Tz^x)z^8X{umyAisBj$(v1q6NRC$SY}KQovy* zeo$tStXl&1BQDA8!+&;Smj8_gEPW)^SJ`CtE9*xx|M71QzIO1ne*CZ#gzaN=&Nv_u zISbEYzxSq9&QGCyLbym4O|az&6HS|)IO$^hoQj5U|I_iRg_Y!TrW+1Os(EVy)!b>- z1WO6YOUt^O`HH3{zax(TP(;^_YWzuwF0pqX{In&jEu(1%K(Q% zA4TOni+EOY|Am3|6~8Ilu~M>}6Q=3)lg-w#2Liw3Il2`i1NgH9{L>E!2aa_)d{_p+ z!vrvrYNeTb+-F(bVoo=j(oma*a!}XR(V%GO0I!o80(K57Em>y2oQFZ?@tV9z**1Q!RR&pxE$L6DP02`_ceTS`7N_T02L%Gh|xn`3#;*yG2{lXA&)nT0*qcCO18iS82ZiY_fa*ymL{t zf!0K}HLmji9u3vK{>tj z;Q2|Fc#0bp{<}wf?g#rZD(tD-_fTPfSi`~1hk|eIbh3W@v=RGIU^k3McnAI3DKO>h zmdt%Cu*0mDv;teEBHXW_YMxl3YQnvBdnvGi8(xnfaJroir{=1_q- zDt(XwyDd+h`#gFT#dW76d@}nx;{fZdJ;3^wL7di9Uy-J&CR+emzYm7Yl$3+4u1)~L zQx3Qfr=;q~KYNS-B__xc4HFr#{&g&{HvMW(N*J*5W@YVW-#XDLqvZ}>>&M?>6_4>B z>(Z&JK52EBIHM#!AAP-K8`(0{_N{7fNRRd;D3N%xvZ{eV9q$NU19hxHI$b^5RvT#| zXj^-JC~Z4<)H>{&gVDDcdN=;msCB7Q%!O|Ig!rw6p?$F*`y^NPh3Q~+@r8M-1O3)R zZ^@Y%YPkW#&urrzb)2E*4nx6>(C+PG<&Kr+)l^;bLV1axXQLCzAY@W3lXGMIx+;WFphHtb!lg;$*_-ubec5~-Z@Xz7=8^phT@KR@AjpbUHXrw)zMs7G0V;6h! z$(hWeNoM&g6E=k&&eYkzX78yp<6KrJms5l=Xnv7As5xEyMps-j@B8;tT>UPG)~R2^ zoD^P2zDHCq_YZY9K87kaP*svMoVN?W&U1P;KC!#}?yni}YW=+{_gy~S`e?Oo2F;12 zIPP@)-0Ncp)De@n=EQ}C*Uw=dr?)F>jo*b4J#S`Ta}w z+b5mh&toO>ffC6kx1?}{1J(e zwh;_c95z}pl$+H2i#$1g?6Z!_ZfFb)Rpyr?0Rk_M#zee0n%m*&nze0qdW-dFzv zr#he4@i}#!c4P%a){OGw5tk{)INbNRb#t{=5@Dxz9>8Y#KR)Y!xzIXtLO*x7P5T3k zqI;8by2$z5>qgG$AD5gWu*li@)igER*&q>8bKa*y%?a^m7QT{&bEaa$0swb$0F-pS+jtb>Z@ZnsbI}Doz-eGHaGB@U+#S7H5YeY!T0RgXZA4d z#_nO-o#srtSb=Oh&QA>QJb^O(b>)T3!RphlyGC~v9Ku}%wcTsLblcWh)&2NeEK1&b zp0{E!@#z=tssqwn4~Qhc(u<9*N&opSc6bx_0VItSlJb%_wbys`U(lAk>3j8E*$Z0g zS3gp}D|^Ap&Yx%E6k>gd1x5e5O&?)3QS-ml&FQ7uJ=PV&7p*VWvgqj67yaYY>x-I3 z%C6JYQtLKD?8$-?Peyzle__Nwm4}V^1tc`$pJC6%`Df~>k*C7`R%r=IziEiHsu4GOh>I9m;M@S=tzaGc$b(f4-tV8K@XZG~`dK0n){$(9kpqG984_K7PWEXS&2 zDH!hmCoAiVKM%9ML&DYP6b$U#Qwkpai7uGp_pMX7EE6G^LxIE|U4mq_ ztiOA?ZC-BssIBI=WK~Fr`{Ek^IO?_WN9zki`_e2cieG=KkFhn2iCQ0;tM#G7_$`o( zeuB=H65q=cs=_0dSFn^Z2t2yLW|k1|SfVXVl!b}%Fd?JC^3;WirZBN2Ol%Gl9bsY{ z39X96*jQvImY4Iv`S4vNDd)#;2tpFcnZ7hQT;QT8seR{EcZQvFS}(PgXTIaL#%yzW za9cC0B%S&NRCm7Sdr8$jBtP*H;LmH6dG+52Ni^}@WonU52{%M$5=agXVqI~ zPj?<#CSV2c)GMM=?_3^MZtAp zqJpY!=1J8e1XVBPVO1})1XcgQB^KxZkc58?Rjb;|bzKrXDl}=@zMQ9*iva6+h(n0p zw*~LQ2rB^Ue^#vjN^BS8yYqU3ESHa;7@6z@$^QGr=VtjQo&W@H{FLY}AFlp0y-+Ji z?Q~vP*`|F2*M7+22mj&`be~`S2r34-N$ai;6m$(z>E+*N4mDY3`S&1=TH@b^7WYl- zzb68S$#=u&vISu=jDINKoIX2-$$z*Admz96|4ROcqBWiTkAoIQ<|Y@ zckr5_XmiwG^se;BC)N%Ana?{t`$M)+naWZ1pIFZlU;GlM4JU{7`t;(HE7`tO8|v?E zL!2`BScIudkCRE7!3w|!{}6Ow8BvOG+z3=?f(La4Sp zk}^w(3(YL54unN*dbyL>+Q7Y-F3nCD=c;jg43-8a&m{I4xIoq9FH%|{gl3VT;5&MX z6DKZ>o?;ULY3?`l(uz@=Xq`yk0akme#D4;g$*$9Nt|_5|X00g)PTKBq5Pi+rJt0tE zTPacoaHVv%BCQf-i~KhtWiOSOhSaIVG^E>rE2X)GQ;ClWYo-!cb>ok@fxQGPTi@s9 z!*%7;Md)72@M{typ*!eP4t>$9`t*slmL#}Ou_T!NlL(}Yqy#%J5nDFgd_wzBmH+sB ztg!D>bF->0a8*zJR5Z_IReb?fyYWl)w_{;_Y(uo)gEB-rXVZ6fSbsuuUVX2=5CDHP z6mo_BlLFw2w_;kBqe;?MrM9rQzA^--($v=1a{F&@?a1lh-oNbwjZF+icH?xgW7T;$ zm_Ig-Bc`*Ku)M}INQFkDBHo3QMv1-YFv+|nB=DAys9Qps#}ZOIa+=0Y3=ZTwrEvv% z&P^D++$+#?oB<*u_WPH~d;mAfKeQS&9uec14q<8vU|KGmLSl!sfJ5Luhd5Tzg-qTB z5v(F=WyJ=r(!&`(Uy@L(^d}d#>#07xy7}N;^kHG)e0BqSjek8jXj%*f z40qb;QWEZR2>;n5y1M+bBRThL8b&KURpiWyXw=RUHslVjh1@uq`5Vozu%<~ zKcIBvp;_0=ubMmKMy{jI<=U(R4c45hGr=fn4#y$d`(e@8U`SszrejJf3>{ru{v~ku<@ty7H3tl>!&)ys=~$S_eDCNxM{DUEHG(4a=B&OY*ceF&?{U1*@jvC%MqobQ-) zkSWUl*Sbvi7 zu*F4%a<#kGLjUzTuVEX9*Vw;NhjgZq)+IAo>v9#FwO(Wito8F;VsZZYB-F@@qtlIS80UKO{cQV*JB!6Q!3sdT!1%u! z;MZe~^c=0kVp-Jq0ajGuhqj`$VldNdJPI&uk)Tm0G(Hu&J#v<_rvE%v&ciwZZRf zvHru0UO2joQf~hT_W!3vwf`z`(sxavL*{5IHi}7md@5ph8S)*7U0)grExskv1Kv5TV=5=kBLuhnerM@ZejR7twZ?Qd20CX1F)TjN{Odo1iupGdsb zzhT4Xu9eb8dbw6FpdRhO`l>&TSK`kQ0gb(#w^n;A&dOQ%ejPt+&kkEUk7Z;n@}GUw zHUJiJi*S7b6uJeAreNXu3W41p2gpW)3_=rAu zUmeemzxuW7_*kFW6WZ$DG7{fw(?|&C0k_^FI92~%uon9#Ias+?>BGVL6T!L{oZGnS+04&)5IC8sJz5&fL{Ek!3Wt#DsP1T1Gxnq5^m)nY( ziPS$j@{4OwX6(5n)A9dqncjScLYw%?Cgx^xKEY3i-E=DDIiF0`ys}Y~7%Y^`ou!iH zkMc&g@+WyxvizB5`!8KTeYaL}U9J9LdP!mXj1P>@_`rs+{x%kY2sg{^*x#BgY=d-S-+G6+vV#!5A$-j@bZFQfN#4ueT(%DFI|CwN2kg+ z@)?ZLd2p9Ie9~vEg3Y9lKgZJ3=`1Dkyxi4Z?j}EO7~w+^S%^-;U!qa*mmP`z-0;W3 zj2}Um{W!(plD(}?<7=a8{i6{hNKb^l`qO(JdlLniyWL`fPAahorf~hk#fx_X2p!J?zYr96K!- z47%F*yu}b&zS+xN(|NvftON66xCPnpTBi_l*xK;ZvAi8$U{$>NqN7N<5?7Bd`pMfT zCbs-!pP1-vjHCW9s0esJ4|NmC>@56yH>lw=+(_4Q{X5<3KzoJ%jKA4|oYVU95LS!^ zviH0HdRr>uW2ArE{-C1DJdGdz*nL8W+n1jiAOBhWC*U|}8IlGN$J|`=(sWXBJqW?Tz-eBM^iX6F4)g}iIiHvwF^3I0Hhz&q9uXTIG zJGCv+xb9Ytxpn477VeY^w0V2Pn?jhpwl({Z+00LlKj&gRe8l)g;rK~>Ca)nMYk@u1 zBfQ2#%x?JLNLK_K+B3e<%T@@IJXi$y{=Ij)=uQI+i?%gVWDx&ChBlFbID6|O-DC)< zFe>s}hj>xpt?)%uc&eKUPZ36|^9up|Au-NR6N3ng8^V$z#v74Gj21?WH`By;3SyiY z8L`t5Lsj^CVvqjH|4Dy|@A*%9ds+yl zdizu+&%M>%+qZy zBaFbNI0{nv!M1PHKi6jJAOD&x4ER~^zc1xF{PmHh6gS^+0&mBE#=Sjy!w?kZmK%uS z@R=uX7|7ojZa9Fy&ny@)3KQJv9Ecb}KMm!ai!HZ(kS6kfb3P;jz z(ho#Rx>-*xnz_hVbr6o%hx0X;!kbvk&+Jyk*;GWTvl=Wlm^X@qb4QU_>>N@JmdB4X z1U77qabh;OVYrd#?)RfDKcK8%gTouoj2iLVc6N1PP6mz|4u_mtHFJ*aCn58}=YzcNd4XO_C~w$!zp?^MU-Dcx~r*6>bjiXe__J|E3qY;Er#_3r8|RWqcm0?~l`#KGzbW z;Oqxqmq>>9BNCHyTO`RJe`cH1z;y~9BqGLjAE(6#jSvQ@{-t^FX+K50tLi+=f9$u) zOPXsqqlt=~()dh{mox+c#TBIe5*6V5OI{d-Mw4DyvkZg#>V~s2{)W_i2zS0qKkYq)G=;xdW-Jyng)S%2;!37`7q+ z&IViVD;C>3ihuI@xSvM zhpP$$Y?)Zr!PcxK_a7Q~nZYUo2#bKw-&(yd_|m~D0ub%d4Pplsr$KZ`<}fKBO0w$5 zuXs_I8z9V!T{@4AB${_n#6K8Nfzs}|41Q!K251TN?3N9P4y2q!qS#kN3Mt9d&ruvY zUauGZ7wC5Ykgy2eEq_gZStJz+uZ-D^s(o~BSn{AB+;bu-Ac$uL zYpUz;--45fdn(~p>;&achd#Y{)=MTq70QT?ky2|;b?`S`H}P91yV{HQUHh>8*8aDd zd)LnVK2@jIGO!g%4BxzhvqH)28F!wPMI5T5JRK0KIa|~!BXiwD7W%%1Yi^-Rxx#Wu zEf3Q!7J;q}&jLMl0)N6nAq}LNTKycutVod>7+e8{#hnMPAM6|Ae<wluzhs65+ zYY(H6;#=fjnkMZO-|~>gNB=3lGX&xt(Aa{WHT}=nr7^3R?^EqCYq?I4UZKOR)BLe_ zOS`EAhY=a3RD#2-7L8YjS*L;whD1BedW9WkotFA)_f^KSzv?h(oc;9x`y>MUYlpZO zvDG0yNuv$~N}P2NPir6ju=I9xJPB*M;Q#Uh(t)sdW zQ2ne)@u{zEQx*}M%Tz{2lVy;^waDebQAKe6Ln;1XF4~5$uBN3=uk zu3NAwqKQF@0l%5AoCIMvV=!I>mv5rcU<;UF7YXk9WxwJ5*jeh)a=vs6uUj@093A=& zpZR(w5BmIZK}-|B@&X+7zISLA#3vzT|GO2f^)Ji+hQY6hwY4DFqB zg{LAK*4=7Ll@GYvd8(-_zDMI*oIX#Uz51b3G`?@WO#JCeg#g%%>y%P!ss*2M36cLp z6o%j?^QT<^llT|Kqp$6#A7A$@qo&vJC^MfZSD3B-m5r4bC8DowD~(SkD&+3ez5J$X zgf{h3q7LbH7eG2J#4P{*;y-BZ17UGzFV!<6+h}f337DO7>WVH(SVo!D(c%;GNfH`Z zRJf~FztZt?tNja@fNnaHd9hH)9~t)x^?F2@z`hGEp3*&z57WB_4K^rh&oJf&E|yLH)2}`+U4QT0PA6MVYS?CQW-r}(M%Jp+sZArV zeoK$M&re6!gLU;VU_6arUhafk4>?kQN#`luq`K&Veiu2b?CGXm!dRX1a&L_C=`zA* zo{E{LUKGcNF2uqhFXm1=md|UguYwj)Gx*eyWo%VI&g&n#$IX z|NKT-+=uJ;yMJMk(xQnwR7m}d6`S9Qa&Q+aZbI^s_v?s?(4WNbN!&1(@CGxh=5Q|qdi5M~aN9y(zFo+-Nr}FP zOiD~YB*#n^pPu;3J4`&{OZF)qhjNS1Dt3tOEgmZ`CnmqMs#K4F?=Yy{*x;ADdPnWM z-ap*1pL#vFeo5tGchPS`L!Xl5w`ysln7A|Ib;bd^UsB>mn#&IZdDKf6wN5MJqx*$tr!Ja#6_c$jbbTh!;UXRoxxrRIr9Os{p2hH6qp}r;SyI%5rbV zt>;Mzw^>7jpNb@w6e(Xa`=qN*qE{RIm#2tLb2VfYSPgCvi^ShiJIg57IkCwA$0*!E z4qZZV9=BWcEjmA5yzuYm$EPpcaeh3y@Ld5>p(^UvGABoD)n-?l^j(%db8W$0XUj1m zk=Ab*M#`T!nmg**PxY299`kSc*gD3e zZlJ{=Qf!J){_EqXIQcJg@^2N!C*dk6e@epd`QQI}5F^pWMvV6c(ak_t65m|HaTQlD zoTtW8TFoeC&>4uj$e>7Zyro;Ac2hzWh>YHO>&4v^7zYKu8&KdsXNdwk&Hpj&qBIo> zg)2~LIE%j%UgsohU>Oy1izb&vg`}7gpZcCJgqL)!D{bWRldH`0GihWbaYbIFYfUuq zg`DEV(RQD4;@Tm)N1$F7i;O^lA6xDSNt9hEgN5oEyByZ~t`^1hWfl6-3xDccJEZRei!Npon*T<0 zXI4=-c0`lIxGl~(qAyD1Z`JnUA=JXn%vKeU}Yqo$|b!w zk|*HlXJq`J#Ix76?n42O{gI7-XX!%Y))-3K^zw`x)yRNmHM=dY{$KNDN=|+^Z6@Kr zKG6H>r4%N>rT5Kqv%2!vFD$(B`nj{nQcRV0Utvl||J>);KphjAUF|h|1EyM7cumcW zxv``5?V6df!$tNo^+RNk{!J~%_7y)>Uq_gGKvK>bb2(%ffG5<41;i&D@Kfk2{uD{e zNz~Q>m z;aG|@K=PfYdTov_9FkZX#1(X0<9}l)kiu~yvpf=39ULc;!GIzei~q-s2@sz~szdh}k-Q{oIR9GjsyG!=ICM<;joxKucb40;uB@n0iIQ*!X#u%|8x z-&{X_{aTG8mkID()d=7%!V7?FL`dT)nZ4na(-DHLk>s6jnP|pzjhx|RHptGv5~5Yr z1nqQ)h1DT0P;6&MgzF9AW$or{^@Q~KCNrb-jD zHjOMzp2}5W*AW*3}JD3T_32Nyrd=YL zREj3^?*^9FfMq#%yz{&r7Q6aUvlwg)MFMivPuT2UYhr2sGJ85xRp_?fC9|)j$>19I zA(Zg9UksA(b4nuI0QQ~>YF0NxH+&1!H` z{Fc|2hXM$DLVoyG(x(>;jxr|w}fHS*Bx+Nv4zX3d_Z z<46t5`8Acr>?ZQi%xu)MA0 zKm>BC=6j95QtnK}nwmxn6qtS8HK)On@TvxsB2h3w^ zg3E$7yv9HC;@Z*p;59zadv|-C3zSyrnb$l2Wp3;^$_kCKqf~DG?AV~X+Jk3ti%Ys! zokb<9T$?km2Skp9x)xQ+Ym5ag&IdEskXC80@ymO(y9a*V=p)N*s_eBFoCnf`=k!qR zX1GF@{2t+%e?G#aO`13tGR8m@BodSVl57G*Wn8PY@hnXWc7Q2~$r5|wsp1)06v)B( zRLb}+5is%C^aY7PM$O`Xm65Pm9q_;E3>8S&D!TbTs{&4b$v8RBaW95QH^Ud_=cWqz zUbkzw*SJXRg}5oBsvpVIZ5_I<(zeogjXDU!euIOC^|t*TZQfTUIea;6`vLYvS18JU z_^P1qMySTK4<5%Ry$CjsKdhX+5M>?7{?5A-}$^# z9##zPZP`Jd=^=WjYBI+$6-tj|0j_Ku3v>hH7(~_(wg)wwcEV+0qg?9Ff1nrADr?Wf zQcN-{X+)NDsM9`X2F{;`8@+Px}gPcma}L zQl!zvfO6)yCaG$tB;F!3JkA6@w9f-GK7f8oa#)&__ zRRXq!3Xz^{S`4H|;QRk}spA2MnXvjE7^=#|kT0$PL$x88k}K67LSk~I%BRHVZq6Jb zoLrUj3qu5Q6-{2zD~fyIu32atZ_%6RV`LL_&dTSyr*ZjQ1v80X$ktog8cyMbQGb(0 zeX~^}Q^iORSZ&6&8C#G*I3tK1;ZY-@7a>UtCt9xF;i``Bv&Mv8MrTwSoGtUXh z2Ou&IR&IuT-#VuU`91{M217QpLzjaz>`^1%=!eZ(kk>~f?64jz%{p!jAYK_loJr<(vlqns zPUmOE4wV1}^S+O(3+(<+W>v62rMvbn_=}B$6>sZ~0j@TIK zwOw}`C$ryu_H+~s+Qs$hDSu8MwGz&10)>GNl_vTKdUlXt=yqvR6l|f%`NnUCX`!w2aq4XiTul|d^4h4%h%+IOTOBVAGA za5*&`n_Q5=CKsgHgbl+#rRiZceMfEVB=XSk-!&t3XfI(_!S;IzIrt_6Dsu4R9&%vz)8>+1f2$wA`j--e ztA*?~1BI<#fxyjT^bbr&NkRpZ@YvImgiaY2qKE(a5=nuIfITbkWH5w>QlWhqO;BH8 zx*-A&TLl-zZ`ouvVju#}*|3bNk%x&~S6_t$1UO)GNol-eLKqrJye8FYibsQ5{3-Ml zTbQ&|Wxt8SD@jG_Tc9=)80lg&3%XsRTBjelZuKrjED!$l&>i<Pfk)&i>1r#DuP%A#g%Sqk z3H7hA!^(LjLJ3h%#RmSdKCVBWos7g_wm82P3|t%qg@Kn1e={RTnz_ zY$Xs87g>8;7|GIB$Z^FWOA4@bJ5>OlzEi8;U? z8hmLRG!UavEuEi*`mf?5GwQcfCDeb_sK43O@2KwwFS#rhu};*Yts-~nP&ezjv4bZB z_pT!9Z+B+@md}s~l`j<`Vk<&Q;##-6KyBDI1J&>L8;~gJT2l;A%k&K-syViXZ09jd zX14N1+@h`w5U|#u>J|@aHmZL z=@LFir42X8e$v?&#lINJQ(RpYtSHu|-6-Px&S9!SsZb*OJmL1|Y%K_c((yk;S^0Cx z+e9sPnJ!o^Fd#^|K$IEKwq69;lvaM_#ZJU5BQz-sG$BPks#Mj`^ZNIDRnIkg?|mfgrHI3mlfgH=Av+rzwJu$p)WPeZGH_re1#BDQl6-keaNcuKpTtwm;vI|I# zT(CBI(gara5JN%Y)Cr_&YWKOmJ7|7UJppr&Jk8%OHdq&5{!#^Hf7-fslEIka?zm)^&T4$#_!| zqn#asncW@+tzf2%@keTGH!U;eCQNJne^2fwjoog~#rc2JQ^(Y#GcBR9#}XZ3VjBr8ZWTGoYwRb}9wob(R}DsL zNcL^Ev4`h#t zxV(eXy;CE2p$-q1AgPjv3D7rtM)he|vy1}&)#g-FM{KAqpUjKle>u1&c2H0_EA>aJ zD0x^}X3Rb9YUh8q^_TbgAt>xMzQv2Hz_tG}@2ZHE7*auHy;9%i#q{s)AvKkN#4WAA z=95q^Y2)DDn=g&ZdXT8}S^l?YZIFf;6hgvtC*ON@eqIO*vTsReuXNexgl(m>pFpj@ zc!pYssMZN&BmQm8`9Z$kVLq9UB714#)O=Ym&EzgcHgci}d{GHzI=X|Eo6`8}(fE$k z9sC@Qjv|~0EwgsBJs&m$NM?c0yDSKi9S(J;gGem4&JdCpgIiqZ-1g!dO`SS;2Bvvn zmroqEaU!Ev5_TRPnR}!d3U`)=8{AySaiF$WlPvZuY!8@Vl%xeUf?@BY#D2b z!p%*TQ%@uOqOK^rx>BiU@}PHLF9@z$Ej?WO%h}=N)IUfNvV*0KLtT~&>PpQJFQn>RzE`)ovgLx^;%0n z7a_*zqO-OBu5S{mWm_*P(sXCB!-N3%7x&HifV7jX10~5@vccBv%Y*{8SsK43dr2hu zfJ0~ZLCC+`F172xIPRcltYU4kY_I^kXul%kF4==ZY}nH*YV7W5PWWa$9m1P>syw2b zeiaMm@&p+DOizdLu%6~wf}XN>%JuX(5`Hc{l_|K?G!fm6bgdVF8FsD{hG?(9L=$rn zg|6RW7jfhzHJ%~Ll-n{Ow#2<*VkL>v#=m+E>q*qzB1HUIsLuF#hB6Ycf(8lrv4yJG4Q$JXrvymNR{ z_V@Payr2Vu_c{+OiT}OxfYNvhyI!-7h;7`mJz}(Dofq|Sg-4PPJK862@5tCl|E;fS zEQ9`tj3_3_6EkXtD9VX{(<4kxS5|I$J?2^eVr_N-rBRH@Xr zRTaRt85p0gvi-QVP0$=l&ixjiXz%1W{@vaoU9YZT_^+|qc?B=tA-2K8$j$x^B#0pd zhKkhh=g-7$f+cOc#QSN&E<}^HEL`rCV;YaZ?vU+%@-XgzhGQio zVV^T9(KWU4HItKlA1Ud2G8%uaXH%5ONFDw`BIIG#;D<5ssVvRcAZCwBmHJQcziDx~RG|X{(Sr zWF?ncQ||?5wEn-uq5C#2J}$p!)W-e*jx}&r;fQGRR90h8eI1tuO8eHV0kJ=c|JZkS z!LkD`K9c~c5H}jPJN7++VmSwicNo_XbJdc_#Y5h|lSvK;pl#FNy(Um1-eog8#rBd(XWgavtQ(x230%T6#KJGm2CEKUeHEnSgZr zTl3js8^yy3LyxEC55(;Z<`2nk7rwYhY`4swY$3BJr!npMuw9iS9}TZMU#cTgz{xtH zJ~S=PUvJN)`A_JnspKA)Z@{U?9($tA4|Z<|<1e7rtvXFR>OijzMdDjaNF1qO4-DNO z@E|(ILB+p02QZx%TF1m?anK@M&7lPnbq{t&$@n4Pd#g`n{E+tjLQ9_?H0Y=;4Kf-l z^sct_t{NkWvYbdF!fex7UXkRmBccfugd4-OK=oPKJ!M+P$WsBx$I#ls3huX8q7kZ( z7SU|2T|ZDxx!5HjIYv$4iqMLP`?wKyik`HIh1+jttlCCx^2fW;CN83Z8t6R2KkgQ%pj>;0mL~FadZ8pv2i@^Ea|A0d zuCw5PT>a`wtzeavbUhKCpDdN@{2wS$xh(00%cl(`{mbuZvaYlkNqj1N%k~i8F5_K%D>bk8<-vOq@4}-n>~P8c z#x3(pLu9`BE0DQ2TqlfZ{Y?G0g=K`#o%?mxaPsU|94zUtl*! zRNiaa_jkX%AIU9pl6&%!o|1cwEzCMN2u9K^xgn=`4U^2u4A!CPSI8J`>UIWWY!2S{ zU<`Ie2U0dR-2VLBFJX-TIX3x|X&wyfI)*R zqrqx_hiq^OE%vC}s1(SaZB)u~Omlv&)Sl3VK68um0c*KM`GB|ZI;LLRB@>sKiZ$%6 z7*Zd~P2%_{4`qd3T7s9VZm+3~%}SYD7+*E!t|a^w?#i3^J2n4iY;ldh*y3(FZOmq) z1mmbIJ~OPSQ}5BAT? zKFCS?7iS%u_Agdxl1=xU?71|**`DYkd$O#?6Z_y^9DYxM|*7VejsMv`AXTyYy?VJs0QSsNVs^m1iFu?;@<~kvO#n@2W@d9l^Wm(fc-@ z6Lpf|e(RA#8Za*_13<7cD}Ua^_@9^p^lEOtYQj5@^+kXE+v5}azgyfiEB{)3$;pZh zp4jlmnCE^rH_{)2$^?x>Lr|FC&YpPQ?1|rwr}^!8LUjCgE`i^Ugg<74ZD6a(wT%Za zDf&lC>S!Fvtkm9=Mn6hK1X8a>2KA~Xco!WE3jsXJCwTO`;E~dST%soAdWMIQOS;Fv zk<*XF;{2^7;QT7;`{Ek8s2rlOd#}?xO#Lw#)-!&ejcRQ3xO7T#+^KB;%u`#U(BydZ zRMrR_c^C+6!Ya~`z7YAoC%=*wO6ni2jOd(9(2AswW?Z$=(SPv>P7OHpTSJFt09Gn+ z+o_$BWDN@dm^NjWkq}`nPS~?%SzTv1P_u%o(w@$81PR7iG<*x6K?atRCBVTQF0nMf z-byf10c#{aINz_H?U=YjSb~YA%0kBmJiLQf{Jx|koxhre}mz`YnY3=5Pj~Y zgz#3O9wf8BdB4-^LY;s7iB4-bDG!w?kC3l2sZ*#REgciyd9-&{&0*;lrNpTr)d!n1 z2#i&8jM%h;ugaxg)vSyjJbMrG8sv-h#oNhJDV^k_SX5<19@oi-O;G)m4*P*Y`%#Ei zCafz-amXzy?9`Ie2CBrVC#U(KvBW~h=K}r2%t;@_=Yf85x=*wf-X*;nF$ldIC=j>Q z<+O*bcKK7b{|~T$3qT`5kYH!BOiS<{vW(N$;pUl7ssPyaQHhZn9sR18)FN0kak99o zgGR$Sg|9T;r9kkeW1m_8i^i?Q$;F1&@4aFx(n=$Fb64r;_q;{-fopvLP!0(!ub=YBs_8fC?Ua^wB%pQnBovF$ zoe^$im?#JnMI^+#6%-bRl|vY=67?~9&a>B$A5~@nXP*uvIqFF&v zWz>6a@NW5&_%!+M{D15MMwzKxdJ7fvo15Ervr7)$sLCt#Bdo8kN!BD|@`^b{-PwE8 z+vXgb0J-$hB#7)LK}d)s$X~CchyO&ptU*uqajM8Xi94e4l%M+*%uLiaPRI28P~OJ7 zhRN-i7{_AQ!$!jWY38xmsm37P^tm}t3OY}@!k7ic349r(JUO-%-dkmU7GmnhCK0q@+`W#0EhR( z2~*)js5RTR+?c_g7Zg)10UROuUY@A*+i6G9zp%$U_~K6)5oqWc2&hPo(}JR6)mWf~D&zmKzmi(|Juk%FGpf^O&FI=XjwxY;@$Nv z(?D)HGi0;0hG2=z6-%q44KzE6U`eK`a_WZ=gj_!DtW;VNbIwy1i%I8~a()Mk)*3AG1gj*!Q%JZ3L4+s;pl ziomL;C*y?#&J-%ul@=^T{zMZvbjot%7EwbJ;yXifmBjxRjXxL0-|ikhyr4}Rqty)iMYUCQVt=kh zaFc|rBJA?w{7S?(C zYYsvHk6~KSQgbB64pRV3`$zlYwBi#W%*~(MInn*#-X=EuwTA6D#Ok7Lg5I26PSn$&&c`3Gv-= zTmbv7&R<1&qiJdY5CeE09-8(tAJM)Zd@Ff!rH*9UTcBz0SvKu0)U`nD%NbP=ThsXMskxqk$_G(X@ALD*r9FMJk${mEYtx&vdb98*HB0Mh7*7=Li98 z7b|UY1F00l5PgH*x%Le5B(o2ldkUYQ@PF1%yy)y|sXwbC{+!UL62wL!66t1g!mUhp z)DqMDz}8_b)j>Ero1_~DXCYBZt~^Y#LDI&F*U|&e-u(MT+m$ElgxtNn#sdw&=?YUB z*l@TGjI=(=4{QylB2n<9z7du$IGyj|R1%p;6 z+xfE8j1B)MC$J-PUCp&xSS@5pg}Bg8txk?le=}$M`Pi~=;*!3&5zW&~{GRX3Ht*5o z#K1R8h!Z$D-uF$`6hnjwhaJ??}&6o#du zge&YWc~N|BM=tW0T1a_jk$s}^jjZ*smv7M*0DDVp z>`kM^jjX#(RUDu6t*N+rqRI1mX_I6T+gxqLiN+r%Wq?B`@jK`Rz#k zZ8=cq5rgj>PQ#3dMWcy+Dp}=@zZg+2%pi*MS5kjhbo6TPj+h9`J=ZZ$do61x)D;qs za&e2+mbe8#0bNikIp)-D?)(xh9I0!;KST@OuQ_=txJK{t?&wD=R}sIvt5=Mzk+4+V zxdlbu;>SA&j$#>$e|<-Beu1NJHF=Czw-M6%_Iiya2SyU-_&=H{nvRV;E~S$dnX{9H zgW}IEV_WFwmIxuS=@aU1Jaz>B?J1=R!&(*l9wx8}Mjaxxzus5Rq33;Lhso7fd)2}* zqY7gE>u%~@z;y?m1EAvp{OdhxW5dRpQzFU1pJQXiGN2n%KmL_F1l&QC``i-$00ZyP z$m7MIlX-&RGI($%AUFXMiY3SV{H<3>o_G42c1Xber>8LswvvC6V}9OUe`872TcjC1M;42=pU342n{ySoBIlySu+3tub+O(z z=eTwF&YF_Z@7DBpFU_4-i80FU1QOQ~XgxuT%`f}spR>Vj>j_z2{Kz1)S=~WgP47T9 zAzr7C%z4dvkhnUyXgY!p*Z8CX)_|T2oE(+voHpt4z6T30aB^vK0*l;_dv|S>AwGKD zf|E<CC~=_zV8MGerDDJ0E0&kUve*-SsHGacR8oh1}bZOPTeJXe)?x3!me4{bY_)VwzG!TGs+ z@+0aE_sn>Ue%d{RXzC{Y5V5D5y6GN{QEwwU{aJO6#-Gxn!00EuyUwJTJ7VsZ66S2E z1edw;jMqU0kew@Jm!K7sP9K-V-{LqJ@MqXeU%XbsAlq`1m-k8!6VcJE&;3;z4HHJ1 z9M$s@uj#dd#&+J6YteIfRD$DfcbW^-RFV{3C81$@Vk@l;Vsf~rzRy=ws1yX8;vJ5^@RfK@I%1NLuj-3?Ze9%&plPdJK7 zs2EBEJZZpm)8HcNvMKOQA)K|U4NTS9^Y)H3Wk@i;&7j{nB*kW@RO`@zQ7Kq6(6Jc`(~^^Z)~pDZ6q1OG=2 zjM`@dnr~?T77gis18b=uXsJl>8v>am34t_a!Qh+1G~^y>-M~A=Q>ZG?6Y{nM??u6T zJ5Ld^5);eCiK^m@JF2BrxCr{wD08XD-e*;A&L*9TLi8?SX8eO&gg84DQYEm;RUN9L zLLysEAFC-BoC*=h{&|BOJ}o2dmWzSRxT?Uq$dzkB_O|k(-FusBL48a!NKgK_RU?ts z$K#ypV`HN^$i;9WQ>u5hsqeEhiJ=Lly>Wga8rU6`348bCWP11K_nt>Vx4Mcn0=Qa? z$sK=}&UvAdqe@3ACIOxQ(aq}o6>05I=783M|5RHPk5O$9PofSQ`4bOuozJLP8Pn3k zoI+KA5iAp=hk4}a zW+oDx6p?=4$_qm#hmQPqk`~Kvi~ktOX3a7()V<$4UI^Yp(>JGv(ol~*GnucNKWui& z|FQ1PGs_I>Fu#({RB zT_Y~%^TG%tXrJIiI=o07b)(h4#zW^{-|j5YN_JU>NuNCEuHUfZO+w@sr(8(s7GA`d zMWW40USugi6Pk7!O(2^_i^wMgw2Rha(-A{MLD9S6Qbcs3oOHug!0m&C7&shm3qy6uD#J~{IRR;Ca-a+ zYQtBVl~M#f0P7n&VqxL@>Z@s~PQPg)-JFu&*WhoQ!$)^9v1;$DMrHk`q^!b=Z!fg! z`x2*bysCiQS?;87{q6zY*LC!Oy802)id0=;^;ONcU$n4r#^}P+Vu$IhO!d{VgNXHZ zCF_4JsRFCFdiKmSyv8@_o-!1Wew8$th%U+a;x#_Q>q?e1vQoMfE0Mc!SM7~AofbP) z*=L;{J6c%*6?a5d>i7I{zjt!$l*+p|ukkKwu@avpcob<$oh|#;YphZI2dnh=_yhRt zK(63h~V62d6U10V!&U0AqV}jhX zXLyZ=lCG;AKmf!3D#yxXR_Eu^`-AFt5A+&!Lv`e#s_N^jDzC4(-fH+gpE%QTn$b%( z&dMALV&I*gEPG!D95QxcZ{qX!S}<^2c1_MWu>O{4nY^rzhBL{6>?`d1yPo7be6L0% z7#jB_7Nv=)8}O6KK1vSWP@4Q^9UozPLdGBm!MEo0w}yQE9*P1Yy0!BHnOLYrvb$M# z@}O3UC@p3A-~W>nQ9)wuI;hFao+1Z9e2pyA)3vm$*y@^WEINY1f{cx5X~-@qPlLsA z%?-?oDub=%dw|q$)J9{HZh*KSV1vo$0kLC|o9pLY?KS=oc*F|CxMciqRG=CoX6J12 zZtQ4;r1E;Gb#sufW_D~o>{1=Oj_K(HF-UAC%rSdr_3Rn*uTg+CkLq&fT^;LZ(%U&a z^3XN&+^-gY?d;&^(@X=%^eQSzmJvwYQHg1Gh!6Ii#8(?iI>)4g9$1W1hKOar!w|8t z^O!LEsEvvb6IK)8bks&XOP?{qi2jXTv4c6kl05s2>*r;0bfuGdW%dcA8G1Nlo;>@Z zW^9{(dt1AB#8g2o1ZctaWhz`&0t4j(&ZtXf$0@*YB#)}?;`4X>Muo!wl41zxc*i6$ z<4FwijFFM#umRCz-#XRaLN}rc=F&khmmO>_Z3)|C5bb5Ny^_(JorSZ6yq)8mg@Wr! zyr|(`pLGy7dG>o>*HPA1|Ji@IT}TWUE*nSaWlk{hES3XF7ip2I!0rCclK95xNvqkN zSkn5k#gi!+v4KMjjHJZ)RU{b@^dssu{oxO_&Z#^RaYl->D!dhC$JM{`epA_TOwrjO zWY=fx#(^}zZEPFRnQi$5K%pF*r+X`E@;@`dxU8Fy?!-TPX%)lvpMCbf#XT3A`aSUl z83FD78lG53vI|zaPfFfTaxc4}_Uygvf>d8N?aB_&{I4)Q|C@Md+J$JA4?}(#Ly_iz zZYc$;+uk2`OKC7g74P!C*YebQeVsiQ=Py(~?88d^&e*Jc?yySd3>H3yVl6ex%iau| zl*VTbZPG!VCA{p{ems4;x}jqm_t?T>2}^0J+2(XaLIj{95FX-=i1Y`UEsVtUh!Q> zmzk?kw!OI;wSq=sasDYJ{KvVG5N8OkNZv>=Uvi1Xw&xe%@8!K|X}%VEH78I$<*y9h zmj&;&JR8<|4Mpfo6mtWwSv4o)LU370xEUS^XQ})5aaFhfpLf3BmHGjB>4{ACcx$Ua zglnw14fW&}@(zDv#W}$BC0(TKrn2$2))W`rt@AEhr%dbkksF8wIJI!$l((Wqo)CU& zm+yn0+zArwqXZ4UO@mgKI$-6hT*5(R0578^16WlWz!G=iOd!g$LhamioO^tkgYHF} zJ_|LPp9+KURQKf>Zv4-%y}vCnfq$stKEot{uwBLg;Y$F~eKrxZJi@N!X>kd+$-%(i z?7p~3I$zx4fPfVZn%wfW*k61lh80iA0nxz|X-6|uihqnrwY@Dh6$1tmUP5v9ptSNA zHFVq5Q?mTgzhhnuPZWxwQJ@86QQ1O!x+5C!UW8Y8Piu6>du5iu&8;ep_bzn_oH8aF z=#CAXui%bz0cy3!uizeG!ei8rpFdACrd)o%NX{_!ABTG*#cv0y5CSAN-McTM(R~lF zuRZw%!oO^of4qt2rf>@PlX(m{`P-h?{h`MrP-vl{nzA+3kKcYB0Ogo^jdd~k|b9c1yz?)YcPXr1}eY4k7jV;ZA(EhNi5Y!Yp9q2=mP+$Ikb@; zZ&AfkeqUT8`;gTWuOUa>tgmHd>Pxh=ZV=9jd!Ep?|04ZD>j#zIscz(`K_lto6WlM4 zPsmk{`tir9JM2N8TWaXUUr-Xilp%*W$2L$^$bPDf%)uZ_6!*rZ8tfle)S|hr0j|Vc!F7oLOf(>K z@qi|`(VWDdu*Fw1DLckdQ4~YtYUb*2rM1SAt8-{6Tj3KhDqqgaEsej>*&nk8 z?Zqgn)l#S2-QE*&kXhC}Z_ z-HnC+JOSq3Z_k0w6>t-54Wc%|-WeRcQbXj42m{0d;}6%5`-gV)>^nURvbxT~!vD0h zsl{r9_@8yBArVh7|K9x4RQfTX+h94k$HyRH6zQ9((3=tT+2IZ(E$w?k6jpbCyqrgU+!1}bqxB)%Og^g|`E z1%W+25a4ao3I}u(;DY@V;QUK^5TNE)HVu)0k5u(@{#F=CjKiqM+=oDTBnue*aq(JU zchM~P#7{GK@aTTd((J=XfU*vDVq7*fgys zCruLi(QKL^SBxMmj+ZnVTm4+;Ip;WO5U=rQa+sv32nnV~_63_s!p4`wvVNjvo;TY` z4}aiZsqu0wr^}rYNONx46mI|ZKotHNkD0=Evv7WuxH!X6>~BbjM;N{l&UBNmrOR9E z$N%suanxYSu|Vmsy+EWql+3*0Ay;+GZ5SniQB$z8(m8F6M8OCjFUzYRKSMPTI-HLh z;yOoo@~`--s0y|UuawnKu=xPkob{iwA(I$t^esyXjlINW?>iv%q(cG5r9)GQ9j%vP zs=5wbz8;JS@8({RFOcCe90yra12f|f1T#Y(HO!D}zi7e#JzL-p(wO4YxYW3HBj4XS z(U74Y^!#;7VsI~5Jr@*Be!RGs)K!)ext56cMY*gubnT(JbUcRYN7CEo)Gn6pn6F6~ zq>@5ms4_&GHqwZZIrT^nj%I&!kB_I@4MJ}Bra@Bk^JwyX{Ny-IG_8<;MAFlmIcsXU zx-bj>j$4Ic)r(eE)LCOrtM#b=X)Hb2$Kim|t0p*?e38&%1G$h!OQng6b4o{-<%Ahd zD@pV!Nes~dIyWy^)(yr@(*>9|LBLm`oWUY?r5bUX^|El7H1u`lm{2E&uN6M|A?%Fc;cRa@`E61c2aZO6_88WEYS><2-gkHneIXN3gfBP|pD z>x243wGzO;(Q7=Jn!2&}y;L9GZ2^SweJj#wX@5gH^*AYQ36+HDkg_IN9WXY!PRho{g15kYiYUpRi3QhiO^3`MsCSPB33GSP72{-xjC(@$zU$d#7@e`WM8C9CyUP+~j}B9v;tB29 zGzzO7(o(|wPY3Z1bGc5MLD)Yt+HJ}9?s~(3azV5uNfoy2DddLhkrM9C5yFyE;dJkz z3Z{E!zv8U4HY$nEd6kLYsd=1KXP!4eaMyfUpbb%X>3)l~_^bG8$sI|`kS!rKPG(eU>ONnPs^%*UV%Z3l8iQHY##&ISNLF@Xgn+C%f9u_GHqEOK1rHWcjX&}LyF{Yqa^VHb z3O94TZd&W{8u&;x?WMXZyw9~XdW*?V9rc)e_^VD+P@I~hnM~v!wCIPjk}hwxco_s; zd+rt{@85tKdQ_ceV8yp4venP1?w|FDE6lXb66f`L?+)9Wt{ySTaGkm|+d35kGgF0` zsri_Z@P}qMV1|`zr5t9wU*iM^2J9nqg&zonDpnwWIMb1LwnR8w8yV3S>9snw5!iZw z575JFZnpA9jT!$8_JA5j47;YMn;3WZb#NaX;_L@EpOe*D(WAv4uObapVQ+)${1<{s z4#X~IV^S--y}TYpta^wIRf=cvCO4!OUwUV%MWe|{3X^)gDtdK_==^B z@^}{Giv54Qy$gI))wRc;Ac2VB3O@(`^Lgbbn} z29iLg<7jGaFICzbTW>GzwJmKa#YbCS1q2^KT0pQGY^!G)ThX@i@|yqmxAr-cNr=_k zd;fnvWX|5_?C08Ruf5jVYp-3+Q%9_;?1@pfJuyAtsm+lRdp=)OY)`m9p3pR%kYiVB zjS!IBS{EWP8Y)>#gE;UL3i*wlFofT6CtxDH)4TQC9~-S#3Q;tb#n*{_*iFE4gP8Z! zP<=wZWl2`}N%~hDUCl}oJ9-kou zm;o>}NnMv~I_x<|s9LxPduHpfnH3rSY{!+Z|Hdz?6`)t=oCvGD|0MXmr#p9yzvpV> zkeiw*S47*{5kKT!+r16BoV6h?TL8sl2~juhGNi4xv)0*5sY^uH(Wi zA@joxMv%em#MtL^9bhxIhvT{&npUXn41SN*f&hL7=oYU^;b${Nzevim1X>|@&Cbtw z9+4DuSA_w|NyHgIWzuU^sMj<6xN_UdVDC4hV#k^u`oQaG-MTrMu07@^o!`X{*f<&; zO}t1S%_R4=fPRO>f5b}P4yEo!Qz*2r6_S9nD%>mxkVEckxJ0%G);eyhJmVEsa^zw}dZQl;vz`YpyEYBKv(7Oeh1 zLG?21*=se2F_6VT*b1@9s>YJ;Wo^CP=D8WG&xR{}izQH!8d<}-iDmXjugw}9ke$$}7;m2aTP-Jk9$Gm=dB70mjeU6w?h6Oy zI`4(=U8AmCBn_5Gy&AGtUBW;1VCT6|Aoafaj_Z%UsXs~^#gqhjui13;B&tk|%QbsU z^&kt!DKtZWet%g2e{`&r5lcmK0~U*e1EGhfz$bUq;-Z_ukRaRJy77l7Kk0K5Dy;Jmar0IarG;k-+~Y6~wX33;I{ z#CPC9;Ul;3_gnt{#NS`3F&m5m95-f)1xNg{4V}->b zZ|3KvD91Jr|E2n7R(dvJk|_ECiumyvdM3scMiSStb@SJ&l{M^rfvoHSMUrC*lsA%? zRiGBg*+>q&)tB(bw8{G^7dUX~yw2AAC&55}_Cyf&zDlSGBdD;H15E4SV4|e_VzZMn z*HN6lWG(n6}cYOr2TGUya z9ZiG?yaMZ3y}zjmBwM2o{a$KVY5G)N}kTm$h*#5mAXMf+3>Hy%JT3hF$a~ zlUz9Bu1Z4TsO=kRfgy4YTR-6&`I-2d4kNM8wJQ{U2NlafwqB@f;sKpq(&?p}4$_v* zBe3$BRuMXX+suAs9Qbhx{fqqHsEq^n5}Q^YI)B&9e3GTt@*cKG-khz`V!fI|;dNf* zXFFxO(669LGw&ul^Mw4xXYYqAHTfOPC3Y&a=7nG_x2iSFKJ09X9-;K0_uE1xd=} zSZaJ8fv1eqBY;H_WhC~81mYdu-%j+?Iiw|LnTEhx8ulB58%VtyfriVqce$VBsiIB( zhu8U9y;EQFo&nrSs~E_oWl!&YbmYVPiauSmimZ&?-<9@H%Ko-Ot;*%Z7?-Qouffl? zT2T=0AHu{BNiu$eazJhk784Koxm>N|_bJ&M0Bfn~I6xV#C>k!Wbg;(GkMw=Sw*=d3 z#V{E?7jULjUf=1Mi}jwSM1ZJ~Z}ed!2)SSNxy7BTCLS0O3U5-Y3{sDoI7YW7uI2q! zz2B_#P7Kj|tkuT1tKX}6U%gSG7x<}OW9Z%WhsuXN3)Tpm_lFkufzvlU*cmjs#RXV2 z2#D}&K8e{7Vn$I7B)KKgCvJT8?CVoT+$1de6Mt!uBW@s#BW^-Rhfj>63q0?L8=b+| ziC!5Pq&{#RG>qikQw}8wJ#9E?E4m0=r?pljA&dPfgTQ6@pI2BP#DCIx7$6P5Z5CV9 z@KU2+tI4heO)f#!g6xlIuppDhA6odvAXjSux8~rD07ym5e|rN$_-nQE*Fz_nf2)Jk z%Y)QftOG)!yOp5Jt2Gq1dP8JF;TJ>U--W_&K+ZsZkH7c%<9^NXdj4J#@G_+NGf@Us zdS8;T{=43Sk*<>z=K4lijWontcQg&8RkpIj6*htxTIZU0A^?dGMF5hkcN2h`2}l6? zjy)eM`Yuo5m9mT5jPMlLRg9oj<;PWy;*)p^9<2NOpLYTUgj5J1;jw_H z^+OQ#Rvxd$>1HGL&HP?^x%qnef7XLSzr{fhhIHvc33245t9UqhNnMw2Mj7DcTeDDg z>$wh91)&I^1tEh35HiRBk!IctVuFkywA_lx8}l1PrMJH;QR$HpVz16tALr3E36_s!qH?DH>TsA z8&j<2UYm7UASI;-ASLzO=r+uhHexPe_f$AO^6b;a3}TRpjfHqYoK4fge=c__Ovgn{s@hc>WX!-#iqgJ(yWoG`^o5tYH66*~Z=L8dSH3x4pbZ}Yl zra8#9Jb2^iAh}irZyZ77jjhSTWo>m@?VEx$tAjT!!JB|WIXO_3Wim+(``61{6A!G9WH;>toSEYhi z^WVX&`61u_o3AVENUOKbzejkdnkwA2CzIEneitC9t_uu~>w-{LMQU|%T>!qW3*n#( zLRpt4=z>tzHH3ovE>MznL9A1i|1r}C3ibOyseT_Qc7~tM^+EDmdTzEfmJ!P`0k?nr zI-Td-FheSx<4Hw&M(Pd}JX@enhhl8jvBjy=M0rK|zW#ddnjP)DK`<<%(`5Sf zG=or0(Tws{Wdywgeb|Atm1XE^@1ZTwwN$_Mg`5(ju{qvl-+KdGY1kd_$*pC0GOo~B zqlwyG9&iNbyqu3D?Ixy9Zn^1-9Pg-)THsPhp!35d##0MsI%C?gu9=mG*{3Sn!j@yT zoX_rJfBiIY5!BKSyM$lw_8umE*p55#^g(QeGT=BY;NbIfTI$1x*0I;CCe8p^kc91* zi?0ZmQ9;=%CJFm$m$Hz@*G`t7w<3Wc}DG(r^owpquA)dZ3FCu!Y62pxMZ5d zZ*{O(Ff9ROrGNV!@argwooC7@qsR*O%7HjkEmky|-*H7_9H0fSI&Ha=O&0x~gnn;& zu8H)r73?I~r$g-Rb%B8GkMi2d@Bf~ck>7>xQrii)t@F6$1q1>L8(DzBmrv^saG%Uq ziEI8BW@Vyj6(G{?wP)mb*Dqxef?jAciEFWRsR2iV02s)#-)=Y;zEK-eTfO{WYi)G* zH$^s<=aY$Cwkv-P3YS&G+(Mbl9x)4LmZ^R6F>5YoPcNY%bpI-3Vb;*(N!|e8cD2P? z>boJK#jV6)*EH*4*WTq}?3xIe*tHMr$#r8qrNwjE*(D^dC=I9IVt=PFul zr;0CEC+^s_Q`M+p?2Gm-QbesH5|g&ax1*_BTc88(5iT2LqeZ@3poJP9e}6Yxx-Rr^ zU)CI9Xha(sn^ZA}s@Nk1!dS3lEB3HF%orX*UVO_O(oZsE5zH(gU|B$Yub`(DQkEzJ zUnoc)7vrA28?S)>a`#t=$!g_2g)4~$0lw(wa4dOSezg5Jv1Dlz`+u|MM+bKG*rQ2wk`L&^E2 zLwJ4fbbd*0q7iXiQr(&`NVg{JaDY|K6sVz$Z$%glD=pNi(H;Ke)$={%-e0 z&;7)rukEI2?2~^WaB@Gvb1cKJJVwzBmhqxu4yH>6$??88!6aMGb)+1S{r}A#yg$#ZRl>xtsM5JIt*{Op#z9!uSZ5g=W0nLf3 z{0(KN^+-g@Hk6G%S<5@MSC!Nad+lPTs55lcSYYV7f1m_5xA>X`PF3-SvN1;_BGWgN z&9tmAZB>)%hJD+z_6_)i}{(@8r;Sase)vmw$hPoOK%E}oQoVdq64~sL#r+hq4}2>gWIkvkR4^5O2`XeGiIcMpf4NyPZ_%|1CfF_t>Hy|$PfsIB>~ zF{AQf(@#T7m4@}AS&tP(Pw_C8aG3>Q2}P<94jwBqD_9O}(!^}Z0D8xY zU=*;B--$&-ypgz5(1Kx8S^F23AUv*!1Yr`S|0LgW`sd`MmnqVhkA~o)1QGx_EkvtM z@{_+mN0_X`d_xZF^1en2SjUxC z91T!2Tmw$Nff7UER$h=^l}udkO4*a!cCnR$H3Qz0Dj3(xth8~xSC&?jW?U~ z(=&Tf_TRND^>?-zi08qvT@1Si?Th~>}v_Maf|DKs04{Q)Ohmb8A8wZfKmAL;|aS?kAF@3d=p!^%4`dv z{tDHtEY$2? ze0RYEh{!ebPFj%Z+WobLL*mqM@|u2%5w2#JSu9v2z133tx9IsLa*joAz~;yU!K9eX z(K8+h&O8>k3g7uL3lIyNky9AhIbCbgHi>Af3>?(tOtn!Y2-(ACx6y=i|zjDrPn;k0lP zqn(ZdoVHV`qs$+s@tZUpF%8Gds!pN0jSR0h4XAl<94ScsD-rUgh})fLiUX$z2c zyj7%qQwHeV53}%Fg7hfs^$G`n^mg-M8o?#}GvNd3bk{97h+4HL==Os3ns#4W7foGL zpe@PLy$@_>Z-#CR$0XgIoA|^1do-*DCVUX3`j*KF5gv*Bn~`IKHzSPph@7X-qd%qSM?pH;vhiO5X`Q%#-3)Z!VLvNxjb(?Fx5D%^k5l{jo#Piowwt!K75Iy$VtygUZK;r(RLDR1 zr}bmMTR%S6Ggze8*9J5K&HM{B7a=qs@!o)peRWn!>q+xE#DR6Y-YDw86hQ1&# zWBnp^@7BsO{JJ6BZ4oJbKlHGuS4^HZ5CT!X=4)N5B7m!GQw6fN-Oh25L9@@`_q0%b zZ_;yq>rfGQ)DRrOQOSmOlwI2r#lYx$O5tP+&8;Q@u7 z#n0c=n`fSPtNC{ujQ6*hH&3|@PHVxOzEkg#`^2Mboc=phzffiWO5bn3Kboq2q8nR(FU~Y(4mj%IJnK4b6Gx1WFbDc!%E7 z{D_~D{-a1%>g0c1!Pn#X>h0l66H}*tvk^0Y@Ss-BY7w)?s3{O(#Pml-zaqT~p&%TE?h||7Wk#wlL02 zzXYeHZHzPOUyaYQ`A^S##ls6qZo6yNZSj2I)N{(znnAqn9lsW*l<}Hb@zHvF+m!fl zob*kNU;gRUnzqGy>Z-K{r>~)I0iuk3n)Xn`*99byt3}&mG2O$#ztU>#-fm6_*wgxJBH!gO*RbP z${%h8Z^CsSpn|B7aVlx?@BiwwCLHO<$d$^@HQnWM>&slSYW&U+5F#6fpL#~}M&L7= z_S_GVr-j~}xei2Z5`cN@i?y>DtQX!%Z)bNu-4_y=O>Uk1v$UiCWwmp-F=1XLS*#H$ zz*CSB!a@Q@2#bX|Ln555b@XKyG! z6~)YWHo$&ys<@zmu78Kv?zFv(Yw#T-k5lESWhAWlXD^@Y6%4FbWtTA1v-HSJFSP%+ zlPdlFzw`WYT<~tQhzgwLCVRS@ueBnqA`Xw#8!kiiiSw`XxsGf=Z6tLOjumI0T6@Kb z@jpb87j26rM`Cn)b+|nAY-`S}mPqoF@@L7L({^0o$xru-s2XAW+8&jqYacir?Y)TayVEVrNkkuCP6H2Q`)k=3&J)#xu6f5bT8qK(N%9k9_)a zpm%8T=gy=vse$jkbVW{k(Pox_FHg<*=k1|y(1mL4-@2p3O`0oGqtwnn6}nt2Tu!3l zdfrS2LgA4NDa<7a2s5fod&0)}>D@2T+2|?x)lM6K;amc2l*UVyM)_(lEsmeNVI(8E zaisKgXbblgYEx{q;4{6oHU zYIJ<=ztCW7YyCMLZGGOg^~%HAdU4R!`T5?BIcn==k<_q0*4Fv?O||o9o)DiONzSjz zf?0JI%s5ruJsGYxn@hK4W>21}%H=zJ1sm%$xDRJZtjJcZ3=)h84m)^VCqoIfPU{ zh{++``u`SpP5bASbZ2 z=n3UWxa%dY2KYo2d-Z1UBBrqbA*dp;VMJonh{V{|bKPgD5B)OZIXjbw#?*X@bpTK8$7pfE7OG49~)x z;TgOQFo*jU8$=y4=);Y)NR?Dqd&ST=cM@VIlNqj!6??<-xLr5wAA^K4T=p_=Z@zZ| zt#T9STlWihd57z(z1?8iuPj^0>uouX&0yN`>78ms67!l&v$Mw5-JhfZ37Q>hklHfS z>QIAO6J)iV$=hAa9eC?DeypoL_PrTd(|%>$J5`a~gLT7B&F<33kAg0>+}B-~Y~JiW z$<3QmOPtjkgo_M@s}+e4(zg#*|LSdgyheQ6cBBwJ9K+{i@q&*<*Fz0QtEY2%&e8k} zH5@e1Wa#@#ezfzj^yF>bu$!z!{;(`$Q`HSi=(bEB94hI`qELfmCA+rB%>j2eQZS#~ z^+^U1FI_vZE>h4J7mR&$sk?=llwvq#}KmhE?7TU^yJXK)A|u=fNdn%|9H`}-VHsS zyjt%r&FOd8QO~~?b1}a_gN&+ zQ2>#^Sn}~^K%`^^mTaN4Ln5e!F1pH(7Q4iI{lt2P!VCBNU+o!QDB`8OdQ!6Jl}g^^ z5=Z>6EiUS4rQ4z-v9*}Q&FfUsolsl8h$?;P~eqExW*ixIl z!a9ueSJ-@#+6wFKo~R`?RR18|?7XaQtY``6@wRT*$m9Iws-`91yB$~ZI;@zw_yMDf zyo25EZUqi0Tc-v1YI8&Hh-l{pIB`-|m*G%^rovFy>JChD4eyLep@t{b_yC(i4Ubx1 z9y5%py>zJWU{{=TX4z2ZAPRKuwt-olOR+KPI@f=e=+Gy3?gC}wezCEc&FW7__srT7^biJG_iFY16T0`60a@Mq(cgpamCXFa z?$vEPC=M!Mlp+f@ie}XfE3=Y9Ucw5==AK?eTXlH-4tM%w*MEMd{_

    `s;>y$EtdYm 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

    yj|88?oklN>{hK<|nW?hRS>KVrFJeRM! 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

    >@EGX`nq}5XH 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 lP=B2W$dvjof&LP}B!5uS!7*k=S)aVx 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

    Ji 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 z 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

    EbLdoF6%`+yVLq`+m%K!g#=q z71=z;sYNY2)6!yW76mXP1{L}^P8anJh$KP{{#aBvTZ@Ph;e5$rL?)a6lP=mp6E4bf zs%0u5IUnvR&^F%ITFL^bK6AvJ+I(?3&* zEW&`cTK{Gd^NaXG$PL%U>EaezfN$M|w;aZrY1Cv9mruc(1|`u>LyM_jF%*%D-_Bl? zNYq%^`45Y}HPYSObP+g$&G`)uY#XZYC=(>S;+iu((>9I3NEbO{WqM?SwYqRMHZ;;E zD9uf!x5tF273VA{w`bc<_f%1O&V8O&7h0>9`}t zrl(XaZeHNn_-|`KPw^k~L-rXtwwK>|reBu>{@m1t5T3a+VjvxTw|MT>nK|x@E2kdw zw7P{wvnZPv#1Ey-Z!s-mqi9J4!m%#AXsB|GG(32xw@^vAvITW(RM5LlLD_?gG7Si= z!XjdI%HLF}ykxya(E8GCvM3Kc({C;rEtUr3NSZ}#2T=tEBkEZ*bsEQ9SyT*x zlmUU3k{Y&v5_@aNJ$_W|%5cg{DhODd<(vmKDlpEbAa(f6aR~Q2r}b%rJoF^8QG$Zm ze3~pGD#0^!E!m?Vy3p8Jbn_x`fCn)H2_}oO)C3Y+R5PvSWKXJLD3GQO<*u_nIFW4i zCAtQOOTCf=YqqZyAb?_FY%Pihi=5a=B#O=%z_BnO+3V99AM1+A;`HPPKzVX4Q8Z5L zqz?#@Y-GTyXck7bN$7xHkW%2@)NaU!|C;pTET(&}!HD^J5%Q$ezal;v28J#Y5zJG~ z65ebvJtnc*f}CjiaSvMbTJ+^n?^kdE!olKTp_veKZ#iw@w>gX>s1QmZ?q$LPkX$B< ziUu#ZOTDez?@`N`PZwX+@Ah3|G<$OpYa8kWlsIn=e+F+V#ss;fXyIZF4=TNQ{F7ow z)1sfMS;$XGJskIKJPqc=R5>h)-&K`ISRnvk&}3x<+fQXIc0~BzX|{8apVAjKu3`UZ;1jY-Wu^__0d2A z4UOk{Q#n9k8D5d&SOn!lhlA9^-SE6`nuZc`D~($VO8g*4Z%y|HC4P{DN}`z|)IzeI zW`d|KXKkT&q%E4#P~0I726s$`OizpO`ij+RT4pe_i5E$}=#iJQ!(8B}%FXa+-1RJ$ zuhYfXtQoOK(Br24Sw9yZ&#baHHT?w&AZZoD6KfFSkm>p@EyDqBc@Q79JLK(#Y|*kJ zm*06)mX+`!)-ihQbfL`0(*-;FP$03|*@WKo_~RWx+KYIBnlz3zPu~>Gi8LK`Y@7j~ z;1@**QiH-VTPcxm81Mg6saQLCY7CoUwi zyvQ{UC0pavjHr(p=7h4g#Ac#T`+z#0l~M<SUN0q zI|5#4dv-x;ec4*wc0;Ae@w#C3;?3<7eQz`M!lnl8L^GSAQCJDA08Xt7#_x`GfgHSJ zU5Gzt_6w5l&ZtO!3hmxSS4*-p3K-~nBUuFAqhjdYA_JrG^?SbCCiIHmR3Pdf9qzy3 zV+#gY9(Vd)w8i_b`n=<)VCJoi=YkTE3ra{I@q19f_ZG9gC^(-%j@rM=uiV5ly5tiO z(K;~#ykLDmYZu?0>eLO#oEalUPHTQh`_i(EvZv1sw+=QD&7^_6G0CFo5eRQ91B(`y zJ$)0_wZqM&72uGL@MgDW)Ca9J%ZD^xvS%iC#aY<2in4}|;_}GBA{}x<%FUKByXVfR zFvDkf^!g8SFR?#m?b^;6)fc~hQrJYY%Zu1xY~hHn*0K<$Fho(pLUocFk6Rst5COR2(kb8x4~c^tLoksu$947*&AFJ=zet~JZq zQFMkXV6DY@G(gefGuKXr`(PQPs0cFm9CpDpPC?`D2ikclD?N-Ud>}Mr@L(ZBm}5GB zTVll|1NLi!#`!TOi^aM87A?0(gtVYf!(hebS2nQD1wQ^XLHli7uf#3--u`X^OHMVH zLzu1~Ji51G@*OU)SYQ88db8jql?k7)Q=gDQIEDEKmmyl!b!15V9FKazo7lU6&2e&x za(XMQUmX(3D%rKuh46bR#PAz2)$in1{?I>!E8jQ2n6b4}bs>@VfP}5#+6f-qX-or4 z-9oaqBF2~xwxfbo7X8ZbqT-{qTwy2Cqo<1qX%KDE(|el2Uy02<#N3s)GgieZt1h8J+Miejzd30v2v57J!g{KKm?NkXpI1CqDR z;!w#WtP8GFWL)tu=(*m$5C8*Rcs47g(9CWZ#7h=$Rs{9HaM7Z=SK`&yomD9%mXzgF;^_gnnM({H`Zlcu};kx z;Wk<1wQ48CM1An{co&zT*p8DqepD!FdvM4Y_-K&O|!t9Bry+6SNVvE zTW77Nz8|y&i{u!ytu1R7J0!dGaB7+e1=YXSam#h1aH(k&wb|F8HP$-Sz)=;`9D8sP z!$ltmT1K1;ZQa9c)=l&(<5l6TtQE_uZ!;})8@*EH{}0m zp$EkqGE4e)rb*xe+A;7b`^7+3?SK?(*%U>_TH^;wd&RjYjJx*Qu|CErw{U@g&*-H(7<@`>%9X?aOoqCG&We(?_D!S zieJEjQETzaEqEg!dh7!5-hgBI&cIz(46N@w(*6VE9_basdbjORzeOYK-pH5xH9MX? zD)u#j3_&G0=OHoJ^hjVjM=E!*QPdXOT#jqcX%u(`7ckd^y#T}&FP_6S-D24kpG27N z`<4YvA!!So_lr7haR@jxy5z2%Z=o{=;W|!RQh>CM1~U(OmUDpE{R>GxS);ydU9(YG zgpLPSJBNr!t)YsOHIK{-F|8&ap~K4c_kmRcD4sqP&pf<%k}P=?QL$>j%)y|*)Jp=WIbXD{6=!8v3UB)lI>p5sw56kJ6(!J0Zdzs)Y9}wB#V2VWo>Ov)VKp(FU8L%h7J=Y z18GKu(&ormBhw|f_+VAGgALOqR}5_rTS=GfrM;7wfJN5H12ue%9Jrlk!`?5RdK_%B z1b8F2`Qeb+c*4t;uAXP-)EnL3uba}(r%#71ns-JvLZN+GW65(5-ADu+anA5iSc#MQJe#qNIcQ1t)D|W%N)FOAa_aq2C`%8 zw0_kkzI6uq5ic`;1#urX6yC7}Ivu<%cv{&zXIoIwi*E`yV8fmU4h=Wm$!eN0MivL1 zA^7!sSxbbsc=M%@(j}Cpd;znZ^;A+=8~kP7(ci42V7c&ymrNHD&};$!>C!Hn^Yu#~ z_B&W~p@6;xRf`%g?x5lJbP6-WDpDd{oHc|3WGC9h&fSlxF*|%jnBUS6Nzf4VWg=t= zH^w^S;pt0Y+X6Ic@RU~5EX^no^PzqKgL;cCh-h2dEUAGx>>_8$7p53(z$y4Dykn_# z%-$soPaOARPsS3v$c74{^^nD)sQ9fn&l2lyKbR5~2|r?ehoW4Jj6(Gz3eY2coC4cN zwA7kKtkh5W7IxF23VtT*EE{w#o?>J%WXw&6)_r^n=+eM&Nd}!HQXDM8aGTQT8g72) zTZ8|Wbexbz$c__9=x;X6@ul4bvGL7|bE$mv<)Fj}t{^_W9h_RFF8F-5AXm*_`^o4) z!kkrvQL5f#ser`+_*h||eT!p1NR}`a2v&)Bf@BGAjx6fMfbu2I_r3d+xaGS~r5Ci* z!aQsEs`${H6$FK_oL`JzmR`bpxchAZ!TWFC!YUTJEgO@FSGw@zv)MkHCG%eh-~s$# zNr$I};VjI2iB*1D%yJt1pl=J}$g|PQ&p-R@(NtUcPh}wuDkfxGK|kP0 zI46Sa?Epl*3|k4<)-Oy^ul-up33f37S-fmnV$3BU(k1->y9CX4zPY!RF0lfw-@_tO zh)LoiNEot1?Iw|m?DKR9tL5&?Ci)7bI(11HSza!{cei7vS*pRQxtldJpa}MkS*936 zLF|T|^KyiO%i!Q!gQ3B-4NLdz^hdpzp-kxFc+NX7Gq3yB1@+#ccT_6ZMF*e#F#8-v z(z-*@!5?Oerv+3V74aJ*HrXR9I7w!n7&uN|jy8L?>*3(>6eP-@=5U}QO;N`HB1_DS z0UJyF^s8x69(ocLg<@1iB2JS<2GtFV#t|MC^^K4L6BjG{VI@n&k1j^mY_yk}If#Es zF7Q%Cd0M@3gMpbnt%Dh&H5_+FGb)l~_H?sOjp$HG@BIQWpO)MZGJNM{J5_u7v@Vcu z_S7S|m$WUz&mV?Lcb-~Y$n@KWP+#e8Wb7tr0EV-P5ep%9aL{@brkwRR}*2v)j;0^H%mNWY5`!BfTAWFb?ytp*fY6>d6hmNgufQnJMGm{}NlfmM?` zr+zG*3`UAtjl<61=bZssJbo{b$?maKrtM|bV{e%Fr3;7xt+BWUk~vK?a950;$+Fd zY@zsuQY{f?F3JZ)P8Tp~TE!2%FRie~J3Cad$VxhB!rJ~Ko$6ytbW2Fsa~<=M)!CK} zVUM*JX;tEbGpviOOOkNeWV#CgK zort0|y39EHr8)$ZM`pS$i(`VbU|Y&r14On@QSt-06rEy2mbI-om;3A; zCE5;lWG-lFaq2v(KPX5mjvm=jV#IWt@lE!-{J^cVf}ekoRpgKM>LU&KmL(^;@3S94 zu@R?wu@Eh51PiKnedxap1YeyRf8nKd;FeID)6jC)p&r`Fa)oEnx*i8_+DbFZd^|*u z6&2Vqgmr}7oN)B>aIn?N4zcG|bS-Ud|(mT(&n`8rXB{QdGD^m#OAIVYj56 zr&_oRQ7}SJ!4J7k33x0!R)bQ6LMsc>Hq~WFB(IAqWM5%?GJVI`V}P(rz0jAwW5dm@ znGT&DmBMt86uo#;L`E|T1$3^39=gv2(l4brcy8iarx#ivtcF{AK?<_V2sFSv!uZAQ zJxP$T>+};igmC+sKtZe1@i}K#VNZH@Ftzx}II=|b-GRnkK8yDJ_BsRVFUO{Rz9nqr z$J59|iR(LI+fy6qEe75TUJgW@Wta()VQTg1geJyU`@)!V4udbr^qn0st~u!3;`Wv1 zJR?}>L7vKxE<`~fQydV4Y}Xt#h`bO%0bCctEwabg78t!Gxj6e>0z6#9yaO;s1nIz# zA|R74a8iCdlX%)gX>tUoqh%6M3`!gaeu(I0$Yi$9ZqX*_EoH(Fv|e$SBt~JW%Ju20*x@_L?TE=vK`U~BN?v# z&>P3MfoA)n4WdAc8dJ|YUWPUxk<)L<;>$`DC|p@*f_$-oZ)HLA`h_2~g}@(sDr8Js zwU-obA)}BO62o&m%TLU5V!0_kUA*jew&jc%n)8P$kImzxb45K zXvim4gid^Cn+d=mM|~BqND=%Xi^A1%4XlM=miU4ziOzt)>VniU)A6_q&IULzJ2?g2 z1L^Eg5`+3>o7n}ld#Ky#(&69$zf0bdPC}Hion`hL=Zt&uK*J5ljLBj_ix29)yiBJX z9Eoht1$Y% zn@sb|pX8G@zfruO+=~~e0CZjQ%H4yg@JGwe0?voMS0av>f87v z|95?o|N4`BDe~z90r;Anj^NMo{EP=uBl3hu>z!;gcjuI9MVhA%>^m6}MSmEL3EsPa zG_WiU(4ELp@;twDN_q5O^9G>kM@9dB;gk0M-pDgxoW$Sf~ZhpB3Lf^3SK^oBX`rD4ze^C(qX+pFUtNZ*Pbm?6L!W zeo!nYxZ#^VnE8T|;i3%ypS-APzBlmIt>QUi_XIbP z`UBh#m*WAl75iBro)k#(0ECR~yqY$K(of&#?Jx_``3ReP8tVDEeFElR3XZf0)5qHtC6} zEFXu6OyA$@>x=Y(8}c%g3@(0f*jVpfHub~wawXFTa*fRTH{q2&2n5@<+iE=N=-^V= zoxw-c2X`x8(3cxL5AScXxPmI@`z+&UZlQu{8Ka-WJ;i+CdkajrA%WiHJLV8+4S+oK z;a02wP=0~#nm2OD$kX{3vE~W;FirO92bQ zkQ-^T~MDKFQzz zB){-U{=+Bv^~lp7_}7*S++TTcPQ=p7_?;+J&+IuHk%8K0c|#M5_9Y=eiv0X1^}W7R zUxDlEG_2%-*uBqHAp07x0@vr3>WlZk)th(nSWlR1v*(=wh{c_}9g%%EFTl6*fQfzv zymSV?vSgnypZl1og81c1G2iHAtajv>-FM3O=hODsaol&FpSFaF&)%2ZgrBDG3wM8i zH-C(an>?UJ?N zKM)Q4ZXXluL_3Ke@TzT6juXxw;Pv@062^SW_4|zKzU3XrWm6 zp@@8^dUgn;57-^R?+A6WmmN(go1f;-I8sJ`g(^&UQxyEM7V@abS3b!ve!@S$t&@-W zSG@o8pXig1|KAUv|61s;;{BUX^0)r_w7d_&u*Lho^+|jFrBCw9VUHB=C(A#qzyC@3 zy-)JL^GW{dlY9~eMp6EQc+Pw+RyUA;{lT65_TVCG74QH4Ps;o6Kgs{|pX7hfC;7iK z^6(oTU3P*!Xi|ysv;`CW*~s!1<3C;XkZZ#8&R`Xbf0(Tru!MZ`T?W2~OY+n6GS*q@ z_(2}yy_o;o=eEDV%Cmz9Rxh-{BY6PWUj(B6|9rjca-3I|rkCmJ9~BOpIFR5$q$Ea% zBivNfKt)NVR*&t70YOkgwJ5RxvZ~t^iW(3|fGC1UOeVlXMNEYM_#S)-z7$`^T*mzL z^S*2C!6+0YrQFdw61d&oJTu1S zZ@E1CUe5e|aO!9P5EJI(JKIJw>5T;LaPEPZFOL?XyQBdCllry>Sv{ z<$S94!rwn)1L$vBEgtz=-u63Eo3!7%q4H^c@(p|b*Y~%0fBJrWO%4G2AD@vt>jWVY z{>|>0%nA(I+Ee|#kLpipPcV1)JS-=z{g?JsslT6{$@2htaE@mrH#Q#6_AkJ3uVH!M z(uRrgV!(}Bf6K~n`@Op*Lu>bY;d{FhaZmdGJqGt`^|!c}86>T>zaawO{r-1_si}Xx zOGJCVYyH>#hnUN^njG*t&t-NYu-lTiyWh_ayWgbH1_$cq&v6T_zLVZ{^_`cxuP^AB z{qM}=5^!Xs(ev+$JCD~-rL2rX7Iv`R_&HrF#v9~4tcmy`%!w`_&NP3^R4tT;b!y_l1_*Ya=2IuF+L%v%WZ;BTQv`e0MMpG=m9AWyCzXdbVaHM|l94GQqo8oNR z8(k9+CnF!Ti#+J@$hsr^KKVBiv&Q^{B>Dd)`Qwd}5n|!CZR{FA@_gb7w$j9J?@gT# z`ePH1tcp%B6u;S;F=_eSdn@!K*LP>S_x0-h$2YGWQuA! z*XWwXK2^o`MTAnBpR^lke>^M)npNd}sM41JT^9Ex52Zn82GU{uE`PIX=VYPRe(p-x zzxk`^U*)&QHJA^kz5E8SAv-v?mW{7@nFNYP$|3ko%}iwZ9sk9Xj}n)Z3{mtVu$Gcu zvHs?Qdn$2WMX9mBD`sTAvGDtm-p^R~AkH}H z*?M%%AsEd=@EXYCfp$ifmldJ`e6wSGq42}?%HOu+0g8GP=W%>3;*e8aVgK?iIYjQ* z48?EezmOc_ML0hP2UfoKE$k<5LJj(}uUlx=4~c+~I~?Z^4H5i|%nIPknh!sJ zvg?$C_4n_~Z@kMwg(~zp3}6)70*3yCA*$+IqiY}IqRu+?^hx_Y%&Edlu_<2@t;rOm zH0tx;*}HgNZ)ba9{w%yv9{uX0=!4~}`n#;(qq=@yeE0xKc}?uF(=JeY^8zqmbiQTWx1ev96viA(zlr#{!&_xAzcL$xuIjl5u^ zmheV{*4F4Smy-n9m?XB^E3H?qaeS_{CluZ zFFus#Z!bRh{FL<{{a>*Gs1Kn$NWh`tYrjqbz108jMSy3%zwOOr))&?R6Skc|l=hAw z2W+AFdH}w~Zst*mJ}c$QT)u;>*FkCjtGXY9j=%uumhl1PStyX;KM?j(|G(Gz8#p6$ z>5YW{6w90O9h>561@^N{bJTJ2f7VO%N%sT90{VCS2|YdL{ImXu#5gtCLmoTOcP+V|27V-;9*P z>%a$LWkBR6LS;VwTLRAI_y3dgQ+|&U;4Z)aA@xo7uZwUg&;OUyXEh!J@-L>zZz`!w z`eq{=CTK1RLkeR3Wr6y`%k9mG&A$dy(|tP1jg8U4-%|~n=*Xyb4aPKluBYeadVujY z1f?zr#s-1G?>U)%5DR7z9iqcom{FK(Ro0K2Hic$}N)Nr^cLJPt#(?Bseso?DqA za)K}X)Y4lxq zz30bCgd#4atjGVH>-nFa{3rjlsDJ<8`JDX$;rQ}xaTzfGI(WMMbgS%d@!w|46TLuq zd4o72HqQJ=o+aTNWK{A&eJ%-*=jI1prX}frN|y69B0??S*rK;?>zL*{41AM=uYUKt zhySAbSimMF(Gu;;TG(QTbUxx0$J+4Rvk?sci2l$q0h`c5`BH-SmYck(vdwwjqC27p zI)j$C{Jyq~V=c42a@{cUk-&0wHm-k0e#5hpGJXfA4tM~6D*iRDl?Okd8A+VB5VN0btJWu;GEUA1rrS6ZLM}>w{@edC?C*d2Wcd4E zvcIMN=sygf?=3!0fRFXF@e-$=l#jpArPg)7@f_lGa^19*Hr4y&1ux(kvJ>#Vs$%DqJu&W%42B)5UM}c!(x0Fo-d&F#hri z#lO*|3J+*h87%QG*_xBQg;Tp!ta7;j+6>eeST0`*g0xNC56Ub+51&mtUBo+35SF+T z9YBfBOLj?%DNuft(Gt1`4}iXpEF9HWkm=5i_N&oBoX=9I_fWUOJQ$Axok@a?| z801L1_8QE^9ZMS>q8!0cOE4RU@MMOnD2OF7Q;&i;a4w(?wAB4|rN*(Q&=;7oj+QV1 ze>l59=S@aP*Aa~UT7EWuRMXRV349>bmf-2*C9o~%l-Eky4$A=dmoYD`OI^V!>>hY$ zsl@VtnKD>*&>p@&(k?Zl@|9USo{L_$U>VIR1~bpN<3*yUoegcN+R$VPCCyVS_&utE zH?FK&{PzRgUOBXvY~}(mK$)}NxFi;P$RN`2mNg=n%aU8X;%->?EN$2hY5&%!VZFuG zw3HRRvUM$L99w0#c`XVe6p*<+87*0!OA=3r;b_SMzg;+Fn)SvF7lz^kv4kT<1Xbd( zq3AhQA4mXsnx#=9R0;q+ZBz?2N*ku-tU}DG1sdrSXw7)3SZu6wf0#oXn1_kj|)fdtfxWCd!3V2!)z$1=CuRiv@wO90ZwB{ z16+i*bg#%J2FAiZ z?W|(mB&QlLfQIa%L1myc6MJ`vbn-=kEM7TRgGY!jOa8E5I%3T@|^8xK4+uH z8DvE%l$L7#Bwmn=9&IQMQ4nbg-lj8hZ2Hj>(xFf(HEOf#l2gpV>txoT(b1CZAkZ51 zGC5EJ<%zV8m&}Ig z7c{VMPr-%fu%UylMjYh6fK851MQb#8b}QHo`rj4AB@nFuUd1k<>x~#FmK_#t!B#+T z+}8`qna*AvA3!-HQ`2~fg8`QoS`)U9C2}b49fgyr<`(YJC4l;O^ZjCt2zY%gHm?Tq zf>TK-4gaM}+PKwP@T2Yz;8e;5CL%-)iSbIYIAEAZhgh;Hg#}S82`e{R0s)IHbpkX_ zWW&-SIY3T)zuO;mWzlHqV6h)To7Dx*2aWm@q+ zv`-wg1P?ukd5!yA*@c#-C$et|E?){>BPWoo@n+&nZup`P&Hl(lO>8juWot zOb|G~a*7m#LBC|elq@EN7z>!oV!=0y1;1M?sAh>6OV?=mZ2d~9Q5%gK zh@GKzY&t6~`}7^UtYFhL9wV<8L&y3)kuYrjv|d;M#k>*gBCdbnGnWOvVvfP$P_{J3 z?-FzZh-L5O5f%*{j|fzXEk&cvgb}j#Pq-3u1ouIv6#|nrV)dhj_g)HPriGiN5(u#} zMcQbTx9tZ4{ZJ=K9k9=0+EZ-_qsl&Xjd0{p)k3tM%#s1?s2AjXcNbChwYy%5999ES z`Ur8N#poQb$b2D*Fz}BoU>8Fgok}Zeh#`fh#ZfQeHHE!4c?`(`9|C3!(K;!Wl3pzl z%w#!q{gMCe3ZQdJG>dqCjE5{Vr;Il37Dj~@6V4jk>;!b19%_b-gJQsOzq}fulV6x;QA3cUA`ka;&7mm2Vsbb#FQ(HU_dt)e`jQebL1ZiuYfIpuyY6Td z#!{k86Q^53F3;K$`m|8>y5TH3D1`6a>satkF5aG6M=p@RD3~-Y9PRaIY2y&`DJz3W zlpy^joa&XMqhkC^f>Jp|t)QN$cpwV%@au=a{pZNmiW?Isi$i(nx*Y|^ONQf3Tdhm7 zajVwIS<@>4rZ72saXSgz11LKZN(c|tUgxqrneH+sW=Sq4bQxjdu`YETEis>jb90Jd z9weYZ_>K@8*o)Fv^#x(T?P>s`=|12k`h0;eOj}!PzyZmVe~5lW{7jn2w8uE6>MJLC zS7sMB?(nl+LE4R%!emgpM;i^ex95^3Xzz?*NGVc~1c?gJG4{$SHw}~3TU+~>{^+y- z;u3z7C!5MIok>YMnY$Ib+YLDCVjOPI? zSaYzFbf3lCfE+HDWa%@W!ul)J6%TIz{Iz(2+=O(1B=-UQI9 za59htcy$r^~q!UT-{dZUI5-YXHwUptMk~i8kg=Iv28q}OqZ+Z z_3bx5+ue29{Y44-GR^F?lkWZnLvJNyE{JR1mx0lXq!p=&mqR`l^mF_Q$Mrd17e*4D z%Wr9(g|n7+r~`#uPaTYX!ffc!3>@xNlE8b0yet<)Tt>GicunzE0^;y+^ZW6#uuzyb zxL59!<$$X*mHbb{MtXkw^%^ZhgOGPS)H~lgb#Q}7<#<{96CQ#V8HujO%g6;&B#`6% zo#;6;wjVfmxpbi~i9nxLQZpzmqo)0Ub9zW9l6%#|Y$?KD`jQNISr+C|Tzcde-`B|? zm}TvL<&-I++_;tq8B@Zh@iK~p83$S$8=qJBbFCQ6!M&B;JRLqmu$( zvl{?wDrcd3E`;$3d&_oqRk5_=mh<=ujLACB5SNt5k#A*5OsM-%+Brvr2cp1|lqD~i zU_^*F2sK$k6VjQiK*cE9a_AIj1r-dr9;Sl6BwX}dqS3dYn&mIb1}b4V%kSaE^M}8! z(Bx%8mpeS(FNg09G}|2NNAj_c(3l`!woatOh$qM43$ufuo7s5TquS%&~H z-Pbig$EUQzVNcBc2}liKtmqFN5U!qg$+uM�&b9fvr?H9yZ$vVOhX{!SQ6t5aHX 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

    us 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

    0e4@Ak7CKB`$O5Ff=IefpX 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

    Gh#&X9~Qxh6B_XuM`mm_Cvlm6 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

    UL!1U0L}4wPzu2nV>Gdo`VG!j z&KdL9t6>sJISk^A2P=UCf%?|-iNFw`xFBZ}N}?CH@!@r5ECH`fP#Uc$0Qjn zEQ0fbAe&>q%soC2%JUMYN!(sZF!YpsjREI+HkQK}&v8-X1<3JrwDM`_y}hUZc2y1F zp$9wFdbU{YJ^hrH^s~`h6iBMWo+%q`^Egu z%M_RG;z2~in;(rp&($R9n+I?U_!VWT2D}IV`M*Bx3IZ0H<=xK@^It<}l=I#J(9ScrEvnE#f_%Ie$2KQF%iB#@!sx94mrz0nY?&fm`x{Iq`7G zmeG4YFr6(9tX4H7rdD0M0W(A8d^=NTN*Qh@)KLf)VfXP%Z$GD+5MdoiZE& z2Us;|Yq^Dh7y7^^gEQ9Ga7uIcH+Y@QAk{=Cd}&ENJ$yL8$#Yp^b=xYC7QYs8h3<|T zPt?Kt0Oy!`ZK{}$W{WHrQPsu}la3NbxEmFDOXC5H$;oSSI`R z0kiVr&_YQ%b|rEm{Df-~uBMuJ=>{3x6<-FG2`h#9((t`CnU%XqrDSLk;nK@4C7B_v z7E|^C2mK5bO4YBdc~@SHoEUT6LO+7`0?4m;JqZq&!p|DsR!GQy&uZKlh#%Ng`41Rw z{ZEF!AJ5k`;=O_Eew4PV0?m2#K^%oW4~`k)&o^Qwir?q66&~^O-$OZOd{yCO)PqvP z^bGsffml1F{87)31oVObhr61><1EGlvB1NW?7w$*VZlahTk)Dq?lS9X9PP^JAB-YW z;1LHvXZ-LIVQDMU;=uoG{AF2?g3Iuk45O8t1Bo%|U4eBZXteT(#6t4uV#W*Fh8~;R zkKzD`e9HdI;Cun_ni->Hia|YE(6k(o1WE^Skg;DyW5bG$QIhrG7%dOcHmVz7b2fl@ zF^I3*BltOgW2lK`0LJr*Y+lj?QFtZ&m%p#kYdu&%gOgfpmKl^al!4?>$n(ZSK@U-B z;>whQpkyXVHtZ>p+WJx$hxj@6nkiJz-%=P4qf!W#u)2Uv!SvoS$06Psr&KOOv2g~m zFHnXBGSleoL8woaS4#D`UWzA3({o;d9n&8jMr+1}2yAdB;LWBv|EW&Bl z*hS`aaPQ&b=~!Lfr^UkpFE(_E6H0>s38&(*QHe1{uzbPjgjOB2!nn^f{X9VwB6hUr zIJABPha`lfhzaQuNJj#7)bKdx8R9>UTZ9Mk=Be>(c_>~*_HKB{=pwsI?!K++oW#Iu zL4n=jjM`bkIf1kFvp5#hxeh?+>u@uQQCg^jO${5U+#kbdH1VxqSp`j8bz3Ge|8|#4&$L}7sL1W3Lb=9=VVK&9+0Dy|ZUG)ra)a==FLb=r zuA)i0y9MkXawFEIBm+EmT&ZWKL*4phmA38zlXpecb|8p3V%WJEL4 zGja|kbs-&C;gX~@^(Aa7u}kY{fN;>$8J!5d9`0hZt>V})UDN|li=F0NOE0k3H030d zBWfvNFXz=L%r9Pw0Mog{oe7Sxt47uDg-VXBq2Y1YsO*H%&IBCOXcKN!a)euA20#OmZQve)nHm^Z2y7Z zU}2e&DInm2tfa+9s7#%{ib6w78h{ext`TkB1udIP0jOSB4FH-=zfQ8uJ8Tu{Eko0 zFMNwS8I8blLeQkDJ7EoA1CZxMmCADCq&1v=W;*V(?Losy@nro$REV>u?hQ-+M^ zcUhUby>Hz7e&I?6ZC#ITLc%)9%Q(R`O*B4u&9Zr6XP4CxuTuv7-BP=N5#j#CB~jh2 zyf6_$W>6_W)8chv3dI{S4P_lFD;!vUv9!Wa+ekUU)3gJ))T9DZ9Qk~?@kZra4vU4& zl35n9_VmV|9fj4$qk-edNO{LAtOJ@@@zRwXH<3Ka_dL8eh}eFYb9DNFB4*BZ_6S}D zH74M}5dZy9^Y(o$zv20WCdtI@A#j5YD;iNC9;4R&^bn{AK2f3h`GNdNfiPo7yMk8+ zn?AJq=?~+ZTYqpDwSW#!4?mT0>n`La*P5PnMhCzsG{NbVIE`3}MXk3aiX3AbTF3?> z!#YvTEV8`aSn5h0_9m40@y%^o==Ug3FYpeFyyexODRPOJ!mB@1AP)+~Lh>i(8-4(K z2a#p`XULsZYJa^%Z@{IZY9Mim+!%vTp0yvX;PHqfe0*~8_KrW^@U|zB*iAXO|BFkT zxbnm=F3{uG&aN=QO+(mlYJk5a+u21_eqOBXg}^SR#G{_a)nGEi0)9Ese2_8$#Ef|` z)1(oQr0*&O>qKNqQGVe+1_C2KfTWPHq3uEm4dy-YF^wZTApw?@1&QDormAbfc%2Mb zBxa;pb@6hc%L8U9jk0OwKY;80?#>t`T^|uhVi#*c@l4c)s~0 z=Y>44a?(Y%ISj<5b`i?kT5zX|`SAf#Io2Z{4P%hBL`f}BE?v~+PI0o^2{|fA(bZ(2 z2;~z7k*r~~iEvAsAgDkG({MFj^I9Y9SPeqlm7t+MhvQ;_BJ7cJuK~qtKy&5;EUHkv zW}xs`&F}*??3+4t`8Q4%xn}-|wgHD>dqXWIQ<$Kkr1qk8nN2T zNAr0%UBN^6H~6-%re}1u5?4`W!R3J__TgYv{Q?^gZ1$L}gC3sp1m5CK)gc|`N)%B& zI8i&|$RDxvb5TuBIS4zFw{Z1G{ON#OsE!Uyhpy?8euuc56=~)-aukoV%#ujS{n1L| zUTA_&Xh1-q4qu*qxf!0h{o6VUm)eB z_*i%VEZ0e|d;1&CbWL*9ASm}CDVneHz_*uuqfy`d=PT?SVtFwgiDMK*@#+9pRh}G9 zj3%AobV{!`Ez253D{sm~KrU=}yIQ|qTQK3%P0$AT4#69hXd;)dX#W*-J;eeE_W)fy?Q^E)26Vv- zfbRu!1?iHxsL@lgUy1}2k3G5U6)0h6mwfOL0nm`qzfr4FV{WV^%YVkl6xCmARiW>J#1&Vb}OwqBy_hs-JfEb&)h#JpQ~Y}E+o_%+ zV@VV0fvFB8L1mWj=km~t0jOJ>2oVA_XM;umN&%+Fy;!5e!Zez+MfO~|9nsBQzU&Hl5l}!F9YjmO@-FiCA9)9}v&AfsDc#Y(N>U6 zErSn&2w^{B0$!vas2&c`F`7U-8p>tUs3xxdPABmb25vXz@#c-}@txK={MBq(ugZ*< z9`&Jy?Lhcfe}slEKgH4!F}7DK-j8AOb+(3UvZG$&_jxhvs&ACcl}xyQ?bfy;1lA@j zJ5Js|9N@n1GhbW=c9_Ft$t1jV%J)UVMdtb6QD>tjJ@$ZkT3DGX?1H-yGePl5i&&C4 z2AiD!!8f`oAHD$Zmw)#ob&3mMRJv0czxFke2C3Z?ifWM}a`>!;IIgeXpS^#7t^`-r zvZ|!cht(Rdekqh?Lz`p#ioXbNq{~en({cSQG)TJ&;N2WpI*zZ`3pa0LskmI#yiY5h z>kd;uiuJG)8$@ax31eEyIL)!SNyk04x%#%11=^c;QC z#JK%+?^7U;loqN&ZW$v+o|pSUe(vnfM}OQQoNDlv&%wHgX;7mN!C6p<{~exx`s+F4 zWz2&48vTxM?JzpX3CYDQpdC>d(b<%bn;M?cJ-YM(dE}=q0zmaru8S(3Z5$z6!ZI|2 zo?sEi!#Iixq~|D72jfa^buD`XUk6H@AY9;y0*2+zZFi^*r3pg4*TC)M_quf8Dy5^g z?gxyTx%2SBPSlo=e|s>MsMSr^}kLHu0kZ#iay%r2C|*qZxvSV zh^oUUfZ_V(;Mdst7JXX&Y0bBWP7I;*uPd=`=br!ig76chpJ{PKYv$jb-3WJUq$Y#T z&3?^riP@cN0|^1F>lDca4<8d;bKz2^!$nYt8wN90naW6W>z$2sx&SJZaleQNPqOGP zQ=HUC*wB}8=_-m*kLK0YK%Oahzu-Hik0WCVYj*%41yA@|Pv07F#0Qd4Pv(Ap^hCuL zshOnMLK<>#B5wR(oZaLR3q(A@*dX){VBkz>UdgMuWgJuo>x7P1zPTj4f5qrEoqxot z2kVU%n$y|j)r(Yfd5_Z_V&YyhFCojpS=>%={bd{)14ApV>?)o_6?$?Qr;xrJ19PMu zd7NvWFQpW5km*GSy+XAJ6VGnjaOmAH9uDNF1TEdT#|S6ZuspA!RXEg^Ae4=}*aBCQ zUTnw4^QEa)B+JVJI^gimso^XVsWK^rU)y)mgyXoB3j01}2?tnHTolJc_0!2qS;ZHV zZ6z*i&`#c}%;m(zbAhc5ZpSzbW-*w}nX8LHxBNP9Rw6d7Ue59>j^|1gYy=35h(sC{ z9hh72WMxBe!5Z=c4b7_s&n)Qc+|qkfcGRpMKc-+tJ@H(y+G2Z>mkG=oyzYbAYvd=g zer>)cuI+kg-Vx7JW`2M_Lymo0X(Zuj#M`8W2$nsMVQgVFwy@z~?v<-hrF69!G?EK7 zRK#Z~wRbd^cYjt{QotW%ZW3|=YgI!{mdXV4;IcBFeXa$^N*Nbh`0%dg2-Yru!pof_ zik^O%;WWLNuj%SJ`$gM8hYI)jO<8BdXrvK!aLu(qg_D+w=Wj1h-kqPFyzi2M#xHkJ z@~p&U*t832XcbSZOBvQ0Nw5&fwJDFMOJ>qd+XMZ|b)l@x-HPhr)G%u43S$!)Gov&< z$udVsa+Ch*+)>QFqBaRo?}0SSN&OXN3zxH1ro37&iZA)OxssFm8GUW7SRByzsXo%c zzJ|?us6zuPX%^9&N=95GN+O78XCC4pj~zTHM8G8hsVq;oSyHi_)zKo88OD6)lyG9o z1s&f&Q(X#t9crn^M=Aja4|Jr;^ik)Kc2Tv6dVv_5W_>IzL@}8-L%vDo=^BqRrYb5o z5$()8=EmZ>kQKy6EkH@%%(j~v3K$8?9@l`u;+w3D8${7BBh68huwe{N1iKQT!qHru zP`rBaL*-1~Jl-yCC`1KkFqW}5*nny5b=+GsN*h1;KKA|ZWXImctFIdte4%H^WX)k? zG82cjnp74}13y4+Wbx)8nu2(0AGdA4eo|`#=;Z(*-paFO`d?#&kNVlhZ!)4Q4g*+f zjxmhI2zg!3m|)HBc>scgoCmuao%Y$!4**yYg6zr%e&6!Lcx-|M#fnAv936g4F^iwD|J%=yIDCj;ex# z4yTGUR)A0a++V_tScG6v$6KV*AAF}SAlxxd0pmAXK*6QKy^bT|;HcFETGi#mTSUgD zYVi{178V3Vp*K{_u>C&6_fb+LSkg2}cqUD@1!70(tutx&9_*rQdz?)`7dl3Ruj14Q z!1NX)l1Ae-XradiD@n|K=rT-!E-6Fi>ry7}T#~c*0W5x(6q_z{JjTto_;gD&o@3<) zcyM}(9;rbf?Km>^gSo0EuO0rzUX)8R2o23-n^edK8 z{!8kF%Md6h1}FUWu&mij0yZO7H?s-Lz-=mnqoFb!q9g(IScwwo-{w=x9A6W2p7yWs zn32nj)rh~}Rj@-6$FdH9Sbwex5;9bYd`Buh2uC<**{%K4Mmt93h3dQ;3Fq?5$}1o+ zW(NM<^v#u8lJ|haFQ>cTLBJXTH|0nu=;+vdc7qg%U7|$^rDtS)c~C+aHKFy;j zDGb9n;-HUq1FB~A2G|d>JG)jy?0Z-*eF(BC6(cGvviQI)yfW)SZzi;TjOqxr$ zs8M+$I21x-HG?p-K}q%8VDPVp13`#%t!pom5<`OxA6boi;&~vT67ee|4{H9Us#gnF zo!5omSy?z25olyv0rD#O^hYa_i3pU@GK0y*<_rcp&UsqGS_WS^A?V;ft64zrm*>Z) zq~OSzw}LpT3YW{Xq@v>3-u=AfiFE~hUXg-=8LwL&{dG6GtvZSAmk920ujPok4MtyRaWM|yI(83B`vzTHmIDbfB}9N7yZm)4 zNOS{?xnc!ivozz3ZfkY{Jt?QSaEd(erh0d~9J42}rJMS8#!2C%u)-BX%kaE_~j1b&NN zp`WlRAaskP%t%a@cXkuP1S1mhA442Y@gSB8_E0QL_w-tUg;}$MnC*K&c%&O z@|a`KU%RJxjA)`WIU2AprB#@wpHv84bA_K4R-7eamuSVw0jp6PwxZFJaVvf4+#;9+ z-fr|d@bj111kbuD6TflTGe#ILxMoC{>^9@4_O$HVRLiSds&**?hUT{xgu<1^kjPJk z&NXc;EHy@5ObLGP3wUzLekwvQ@b39^dEpdJ3QP*z2lOHvE^0?c{9_>&VkQ&uDxU&L|x{W_&FUMNK``<#nJY5gK^d#W49WN%+~txuw6S!|8Mq=NaU&=s8{{9OF!f?-!Q&gU@%F+0Ao- zO5CzHlV+aNoeajgxsxvSKkh-=Nm7XyZzoCOXxmBYy<0npyaQ?{QQ{+7rcBxl+6^Zl zv_tMUpRZ?la91u@5>&!mE%{tjlLIfV6yem*<# zhA^szW+GP6*;MHQ!OpG+an~(Kg98sNyA#+yvCK2@aJ1l4b@vm!La-TQMu#0U@KBN0 z`s}AqFyQdahdjnH7}$ zRM^?&IGvYxsd!b{SM(M}j_KiUgj`^D_C-}IIT?5rG^n@I;_vVlHLzjGblxqQ%tX8Q!$P+6QiXEm~SJsPv)S zHS=<19VicFO4js~$H*ZOx!vZ;8B5;(He=(l0i&j-BdcQ=LG2La-wN`=&MSQ&$bZl3 z=&}wIC3iqLNqvKePgrF{fCL-}8tI!tUW9yk)3htbb39l422Tcsw}Q_EO5iuP(X$z_EZ_B=}s=ez=V!7YJngw+Poq<4ft!pk0#TL^%c)S zFlkQtoI2D%Ks{b_AKgJ6OiX|P-Aq;XmAqzQLvb1GZ~?^Zb_ zDCnCK6qJnwEt*DxRyA=k#1!wtL2tsABy)K!^;IG(6hVosP!KS__|opofuU+u-_W$` zp3xK)&uE}Eugl`fF5?&R7yWtMF9`*$zp+oL#p_vUYVA}CD4WleBwEn)8?zD9NS4M5 z@=I#{@~d$Da+@dj;cvEPpBlJB#LE^Z+qWonvJX&De)*01HLt!AYIZlunr>q(On+Ch zG11@lTChTJsEJ71?zan)?Pw*wwZr(()SGsap@6kMYJ#x&=^-EbNRB`8KJ^H`molo-EE4R9u=X z>fEpWWQ`bM*=Ja$Dh1{Rw@B6Rbfp=kkj<%u1|^H#=dq|gNEevO1yR5eMzPSr0dW0#W7DGEPE@Cp6JrDQa2~J213WIwf?hp^&)>nMd2HO>}7;epXg1*;3wHeG%)diL?cfTOf>T6Ad2aYNL#lZPz z$r+ftHN7*$B`nugC=ggpFp=Glb4cIC`?1nU-=7uhXlTr+!m|qmSFQ&y5aemXXOk)# zK62>M!Xf_qx+uo~}r>dDY!})YG**jfO2qEv+#zY3tnIJ6qTEl0AkKEUpuL znJudYqqTn=EoZWR?k(nYK3XvfABQzK(lTru%X}})aTb5MN0QQvrEVpxniNti(cTmR+RxwEV zFQerG#;4&LgDhe!_U5Nwv4qk`po#l&$y(vb_we3p5Vwkp3WwjJ!r`Bz!ohc_aPa4- zu>Tz@?Eg6`?DbbcPSC~ei9HM#lHg0D&9T3X_v;ldCBDC9G&4RPk5l?B=2p?bMf~4B zZQsUR<>^=YT;?eB#Zo5?JKJ-hqoYW_a?bli?9gI8cn*~CT;-LW? zf1|i1d~a{9`2b);3Km)mm=eBE2)3~p&8HNPRgLQTog$GtEVw21_WR{K#I^3N;be-l z>p6;e%{M#TMg>L;cWNIt*bXJZ(IUEcGVlhN;dubu0fA@c30mOt21kfn=!qL@aAUyW z&PeN9Onw-b2Z#)=e#gDlbzCPe`WGbb1Xo|*BYw|v2JeP#Q%V*H+h_0Og?KSzgo3)z! zTTD8*_UJne?~v-1fmgUy^>FYCd#|Ex@q}hU&sd>lbW*{FRr49}-c9!_FY#%n?z7O7 zvF5yz=C?(w6?!gXx3lmmJ(3%Jo87E$wrupB_7`0QL`RC=1(;N5a0uzmjyz~YdLOlW z8%{r6+(T`Q(t2%-a|zX}pQ%RH(j{RTSK2d$GOZ z8S|EkC)}d=_6;pFg5IOaG?r5Lkb(0m<6_>s>S^G-PipSngRT3P>~~Gbd<4Spt*h_R z(PIf_*{6qcYs(m$6^OY|Y}A+y8#s@^O_&vKQ|KkCTq<6Ca{gSnmnGKjhMXoz7!?xADs5CNvR= z2_m5!nkAOdh#Nwh2<|ZPp)*Pu&BxsYye9IODP57X?4?3Bkle2E6nC2vH>0}?7%F&8 zw3TK#T_bpIn*{F1d6?3MUm!4$^y7>IyKlN7i^D`4Z=qHA(p##(M9QhalUf5%r8rY& z-PuJ;rwaxS9a90k_PID}bOS3F@kMVtiVA`3_?TcSHuAeC;@sS^f$FSOrnCC^dW6u^ z7~We`SxySlcpoQZtId_Vwnhy^Ns1G zL6EFDFVyB4pJ`*jC56>`Ih9}sshn9on)AY93e7Zt7eF@wZpyA^=+Vy`BNbjMx|+6C zi@aCa*#&B>^xK7JYKouLDZ)B0y0vx3wP}{ui)-AnO<|dQX<5umHyP_fNQ>!YGFc^v z&)wBzb$)>>BVK{;)X%w?m87lp9*J6tI)#+DrSF#zvqf9g8ceZ`Yo^{5M^DA+Qvs>2 zis8UHowVainp)0w{5zcKugdkI0!js_7{^*7Scue8s!KSe!PiDkywaQoOx~6qLUxiV zi_FU(&R;#tS_!?&3!Us_QR76jZL)_8)m5+&r0F0sr6AoEz%r6gp1vzgU`+KPqR3@B z?(8b!Efnn#c1QuD`}*Anv2gXfi+&5&*>20>BrJkncIvxS^@3%VjrhP4L5ijzho| zPXZ%0vY8cnBCbXpwE5&C;)ZykelOe@EuvVhJcd}vQp7^MJxgZSYcfg}c;ERpn_`k- zXuy{g*_#LY1b12kCp8aJ&B6haZbsv4oIgHH7;s1U>l-I2W+{+n1s~vebKZA6E17q? zLuCYF9+QndoMBtuW3a{YF|lJ$Do5c_P_m83HxZDihq>pm;$D86;u&nezpxtH zYN%ALWRe-o!o)FfczG4fOvV}vX4S>R2FW=Z^Q zJzbluV5`6ORE?gJB4_d#pqIY0n_~SPgf_f#znl6A4#k)Xu*Q-GQtqPrQj7U=D>XN* z(dKT4$*x&#;A}ft0m;H~eVajJV@Nwu**=5?ePL7S*C)7%hy8nK=r^NpzL(SZ>9VLJ zNnsE=a}yr!`g_`_97a12#BN;-rbg!5wcM{a<}?XE8LevreM8=<;D%4lFyhT7T~@k{ zN5R8EB4ng3KjX)FSSKFt@L@ND+D{X}b$PmzrJBh|S5(YlI`wiiQLPIOoQw%jRMU}{ zwDhSJmGswE3dQG9ooafbsApOT9$!+-01 zu2q(ZH{=a7Gv43aK-7JwGEKGhN@YscdZRKW({UbdryPyjv<#;Zt~JAf9RArkR0aWU z#SPp)stey@cXr*>%6(E;Z*D$9yPnQ*Nx;2m(Vsk=RXpzD_~6q}%L=1@!isl}sOA0B zlY<%OHE~oAuTiYp7P8{khREF4h3TKZ(BETNNch;Z@B-8I7I|)w0vFx5DCnOV z9o!MEB`h}j^Zr8yc31HC;J+QsmjCB}8@pfsq~QxaU2f~U=et{>7J8IFqGJt?;CI4R z92@Lkr+0YOV2hj56o8WtI5`jRZZ4{MpSg=XO8pkTBJf1*si>xNG@oym)LS0*ZO4L1 zN^*k>0&-Hw%@yMOu!MT*s{CR~=YF#%7u;}gkoRgi{T)kOOwm2r#$b{=1BjU?b5+kP zQmlw3uh?8Sx7spu&uda-rePiH#M$KxSM>23>*eKq`W$gMwE(v1ySXYoi*0AO(Db+1 zTQFI8%;bgN*O#+{y_YvWX?xwa(B*987BN7N<})<%Ez?v7QoQqq5hwLX zJJ?s3uf%^1Kv)*bE^NSAFFf5&HDoqP!X%%k)Fc(xKW=Uw;c#L?n+g7)wcu%O+4H2} z6CAefE!q%e_*2~krGmIMHsqXY%_ojg;4tDY*CWkLgh4Vk8axYQ2ClGg8qJxB-Y@(` z=6X4P5WiG`pADpbdT72B|MbvOFe6wVJrK2W1kPEBcqZ=xzNwNd)4FUQy6Jk7Fsk^^ zR2Vx1xXADpm-NJ_1ZoQ-G-mmZ8cPWptt%7IsMSUiS%b+0qRFJqG;3~%=ZB}HvCV01 zVky3$PfC!bpUbb&n|R1>%PbW@3WLU(j_PJ$xzMZ#l0K8^L+R|^aVU$LNLO)oRvn)F z#{_M84tv1MZ)5OJ^;((pVD6^j3s~5G|FD4y$0pU1(G5JEoTD7Cz74|5B~1)h;0-9w zY@0xhEbnP~NQrnzc!iP)xRtO+atU-iLI}}$5c9POid63K#D^JJ5c{mhEl2TTE2~GPHxQ%SZVIigZA0*_;em*vTg@Z!+n zUGF^~-iR!XFb@auUFglE*+_$@qZ!7ptvC(Rjw6;U?E;Y@EsAtBDO6lS0Kz@nF|lmUp+S$}I!*H@5lL5^rAOMve{8w;&7Romxx7Wv%<(*`=t54Ot#8 z7ZftuB#B4$`T`NS2mkT@Ob)J{U=RLQEfer~c6*I2IF?e!&yQWyMVw-B`5+oUas*Hj z1lU^<3Zs9DMGL+d2js)SbFSNrs$NP?cT8zQTziRF`fI>NoGy$QpMUxdUi!R64`2Qk zA_V`;2%Oe=dT_%z`RIitIfD(fJ!b*AA!mlJkTa{3p={IX{47%xnOWiNfX`gau>wn~ z$Kg=vu;QUTOh-2v1#0;9@mtQucw8Bq_QeFJlu|{Z#CeQ`?Kqmlb9qf2TgEgM7d{#O zETOtwrmn^}FRC>oH>Vtc(~g@0@gm0f2CvFek76ScG;0(m*DcIL1mn!aiVFclA<5ew z84@B-7GpTow&u1C=PvC5UCf2NrtL7U>m4H`(+W2exxjb(LC;&DV0V1^yC(>ZM9Sc1 zooCXO-THQdWoFuQQdXrXiyiZUjp_23O{h$PMlkyV<%O_2&$QUGvab7-3cw6`eRCNflL6d9aN zd0N9;Y=(P`rZp)11m0&&sGMvyXitknxM&Egfg-~#vT(A%Y`%iq1D=IhFbwb(nZN>R>wLVA3)ohjAa@g4 zR{rpd>{OgNeH*9j)|8KNEoc_ea=^Snx$afF1n=72jQ`^myStV*y?9?ISKttJzd~=m$32bUJAU}Av z-P~}Q>)yivXv19EZy2x~J%)jVd~=m${d!ZI z0r`{ty^w=ms{zZfxiqsB`V9j%i5|lM$hRE^Yzlpc0n4*-7yxmx zQ|;eU$<1wwWE+P8irO>`fM%Ov0Ob9L0jA$?7!a|W8!mI*dl&$1=tTX70n5>27)Z!B zS6SBU+8e?ETk2D+d*qGumL-YXGYAPiR8}rJC*quxS91-9uF`H0w+Jn6U$n|wI0jtM zJ?}!ER`a_>b;G+$<(w1~ZSM<`qFiiyzc^km;fr1to94NH>2!^S1)2ZRD|r#xkF+D_ zXmP$7@c_gcZnNz}s%Uo&B9I8AO1ufSJg)Y8*ET}wrca)3?52)Hy6MJtWr^DozJ=w7UYO_CxZ=@8 zw6QOtb3A$4r*n|5Yb7#RqeVSE>|9DnVjazuX>?VLcLOQzRz*1Oshv$HYdpEvQn&08 zp@chBN$6&{zH`aM+jh#*dxF@_9W9XdYp{tj{d!SIp?`bZIF1FGBRuQ9nEF*iuc8(; zI>)mhUG!)rWgC&noIXb7hL98&={F4s7ge>o{^eyhL!oZ)n$ z!`#76A1S5Pwvq0v)IO_#NZxxD5Lx;S zs?@$~vhny{s{rf-Hg!`^(z}}`44WEaLfp~}LpKF+-);)h_HHVP_U)!N(T>K-9bV6F zD#`cirjc?}H;t4VyJ;j9pbn9-)?H8_UWdPymvQ^EIqp^ z7&^PD!*A@SY*^2|Yi;YoA*z?=sGE^v#b()YgxX5B+pUBQZcqi}n^ggkvm9)viY!|Y zI}x5|=hgGsRm(`@*W#c!uavxtvZuhF(%x2I;F%NriSmsu7la6zxQPU9u1n<(;|&wo zv^FM9cfXAkN3z=PQU*)O4f=qB84{uEixcO2C*R;qzCjnhTNc<9Bh3e+nQF(QctSUC z{{mn1Pbk%pkm(?3+!6vM?{7%Fa=AH9Zy^rXjWQ~ewRE8A{>is8A_I|=tIi2$Y zSePf5~`MV zMt8Hdo&|KXmFN0yp0bIfn@3g(TUM^z8q2#^A(@*|{oB(+>xmiqK!Mt{*Q1LX&!83h zL^s<>E#YM06u4!EGz#sOOf5rTw~A~;(Mz+dIBwSSC%9aaP4?Z=Pphx{`%m@{wq)ZH z<&04vw&Y7kh}WsJTvy&MY2xgY*yS|ss?+i0nj2CWgJ)wnDrN3Q9u2=xSUweh{NgV@ zr2;xg>O<2q_Fjm)Ce;e*zC@}I@sx&BbEEKtU{=c|byxLH>2ET$%Mk!JVH(t>gF-4p z%ixDuC627G*3l!oB$O7Lkby*@o!un$+dy?*wPi73pyZaKNa(0llJG3?^b)0&p~HyP z-9t*Jtlb>uD9x1`o!_J)Vwgu4yY}Irk%gVzF7l3&>0;|s16}-GRo%sBTUFZlBG+y{ zWDzwT55oTN(}q&&BcNBg^%1mPN%oQWXO&U0kH=!Zss{Bno=+cyrniBiRd>I$yLY`9 z0pC|IM$n&BFGk{b)r*mH-(vRLj(Zog5%7J*Yy|yD#cU*gS1}tou9)R^JD!lz>ki>- zG?{$-1?RC>Q@vJCih6y~fK6s!e)%PmEardsj}_k!kmpS3OzbZ7Qw*bIGk_y*Va0$H z2Em<8(8CkMPbG(Og_FY&pzUmW(*VDieQCfDX)nU$npynxslw$mq=2_)26YZ#@a0J2 z*p6>*8?X;pt@+>^%qzkr+0U4utCm_8AaZ>|Z@V-kLKoT*Fj2#odf7nhwjFIT-X)wwd7wIH#}zYxqEzO1y{bkLA}=7Ik#bLK z3d{+uQE!o!U&Gmzflywqk1N%@Y6wPujnW8MK))1%?wbM-hBpPEZqfN{f4&&ivvJbV zDElV5dxv8AZL}P%ki;nIz5xp3Lrg0`BMAB*Wu*yiB0jJ%)OASocD;IMD?!wyDJxI} zz68ol)Rqi^wi7`@aBb4B8DAktRkTTl02rN83cQ_-t1Sr=Xx>#>KH-y<(BQ_+yLTyQ zR&(Q-!h|e3-oN}}3x@i@*fT>+k}D3sVj@UVxheD@a*0?x`8%n;`YwIXrdK`EQGk-rPSAt*vs_-xR!Qv&WztO$MjZta6TY<{B%k>nI6$b%tiTWzfY(o` zjTul}#%!aAQz2)@kLDZED`yDhfrFD~d4Tp!I@h`c;F~Zr zP3USl#o)W7V^1S#MA2F=Yno<~dWPtL88W(iz@p22{1`t`C-#$Aqdl?q^LqaAgWRE8haW+1=L`U>4e+^a+#d%6}@j>XpBAkwN4Foy>XJ}j#!xQ&SK8I$2fRqo-qbOC}CC0K7tk zgz^Z`om{ykbrt6=LdLG}HdkBI-pI>w;$GbCea+^v)imJ`w6SOI*ChH#+M<#47q_w5 z^bxhGX8Xwa^GdvREbeM9J(yZ^VT>%_S=&a^pHbTlardunBkJC@ZDf3BZ5v77Q*p*@ z^PLrEB>fo`*ARFAiZi0_U2#UncUGK{^j#I_JZZjveDyv#ko2ciTvSZOeMiMbQTMO7 zDC2u8E=p>xIQpW<+Uen-tg#{JQpb?>No!-h8F`(RV(1#f0Tv<}ISbnh?D3N*HaTu* z_nqv(vW-#;8O%kmry)d9PPBko!>uKAR7{3(Z!Tf_gjFJ0nB^SK63{I#SRA^^4F zJ2q&ik3_bJ3Z@L2-Zls-`-r&O7_VZGr##aPPnbC)I4)O!FC{+D=B&VkLt9jfFdS{5 z*4wZg-Kx4>jHBe*^*NmV@|`01n-Mq@b{o?Wg^!geyJ8n52Msir+C=`nbh(pU&`5iTL9yg|$jA2xwyRNS&$ zX>MRaiEW~QrM0Ebd`H|!F^YTXmdu%PvxOoWiRI1}oL^eY-02lLFd4Pw0jdE@LsEAp zJ47^+!%Oz;{&>f!hnDDt8u zJ1@8H5!3fn+ zJ2+j!*ea0(H5{KixoDFUCNn1~rGx#pUf*Of30;;jsAakXg6w}bcDYC@h-h7l2rSn# zF)@>NXmK17*@zd_p!j8pH|5)fuR}bp1}6+c2&35`00jBSBwjG&W(jum_C<^{lsFJt^k^}GW$p?= zAk(xYZ^J2`21fMH_m>%Vwm_)eSqJAU`d?>ETA052N=Q7;^{kk4VSR_OWjPzS6P!QY zYe$|OJ!wZiuc|qovBc{(V>#4CXOJ8WPHM~*eCd%71zR+VPM$?dOKny=C9~XNQSf4V zIf7yJBO{e(Se&5!1#j$iQ1BsMDe*7>OF#6n=~5*E4Wr1O%CSP0pcJQMP|$e&4QFYo z5S+JuSm3N`S&!!DcelC97nnI-a+JZ`LCbE+Y_UpJAgH_f1G*@nmLAIaWrWj-Hdhe){#(8vXv+zXgvr2l$i~8^UgnuCDNSg_gX& zVl+(#`v!?iJ*7fwPY<1xLj5J^q5!(p6o==LMD^_$Sd@V0E5$Jt4gwBQ9G2!XRuxey zxQN1TRr`K>mK!9+Y*#a1_JvY2$Rab#EDYequ?WwM@R?CeDR{^Pj$PBFYRT_snv(3O80-UCKPWtf={#EVC@9=6^!8c1BhQ}e-pFJg?A}P5KH1%qd?T6cclI}uB@cIRr1npDZzS}OcW)$2p6_m_ z_KOlu(XczkNyYg@hgD01AWSi>BG3u24tnsP502+Br|_|_pC6!4=#P_{A=43feDVOn zGUh)&5Od)JC-vtCylRnv@J?8}G9f8hMSmU5=MUKA`5c)*rr%afHhg0f^+4X5ffvzO zYyzF)sbNRzklca&^;0)K=$>R31tMqOSXonZs+W!cJG=Q96fU*ogl0K~6`#!g4Pgll zCcy^5Fx}#nmyUc?Gwkx(NSKsgoptIHiAoBg+^|K}?8sZovZu}So>7$q*_B$WJ}FU2 zOkAyo=Vvt?)@!{ipXm4W8h z{ZDD-$`?!m@Qa*O%STt$9E+YowY+-t?U6Gq=^r*YwPN%m-PwJ<#`9x*`yE!$qv5-~ zo@u0vw1qv}o)ZSa-c0C}=mYvr0`=rRbP7+ZzWL1gPn?y-kLj}89QZ>WV8alcVwlyf z6NRgz6t3F`^wU|4LCmUGwI7>2EFnb|QspRgZ=I1k>{R{IrV)*<->?DnV`wVN^4%)E z4-1}O+%rY9xw?&trnyC7J1Md3{I!h-^hhk=GMv&f1BOjBjwmv*=VeQ?;W7F&H+cZ zd-r>4|NLG-d70%H0RCDXn$R)VT`CH4uisgGVa|wrpYkl;!Z}N83+G>7`U6ws2)7&i_ zaS6R1C9X9J=?t6z4jaM1M=$WFbt(a_4;UE|ACe$CLD;rA4q;H| z8&zp;GO?wUZ`hTOho@)nUZ=c&xChLVtbD{N(xuL@30zJ^VyUG#b4;zdrHfaZ7^8?~ zkVe&9;|%}2LJ_5eHR|fk^lCH?p>;G7oWDTT5{99X!~*GO>Qr4MTq-CAQB(LJYco{7 z$PwTT4irFbtaZ~gmXw&5 z^t+Sc`OD*0QcQS>>z?ydX^EPJk>UpaeU7Nmr*Ni6&#Bhrv<+yJfmhQ8I<}z=`l~=T zo$5v+bZrp1v-=13&|F%i%{7EFNxUeh~1xf^w zy~W+LsYn-LF7B1DGXJV;?{o|Z7R zNm~yss7HvnM)~)M5ZB;gXivt7=9^AYE;g6A zI@zmZdgXBlAeIyX#IA)D_;m*od?l2Q+9IG1%DxVOnR;{Cgsz4&yjO|2O{ zcOwf1@x|!!O;!E2hTjYvSf4O{6x}IL7OU={nhn-x+py|%ZxZgiPH3nr3!V+Nmgf?x z_G2rk*}r&{*)M4}*F~dkrQ7t@ZlT96c(JKRzX)kaZKnxvgPH6a1(3e}BcKZjrVu6> zLpE@zf?#;2p2-f@cihMp)~W(RIOv7A{lm=bhCzYv?9y(?(_z`!)_05XBfL{}gIFay zyR<|eVEIe$7QE>3@VPoqFUyH}1b!4}i62rA1)Kb*#LZEaFILV3YuvM{zK zvxC=>ld-!xJoA* zLw?_kZUq)@^E@IHE+V`~c>34l;og_M@XQcVvKNG&KFfq9irZT*M8dnjO;&~);>9r> z%%S?caKsG4O8{u=i+VLed<=MK#@mkt%Qb$)KuQjwoEE{h z2@WoLhocxYh1#LchC|m79}akRi$0x}S@a(cEhuGz=RKpQ@NR}t#_8W+Y-!p~7t>_5 z6IhXjBaJ3o-qO>4;F_A1ni9a@BzcRE3EW&=?)}I6Gs`qvjE~_|2s5jN;y{CK+=5c+ zIL>p%UQ6Serw4`6Cm3ekjn0PybKjPVImY)#FT?A6r2_dQv=ZFcqSc#IoKMYwV&`|j zcr9(Ki+MOPbq%2*C*1jHT+E|h<9IQzA;aL3`)A~fdgj*)iN!)X(+3c9PSQ})4qXjo z>4ILWLw-Ro#isY~Qk)E`O#(og>gol(e4=*h>TS#DTX{RZ8DKr~2G8lGK*XY}zD$R= z*r?W6Ltv3q|8T+G5(nEARt10>hj+?B7vi|1R2VRZYXmC_k;lG0dHmC(+uvs2l13Jx z&50)B&R)FpH@SSoN;x9L9$jw;x>gvoa6SFz98J$F=K&KqB93RTB_7`@q6RzzxtU_I zjDSyEI~a|c#3UW)wFA(FX*^1Ux8lj-Xa(Q73mos9!}S?OEDmi^8@c(IJ0zvEeiSGv zo>!Z-a%JIqVHDu==kRjTo@={DU-k!xF-afhA#O*ErvrD=oluluJG-3r5cCP77W!pE zj|Hri8HjN05BK%7fw57E?3;-WMhQg3gi96jNgnb+lZL?gA!^nxl&u1_YKi z>k*EidiBx?UAjxk$Mj!Z-}*W&09F8WOCC`_$>D$q*IhYE>RDj9H zYf^%`L?3(bpYX3v2)(9|MV^Q>Nn$N~f+u1zcdXu_>wQ<6M(ob+_hkgZ;Wa))x-*eY z+0?lB*WN!rWZWpRK!zUtzjQs<6Uz*BkG%d|6oyew0){-W%6e5xsiUr!clSvCQ#t+L zrgsnG$#6)}x0N!}7hb}QY{KQ55ghgDhhM>M!sZCe4cer77yk^t@5razjW8mEex^FU zzq!1r;JLO`rOPR>HQb}j(Gr=9Ker^PZCiJgLi_L47fs>Xt$w+jzqjMJmd(!Yef!Nr zL^7vU?z<}S|Bfay^W1MVkxE@*68ay5>F=1Gn8>lC9+ zq`wS1!1>`VC}2jYesVuWd(5wUPe1h)E<@8MosI1OD!HYMhkEIlVcJ$Bp{CjjBgpKW z$FqqfmT{>ZzEfnW2<|)VbSwI2ru6BD#dP%u|7L1xGoSEMsi!zQTN)Uwx(c(AOriuq zpPYUb&z3b5t@E5m{ATO)y#xmV5RU11DHo)O=mMI*erT7KAS&fU8L zYBJ5JQ;SnX?(8yU6J^+0k|Krr%m)L8QNv+QYO(Segk*c~qE;GpT2|lptj;(Y1OXw@uhajJz4z;G<3{#H^HK6B zYwbf@cI+f~Kgp6DYa&}3QBLNZtgKlrvMDj5*c>)#S##F@T>E{0viqwl{0F)Tw49my zaQE67Q;n)Zp#T&Lg+iga8*RVcF57BWkJNh0djsU1S|=@H95;G~yCG@?ku%5!a;1!t zU4~;_z4-p%#q`I6moMKOOzJn2AF4N#9}nv4&5yHJFMgQ4n*R9e$Jam3>KBuPdh+7c zcazuC`n&JHt6zTq=H;s&ud(0iF?*91^}kdO_9XBa2iiyxW_r{yk^Zec#cOm2Td@iA zFBM*WzuGtn=RAr1`@2^8SyCO^=^OeNitk@A^ZJ|y|Nj1Q_TI_ijZQit2Zir3_*eE& zYUuobVM%c$H_&VGFO*{M0uXFK{-tcunW6-N^s4@UCyUCtV|JU?GVnJ#+9Ce|2Ljd; zI8d67ubr(L?L3J0pO&2*L*;imo@x*|s*LQf!>l@VP&6lW8uHa8@O3z~N{-w=C+!5U zn_5Y$)=t8ozV>iK#Q^u@PJ6S@+8wmzq5+6MGlwu0>cgLZbsz+9o6z0H6Qr^Npv0|rrUGC3R?Y!H4 za;u%nbDRBjE55}!_9)d1JGh>@Qd&wWIhtYm)M^H41T()Pkk^UVSVM()T1((XekiA_qqm;z zvZN+~F0Jc=bUs8e-XQU1Zlm`0wJ7A@d^}wpo+sb{pZ6@%a(oU^JDh&5kZwC4TXQ|3 zn8|!J&2)>@FNo}8#>=t)y2a3=MgNj&cgrQ;)8zaDt5&)Me36t^Y{Nk!q#10p%*fhT4Bwut?%pHac#O=v8#HDd>Y5-86EeZU^+VIYJh-T{Pj5;O8uGO1?($#SWT2wCg=L z!bwxW_@mq}m=O|!O;ZE^AuL5swkc4=aZemlaD_UVCLA4F!aw+lGfhc((Y!xjntHhO zmH#KlKrk0v`kG4-(IB5*@Sl`w{_W%CyQ4SX<8><{?tOWnOHJ#EdlXL`^Uc4-97ZZ* ztS9u5fzZ=%O)bfpk2n5nm-Mhv>sGRD>#L&+r&h%Cw41|Y=gYFWtQQDg z=1&~B;m0kAsPL8pvQ=NL=lALY4@u>wIj*m_Hy`l~(8n?Ny7$HD>*=PMt6>3IO;*^( zZs@H?bSQtulZzjl>tkC8Zt_PkTrnhUy%M0Kv{;fHE*9DHkQaPiQrWjf-T z3HE;rboR5+T7J=VJi~)?OhlF9py7)%qxGM-IOoxV1PSUHX5Fv2V=}4M9F2of`sui< zSofN!8+=wFVF^BT6dufbI-^xV>)r?~D5SxUSb7}DPz>P|20?YEDu z2AP5ZY$~zP)Ot4Sq8UC?5FCyND^?|-+<~cCO5;S(}Nw9 zOqCsgW89ckdJIblJWXkOW1d;6ObbYo^HhjQJG$sY^JGt>uf}$T)D{*1{)>?-H8e-F z`C1Loy?q}#U7^6xAYU*w&5c7Fu>?vhcjY@Z<#AN{j`)i(BC)si+rdP)hN9bb87T z6Vf>FOI~0yAU^}W3j!6$5tQ^9D^^|I`=4FaQ-7JjHpGiZM271UF7mrVdwmXC~kxqr}-R&!_@B!>LhnyAvoxKS(_1x3(ZSBTqBA_ zjGS|}5pwH?2go6&*BVWcw^0AToyF7cYuZ^7r6zqF${aoXX*Gozsg{>S`QhXrTimZ1 z*Y{O7kPvaVd+GYt2m(c(DMPIKjO)nSs`JLz5{_hAV7ShkM(qC63*3Rmgk>46U@N}I zmOzI`k9c;T>Xnj)x|n7bo45AX&Y!Q44}!9KsD@b-vPPk)$V8Uf+-Z@b$4js_Pb{5I zP;H>(fSUch$TSN@TO%33+6u}64SN_0fl~9x6qc^4VPOw!X9bG_BG6gLw9=&$?EK+nw!RhYwHMID z)TCdl`6j`JLg8VjJ5Vv=7U^LS6h%g>Dz7G!8ks`y7f#?G-W~h$VFgWPMz~~Ba%L9q zD|U@o;l$8g(RtDt#pvU)JDHj=W~MYIWP~8M!*O$uoDODXSTwLf*fug(FtEE)IN=D9 z?JexK&3r;cnPY?ye8Nkb>m#Td{t!ZiRA4RQA~vqV6W@Bm&sU${kZ$4BVb4ZeS5GF( zLaKOo)+a$aO^GxpLCk?%O_3Xp#0q;_7#dwcH1nL(1mjQbF zcxtKvP18q5r^lDZWd`rhX&cRA2p@PkwCHdmrRZ>8St5j5C=ws@=d&f<|S6H@K z>G&@s#&G^ZndF$FfrUSi!C`Vs48N=H=L^{^;`3Fb{7t79RDnwmh_p|~8<^J^P0Oia zU~m8Q;$w~6!cbbAON6U8Us2@j?-i)SSv$X9Ef6)>-ocAS*@cKh9_4Cy^D0ClHFSyZ zaI>#B?hfVo>V)F`oiD@`xP(_wDJ}Yg$)fu%s|WLEi)Ycf(;Kt==?Z36U_?%M(eR4J zV3(|Dpbn|N3(DDc&RgSvB|d2378eR1ag&Ik$T7#Ldb6ry4t&=vRd3RSFn^5o+HTej z?~7BhyDsxUM_pbeeE=SvIeCk4yi=_ZiwDyJ8v~pktea~)WxD{viLV(Mqg#~ciMCPn zCrRfNJc_9he&ri$${k5fM{p_&U-XyyLYLG&dZU!&#y8>Gqs^CR_EMZ@%nJ<}0Zf#9 z)Ss5P#R2P162Rbv^qTE@?Raub0_5r8oA7)d!T8wQp)u_V=^uy7(~HX*4`;+SmCJxK zY4plv>q!9VHLL^3b<$W6Vb%;EcNCCEiut8QrcA3 z+{$!&7##BqPF&1dcHoaD);i?k7|-xeOYesZI9{sH2(#qeuEcNTx?&iqYr9%u1j&8U zRp>(!*Nt`QSUi2=a0%fkt|qL4Tq8ujxYm|@xkTcojkz-n_T+PHGnwyHO<)w6ve;t6 zTkjL>AS7T*1*DQ3{O_lF1wSW$8%1_~T9W0bnq$6lVfc|8!*IbzpW%FO))mruP~>XP=f^;F0s>*0beRo`Kw9iD!*63ZB^4g-1 zk1aMYTn&y&Wz{raI5H8r?r0;#AT1e2hw3c~(nK@lTEYttoNqxO*raZ8twT=G-Zcx+ z;4g+&bUXiMI3Q0-Ij5 zn$4Dd*F+v+W$FhG}+P0 zz%zSdV_ujqlg)bJHv_Vuz5RlZQ(*AJy{{VRmC*RPS*tSaswKg~kR&CdxbrYzm ziDI)^3(J45>lL!meU=eMuYJRQ71|hWliFw@8hqH7Hi}hqUg@{ZeD*dn_)1G=yputy zIbB5kX)1HRyUNV@%;pD|`LbhYk^K%8u4=G+Yf*KuV~f=&mF<@PoT77RJtxefhV^|? zV8j+MpGjI+=2PE8Gm1tZ?I*4p(6tC;3_Kfo`#zM*SB+w!rB`UGr$qliYS8p}uurtL zx&;lLUiKHU!OSeQtL=K;Y}=EM=U0cn9G;#j#!>_s%bnHrVn*DP=M2*Z$_2Gr@jAXN zHj{11LZ4zb34tazw?HF3t`;9H@T-Pu3cC%T>?&e=6Q3y*)2v^Fn$R8gv#zD1yL8Re zulVf4o3(1FkUIntPew*RPe&lWduIA@+yQPATvS)2K}f1#wa4Md@-!%Qqdtx zCXZ?lWIjzTfZer!r$n_IQeroaWTa2U;L2;6U}!_E7iS(GWXy27N$V#~D#vf#D$fjg zOc4^qZE?Tx2iG&mAA;d%@8dxT@NcLHGZSP>UzMZ72W6T0pUeV9gBr`2M}(M{Ev@(2 zb2<7LdUNZ4y`Y1j1R-}Ct8P8LpbKc`WPse(OAjqu;+SZN5y(~|}OiC{jY z;fRn2miKY2$-?;LpyU_1xunh@RM`4@~!+b{5u6-v)^QxM&=%_G5oBwOp#v2baA!gV1D z)j!iTUyknWpkg4Bw>_ce#V<%I`mbGr^5D%JTH8BI72(%|25OT z>h6dM3$s>Hm{>5)Ns}$LdtH4_PG#Ok11zY+7KCYfCA8@T0o)q=pa13S@Y>Bex-C`Q!d_TR1>I2F;ua{S zDl;E&`&p$aruJ-??q2~Y?3fm(RLfa|k!W^I%nIFM!(9LgIO8w812eVoU+T`rr^{3G zoln2aUo8_w=W(Re(bbtgiDHTjs{`rfG9aM9Pz>q?#) zp+oyLMbj-&lNBck(evS+8!fAeQA^_lUNYKQ4B-Q2dZgM`vxMB~!?dHhz~bbuj!muD z2nV-@h^T@kZ>BQ784v3Drzu|Z;-CCS8wCciyNL4+6v5eakN@N3!;?{3Fi4aG7XPAD@h+Q7*q&g#5y1 zqYf@2xFjzTRDz?ueOD%W7%8FLPhabM*3K6QVSa-L2 z>X|>Pz$vhA{80fUn`XrALZ8J*wtlfJ*bY;+an1vLJ`P{_qEd-EL;}5QL<>O4;@RA@ z`eM7G{1afjuh_n8NVKmPI3)OnV#e^6^`fR9+$F)MKM>m=eB$@Zv`mmN;6U(HgUko- zNymd-J;-QQ5FK5}P)=9bCWR%o69dZL(Bd+uhXYu*i-V%5kArfrlY=s+mxB`1&8{%5 zRIo%NYD8Y4?IA)?VX<_#OP0SJemD*!C7*x!+e@q6T`cvyqxwY8`+2?3ANKZ->NReI zGz*+iBk27C;evSJkFN;hhf%K)@C0ajU`2)SQ4`tD@=D72rh?0!%Z;L;&P+O?aIIj; zm9?~Uy0EX~#!N+^#k2)sWS++6I?hjz17pBv7Ul6f6fOwP=Kw?OAD@`#V-0C#=kSw> zc8fNA-&d6POrp0$d zqOXUiF(jGs@z-C-DxV{lenf*WK=Ku^sK~r`t+DFK^mg<&emq=%VzDucSkgXGQb9}5 zy!pwmY2slHY4zyPAE=D|wrb~iyBD()ua96JSSl`C2=+Qbu-EwTV_d&6!@$X(CWlKylkrFdWnCmFA4nGo zFi%2@xN~*(0`ZbAOKUi^aH@dpB**+BT(f>W!3zg;#oGl#uqQ5J0c8Amk8{D$)S)|z z-!v^d(YV;f<*q(CiiOT%b-G#YmJ((^L((>n_KaQS(o8kSkopGUoLys9>k z<}k{kt2(C_vO!c(eIy+uMSA(e%YzTNsBmpJYuxH7-}J*U(*xF4Am)9 z6EWcluhp&fn)6}a%8;SkK_0y9vNV!cWGb-|p0}6d!wcN1ke(PJ=>B$eXl`h!{?W^E zVp4uuB5@0%LZ{^7hB>t`YFs&%-7XGV?kR&{kI)PH(rZ>P=&O9t?>tZzFUMAB9d5jY zZjh1UOSb;Nq|-3Swa7)hvEDkbZi9pJic^bx8;ImJC*{Gz{| zUlM7#)1m|;5N?fKeMgY0;#3aR_OX3FS#7n0xDR9{J2^Q#N~ei(spY^?z7aZ5NTxe7 z#9EwQ_d|dL`l63{v~fP|h4_Lc`uelggMHL+8HjS+m^tvfKP#_4xQY>4N<*( zL0LjREh}WgB8LOH1ExK_7b3rh-Gl#s`6AiU5ZaDDZ;179X*}L=6jbd9*Y3$gJjd2! zfw0?rL|nkjKr%A1jN;W*GZ%Prr^jJ;OJf2*$xYBc?hPZzF}H@n$%*5#5a1{M8w{cz z$r##Xvg7~z`_6R0s#!c9ym~>0H6IR-kfA{KCp{IVP+8xKULAr-nz{%N4r+{?f2MQP zsZNXeY;i$-LI*C!|91^K>qp%7+iVu~2_A;6mLq#EQ^b-=Leqnzd&r2Kd@+6Pju2>B zDX9Qq%}O2UIuT&fU}fcn?x~b$=G|gr`ec@nFKY2*BIk5Px1>optlV-M+TKwV3J~)o z{PYYr%L*HSWV*P$*{qfCzJ%>m{d_&SgvbL0_feGW1r!VA`RPH9=aEtsJLh{Ss1aAI z4n2EnjPO!zCYhJ0T+E%}>!DpZU_$U!KREDvS`f=@$JC7xNIBs2tysya&e@?-vqVh8 zN{g5j2yLPdk5B0eB-C$T`y=xD!-ZOIif3y`V3*Fgy_?QP*t1hw(>_ia4m$>bs~G8? zZdF8A^cs7(%G|E*YVTClbg3!vw*V8i*vX#%>F7f@IYu&$0iP)DC~1Q`$&R$^=i_$> zZY75<(z7UuWP@{C!}SuUk7}_L1*V?<=^#42{rThrwiQw}5`LZFc4LkioE~1Hd{x(6ut*0{0#Q> z7hET%SFMuG-U9F7 zj8`;qUgCj=U0~?Xd@!x;b`hnzU%$z!I~%N^?pHr#wL2fIpzhZPFLT;P;<(8suA(S+HURt7(_XunxxiZ>kLNfb z$*;beLXlrch-W_9PLnZ|N&oJ`hu&fG_`tZY4t=_-y?6CwQr*2fc=O_gb<*rY;t><6 z>iflAegFNNAILES*8`o0xM%-HXBs$w0}ivJn-m#kh>o&PY5#^9@_VSW4Ml{VAjW;c zZ>Rm5=f^3!$$!f>coxCekK)D47&o-kZDh@9>J+yiij?K?NT8-@-l z5%Y@F_87YK<9>w`&ep_m#a#fPEcOL%=V-#JF}}q+^*L$`qhtuIR;Ha}09Govbt94E zX49}jQ1zcNtU$KEgOCV}dxgxzCG}NL_XNA>&Nl0wF09#{o5d397)m`DQ#0NQxj1;y zkAU8cMsyEKTTzl++J+syHKBoV1DBf(vQl-|taZe0AW;)LDD{#7FWu<#CA?60`{(Ma z8-|%h6}^K`1VeOo>32PiVczeA)zi2TcK0+!2htWudjHRuseF7do!7Gxkg6a)WUfAm zkIh1EljwfbfBU;;`WkP0y{|@N(APseASJH__~-UiMvqHvf{+dST~5B0QlZZnXb9bT zkF6_Ai97gERrH6;Fhw=g(+~2B^*6lvgU9ggb~d9MDXpjukctG)Z+o z%&B})-&AgxM)G!}Nr|o$T^^a$zL;oWV zQ^xNPy-`fuIoAkiytrf(2AP&2SZekVd9pz~(PP!c!?5hpI6OH-*n~YO=!Y}M0R3Rd zW=-M9;xlpl9nup~?XD}M1B88uUZvRV>~4S$l;+-t>1W-CjrsP=L#8VnprHR97a+Bk zz8#P~Bu>UQ5P=TlB=!X1mPWA)B2E{?3mS-vW!KhO0qwh-Lf{{~ zz*(aEZQWKsAG#mNYgC^c9ghza-x0dye}(&9T~fwTHqxT0{Zph)T{wH$KpLbeAp4DV zq$P?H5z#&rc@EB48;_ypaeRNJdAdZRfjc~&;t0cXL{FckOLh{pEEzv=AxoBmr&cU? zMy}rSlq$ERUZtC3Nma)ePi~}1cQfLDqMJHP?vmiFyLY=UYS#jrp1UT z5@#t5U>0*kb-b?^i{?~rn5)EP-56^A=xk=pW;s#+FhUK&3})h02tz9y&xS{-8m)<; z?rIlGfzKhKM9z?9*zX@p899LKYSvkdzLP5e7-?+h=(wpadI^_N79Icq-8|h*%l}8$cmyr*%mo}8(TSu!cJHVO&H~p% zBct9{Fkga$f4J3i+FGQm?Vtxm7t%}nPN=3!I26`XdH#^QA>KIYkwn)L1pIt`bTl^m z9U25=m?Z29+X{%2$#*Q87^pC3BW6q;dQbHcBJFB74vq2nrn2By^~8sRMSx0h=Cpn! zhNUVWq{2#HwVZfL+5>;ICu2=R()D~osNEvs5bv^>+vrMxam|ztowujm5-=dCT1}x{ zXXC{aEkq9Wi|UbYbiq)>b}(VjNjq3CrmC7Pw*HPoj{wFH$#u5^uM|$W&LbLy4d>oZ zNHL<7Ts2s93~F}bsh)Eh6u|9}7L$hUZ3fN`>M`h!3TV<8meM9H56kq3v;)r2NOjnD zd5_DDm}~}0`y>*A=e`NvQO6$p)l1~*f;+atHIe0%pQcYBn+j5Fm_o2E4_)&JU_XT( zLR`C*S!^mo8UajlnBT&{UeuR}!n|n^Im3aq4!=m|^93pZaj;4ftb9^TCkR>gdaAx? z+Kp*&kGO?C%nx~Z!)3v-a<9(D2d_fcf|gl8Vh4Mq-P~F<75csdRdR(oV$`@?AOj~+ zI-%DdKcXA#RX11jImJ8br-rh(t!Ds{dNFdR0UJAdWY!QMEEsBbY6Tadutv*Za%6Uc zca9XdJxPO_Ra`_^UeihloA}1Sh9Nqpv+7h&2OzdhNhT*g!EVK#1dO%zvN`$r!&{uC zZD~-Pd>Fed>U|SOL$N=tdrKzUuHJ2!x&{0mEk;%|%B$ArqZetCn-*?DxdtRrV4rX# zf(HzHjskj7dk+SBF%RCrH-^UxX$v|30%yWt76LlXz*)gzadMp$;rOq9vUQ@lY+sx?3$=zjibEp}irS zhgUxrh%bC112$a%cE2Mn-O>BY`VW~x-5U>@Lqzzl?vM?uMoy&%i_3V{6PtY5{VTK7 zbu7o{a33>+1@Lf{Ije?nu()79Y7XD!i`(c4Ukt^`0R8K`ul4A#6VgT0`dYSJVZ)?hWnpYVbFH|czb{USUy@51-T+`=fe5={pDpg$7(L|EW$gn9d>AyF(JAe1)Q1O@L>mokc86w?2(Xzu@5Nd1Q* z>OT}xFPp$+)3I!FmCmiQc~Um&iwAvC9~F<^>=CbCf9l(@nI+GhlexTWuL4iG-oRU@vS!tk{4@^?49Q|BH06}RvsdB~Di%7MB;z{KiX=Y#Ttn!Bka z(kb5f{`R-ux%uDzS61z-_D(YVZXWv?SkQHBP28)sxt?v|P{cW<#1$Ui)ZY>duU_`? zpxCsPst;a>8txie=RlX6yc0;4g!Td3OueAt!qEpDtVw;K zfnnSWTEarGaP`p*R;^yp5*C8>t&eW7SoMOIumJ0?1Uy&;``CzV>m+dB&1W64IAF!iB!~%M5Gt{dbs)?gsdR2M{c#4rs zq;R-pqlE(?7cm&8xoE*S?MCYmd3<=YL+BX@DY0jxh4L#v4EwAI^-1-{Yg0+xLDv_d zK85XI?3C0St;K!FyN6!4f^q0FP!_E|rQs9wA>)Co^v;nz;`CR%-PClHibJBO&!WjE zEG3DAhW9{T;BM_6fMxt7JhxVG<)prvoW3HVuSKeR?pZk{$GZ9G45;kWpfLLF<#*ku z8QS~N2cxaepX z(!sm4e>jHEWtT+wFx~)m&=lu#mYma|9du_Zs->IB6hum@9$ZIlj^tI~L3h0!u)8V$ z!XYbJgk#WD%N$O+5PHUogVMo!!f5N5LP^LDs<-6-+$rS9rd2Iy}w?2?}WfA=wt4lyj7H5pZspoUlbY?8u&^xivYbHFUAiEs8FgN?@OP_*7i6 z=~k(rk&a6BwS_tiSkqTFaa;QRiOY*tnm^DSj_Y7pp86QP3~9O9G#1*Jwv z&V%N~m^q?KR;dt&^V%yk?5FH45;gE~3lr8Ir=xZ|e+MY5?9dm{M?0nCV`dQkh#XYO zD;Wvme06^p)07t)L9tzF0%9IOm4Go6c9EVr_fB@fLd*!t1yLNNe}GZFMlSgwII$e> z9bcI3q|&lgTcEBQd_ zkCl-iA6~!oTq~<^;;z;+n{AP}X_2yO18ceK<_-`r(XopQFQlR1P^ES2Dn}Y+$Aa-F zjZ*0J@!(}V4~j6o_TTe;B-+6AG_ezi__2*IV)-l4^csU%C%v?zJ$-ObXwugs>$U0* z+Y;Gfrmv2r%Ae4Rr<3!zhf6{m2jNr;ii(C$A+E>L-oC3uRbl~mBD%%y3v#3mys`;z zhJxH@9)#FleGtl0utuwTRoG?7y*%BS+~BXDPLH5bDY*h7_0RBz@1iFGklfzM$wDEJ zv{hG|SeG+>7mI*?%D4$4#w>b$Y8_)@NqD4oW{?z7sfhKtAa z_Kx3<1QAxWX8jPiP8Zm#JZe#pawom`%rFHSA3!nFL7-0wW_a3DhWk|P&{0}i`_rTr zA5az6ADw#^;RjkOg-Zz_Jfndg{@~50JNm^!$dP4~Py$!DT0PO3q(83pX4F<0mGkX) z6`UgBi)j#*;3@@zd%_z^GJtDIlS#eu3_#hYxFpZ;PW|6rzxWZ>;6*iGyG0$Jaml!? zJ06K=0i>Rgr}>{qRKc*VQ1S!p}di@ z&k;CQB-U@Xoo(~lB%Gu)a#DOHp>$7}FkN-8^WWp{Qw~Q-;~TO-0kQ{gZ1k)AZ9;bW zN@*^Rd5qH$td|EYDJ(b3YZ74P=hxLjO}EFXT16(8wJitVf!W*VRM^QBhN?u4hu!%F z?c-;f4&PvwMN{$LQOHJ=&RLj-;S_1zX*m+6PnwQRH9!e%{Fd0VPs>GA8cmm^paS=m zb?5AGk#yqiaLPn@c}}1%wBFjZDxj;Po|4_$*F}7d)GN~^lv=e7EG}J!+sSdEUTDaF zW{!yHeJXFrig|6y)f(vdSI+N-;P{m|tthu?NB@Y*>X%U!z39_+WH0(jKhb-zw1dVju3y!J0TU0m5qlA~V zpI4jaeon7qpGr!%4h$sNLBgGwl6-gVZ(@1YAWYU7%=oMPbh;XzJ3Kel z@d3t~S#*fd8IK10&Fw}#67-dr>+NjbpmQ&|D=;1?7kKz_hLfG><3(NHMIY%<0J=8% zek@6DqVFO}oFs=;5|^m9cII_U}wxFl;;-{~t!vQ>Xi z*Ujqa@|$J7c}__lu?}sT(TCFyC!!xla1I28cDz!*6D{d8pM-_NA!}P7H~nO=Y;5Ms zZQV(4-X4yRPEXJ34gBE&N4RlzAAGXaw|Dc^cvV3#A%oM#PY&ys-)|`+$>$6Gx0?>B zEM!x>Zu>Z2%B)1E9Q-%jOIV;j)OgaH(qS7Q!jeChbv1T0ne0*HLp6V3|%1fhry;?vg2vZK+ z-aZXJ$|HH-e6A0%^is|#1WC2eXY>-D5DLEOv#ocO^znQ)Bf0Cb8Gyq7{T>P*iP9N@ zUb*$@ui^iNljH3iK~R_kx6iNf3+(V$WVH;yarCP28z>>N6^?6Wv>)(+mq*zx`Sr&H ze?|5zN`l=Fx18dna)Os_d@wX&Lb+|i?|wDR4iDTZzjzWtUvC$8bP55Vu20@4QzN(f z3YwuG3cetD)6geH{``nOvo906w`LN&OuSyOmJR;hAT&h!8^IFm2O*^(hD~pUJX-o-G?u~=!D`qL3CrYb3M(aEmO+{|QtEhw zJ45O+qsZ8JpIFy!ac0!qkR=?D(zAuTKxr`^>eyw4u!eVcE*v%6C54iAj0*!=;ZW>G z>@ko=>`!`xTt6x%@R|(5vv$+f4TvGH@q~2!k4`$I2>HpH5YwJs=5z@kqPxiq`T|}}4u$OjF+FS6hm^rWtC6Nni$4YO zb?6WukhbrkltIj0k7z60vDW*vI#zrih^Wytzz!f$uh$5zhSO%c$D>R!^3G`~Sc}4K zOGVDBUul6&0D6^+tGr8w5zP!a(nL?sEUzhWyfcGr0l=*AcRq9lwu6ZWA*3(q?9B9$U2bF=5Aq{wxFg7NBUPg;DYw^ z!ID+M8j7|7&nN52tC!;MaQ<%R^hV1EjIS$pf=5Lc&1y^g>!^5M*U0FNq2ZuZ>&dNg zsGpvkoP>ph5PruPaKT7j-{AU)^6fj+Z3$}x9=^$98I8#zOkP|cSRf%?g%iOf$fu=> z=8AzN|G0}L@{{~4?svC7IFIi=Ezc3$87bG{1PZTtz{&mvlLsAK@Yw=ZSS zQkb@o6?m|3W8wjbISzHQz8fv94=tKcOPSo;$IXysONZy=rI^D0WY+`T+h5mscd}l;g?U2K!6PJmq&g5?tdTrqdPf^q zZl6*e4lOW{N=P_k4;qZ@o_llLl*hJ1VF-F8acRS+Wn0ba%nt6Lq1k~SJ+CQy`*Ygo z@s3q=YA#+dYNQS4G?20@cjWjM`~4|a>9;i|X|50)e01V9os7S&CU*~b6)3y;$!3h9 z$#964D+(n-+JMN$A{Q~JT&6?b>cG=H8U^AGc?yL!LOu@DZ?}014%a_blZO%t+-!Rk z>JE+bb;zhO@HAdT8|3$W(1q9JPtKO#y!}gc-~4iwInq=EGoi2PnF$J^ykFsPITK0D z2Fkwi@!in?oS$=%h%HX?kvmuPBtzuEyof!c;*bnUp=NVwaBoWn_`EF|gBpC7ec(+Z z@{$$Rg6$&q%dF@ru~BBmL_q{Wgt)I6IBiIt#Rd%t=IE!t7`$vg14SZM>8{OxA5dQSgyvqk(k zAEkGZ_CfC}Id$tet00N`2$24K$~$X%#+%~?@@l$eVD3D9cYs69I!B;iFRbig4%k8qNyXaihF=> z8u4+xIyLPRkVRIZsR|KV{zLVJkJ$6jP52!jqB0LzT+4*yTC-~toL?%0rgUpS8eO_| zg21T@kz_z9ne3nR7eW`v&Fli>PY37)FT*bK# z=?@H7x>uJ~Z_Vott;J-nWTAL{m|c-zy{CD)V=;1jUj;ykY!J;u;kr4!NG>LFYvx$@ zZhfaqwtIMtmEwBCt=r|1P%g}EkKyEUxVNvM5tf7NP`HRdIXtq2f>0QVG*_yn&nWS$ zjP)6CtcfbOd=+_Cuz(h-#9SKn*N5!#$1?4dlc^di9xhq#35Wq@VK?kHapm`z~ng zmkuIsW~f?K3{g&laomDu;j@=JhhxGlP<#&Nl=n0RxGKI`hEkS0OGQK&>`yCl^wF5RIykfjnt~l3g~<>MRa49d{Q*TIv9)&)4nO5sd`1r*`#Qb zYj59CWmq)wS0)N#4VFV)@y`94yM8$J@80OSh%00-BLjoCG76Of8%H^V(?`~-`Z>~( za9l1WnmM}NF7Ilb!}I1U2ElDh7XlZ-YP=rISbTGzc(nv+-=q&hf4xNjGSL!2r3{4tWTkW-EhcnlDSFwd}!J4k$cnfUf9@$I|Bx7Uep-zUEP zpl&l^P2?RDvJm6qZ_MA1iEqdb9|InwT7vBE3CI-R2M*(o-_&56Z%#Gln^TMV<_L@p z3_jhuYR<^NXqn<7rFA%4Syc2EYa%~_5R_msq3dlDrp>En0Dw5&P5@Y!{*Izqf*KR>bQ8*mFHtTVxP5tj+lgN%^@fGmFj0FNE$B!TFpEDlqeG7RYJ zu7C?&$;hY8hXIb_2(S!o%LC)nTETT*P$+|=NdkN`E-iitLHEj-6o=_sIIia%Wv(2( zuO#;weG>k~odLbUm=;M9pV2@%qP&}wc$F1U0Lav-2if~;MoGXNcMGYn3%LE@L>=3`Pk zpk!c>Agc?;tL+dma|Y1%*af;P-CLR)rb1vAJs5<{i^NnUYWPW3hvbOx>JUI%i)HfD z@^0BYECW7mx#a5-XJG&ou*!{b!EJR4Qih(4VC=4V4dF;A5SF-K)5abQWa{&#qvh45 zZ!70=n(aHfo%vTJ0&JK?4F(Pp%R|(o)As+=>&Aivaxh(HA(#bE37oHe8nzL-u0Yrp z;BtH=sw992*x=?E*nk(-C}fc%OJ+rB4b!wDh`e6wL<_qv#j=ZRxmJ)Dh)IW6;C|l9 z3Y5oB7gorQm9c{n@xY?e3a1b7L%pfoA*pn(SXi;zi@^nwt*q{_J7!vi0!VFg_Iuh2 zdME!hC8*AH*Xvf|d_}09>4Y17J7Vj8HAgy7$#iCMvZTA>@mdqrBeok^?&TFx%m90O z)uCyqPIP5n(^a-+Hio(tekY2vX$yvPCyKNA%SCava=j?ndDrWQb+vN#h`k810q+wv zJ61UEhph!?jER+zhdXbNI_?VVPO|mP+cQMs=wi$YYb;8W3V0xY}^3S4GM#1^5>v9TsBB{z!P^2$HEkOSmNP?rEZ3$;@OBou)>jquy-!w!@IChixB*(fI(Sp%Hjl_ zph_$suoc6Qn6o(r*Ys4bjM}jB5QBS~hd&*!g!Xd??KF;5EZY=GZ=MEZ^3=(B?z|YS z(|BOY%=lXwgZ_z4dXP=RgB=BCiBX2-Ki~-`o+I(PV4vZrob^J81>XTL|xK63V(yOaSM86>snt;iHphmc(XWU^0lL^-N9o*kW>sT={Z&+CH zGDfv9b7eP!Ydx*xF}-+|c3bm69zq^whm`Z&)}Ck$+W|NiQmXTONdjZh^`ap~?Mkm$ z>6O=IXxZRYrov+%y)+F}pEcl;<=+v>v9cFP4dc*O8ite|pT)7)tCtiG$zTVD&j;%T zwjCmNJV5fZhYP+oJ$f;*z?~zlQ?$S(dXy`)BK)D3t^nUOwBL3Pn0J$n-3(qssShj< zv4f!p*xB0cX5&>x>&#lwuYdx%^-nPbz)r{1NIZpUS?E%(cpBxrf7zhTz zyRvfNta$rbby0#?g@k-rcZg%4xkoOPr19l)WR(rYbCqEPl4F&{7T9I|k1b+6Y4eM- z<-~!L%K@9w7S|G0%?r26agbd~(gD?x%#j^Kh~~HDMB(&z&jX$XQjQyc1!KYDpr92Y zM9uO`fP&84?fR4&mwik;pQ zt3<`@70MV@Y#VgJ@yw*Ok92;}>6TziBH`iSLCN&#`Sg0NUd}W#pu4fkZI&{=oYUn3 z=_!J?$Cx+um5!kk$IA(!Duh$9I(lr41a89nN`vT>HqX@QD)Ebyv)s&1$>`h`Qw(7_*Gie;eR*%J_ zzVp21xOoasT6zbricKF9NBa8YvbTB;JBT59*udBD-HR7FtDu^@iUrvRd)OH|bGyPj z5mO{K=hd>8X&NxOpB!7Mu@rQ8p+E5nfXse>OvYBDptTeAIaa+O$}N6 z*t~6~8R6%Az$JV!v%J8QS5PjIhpgkV?rzp~q02fnTsML)RP9pIMNA94+hl0yxLGSG zIwwM}>d+Beki2G*GSSeTSjtv-L9iB?^>%)%Y^0pY8NhZ=7iW;(im{yZbh{ecfy<(c z)4Lp&Em(%)aDdJ3$T3r?6JH9SGM?z<{Hj6NZ6eOcZ5!LHN~QI72JQ7}RFlfj-8Z;6 zy~M*cF#^_>TFQ&N7G+Az>G!chq+7GKq+b@kBHq!!Ur#2(43<8 zVIyI4-|^iYnG+IK7STj1A!p*S>jGJ->j{*1t+aj~4tIGF$ILujLxL1={7_F3|3)=z z;}s;y2Cj-Btz~_`+B_;&@)64rptA2V5R#zU54a(LO3; zq%nPqYc!EBO@?xoXsTSV!(lIRgLYDM*1ibV)pG21pp9i7RM^)EyUI`$*m&h-$<8ED zS7dpzsQF%^8FaRPcvtxT>gwX9GIRvPQ3(utdoX4L;pe(u9WHQPzQr@l=^!$<^%Huh zEtnikZ-dPdd)r4xRxrXiofugs&srjY`NJ+qNanGn@hPsuEyV=$8>twl5rrWAs>Mtp0&Gk)ci1j zy9i@)n!7it#&GQ}&@O^ZgnUqNJ$19`L1mHD<7YQn7jhTrmL4FNsV7gInZD+RBS+59 zzXYS1zqzN9j@j#W>}B1mIgRYz-7};MrL!}LF;eLrYL)Tay7@!0iEhn$Sm zCLPSXF#HU&oqURS#2q9fZJv$n@n(c%$zC+gg0DnHFx`aNeiR)TVTF`&+cSdcrhGX4 zV~Zyo(=O0%w4_~QIe~xEGkiMwmDZ%>S$0pw%_?f0TQBdpECg39tz%YEmqH1R^!82c!S$NTN38R0!S+?o9CcQerMH1vO% zQq;GdY`*=!-?~8G3K#!rKYp$jI5_iVE3Xh;=sjVl*y(6Xv)k)zVb+ zE8L7DEgEh>k5-225U>AZW?M@=`Sd3 zonkphSeno@PmQ^N+a-fKa&}9xjaqN$HNP9^2s#3Fmwq-bOpOUpS**^`ia^o9+ntzWjJMtFKsxhKL;a;*|JD6YlDy zwpT^~u(sFgB6)ls=`DE=w4)3wwxe&_7!%a9kMw|Q5h6&|B!vlDfhpFoQ?uXjt}`F; z(#0*D(W%{ZXbZF$KadJ85(o{4Kxo-ss`b{bqN{0PclDn;uuR5$fa-5#++OB>aqA8` zGu)uLxLiRRmnKDfo0vY9yf&wh?hxuq<%>#FVJfZj-5t4Tu-w6|yTJKm?;D&VV`Pd`F6u+p^OJpqL? z#T~X3=W)WDT1fx`hp8WkYDWyOh~Xi!zOi|}e2?r7=gtbUwm~45HRW=2=DphTkn;+e z+_Bdo?}Oz&5C!UdN4Ay)(EASi<#uzw5HF4WM(y;rSY*aWl}#3PweG0<5d>uE)r4;}r4YK-6HNkC0$~l>2m}xj0V{G}`5#1oS zGXS4{lRd}p*RaRz?q5FIzp2!53P!BjYMxZXPPsYtq#Z+6&WVm!Y{MetksXOm7bL}P zkrA%R_ngm{`Z8CF66;3_0jrmAvV}_|>3r6WP$4FokNsk{9&SO3H1z6r#Ruts?}UN7 zj_OFEGmhGqyy^xp0`~SUj0`~u5d-6SLOhtOvvI19unhz@SwF5e&2uP1+OcWbS!{@O zSpyIaqf64tDUQGR8n+$R+L3L?uNveUg;SB|z=snH4TnuOxr=$T-R1%87)lJ=)la5y z2NC}wr)7jMhsu>xo><9#%)CLWyA-#^ajAY|7NBFv_}X?4L@{)v%Wxx~hb`^Y7WmXJ}Mh-l)M)m z0&$!Cg^jI$>R?{s*j!R4Kej!`^+qm9Lse`j6Q(Viw{Ak5y?xgCfhReoYKq;cSKWox=$eV2eC?|$O5nAPOkw*+WIaJ8+YvfbgE z8{5bvN}Oe2DllQ`CLH$B0fw&agpQiAGT2)8_9F!Hr$<}N+58LgrqDAxMk;E!`aVR! zp)wdsPRs1KaMi-bRg`*Q)#%L=HNsZte(jj(vgaZJhs#J?*Pm7sxKwEKwnd_?qf2*B zuW75kF%7VXHgsZPog^PlKb(ZyNF)fkp(!7J*R-RhRJi5Oz3rLKr@WErAmA1E5~2zt zgHyBT6!sG7HfuGd5F$yAs*_F%yiO+b9_DyB=3vTyc_h!Oo7mrs$a?u%0AM@YVdH*P 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 z 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

    mS{LSU4>1)jNFM+<2(} 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%0DS2{O*b2g*Jc7en2)^%XW}5|JRE8C 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�xW{w7FOrUIBW@6H1ut9O zd6Ou9AO_KxR}f8)PbC?2ra!9+puaA&v}gBZdt|aK{c=Y#q#)~Tw9PdPUPK%&Pe$<*(J()= zuP-b1gSFn%SAsCt7kX;FZ(c+V#T7yTEa4S4CvN6WVZGN+Q$rD}Po};I zikkv8M@>z~hHTD)X)~JzCxtX}@EO8f>6V7@e&7G2@3)w0Gsm=37Uux-p3Hp2x0Sl# zk}zHwnt_VpoCX$>65_96YGdd>tJL2Vq@p?VjA9xGxslOpLdt@*W&sjBq5M~sDPTW6 zuKWj~=p}NzI*jiM8L&8OqSE(4p8V9DZ(dRUdX;}kc^h!PD9yVoTJ35(d8(1~u^#5R z`^qWs9ZUmBmMBy$>Y+ey;W$@N`AZz=`jGM}^u3IY;F9B!MP34B2q@PS=cuNr@>IUg zq^PiHKn_+{l6{VNX$LOf#%vQbjG#t!&@vn@sLu9G+vv`?W6(f=UtNB;8l3O;21i5V zA;a()#QaAi;}N@4x?m*#`B7d^3BtWne3hus0MK`{sx<4n^-ZWyZ;IQ+OfxG-pYvGj znQE4#U!5x4Z6wTawe-hB=z{ua^GmZUGz=Li#RKln(JIpBqL{fymhQr{JryV*?y9%uQVf=uW> z5O7txum4cM%L}7+@-Acy^FQ^Otf%3glvvn;38N&GWiV-7NGd^#`mEm=ozTB)J)=$ly+)+W<d!;>ACQTP z4+Bq*{wOeihdF!H#$YH=3P2UZ)UgqH2-id@<|Uu%5!8f{?zFN7Z)M_ViA?;x&^Jml zZXEt5ymJtsac5Tc*)fp3p+o=)eXI)W&k?qg2S=6Eomb~d2- zw0tq*9U}VOTT_axV|A2zf_BY*qN2A{9O{o$DzI~c`dFD?r&8Bs)$zDt^sz+MHPg$J zdGUEhA4i6RekC2fPQ^}6a0@nL@J>3~lt$pRt5;IFyBP!S#k@CjkU7fxE6EnTaP5vF zs)nhZdL`Dc#(tPREt6uh`O-tM<;)RgpVT>-cts|>P6gL0O5eQV>7{;sqp31YW)_7# zr@BLtk-(M!)-?_oq86EB)Yhhk`n|^r^|^g5n^Kt}s#0C2%q@x&lFF#fP%}u?nx}ko zw@>+v=`QMImFX}|a&NVH?Qi{Hm0#Z;R+xSGf-C*V>Aqw^DIdq6 zFzR;v9g|TV8koNUQ!7R&m^vkZj97?~K%%Ch;qp96(Yap4DN;L@Qd@#6dyVBDPNy$kI}Za{}b;q>IgP)}c6=FppJ$ z@1|sfj<6}tX_A21lh#`$%G2a#?9kyHv5&K<5>q!hq8xXP#TXlR1%hSct_6)uwsFN^ zm}M1tQxJTpvIfU@uFzDvLc|r`g!uIzGn!v2fvQTB8siw-1MuXWORv-6E_yDFM*h3c_))Yo4W~5Y$!?38?%X23Xx_!2 zJHk1-G6WtabGEi1R9+DGqYqNNVuL`_dR&AD>&0em&U=(J8uTn!8_Rl@dI?P%%g8-V zW=@x7!Hq$*ku+%Op3IoQYeki9IP!?v_@@c~bP;XY+1DYS!=36l+gb_>_T?e|y-9G7 z1h&BBYbq7lf>h+;dQ|K6=@5#JpyOORk%uv;ZyTSj)D_Lue$|MiJ?7tQ_CbOyE*{!R zJDdbkF+Nl53Z&mE4+JP^6*Jf0C728L3X6gCH!95FSfe9X=)x`$ZPNuhxnY-R?j)7f zIoA1I!nuZ{_M==|C1NrF^w0(|Kf&0wh4}G8m!Fyo9%`PQ{q^olgFjU3vgY}0qFEhi z_6uJT=2hXpB7%>E+y=w%lZ-hjo86FcKh3E62=)2p3`Mx!&ZIug=&v&s{{mpD2C3=t zLt*u)Y2g5EkD89h+d^KY+R6*PDdE2ah9i-np=zp{p+?K$iF#BGLO-H@5+hI93FToK zJ!sLq+Vc78XJq&{X`YehIhjK>V_LlyHK+e|ybIJ6`vNd8{Eu#_K3A2x!RQH&bCOka zcKx23Luq?>w}Z$>#mOcr4nT!WR7@3gv7%6@whB%cgR`MN0vehPa*a_#zS(c`n5*_H z_1^cs+j}R`dxtt31>{W>mA6$#jYqwsr1vsSqO_Z&_p(jzB_~erI$)l^>p17==KrPl z2LJEgi}n1!_THNQ-V3GNEJ*}}bsm53Ew;yANROoic&Wz*|JGyGf9bIU=&|EUJ@&r7 z9y^d{U&dd&Tt~44aC!Uc1KRq_G#(%lj#^qjX)pFZwC(>*4^x6WwmNeX^ zg{3$4-v8Mfo5mYU^TtN=#td()*SS&s+Z$V&k59~hPsSXIjM-nEoiWQ2XN$j&**Cmi znH!XUy$b%M5*c${+T4}Su1LGrrxj^BFJvmuOCw}1O{cC;>s!lEr+h| z?AtiEZ{wuCjnU#i=TOjpxudF&P?sTm6!3u-87#_xAA<;EISoM zK1_>Dw$#2zep}=hGj}um3Op?9{BF_iY1R{W%kJL9cGGVD?nBs4^Sg!Y&++fGe@CQ3 zb65e~Ja?EmI7R}aT#+)({7NG11$HC#B`(O!&&#tmdf<>FEBGOY3Hmq%*2Poy)>mvI2|>@Wr1cvln6z#N^)NJ|%G>YDQc!Wt*F%ze=Wj*w=q2 zvp36Vo=OsaLvoBVVT^CdqzQrKN?|tO7BYO#Y7+i?BHBpEFEhUE;`hZBNwv2fFeq%T zJjzw>Y5n}xzFL4V{tdyepGkBB{5)tN-c|tUbP%FBn5>tfUK#48${Ey0w>r@zs)#g6 zx1rdqn`Y8e(66f`x?;XHYDu@7wuzm<&IdFNin^M*{lP@ws8-kn3sHt*FU9F5oh7ODRry%}gFGei6w{yQpqSGiSGy42MT<_Tq1X>|6{xjM6m zw|a^&hhX0hqjX=Rs&ng2gK9SE4q5i-R3b)#YR&WBrlZ@TA5+Ag^u0Q|PrLVObH6UD zDtDl&^!I?*k{+{QK~f*&Ndal|GJgZovw7Q>*fqhv9JiN&yq;+Ag$ z!xuP{zGE{a=g6S2VwGgDmHTK3C=qF2caqe z^-3Cw_uE7qG>JQh_)L1!t+QG=5P7AELNjRSs z{O7~m4Z?Gy>jHUxKph6&N_KgmfW8G^#I}0$rFr+Rl)gKa#&2!4qXLDc^zYyviXOoN zMOuum_StJ&$5LfqF62@k$k+A*m}@{kl6niZh!^cqkT;l}QZkBncIJw~P01a#IrkOC zuOn`Q3ff-<@}0ihcp+$WV1xt>o3n^#&eE1lOp8yJhw@BIMB6a~oz|sT$Jyg0QF*Gn zLeG7c*NC%AcHlWN{+9CpWADAgEUT(T-!;REJMUe4SJkdu)z#IxIwv|*2b!h{-I636 zpq0#3L64Y26GQ}&R?#CtXrc%R4N4TDK|nBpiGzrOh=PF10R#>x+~1gM?GBvd_1*XG zAMg9#>*^KuTyxDeW*T$M5%<*U%n%cgGQQg4p_cC}JUlp;yYn>mk1O=FbV)6ldjWb7 zQ>}a0Phns|fRwO2f_(S6W&$%z8>%T?Xw|4@Bc7nh;C7a$32lx}>}KU{=&Dxz!fd@; zKB%x}r@MKqrrFI8iP}`EEbkjanz)g3DBV-`UR4KvPX+fO|9!Yd^VTCfzZyMN4xWLE zO?ptbOn2J&L`7Lh&%_NXJ8g@9F7H6<+3QW3;=R_lO+~;d{Hp1@0+pJ+#KAVHdbmAI z9UgGlgQ1rXkGbnPtZ=x`QFQmkAUY(yYkH^jSMP7wpElG3jliAlpN!ek^zUiJ_che_ z5cwbyySu^G@FxxbaUulxzi1R6X{cYOPabOEJSMN6YDTY_;`0slmo)jgMlf${qaY-t zQI52qNSkDLw=*CVJrXHVduPREQHs$B>+uUr4{$BYPdz9?N%UKl@5!NQ!Q5NF=b<9g znf77tWi$o}Jd5@jY8H9IC{?z~cMcW#&MZAyBtGa3>myyijol==|9#%HY0s(QXO($Q z8FwCYi)r|*TIQWptP;D{Bxp;7!HGFrY}19mCFb?SyqcI-B(B}6VArrGhV2)8OQlMACLw!}c5P6P~v=!jk- zix6%0UE0k6ikrXh4sXtz!LyS=gMu{~fcob!l2ld_I1ENFn zxIRX%>T!J$27pt%`HQpByymmIafZG;$Oi9FcAdo*BF2soUO8Bz8V$O8;2L3UN|Y*Y{Hf0ex!ZL7O=W&#)US~K2(JBk9_bW~N5{Gm&JYJZgRb=^ zBTUNLgq5aBi9`lsYJ_P!@v(xb=k}*1^R;Or4Q-#|sJ-JSNE3OVm`QCTjmTeUFa)mS zM5Q>wpjhVA7X2H2hs>o1^+G8w4WpA4Fp)-mMFkbxBv|M7>?q zjDvyb=gEf<0rs7?gl9}t|YCVr&is%#u`*km{wZ%fL5t&T4B z)>K!Dtzfd^BP(OBJu43LHV0L_)}Lt9DF$trld*PDFC^h#V77LHZN&b;{k@^%*Cq0e zBcJ}xunB6_($W@!#XS%n)$UgaMo3FZp#;Ol(EN{#5IQWSTSk`Bq3g~N>P4;F$DJk6 z*P1GJ8MYH2x(>eWY#9rkjb^-q1!F$_RjjNO`^KIXgWjdntFMd(Z;aYskGB72ls(H| z#@h`e>do=NsUzy-k<_~J3)3O>em2^8Xfz7cFQ>_X$HI{epTax`lJKMvqA@nrAKjC4 zr&s=Mq_Ixl_rl@a2Y4MX&$>&Ydoh7ywQ6ZpbffxRma#8A_swi2;QD)1Nd08=C% z7toZBx3hZ8FBsVZUTR#4 zTQKd-_!!HwYt>t`Gv03Z?=3jVW72DS&QQHkkLgW~N(NTkN&MZ_tc83VzF;wjzlZRb zEBr@SdyZSh_o6En7{q}Kc)Xr3+!A#yLb>^FUdru!%`u1`8 z+m0&-xd%f1!_eFxqUQ(9C`R53*vuvrRR@1pFt+uD2{UuFCtu@sSv~N*+ug zNS}V_sHC5($Iej!!~Go9eJ+aPr=TE?cVO&4rSEg%aV^*)Mm`aPEq5z9XrFiBMpjf- z#@t?{n?ykZ8whRrNzuGM4S$Z_%W}%b@}*8sdWGIcHwn~t8a85o<2Xr^!+}U72|ziG z9qj3R6f;!M%L$l*#`fqFOO4ai*xSqd_j(sV6Zv>_?bqt!Kz+1y3064US#BI4mK#m{ zmEii+?PbhC0wtswnr^PRRTS5r71!-u<081Y;=UloeUYsOeI+Fj)1mchH~Aah3$~Hs zx<3l8>%&{sjcSv`em?|D-*(ufC{V&6gIST3YAgfAPDqz7Fa>(1XXx-!mVyHQ8zDT< zAP9B_fy+cM5XeZ7{f)}*BHDQE_7v#-8?nuzT&F{9p7bv?kbRp??pj*!bE>&(`JuXaCzqs=3L!1xOy3mwJqP*~^K={+f_hR5=T}(U5n5Ti=_t+gp!yCmHSy;FM6Q8F ziLeQjGrfxw*>mIMG2Nm$`vDO-lTt*5`*W&zg8zX&@7|>N&CtJ*lH>u?tk3&H_U233 z^`u-!&oS=S~EQ`Hw@j%v7oO7lvfKzg*I<7Xil_pu&dbej~Y|T1dvUahelTx(H zJn;l0cI)FX!EN2S&lQ=)0?{bOMJ&ymRQy#GA9%Th4MRH*^4`NyD&pUuUeTXqqHR=V zE zg(_@lRKEL6FZvWcTHT`iZ)3r3K=A}K)a!we;8#XL4oj4DIXlPsNSkQihhH>3Mfb!! zsmcxsv^5^8F@h>V2i&}(kdMux)svWoOZxg)x>~Ipz#ttTQc)<(mML~j@0&V9 zD4P9&;qCaUQ`(8?1ly?9sazNFxX8gR$ZWdw$iQfH^^LG@?EqNqcRHgGw+T7}#~8AjHvUdvbXAM*~JZ;Ih0CPh|YE zlmC_bd3q8aMkUe~zJ;MJ6`G*WS9+G}ZPjWiB|Z--mTI9GW@<1S6ZimFYb3dakPS%* zZYnJ;ddRR2jvj5Joe@Mo47Lhji};|Gb}23W&L>iC-C;tad(QXfqs`0+=PAyV$s{0cQa6X! zLi+6ap4__p9=SRB&fN68;#f5_Fi!Yi?;0AOl*e1iI#TE5-|szHz(5f7dhsyS#X0{} zT+vIPiFeYKg8C!(8U37x}_6{TlPHyggC!O z;wh)AS;Hv_WX>h3b}^enb)o9P#9K52(;m9WnZ2yE2c^n_H_-X}V_;fmiD279vu;uA zGJ5QqTy}FkySk-(>F}Q@`%{%PignW%e@t}joVwn-e;<@+$Kbenj$(tTY&UQd;#p!QxFuUm&H;C6w8h*x2}IV@6@Z&yl?V zFpTG;3!P?Hac>?TYTg-q$K)MA@ZBs${s#$k_t~5^E7d5J8gYd z?I)(!GzmrCBp``g`!?fRmf)PA(@MQ->n7`GMcHIMoai-r5aWVQunB~V?6>Us33hHr zs&^pT6;HI{u?U!hk3RjM|d4GkLj34;Uvs0 z%bc9{AT2X(y*jEVZHsHVBWLDfuaQTyIjrs3l#rA|yuGk9hdZ@7oe?Qjj+1o1>D#qA z-=7^W@E4eIDvk6v_F{^Zk6PQ#IG)xhGu}qsNaUQ2-UA!6>r=e11bC-;#U~Vn8xf;_ z_VqeifAkq&{|GjaE(_XG;J=|*`>)-kniUw4k&xoho2=+OU!>Su-* z#|4n2{ZsRE#Z7zL(r9_df@ER67K~18&F-JM+5JA)O|#*YkX*I9>pkGv)p6Y-v)fTA zYW+%R6}7%Wpph^5LJh(1L|X4h>bUsW=qRl5-dE7&_cjg(jkoJn;ND8QV)zDo5ID{; zyu2#T%<%4w65SG^l_?=WVz|=xE;W#Qd~5na&>zZ$tdDHQWY_@ZYCQ)iRz%dRco$fvm= zS3JP@Zi2V+11~B4B72*clyM-ZQ358vsB-%h_CDw(ReTYB?B~s3Fo5$qDCE~7^9lq+ z=N($#g~nlST6=vUH&BWfRpU~zqu?VXEu3u3YdZRltlytYE9sp76M|^7G~XABh0kM+ zBRW_yTE!Jqw7JC{R{jUN_=c!|3#naG|KSv$_tpg6-J&G8nuHk{M6vNagowJ1ON?rX=4s*pq;UIXs$UJe)y3yVeo+WNPH`zO)3vGwD^4cnZPh9>wzQ=FTuL4z^Orm#$;1ixGp>dMp8d{?e$^)x^PKSD>PylH-z`7 zV%U9<-eo?+ycL(CcdbC%!Ogm@NQ*`fsXMOB^{uWa`o@A-jD>p zip>+T`fXfz1dD|@crsSMh7%k0c5cjdd|4GA)A|oO|9cD@SOA0!1-T2Q4!@nH2*)k$ zxl;V2xOm?-snAnSD%8}URxr!aw+>RlP-LEE5cD$$1{nmR&4++kh7#8@TYVzFI(*Bf zzUZ@aWy{}xgd^}iE&EqBJ-v7<&sOX5Yk#Y}pQC9Lo`5Ih5BRSLEE|kEk;Mm=&&xWg zq882mDY~POzpGFR#$%s3Ug6o_FMJ+l4UBV=5b7P{0wEXik?21oy@ZhR5|H>xU^S>8%w20mJ;K4#66wuxczkRHIl zr)5ug`;fI61#^w5Iy5FK7pu@Hh-6W$LU@C%z^_XhehC^l?Og*6#+S#i#qOPLJ z5v2m}b2gj zlDuf5nSZPLf2;T}R!Y@UsV^*xazNSxOnTOmcVm}AQq?ZUVc&ddf0_(YEvy6l9hTT& zxi#v^R2Re27jm;&6SR3+V!6b-?oo1V7_&c+D-#on0>u1m7PRXvMgvE(dGw9hJfeSGBs z<3BYGBqQNnpu51AF@;mK$7p+E1u3G3$k-~EO0p4O zGTpnt#~e}|w5Fq|OIT8Ebh+F6v!^Aq^Y%I3Te8mEjFn*U6z+YWlG73JDJd9^`%Udb&lapp4HyFum`~!38ElUc$#dtGq|&3ZYkK{ zpBf+=V`BNwC)v&3XZbZ;iVSa5?Pn=V9m@ejUx{lF4Suyd%uQ z1mm>SN8<^T{VBcpY5b;0D`781Q@Bo@+)ki($y8WSIWm`(-GTr$XP}>&)?v2;cNffY zmMXiC?VgoVq@-ysWs-Y)B%&x-Ws_}}vyxHonTmMR4Mt$Iq+g_$H zf|aFTiZ8dxd0L$hZXyw%0@vB{!&W_uY%hO#2qX78(L5+$t>f##OL;vkI}wzUJ2V@3)Q9d1HV*9iK+VK zuzXfjz91U=yG=IxQ0aEFQrD{BdR631e|6V>?;4*cNe7zUB`R@w@&08C zw}`e@>eKomFs97=W5gc!0R46RI@&KOe>!~bWEGT9vXh=rxGfY%7T746Uoyjo*@Y?Y z3B_&>Wj(GEJ4Pb1RO2QxapKt*kca0+2$5K9!vF~%(|)C+K`?Ua-O~>9I6ZhiuAAq0 znf5#3sJQ2SCEg-Xgev!z)L?l)je|2eT%AxJ*{CLQJNalnoM0tB&zebiKAq-Vi%vaZ znm@G{-w)p;M${}dJD4?vYk4k=2##bS;k9R(*$J+?To}hW(UN4bTGG2XS)$!h7;9fT zb$R6SyB)Rqs_!p+hktF5%vvDwTCc!i;t@zR_K(k`+bFHEqw?a`5d~(?^KnbGMog* z>h@Y+3%B28h12>8ymnR9Nk&}eLDtdSkqfVNg5v`h{c#x^n9rwhcVu9Gss*pj60U6} zoS#-;OU9ob8q8|&bpxix$_|1FE<%LTK*=_fCZRxPSMjJ-M&mh{j78FgX&j2{S#zXF z$EV%|^Y33^^TGJi>xn^unH8AfINiPsxIc`j5WT;w4y!>(PO~ayWDjH&;Oo7#{g`(v z-6Hx}BKijq7F_wGwcNt8Zh&=Jd4J1AtcvoD^e^yU#hr|#K=t!KYo(~Y$D&1Klj9yh9t~=gJ)NNPo3TO3TYiY<-b$i_}fzZtib; zSR@Y=-wuCJeLMWU_4khNJ2=zY{9l13gW(^-0>>RE96S8E_L5d;rDiSC`VD+gn{TZ} z>*+tbw%T{QR%RqXpFFNsWLquRdk9m#i@VT#Wa2X7(CNVfkbwY6$(;kLck3|NzQ_oP z)OG`;1#))v@Dde{^*BPP;^}4Ht$oW}+6L8=61f%cHc6_BbM2ltK`+rp2vxnGcYEJ{ zOn0bLwj>B`b%(fP>wgnrTeMMpVjb#j={ppc7UY<^El1S#;!(^!`wMv&98&v9iT$TtA`54R=*Z3^xN;QjH|WI#+|+yIadl04`d)`ORaD&1O7vt_uO zo=&H~bci4T8FQr2L9*xI#?4%ry(qIV7r7&!JaHpWLf!I9<~3R8GmB9YaP!uc2bCcb z9jiVforf)R>yNi&o360`kTaW3ehG6bookA3ki$bB3!{!4IN}t1LkTjbb}2`t0Mzs- zLm9IH2Q-iQC5KcAgycq)SQCln9g1)6gATLhcokxfs!$&(?~^R2AV7e< zT&;%F`C~sS(~wkeC%Sr;H~Of|o!rK#%R5){xd~YQs7&zO z#&VZ;{?^3)kID?sZS2Q&tV1(1ui2I^aAtrCq?@;UBA}*yut9*me!E8kZ3eEu`>pLB3BVb|0`iU9 zJrbBRpatriw|gXDXK)MPw{G`HAkRP-*l*kJkpsR3y?}rF_75HWtqMpDwru~@RiRY} zsl;8|KXtWeRYU4=w>?T4gp8q(fc=m$apLM|-bIItbABK3kJJ_ncpPp?6=0djzr<{dPgtINR`^$x;Oy zZc9a-?8lvgfn;qETy+JStuzZhZBdi=UT6~VkC(sI%~S7Ici!U8_qy{B-T9~P{IEO! z#+_-vWV8OGy;eB;o_^VSn|pF7Cj9q*;z)!)6qIFMlRPv4c$hoTG?2{qQDf*r>ap#w z$!3B-P`)&+3uQUC;VpDbK&xbrFf($q9> zc0D`0o}XPWOrxbyj`oPpMR^no^QfF8xa@+^Te|+G$g? z_V{Qk@NKDH>zbxWqqZvDYU0-KZ8=(aw$&W1YwL}F@Lcv14s*Ajr`K%*B)xlUDQ|tA zehvLze$kVh;`D!}Vq*n5d+kR7e z3Y84pZFiLH@}%|H4q_xg(ni~IZoA_hN|loT%UiNWTKEC}CK$>rl(K?fYh>@uz{B#j z)m*K@w!4Z4z8(JF+GRp3?fAE2{_V=z3U(_^c5<>iR9+Q2$F83}y*fH@D8RkTd&nQp zRu9BL3(Ft7SUW(*V+B^Gg!dtwrMLpAu8?0-yp8N7TC0CL2jv&rEoP0|K9es^!S8aG z(@iB0(dC0KQ<_m;a#Y1EM^&Ip`T`8ev}k!j3KK4x6vBr*oX2vNw=Q;f@o z9_;%b-8!IKfH^>%wAOpx$x`GkDNVj2XY|)qc}NE3Ft&~IRXNg;EIG7y=|30^qQZW< zgG{#nf?0)CAblZchlbskS}871nhtF#e{doMbHf)9m;?(87SEn}n?spZjIMPaZVk5r zCQX+XFGDk<$GK+1X0aPKPhLszCwIUeq-+e14xZK*>h^S!@`<48u4e6Llbz`KC0l#J^uxb6U-)bz%5 zY-0ZMYvuJKUjC;;Q>r5%3vzT#;J}kRcup|m(}5~|BFo0sT(TKc-tsNT+WbhzfNn!bwS}KJt!O!@q+Ln5o#BRM#xgyX+HIkd9A?&%@)faZF3Xp^d4sOF}k?21|-0_YjGZpMoYXJ4_|ukq9l-Kc6e za03una+Jwb5KFr*9J})=R8B=Ne&Q(Qj|EFBV`##?)3fhvl{!=OHm0FSJS3&=Cb=h< z`pU3~y8G*WGd$bkwJCh|~*eCRx{0@p7+l(&xuo&!C5An6hlVTOq4D;9^En0ar5WA(pHk-MN=l%s$7Tv*Bdi8? zOIJ}KhkNm4_?^=FA7SdbKA!;Aip&uX+Oa9_rB!Q(JYt!9mcv!~W4yySJsue+BUAcI z-Z>`y(DkA=OWl5-ec?9wLfP}KQK;cNdFbJ08JN{)P>zedNr87g8u^;a7_7&P_Yk3P z9_DZZ^b=H7jZJgs5meXl;^eLG*F}hFzqeAyHYT13hXZDl z%$5O9|D2}a@Q%_;(n(My`tIAZNw7gJ`J^hX@S=^%n_aVc0#L`L%F1>Mt~-+MpL?*Us#k%dV5NYmi<4oZ4P) z(3LD9&aSN&TGuW1Ef4-t#>H={d7k~g#Fi}to&IOEw~*lJHo@n4Q0Z@A+=((a+N?x) z@C(yd=X}&?(NoiV7h>`9Ux-a*ToqgUBN0|N{CZV47y`8q&iqJBjOY&ZxG|L=cs0H( z!ovzgrtN}SXcoG%G&G|y;J1B@=~I<)XB@zyZ&9nEB|fguHJGcb+|r7UagtRH8hEg3 zTRdSbE8F+0#TpKn{Ua&_P49z`=llJ9uZI7jbvUnWnzfz##TbhtHn4@P#NJ%Z&(D~b z&XW%H-MlO;wdj2| z>^s>t$B;u!Y2++yE`ockcdEi6%L*tz8jW=Yo+Z((#2^p4xUjsHj{f#;ZFzsb%}>Qk zKK@Jte85@%AhRDrE_@xxwoGEo)uBzMIbys_xLWcFsVzBu+-b9sppipV5V7owb4%0a zs^ZK@vpoE}vY*p>z$dxeenII6v|3Gj>3s+m*s1nLd-1lkT{fv-qToO+Hmg{!9iH6@ z-4|R)tG&=OBvR`8dKm*yUs1l--=lp3%+!}n_*cMc5=kxps!9H82C+ftK=~NJ9T^UQ zY*H7@fJBiMu1!4!L5+F4y;~d7dQqx*PJ5pF5G}M9qmK`v8;6#WkLm6ys_-(NNDM~2 zu^{&}m4}vx8&qLuyUINhLdvBHitnG?C(&3>!+Z|gScG0`ZHm2I{by)R|E5euYT)C7X+dhEael2=`&&exxoC9 z0_=uR|7Q@bx8(XZDn!`jJ`W*{G;$~2%3Xj4F!W~%)yZMwq%imSFazl#frJ)KK`Nm@ zFMefaC~+%?XNEW`qC=e<#^H+6xo}e4z}Pkb$l!zCb4J3M8uXJ;m&GzIfZj!OMyQ7M z6dHQSYyZYFz?-6nJ&tsF_Ky#I0`WYMp0Vmf_5}3-|8-?g((SYD50plS6I+XKDT_bs z=M^|lKdJ2Rl)geiBg)W=WY<_7;5})pPpR+) zK@-?0L&+hHM4#4TO+gqGFvB_0nmoY;;>B{k%yA=PJ1fq3-oeXf{La@M5$Y zRdNpQpAwvmXK#+BZ!X3NB5h-nzH+r+yjF+TYxS<=nAQu9fZKJHwiy#zB)9_FAn4F- zXjt_djEqu}L+g*E6vr$~YC=6z3@tji9V5V%lrXktDJ86HTRYhc@Jn_vC1CYrCxvYi z98Sjf(JTkF$wW|aQ}>0Wc38r&2eEe}hnS>1k7e;+L~ymiRI_WGT|Xz9rShPa@Xfa- zw7-dC5;UKSs#ll6s4=EIBYgHBO)X|1&#*S<8lXbWi&t4rCu#5Ypn0c}@!Lr;LAhG) z^uKH3=M9E0anPJ?(Wd^Rvd<`erj~WU*#fdTw#33YN859?K2bA6^<_G^T z`Kl>gU>dLKBHr8~sz5OL0`8A^%ML_CLkT|WiRaf_jB*omCO1~s<}njJi5LOb?$ESS zy8W&3pER}KNqU=Bzc=-#&CZXRuE$N~F;jTl^xUkAH&D8;G>ZAel^(ugO0PoH^!=A_ za zhASO@Tle9$d}4jhofFQ?xWggg_wde+P!);BF7mrCrdSjliHE_KTh>VY&$y0xj%3#$yZ%S(jj=4@ zgKx>uDxmd3>)J~Hs(H%`tqgCywqE#Q>x*Z<6~=uZfXxte(c)i5{7lnFm_-RSR%Z@X zAwFuP$&?j^G`Y$lX@bkQ9pjkVxcpFKAWGJJh=@U+W6QnWVQF;3xCrYWgj{&M)2yxN&}Rz0z-c3tb7UE!!IeJv#b~ z^W z+!X|?Q&F7z0!xb6dgH*BZYK0N-6BGcy@F{Ms{G~Zow#!B-6Q%$+r$_(+3c@3H$cAK zP>)_~_l##Hn$T3{r?zc^**6%p19lMe1zR4$80RN8xzxr)Be4571kYgUAHA)*E*?la z{qArym>oT3&C_;hGEq4ri&NvIM~^Rc2Hi+k-IIaI{%U_0y9U$OfQTwna+5h$G^W*t zS`)jRPVAp6@vIE(a-Y)g#$K`Ad|L(m__+Ew0~c$yZz^?{)@ubHh||22L;Tv_0R4v9 z3_*InjFuo6gMl75!GjU8kK&TW_g9V(u~;P;16HyT#@Vne40ecI+gKJ_XVUNph9?w^ z5$d`TZ#~9!*!Dz}Xu4MPCOsC1&5dz+)fmu&$qt8|K(wXdfH2j1yJG|w&UzAF?eM7Gzx+ZAmLboS?f`&j~9xGYTE)cpIsa#DAXblx{QW2@nV08UA$;zenn|@Qt*rH z^cZkP4Jo|h#Ws?8TB-$YWh}V{=uUrkyW7z21QHB6;+&5kqy;ef+`jUZY(Gi-`l((r zs6vslJSm&WD^++A1qF;QvCXLV`jQSnHZ?T^!x7Y3T)J$dxXUHf{=8&Yx9^fzi@3Kj)i6vK zp+&sJ{;vi@E%gtvQB}?oz&5e_zL0%N@(>}^0Ry!kEF#DJgIk7Tj(DztaoPL~>;2$R z)`fjrwRfjg+^G7qf+T!w!%HsH-j~^#74ZwoKZ+U)4-$_+Qk!3}M*=l>%Yryt!U#@N z?YtvRwSLz_0q6L{oiA7JvgEi)Ub2d5d@M&B$Jfz@GTjhSSBR=Wx479t&LJuYpOOeC z1uV()6UBL45ns2-byV74V^?7EXeH>D_48LM|0bQk74oQbkM{qd7c8BWLUxa4L7-m$ zYOhp!rcY|O{WUGt4IMU)9npHW81NUkE5i%O=lbcs!yMpayE-aYJesI=u{+OP%b5Bl zYMPd8f6~Fr5}&7>1ihwO%=OGP43#-{pw`POF+0w{P;otW6Rd1G~+k48q}w2H31WI?`YhI><`!T2)4NGdWCM5$Tf+={)~CX zO&CKd96MtNOK5QM%^Swu_yhT2+LF`9jRH3^li@MM2giF7cvgu1+0=Yc_8S$0Y-Yfs z(5=MHR~h+49mZ}G(a-fkbX@?SqfbN?;tnVE2V8dIjsBpo(w}XpCNne1(no+x%4~gAM-v|)O!o}O1?d+x{zME z@Av8DErG@1p3R|cfKVNjbNp%QIEKjv)yZX+7pz6uo9<8_^bQ=4N6K8-cD0{eYr+&L zhN>P8+glFszai)!g#2NK=y*vSPuQY8>>i#c#lV#d1VUW=@S%p^_Y1b9N0i&JZm=Qg1&F)(KnE60f1xFHIo_TJP?@ipR3a zw5_O@;#oh)^+#PZd{bTF(q^K)nG2#^J|00kEFbPfiQVxcX|_OLh1+j7&EDJXl^UL} z>R_KXq>u9F7&3I*lD-#_zbKXK8_b)sfNa!3cD)4O5i`ADuc!?nNu5I+Yvb}ApMT5Q zn+@RjIyxp?<=qVl9tZIgHu<}-T0zjkRs@|K0gWAh%7mAxWCo#$AyhHxg_3#mu4CEe?TAO1-BCnhxV^2Vk-BtcW%%^9pMixL9!O=dF;~B zy!8ue!nwB4nh4=JwjYK%mXHUY} zXiU)WmH57O{f=P1I^G{d{N*jQQ|*Hgn`xz(jGg)eYU$#&q9Z#A5{JF){r+2hb#0oHa)wSc7YGPJApZt z>D~Qhh2{Qk0oNwiDxQVdBf)t^t2|4SXD-iM(j-4qW@|oSZ7t2-nc(ft=NQYPvsMxh z$m0B|Pb^CaQD-L8NosvD;ow4djeW#ITQeHwJ@1jEFUuZJ!o1$Gj1_@wc4FK z0CX)9mDo17BU=HvmLZ5iX83$oO^av?Ee~-!%Mj7k9zEz%hY&PLu8F~vw#gcAVC0+; z%yrj!!9v_(FLC!v%gg;`OINx3U69#7ti4Hupy9J!y1B~Vxrd{5-JAP7$5QW*93J;= z(nVlWymrDufwPTOeNUf1SPb&B{JA|7{h4@V(({-3tMfbgpf%B8A^PSVy9im6wVvfm zxZsrPb(tnux`)ZzB=SiQq1yIlCzi*t^U`!;h|)uwH@4F2EfP0}lZo2@|!Cj`8n3&6TI2a7Zi zI8<5Umv9@SRSnrQW#LN%^%q7PZb*cO?GNBs#4pSQG_d=Zw6|wzxH(=A+wuNj_ObEd zpg%B^;My_AK79Po( zZxJ3GD}F~A!oGM&`@y{hr)Hw{``8l@%A}-^5vMnZ%yAFf4(;c59OtFG3<=#b>E zqd8O0u*4IxGn0l?o9!>W?*3X~67zOu0ki!k0o0H37FBg_Qgb4MzJh-!LS#zSv5#YL z`TZqOs~IUwDAhvdo|+ggRJi$_he{b%Ry17af z(46^(Dm=*0z>%jlm+0K3I{1~$3K@q#jMABc>d$pyI#t%|Tebg&4&JS%8qq0Q4d#Wd zW#&eVC4anISlWuJP%NubvD#Y++HgBfAe>@{Y9E39Kfl+FIS{-*(9VLdSYU#YRg>B$ z=BMof`%n^aod<$+P;!EmtCM%<#uMRVc?ci zs^M8v68V0$$`@^;S=Wa!H0r@2uFDVptHGIb^(x_{+DlaPQl)QFw9$`Ma8KH_cQYZY z!Aw2LSz#!ArQDs`-bJ?sSLx<8 zTHh(8#>2uhlSPwIc{6qZ+Om@9IYEC^s?RpF%oMSeM~@Y-kFfiuU>}iz{XhoxJzAfg zfxTH1uj_Lx6Fqcp0-cn?4kV)K*MGKQ8CBB*cb?~UGzsH)vOchMK=Huv0CS)@U>pfY zdt(tK3exI)v7l@rKc3A|j`n0qfrP}TIrmW474)Hqaw`B9RZ(?v7gbC+T$&cbO|kRB znP!HW2_)8x`g29W*RZoMuZ_A3>>OERt}%ENMziV{MwoTJI+>sxC;)`wf6|NtT^{ZA zN{k(&(L|Rs+$wh4?oTwPP81pB-tAx10lrZc3xwTD5|qMtvCCt@=sr1Sv?ZQ2}Ok5_oW~ z$5(eWQ+O*3sBwEJS4e>pP$g|9X}+{VX(LLb={+z$*sjXboM|(+n%d?1tnp^1*~I*a zmT|90`$(g=Y9_WFd=ThbpGjLuQe68{SFtBde{a`n+qWVavbVODEAL90^gQ6u?_1C5 zh(Ey%^#$%c;?7QecDlr)P}4iyS?=}p9(T^ADV`pTB5tBfbLvpOhsiXKembfL@n# z=a0Cvb?5fA6FlVRIFW2;+S0P>l1dw_5o0=F* z1vKKp*mONoN?O07`AJ!*itLa88O3V?m1+Uu;8lmEW#dZ1iU|Neva zHsBnug7Rh$MXj~}QlFl}bhTz*0J2&P&zHboKxFj~ps)p>UaI?K7)|q#1bP>v@xdrp zHAZ28a9LY+lK{dX5J0#xQbC}iZk1zM7cl!d1_OeaBXVKWGXSsuTN<5F2F(N7dk!7Q zZmRWvzcdHsmjz0lVf_^MZ+{kF`fB=g@3ydj$LuzV-D(R(yizfjggd5*A{Nu&1ak#` zn%lt-?xCLT98Kt8I5HuB<3x0XN=6s;_^C!I|KbP>^#5aJy4qZ(9K7j7J=)!0o+fpA z_EgwXR%JNDes0BBb~)Q4CK@~7lld5D{ZtlLGHT!Y5v|pxghF%*JyhSWL3dF z!gBTjWH2bQ;stq;DLVS0OaQFKYC_VbecW*eArdJWLOZ(}T$k41lJv5D@1*ri`v^sJ z0$Cb$CSoIY_A#xF>ovLwBJ?XNxJ==^nD8UPTu4wNTxnZISqLJ-4I)IEjLGm2{{Vj| znnH&zHDmC$mYKcE_)U9`*+-W~=(rH~O%@ks7d~5~8Y;JYf>NT~Ko88mVlJrW;DYPU zd@jmG6WNTNZ|P{NeG4R03p|-@$6u+BV`ObmKey>sSjYUFvcsTmxCY~`bqV=$?r9(Sech$N&Vc^#6YH`!Gfa z1kp)S@=+&h(k~-XUz{68d_zy*!zzz{m^O94GnXsmav#ifwGU?-fGZM2>U6TgHoq^s87k#6rVw8zo>X9wQPwwff>wjgfLcZhcb+}vM|N3=GU z0ns*0DYOQ*bg>^4pw!-t7q}9;r8)U=eqVbKbiha{`Gaf}%3uT9Hbg1HN?;OQSmQ5S zNyv>Ph(2yU(F_(&@<)7R0BE{T@Vki1)?paYI7!?i|F*0yPqX2cx_lb-3n&b!P1VjY zp}k(2uVkd{{pr*hb<=5%JExN-zukSqvwzhR#TBGGBB%{|lu*l{?WsXGE(2#U%ct7h zP_dGmNd%JutM?P=#|Vx3rwrw1F{p-gWlMre(PT-%T%WIjJQ3xR_*2CgLPbtb!akfrvWT9&Q(NzPB_AG!O&jb z(;-d(;aV_33=WrRX@h@P6!Dq7xJNV{RYbnT4iY|`j6hkGNQZt-aMI^UhMJyY`ph!D zyvCj>SeEQguYNsp6mkh&xp1w#3T=KMA^z)Xf>$TqB z^Zrx(8d77s6Cb9=>hd$|+hq@z&phNU=MA3vn$oEKKWYWJ#1cHI4# z-2Db8y%Hh^^aP0(R%q%|t>WwS+ z1f?&8$%0ta0mYx>XAIQJ&lQY@PT2RqY~9?ekQPhI+h{6g(o}ssjI*1x9nIwz=)AYa8Q^s?L?Q*dS{@?jTYhP z7~jlr{j#Zqu7q^M=F$bNn_8C8lU*Ot+0D0FH?Op^=CUXK*Z$Lf0pDc(!U&m6zl?f6 zk9X{scKW6HU;3rGW51jj?a(iG$J_PGr=uPE<@>RDERG(H@x$#u9=Cr!d(-vH$!bH~ z8yBt$ORt8}Kkb+ADU@5JUv}HpFRRtf+x5$>X}_GS!v0pj-15)*#oyX5C#&4#tY1bm z3iv;DM*1e%weLa^d7r7q`9l)~zYH!I_?YVB*Dl`kN!2DOh|S030`}#-5b8ndEro;6~*iMcuyEc8zR5iRmQ z)PAL^eNAi_TA!O)no*uPWEYwfu2;b~$&zk`Hn!yKld^%}_Cjbm-Psx;x2x>Qw_7(` zQzm3jZf-s4zfjHbf-C*Or30s`!G-DRWHq>W;2Vk&b)p(<4(vpThyEZgC#y{}c?W`8 zR$g`yUs9;x`LKT24B8TGcFw`zqF{2_Vk5G@Sy~{tS+Eb+N(9r+93B=;AwH~d>`3Gf zPsvUB;F^Wib(!EdS}0Fa`$~z z&vAFZdhdNOqzH7+-4<1y#C9euM%BqfwsF5Y?m1N*Xig1|nUi+YNtSW_cZH};2KdMS z!SxcA&48K6)Vmqy#$JjMwZ2YvxL3;wK5!e#LTV>uw#0#<^mh9VQM>t;(r-j+C(k>W zW#M^k*O=X*)W(vf>b+sTxKO<}SFds|RU3=dduxlD3)FE400s3zmm5FcDI+2-L%r1z z5uMrfyDGc6vUPJ{may}+xU&yl(Dc@2YH+84@2bJEfwL6!TN72qJ#op@|apn3$CxbbM8t9XLk~<_3DbKR{#k zz&1df|C4M4oolLz@LckGybU_h>R_G33{?leB?ANM_$$dkP_uF90zajQcF1xo)%{Ux zOszsp_rX}W5Yz14m>n=aauS)f9VJ%Gl2)3FwCBBxy1kc>+tFOq4kl8e zfYm}ji+u>kjn;1?_-j(S&W6`Bx4Qj~Vr1LCYlFK9C#6wWMo9!iO#}`JN<+T=1N+zo zjK0GlO3>wCpSte3v?=C!$v3ojsqBb(h3!vbD)7gYn5Dvh$qUN^IVO9Y9*V`7A1$GY z@G^6=gPlq72B*!Y>;bTfi**Ymz$Sa5*w3Gn|GtycnJLG7JFxFuzwFY=O8EnD9R zemGk^-N|kgE4Uaa1`C-xbD%@*|orNCug)mu+oh^{Q0i?Si20u?T9s>OP zr>p(+<|yNL?0}`c=$b0;RoMF2;pRo7MfkI#@lCXKJSn&C<4QIdKb{V|`6$9vm}qfo z`cF`9+5$x_;aq&e_0^a=@8cyGXzyN>DLeY`{oZZr^ikO~?6hD+;qg!X!fGsEZ@@-n zf;9f^Hn_(Yo)M0i>zrhkUM`H*aA!<6^9kkB8~z` zQ=>Zt55r3^T)!BDlL%=piD>SKjDo;DXGvIVmH<<(0gv54Pa#M1ytgsSVF^BEynKv> z%TCB_o+lD)d)`~ZC~1puaTwUPaxN(66eirFl}U&_Jzd@sBp0;1*_ zfkP5^6cM8IqRat&`VELrF|n~Jg=NA$NDnhN4Ei6|FM%}p2Ata5VgBL1uZ{>j3qT&a z_G%|+8Ug{Jv*zi?wgd8yqCt@NevU*2=kpP&M%&>0s%m0*yd9*&4pNlL#OBaJ+vcDx zJ81L&1=hHbY{Wpq!3%6#;r*jXMSz!G*%o`FxkI8r zJZKNdt{eR9=5?Lj3})BP?Aq~w-ODSEHgfd}fwWF6c<&#kneA@5Jw>LVcFM1Y8P%2} zmRE(vCWrbx05cq`%s3`5>pU#48fwFYKSW{8ABrbH9ARbv#|R(prG52&wV-ei!rfZ= z@ILtZK`$J9I+FPtXktXLjMz4>s^9j?HQAS@-K$S8t zvWw0f%Ul6pQ~}Q8bKsIdcem#{z|ft!?xZWXpRxT1*aMdzQ94*3QY&;V>!`C~mTlil zc{Nev?c*73ch>)^zpwSpS{(q%VU7sNGHjRY7mR)=R7=&ds4v5Ru3*PN8%u9(D4i9) zSyZL};T69UdH3m_{OWib%=z)6{HTL&fiDpFM$80`UJ>S026FTBLYCQJ#7yrU&CM?s z^h86HwT@w)m?K69^?LL@vNxqRHMj=6X$!fcT+5Z*d^5~ljVscK-27mkoqymm;FB61 zqK5Q&gqP4*XkmZ*Zwh5Xf`{?6$F4Tt4BcwISsj&;;Mb_^W=VEkkX>iXb#JeDjYS62 zFA_vo7x)``1-KYRa}=1cutx%1N6bm!gvhU%?w$OgTw)cSfL3`tE1ErN&Rk(m$U6N~ zleYEo_Bjm~f}H|9qNe(aN;kgE^%pi7`J0gPB)h)%+U9Jp__M$a z*#T3w@Et)@bq;vEW_Npl_Xtwmf$@1g5mlII{uI<`r?%zRnstL!c%mbf39xwik9`LV z{~$frGo^TjaOzLT{CjUZ`eYd5wCgho7B9QPdzJnz5l)Q$jP}XYW5?-L{x^k*^}O$SKMRQ4 z<(q+^>{n5$Bf>F90omK`CRI9oT-_KxCKT@TYVW_OqrKv%V((RdIdZ_EB!@!Q6v(np zCMIlnSrX7=M`Z)`&9yWFx;Etr3~rnhFk?$)KOBVSPrx^G+z>ScfHuKipmVIeD$r{* z#@R$dpXW195@?JHf*jCgEmt`@9Ti`U@EC-m{6Y3|t&dknV9EtKS`K;Kw9iIvxDpl2 zWDsAf{-TcbivR9=e+V4NQK2}LL)Qb!*3flt2f1MgPlRc=G!rG!XHOIJRi>C=|0;2&5s(v04pjKjC`4de9dG$Zpd(SXCifiw;tGYVw9B0qWp3&r}k!GZkG@}dxL{28yB#B^f1ROZdAaXQ_ z3_XvT{dGC4dr}x8^p6=@D-CbQ>UA1b( z|GFuBTRzYt0v|q8U$@e)+a#ly#n!!3{!!tts@*nS#y@xh%3 zN&l+L?6^Ep9X4oXmpE1*QAI9Mb$mbzjqUNyUx|_*o&ul9#7=O9bTN(A$swG z%!BB~>*5zD?eop9eVc2a>Dp(w&Qq@atQ)@W+HbhoTU~qX#b>PtZ+W=pUjG2Widxr8 z97NuHLqBLs0=b{^+PfRlvhk*G%WI1Zj0{OTdhM*>C<)Vjr-}IO?^xLz9cv8+aN!Q@ zB2%Q~P6fH9l{)||u}SirGHzJl^~o>}`{(rAg9sMF3NmnYK9RLsL(GGXWEpe9&2URM zri?bG42#^01|Nx?qZXVSY`Yn^DK|*iRj+`PX?`0x^oNWD&iLkPh)I+UbH`I8{Arnf z->w}bYvo_ZvSA*smqL)Tr-j!2EW|;w2n$uw!E4IKu>Oha$Jdiw+xk5u4|ACNgQO1X zvgP7kDtm(pl1bC3Tev*EkJI4)OcUkQq>I37^J>k|f`hQ9k+Q+Q*rYEq?46gWEfD;H zAM;gcKlcgUWTfU*wgGbyS35=^RC6ZLhLEo zjvAw^xNa(oDGZrNla9P2%QG5vu*$Yyx9vA=`$u|VS-27YpA%b5PG zVoIYvDxf7o1vdhtNg&wUiV!|xUZ5U1n+tJ((+|>7bz zk(7Oc9Tl^zELw|O2+0-y6n7I$WJYi0ZEb*|!WkNB;#3P*Zf*Xg!I?}E9RTBzF~yr3 zLo~jCQNtL+VbFd21#4$#0)!sW@SxxYI6Z3i5<$Hru)W?Es6p(8E#Hi2LpIviP3*F= zg!nz{5va=K$hyeNpyKE6(TTgc9slYSdBaj&ai2sG2^c!TmkJc;^5zzFK)ci4{p0Vp z4AFt_mW%eq?fR_j(Rd+9?7m<0%NWb)^UxuqHA;HAD)I|F(oTGeOb*62XWHA5-co(> z;~tWpCwA^JURF>X59C27#azR}?=Ij$2e(E0%0bOm^%-z8q3OFJ4Sh}THMD0E`kVY} z-gft_DJ$SABPAIkTW^e4_Xir^LhQHJLuwF&IdoxS=8miGimGlpXq;7jMOnjCy$My% z)0+>?PognQZd_-(^TDJ$M`CU%$0{0z3*(-N)@CvgusnznqQcUG&a5CJRrHW+)SHnk zf`C`9$snC#AEGU5=s~=@ zVXID%7b8yE8jc{3hSiB!6Kjh64W5^;J+D`uw?EH9Kh{jH)!|b7EVPi>COcW8&Zzzl zJuLN)Rf=t!AjYu}pN=1K@zinmJ9 zf~*P}^7ZYt($~$frQ%MM^+PA&I>Zz>ej}o%O~&F*-6DS{13NFm3F&obWt_YNcbq5v zC%@q#4mEA2eF6p{{k(;9-t%W!}LkEo|NF{ zHq*npaj075Mq_r7I#(U0GCNq!TheiP-J*VB{a2lye3EaDBnrdP>IC$xm1AM6=)+V^ z0Kmr4ElP(u=0H2*{`tOO2H_`YeO^uM&~W^i#o^qsg9SCy!%>)=neW%Azo4Am-fF%{ z%*g^by9ka=UFBIP!1<4deJgAk&LALWOJ@r_Dr=x z7rAug5u=|p#V3qAH!}k^uz;<}5q5AegM4cfa+Cp!ESvY$3ePv`Ydt^N#CIj|1_>iR zax&sbO*mfEEt3nAy#ZK`fn@*qWH-hRMv^F;+t>z#x6X4jZsK1$i&D)w4k|7>BO1Uc zZFt5_JnQ1K^NL&R%TE(=Uw#GG%SN@AMohfICKBfetrzRKcMYF$AHB7`r8!u=IO zS+^*ZG>-ihcT-l7qO(Z*W$#VLYzrG%;U?+(xr<`L?amSM9q;4F`vBC>W}pnNu-(xkO=JEL-QPy$5W(07p;?5~fL+}*L{t^!6 zu4C_~!2|)>fc_V}xO5llRubc;u_&H|vBYVjVEH>yL^=3kVxv4e@8(cbc?bqfLpUjn zGmI_(FGz%iBfC7M)ac~6L)^z$*zlM>fgzB-Qg(^Xx{z5nDaUcvzeAPwv}NMLb~sB_ z2JPW_tOvobL}5jFmdG8_FrRqRT_8$3I7YpPsxW;yf{iy1GowzoNDUrd!=fRUYmvj- zkZR>cZWPpD`2r94@GC{jTI7H$@o#N&y3V|A$Ua;}x><%A_DC_K2sCu^SwenMdaH11OkNq-QJJI{)A6^2Stlw&0;B<&Xp8GXtf_ny@B<=wmc+O;Z1>ea1 z$i}StcgH%*Z8NQCo=Qi%9ml!Bv95En8w@uLgr#J~b?Z?fr6!z@Ubs#71)G6o2p*wb z>PmDv7pwjsjAuog0Cg_(t65suKhfc{rr8C zKlJtFLxP*sxGPnE(E4M0wmmCg%g@fw@-b#L9Ii+S=7N#sfdhl`AZPN`I_D?BX)3Jq zD_E22(Z~OU3fx(I@3wqhxv{?|nZz1BDG3Zl-Ys1#E1`BL1zER0=ui8**C&byZ@#lp zC-yj;;&8ANOK zUyUYW?1dUT(bWL<<5Tgxem0)uJ4V;evzp&)w;7rp z{8F49^jG~|Hzcg3Z4=vY^^WCD6A4E2Kefj9UMzWV@_lqc5&3V>Y-Dc-ms$W5AmKJT zWn|th)jU+8zQ2W+fP|KD#}nE%c(h{H08D)&j^}LAOgyDV3ul64lZnk@&Gz0PQ=9ZM zH3k2v=+=eDs|C!9gNp|Nmv|3kOy#%q=9|q08A~E*qD8`XHqGOPpVoO8(BgJ{RGI3R z*8EYvhO1ynSH&4cFdU7ZtmdOf)T75+vm>FBjW z_Pv(*7Dy$5_cJuM0YRO>FE zIf%|hU5IlLpj<$1U820Dlwlfj?j&b1%Z2s}2ZHus07gkTV-CM%a+I)qGxh%k;c(lhWkKxkuiTD6TfW z4-))j*uXh#=ZH%XYw$MuQ10slta_ZYKy3~BVT0busrYkrO92L+h;sWr)i>bL;rd{q_RV)_L#P#hO^~&6z&7n)SPe%JqHaM1y?|j}16q5n0 z1MmCRIS57)y+z1raXKE3MJIipT?WX^Re!Yo2W@`Qob&3MYF})7Jgb;0(O26{@2~fe zc#^7Vw`ZC*`*h|Kl4coU*tfqQkF4kao00V^`5-d1cC;Qgc_7%{)Zt&nwo3W=@Vd%g zKfc~ahch<7nvrC2S@Dyi40P1>GR$tm;%%;0-gT6Oh?w;Q?EUov46$Se{7~K406XQs z8DJ-?+6co5mB~1F)2Q$8&;iKROdv1)RO=UShEgJ~p5@2^Q{zPy&Figr5v*a} zmISJvDsyB$b42Dz6JLe8u*2NzInI=8QA{&&&H>ihzEKl4 z8GagFXd2Wb5K!}|&iq+B59+3^m;o|-<{-8$(P+sD=54_HuE3c#{gZeGjp%*#5(SUj z$Jd?Vd`oQj zwikL?-&8F&W~xpjHYw!hW%_k{DGX7oWp*;S5VE8gZ+k>21w;-R)1fYTY$>7ru(DQo z4S$C1^d5KIC!F+?kPr7M$A8&TFFE#T9wOua+x7qD8X+|=<5?jL;=prma-FNzx``Lv ziP}HU*w+{zZb~f$zr>*TyugH)ab~w099!qy17sseWJu74h1!ke7>!) zZIx9!k{={Y5IBXJ8GHZrGC^0Pq5C9ZzY&T@J-k_D#JRlHM#qBW?gR z7~j;uzKu@kii|troi8izArq|2fVCFQ7aetv=dVI&_OA4T-=N7$ z_}NTt+HVt2`-yO5wQ0Wt4y@clG_pM*sz2M1;oTxs=#u4cO)Om6l);CivkEj!bWW4# zD#j|23Lwu(Z!c0Wn8U>H)j!^`-cfmEP#E5A!M8w+FyowDOCIzEQVfH3KZKHQb8mjo z0$gkhtG?o!f|Ot|cqGO6H)Z{mDXc#>Nes5lZI=3`?n3`dpGj(MeA@hUHy;pTOti3W zoju=7@>&S}>b57cOlHv5DsPa$4!*HBOn{0!d4{tYUV}+INir~9S*KH%b6_%=2KOp) z$dy6xSE82XTkNElN10D#g?|q%EBziJzU3`{CSk*A)FK8At6N{|*Uq?Ko3Nn7TDZZj zqOUYJ+8g%cET8fGC-jskcw3ytaF|F15N7Ql=i`jmCc-%wnT<7x_X35qm$j@x-J!n{ zb9s4!xsHuxs+J7Hx@x7TTl=S*Q9NK2tiIFfM}%WP&Prpb z!LprUL8V8LUpx7(zXAqNp>V)wj8RbU^!T05B18((5-d{s7YT?f)>wCwRIQPJm-&k~ z|5oMzy_HDi72=4hN``DJJbjia6WMR+#7-Drswbe^Bbf0Vl{!Lshf54LBT2F$O9zYa zE?JY)jZV>R##guTGNvnP_^X8nk%1?Eo+yd?P#h81xMrOf?{$V4 zwoe3Nq!^tk5^hJ%d9*zd&qe1?rZG}=H?E-v^W7Lgb@~83#Nx%PNu58ZO0{sOXkU)@ zUyJs@K`=7%$J*9inusUy)iNQWfsA}O1fU`LO8JwuIgwFA023>ld0%-L=pcsp!{}s& zz(;(#!YqFAn4ROh#5|mTRgmPlD+&D2{MrY*NkGEjilVQEGurDa9$KOOSHzSbqGalX z**O>WqO)22O(yV7)Lpu^V}$ME5Ii>E?G_v)C{ zXSErYOhXe8Jw_u6x)`6bn#yvdR(4BSvhp1yxM~Wz!y^oN)H+Vr{u#QC8INOOV>-E* z)f1DrWG~=Td=o8Z7djR6=M0N1a@*$L2a9pA=-3^dH9GsL__Q|j(uWhoBj077c|z;0 z^^ZlW>45pW7iYW3YKYG>q1(9pXE5ytgxdbuvO81!k27!nh*3lVMEM9%tzR3 zQnewvKP>o^c!=JFZ&=K^k^{o(;tMUnQ9bq*KKL1R5MO7J3gaSiSkWrZ1TyR)Wxc4# zn2S2v+Xq0dtp2*#9&I4p?ITp`0DM_tE0Tbxg-L)@8FcgwuF#2okV{%?r0{m}muZW8 z?NntBLc-veyg81M(!ium;J_tut2|7);ox`wo5oC|F>jKW4EP-y^K0dSXGwE_5An`Y z_RLf}ElEZ#p&1GAzI8c7k7(fCL$@@8RedZk0QedeJvDC4Ny;n$oE+3EX%Bv%QG1e% zTvTih&x_h~wjKA1q3E@WOB6k?aKG6xDpUUVy&(E~YwH$V48?CVz+q<+OAKM*$XoU! z+B}Zuk#?TdUCDGZmq`6Zn-8`6K&Rf&$@IwQSAML6Pqq4|pqo?*5b?U&cia!#&o#iE zAx}m0W*C_PmFeMv;Z+K_i02Z@X<2ZFGNT=}Bl=$;FYNE5D3V~at>alZKAMFg`@B^w zvfz(eA7OcAu}`XV?c~Ymbiut%CJVLYXybSe4&bvKE%RGh7VvB``-B)ZY$wEM-)L{x z*U6~C;RZJo?G^n#>olxF0F>xtG5tH+xyw%a;SF}>0fE0SzG&;ZWP+qdG0B6N;E*I4 z*E;l&uu?4Z=o#_tW4O-bjmi>F$v5q@%H7sC5C#}WK|F^l;>r=d;9%=Sd9_LHFoLiQW5tx^WiMzq4llz-}+xDSgHFWB3kD2q_ZsTCxUalw`U<)INfAa>+})i4QLUrc&y zgS#;v2_*&@yq0jpF|Q?DmYQ3fQ?wfTQ=kZ?{Pd`Gn<7qthLSZgPojd0RqA*$7&(2x z{{FsB+U;~3ic_K<)B2#e!{(XsF{$gvewJm4h-S^jI+L*Sw`l7qlg^?gMNdlRr4TPT zQep!Cz?u5wesCzv1z`m$e3d3Rpgd!|9kw6?Rq0b`E?76va!RZBroA2U!234z0X}Mi z9!90tE(0%bZ((AvuEAZnuEoNK&N6J#KwZe7fjOLj^T4?H>Y0*JO={hSs}WaZIPc0; zNHP;(UTWN69+yC4S50e72;R+ar+6*@l!8@ciyFQaO_9L1&$oJxOB?*X;cx%D<4Iqr zPwx5O);Tq@Z=pPGp^NXy+oWU@3ijSt;)XBY$yzys-T#Fx|DSv2|9fxz|8;&oDnIXw z|NHv$3#0a4a5~~qJBLB57H-MD03Nrp$T^pA8(MUGLx&)nR62D}R%HQ$&c_295{~}V zvJS}LtenYF?nSVy2@6i}oT+zk(7!KlkY zXX3REbDw2>4N)o+TU{1!$j9zZ6=OhMHO|&@!GF97(I2l|<+O-Y6cCjQ-hK{V#F?D+ zaai|TC8P!rMJzp{`Q#B7D)R%u=YVmHtUHHoP<3p**^qU1EfrdkwmFj)vKy_H`$v_1UM22G+mUDn^mxe%fd3-Z5;cKD zIE2|@tYX}y61e6%5mk1@1s%gGkVcrvIh8l}QM*LAHATbYr_nx!L-gZg%jJ^GY|t_B zNld}H@!}WI5PA4jt^EqO9faW|5|Zbvts8 z!mZ9twN$Vt#xK1ogN<8fGgvr-8wfa$8&uI5SFyWw27=HARkXKGSYO3vaTOayV~Q$T zsp5(+UOw8oiCiw-*)k&<2%@1=gIh;?8MtatlpAWWaUw~{KEge~!TRK9lLXf!avq!{ zua8)ZiO!G*EZ1#@iMlhnLL!lEtWBI}YZK>EiSCPL4hH!S1Aw|L9=AKZ3c*)-_fBj* zmdR(G3ugpZv^mGL++aTm%F@k8NNAg^;@cy1{O95~H4@HZvNLULfy(R2`b-{XI@IZu=|ZxCorlo4IFvDuEw-iIZ%YNa z#&OjRf2r_Gdv~%c6{N>xqm{s53lILZ(ywCikTG=^LPY~2tpn*un(tunYPQGeL*UgL zxj?#Mv05Fu-$xyh5s*-FbD%0=509XFqn^3TWM0dZAImv^Q|+&1DjX~-v|q039?O}t z>U&>rtaZ~UB5ns;8(ZWHAq*Yy14M=6*x|K@AcG{}pixj?qwh6Wi}Lgi9n{M9S_wus z7#PcmvBPE7I2>e9&ZX^n@PyZ*V*np>6vEKpigYIS$RxbfuCGb1mf$sGULmpNM4fT> zTnPk`0S^1_Abn!ez8`XglOUXY;1%9b&g%qnIf*Gr^N8*>iF)&(F%Ns`rAaWcipd!; ztD>I$CLG%j)Gj0hhI6^3#<}jHPgQ!Y(tpB&?r~v*xUIsPEJvhe;2X7^L z=b~o+i8n&M=~Sfk@D>qj@|g^X#oDix_$c$rXUDG$FVCB94#!DA?Vo_QS_I<7M#0A3 zEDf-Y`2B)6BZeR+c@qz5)Ujtm!+jX^O(18p@LZVg>=Avz zJM`AK%LiPetF`iSRXZ31Qy)WHZ>ybe{!%$y`}>=y|&w4i+Sw@sa3+mG1ITcTHHWYH}w&*>mB5L}^VCrwJc zlmwm&x!99%nAvz8JGw;8cJSNi3UX<$zd`~rYFAt(S6s&x0r}443aLEl?M%-*PKC@T z1J3s+>EhnFvdP!_1Gy;mNn#KDr+l+RV7{5tyP4-~3{1}{eS)Jlv$?hb`}_wa8g^Tq zqm=uct9~eR-l#2+qZ;x06W|PV?9jN5z)5x`u(I2!D^>CWok)kL5qsbs#q(LF4vGlE zJ8Hq(GCCLO$8_zW`!n1z%~i%a357r!l-X>ekEj(tJtK)TFSy1*m~XVpNx)cAcnwh( zLow&@O~Tm(E)kQMPGfPxr6ikZmjH~JFu$^7+^2PPedwWS3RlVcm=(_Qk^Va(4?cPG=BX|g9_=q}Xka^w2l>b=x@I z;Sb4yjwYuazOI!Zpu4>E<#OW^xpAr7co{cJpzAvKCB4?=S?{>dncBf|V`r`yJNQ}c zmn$%{La*O(S4Rijl&qb&cI?vg$9_3sth%6f^H}+n+TX{HUHQt`l~H9>I(Fq)dCJ(8 zXO10=U0JEsb<3B3_>U7Ge))jaLdVZ z!b{d;)?GzjGwix`$=@rcr8EVeZo06(q(}wkHovd^LHjj;bJR71kq&t}G>g#$6#>TcVZoC91~i znyBA8HOHM>nKM8bvre=npH{r_OR~FOB}S9q!?BDxlH5A+SH+7-cU6+Nsl@Yka(ioJ z?r|0S=!$!c>}Rj+b#Lfpm0Q^xeAbg))a&2S>tECBf86cgpxmkcCq170oLSkM{;UTB zA7`DZ{*?686*;}}zm#2LBKK&o}nc96iy6@7S%p#&?vLEF2N4S(FmlhLek=<;AGau(m zXW&Cve`;2rkqve3_FQ76z&GfIu`_38h2?m@40I=W=Jx9)_jpxaSBAJrzMSWC?sIsW zNY)(p`JCaH+&P(dOZw@O{Ps+a05JTG-Pc*q$N=+BDSdO<-Dt!6<(@CypS`)PFD!Gv z6W^a=m|%puwrt;0_HQl+?oU>f{ePDIPs{qB<@8uv67loDR9ARoSuc~i40V-#{<;Dm zcBE(Dy|J9WkU#C@mG$}rPNtUG{!)Zs_wQvI2rC@FV6A~*^sRrv?Ac|#Xspsp?8K$D z3eLCv^Qgc(r5yaGK8J9WT3)X&sc&Ce?_+P>$yGNsef5SWOtFBNChF&--#A|F@TJa> z1!Tj{%)U_84}AWt@ZEa-s5Ex$Sw0s8@70UIXZ~8R->i2`_VxM-JTIZh?w05Gluqvn zf7Meux2NqRScB|8wEk3={wcZQays)5o%vMP-(XT;Y2B8HC=ru1Cbl=vSYSqL>!(;X*o~%zkQJ>a0jq~SS<hCJHB^pl$Y}tG_@(6Eojc_BIsf9~_b)8{ z;OOEHZz$v0FLCdu)v*r0T*l!9gVXuS9E^t_(KmbQ-Ss{=ZiJVG_?%48XW5yhDu21k zb>>HqHYVs-RA&GD7P;MuTasGlctt+n_DpASqT3mKKQp~Lq47M$ZbEi?db<9)8c3a@ zGY4{FT6VQv;K{R0lYXiNCDnx~%bJUogP=#aGZHgm*~;RyLR_;~2IjFIC$Cl5u7Ds8 z!@A)2DxFRlNMVQ>1=yNA7MX$}c+9c;GRbmX$uHA2o=|NHW)$sFob5dz>gw8cN4dS!Gp<|rH1c<6 zukLH??Vr#&;7%&5T({d(=r%od6ZK%oar?yP;q+v8gkJ{CgaTV-ik=#REiJq!u$I&P z(IeD!crEmGX_Y5iNr4SD*Pj`%yYXQk(2&D%)N1x1E5)n!$jVP@8`Rp#kU zh&-8z2t8kKf-=d5b=nxZJYR3@xXtqq-14hi9ILmb4fD(0zgpVW-L2(onceDjYIk>!%I*UT(>k-a zyH{yXy-&(6?TKQ+-N)VcCAEL@>({HTN4NUkHxdWvZ`t46dXw3~s6Fb;n3(vE|84&} zm2cms#`|if8YLKglx%U+qiuQ#r!0YG@vgCN_uzllc&Dk_K}E{RR&mFKM7mVifQ^aD zH0!PStru7%L)PRp$LS>a+kdj>>ikU;vws*wfSPTl;oxBW&CI3*0Nyc}`okb{$QREp z=8>86yOQU1g+?#wDxBRFp4Np+&;?x#NGCj}D}8Pk{z^-_(ie1z{h17+P6O)FGgPWU zI6Rp~uM4o{w_?U`xi-7#jnudKfIWiqHOt^5WbFv=PiQ_$6ry7BOCXvfK29{}lVn6g zq$q^=zLtOj#Ijo8O(Lc+SZme>!W0HQZwGU%%E1`kGMRL?F5_oc80#)IMNbNmFo|Q! zT+)-ipr>w0kN?Kn8Jpq%Q$ zD{;2kkrx@KQElR3_HFUrCk%3yZb)#)6yE6ygQuHyFcJ`1Xt5aiz*YP@4mG_7Z|SQ= zN(4Q|s%!>$yN1WIVL>_*1?zqW`s`n%j#7wpb%)x&sBnaTQ78zvXG*>YZqa@#S$hd^y4AsZ3{E_m{tW-}0-#F)7X&0oqj58L`N zJA51oC_xCui;jB1@t2SfN7O^aENk~MJ9(3B-+-Om{K?k$*giIWE<2XkSHP`qvqf10 z9NP;{g7^(?kx*M;9#`At2kpdj;@l=WRMDQQh28AYNDglj&KtBYByc9H%g?#ti|)8F zpW0nx!{q3gbKOEQC5LLz0)VRnqd5Mu|A#Gs(HdtbH2v2FYPm5N8+EI3{;A9nx^CFC z>Ir55Au`YmbUhvWF>fi^QOFUH)+9`IFEP#|PU>k#KSGR|y~+Ux$g}QchJ;pYJK#n0BwrH13Bf&x%K(SlTN3%-`QCfc2SGb`zoY*wIL5}@<>=e- z^>c1>^v#rJrK7Kx@)`$K3m)nP=b6F;@oYpiS6Lbou!XfUAb*?#sAQy{jk~)q>h$dT zJ(!v!o22ILY8{iwlL{GN7@hxPI<+P}E`j^GR4nWFp|K`(7T%nk8DVh6p5_NXrw`&I zE>f4&yi`UG8@Ak|9qayVo!^9J1HrvgkF(WmzuEWkr6Abb1mkcT6v2HPXIp2RU|T1f z+!-oRwbjgK+e6g}J_F*uo5 z(4moChsJuXDD>XZ`C1v&%72fAU5%Z%)O_iRy0=kaf{y2*UKh-aUWUq-hdD@B8=MOw z{}9*y2eEGUuSLK6nX-;5Hym5=PACNUM`e#M1lJXU8**uvaeq@zUzsz%$?4TOvnHoc z&zUoFdTGuq%jsuw?z1`l`<%Hur~i^OujTZyIddF%g3j56^s<6Jw_tbJZxXsnDlsoJ zs@v0EVtfNb0`wehKbBRW;@XpHcqZjP3mLN?%BuHuc3o=EKgvPr$yDz5S@ot)J(+5_ zFPVNo^j-|)ToP0v$^tI&&F!gXrzzz-&1pZ;3;NC6)Y)l&Ng7=cYNGf#=Ioq2XGywn zf&5g|>hzpce_?v-U&=xKuhO}rb37;at91GJRQe?RrA3b>&ml@jd%u>eQrD#&Ltd&c zJuvx$nu7P4F#hn5X;KvnL{BsD&fSEm4C;xQ1M}Y@a6dk~iJ7Pe^r-$uCRgCz2GdVK z7=97&Lo39oEBcBsTaFmsD8INd9yd4#`i~?Htx=346~SCisv+$Ypr%0A+Ovp5NGVrA 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
    pbyXXCg>zVfNN7S+`xNRJgo>ym= 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

    On1|?jvHMK;kn!7U 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 z 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
    2k===a6x%TjO@4_Ry!Dq7=UOO_UhYk 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 SdX!Uk&3H4iTIx(-H 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

    _yj%3z%Zw!q&x{m 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�IMbl?Po4{Bw#Zj|WV z;rC2$f6!yJi&5vzsB^G02|wY< z&K%LyrzKPj%SXMgE0n{SA^^~?4nQa?6A3X;u(K~+3g$Hw6s+XD4K<7ktB;9^DR>{F z)%$R?Z@pshN_w&golpg3C8!Xo8QF@w@)GS;FMDCoM$B`gM7&n~v9Yv%IdL5Gv}PoO zYERJNWSHXRChasyAel<-&O~y#r=R7;{^k+JWSJMkxh2=yevaA}U;N4#54R#_?u$Ar zVyW>oBjSI$y(=tAWH@=UHAL4wdt36;h!8)(uf%mGo8;zh~uB2deq)m9!|n!^uWB$OPTU1k;UvuA89u3)BF&!m-dNzJkY^t-^yrL1I*|s2#R6eyeH}1n~dI*EWbNR zT|N+&50Zl=;#S!tFGtFQNEn*Hc!TY^d_t}%->#$Ct~A7f42q<$(X=*>!X5S&Y%TOW z2gqN9ZJ8WgZS<7~(d0j+**-4};-`ypYZU#>aQj`Pj&L+m9(IYG!J{a>;X`+&`GHHd z>~+ufzI0u!@R59NL%cWody=>fdH97#lyTKnsYEi2Sy``ai%9z9YY$nms8MKEF>Z85 z0PalArS!*SYVc?_dYw_JR~f|)r~4%ZR+9AVVT2pQ$izbV-U(5>{kjAvcIM>Hh$w2V z3S!Finp|T*VP80kvM@QJZA2kzx=6t((~2U{r)x5vVHS~FdbEj_V!;Xv(M#zBkFoTq zo33SVo7HzTQkGutmOCUTN%b~kv5p3TxQcZhvxlBF%lr=JIl_Aa->nEnelulVDoU(M zb3!-~ZVr{xm{ce7z6}dzg9|U^!@#{=akLwhes_o*j9}A%VD*p)pA;L9%P97Xne9(8 zSG^j3e=i}dme;xk2`rUV_|~G0qhBea!apo}RR5p|8nAJ_Q`k?|W?z(rDH+cWfNy4H zZ?4`cyd5I4Q`kGiJv2;y%n9Z*|Fq-T+>QmoriWDSxwSGcl}hCmrFMt3RjFcpDBC

    hBIhkHb-9e+ zD|CWBTaP9}4yoRLJN)~(Z%p`Q{iU)Xnv*!KwoH(&*^tQ6!V?Jav+dE5DjOEL3}3mL7}mdy8sNy_fx_6nb+0)IORQnx&%csAudm5MwWoKa4|@w8dqfO3t1%kfVU0BO$Cxuxl%JzM5Cp8u_PymhLr zu;vZ{x=D4QA$T_K0uKxCCP5@C=K<^#db*QUC?{ZjEsU2V!njj}K zG$~!v=Fc;K^HOJe&M#i-A(7fCQUmg*rn;mW^R7tnwFTewOg`xwi+~T#iZc5~=W($d zbz-pZtjy7q0E9ZL7?P9Z*OE~rOW*sFGGO28(gBaqG}_zI%Bki=x?SbqP3@eo%QleW zcl2E2WPn!9b2ipCTyS;?dAdUX_QvoG|3$~`KtJ5NOQ2s1u(3CF)P}8+D3SUz!U7$- z&|qjj&Rk*)vMvmDEh2*`_$@BJ76$!=`64!Ynpqf5ILakMzI0+beFpG`7%&0?h5+@diP3A>UQ7ASbnk0bT9y=LJyiOq9@FoM(`W83O zOGWbR)IEZgIZQLtUVbEP=RYf0S->=mCi$UL=oYM%MX7A6q^S5o+fQYjWD0{oO604# znMY8Bpzqt<>BrjJJJI)T>9oartW#DqE)5|N{j9H&(^kqJtI6RgU(|mUpHQvNuL8%3 zda|qiBCZp^ig2(g`HR>=P|Ghlp!=`F`9<8HJB|a+&Yd*$7xA7E9R5q_PiJue9=!gq z;uQ`n3r?M+y`3&bs_lvfO)t_-bciT`1$~%wfjD~LtArzdxzlKs;FR+h%Xusj-jbkU zI*CVR>=ByoFcj+XSe@d;Qp^k|FJa#)G}NpiK2Mhh4j8~gM)Li1wTyn8@9fSm!eK!v zbR2V85(;La`Z~!s`yb!<-SJJ zpB_n!*&{*KV~Lym_9wj57nk|gjRpSI1%D2qqw+ajUjP~N@dD?;g2<_GTbx-X#kfoF z*U_F(R8>V6dO$hZ^`qQ=NKGvWhL0(rZc{6mKfRF4%lHnaP_N9z=r;XfCPZSm2*^*e8L*wrmbUVL<+K&aLc7$@cCGK?E7d`w z&Exi~X+u#J;oJezFVoMr_W{z2wR&ayGNP97A)XU>B3_57!(1a1=Sgdwbk39Eb@Dce z^<#~ETT(PZhdN7fM_%ggygX$W^4=g2UncQG#`-bi{E!JVcZV5DFD(+sfb#Xh0OM6Cf22_ydYc@zGbhbAIoPAUe#tw$dFkj6$W2{~oEN3M+_&G(1xlW)@ zkTsanM;U{|CN?BV|=hS{> z6!wyh*+-Nlnx8!joJxkWkH<+(|Gq@HygR9#RXEvkZpv6UXXJGm_xg;yIuo~xOlW#)t|C$vJu#3KcWX1`;e2?OWR ze0ofUdq&*fQO~#)$^JLY^TvX(%syY>yv)*74z7!(^O|qJ?pv?;?p88!`?0_Kw%j1( z!9|1L$n?5gHhx=hQXtdr${^F`x68CI`=RH3_XS@*?z>O;@)19_#dmJ^b%a^#HeX)t zhd27xCBA#9FE8}n^}eyrk9Bk|m!Y!?ArU#wcYYwAe(Q%m_1({Wxyz63=DNqYN6I#1 zy)c~jGDxKFXF_*n%)2wrbs6LOjD1ZebZtgnnelGSgf7ZtF3$W_bUau|oJl4%Pb#VL zcPTZ&uS6iF=5oa-X*0nHlKb_Cq?-RuMt`5QzJSZf9ZH4`GcMJc&g8~9^wjrdbSdfV zg6aNDnXJG*Q3iEwl7T>H;T-*v@4oC?ateCwBnPo7QV3lvMGi{Z?>cD}7}I?(F(i2i zWhY~v-W`gOQ|6 zc?R{@AwTq0#y>bUAa$KcO-yykYfO>MvO4dAOx+&{Cv1;vh|#JH!PncMZX~J(nktoF zsVL}Ash(H$@SjC;F(`f$xHSjDehzKU!#pXEMVgau1%evJ)>Gu++~)%!MgszS%YW(^ zB=EErh~F>>)?!4G_*Y}Hs3wRZsaCHQL%5w8zvIy*BK045w9W4yg|$+eHQ+DnNfbwL zH6@kB?7OAQHx+(Fx_nbI91TI`1Ept*!SMz?X0ieS%tarG!EFqM)5&lG_hOPV#}Z%Y zd9hR|ZQ}l6@L`?lx%fzYJ{FM{vr%pv}&{%nhU zUvDS7t^&hQ=9v$R>x{wxgHyKWj4~(j8ckSuGa*Z@5}|eC3vahIokUpzSy z{V$iqQSp=d8-BDQRu3bnvAjR*u1gr>UG2Knp9W*)AiDMja{($59|c9u322&eu^LZE zQ0rW6|6_k`uWYaFUrYXHZ3lI2z9WW)Mxz`2Uef`MVKl-=IW-L(v%RLr(rC8`dE6g0 zeP*tvH;4Wax;;cqZwZyQFY_ORF>P#iwY8x6nTY9AX5s@F)k^f-@X z(~o9Ppi&RPt3rCtIJ$gahCVOMf3>i^&U#TX#iBrwG87(NE$_lRW10ER4&kiMf z(BV!%(y#$Kv=0eaBQ7)0qjGh!SN~LeshC#Fj3@Pd%Bx_lrEM*(qejn#^b(1OGkmfZ z$c&DWHmNJ;5k^O1U=s&~kU?g9JA{K(MBuNWQd*6<#73r@IW815zH*pybO9@Kmi)Em z*7zEjjE8H++n%<&w3w{ghepWLr(%CLxs1^vu8~K^5%@pVGQ)Koc=eUC-cpVub7CXX zRrtqxh+b+wSPqVk$$JGT#<^Dlgd({Sn-WCwnA|X6stb6r=ngWZgPnp)PGhsDOs&S0Y@(gIY%jyb9w3ZVeWUL zl*=i)$TgTl07TdFiRKXghs)D2F-$p++G~efRg|+7awsGTg@_Ktl_@}4i}VpjV{rOr z@dVM}M7&VDtsM7tWKdU_hAYkzjupbBt^m~*N~r-xg;bzQIm9?sXHOD`-08-w9Clc+ zHU2>XFLiIh8lhI?-hu<$H|$^Le_4Qpu{Eh}EIWpbNwIhtjAXCyudsm^T0CH(=Uk%~ zT&wp_d#N&Su^A3!!K^mQl4`3Xov*Tk#i)KYf>eUn@X=fS;4cosh|E^K51qnugl?Wy z4eZvRSPP@JdV2mr1w;QNX zbokb zAkMrZ2WrNqJbsXI-wElA?(re&1-vfc2 z?ux!7sEREW-^<4;xWv|qx2oD#t|@q>qL*fT$Nkp4Bb}WJdC$#%&fhL3Z4=&hF>RaB zVN?cl=#tku+eKuX!0t5sf7=bsGP_NLwu`>o#8m~_zblG~eXz*7UKErTnQr=5J^G8D zc}BPwLDLofMZ)XShmXqZ>U8S3tDhL)qn)vtzNL`J5Q6~0^;i~f*)r5#z(ISrxLA~3B=mG~ zdfKTCD<~yeHg$NX!mghRZ!daD*HWirw^c|LLSH2afY+J;L|ZA~(OW4a>vm++gk!=) zdkCK^2Koak)8PZ15z;xR#KXUjjOV>eXBN)Uo1o+%6C?IJF2GbtkQQ> z>A`%!o+>lsB}+^CMpEHPk+B(Ssr@g9?EiuBx386!U)Nr!zM)2*QSt|H!!F<4()#l2Y?432CJ8I(Lj-OOT`Z&D{5P${%+1DGM5j7$S$L&fr%tm?W7}{SY zEW@KMWrU?7hK zYAIYx11s+(;s@HgOQ!^V zvf&@%OiR&_s_3f<^m8#E7^!R~zgO;?CPY6G=+uyUw@TJ?iGlWpX)L2mWi<@{rSfko zJ>vtJNBO0~FqSJ=;&=w4ksLs5(2gn)Q5xtUSEOmf@Q|gOS|Oo@td@$$I2U2-M!6%5ds zNNM;ild$>sMv}^1x1%V>O==q8v(7Xiek}oV*{mZZSBi4tCQidmM`s$4GX1OyFb2~i zKk-7Wu!=#Zs5DD*gVN%I2uAs@T%Y-&oYmgZJtEszF4DhbI5B>*v$EPV;n4>F4V=_ z)C)0jMQ#xdeuRR#8_c5&7gzD+^N4K!^+#E_8sMC9eqdE zzAIDj$hg|p?HzeLuCpC7U)JkZn$cP zf00oo@@24*#LQ0CSuiOwMh}9+@TXEPn93AKh*!i#lJ?132v|`auQ@&L3fV2ptp;Y} zlfjUxv@!k$Q4MQ&gXj>0fnkQcOs{i3xn9a2YW4g}5M`ja9 zJHo0qYXkh~$Qc17HKt&HaW$8TDh=;q^d|9~SN*gnp7Cm)q!h-|lyNBjmMo4_bO%*b zjb5dOWqTPio#M&%)W*~xd8vdAYI;g&m+}S2H-zoW!up1=o13o*`?il9l;$F4sFP=< zpqQ$bf+v39VT>bdNO>J+jBkOz{-Z=?aolXZV&AT)pxMbHc@9O0dqB-w&D*42=yJ;h1ozs3yZKQo2!7LTszt=T)5H>m(hZ z@Z6c_i2pWRRPz}QE;xZ)rtO1BelUm-`D>bTv0@sqT$CLbIyN4zJsiunlG{#K{q8tw z_I#C%p7wu)p-kM$_SeXm)SzIsak5qR%;$t^_yAWsnszG4K#oa0fG2_zt@?**hULNH z1V{a<6Xj4nNSG4%zzi_b1n4peWUo4fw4U=`_^|Lk`9YzQc?!Rew6834+E?z@+gDbI z_LcQ!`^vwq_LaN#?^@RSg{bgYfZ4Bv5 zQub!FEP-9^0!Zu9xIiY)mmM(E-6&EoSuF1msf+V2kkRv{e}ODGUyj=#^vlG(Q73VM zD7;Ke;*gs~>O>aLh}3fQY5Q_xwVX>#+`Jc|lh`G>vUU-rBl7p(4}1;5R{h+jHgl#dBhu941nVZ&q`(oMZL(VZ&x-I+JXy zmCs4icx*V4OC7Cj}(CL4>v$|o)|r<5s4t=HkK zJc1H?62{Io0tvyf@Ssq>i7~6cQ!$3!mvbC6%3_JW9rxtOYegCUWO{re`+`{U)+Fa( zYchUW&cSRbt~a{eE{ZCWAx!CvYr%PyWkz9L;SGB9M%}=4X563`+^CyV2s?hTKLpXN z*x~F;rM^k3v<(l6@B<=}j5DA@3T<#Y^eXH5M_K9~`j?fH1K61tT)JHTg@B$ZAMV>E z?_j^&mUT|eD5tk+m0>#m)2$Dc*&?rA?-QKISnMv1`R=q(gGyco2itP0XG`NIBe9H| zHS>8f_-|I;3`yq1TUdEUylPMwHl7*XBaxT%yqEQI*KpzqBS~O&8zL04yl3#pS*kM@ z@{@gj!~f5e1Af*EWXUbYi=qlAu9CAU>qc=m?t$-$b*%qgJZPMFVQ_(ml_O;dnnUao zG5-w4fWM2I_23=)GPYGD-V07W9ij%;Xq2()kyq-BBGuaoKa+;jRq`wcY!Y7>CC>*( z?p1fg4M&p2j1~V9nFFjri37YrxQ!!rt{Onm)3jTOs2S6n%(<&z1`<{n|`@d zYz=nQtBqeMo$8`->SAjdO}r@1cCxckjvq{3!h2XcH$jW<;6Z{pC49X|^B#pcIa*Cu zta`9pOoX_@nWmxtjY9JJT7gb@EY`@OVz>g-dde%6r^_SC$>n1eM*dmB+FC^e_(rY$ zWH3A3LI$``ojQPNIOx=uQjCzVD<79Zly$w56>m_6rAAhQ0|&NWVy$dHMqLjpmAdeO zDw2AQQq9z_5%Lu~H;4>U9V+73=K>Y92;pysTg!U(gvZIvwOu2;DRVa%q z7t~x%mx__>SS)+%gf-mk<}8tw(IJ)f9eYI%;)w9Op|cM;?yz1+kU>d<+PBV~-ueWDmbtn6#F>?k zy_9>N!Qauc(|`3pWs?8{U&>vko7FiLmE+FB@>d}ah0s(4$TABtl4sOgLtQ+226gi6 z@L`}{?FFS~r2h&q)$tZOiK<)0K=#kMNzClXgGV!!zRcVS2z9_FaahMA+0t0qc0V=Q z<315=AF@dtdN<>^s>H+O(kn%$%3H-VSf_ba7!l=&hr|K#j7cjgHp=w7XKIY6pf#IO z`>_DgqHx5bOP4o_&`VZCK;VyFoR^Fy{A59598&JRQH)=O`ICGVr>Ee=B7v-5yj+&$ zm0oUC%q{O*^CIl)%94(%gxX!AGckunmlNyNVclON)gnK8Zxan_cfW^$p=9--!w0K7 z8&Wb{Z5*-88pX!ZbmBqSkxGO|XJS$tGgjMdj@7PUTE?`;7>h^zSnWKfF~hV~#xU)B zeXRC{K1_R?ex!Rs=l(gN{vZ3!YC zxEvzWcru(W>eIMs5pkP9J$ONv#N1C*_)Unm9i<;}evr;GUF^%1{<93_6Jc?LQ`~ul zD4g#^J^b*9##lnGrg%tnJ4={|RcDF(W1R%#8#`Z2%n65dB}3%X3f8Fv2z)@$2W?c} zJo0Za>xju@sJumpIp9aMR(!Gozjj<@6;Z4XEAmRoS3W=K z{aP{j8e}iALLfO;mQ(>FWsla6(wPQcB-&O1EgWc(=SB7v+u?&#=IBZ9T-I3e=? z{ovOBbIBJ_GM6g2NUS44X;pb;xXQd(ENAQ2A)ca>_NrBUo$1|Z#&0n78_m=WCe8eM z)45D{w&+e}rYuZ-5`d;p67oj16mJ>&n}+^|F?gqu#O=W(0w-9|v0s?+{^DsiK@#3# zgx<5VqyW^J23}<~qP==X@*>;YV2jJ_xZzxEi<>Ng?=pcb=2jmQ{mY=G4*PyF19XXv z>&3~xnvqR^lycktQm(_y%-O1x>uqu0f0n|&l{t^+Tq&!p$U}dW@~|~9cQ1F@-u;}d zO1aw>Pyc5r?7QesrL-+4p_VN!x3O1yS6KZRa>LSl#Bd%q${#ZL;_f!gYwSe$FV9%` zbP;BnR1|~)_Wv)|-U805s_P%WyUy7sZr?k1x`Uaaq-E%mma+px#K6D+MST^-M3fXz zM8P6N%6!DYcob12?8d_G?%#Kvd+y9IGtcw>{_&YPanJ5vd+oKpt9?F9Q|QizKzb+$ zHM?l*SgpdKq63X%TgBQHU^o)i?#1m>1p~ku4B|@S!YOKQb`JR@*AudGQYt}0aZV+;h2mTNpoNw5tjV~qrv zRZPMoIB&V=z#oenTpq=eU$ljlZlsmHj~Hq!W@?m%q*@z3l@9`&XcOy=91x7cEnw@C ziewn)hjDM5YcU^(5ZGNgpn$WjI99I+o909y-)}|o;EgtCJ;IY?5ts?VNi}$Ww84gS z6zi!m?z0%cnf@o~=GObonG74fEFXRgSZ*V~C9K%Q=8GUbivvSP z-popu19N0C*XOef;)}pL3+yv$LFBL>?b7e;@i?fD3wx`f|1{ViMtqx*Mh|;|$#4>N zMSFIr+~Wiz5a=WK5@(F~Wu19x5U!DE5W1Cbn}#fdl0A?Z-ZRxq?SzAoBIx>L6{uFwxicYg zf!4LEle}#f%uDh}p;4e^JU1VHpcBMZnaTz1Bk-ZDsw(idqS#e?+?|{KeSB|_lvk3d zWFEl~q_86hOo?e5sJceMILhA4?E z&+Q1{pY{%pRXnksYqZ~JCH^zVe~!)ko`kL}wF&@eFX-GzPacl}w66-5qVsgZ0GOX$Q2d0}pMx=hFP7-WJ4XS^uDW)`R!%>! z!@q0Q8GNO$b?Z-b<#Sr?psxyyky$)?IWO6347Bhe@v7#pXxRCTzoH9XATKa70KHlD ziO0{)RXOTCEk4kdH<+}Mc~u)S^oCY%!hS|8QJx3?IWOuitrakr^Jd}vGxDlFIEHq9 z$FS}&z=5M)`=piT%$-Cu!Rg>TV=kCVvJ*K$_{fDwM^X(jegOw&2Mw)t=lL%t8JV{Ar!P z1b;6cx4;M4hD8nhDZPwEmogm1z@|99yq{j}Zb?7hNI%~DzkV!B`&^%X?7<_sjE!Cj z+MA7S#0Bf`rL`vQYpAz!7vc^sivZ)St!Fn8Y{r7+7@^BpdaZBe@zM}7o!9dJ94}=e zZy7tvOLkbJWCwf6B0W$TNUv}it6s{CW$bJ(>KZ_QWfB_#gSN|9$x;?x#tg5L+AoD5 zM@wn;TFT~tZb?%w&h0GLj4SvB@DPskGJ`t4v!2p{U&P*ogSfxm?^V%=VCSuj$_S*p*!yOhgy?@6jIHVD@1`!%rTRCs^D3qn-+G({J-F_D$1o z3oZ6t({GC{_CwQeODy(Nqi-i8*<}{{rBU`S#;2Ps_FJP*YuWE+a=De^jC!O?$?s3}JslFr4al@^1cW-4j=^z3!hea$Sy{dp;_6@4xP97wDb~b@{zb zGPh6%7wEAIwOF8qcc;ufV6hw05qO!KvP|dw>%ef;%XDz59=1%2r2v(ndmn^*#A3^J zLtB+xujAM0Lfn~it**XV8;{nxTT-5*q!yc#;N4%rhLuB-5n?H z*2X%BDeCs?pxLP*3zs8@y;2`lx|Z+L!F%=C`?R=M3-8`*JH)XD^L{wQ@!-?25ho>o zlL$wcClTT}ncQlMM@+HRbRIKf|JHfiwRlzw?_T$ePJx%$9!G|s9hg#^?K=3Z?zva@ zsE4s>9&>P)DR!G;m+9;^!*A%kx3zdn3-4a{rapw<%KvH->)Sf`mhOB7%lp)dd}4*2 z55-5?=RJMc8XLcM%q2cg9^VWYMGtGm`?bMJb9{!&PQ)i%#z{*OdfMR4_rMVU&$pQZ z1mHz{sJflWe#(P&u z_$uJG91BwNI4mE%NP8{)y$+{~{rF6I2(n*+Gw7dt2Lju$K7e}ckJGj&vfmk}Yz)Le z726E*$bq;DUe7di7-FP&TZ@lz?5gp)0k0q>Gp_`B;D3ejkj!ftE6u!CVMFYD0HsK; zCmXsQYfI5yZ0L@xLpp(jlHG_bt70XcgI&gU7F`6cIz!j7?hyB7=Nh^<>*XCt_H=s{ z_Js9P(WhtIe!4H~SJ3xPhGTgK{z}!r$bkN^71y(W`A|Q)LxO|H9wG({T!?N28&1(p z8I}iTJtbESTS>!Uh)v+?W9Y-!ILc$m*!Z}@v4!KR#~MeIzgpJwh{%yON2ufVaqL(x zo5#pwOO6R2YaFAGZGX&cHqlRRd~m|p@d7ddVnVO+bHpTZqL}2I7@M4Tl9()T)t&SO zKPBzA%}K$@Jx{umpC(Qfr#YvFPtOC4yTDa9Wj_a!HYL+$O7Qf~GViR&R2-rxqNB5L z+?xKw$q>=ibo|=*TfJ+-?2taDJ3B4$9l`^LV#j%e_Ta$Nc8m{OXqL_cO&WpM04WT@ zlqd1dVjvV&;kfHK5X?{!B}GPakNFUXr1wcRr0xY#%EUHK5NGJO!v&{g@csZ;$(izlE-d_ zy{lfEG{0N7Uk?QHZlE@^_p{covEtWR@HM7hXX-WV262{-Ec7rEu~xh`=;D-9Lr@C( zrjVCt2X+{g=OKv^giMqxppXV3n^sULF!{7dJAJD0KdlErfvu2#z*+@)vXyNNGyq#V z^z@GX^z^ZkPkxR~jyt1}t2&r?8lhL|)Jmw39kmL1>$6hx<+|g|y1WMr6mQm%4ch1z z9|AeUaN%pP4B`}G^Ty?Uy4#AhI=;cb&jE+NgoQxGgmKPzJS1UrAmMi;erG{s0l<3T zr4@pUHi6xT0~~-cEMnN6-wM$>5}!LoejuRH(HGjeG!f!7qXS5Oi0gL~&objQ*lN0* z-d8DoFl2+q@R7;d>^$ITFJut0tp)e+6nnf;cH9d%?SE@kC{oV8czw1G9uI6$vP8L}V10JzPC)+SOJV&<85`J2r9QGh!vt zGZKaI?L2EbWGC7u=LfS-Pi+;sshl%&FUaA!9dmj>>gEs_c8WM@R_<d`^g@vE0_I-61du)hj3P$md}D<@kItS~8jIzv20XtR3cMW}41Q68(G@~(=&V3) z1waH8p(p5ah@?sjvPz0YFM;%bcp*ZWc6uaRv;_Z$*$q;75v1u+$1cb;wU> zVSzQ7H3F+Nc(^##0>ViYtM)L$I>BBe3o>Z*q&)|utHFU3DM(slok#9HZptD$mg$bb zKp-mS>qwI3djsv-A$F8{iVAIXB!Ew$m51Ot{2DSv-NzMzQ%-#ljB+{XZ+~BHE za1JcgSn6_{;AA9DA><9Ndo?LI&av47fYE`?cD)^3;kqkbqXb+Y5}o*n*gs>CR}^P3 zxSE3?s#C^uEZ8Fo1i-wBVN0#V!8lF;VjF}=gW5Hr6;F!wGdU(*uvEujDx++6$5mIB zS6&kM(=CJIuQJNs0r-mE>!@cfwcR3A5U8>5r1vnmAM7>D!#{Z$P;&-xSSdeS$w+`- zcQp`r>&j0NQ3xEuc?{Z!GSeMb9T2!nyq)`eand|u@vam{(K8$v3S&m^x?{N^TghWA zAU4oGG!LgZAv8@E&Siq&Ir+#Avw*J#P=}#;Wr^~_z^iuNjbKwi#AYGHFsO{}=d*U+ zv>ij)EHG~)WvTLbeRH%9JQIrD7*sb0t>r;+b1jIa6rlLqC3o#$d zT>_ec6j}_@sM?H{fjvh#gLrRF`ke3hG&}Gt`4sWlc?n6Ug@Mai-a{amQGbs^By{k_f%{l!fa)8Uy?Yt`eUa9lAgV%Xk=7E7hLDJQWts^( z@>1$egWqPb*b@mn%<}A@w2e5JHe|r7eW(x;ytyT+6b9dVyZwwhzr&yddo1}j5{4wa ze)2Xnx*24h=>Pzt4jaLPL%jdufxQ^1V{p(Z5R^K_O5!7cn|~_Ae~UpNbjC3>Mj_^& zZEB73Z7?mA{!0h{xzlq=1_oDQ&)FB1KHHH4#WE4Nl2^f6WC#M;>^Ri?;StdNN!byi z7pk%q`hI6#BoD_l+7{=C!|V`u3=42zk`R61+6L#tCjmru04&B7^9nh{=wtQv4 z)da{KGjTHE?I^(BHIht?F>&StD5kkl^V+B}H=5W3)3Rh19_Kq?zh58=j4HH+9c%|9 zdLpQtPC4je!~otz$2Kq(*oMDEJl_sjd9DOIg^=uv0Nxyg_F*+Y3SaxAd+2pc9zz8G zD$fGoVt!vyIalS9R5Ao_c*H;^knQWw1y{hk=rT@WAo zB=9E0`4Un%p2o^-{y6bpcXPnA*X-uS0Z1!am?ih3gJ1>#Tw9kdrPk(Bv88k+VvuzH~jiyVO`;ntgXE zz{sF17#SXB;fck*is0d_Js(1*qqLae6=WM*>P_*<-J~;EjB%NOx2n>?PaUA2pNJA0)-iwpaMv+lfd<$Mb z&itV|Ar7Ob6WE{Mo*xVG2b&jau#e;ZNSNi1gpLwY(HH_K#DosxS$M!yf7tc_8xPoc zUBUVuhXYqREf5&xHIi5P9neUX=|%6@?l~>4337Ams6p&Onrw zn(Yh1G%rlo!;KOPS{5HgvuH}*kD2E+$%jLrP};CIh!bqAIHT5zLs>W!h}1v`A)|WJ z=$UMnWh9~6OL1R8h~ft562wGa{(^mVZ~EFDd_e31M15UAkCpc`aq$Ip=Z^}UUI2jB z!mer6Ho6x9Suy<=7Je_YSG_@LEB*>w!dd!ZXjx?AP^Xfu$jMS z3FLWb7y-tT2K2?ydl=;vWF_0|jncl9hkS7zyP(VYV*|@r44J4N0n7%jhW7`Kn8Twb zT`J>FpLCfjAg4_7%U3Y;_c$mjOb27pT`?(vaOwxxEBwsINe9sXFxpUKo4^X(NF8Sz ztMs4SG9Mt#={Z=Bv#Nkwl3)`nrU7$dFgAWyGT;F*b_%h!54VkOkoFF$Lf{>oHN(YP z5I@g}0y)O2N@okgH#v}iz_ETH(4O$ZOEG_CLCV%J;R7*wh+QRMJXDBZ7(jEqvdvJPyA{ zG>d>zZCa<)EKLha&C=N4;rLDdSfdJ|QfD{uM{U%SKg#%s7Tl;iQv^o-z*iQg)dFZO{4xb>NY>q?fhmTs0A!swQy-atr~OPjb0~fp}~!2qpEoZ z9CUBxM^`(|rs!xurl+ccX0=Yk@dYT9w=m6;(=oVuHp?<~JaX-Yt2?fyl|{`)##pKnG)_p#iJ$YjsQg!S)9)l_%46{)^Y<9i{mf>WMU_ z&qk{?tUm?bx|{Lc@GEOt*lVb%=wh2ix{FPlh9@=40?IPA5tbKwS`}VsLMz5%@{(T| zka~WYhW7rn@uyn!Sv~EI#-FOZUNMUj`<26R0Jt8baWI72J9NVqcr=><%=Wv1jML~g z1D~OQJsKyWzK1UrK(xU&84X$#H&C6E(~fh2m4hfovu};*8WUS`8WlWe+PS!QpZ21_ zqwlm0K)#yT3dK{?9^iQGJgo+=_X|FWoeFaN7AvrhRmAE(Q0zCOY8iu|fEX7XD-Soo z7>C5-0Fw-1JCSFYeu9bDne_v=Kay$#Oa360ig>|_7aHmwrk)oXzV3yIHfG%-A`1+C zq&@<&3y?q%g$Q4hYFo1i zA(615g$Tn95uWMguyYF$J}1?dW)WUPN=40!+$e_^n=di>GJ~*6PpYFQm~K>)vEQWb zrC#woz}xQzY9N0cg@)Y~v_Tx&w_x}HnSlPL>a#fbSHNUG4*3&J8s#3TmNd(sf=$-O z4FZuB*t2dZE_&u43~*)8C#O`7)<+?Qvs#FKkyL;A8O&?kL`@U$TD(yL51;^E)UYvz zsDX#rJm<5d`dl_``~NNC?J%*#L$u?)QTW3D6z{FP$rm#-r$O*zky^d%)jZ z|3!f<^no9F;s*}9DT=#4@%Yaidg;x3X9T@-A5*^omKru}n-vUEEB!MxwrRX)BB%EM zlZXG{@^4-u>ySWFCa)3ldQsrL$4e|%{Von@?PWMc(Qo?^trz-k;n&a_oI$v21q^c( z-!0_ch`uvuZ3wcZZbhkr_Si_>HC-?EdST(<^LMF`m>z zA#Ik&c`V{oKryTpKtwHRo<-Bvv1**4QR?62QCWzBM2zBBt>qGj@UpwF) z@@C(f`pNBgs>}=1b@{o}pGnBiAsg1GGV+O(pUeEu&=?X{jx1{TIIIK!TATClr2JJ@ zByc7m#R~2~o)d=)jT>n$j%oBM>3DC3xV!Q@`%TKYQOTQCdO8rYAUz$tdSK`$C14)A zHEv^9sjTWH&p)QkT)fj58~>7`BG(nq2$-9_$x1+4{htqhIHl&{aYrTua)&mCY@Jh z7kCE=h@j2W3F<^TogbC{A(PJc%Kc8sAJvE-l>A-+psa;}w3>KR_LYXd!azk3P4FwJ ze*LE8pK9zMO3pL}{G;TRMh$nbGVtVAv~X`aUT#skI%?2bu*}d)4S%%EHFB;s*Om=G1X%*IwdjyT^don@qF!b#dlt$TYhPld+ zcNk-CH{@*w$9t1zLC~PSHxqQ7q1R@Dt})EjhFoWiTx-ZR2FH8zph|De1l?lj&6%JZ zAXNg3N^*-aVzVJ1Fh&hHUZHki6ZPQ zrgvt-K5giyGGU)I%qI-_v@!B2Lq2J6yf?`(!d|3b$^_j3RP9XA?MCETL+&s}JZH%5 z2FH8zph`a{{nmWM)LTuz8@^~5t(%sv1+UZ?UmG~lZrtR^(0}l{#DwXP|J^I~j)zU- zU#5J-?1;JUY;0`skCpl!7TLh`XJQLzKs)brBXm1g+OHpvd0l^cJ^p6Im@vA zRO%YxuSDx7L4UYUNLD{-NdHy5uh{ueQQi-9hu?bPY0_*IDv%t00>w zJ9&>`tue5*IG|EyTKcSpSl3y4t>xGC8Y>&pbL*^qhpVpw7Bqf>4csTz$^6cUT4_ z%eLs=Ul^bkUp3TomfUV}`1i(R!;FXMhv+vl(eJkOu1xeVTG=}-xf{_x>P7#h)Q^hD zV*)gvK4;GlCN55{%bWIknOPS=Pdm?r2V>s zfPF=`(EM);^+U7zR2uqk=`GBUmi{4=x9=_UJ4^m(mHc4Izb&-+KbE}AZa2%0Tn_UR zZGN+Y3nAVG3jB72Hr3JtN#*$#`qVv{cvsr`R@-l>#xT!L{_h>Yf9` zucYvgX2Nf>^~Oy24R+`r8|a5k!asUo_)QdkXD0kMTR)x&|Ck+m6gIt^hTnN$_%|&L zf%42=rZKxE)IbXUZ28=SUrhb02~zM0s|6D9F{xe=qVdRXF>;y&8nX_rw)uOu+=n{$ z_V?FlJx3#nms(0Sqark6P-VTY)Mw3# zaHXRY^~n{a*TA{1v7i|z>t(B{w>w;8EqTk@;)XxAX@(O zDdVl<5Ab;Slsy3Q!G{;j_-T{>rAh2AexHuFUB*7vUbOqX9}6Jk0++c~yk;5uSNg|& zR=j-jThLg9!>d-j?Gknsq+{{pGCMvLsg+N@0wR<6J=2M2PhReLaW8QIGJR}MNaX-Q zw$Wd!hIgZX-(&A|!xVC*8;{2Ou3)>;5$$l|c{j7o=^yKz_#zQ6ITdtjYu51(GeW}Z z&_MBo*MBsj_;5(vnY|C>gZmF_3X{ z<QTkhq<~mQRS~r9feU5OX{H`jiaJ z00pv?!-hmDe~K_3pCshe?evp^KXTxwT?&#_XCUN}{&S}W=;K@lX~%zTd?qKDu1UWD z+@mdtgeEw!kV_$pRmuT7+2m!Hkx6q2nS}q6Zo4eRJ_w>|WAQA*^LdhoufX*@MfszK zAD~kw_=^G_z$7aIDkN_62)OMfdb@{i?;m)(n|{7UH)PEBvdX|4_6ELZSl8%JRZ#?# zJlwnxU*rH_=V}Ir*EDLTJP`PqNgz1i$rvCRxKYY4a$ zXd`SB!@>hi0m+$1kpRC9)Ec_XZ?BD=Pd4|U?ccA-A=^+QRRn~cE%+$YG?hHKho)GLV z22&h`@3VqGVUn1Yg8BO!E2(2YvC6>}U$9mHUaJ0xwVuIywb{wq&qlGNr!P{%XDHGe z$(I+JtpUiCZ{Qrw`#|bO-K~6gI`0X>U1-8J`@%dgNbb$d z!O#5ZLEH;*8d}cpl5xD3-@vL`W1h&bytKMCOq}Pp0zz}0XAr#*m0H!!%I|aytHz_t z1+}<$TgpY*PtB}DV;4um|Wvt*nGH> zMy$|rJ6ja!LXi%eW8x5?2f~-rVSpjwFJHh2LT>9KoCqS?RtQ*KSA&2>cDbmI*7yM{ zpeX8`N~O1$^s~+v_{0k zd|!jaFg;uh3&Z7FhS-lBiP#TCwWbioP;sb+dSYypJhXTe^lxC(3=))M+ajuQ>2FY5 zv<}C&BfM`%Lkns^-Z6gY!vz!+#W7~KOttGGJ1+rDuTsZLUNpXL6n5Q)eY6;FL0vI6 zL5_EDl_1JWWTEdQ7-7iDI|;sG`WSnHI4Lq2)dOU@;uAO`x&-kQb%ByA&zpj3?x0Vw zCkrSm!p}jnL-EO{Q%R?y7-!d=gGM;nK3$xx&+!}K3>ZI*dX0c*-*e>Iy#5M7Jk&nR zo|-ic;m(F>v#ByIDh40ZOZ7~k2e>E7NyQh<^7x)m_bqvuN0t2oG`)_fqJH&1SimGj}$t@b05f zisQVmBd(-iS1~`y%a}mmtLYxOn#rqJG45Pn!>l>*S8*-NG!GvIttt+w>$=OCMnZ-S ztm%0y2+ZDjESzq?etH437E-uHUbw@(6gloObdsf+G#3(}C~z5Y&-Q#2cJH_a2|_m0D40g zv=6ma!xh4+#O+ngzKvzA_CqIbV{$dqfK*$}au6ySbE79x`{SKYkVBEs-I;{$VlX2V zTu*ls&LcM9Y`$n?#&sPN8=19J}y*Wcnexn{XeA9*toOt5Q5~Yo=OYr)DcjVBj8s`v_d4uri(@r{+DL z@$)bf-Wek9ChBBNy6VnBG*4x`JjTRR3}Ak^lb4ZcFVo@WSys1+>5bIrPcrBs0!knE z2t17N3I`<UX zTEqQS;dV|Hwvl=3JKiotJ>Tuc=?x)-zMJdybWgY87|%C_xdc8pHuzk}#YV0-(LL>R zWW7(C{PXT@@VbFRCrIB%cl36(ktxq>?E|Ro+6Q^{LtH%wg;u|})7+l7m18`<0K1^v zegNzgZa+eI2OTPu4!aFu+dsjppXBNZKkPXGq(abtb6N!+_QG!C;@{kUhVI68&YoiO z8J71P$9P`JDekAac#i8GbT?jrk$NsS@w}Z4?%TQ8$@Pms&2>CMp<)=*K_1RVR*TP( zG+Oia@Hzq_(0VbS=G9dBrZq9X0qK&)r9%-{+W#(sRT{2=>t{{MUX& zZXa{lw}Yh5r`~7uvRdrYc@#S(KAsvCD&^)*bA7 zKKeUonf%B{{{XnxpZVyY_$u}*AN>oT@jD;;8@4uo^27eX<8OZ0UwA;j>mNSjGBJ9V zSj#RKqi16|yi$z5Ld>{YjJ-;Hspg1r*I*K#D@I?7_2+sq`Z`P(^Tp(O@VHQnULfYO z#bWFtF=L4seS`ScxCsO^jK$q3jGG1PD+Xk(5a+HG*eabWJZViE=%3vfku~ZeQ;&{gxzOD(kSsk|4g!Srh&ck8jaSb^eLP*;L zL#WrWjbRsBLTX(&nW%<+*S=7u_RwLV^IrhjJ=Znayr7sH6xRlw#X%5RWa+X9Ope1? z+dT-IThA5>?g%FhsNHvjeH7B*oMS+P6B|vKp`uOmg}B1t5wwC5=UNVhv*m*I!7tA; z%jqcBRtY$j1q{lPiy2@Ox@>eI_CS_KGvG#HQmhcSK^-#nr?nL z-+yjX{!83{Ch6HW;2tqOc7ljst)VGDH84L?AiIAPj{RTVO1SpApOM!@#D-KIxTQ*VpFVyGLId>4tPYiT|ULCNxZ1~Y#7PF{|L z=_S~WS56`e+UF|UfZSA)SX|){pbKUCmmO4DhB+LFd-)p@aYoVFTA$iR{WxPycqf2U3|HjdEx%cJR-Wibh_J z@;7WSK`Zx0BQo(y)WLI4H1T#+Tam&@T)!2~MFV_bYXP{uH=;$29PG5i`?h%3HlQ*e z(ye$Wm`l8Z!yFxyp|d~Xq6(qLP88J`KEwBm$j2gUztA6xf{|iGF|I@_eK@xFkjuIU zR%)^6TUaID?WvX_kEuNol$TEIpvc*YSo-+qWkk9yze`;ieky|j})E}?saPg~$Qwg&o$6554&fK&ox|WOT(d zG5m%ASPBfiIILrlMI7Rz#>tRiE6iYU?gOu68m$Nn#$)h%6sE>*tOP+*#LRq|VOB}; z?>IP}fK`D>##XEwKLQ>rp#Yx^j}A0khrkOxVRag4bV#@}n1yA5z#J|w#MBM;CBFoi z9m_l=_zm1C3uW;^VIbd;HPtcEqO4!Jpw~gspLo`2pjPzei@4d14UA4HJO;QQLjbA( zkzo!#-EWEz2uh4ya5w7F0r7_Vs$ zI0ONS24OuYLhmswMOiS#T@VzZVqEz_;LN(=gJa{Ou(>@ZUYTVjEwHe1QyW;Wo3oSU z56Y`799|%b4=*~nbT}|*%lnpn?oB)N4ik3I@?cFG!zP&)hl6*kXE130e1mFwWDJ|9JJ3i zGTq`q8iME(WBAF~^rZX5Hnz|MnoS1Whgsl-XdBEXRc^NI7>DBY;c^tL38t}q&LU_Z zCjk8F!0u>`VX{s*%MdJw&>^TeWNWhy{1d3QPXL%ySfznEX3BLzzkWYt{>#DsvzPxI zFi*A)xQoQ})CoWpo6e^JG!^rg6({ARzSE1RC86}w4r_yp3wmYKx?;u1e4{mk)T%l( z@<-puUx!BiZ2#LQERh}GqXG{l3t*|EG8W_cgR|YJBM#wEn<#=(j`r}`V8GA{8mdaQ zhN%ar>;rhEL{}8^{6WGEj#g`vsoxFtb4Y!YHX_zMoF24w;lJekn( zb}|?70H_!~`T5RdOvR7cxd40gldjc%FjGI}%*Zu$1=1 zsu{=Lqcgq&S0+W3K8{es8!`y6hz=Yx4tSLp1M{j)GLl`As?1K}Ito`T2MH0Oe7O?{ zz#ABrVD{b1L^jNjJ}13p>Ra|S`v!B;F#&fA54@UnJU~~VCaQuyTGRz7!es&wOqhKD zNsL8%2KGmQ2XaC__7X{b95lm&MkJT-Cwv<>?Uyy z@t>Xjr*fX*0PNf^+)>V_@j%;lYuw`1ZuLqxR~KSC=E{EDHYIR(f-u`IV}{uphu+GP zu|lqsksICOO|J5u8(hdAK|E7O>Fat|dCzsO(y*kML*MRmmG|7@s;w{?#k=YOM&XiZ zw?)xPE-V8m?sb?Oz!$X9ie!g57{gu^HnJhmt;_GoB4iZIw`;Tdz*;X*+(HGsR2GJh zmJ_1mE5hgmx$Xmu9U&(7e)PtigB>1L8G0mfHHa}4rykb zXN*^v&w;Y%C@gbgfHInWVK#8#jb1R%Jcp@?225Y(8b@J1CD!o}mBQ3`Fx=)d6*hoI z&x}_90B^j=VRSR1N-rFQ{dsW4PT_MI<}%E~SHZ4XZ|? zITsaNvw<OuvjjI zYlU!E!}Bu$Ii$E)=;(*`k z4u+#H)Z-EstAkkdb=bumgyU$=9Gn6I=GMSAIXhTqgcUKL!T=J6!3{*1fhImt265sy zi;2sab6gNL<-nLk4C4q38X6(BmI0Rics>N}gOLo$ogzU9aw+613l%Yw88xTqTLMGBx`SPGsY4B@v4VekWbdx$nxIQYn-1t1S0af2LLiVw%t2E41gNNi&fhj_~! z94&Zwnt^pClYemzwXwwv#+eRpwELRY@TP2w_wB8QMO}&Z^s5$Mrb_bj_@Vq z0Pj%q0YQdYkVSfl7#4%@#MsR&nwvNZ1SIrL5<}vttQd^q#89kM7`F0qSpFRhji3r& z#1g2gW8!#jKNZ{m;jJ=391qX zWZ?zif_#h`YupUm5Wx2;?pwrQdwLJ%>Lu}-U0cZskW=sr4vaT66q6u+KIy3Fiwnt+%Zi_uMlZAlyghM`X zSek>a<@p6`^W!;fE+|h_tBob#2JS3*qX1LMcl{ zlF_VaR+URNNS$MmZ>{YqhT{VMso;mCv5OQ5W0?Gl=g|u|Ac7Z7OD< z?-z=^5HFCfQu&U?B3`9i>B?w@>QK;A^%{n5fPETvvI;}k;gv@y70fqs)bUEkdb?;P z0nQ`FgT0Otwj5AZ&cvul*td zmt%db-pRn9kTH}YXxj=DwodnAJ=I`!$iZCq06Xa zeIU@<8~>E)zOZs1Jg~t8ARjN0Hdv=YQwdmnHsfFk z!7#R%N=8+w0FWQc;uoj$e-HrgX7K*7RN|E&C3XRQ(gfrq!^(?(IFn7f6eXF@;&|i) z-ZjfHdnw*s0W)x<>@9!`h#}givNtTAjfw{LnIrwKmqrdm*Rys3U081Cfp2j(oPeB> zI!YZ6oLR_66@jU76dI$DTN9!fRL05HNYLVb9pV$MS&1{MDJZDG$?Peri!H;lY%6!Y)5_>0TyF)x zp3>XG*=Dqy-U8B^jSfBvA_uUv-X*tziyfcI^g$p$WZCW9y@QL}xpfEEx5Feig~svl zjUX;zX%o`e-1>)Q!UPXih0r46(No3ge2SP_i0L``26sI>$k8{segh(JKp{XVb+)El zy0A4<`5AXV=i)OS_l^SB!pG-`xxLWgoSj@Py+%ArYRpLa&a-o zoDTb!wS2Y!nYT^=a31-Ca3zf!97nvt@ISR{#gG{!gY+Q22T#>!Y+m| zP@o}L0{wPo_qOufLT6OS#ZKJ9o|l4$S)_ls7{UTqvV;rx_9#}!hgp1bmYWn=aj+t` zu;lR(6?SZ8Ifes@>D0hY8vUD~J26fkC(ht*@p$HCg8$*JrXR-m4hQ?sCx!o#39%#d zVI6DYk_p0fxQ!!<;?Ia95q=AZ!Aj=P*bYC5!53%ErX1K{76a3X$W2!0KM(Q zUBGi_Oalh2q0>{^c8&s@S4HhI>$4uCfX-n+}j}S8t6sz(hx!qi_|n?l=L+g0yoM zP61$T5F}g5n>KC|*(7#$8g152;%8C#8cTe31-0M5M6)Zi*;8;W7X z^T2S@gZ@Q&iZpg9!|b6!ge;KlVeW%WfSt*fBQs!NBab`} zmJKFdrQQQSn0-6xu>${PE&FCtkAQs{KiWKs9o@-zkd3z{b~)h@n0YuMHYs?bJ1KGE zT_USExg&dG@PvO@V3SoL55jVb-gp^_K0WrP3_c~@r=_iJh*rBr=q@Er z#BIgPF{$%NE8ZmvMfRn3jD>Et%XuGu0ye-M60P_Nd}8Jg`#t(Q8P{YOFv4PiX^x+S zztiL?xSz|<;*;<&lLsumbpp+ zvr6w(xN33b`&SvBQ;bp`4A;a4^Zs#zdTIr1=3a^Z0B!-X?mKaY^$O;)y1>Q)CYTsl ztgekE-nmPJVlYCzBO5kg(T?ej#Cc}mh#-fh^VGKL(bD8cy*eqi?IW}$e*sk+aAJ03NE>rjh|$J_CD!1 zx;O34^f`f*p!VBh#6+aw(8df*06c&Z4pEGhSCW0~1?N4q;gEnHUE@~&$!c<{Sxu~3 z)%?t>=W*{>2*0ir)sq8Tc&wy-xmjVhVh6c42uIN85(ME$)ax*w_Z7>5Fdj~J`m%WB zd#1i){V{bV2>2IOD@BN(Z(OvWnKi7s)DLSm3X2NIl!vgc7j_WBX4i*}@QaQASqRu< z(}LVSwa>q)=*RK6psSw#dJdl0)aLUOadknh;Xw9e{xQ0{;xB;+HxW$? zbKicji(@cT1avLNqzj{mItLX^yZZ=o&>uwuS4Q55@e*XAtGJOv<|E;X4UI7fuGw(C zjVC92)j9QHb{6rM^)OWC9u|0#r*w&cy(^&3(`u)1MW9RtXnqjhSe~Ok_xWj``#crf z-CT&6*xYg8l#(Uj=mi49FdZT~>U-a^KkaX56wZWX&OZPo*GD0(KUmE{Xr_tPOLZ>Me@mnMj=*g5B<3S?4Nur zf*z;zEHIEDtjA|7_`RL8XBo~L(e~ZM9!xheoYrRA{x{5shK1cHwJ%y2<^u*$`(p?$ z1;awSIjT4(NJgOG2=4D-zxh}45|)T!Bc2X72K>xyo0k=qui}ofAd0H2^a=@+Z!T>pbxEo;v6-=o!unz`g5Qf<}DsJ7A29RgqS z*k3F*lLRlOByM2VKxa7X%HrWcYT!^)z04IDgU2~90AGOz>qk?JPu=UeoapT3)*i4d z&V-K!pY9GWvDd0^vLoR75^O-E;|ZJmWlU+tOJ3u}_=$*X50CgUo%aH_pXY9t+Q9wI ztv3wsWFSeXoggck&$rNxG{&mad)`a=ml7j&KOxzpX<~ekI^CFWQuD;X*i0}B{9y*_ zB#cov6xd4&YB>)2S`edeIisJntdx~ei%l7*WAb_2Xt;tAGFW{hFf-Zq$Y*u>c&6LZ{*-& z?wr=>_ub?%>4!S6(R;>Y#CP*N2E8A4&4uuoe%Bb;=@_-|F-DVedZe#OznoQlXw80w zAj+#~?EjXZlLi`o0$Tyui33 zGeM^KImQfsvMlf_5k>ma%VvEAo|Z1){>GWdkbDds+9M+%5|xkrJ#OGU<@1N>=IKYS zA}+c&Iz44d@2BTw7kO!m8TDdJ!yD2+YKUmdCo@3#d^~aA>E&>^L+}GCne=M}tXFjm zz?chP9^+dDPNCovx|ZuWgD5$2lPmkkfhGM@5uET0=bAX{bPUHM zVX)V+e9)+edQYRzI)uaY^P7EfEe40ENelW>N%(g)Ny~(-L5uuL0=w|S1Agm5w}3?~h$s;0 za8!vd$BAXwDh`$CQqXr%6LzVu#4fk8(b|)vax-gBxE*W1khe2BG;+q&=Mf*AceUA} z-Jvm{%o}l2s~C*L;UF|@m4@(k)&ajT&lQ1C0b_2rnkAso8|M4ee1l$+0X?Ag1{CfH2@NR$SV;=c-kQ~2uw6U)**F<9i2Q~Ok!D%#F~(z%~AoZZ2t6i{mEQ(Jk5^Bys5zm+?U zZzOs}0nV~IyCsfvYYN-pSn86}SPa6%KO%_1{A8zDfG=5~EH)D%Y!FLwnMrSk+TcF#k|EI`De)%ov{7 ze|9#CaIhzFDj=9?m@1Cb*9=AJLd$`6A}%J2IV{m=9)K{{5UeMdMe;fqHqbjRhCLm8 zXLD7tL{)-2trXOol)4hPAPy~vVTzM6vUTJHK7#EM6KuTUAhvQ~SPC0d+H00$Kpw+9 zF}m^cP%`aTIuDp6_G500mp78l{!}8wCIUdvG<9H0e-RZLG2g`e} z)16tT>EPaXtEQpe!3L$bqVocJTL++j>{AE^>#eGJ7!k#1rBvGv0urNws5NAhjesj=GG4Mju-h`%VtaM}4&WSIF=kt~=Md z-YpKM4thmf-O|G+=W^G$%vE1G@g116GmV5gY^Upd>z2K#4O3b65ns8^mu{KoKA3Zz z*PPA{u|8YlPUrr2uH%Gv`B)T#;O9h zGo9azIAaCZdB@%TO*i_!PT(i5^RY{-{fV3U!N*AdH=SR)%NPG%)Zl1Qk)uTopSh`@ zd=3Abb0kZ@I{(5={o-Ri!S8&p*TM&tc`y1gz=R=gD<(#nHb zN<#Jf*3}<{a&->VQb?{&&@zdVd;%%fuH)squG1BN&yBw8#yVVQ2UTG)Iq`-Y^YVeN z_kHd`2zGXNoLZ;BLDGuqt5$yvwa}~wjKG#saEE)AOYfnln*;+td@|4+FT@2{_h-Av zFe(~aL~~GS2;sO0h26OSa)uKAGJZ=-3^I^#%`(q%keRdT5%ij6m?PcWUn@~_uHd(< z#9-O`K2*e=Wbuh8V~FXMG%;1Fq#jT3ajsfk>(q>?^)X(c!-0N`jz)~`|L$F*-SN3N z5NJsCJO_>bUjt=U6oT_>ptNU5%(W8k}3|6v3X?H;28aYTuF)bNI?zD&~Du&Pqk zVOpaTcO5&`+)p4s9w)AJL;LUgJT9PLgIcjHFLoQuZ>@`UzcOd?bwu#>gKUjYwOgZ8 z?=ZzWe~&bqN!#^dw)g&1SGHA5sA#(rztgera-x61rl+0|OL>3GRoofK5&9u?ff-OK z$4>g062fqz!-`U;7t=&Njrv}xC`*;xKJM9Cq@-VsRd!LPC+{I6s&Gq<^aQFXz7;;StA2OwXbz* zVG|(^jD=Zr*ezYmDKy99McY$|edFq8{pV`k^dZ=Yt3&wF6OXf+C9eKz@@E`f*_04y z|E=+2g=uYB!;?C8djt&}mgC|6fY?OfPa2?+OAw%`4uelm~hs z*Z#4L_G9Iio<3n_jndiMm$d0Bd!@6FUZAQ=hdInsOV^X~_|jEM$F1=1~etW=1S$!41;60+E)qZjsgv(z-&{`dK|~aOTY0b?JO4(n^k)x>X+`Y@ds2bOoArWn{Cd_OrAE z2Y~{rg|!l6LC!+ot}AvJLA+}rDb#PpuFG_>Px*r*i-q>ZR`he-70~OF|HU+NFEQvR zOT5iE4LxRTp43=RNqH;mtWSs9%PVAJ?qkx%Gz>|PtAo5Na~_jcpjWZ!rBf0|sW;9B zw{f}{#pBtqlD-YC=JDzs^dGd;#!~;LZAPMnKu97z`ARB2!scApHtA0W&_|jR=-eUu zAzw*KGie9QrUyObu#&SJQ)^#H_bq7_Bon4~smY6}dEaOaH49^!U&;!5-WQ!`pGw{j z%)ac{^@7a)MuxtYmN&T>vuA%HL!V3Jw$`UI{s}?}-4agZ!)M83ylr9n&=OXlT5B7X zvMb_87R%|c4OtjR3oouGH{*1{;_4A?H;=@!ME@~U3uEie(R$r=Ii8M`EEUkRZKx_FVeznQ{M7MqiHy#jTh~i&V zy-R$vA6=N(BI6Lt--z5t|0{b_MqZQb=3VoL9(|X0rJVDtSSa%A1hLPmE;k!SFB&yu zv~ScU(zIFh6Vc- zI~%MJt=HnUVo%!ZJQp0!w2%l(QFUJDxi>n_&FJPZHfM73VWlom>NMV6wT!mkiLAR+Ce7|OrFzR0gI7zJva^|2IbUa5 z`v`hF2Md2gMZ7h*pIYSG&l3N28=i6FV}lpD>Ri{i(&eqC+VC%Ep`Bq_UcD?>5BuNI z^|He%FVR=x$L0=eZ?X8Hs5rSUdI-&%k+6H%W-#bRoY7XjSre@_15P+XOj}rF8Ku5D zrhLv|oBMAKW2a%gVYrw-P;aaXhtOPR%a-t6#vsP!w&kh=X~||jZ8)0^c5cvrmGg{d zl!o?P`THAsa|i8&TcM|oa3Y+vo-)cVFwqLoz1gq*NULe)U*d}>&tPp_arIh(k({G0 zw^+gE$$b8U^lFPje5Ez4G1PrFiiKtmK0BtP^*lUNtP7w-e;|+%6`$k^)~Aq z%#?Zu3oo|z7mII6i8i$Iuu$V5u=NC1tn}b}Y#rlW!CO}OG^>!Q=u3T~wL@9e!;Fuz zg3-_r+s5n{disvbt~^fCJ<>Z)dB+3DB-8YVXvZvx+{%*kmIFUJ=Ru-L_ohR_gXlf3rCRSzb4Ty2dL}xIwaC?GW(zu6LDt1e8o`xiqU6T%!47h+>3s@^{ll)ziN5w7Nc|! zEOBdS6B6LXf3FlPjk;hXwbCkgB3gM5b9C5fJWn!fKcvbT=G5r%s$Sp4I6C6^PWG-P zcbyNn{gk8|4U9A73)IkRoJVw*Em|J%g`1mwslgbk9PA8YcMf`)8RPcCaVz!$r*Q_jm1Cm^ z3-ZzY+Cn@x%Ew7JbB#1Fc8n8Ix7BO&%4rIs<_XyO!D5}C*Uhq5@Ow@2{)HGXRnV3e z1^cIaf_?12Txo7mbHw5UDH1)hnTB}SAOn9k#Ct|J>K5-8LpRF~(id`;l^<>#R zY>OGyLCP0p#yBn2P`-E;`wt9O6-Emx=QM3}a1JGkqiNPcEJb7>&Wo#$qa35LLsvCc zNulZf@spA{>GwPnyFR&;4`QP>L~tg<4!!XMj;dL=d0$CZZoT6#wST@6lNamn%Xb0M zRA)9-3|5UHgSlhZK2MS(42m%}XeU@%lcY7%+-lfksD%g}>Bt(c-wlKi?w4Bep+x02 zhf#x9^_q%p_%)_F$5gbP2}1Jf*?oL{y{U%QHM%8fH*>xXCOPw}BP!}xU&<7@HBi2+ zq-D~2kVOHnX}()BqNZ)vtvna>dOI%YmY)~V)EDYxnNG3(pzJ9Js;f=;kdDf+C^UJw z@}7YPvFf7T=oy4dnQ`@Ij^1QwDkJl^sv4oj*h{Ggf0Nb;!W{E@Kw{IC{O2FJube>L zy8-LHz~AJ%ffII(-D{cnJ%Ao>KQ&Q^ziXR}#!?|hm>Ucs#xVFenrQw_8a%L6VZTA^ zUY2A3VTjq&>!dUYHJ67&qzY&qJ8tT`4z*7zb$Q-h!DO@-(uoP4+56 zFPy0tQLSDYG0t)OUQ{#b{aJ=1qI;onn_@Q^R(sG!+Yv@v zXfyFbT8alpn3aZ4L~9UO7ByLCog-%wn(ZVBLm7;5$HB9-0g!!x^ zy4A6Wyel#MP7bk0so(dK#OCzGRARW4Y_!za&MeD83#Y&M8 z^!zTE_r~7Q^|Zqbm$=ssGbqfT%oWYYpMkw>UKZyJX`e0;gv8F1!_Jp{E0SkOnjEgX zd}Uepcb;rKU)K7_Ne1McHJ8qM!p>)+-s)4H(SiuiRr-IpYkPP3&d-s{&zDud_rULY z(A{(Lx+ylIS?e=rR2YfmTBFM<<(wA0$cVy=RFgg{W5JQMRQXT38X(d`A%8iD`%Av4JwubNJDg`!jANWKJ>dBi zTxFnWUPuryfS$mzfjT7m9@pYc#B>Y z@qtRdudLTp?f>9$6#3%SrgM#HAbNjGnFUqzwo1LFFj)A%J#w+>w3)^wru~sJKT);8 zp6Kk2V4Ny1cjv5f1AFMqh>{gL0p#7;Ds+xYKCP^A=KZSbe~HR#hW~ZL_>bXx2UFMw2-`IEto~MWz?30`Kt`=3l?#MDv@ zpqVz~<(M^$Z*CH^9uA^Hy=tz}Un>otACX_P-=v{60zJ!X%Z4$8j7AMU_~;a{mML9P zn;2GsW9P!8$*T+ZsQ$`={INL`3QaC({ge05QK-!mspGY9dfP| zKO6n+Mp`0PtnvY^w*51lG0s?i^uEw1sI*WJc~W+>%UYZsPEUR^gdxj2CBsi&pwaQF z3^kQ5ib@)o*|tKAg(}BZrV{qkMz1!L@4#6Oy@#_M;~cuCTJJw~u2X)w-1l7B?S3;x zrG1n&=E^AM{|`ePL4!f-E&kx@fZx=}yN-up>1OShP9{`Kw}zh9UvjkzxgG0o{#y%c|vAzm*Cf}#C^o2)>M{c86*9}*~E;^~Wv*1dEw?dCj6B zj3K)WVGJr6!eGf$0yP3>wXgU$T7jLO-=4?)CBqoMyUP0E-<_jgrwwKN?iw>ZzdKJ_ z&-?m^7^p-r8=-2}c_H?}5)olP?$e4RHFy2tT7^pZSqg`hoql|fbl+km;<$h7{sy0l zL(SEOI?H72YV^`ys{fbSsXHe*wF*ORx|hU?Mtv|w_(#o1>|xEY_PALZn4~ z&sm9QEJiohCbl?DdzS3F%C6@J$DbVx=;h$LuXsFP`wRTj-qP;{;L(TFx z(XLQSiT3EMEmhlw7n^-pCwfr8IXVKimK!HGsc>7USe)sOq=?52jfHkWG%K1 zldO6#F!qgr>>aY%$~AzPNM{&ZU{tD!lr%5de5_53kz>sYOtNx&DjmC|v7bGbZcGAQ zzJ0yKv{{K&mUWS3o%!2Rcp)(U8810Udige)e4C*2O}CA+&ewgTdJ#mbYq)wr1(qce zFoN|T48j<_#gg(#)_8Y|uycbToADuiT3UDrgMRMsj={3Ul3q@xTP} z=c-};pKn{_hNGh8D7wRZhT629WmY2L=u|P z)9GGcb5G_hThv@s8Yc%zJA|0wn@d+qP#B1WjZ=!d*qZ02z{*ezfOV}ZfUK9yJdSv+l2Mw3?9X-Lp1 zO4!UL-hk4HY5UhG_W&93V!zz}Q!EqL>$Y_4f7B6=>MTA?_Av+P%UXBxJZc?s!cq>0 zyd3sIL_xQ!&vs(I!QSG-+*#@icgc7%V5l|EsJ4(X~6Nm6@2DdYoiTGG3R2oZp-ln0$F z<16JDX85OG#w-clOuKfXgPow5>62x5$srqL;4wNG6Vl8o&-Bew%?(|fL)}>)8dc0$ zVK{~5r-2AdMvi3>bCgvre9fyZru;3ktA|+=>Zv9;(aONt$g`{1*#P^{wMkWhP4r5X zA}i|=KB6IjF~$*#5cKK=h0JEYh#e5B0Orb5>MgCGM{Bto9UPsIYU=Vg z(szsDzf`Iff${!%W}isk@*awXN_`Sj415{DOwMB%C>+3mZniniIEXsI`o;lNgqbWV z9fDAIi^Z}@#t5>%yIDGfUNSL|IrV722wo#GTgZHj*_G+&R;IMQf~DQ!Q^#wmhb;pX zeF(3)OHUm~n>#B$(!5f`f5ZcxHSeVq&jUWazX?-4-;@_(3L1{gN^uv5u8jr~6!_xnV&UEJ<#w|VQ z9cxw8X5EhHXsy-lOmnfBnMX4-70VM|6N8)x8NKe9lzB}I^Pw~`1n`Nfnd3Dm3%iKm zeDSu@YSJubvucFsX)+1Gf$lPGweNS?4mJyz_?njy*^OvntplutDhbZN3=DwOH{DRyR%LEh-I%|0~}0K z|F#O&c(-4XtgoHI-3q=%dIfgdW>m*K2D&>|}6- z!a_+K=1`KD>ki&-1++JJSTD#^UH=?o_|<0cDr&uZmz~&PhgYj9t4-?-qBXJ@z&l1U zfamC-698tie4$scSw#SE(Ege)OOuHU+j)UrzZbyArWe2`<|dic0Sx+*rP~DHJI6|# zYv}+wl>30}NdRnEhjN#dc-Erd{WnXe;{j%evEv=oo8CL+EYl_kJF*pUssvvXD)S0u~SVqA_3L88pN$MIhGSWmlp>8+6XZ zP2Uq{;z?5nahF0C(T$u*=^!2_2p#8U0_3wF9*XC!A;Xb!yv`LT%}7%Pw|Mm=yw!M( z8AJa9W6<-m=<9n%;(f!5xD1TwrGj_Tx{z~s@$GsKD+j^LSpC5)=yjq4b9;_Psh+ey0{cU_|aW`g9nP9Y)VfeUVFiJs+_n58J(7G$a2sdtPou zF0;B^ZeTWKAR|CM(rDKo%Wf?9Jqkn3+Kd%j5S;8COhsh%l2(fBMqcTYeDMSW_Xh6I zmfY&Y!~fJ4Q&3gZ4pZLJ`ZF!LjFav(;MLgLD+RzTZg=l0nnuMSSryepSH%msyZXv3 zs+$cn=P9hDOlL?=$M`UFv`VX-vcg6~a8h6i@9!viaB#F5uP(uCqj&KDF3yw(moG#! zuPkgV=X8!-R<xLM6(L<2c29AZq{2PhEo9O`e$^IMBPgI5k^MRF9~xVWTlP*}HhK zo=RITF&cK1KJs^OP^0RaQ+xJV%oF39#5^Hl#dJ7Djj2WP)Q*JQaIR zRj?C5Wg>~2#5uA$Q5CJ`rL7rJTVKo}=m4YHKVa~nt^;3GLogIIG%*ZENIqJy z*f?U!$i#>WRNKal?mp@>HJ1D15^3&_89Slp_!s4*#)+@UDcvWx8LgyYx5PAVO&v5n zwEKh^J@%-Z)j0DWIV(2vTsbX9-O~SJMr>4sS)}B^NMDY7MY{2~E|SDXO)L`T*o~Ol z-E8kOU68MK3TZs)4W^2ZE_EBG@Gi~WVQPUIFx_ZQmi#LZ6X2B*~3 zLetboL7ptm7|szEXo3YicuVzUDG|{a)`q9!QF9PR$iq0ra}( zYaM%y6VEwViPDni*?3JSu?34yT&bb|)79(yB*o@p&#r~M6U88cZQv~!b!Ce zxo4f4b347g(y=db;+NvBCswxZu-53=!ggy9&7cV0YVuJ{@-be_$8D-u=S-q?^{Kx8 z-R=oQ^oWekbQJxU{zy6lN2wN@*7@^dE9yJLNuH^jklntq>dtjyKl&o~1tRwcy6DlS ze%t?ra;qAP9D1&7pj}BI86{a-z9SJ~(=$eU`$UW+EDP}f^L?jF$p@S&$BbE6?q<{> zXJU9IdyDl>&4+w9y`1{SXYcUEJA5R`lPA22%9l=(N@-G=tm)*oA1ho7 zR8u^#$qqhd2Tf8GwT$k6(`vPN`JylKlKvPBe8Q@E)z@uZ=K`B^v<#AdH2Z4!=?5OI z2C4~KhQEsC<#JC9-4HwCInb!FyV1=q_-d~2jN=_X`!BxudL2hbr5*A@wS%sz%Bng| zvi&yQm(cN>>eaZ*eJx(Lqbnc8uvC!Py>Av{x6_V%r$6BXKQSwQvQux`rP}w`QtdmG z3_FmhjnW1zZqyx9-U^dw$qKImUg@iOiGG`xb?@2sTXy_yyI30v*2lq;TE=x!ACPxH z`byQ|8iQ__t`~o%pL2#31#2cT?1gIVV5W8I8GW0W)ob+XM!@WaPSYMg8Z5N(hY{y3L`!9%G3fMS$HjN0oxDoB*saa%ceCB| zWhT-iR_DJiI;pyXZPDV4r%gG6#;`)S{d$QF^I)ZdyFi)W7-;CK6;!eYSw(bbVEJ`! z;9$;r1C0#Skh%v|Zld1E~YGamNZLyu9ZVz-1Ds9MV397*+)G<_`5c& zH-@j>Jl?WazMlG*F8%s*tu$}R^vPm10n3>qWhFD;Gk)t*bz^PkL=!vt34CREgQejA zIf=mGkJPU;+QlwKU3@qCvt38b7ontwSxrs_#ykDu zCadOiBlrb#d^xM;EoR8P^nAu7iW%Q-7T=k6>utNFUXjw|RsKvOl8KTd1F6EVDy*iJ zlelHHI|1<&rm(%{6w6_JQEoJ{rRR0IfZWo!QrWHGIF?9r${zAR3Y#)B)E(#t(Y?S6KWbDnVA4S~{ znbd*wIrdEO+-H15FuE7S&QhKA55^9v3z`C9*7o%GcXI>cS+nK}BX}k0-)z>L-I@N& zP5WXq-lo$Z#k!$-PW_@s-EE5Qfmfc7NLmVAp354-2@aL7zi-!HY5q|-ziticTM;mJs-gmLxh}>=HkM?ykvB5~)h7TVYH8*xX z*KXLi8}U1M?&acht4hz^WJGTEp1VjUZZuNY@!Ts$&1Id>-DKF;8}S=TRva_?FnuhS zy8LxS@D%Zo(d4aHOKBOh{){iBGAeB}sT)#~M~s^9cm=$8uQcp4jrdvGADWlUP1;~l zFA;o`d2Uutg!$l9%RP-c*|YeLAIWQ6M~TxVKzWZaW+EZwUO8fzM~V|59gRDaI~s{j zw)X`_>EK~mI;bkKro`vvFO5A#@WPZh$F0Nu)dV`YGt`WiF-Q9ACx3w9Z1I05)iG+u zbAD}?qq8qCaEpHg7P!hC*H`N`^jbaEz>27k@k1k1IjCUu}KJB%Y_X77aBc{Xc7Z*T&dDVyNvyep5-&yHzZ;9yjs=tsH>~jBE`-A z$QD06z!&|IS2ewVtmrR(Ms7vDhJH!{J-j+Km~7U&(D>vmZ!4K&ynB^oe=U~3`}5&* zQUBy*IWHXpk^X3H$LX(CC27yXg6csjvJV;)EmC{^ZcAo zUhXcd7#Z(Q2z#sU7)`5Ib-v3~1IepHbzvLAT_$yyHhsu2Pc<&6;Oo+b{6_(fy0>(d zI@;R@t|M=bHfe{=slcmE$^~yofKdB>z;I-r`$QU=DV)( zo~vq%S{CV9taq$+UUHp{uK!M-^NO|r7C}FaZLjE3)*1KvFsXQ-Pu=Td!*1svzQA2R zpSHQ%s4ay#E~W^RuGC+lb<-W8E*-cDyG}``6{x0kM(?gRRO6$f^ z&xw&KF$R2fj079iR|axbn$6p#c_hPKK9L!wSYq(Mam@VRYNKa~1e3-M^6yvPEyS(#j|N_kQcZXJz%&0zr>6 zYY;56fL(vP#EaN$!`d|Jpy7MnSlC(b$~)b%b{8v%-Za8ZKKA}828ewiuTwk#O)(aF zQy|UdZ>x|tMsj+7kLlO7ERaJ%;b0}%^FuZzvz^<85Je2 zQ>BB&7qfmNctueB7;G9jwcAiSi{Y+ghSb-&!Sb-pY9p&EkC67MrN8Lx2$a`d+%`$q zbE_df3FX*meN&J+d0+5id8E8Ppev#Oy1=Y1VRfFo4=K*s@+N72uGP?VLC`23gSJTx z+1(etzrK{X*LWcAWjBP6Ju{9jCbvXh_cJ@g(Je~BeblEnB~Tsi`To-G1dP>-+Z4R* z-D1Cj8#=FCZSG(XX%W1tY*%Kq7&hv0B;yN9)pQ|DXguX7g$>jDeegzGI? z+nsWvVNr>nBB^g8!;&nB;Jk8GbnHdZNxvEKXjiDY*bcI!Ls1j%<2~0oCaT9}1uhy( zPxQkApnf8L1BDxBKH~c5s2ieV`xi%0@zu!U$}UsQS9%{`ZFIB$wW{tq6}?tPuKV@c zjjH}86}b@;q!Gpt{Cts+$H*w&ICPPH(TU`gH)vw^rIJN^Ze53Shp$Ai)Km9rk;&-d=d9pSb-9Fis-XM+M{ib(TqhCRGI>D!rymg~Xd=ML< zY7hF~rnv`QQAW?x^q;<s>;#HgVn{ZB`ft|^&U1mW zVX95e7_5_XRT-1(tJn<7_|mp}vaD{DZ7m9We*#>|J~^9;`M*rsC&XFd)$aT;a&4;-ZMu1vqt0@qg2a^HLO_U z5-p{A7CFy|GM`=kv^wwJZAR#&+p z{2tUDtE(L6j6-|BqjZb1Mj3(i;m(!rzZ9V|Y75vt?CdiAS#=Ko)8(}$iZ(;rVtGwdXr zZ<5xNvLAbz+$smNCtz-SP;szp*VEcYeN8AARPoL>`D1RC*XrswB^BA<=;<1K zM9T1W1(hvQ6+x_0Z05=_XYI9VOKH+j)NW+uFh`@PDSfFFOSzzj#uS3jO&R_;m!^z<3^= zp!N+_*^B*qM9$Q@CiJ!=#)E7uc%Mn@rq;E6qk;k2n`Xwhzupx?9ynC$Bme$0NyaJO)yV$I1G^kx9q1e|DHGX$ z>8@+F-nGfzd0_uLTu~^iqZ6>Fn(;Gj-><{C{y)j(e5Xc7Fz{0yt+Fl%`z{L0RpDS; zSl(GSbe-WlKP=A+`!5WKnCVB~9do&r@B8O{;%^w>Zz&t@Yaw|X!oGXL^6qftzHo9= zS(kj7wW-W`tZaZx+#Zg65%Mo_y862LYLcqu@v!fyuzWHc*&I&3R95?Pne|ec^GaE> zOl%7KHizZY;lP_%+%UtwkQRhAIhc^QVs$KcNr3(C)c^ zO;!E(GIBcIcHWlG(cEO=BDq#KK30lJKqqonJ4jXH2m}~RM3eGW1$&tlioY7oK@&+kve(7hESt2*w1Zq=SXLJr$OrI zCQ2vxPdbwFQ7P8P%GGqcnK)S}hZ3_Joz!h;qsHYdqps2`NIkZ>SJ5x&S1gHvw9q3E zJ?r}0O--|Eiqa1k%ie5ZUGi7IQhD=V;Z0h*eXDt?e~Zb!%6CKCrq+tm5H~Ym0 zIRhv1v8rYmk}~Gg)t>M8d%I1ch7gl2`)V;X7C!cIs(kzTtGxc-K5WFAsU0441MG$n zs6^Uj2BUmtYlBDFP0rzFu!d0|Tai!m#wH7g#ztC$wO^h{8^89&FWr~ir_`!tn*SlI z7))yk_E_rbG%{O%>U7hj$M9J_T+t`fXlshp=bhcLg$zcyxr8=RZ#QtiJ~^)RgdXH* zLBp@E=}3`_&8(WzhDxY}!_~={@9N=sJOg!;MSKq$kzW)aoL=%s2Rn=FN7LmB?X8Xo z_t4@9JuI5f0_M)>6-QOmh>6#Ovp(*lD3zZEE!*#~j zMUhp`{vlX0#(!aOgH2hzP$e!*6w4}}s;O_{lUl{D0*Izm!%)|*Xb$$9;BW9@O+@;A zY&a=v%yE3~(|osQhJvgMD4M1>bO+q~*SY;SUGiiQIj}anl%h{vYfcGIHl2oGDuh;o z-_Rk|+Jljdcc18+WQ|FT4UYO_NE3Jg#?g@eF(lTK^6xhxb<;aBo-ex=#Z3G)A})VN zLyj?GAj_zr{0zDevaEmcxLmIa*L7kFoux;7GR=H9QaQ@~D=DY&#{1RnHdp&|^>{f- z{a2e6^9qz%ADu%pct>_;Laj}q&+w^KkFud2VqrdHt-oIXS<)z}&s3jM5#2};J!?=~ zgDk<9t1KEPi+*d+{Mf?Qxw*m^qwC{g-sh^_J{@%uz9D)0L$%39-|rgau9TN!^k)uq z2I`u<2D)~%Z?N|t^KNXZlxF{rr4*w!Q%dom8W})SLZwWvob0sO*I?@bN@uca81I{4 zjf##Aj@aGb>vy$aWT|X+{~!G?ZdnjYVaby9Rrg7Mzutc+pOFzvfz!85luC!iR}q)v zCU2On&AjN+sgXU^=eivF$O)8AQujyus%wf@#$&fc&Lp-mwL?*02n`P7YeLaX^ooGe z7^6qyEFvGS&D+gT6VNj|Rjs6Bpf<9Zhg5H84jSQHtgx z%UG)@no+uFrg&Y>b`%;m=q_ho4cNr0^)6>JrDUCrEd}dTev6nII9|+e>Je^qnerTV zxS!A0YH3|12d%}(32TIJMi$eRg+9T=RT2#<rv_|-DO6jC&Pt#=3W2i`Lw z>}Oo>-HAt#T9@4-ZF+>a$hh~H{dm?&WH`0STjYT5&BgBQU07w;UlnF5{-e}ks+W%& zP3Gf#Mw;l@FJM?}(K!qwn{f=S<7?Y}t*~7|2S1@qU)|$B>MoN>M|8jOPYt`jdi8X~0{Cbly4>5gby~!uidJzRVYZ|{n zoV;rwSpTbJUE)T)lH_V77NzNd234dYilod@t&^;YY{9x4ikrJtOmik!7jTjMGsibn zS?TCFXHt_Ii+s)MrQOHXM8te-6_2u$GuxbF%&wY;n)PgBo--FQ*c`LP9MPbxxz4=n zWdo*@w0UfPmVbVk)%bsSun(WueX17W!9KB>2TWoL&}EM`@qzH%s!5Y--Ke61touc55LduQA}dW#nJ29&--P~MEKlF2^@ zWr$4$*}4~%04>@)%nUss!}ns5)j7>%4bf>8`j3}#H_)A7sG%lUEy_7lnrDz|>r7d3 z78%1TeA4c)d`xwv!(^Mjo{GxJu8!-_sp{4jeMbFiVJxUZi>bAtkm{m|AbMh+rIem1 z%*WNK{C>T%m@~8^tLdf0wdf(J@72;Zi(>^jfflo&w^6F3y_5ZsHF}EL>!e8wI0d=G zy^6Qchnf`Kj2oqSsS0Gm{b@n>R)0dLS8qu8x>T7!ZH&nEGhbH({*RzuQP(8It9q@s z?noPSFp)|lE-{Ulbxkq&-iJ_gcI+n0WRu`V-omF4e`Ct5%H=zQHHRilpPPY3Onlvh zc6+2QjIfRE-cd!n}L8iw08|JUd=)b*17gkIe)_oGwE?u#7)^weW zyt7OD*(~q{Wgv~_5Uqz|HNJGp+5IsPy+s>^xL;zSA09-HfgUW1zFuG*@@HAsqP45nBZsSwlll+uF z{qAnXcIkX1&F$Q+w-R)0Yz+2ylgccUDOGMW(^K?oUW2N(g0YD0KhcbpqqgpBZ!DOVaEouF)#a7Q}-#-fkx1&JHV6J>pYmt ztFsR>m_r#OvFm1B3)|xK_qa5PgK>P0Zz;ZvP3RL?h#(T)P?mQ3Ka%XBM`*0G>>A!w zUmyPzw}+kzSVq<8Yu2k`VYIOQlj-(gKd|vZZC>4Ud(j4%at50Pb0(WuhG#}zmh1s# zR$d}&i|X#(u&$ld(*LR*%KN&t8JF1?GX*PiM!ducYY;aFU-gO0L)}nAYYxP*8)7r( z$Z~Hc*jZSP?!Oac-%oQdI-pi?wAswvfKPw_wUU0+*UU`inUX)2QBhujhDljKtCE$Z z*kkB2uQRbDaTHx)YW=y&Jc&DH33iSb|rV>8P?1p~{{M()IVFqr4Vm9Gda2>9IIm}XQ zg#{R` zT7&-wkq(%FJ7EFNs>S`m=6x|HJe$;sx_izx3JV#0wVSYM45fc)|Sf#H%akD~K1&!ksV&XLaNLsnjP}I0Jtg z@c(?S!_);_*XI}G4=l9dPj}p3N;+Wfa?$|{u%!p?uOJ<;0Jp>ZRivXQ@w}RJz#QBL z3)fIiy|{iY{=n=S{DGMq<=TipH{u=^;5L}K3HQA@hbv*`X58y@*wTbQYY7*Mb%YC3 z>j}3Hyp4Q-nLCI-EWp;jT)z{4VD>Kjftd~X(~tPUHqE>72NqzuKj-)04@}>SKbrU9 z&j7-Efc%76xD%%SO1?F74%b8RFz)sFW4Ip(AICjRKY@GAr*J=re1hv?=4tYOFyX-k zFuR%hrO%(CJ`TbCvs6Ktg*koxJpO3DfIma=2d;Zx_C4MYnEsIZHUjr>Da?ILy8zRl3XvMgb6@bD!93gw#n+VI zD9-;&`9bkLf~cggM?(F&Te&CtG1Q#Wk4W9onhc9sj4`Ul06;IqIsI ziaYA&0;ua|yC!w71Lk2%EAFUUZLk2h!!&g&y&KozYAC2n9k2jfr*WM+lY?pM$WEAt zvv%j4I?g%an1`F8SVVrz z#J~Ny2h$ny17=`!7U97KFn<94!PJ5H2eYshzf%X1K3IU;H4ny*Irw`7?qL>gg9VtJ z%e|xV8y4Vtm|Kc}P%M+8c^>ZJQkXl9_`y_``0dFvuob3HCp?&iTVdf0{3UJaGkFdc z&gD6nJ&*YBg+HsLSON4Uiqh^MqM`d;s?yb&9HDE;Zru52M8ag|IR&_%@h6s96v#Rz`|3whndZ! zi84$7Ly8qJ`#kvv3$T&0D{SQ&6#t^UG+&`SD9b!t3Nx?b56r%fKZoGYoA?8>1^j{e zckyR2{(QhS%@6ShX8(;phmxL;sCO{6oqMnVTbAJOC!|;NQ_>4jOBKzB@f=(M)1Q;y zF!crLJ)HYHNG~kFyk-aGL*2@LgU4ent9MvvtDKe&haZ~4L0PV(nZ-2aYr!R+^> z3+8{|-ckI1S`EIq!o1Fkg@VFg*bOkLMh&fZ1jxHp28kC3eCBOs{}LlvoX! z5D*eCDCXiGrsv`Q47exmVP+rP>+?l~OB*5%AY7O_ko<%BL&(3gIA2UW zVeU}kskwywJ{ulRx?uK5(xuOjB36Yw8qPQriMu=J_;5A&ztKg^zu|L5b5wfU=I=6w8zg)8v?0?x0(f0()k|6$>J z{J#)?)=*wBo1?r|kEQ@e=j9|50SsH0Jp*H!{qN}oWqqcjcKj| z%)yq+VV?BE?4!7c>Bn$?1>rt{dzgWnVfsnJy^{DnMYu4(nQ%3qCETlU{~X~$@jU*( z%nSIlnsDJtnBGdbn*YR~s|oi-{DFm+@JI7i{JDnvuW=pb;8vJ=gX`CF{wDrI@fP_5 z3vZJ@*Kxf-{=mY!3M_tXh6R{fgFl}WF3f*H zxKMNuZjS3ve_PUDk}jBm(Hpt{75>9CTn`K1Q|>o${|Cw)=HP05{v-7VrhcOS+{|-7 zQ-5F%?u40Ns6T7Tf4CkNV23_ehG@NobC`n}!w@@R9;VlE-!#N(n6nJg0SmD8FSxUD z4|A{pQ;s28*5lr9h&Ct!hS;vpVft3igZKl}A^g$j5!~O#^RNx3qPT~m%n;4D6Mozf zD`7T)|1ed7`#W$CSHNtgAvVHPl_8>cavjcsnOZ}v*XMNxbsT@X5ML8HkCCv0ETqp*Rj{A5Xw!w5W>4pWEzMtm@l20%-hV~?Vp@qj(;!pTZ%LGdW%s`)tn!2)b~19wl5PMCw+^!Zby^G*0P>4d4xgroTk z;k?E5XNe!oz}5QvdCC>$x00W4bN&+b3KrmYDE@_i?{NPW{Daw#@K19){uSV7#2e;6 zCqH543)1;6;dPL2Fbj2`Uwlb=-oyWI2p<;yOTB`rZ^_U1x&9sb2~$6kewcyI2e^Y7 znEHwGhiDs#=!cw3Q!Iffor`uTlqsBlb8ea<15*|jA7R0V`;YL?F~tIyc1^Jwru?SZ z2D4C)HAE2qG()CXuNgMQcFl+>8b2m~;Zi7~ga^~G1Ln(2(fSG3%h{z8=3qge$ME-4 z?!zUpkT6AFpI4Y7`5E^si4V-ec72}2KYd<{f1l%jy~(#6b~VLLC>l&L>kH0d8_dD2 zkfr^iaR<-Ar7#cMVF7kP(bE*o9i$g7g=yFhGq3|@_5CmLPv3``KBm~L*_Zf##q<45 zu>xkB2@e)v^lQQyNc>@D6#l`~X!8FX?n6Dc%8w!bFf*2Xgt>8q^B??6lTR=`5&twN z5&!>kzm@P|c6Y*uVmkhPi$5@}>vx2|5B|XPzW4)E z`;m_CxxR>Wz*L5CVdenB{ekNTnj#DH2T>pN`4Zy!BmN#vJYnhx$`gtsP0{ib_m`3X zFuj~~!5mEgjQbVTE0{VF_b_u3?tkIAlkp#B;bxeFj-W4g3h9EWQ%M)h!>EL(kuI3Y zk}g<)tZbpZC0#IchPGr%-|I{hlTz?(!iU-Oh%XcukUo8WA?Y)@-$wYb0JlML3I18! zhf87VQv8GBGQziYpPKMBFDHDMy#n`)Vbiza9%f-X%tKZ|i_GoRSH`wExDtvDq#vg5 zCjBn{-%ozQ>_+kn79J$Ne(pa^e!h$Ys;Y}8^NgYaN$4cB89^BB0RwwTA@ zxf)BPYw^F%604!;f_s>Ut#z;-_pp${J%uTbzW+-;IM5-75!4*(U z#~+y81AiI`ZwCIrEL;x@Gl@@c&Sw)Jn43p@U}iq?Y2x|<;sbLF@keuC{ON=Li|_}E z4Dr!CkoffFI?TZI!MKOH#klWBybr}a%)s?9y@YW4<3CKp%wd!l6o*q@`ud+N(J}!4 zjAan98bQ$+zG^E5bjPSoiKM2 z>4f5B>H*BcS%ZnkDfkBqPz>SxRNTYD8Mue3GYNkv=P(0vXOT{rJ{$js!E;Eb=DEZd z=3#O;?p9JxFnb>Hf#Q71sRjSx3YcGIiLEf#W{JiT@G{a33zu7B8_Zl`iRO{`dnM_D zscS4zfQ9SHr%^nAgC*KvYKAwV^!eN5({A|pF8KrtaHl^1 z0Qb{4hwEYXL+Z)yg!d8k1QuXBOmC;2Oy~M1)DxJ88({%<=Gw=tlhpEpAXD0XI0+{)NaP&EJX7T(E!hxv{{DJ8&sgJX{4wt~xSJX$%uc?o7 z@c$dag*mucpZ|w^noD~AOL@Y=x0EML?M5(fH}h!tqTap#68S7xQ7LpUdVkH_b?m5JxrD3 zes37FMNYHA7CT`c&e{imlD1e6MYS!&zTB^|#RARR|Bs{lj_+-}9{~O+?#|@7ls1p0wv17+R6iv<8QB}um)JoL|HGc2MU+>rRoX_)l zp3mp|z1;g9=Q|?w(63#Gnw`b5iPb!Lm?!cu%(w3@&auG0ELkyGI3hIeYRpdN_0Gw# ztoTeGcCq}Wb29u&{@sjM7SC!O@l1X@BGm6LKU-O_n;~`HJ)Dav3wAMIPd=9G%eSXI z8#!;Z$$43Bs_wny+gu)oE#%qTK5UF`X@BM%h&GS#{)PChM|l6jKJ1HbGa@9d@-k!i zKl?M~0CU#uYu)ellLfn2ae(=@*6(NCb|XSNOZLZci*@@u2b-C*n+3xG=C_xRC41s{ z2X!%H+E9KMW30l z=}>Vjm~ognn-6ntcC%zS-1*qTJac{)tU1DUX3TdV5qep$_7CRS%8Dh!9{O{nec8s8 zeaskNOV8QPg8i&mf0T85s-Gzbn6cq#@$6v1iX|J5v5uV#d#RrZ(_^h?7c&kqXVY=k zvtY?#hP~B)ymjnm&TxY3Y+=|({Y+VtyUvUydzrMV|3v%jr+yauj|e3z)}3Vi0pgjk zmnCaYmhV9EELlbm5`T)gL-dOU`&cnKRs5m)#hm>tS$~@N!}N>caQ$M+hSPb3c!qZI z%vs+d{wVRR*dIOG{24sPeDqX#n4Bihnd)K(!|D3Yl#OS}$95)X$iwU`dCqq3PI;JL zAWs}$D9<^@m&(J671PV)IoCWpS#ppS(?8npa*rPq4zakxl<@+v0%lL z^;fEoZOmS=js%%;h6r?@(KSj>{=F6Uqa!|aj%OvuYF=Imo9hvW4HBSZb&*0Y7_ z!jazJkcWK?i{!hcjo!*~p4H!}89_lC=+r|CKtTE9w)I29EoLDhDYW=U(&*C@s zXTG-mnXP00()!=ppGj(ehIQ@#nDvbBv6k!EpT+w2f86@t*`L`4_Gh}G{r_Uj7Ut|= z!TvbEk;mZ)^NjD!7VKupA%-UXd(!@FWy&t*>|@DcR!pA~zp?yG*w2)Hn#SivJxXnXH{4x5+UqAkVNdTUq>B9%dKH^R0NcF}cY3nKSuL zzAooy#eRm1o&SI0uW){*S2{nF!sGY7b=@96W;c5LqBnW`eh|-g7B|bo>K1u^bp1AY znBFcAD>nQj-yQO>x=S8rcgqtN4+T3J?(sZe&UCTG{r%eWfZ<-x1Lkb{#p0o2!R$WI z1D0%F+&sIP^m-mFA)YNP*~8?1eO%IhY-aL+c%}>^_@H=}kBDdfnD~+ApVD_0ELd_N z&i_qaHOA~<`mDNGJg2Tv&i%Z)m~oKF3+fszu3ufOI26Y(scQ^hmY*eu<9NV1$IAD2 z=VbDhbB>euZRcdcf@vjx9KY*4<6VExKTJOI{HeA6-=06r zKNipMspro`>p%1SVfne|57Ym6{!B9dLjLHN9(N|+c-$vj|GmeZ#ZUUfWU-piFva*6 zHKBuHL`|rekEscbQ;jFqgwE*XnlQ+W=``!6)`Tvm9AcPW6Pl*mudXH((RnptnAxJ5 z&|K&GGBu$)T3_Q=Gpt*-CbUFyc_alfkZeu}&+)ObI|{E9W9mmWMn{m7MTLMy9P zYW!VS{6b!$Rj9B)t)5}zr`H>nBj%r>tH{Vcbr3H5W$|Gvg&HpREp zgaMX2sDGaMoz>4`clAg2Qh&mI)X%(C{c*gn`sW+(r~c^v>SxKO1N{^()q zU+Dbp>W?0!{zcApg8G@}>SuY1`j;|3Rs9U-sy}+3`j>W{txWvNXg9;3j_z9!DZzA7B@o_v;{JQcoXFh9`_f5pFGRpfV z)~`0o`zCB0<$V*^*Bs@26X$0qtF=aX-^96pJ<9tg*8OIb_f5oeh}qhsd=JEYI?DGz ztXp@K?}6BNqfx#GB45)e-vcq;c+}6IZOb+p<$EC3Z#ByMCDyl$3N=mEv5Dy}@-W#| zo;c3r*;t<4?aOQr`?Adm(S5{kYJOk)GCRP&n^}LXeVHC_UuGxRcXM$k zj`H6c^Xz5G+AZWcc~od+cG@Wa4H9?ys8F}1dA70a(068M=zFvJ&(wDo>}PhCzHcS( zIr`4(Tz!xJQQx-~cb>j8`;)#izd+x&G5=?MXLX^zGrLIN|Ihwi>SuPb`s4Ug_5a@Z zGW9dPO8pGisDE2ttA17t+wlhVGrLj!EN@nSi}4-mXL_glncSuR?ZvY-dbj#n+@t;- zobz7wGrLdyaonr^9bLa){m}>1&+Sy|h`s4Uf_3!L_kEx&8B}_BPLUhPTwu^q=bA$G&WfzAc_b zCB9YMJK~wKp9Smpwa>fy#he4I*s!0t_wZDoK00l**UrUHA04`w&KeztSh49a*JsNUog)uRHXrUfyBX$={`s?=$-L2_ zgqq%`PWfD(+$_Ep5i)NnYQQ~OV*ugyuJRjWEYbi^@G{Y@||X$ z9n5!eE*85w*Xj0ebuMNcWXbqh*mQq+q6aw_OE#Wiz2E5TWYQ*{;Si6*nbtFB$$>aN z)V^mKvxDI<`!YR3p0nlogFH-*l!pb=b6h{lzRWqqf=%a&J6c~^aG2>a9)~~5&u&)7 zdK@~9kJAUH$9o>e@d=)X=gF6Q9x^#eKbf7ZpXZA^ML!u%)lXKe`x8&|JY;dY=V2Uo zcphHBGdwOV&h$Kto~8aj%XhZ=nVh43R&2P?^>fu9{iFJscdGv)o~M4M=c}LLPwMZo z{sQ$!|Ezw73)O$Ie2kwR&brjk^kVg2BJL9PGhC|vON}p6Khw+A&x|#f*^e2+73ycf z+RJ&R`lE&VqgSc_3i~l*dbN0#ti4kHYs52W$?Q7ug?P3xyo2Q!^q0lE`g@&oyr;h`-`8JOlg5O` z>s_BRCUi2HHYN;4XO0Q!4dU6!ii1pNneTSa*<(T%a}F_`GbS|MC=UxJbH{{X=4`&n ze(YwFjBzh@W417#Z=UG_@eB*)xkcO}`I#+c-#A{{zPHNHE@p1ZIuyrjy3O_F?aSg< z@-SP`{O#r&%rmTHp6SZY(<6@EOja?^u)6p=%&#e))jH;x{Z{;)=Go1#p7Y=3+`n^v zW*dwNJuEgI6Kd|}=41TZ!1}Gngx)ybX-ufSM_e{0v@+j)jMpk$XWhN#_Z$=2n75Dd zJq_nOYK-rmTX*W1(9Uq$n9$FX^}Vj2HOAjjocoVs!T@tN-0%AN@*s^!Z`9A|P5R054t;n?{yX)7Ifq%X`C;R`O&a-`&K2>CeyKobxMxP8hy6&y0;voBzfl_*UPak(XUezteXn|I_zp z<^5iMh9Bf%`J?kZC+;V8F>xc79u^#8#fIm_FE-ZqFvKrD*6aWFA2BvGzF^EwCL_m& zL8ffzcb)Cb8NVw~u-{=ocyoI zGv0Za)H)AyHoj^dJDE;&9_EwBhV(V_>|#1qT`bu2y79EJzIWj|hgnV^8=42?oiR3a zGiP{1+?=tYg#~+<&l~Ie7S6xa*pM+}FVkhmhT1p9v6bmB)gQ;K`-iw+sh=hLSTv~r zEqPW_Kl7E<&x-Z`G{1)WnQ?$6>)w{PQ683S%EM$Wc`ECEBM;NHo$;w1^eQ7Lv_999L!j#o;(^ z6F(&GQ1Pr7zsr&yCY}X*;`nfV{=&XT>KjY;M%(rIzpfvpUo2S0@zMJArF?8-evE!G zJyyTIlIM8+ist$iJyHDE;!hIK{1oxbP8I)+ew;3zRfl+nGxT@ZJaeWTV9thb&7Y;e zEYB9t&?(P%^0A#Idzqf+{Qom%E0gn`pE>KkSI-5`!`#nR^s%~7o*%61l7|_4nO~|u zKf2D0;WG0~So@QBwlZVMoONM|P+ciM^Fn?mSINKF68^p@qA*+A?9ovVg6Rn59S<>6K{-=Tiy>}7hV`bRt8UFv7SGLG+7{}^MoF}+9qESZcozE}M$ z*&oOEso!^(O6GLar!c^j4Zh1%vV-aU>W^bK`c6~&fcjZ-FpeKof2}dQm_DTbIA+sC zGHlEZQQi28l!DLkrvR*c_$%1ZUKVow}Drv5479#=n87R>tOVa{gXkt*2DlEHVS zDz-3tS{^3P$>Tdy)eG`4?bk;ZFY9BS>u=~I)4%Iu9KWfLGhAmI%Ss=k@9N`BdEe7V zChzMb(@*qqmi%msekz{fGx4*i1o>>@fASI9&YR*i)sXyAKe&&~| ze|6`+Lj6n&^)tIl{cDJ05xrLZ4A-l_QT`j$&+I1kuj%?N>SwrJ{n0zszm~lBs-M|| z>SuUN{lB))lj>*wH}yxKR{w8Ye@6Yx*cW|P{cDSVPW>#{&+K{iuVelN^)u^Ne;mK4 z{@=>?lKP_q>SuUU{i!&1GWm!4S+HSUFah+{Vkh7HZXqi@XE!-6#%=`S;;@5;}DwN2vRlbrbGI$nfWjDf#FMiWA&B3ZEpQH z`o@xj4BvX*Y~kGBd)_el(es93@$sQ)OV*4J1 zIzF^8pFTeHFw7huYPPm+)_9+3cdpsvLoYMdZX=GZEa#37C98SkL*4%|8SlPKt}htx zzD(9F8XuD18!t6Jv@>0Ly!$c9v&{HVzpZ%YEbGUI0fuGAhlcIMvxC)g&l>9A!MIWVEY?&%!>`r9qxs*c zpUHaa-^qAm^+z{RKMU6E>|D&Eo2s8-bM^0HKen=B$#M(z@5(LJ&!kx%rd!LCS@(N+ zn6ilDZJmb|n|HHrJLh4xz4Pqu96LA<3l=On7{@!RcMo}XRxiUY=9w|w(>ivs+EpJI zcGri!tlvu>7W>i8UJgeKyM|;E{=K3A-uy{uP=u7H4-1S%0%i=YCIKp^9f0+GUe^|ch`S1th_dOq& zeBgP->O;?~Bb|59^NQhP&nuRncwV)O|J?J6;XnRdvHaSftE1HUjXzh>Z~eK7esBJ0 zd4Ckoiha?a%pW69m=M~TPM8q-qmw3t`eQkH!q4AP&RH6ltUFHplnJ4Y#ncI*kNLC- zKYwRApDxew;@Ho$PM#C&GeaIGGbe-rrn4u6hTM4WgwVl~@jK1Mya`^nS5Gp*>-MhC zpWtAbAfDNZ;#o31MV?i~M^_Wiiy3@tATE}F6>zE%n!Tp!SA3Py+GjE&V-&o=gn-E%< zA1)8W5fehqnbt95!Cq!ZP6)MUnLm0$XpJ7D&rFZi=diJRs-@}z&G@t$(#Df^euh-v%3DNk4!$$M^+!} zLW{ri^ThFqZXFzVfDE_cB%6}`pEPPePr@qeY}`o>LZJ<^fCI4K3-zous$;X zRv%d~xzzga^fCHBeT;sukC%yK&hUf!S^lX0%dHEwzPDhX#cF*Q)ObW~XuQIC7Sx7L zCQH?ZL55$}`frdt8`p-e=q9ycD7tBFXez{QR_nEY=lXqZ7-qh0ZD_vAy6tM+Z;36n z?ziOnp0)0`I)P`Q>ti9Gb*~+4|*53)8Yv0;Xcb&NXYC{{t zfwiHJReP;}8=F6_HncN2zBcqnPpJ*{H<&-GHsmZiYr_EZ^J+swH!o2?!JqG%-PiAIt%7+>pQbb-|vv;9eroQaHoCP!i+u4 zS#y{5Or!6~AN@dnCjXZIZh1bDKl-WsEI*U~9^?PW&x+w*^Iyo%^h@~}zLNhw`!Hj{ zUM63ATzkc_l@&{dZ{)e3!_LF(d*@;KgY&Q&IWaUnAYaWypFNOg)Wk5%YRtsY{Gj~f zCx&jisX+)2apJ_#!hFue&=bdVCx)7bcnY4J>!75|8RmJ`o>dGV}R^QgF0#WP!d zqSx!$IMM6%)~z+s>-EOJndtR;@#{?Vdc8d9#L&iS-HD-(;dc|ghA)ooEZNUwgNdR3 zFV4-J$%Yfd08=(RA)Xz~H<}nKrcD!lPeA-86GLZo(}`h_CDW(uv-!l(#hgQ|wlx1& z>zd88;1DY|^@-a`A6ad!k1V#)$G^$*fBM3be)8Pk+r%^9Q9R3?#53Jl{4>tIi+F}z z#Xl=P(?^!Oi;rUtGucD@bJnq&`JUpR7q^#qhQ0NjIcr|vKKdSQ)psWQ>U+O*&dYFy`rovUEiBl>ibD)%+UFm}XW578IrfR;bDj4s*E^k;`FYO! zPuI_vhvCoiuw>2K#uuuaDSMf-wsM`V^kbu5b8?+^@3_u3mh5Hd6929`*}{}P%s9+~ z&F?uEyBRKap7+JEg$27AE;0Xs{A^*x9%h$1=ZE%V#`H4#vS97Mj4yXimMocE;hcl= zu#MT3o;OSi^BXwK3jp9FZ{bunjZxPRmwVxZ`E}m(Rcoug!&yabxF}>IMHl2+kNhk+#Oe#@`Ci=V8g_AIyK_`NVwKvRLvj3_bNr-^|2a34AM`!?qsJ+@2SS(>T9_{}$=|J(^xEtspU3B-Np5ZJ z9t=xO3LQ*Yv0&pbmUO?ENuiVZ(&CvcGs*pqTxS=v`blAk6`PhYzpVTW%TEf!ELWQ3 z^Z3@UKFR0txyB@~nY!NSJj~ac}6PglHY5v&qkB{UW4;BO$sF| z){PRs@ubkkY_mzBkJS#7d`Hqb_L&sgne00$^s{9B7~?}G`HVV`ofHO`9;g1X&cP0r zC#s*}boGy8hx%D^ki{A5AJ4PZ&yqvT?oj^(_N$-C%j%E5qW)U*@2NlfAN5ak&M(x@ z^uOw7{;m2ang2okEPoUq{Ym^}*O!>=^?cV^uv~Jo-)V4;5tBpn6z3c{+3zJ9kD469 zRO8X&S&o?;dYDd}9BQW7f9ho41vQ>FIrK8rP4@c?<`+%&`wZe)vRY=c-)E4oezMpACa^Xoe&%ilRC zlMUpb24i&$EM~G+6lG%~+FXVCZvpP|JmM2a2nHQciIkZRrG&%G$xnOdrU&?+L zP4=3bJYAE+0K?^zL&MV6vz^72;u)?Nzl{8BV|s)9aojC`y}WE^xJ5iO)-NmXZSqI& zk)Po~`InQQ9ZVmY?6o`N7bb_sUmEvM4xQ0gCWk?0uTFLkeAn3(eN7%_Z`$`)>iCEL zFsnRX(RU_?A%=JDvx4{!oQvT@ePY6z73F6$b9P1luD3=^k#t-?H8n9rCJdYH|e5^7eLXVw&dw>Cdp9)>yctRdgrDWNqw zZ;H<@<&&cpGkxKYl&mVu#)pIW%#x6D&m>2ht;a$ zf8+Y<;#sWWJS-dKUt8YaIuDD~d6=%}JnLAuzVooyzzIRvp+kTZZ;(h#xc|Nt=oJ`=wiVkR`jcTzJDu! zbW8c8&GK*HIy+cwB|r0RdYP`pc3f!@2sqx%Ge4 zUzY4++Nr-=SkHEr7wB&scj@nz@?WfemY1rZ;R^LPJKr_xXL_CbSzWLGtz5rd{VaRb z&*FadZ*Bar`kDSk{mh?M|2Eb=qka}IsGsFa>i<9ESJcnsb@l(=_zm?l`-l2j4XS@z z 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 uScemcf??Ku1C;7#Mg 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

    -|Q2!{BM-{nC3sC+}PM1=h-Z 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

    1OmLld(& z8nAlC5F9sP!F0W9zfSqrE03iTi>d2W+o?StyNESZ?m8~JwE&n02A<+X`)Dy(RS4hB zx34PrSAeRfZ;YKAVx#j{#UM7h5rJUBo)^L#<`#l+VmIlYa?sR>`Nhm=+)$NyXF^Df zP#0GcpzO!J!+!_g*L3964oiiYp%_iCWG&qGwgoePQWY)q7=IA zOxVKxlC)2uXWkwZX%iN`Gc`OR~)P7xq3IfB-(vfG*39N zdO)`Lc{y^Uc#loKRA8Qt&jSR}K%6bXwVJ4M>^{4Q) zZv!l)L(YyRatp{H_N$ckL?&`bGu`kkSx}eFbl9}1b{`?47binu6@IGkN^#fN=OkDj z9IUDz>NzmDf5Ns-3uxlR?YS0SE-jn}C~r}`f|?$m*gDYlT~Un+L- z^{RLsUeMPRTjzJp(Q_xRFZvsbjm!*)YP|I8M23Y_Wzgr`>xJThv~tgeqCefg2+vCW zjP{>~Ju9D|k7v*Pd*t66`7^h@+dG8#22Pw)KZph%j?_cZz++MPXyiW=!C1H;)qv<( z^qah@4?v`!-$87$eK-Dq`>o_zuzC67IeBXB5Pb-m!-o{C?o`Ox2cb}5T}1jH7t)4K z0tp#6``+oY4~n2O_8{^0iD89duNRw{P&D7nvU_s_0IUqeVcw5%mm9VTN(RVvk=9A6 z+$U%CEE+!+y$BLB3lpRoh> zkJ-@=Y|8VP9X@Rb&)UIHY`xjeKS5r@lQxleg6HkvIa~kC&WF*@<;rJlkdl^;)xqa& z?_#^~c^mJ&XtkU<-_AE>8os}~Od-ozDx%@Tr*bDCP_EJHB3o3ZBTbN)3~D<yGCbOP- zedLqVN<{i0x_HltapLgkIM@N#^Wr$y8hLaQI!ZmS+SJg5g?w^P+tj3z*Qie;9>W&9 zk6@+G(q{GMIgLE^<`;$mhLKPr`7j&JY?f? zt^(&lKx1r28*o%^aChrRnen)SJ4x*V)~IWgymq|RH!Go&xV*j^m%mF{8}1GCw*oYG z;mz@}MBKFIWB#{*$(}=E<`6ZU6bm*!3dKd{D*L+mp?XcE1go42>(QQXt{*JS&J1N~ zW0sz}<1N489Qge+sJ;?J2}+`Ab-RBW!bW z4Y*plWjB5$uKgjdIL%GDzBcXtIBa@8w4V#@WM6!q0I2cX7&3Cj=zP=8(2pO6;eSH= z-(l(A(Ect$ON#vlvb}|7%>B8-?|_0!q#r9WzJAPS(f}19i46Q}ZBAp=F@=Egmni$6 z#^J(QW|cPQ+V&$he8IEIeAEK#4POo5+LD@M0pjClUsZ>*EZiRgVEZ;3FpdbF&ZM20 zsBnA0UH2nNZC)cdlJv)u&r_+w(kJP$`at+uS1RlI=q%^K#&xGd2@O<&Lp~FeP`m(~ z?&RLXmmfxdIl1Sg9j%`4DFU>N(nqKaX!X;q?clKw1doTDQRb>tJvw*h9Bx_Gvy@vH zE$;+9dUv^HUUFSxL^ywlE9Q=x1K)hBvaSky@E(E7lsW$+DdWD7o-41RO@4cQnxDW!qWFc^sBIq6u9A$pQ z$e7OpT%epnaFh_bsuh+s8?J@Xmp483B!gmEY#n#xomm*sc~lOPkZDvbVMK+E**zh$ z;ZSL~3N&y}ty}l7$P2%!<^vG?b%r25mHI9tLv-i)mbHuNwnw2%W1X0e$@wX_i!w7~ zu-r|$KUOsdJ+=fl{r>|U*k*6CHlql$vyIwVHP(79&e~xlcbDyJ7iHGN?nP>C4 zzFKOT@t0PeORDCoYWWM*@T%&}FH{S!YyUO9H0?B4u!nlQWvw)QXr)|l2SKzVeiaM9 z(9E>che-P^`@LF9n;#w>)^IohSO&YoPQRFiZtUm!f@hmh^A74!m_^2Kdd4 zMzMXmj#OEIF=Y}HBR1(4(l<3CXfYWiD; z#xJ`Qc8Q#d!CZ(d(?G4(HTA26{e+1YZ$Ox6B8FOD;*^y4Db&Q9q`X_yuj&UT%h*1> zu#Q39oM2F2;#%uqg9Tt5ydvFG9EN)x4YvYwi7b*;t15&Q?5c4Ax zQU@yZTmu@2s0Tw5!6+C zv$7x1{RxPynT1#e|LoNY9m$L37pH;6gKM17`4 zvoi%iSkon9+1L+MI0-e^E(7u=aUhSK%0u*N#u&BWS0;kdR!$8fpuEo@s zdBzC<6sIdsv8Lo3u(<&2UK*`yQ9^ew%lM3ry7C(gY@o5Or;6v0F-k9b3(8r0rtaTCNBa zn;8^%y2YsHl=`mfzsh#P65jmtO=BU(W>>u;*+aM5fq%MRHJy2)aPtDfpNWkAiopI_&2-(X2c2F( z?%;F|VJ*K(IX9qF2_A+xTh>B2z<&E|iSIMy@vYK{=3X1jNg~7F8(8h-18e&rK1+TP z!&H8SEdB5PFK&09{_>t*#f|nW>_50qJ(s8i|2IE3zhB3}?jd}abe=Z#SqzHO3Te?- zGodG+x9rPqGTE4secsAF=31XA1Cv^V5Sm;M!@FL%k<=I#!O*G@9KF8kX&Bv{;(ZkE z{77>|x_L)1&&`ew@J*!|cxrnTPr*J)e)GLWhy&8!d~X)=mXc}k>N)>?$^)@BOwPM| z@QdU0)9!R3L9}zX{t_5##EeJh&td_74>WXW2W)_cnPe2LM4vtb9#8}}UU4i?l#SD^ zo{-*!rFc3bB2+*EOTegDk}@#T2X1xf18UhROPT*SyOv=~D)nYrqNCXVn}YzRN9fo( znbCdwN`|7SA@mU$$MVBEM9{=6qivI3Zkfdx<36s!j$j37a4r0U)5rBFph7GW!kucf zt4+l+!7TwZ(F32w(XBV<#;n~VH*6?$G${J(HowB|C7)#sKLD)bqiUn8?QNaQQ?}<^ z3FCkb&vNr|EHBhToBXlnD1siUAMvdz!p3C#SfGbcjBou_Ry0bE-O_?L424VeSNGv~ zFS7=`Rd(=DJ;%#3eyY}L$lu(2e|(l^nRcIz#d?KRK@-dt zuLwI1Xbqk8xy5p+KpT6X(re&m=PCBc5}7T0ca!Gdq$5LZ;x{V-;0Ba*Bn4o zg+=@arkvsm^=EC~R)9DhkLB-9%<>WE$C|g4K3k$$?Vw<;t+^B^Qc5@2XGx@v`)mX- z6~EErD-(MQ^RL`$Sw^liU$fU5D&!RbW*d#vA3ZP-@5;@y`D_I?5T27w{;zLxUN$*r zBZ@AO)~~glC2kj9O~zU6TW6U;J-SD%(TJfiarC<)o=Bz>LC=q*5usb`t6p*(vKLmP zo=>>LEJyAFA&|4l_1A)eE&%@KUEBYi8U0(+{;-WxR&ja0%bB$2Z{a028g(D@j(Gr1 z8^T~7G@{^95k3%@Unuj4Q4dM_7{Hfu{&533ASoC;Kavy+^EJ!8}+NjDqyv|RtJ zQ9m~JvnKi}vpoMl5A35n_ZQ4Pavr7a&yBqWW18WEnlCV2zca<(8grou5B3i#AKbMZ zXnFcY?~j?n&t>U{Ev2PM|u zs*B@p)nmsI7Q#MqZ!{`yGfaTSjfg>G1BI`U4lD`9cqje&l_Jx|)oSz- z94dz36^4cguR)`M3o%q4_J$(1ag#>D$&QDXjnbpJX3U)8jPx3Nj?jN5jt%O0oX;8l z8`b12eap@c^7pHimf0&D4yG`N3i!j7tgNx*dqh`rwT_boGgukmV_ zlE}|BW1QDa_midx$e>3|)A#MP+0w2sHeagIMkd;{jrjwANCz?MS%i4<~ zrOlKzR`LlPD^s1)+MU8})kecJ4$-uubr;P$W?X($cJ;U=6EY5Pvf3fd^LL`bl9lH& z*aW?-dnxPLd{_wD!ZxDzbOuwb@2UJ+1%LzQ;yU<>YP(tGuLcjD>XDGy(l^giT6C_$ zm47Og!;IDYi)e0?}Ctm z06W-K5j!yOaV*PLcz?+h#~%^SnpNZkGoii`Z-;;G^ARYm6QSJPY%H8t9}BtrRj0KA z#~+F$Ea@Z)i8Y7QX;~kD$!n4WG|Yss+8GQltZ9_>Jrj+kt0A6H#9N0#jH@mHIf-}@ z>Rj8L&lT2?)Gc^TSRY%bCF3{+k(1UId}oyOpGjI?V#o+pl&(l{rX(*prejDd9U3gq zBwty6n>CCaOW45Olja>}4{Z1mh^J;+do{t65*nDV2z6^$Z9o8UtueUvjMC!-y9{7* zc*6rNE4}_0*ZNSZjCe|&wkee;47`Zd$|*gl2%7vooQl_g6;INSZ;=JxSj#$7nMsld zf$9X$0OAtHW7T_a* z*aiN1m3_W>S2)cz_5oQsb~V$Af38AMr0nUfK6bAxlLDJ4vm1A{3 z*wf9scFj}snNQ%aMStKY^0FBhV9@37>@5g)F2I7KIMeyP+(Z@bVJLm7?yeqGtSm-Wv)dynytHf-{}!gA+NA)o}R zf13+FadhrD5ZK&Ny$6*mqZ#78xk4r`g_MpKsU_ciosBf?}O`nGTjMg*s0ufR-u_!uLEfUxH zDsz7J3@RE636Um^Pu8^!hqdt*tg97o0OSh6^dvDC5pX3O3|FGgIM!X+@By5WCYnz1 zNy?i;?cLBE`Ci0P7oOmTt;6pnNLp0( z*zmw>6hW-~^Uivj(HpoE?2_N+C42oD`_pmNPa3z<nMM~%E>3h_kSCzLE z@ZP*V$bEuEqcC|_3#1ivr%9h}r?7r!EBzZ0ubidScbG?c#$JqsoeSJBXcl2RCUzWy zN$=R3RUQ&U-q^(|%CL2)Ub9)+TJ>=2gM)fH6kdB1$4}5*y=@PwhVLu&0M*b$brz&L*Q$;k zRdwQftMiaCNo|%1fYF$dpLTcg1uB1>f2?6ERC7sN<&JaR-UCVpH!uJv>CQ@JN)-6# ztLCRwPLwTD-(M6{yNyb9iFIl+9DfJ8uYOYN%fyms8I~k7Bd#4}&V12hfLUK5BB5%d zqboB{cTi;$-&=dZN8Qh~vlf^>sQQ zdiqSJU^sX2O%wKqf3fCec1^F`ZazgLukAlRdS?+K5Y}M%gHDKy-R3J?l}I!ig1MRZ5v2 z$hS6gF2rfL{>AbctY463r;Q*FO%^ZNB8C@8lO(JRFG&$1W0QY* zBA86_{X8qHW?`G?;Lv6Agl(2)NIoLjBPJtX9?+FOB6$E=Z$R|3?{#{Vq6+cu*x1QvC z=oZNjo-~w&R@$4B{w)tqdNmd*?!Me1n|vVsnIGn7NzdjEN$JtC{%}%1gn{D!bfdnK zzAr$^4XjlR~jl>K}@42K2INv8${<2~n^xkG+(k6be)xnFwN zwoj0|id@yl9?k80&WQ+4e$qg=VeaG?D4kOw(ZaI+V?+`_T{bT z=sSG(w)bv5w{32EpR{Vd_NZ$i$XU%vD~ybe?aH5w2P5N(@8pX!9ehU3s%^xAd?|t+Cc5bHb{ucz; zh4*}a5-bBdYl=DH8r7k02h4K3~-5K31|m%t7*l zX8zYq-ZC;d(c`lTR_cH^N~s+&a^ROtR$2E>r?d(amUQcM8|m88Zy+x6V^O0e`BYiEy#l<|Ue_HG8rHGBA3xV%W|M!24=tm*&tho=*A zzW%6$;j6z$dPPE;>SuY;HY29~qW2vRy!-!`89E{1@9ESOF6j*kfs%O;;x7A<>gO}w zb6o!@D#an2RAEt#+Xg5;L_5<%C=H>#6VVPDI9URygfv91`0N~~FTMEj&dUgCwK zx0TRjvqg0a`T!@I5S@j%;a#7~d)KH(6YFNRPQ7BUP7Ss&nBLJcUlTa5=Z$q}lPlO< zL{kH*q!K#bj!aLrYI$^f==9oMb|;h>=RFsP*lygoChOf;Is=@7T^tGmysC@tB82>Y zr`=lY3`&{V>N677UK0qpCcdV_8SnN36#5A273>ac ziUNti{N$(P(=l_nOIx=qz6nX^dL?Q>(bB9??bzkDViTB1R!3pnb+d9fDIb3^qH3OS z_`3=*VMGL8jUPklk7A}{%4eawQ~TuhnvF7}$!kE=N@xpEx7T8@ls%dtS^%VF_AXd= z>*J6PE|R2Ry;)D7vGKR`l9DdFOM*B@*2N$Z;O=cN2NsfOyAIA64Y;RbNhaUC7#Z6P zggFy{=^rWFfZ!J&Oxfg%H>%H@`)T2$t(j#r7k|tNdI5T(qCQq1t`8O?X?YHa1c`0* zDMSs!&1@3ds_{5mMlt8P&D@zbz!r6_^P+T@*Hy!7qHZkL=5~y$P3$-g$elBdwP*QN zHTMEyemSZHBQI2X^#aSzG$5koko3MTX(4rEJgy;g@0@-Dy(L|Ixz=`?G!b2 zH1hf#K4VtKonEJyaEnNd=ujPcokT&zd}k(F-pS0c%h-R6W$$P3);giWl^v#Ne->Mx z>{aGwW%DX2*Hi9=rA)@yn5EOUOSjLj|KItdd!S`HYQr5x@aKEMt5@0fq1x1rOI3S+ z+qFKUx*0&xO$M`@cD5<9`JLW@L~-xP594Fk7OBfo2)eigso-J(X9xgATCIXx0K9Qk zU%vV!HT622rzbJBOw;kDifA3GssC;?h=JSXiP$et!(j&(BXeOGyQ(={rjOH~q`u5? z#1ps8IDM*)kXh>Dd8+wbl{;U-wGDD#5l8O;or=t8$kI+wFk|Qs@elYacN!@nTDCD$fRL@uMusFJ2dlvDgX zg=8jBxIF`36wtY+N{ykuGyUHr*7k>82Dr3kN1Wc$NC2K0|t< zny^~6SQ1LMqm}TJ(t0mx>lzzrT~Pc`i&mdTSg+0qnrCCkP{72p%MNpc%f>8q+}vDm zP9B9wC5UZM9@74Qz0Ear!v&0D-0e@-T^?up;TU}Y%8-TQCrm`!Fe-8a@G8N8;AXJxGdkzVW%7>!`@p>l;R|8=yaaF zR$&#lqgE&4o3vo&f(jif@G!}h4l{@vVt=*<3r!e)pk()(yA%!xi3!0>=cw$7w zM=$Wg8G)N@Q_xWiay%voF%n&)z0Yg!Vm;#`?S4+rxInuX>M5Vq>U=$Tu6EDUV^%Xy zg}(J6U(~Ua3d#znSf?7G0VBo|HI@_8b?VRzCyl*EJyDZ{b;l9WF|HjJq9E&If1swJn){k$u$fvJkn8>lcS zMzNExhhqexA70hM{GD+*SFF^_=2P~uW{zb&54(!b1Ug=CmA=KiD|6Huy>PXjYK51o zTzj;}SbxG4vpek4V@&XU`w-B=8>#>^pK+Xo|ckYVU*p(^QiH+Beq zO6X-ED#wLAP8gSb)rP%X6gSvYQ~SPu88{C<{}yF_qft{W@Ho+FYWmwoG>H((cE$T; z)>@-pkV!@i?nC?+8k`pQAKCQc|4?u8dG8i~@{2z2{gG|G0DG9v zDFRD8tL&esmY3AL7`UUjSZqQ=WOt(N=RxU^XwVO5_Vy1eb2>c4IC)7w#{T*arH;0& zDWZqRbMv3PuLVdF`#C~`CGNfY{Hv99zSGMZFIhgp62s;uD{;|`@Eh5u>)@0L_RNj0 zz8yFLSFd+9$G2{CO#byr4tvg~*Nj{_lEc~aMZBH<05uG(yJQG6YMc}VTp^GOhcUW=#jXjW5Z5( zMeN3G(5dy)Nfy}4IRYE*sGW(q-D2H@jl;ew!W|b&2hUd}Bp%0MIxS9Bctn%!n*)sc zqAiqd&R^l-`ax&(%^bjDOHL&U2YO){#n<9{`fkW+=?BUHir9ebBV6JGl(YIxCmxud zD4mP`X>AZIo~6&xxHm^^RcMI-@?S2&6}HV-N#?99?^sxSIk!P{x=(1%>;tTC6KTXI zw@U~(NoDid&Q);khjF_^qGn{zGd=osC1E;Fln30Y&G(gkpgTho&*&e@{jhg1zW)g! zMbk_mfwRh%^%e?vesi3A9lt`O*KDH+z2cospJeQ<0y8X~Z+p^Y9trJx1(?vmg0MH( z%Q_22v712L~S(diFc-%}PSfi3nI>zm`buA_k{dA1x2EWpy zB^)^u$((!aP9#Uv2ab)K;09w$24o&ueVzlm*ptGeInnj= z5^+I4AN74>Syv|(a8wU(lR0rs%kHaNgcP+rsk4LbEd7I8+k(y640`@L$9kNi0S;e# z#;%mRB9p5S+|4dF7eZO!nbELy2LjbJUZlZxl*2K!9J%&b~oLZ;NGq)-U@7X6+-H#Q9Q4{s&8J{y4SrkGla@_^$hsCvgEQT%@ zsINKeFHnmu^V>$qOTRnJC=mR8A%`(2PVg*@CG#C$clb>~g6E(?q(j5CSL80m?BCg@xbb5$>|kZ7cL6RXF$&c0V& zkDBGbj-cXo_KEL*rgWV>4#GSEW2JskQsQCKiqBp(hH|N-Q^FFRJT(!-JZThC2?_Hesgu4{Od)r|Nnd?Y0j-+=irOpd%XG;(E=~EJc zV@GB}X_WfVOh-714e|ukpiElL8m>NES27Ih=a1%iHqVf^?!mR^$xz;(gNBS6$c6Gy zc|pr|;!iEs10*cgnA_h#oryu0h8za_d!6Wh|(?FExpaWh@#&vs*(^BoCw=&bIaa-Q?x zJk@Z_eu`z<>G%g&FE~Jj5ghX+)8rP#Wv~}#HkXm_Sm2C5XCKcS_lweNUN?qwt+ZTfH zh){(qZP*wV1G|~yc;W-%ymu&z9^F;oN?DKoo-uZ4MmVp990>)DvSN=)EkpHArG1kD zxMA6^{Pi-oZCrNr{mW{WxhS-rar;eC#f&?#vu@DG*inODVmYM8V7{few|$i-iRCD4KRqhQB}rSN=v zF3mn8Ex-?FWH!q$VlL)9Vm0*qUMBA0H^dLR8hd#Mji+j@LCiZ=k}_Mr#| zW<~g0R)i%?xw<_qf`@qI05#Dp)C-;Q>FXH<>-=A;wZdF(@bl|2Z`~YDL&<>p>x;a= z3!{s9D?<7&iv}!=E)|S@0tF4h@nRS!^FoD|aNu;4iM5Hogn8#VqOIZlp_p@(u){ke z{nE`Qsp|dZOaJ9quZOLdfQ70QxVTwu?+8RSXguYr!H6@ii&x*?`sJIo_xG*;J*)Ho z*!thkbpEaEKVwAOY~QaUbeNSj#j&y zoo&zE*~w!Ynh$ruQhS?9`?t<2ZQgpn)iVEp2Z*LoZFqJjZw1nYU-Xx>5~HLlx7|OV zDEl*sc$Cw9`LXdluXSsc3LX-8jSWZ%v9`6W8*NawIKN)eJju`7%o<);fzp@F>Jlxu zt`w~;F{iG`$k#izwJ}0+V2{%3p&%np-v-TPJjAIr9G!?Z2T+0Lb^J}^Rz__!<`$#w zF#b1;y2}K}b85K>QPczpmzM5jO7I!W$FlV>72w+`VW41r5^%)pY?}*txey^|4e|;` z2}*@nhMUha`;N4{>-_WVtn#AuJ|f(EZ0kQ%UI)yP$YpZZp&QCEf%^k=cV_Kyq9*_( zrtwu{kab>b+%Fro4r7;8+7#bM#3Vd^xhgkJ?HIm+Y4R8+io&gxDgE z#X`mEo|IIk^Rh8nQ3?%qlV_U0u$CuaC8r9t7x(+!r0iAzkjH>qU4TSal6GuGo22U{@~s?J*6 ziZPg+=$guA$9&O2;_IlQJF&&KOIblblos@U@YsRTde|}Fan$#uaG!O`O=&GQ?W)eB zfTgVk#FDe7&!dFb87bj`P=qS9T`KGivH$ByNNNcC2&apG4S)%B%%=+fwl@{%m|F^a zzF0VDYsdVN!tJ0F01giq1Y(d7tsYOgV+i&p)VrqD>PY=GnM&UY5g1Luq69cT69M8G zx8_5y>l<-+SKN7LjH+cr?5&TTyJNs^7*aum>p5UQ*tLLxGdAY$J8|KzIKDHE?}(!% z2c>;tT*5&$C2Z`4GRXEru!sczCS@M9Z7!)f2g%w!RfUU>nU#d zT`;Eb05{*)j@7rF^HKV88+E%D8f zm@Zk(*kk$S_%)}1^JBpsm822Jk=x5gnwvcT6=&fRWN4=R8Rvtw#f3%fyBC&>+Ox1n z`@YdW?fXaj^&S`<(0*|AH#PZjK+TCYh&h?)7Q0GA?M`#ZdZ5c566*(+1Z{)`#j!lS z3hte&3R8;i)n>`dLI~t5o)Td*a@5f%qekn8MAn=EZk0uhOo!~3_@7-wYf`()O-(ZB zV2%r>-7a9TOmH6LP3@rFwg(YdTV9SZe);zJ78kycU?*&{XQgj_WTLgEAP{G%zUbs9 zMK=~%XQ@9Sfs?}Y!E78&8+%BnGTl&@K0+U1r;4G&zsP!<8&-TrTixL%wH3xzwfqt$0G00I*e(Rylb#F9y0}7D?4I`(2~+SL?ZeDFN6Z@?XM`IG7nf|O#WYHxzF1t)Q{Gv`P^Mo{+bH+@|{TJRjLzuLj zrTjC|d098I1ntNdn05OLFm))^2ImaTcjx(wn~?Z-*mFcIkaWjPA~1v~V1nwT4|nK2 z5N@>UVSBvSW^32y$9=jY(h#D0*g*~G5Q z^9%Okwx!jqr~F7%8T7*kv>9TVIivuHl|l+zy}s07mha5T43^}e*P*#Y}o(x%IqP*Oxn$V_x2Z zrK{^Fu3?edZMhey#|WfMC5S^Q0V{CwMs46cs=6OjEsrYiF@=zC|@>?*GQ^{s#+Ft5X={Xk~suyG@3J?w?TlvbG=d47eR|Ec=o$h@i21y-H0ab^AI}1w%-_BjEJamC3UZ+No z;Lg)62`nxa?X$3njRY85-9%No5_(}H&n+!bKOc=k8o)gfYdT<;rg3<{EM4=0+kufNET zYybxfsyiKH4~D7U^+5fa7P0AOEy~Y;!OTHyyCqYGVtiz6Ku^@f|Z4&L(J3D{tu zR;HkHKqh!zYd!&>E3|;_(Abb1S6i4`Z=o(*PHAm#p)I8I4WBeb51G3l*>|v?ZMiJ0 z^>Mw&qq#%!{|s8Ngj;l*+y-ADK^-xMDK(dKzWu$b{zh}}JGy)~uCmd6)m-G&+2 zk)_MtWk9)W?U8=hmh{Wc|Kb08ZR;GwWvG;O4M@BkTm#@Jpi1;1z>7fMXQ1Qo*HaMy zX@VmRjC8kkb_mCo8}LSBJmfkpBfafIw)#v6K;w@A@gxSY&>tu!}gDc*D3%RakM}APa(ofMApGE6DI# z8$t%!pxp-j>dZPp8=ast>jZ6d0zOu%d)ZyW>vUS>-zn?#axsK;oS=^nBS8`pYBG&Z z*aMjLsFbL{4T9WT6oCS$fc9fh7EDCesYBM%X1-PKK?pb=6;y1kVy4WUY@bALZ;0_A zZ+P8qd>bg%Ozn9rg8(JoeAC6ePhJnA77@KF`bDFY;>=+fvq`$b7NQYl2TfV(W@+b( zYN}QKo{g-n%q-C7isITKn$H4wnHJC<3zed1wB%Ee#C7T$B_tARttn{R2ADl&>79v6 z$Q5ORAFWR7WbXB94zFFdBm3pniu<+oYq+wpw|dpDcsUyfVVy@;jmJ!YJ1+8Bq{7Uh z{-r=c25Z@2GEmBN%)iZa%%_@9q#EWHEs$a};f{`GJ0;c3G&9bYS}RVqZbjsWw$R>F zO022)(Hg6o3Z8#ywA^L8(OBy6ZuTpz6#$LiudeUopgT2$+K8CFdC?*470q*FK z$0b1eTMuq`t+d?X2f;3lu~u}>s7yb?de+V7@wj_jtGE2hJAU({x?9u{Qk0_^4D_*1 zc!pSXy*OOk#5iJ2!pLpT#_r+Y5kb_9Y_3F9k0kl?_}tQDWNt<7E^6ie{D44)FIX7^a62E>_3{`W=j?d9ul{+dqT zyh)jTFlb2LyqiWRb*S~H_jyhS&k=7ws%YdnGDuhPac5ABHEM^|pzp6(MpQ@zNUf6( z&MfNr>Yed>s;9@hHyNz{O44m}9-4(3N- z{vdkLfO4&}#JC3$ODaK*Ps<=n6Sz6)HYwJN>q_gh5}$yn2d44ps-0ju2xSjU4Ui+` zvW8$9RJ{Kw%Iz@A%LkB#()qTofH<-pP|761{fW$EV;DV1pOg>nvol|tLAKm4O|as^ zTCojmk6R^rZm04l4=P8>G7%DU-zVyOM0=mO?~xIBUe=^d=xPjqk^LU|NajfgWaxgU z6UJ(eFHKvjsu!!;YRA1CMk8B~BT@j|%2(Ph67-5Utu_dWZL~{7yInQzP__FU`+g@6 z1@CD*6G(8c5pS8EUk)O}E=K40(K$3DX<>W<&Tp9nUK;&Cp06Oq4TxV`l=VcK(z_w+ zhK(&d;oZN7)-)Far-uG{gm8()H{qkxHOn?1r|{YUcmga$-o-_WA)#H)5Wj)8bZG{^ z;=pj}QH3WJLN7X*M{J{-qD|Nj+VHDn0Jfz_K3^z4HSJNl71ZNor*>pe{-dv0^Oq-=9W&ZQ`Dh@wSlZtTT*4y#1SC$@?+V1%#sH& zj&6Yv3{|C7nVg)$ji}ijf|Y#Xt4wkneLx{_Z?~eQV-WRqy15Dvd`R#MiF7y}4H1wH z#+U{OfN~N&73c-{Tdfo6T@uHL=Lt`kpiTS>s=nZbLgVo{#K=Un35Dmu!Zq1K4R9>3 zj^4@`*o;R%<7qj!*0Dmk+(mQDcxcLB!@Ps^9(kah4`cSz_-H*>EO zw2y60A#}5wxz7$ht$S>ro4*2bpXx?KVsPkL56mAa?rM6Z*z+~u!-XJF4+e-x0CC#O z@Gu~FiYt}Sg<*+=E~gV=nnUt|GB;ga#;bTWCLo#gY93ZKhRh(KrHrHi8Q z6l%*uqU{%A{!GX(r1@tO?MR+xbwo~cI#Q=i3+)R>l*&z(x!EGOTFpDHaGdT4C-;P{ zSHh89VduGUY8RY_4y_b=O(0OOlm;D~e>6;P<>-v%dy){b4G;_4&?QQfMHKW7$oa_} z&?*2{DMyfYj3A_?9RCACH%5T!!Key%lx4sXi|A{;fAOgviS7}fYDyW)`upR_1~wt! z%(#^X6(=Z5S-q3N{C*Nt5bMPQEu&HxvnBcGfB zlF%~93JfS{02r@x$~QR880l&d!U?U#WYl&sB^Aro(_O+2(slqUhM^^HROZZ9JOKG( zE~gOo_Dbe91<*8Us`bLuecDgNjWZm?DYhH zr~M%?fE=0r1JQm@st=eiKVbe!xzqRLxWcikWNiZp?TqG-4@3rjHGp!jle8E(QFJ$) z9<0`1J%f~b%7=svq;a+i zY#A`I#92(tVTZEr#t41BRUO7bWDnP$-w1yZyp(xzy-eVK8Vq>Qezi1A&(-jkp>C&P zb}o+O0{E_U8u!K{L!ZH-6;V~y zyGFQ+cO{H4Lyzp1)bAyd_XfQMo z1^SleqhvQjHc&e#KPwrQONQimas~RfA1E4N)BA+JN5bzD^F1;%^i3S5RHTYaL6dQv zGRQTEYt&2&pL`Ubvv0HF#L^ACK0$|G5zlXqM@?UR`65ogjKk!-KW=^%2Srt)xQCye z5^PksbpK0-Y$b21uMCknj83E{(vhVv8(n`02$?)-0tf_jb!=uJ7Qf22%3In=O<5iv z5)fxHw(D5PY?naF4#!?WLSH4iBCRFR4TP~*;+b7>cSqcMHr@t5ZxjaJC!@wAQRm5M zI&8D!ir4ZbL#PIX#dQP#vsQ#O^ad)ii8i`e-&Gl{d_&p%Q0Q@rPDv7gbce&$Kzd4? zOLogGwUC?0K(qKiAR2lWu0q5OFk3M-fa;q7mxDh6Th1MFs#F1Xr4c$Jh5r$_HHceQ z=*_fMR83x&t`2w{dK3$p3>4q*hFVC? z-$+5SXocQeY~*v#C|*GJ|8`aWN$#ehZIBss~K7wB-%T>)lF1AEVPy)jpsg_2eNAqeHM)N7vADs1;E>v9&?j0mTl+ z14&xGEhrxk%0<92$!Cp3066rx!DEx5j+G>|gyGNEwmJYAfc$(EUScwIF}Chtp-Wlu zerMevHQV8#j(?EQ9+spHkc?#LaTqj=(8gV;qw=;Yff?%u)0R_ISdRjxZy?9Iq|!$3 zLZgr-wfeC*{j3iEU-kd(f2k*qz-h_`-Hv5CN(UjQoC_jGsj#eq5gzZL4(MnVsQ5eUR3Dm=)Dq{7fzEkP8H6paX2 z#2{oMPob(=5{L}P1-Q0Qb_T`u7W9gtkgeQ=tM|2`t4i9?y-J`BT~b=oEm&|}NlyY% zV^MR;2j%9{rlkdQf)&$tDBVLHcY^d+y^Ug;9$ox?s(a^J6cRImHRK+@x8uSJM z8(jiW*EDiCcgkjG=a1#u3eq**U&K;TuU}bD(WA4Ze{1u)3C8-e9s)_ut-hj!zLEk+ea>IWA_cBW@eOC22pojhE^g;ee|L`xwY4r6F1Y2<*-KPR1D zWF%S+!~q0w%K%+)GDU#=*rCvtHTuOSYA|c#zvL0Y2d z%tX2+CdPSV#W=|DXO?A5T~8n`QMQy9vc<^7i~VLYLdGxth0rtU{e=DwnMGjU8Hs?P zok(6OIkoO0u%{z~2Gkggn+tvR_=_l=#GD!&ue*{``e>I>B&^dmz~m12XbeqfG=v8E zWp^UqDat6cs02{J1+Zrp*nXjo;wkC%P{$w*sAvNIC91UnK5!cRYnRGg$ou6%X8YYd zC`6^tp`&MLxeoA6Cyc0?-{kh_ztG)M8`!6>C{?Z~Rql0yRclI1ep_{+8m!vIgUT`% zRKh{|YiYsbrM++akILrKlI#B$mF=Z%e%tG}1HM~Y^#Tdb{&8u^&eD=wOG}Ka|URads_u1apw3RhBPvo2O^ zjhlfgs{KNAx}0WLQ~akNg*SXoqlis`?9Ri@&4~mYgY^7tuxLftd1O zcE+cLN%^C2Uqx^1?N!A-Fz9C)SUZ;Keb(y6mAZDd&fnARFLlcRDAs`h?%>_NLxrk(n$5}}7i?!juUHg3D{G{r)>f%OPyv2USTimSa zfBfe{d6%aPXS=5F)y0Q;BN!zy>Nw;+?k-bOD_~Cs+nl1|38k-8w5!3`jGLv}W-b%v z+D2AH6;otB(cMpVj)(_9bbiz_KWY3&jen^j=|`9F!T1MNtK^GIuM^qzLRlyH)k4Yf zY86-ma4pkecZ%#iB7V2TXR*5l-y+ibup2~njYwZ1GHV2E{(J@6hsdlD>@p!924ze9 z5s`UR@J9sSPn>%UdpJK#y^@;OQuS`pNo|1K4Tdm=aa4NHw+Q_{q1}&{)@85A>=S&i z;BSlgTO#weU~dWjsz|%Zr$pvy!JZQQLYc_!Ich!+{WY~%&n(gTVx3>A7pjcko9e5k zdOJ1mz#xEVr9bNW7LmG5oc~wd&P4U(CnEEyV4n!SM8p@1!V1D{~7$px`&1Sl*m0T_*4J6-yWgAC30^I{?>o4dtK;z zMb3W@rDKYHB7wJ3y4rh${)njXUoaA$1y|ILJ2^u*i-dle$gL3KG90=1jDEY?OND-g z$oWmCbmX?*J_$7RwL-rEXX##iCYyzRx2U*B@ViCnEZu+G8qf1)q2GzEn~Gbn68buk zTQB%JVd3e5>+s*7)Hj;`qn7(g6F>g;^u;YSdOe4nfM6OZkWXmoCpG-j7c~o@6SWr( zeERd6$@nu`XPj7i=lxgywAPFvO`5+1nf`=U{D9@RiUx4Craz?%zqhfL>!}Y^nHdv1 zYM-d-zpCsnAd^z9{VInWAAQ=Furct@(96jS4vzk*+T`!m$(~jLOQjs7&w_nyiv;D> zk%{zoFqm~lx!y*lj!XeDcHUocF6Qg8Vv~+amJFu%GN@bhQY7`k`bjcq878Vc={1umPoHBWdQzsN3-`3 zI*^S~!7_0s-A?G)^gcp6zx;Ktn$QV5%#$0PDc6sp$H4B7xKTQmA48uZ>g^J% zgX6ReC=9+r%1Pu-qD(mW7$_pNOL#Szb|aa(gB;dyBwlI`WJ-PbpNKjDUa?h_?>G$J zD*$_vKn$tq7ePY{n}Q-+CaL0GWUe|eXQzQ}SPC*|YdJNKiMZi30>9c5i8xObii0>z zwF^OKO9zq4WHy`4d`j{jO&~8?BdN?4Dzg=p)s4W%)>LKdvb8l08M$G7zRO11S#LsT zNNe>@f-RyIdO?(rZgDZ(^aY?K*?e}J)2*UC)19~T?$di_dni45kGZ|Gz2be#`>?*e z&*A;E{n7(71NcBbAU-%Vhz%Bl3PUqP_)v)3!|F#oMuzJnwBbEQW)9{f`N8qgnNe&s zAJuY5W(+%ok7*f~8Oz6UWPVji1;{p1;(V>g_{^bfJU=u(u`q#6fWp#{xNNx;2L{>-XqjRJ9Xjwg2ADP4DwjP`q`ZO7$53RuM zw2|k?AboIdkQgkFJU}0q!%er6MYNyZ_es)6?_1G__iZCfX)nF!L!^h^GuMOn?2S#k z>+QMjqP>kro115(r?VM!x;5h=GToaoY5G=@T}(4N)CDOz$sP=%(NlVb;h6Z00FB|h(>Db+ ztHPO>R?i%2^o7P4J%&+@u$6% zA@rPLVvs%!fK2QbU*85!~~zpY{9_SbBA2 ziBgpe`EWzrBsMhI)g6TmpDMz3_hK2D8Z{z>E8gn@t@)bvbp5jN=n~WA=J@` zwili5%;3|-jH_Wqva7+%V6hce^fJp?Vewy0aUq~i21c8aGULD$r3b>KP)RH87*!;- zc_W}(AUlw#6@o)_WTwYvCv$SJyN(v!{ai1w=boNOFQyC&>SXpmj|W9Q4ZL>{f)sxeC}E zfOQoXf+Eyv5Jly%OKlx*pi@9qfK}iPhYtanGRWy* zs+P}TV8;M7<#7i7D~>)l%P_%S%4^zXr9>is0N??oB90O(e1rsbK^4%S=1&|!iO(i|zOmB+~ExD7+p z@S3eo{uZYvbISlRqJ0zDfz<=lk>cPCptPPQs;yUqvPICFMErTdQxH3u$?p+a92+na zp&G4#SaBQ1mHEPwQk{OIHG822yV{(fdo{5m0YA8EJk6aJCew9FL~c=^XkkfluIC zWG`SBaT7$uiQ#qoG|(aoNRge5uPXcKK4*bHqXrY)FS+ z0R)@S2a)ABsUB_~Dx>M8R|aWA{Yd+@k_~+bp8lmo$Eq&4;W0d?zJURt3mQZQUwd3y zPEp4R@AoqQu>8;b8>{%4?<5bC9rA+rkf(D9^k8K8s4i4lUveG!uW7q9 zyhs=V(9KmU4S?sP;wWK2{Y?hZth0an=>UFE&m6zntS!$ZZo&`S!&g_?83UBEf?j5edIxHuWTA$ksnAzCvNctyCC9q2Wrbt)B2LwI5lzP(ot?#f0bk69rvtA36&T$1{~X2!;{- zwNfn#CsPBwP0jRumApmil~g9X`BcRqEFBqBU_NEaz2I8#pL!nxmJ(b#8d5v*=J-xw zcDo|UYsdyRJt!vzWuKtz9F(uppmKF-j~9L38whpNkyrFGGQG_Ijz><_rhRCI-i{1J zlni_}Dy;wahP}tZ|5Au_dsrcb^4EZVb9aZ!_JsKpVex!euvR7fPDJ}F5_VWwjHQuC zl*cfoXKFKbjgGbZg_~y~_V{iucaO*JMy^z;|DSY^XW!;ITf9;C%H{lSPqt^a-Ba)N z{8qieRGb1LyH?2TUfMvrau=oYUN{6`49l*f@)n~s}3evRi`>y6sv=sYoR60&W#0z(ugppf*8{1`^Sv}rRpf*pGinl++|A8nYDEjqxDJV{_g*FmH!_|tF1JTG`;9jyE za};Jcn4MIF$c=N-piZLpVCP<#`QhLmNGCNCqp0{Obm(P{#?!ixZBY9+wS( zifQ#z`7|j0d3yfwhn&zvD(GRMm!r*yRfpIsJn4OWkc<0(bBMqWXu?gbA)eWAltFA` zB>rK9zZMZIiTF5Lr;yL0{LAP;uweF#8<#}$%cIrdoDPt)Za9(c{E)jr^ppNmq~Z^e zLGa%CZwDMYDf%=kdUc0`81W!FnoWl!hFngFoyS(yNK|tLSI&}*oPrz=2#M@R1h0pz zy@i=#R#gS|q#<8ukbJ|G?L3vP6!ei|(*MoAuzafUY z!|@@%$wHfB(7)s}0MVFA?H$o7n6hsS8!-u;5J+RNzA>ZgPSw%R?Q5bMd@GIw3MVm(1TvrYG>O%^9z2q4#6ec#1M+ zUwOocZ#SHeqA<=6fxP3Y(qavJ->z`9!1vUQ9931aIFeo%VZVm?ibySOiME!tUJ00t{B}=S5@}o- z$t{fVU&B(Z1ATVT?MkcZNy2$E9DOgGdq2$I3rB*{uHp|8B_zLOC_zQ*)F+bItd5KW zi=c0~Iz*;-_3#g`Ia8Wi*FsRB!Mr1MB`vGdoZ4c0W8fFyH1HGaA&Lx;At6-2&5t#vYd!$d(p+Vc>aLkC#i-4Zf@gKsjcxH9Pe-D>Nitk|q z-og#?J#3Si3H>r0lo46tdvBf^oo1j9e1(KoB_e8Z800$pEEfF^Oy}aF1Ye&JwY&kK zd57T=4IYQ0;H9H!WS%SD>B0aibEGl{iegrZxDjPJ+Ez1=FEUIF2bZ`O&vVgG3laQB zLLK3$bXvF2z68d%#}f4M1OiWa445M1eJ{uYgCQ_7vN>%df2Bb`6_q7mF$YTIyD6|! z>8IlSX}m%0nK*kk9(g9NJR9c^#KpsaCvd0@wvu`z<~Mju&m*$tKjitbKzjOV@Dzs9 zV#9sAIKV7$c}V;Cv7v7hnFpf&E87;uD+7FGl~@#BDH#Vgh-^^S1Z7)L=Kq_rv|a25 z(G=C`P>AaFSNXWad;f-&h|^gD^GX#Xd|>8H{OY zwA=K;jFHppXS}0?_9WYdac`1tPv%8IRd4&bf-DtREBcpAzDWg!n2k zREb}b;;Y~c*H$J|tCHe^q*#<3pp1rM0I;9xZcXuRDf(J6|7Nm9G44y*_hVZd97JLB z-%s8}2w?Eeq_G$IpLBnf*anR3LV z$u=PE5x$IE#qkuzMElA3JraVLQu|NHYqgp}+jyb2kj~q+7n0aAkUsmKiD%_2wgL3S zyFQLSMxiYp35&`C=oRH;rtG?82Z>yvAf!rPZ8}} zgK-(9FH!mj!Un6SBa5DPma(1YaH`HqH+Fplq@x2REhj~qEDY>20pL{h0ye-xGTq#r z1Q--*<;~uXZC8VfN(K)IuMeg{m>S)5+75S1S1Us%M>W1aX1kT1-M0rmFFJtCd=SO~E7}Z32@a;rQXh za@>j2K^!#S67UTF>3*5TZJ`GD5pgr2jww*EU09K28-0U>)~6=`hnZwwCEfi=>#L-A zFDX7u${xR&F5m&7PEGNP%=(m4O^~Ayss~zQFyhKBYL)xY2~C0gETNBbR~+~HbmqO{ z(|J1{JP)>zOT;*?VKP3Nca_kVGzdE>yCh97P0Lv46xy3~IKyUuxoZ3*yG{)CdZiWu zkqb;I2=<_)4TlaEro9iw+2wO9aww(gGYs~}9x!d|#cRA!LFkKQ{V7x4V{EuG4-rsk z2ROBFXj~LnWTlA_h`y@{AjWw*GxTmcLTdoGk>obLUWt>dSpL&gQbwA|{^{vJ2^)fs zY=Fe{MPSwW5O#*EC38<+B2m$qZXiqjF~JL+U06=|GJ>plbQv+0lRnEpoplsIeQzuL zEd_k@^ex4BTj}!#*aU%gm8Sqpup#L=hoZ?>GLv92h>>7Jk|RJL$-E`IF!gD&Qoh>_ zYBnhM83!yVt@xkHWU${g?0w2oy~UI-4-n^AnTP$>vfq1D$ny407JB403S>SmA25;PW|`@GW?(OwO$?s z|A@k!k`YLm9p#`412=BDEn3TTHD1eSlcP&pN7U%Kk#oH5B)t?ADDewP{(SQ^=mZ4s z(%+>SyTne2k57+P)fO6`oStB2KO@8P8m@-tUH|`VkVYzQch5y8r?bSlL~JJH)?lOd7E7(#PRfU<>K5>-@%)KN zIP!+YjV3cbDhcb0bp9d;EKdI+&k`uI0}A( z-4E(erN{v8XG7R72g_+E4YjSA9ld7Vd2t5l# zHZvp_He%W7&qW;YDsmN^%kt|ZW>7|N0EqwGPiW{}2D2usNY~ zTabgIqHua+zNw-dGD3Nw(6_v$Fa%Gxxv>(<>I%umf?xJUy&sl0VcRt7WkERrb=W!! z4VVw3p76_5p&RNI<=tQn9aU(73%IR3RTy7BC$xgW&AOAY9q3@;msIa#>ixK};gPZr zSpKgp{1hB%;wvKd6a2#q@FU?bvL3rJDy4Q2=LM|wcCz#irXWATCxqX^EM$;&-(i*e zSopExzR0lmEJ=RA3jaJD7JW_l&fj1*so$Y>2`eX zq){iP?uG8o<*%|aFOWIKk*FRc*~6u3~{|6Wa<;)47R4q1-80Xg;Gc zy+X>>LaaO%x|Suj1C3yEelKx$63c(UO~_HjwUqyOn-(*^oLvhxcJ)ybdqg^|FfuS`MJwz#>oDef@LrQ zh;EFCgzF~IYr2ju@vgc`HdA90Aahl)JnHK2@Rkv8VOqMSS+13J>R|+wxBn+87{4I@ zrWVbIhbi6Y9|;+$tR@uEKeAg8$SiQbf>h+tTM5o7FMJyr6liX0P$Fx+>@bLLc>)r5 zX~{(8Z%`FFx8bF{R&7MAgJt2AG$+wE$>O6B1^g_ z{j>-cbPviOB0(j3K>0Nb7W4?p&q+`j5tJX%pi(-P9n8mq@{-aX7ndrfH4AyLN$ISU zcc){a1#NbfGv3ZSbLMBxpaARNtYIdNsi{8Ku$t711`kv3`LQ#yCnrytgEDq<>Xa8% zR8E)A@Zo0KBj2B zaa88o1D(-!f2SGdGml*BL!r%j=RsEA-jEMX%OPSRTBypUp-Ku3qed(rE;DQZ#6_jF z}EGa;h)8IoLgJq4FM=+M0 zhcJau7CIO*w@w|ygDv6^B|9b$tU#WpC&FZKm&Cp~$;X6lWYttO92;`25L<<}O^9n` z@S)0}*1BBR`0I`z`TT^F-N%yeFg+5b2j5X#cAFD>o~52+`tQWaVcK>+Ux@BQ0BMn2 zOvDnB6ZJA)=nBHtAk;Mi?MQipsPzbkHNS)N4*uT1*@vR>#y+=QIroW;=;}*Z`BJ9$ z04rtRuAssWKLCB}{0E7(5e*M+j+=qKm&9yMHxRyov?=LFu>S1r_#3LUAjT%blW@;= zGUFP4b&@Jurr*P-3RTN^(e|U)p0GzDDBIpGkGu=yt3sUM&X0da3Llcp0&zS9QCt*L zCkrv&JQT|EYMNgoeNtD^{CW^pfW;W=u?=?YOF`!Z8pl$;&syAv5H;uU-^HJy`7Jc9 zg~L4Tp40ULGVnr@j(0n;|4HfZNCG(`E|yUQ7m>cAR_%34>}c{AQvWiJ>4}K6N5VtI zjiio7Wdf3I#H|lCm{UDqbDt2#>F8{wjJQYvnx~P>_hZLf5Wz7B=86S){`W||8;`&lbCNS$?`ge68i!`@AeoCvmln9=zayx>J7ADHj)g_0ah@UNX1_SQGN21GBd4|>4GdG93N#_T)96AM>W`|wN^{jJ{kWjKh6WY;UrV}5pB~JgAC$i@ZTM!X z@&yT2JyEJWS*om7|u zdL5D9_> zI6IX5lge1tg1bbfn-qX!$)BVv@svqe9+6_0{As^sWYS~?F+}~qm^tQ1+ll-To%wxq zc*6JzvWWQrM6om+v%^6hWUj!+Q!=BS?DuK?{Qt3+5w6X-NYWR{?{E;t`i(vX5TGU9 z@YUTeT@JvrX6X_npQ3kw(G`*?hw@fQ&Z8$3mAKylfAKsJqm;IRQn-z@%TMrRC{gVc z_9ND$yiC{|OudHiW5rC^#15kE=2!z1tv})DFw*1XwSai^<1YY-v>QAVB!(E9F=`+F z4=UndM@C%LJPRHNa9KS~oV@)2H)iUGB1zmw#Cw6jHr5Z*SQoEb+NZ`HJQmy_p#?{U zZd4+OmeRrGP^YR%aEVI;)dUQ15Lzmf7DPqqzFM=2tpJr48ubQN{@;}Q{<{sv9k9dX zV186kexnAJUP1Z9fkzr}1GKCKGfzsLC{Cg$KE^O|?XYsh>000SXpqD!Sn zdTJ7}@*h!tb8+46x_h-5+pds%6?T;wcI;Iwehq7;6;&0y!fd4#;fj3-rFT~%%pk!l zfQDj=7{7oet%~men-Z&;C`imFFF@g_sNX~RLsa<#Sct*${g$wvHG*S51G-m$1*HF6 zMd|<*VxF}aCdtAg^>U*2p#vdF912~!&s7*8qjv%O1wtn${T@ExPI4fki3m=R6JTwZ zK{hU;Z4k`{?VZ1kkHY+b>UZFBDE%)YlO-TM#7qhIhHW{fTuoRXwGq@O$Jo~q?{n&w$#{6Y z7j_d3i8>}2)OO(#oePI#3{hn zS}A{nZ)T)3&yZ{~18F3c%q=JRRBo6rnJ*;A<61$Y}j8%G~e}MqVfyR`5zgVaKDj9TE2`wo5957#6 zUMe^8|6v3Be^_5SP^t8{kB1gKEy?C~YT$bo0E{H*Xd>q5$1H_s5HA{-O897X&~3xk zFQP+r12pm?o~7hZO6B`XoeH)98tqJ5RGLr|YIoJe{OLvul0raI1Tz3&ZDGicT<@At z%Mh}afDDT55E*$ZxtCAb&c(gFeLGLy%SUfV&^5VT*SG1mscYCp!y)8v5T=YPecrNX zJqZ$RhRpFpvDZjMMjm?Q#hgI+IJYQ>v?#kkLP73gV5?uw)c-mKq;uS^w94#ZztY{Z``X90C_&{1A}hmT9KXZ}ZBQ!Fv?eH9iE;$jQ3ylb@1I2t!`2o;u>gqc;)S(-D zMULKHeWD>7+NUFrPZ=Ue<#*UvSH|6X=;&aKfr8podPY$5)F?GF_FqK)W8u|7hU_d# z`ucd7Ol}SQlCZKt-16nDh%%S$B+AL5P#q9rNmhpe9-4lhdl+J}Mf0_Ij0PUIK|y&R z2`X=u*7OP%d}#y~J19#lO7p8ryOtJ|HqZ{(@vH;p+k^R)r2~|9e2N`#s?v(1gXJqg zS&nCV0;Hm!ir4})y=3tLXC zW#C?0ViZ4}45XtlKml}-D=u<{<{4q52Iv@Hu9++*s3H>S4d)vG6K-UOo_|u04vf~v z%G#eY=+lP!l%YKhS9a=edj2~-nyfBV0EX^Csh4rHtvF5@WuJkJLwu?`Y8LT;>R@jy zy5+bB)heCMOH(MiLz(si8VId45Wqaoy@ZH@I$kt;6_G#KVz;f1^G;)u9vT2M&_9n5 z!v$=#ebIbVaAdw!G^x!q#REkU%V;4E+lCXTlVUy3d=c|Gb{5p4?ld@C&Oc{kgihd{8xUn3X4Rs~ z?QT3}So?G%nmj(}MJ|>2p^Gq($&5V31Wt1?BFT`d2Ph=9g$iUgh-(s-8>R0MY<*9_ z-Fy%jw~$^1tZZpAR>t|vLLBG?1Y{A%a^taa%YnFK)okh}KgS&?z@9!@lB}D|k99p&^Mr|un@1bYEM>WR+e{!f*5n3qO zB}^0i3u>6pM2D9`bTt!cT=Wdu1*%a2DSNR>IW)-q4Z#w za|S~CX;s|{<5oMr#YPsTYwY~>cEmJR+xaziM7P3F!)XLrE`fuj`iaI#(qTbQbToc0 z`P)CQgZF{wU0NnTlW?dmki71d!kDC3?2Jj0&efs04@9|ChD*R+Tds_w&q)R5cVqyN zkK_RbGMUT_$y*o>2HA%_h_Q7Zl6bBhM(u z9d|*%0Stu(Tog#P2EU$zfk3saVbq8lmiwSS@;+VFEz^F*$?tJI(v=z1GqVUpA(hZN7<4wik0PvdA+5&D>Bw^OCum)Z8Q zztX)@X8VfSL8-|S4d7)Ky4owlJ7!7@DDVQT2{=eIe7eYj3KaNqrbYrDx)s zsDPlF@|*5L<7eep$w{%w*hYfNm!%~atHF|&N~_FZ!3jaRh6R;7N|o$Nqep1LP4r0V z#PxakkNT8CAek}0`^ec%*RuI7Bad&|>4f%qImC`8AxyeiCF5n;8DcfUUXTP1p*l(U zjf|}Vr2G1RL${Ame`7f9Yr>I4r-bFWI$*!s|0_3I)*YgyGXV%2weS#7@-{eVkOl>| zXc@Jotn%sr_GkeNM5x1(7fIrjbe(enuGHTiS$F*H_0sm+Jp`9v`%1Zeq6r3V9f(Av z26fWMvf~U)NMDF?D6WK01}2_%IaQo1lWF6z3-=s)t_lo>KV#S1^ave>QHg00Nc|d@ zU?46!sAhR7Bw{#1AC25UXn<$gRzfZjM>zRl>#m|#aqIK(P~|q~*jB3-?NR)S=i=(` zrlco)Ctc~+vL}S$ve85$HQ-&uUd6d|1Zy>pjFtGM^s~UoEJv-0q(9=5&_#4$8jfioCiJorYnA}R z8Z>wrLcL4IaU+`REec|9j8Hj-Y_-0QN1FrC^LHf}bh3zkUho4AT^lW(>l?NA16$6xW=xoHtM5J@S3>HzDw_z*XcM`GL46G(8fO8f9 zK%fD7x!@#_J%W!LCdfG44~X|;K0cBn_7K^sWWZG&mK1%mAC-U)sT*W(zm3GV0*bI; zE9qX}J~#AsGy>APN&wa1)xp$+Zig?nfFWCCp)*oq@bw@=gCy&h&kTaB4@bb@Tt$vl zA|(?4JK)^gitu;>`a?8=g=Bruc^kz({G64bK40(_$z{AIrz{uoY8;yDm!A~+3Fq$w zgMkjv&6#`c6#R@x0@<`2P7h01e}XFq%ICej1`B>~_xpp*Z4jW#D}k#a4e1$QfDYFI z?3F!Xa7x1w{4mk5369EM0Ui|5nHfA-P>U)x$QIC#O!D8|Hu_X4Mj^Hp_e6Hm0YQ0x zX~kWoOeaRLMk{TBSL5$e3TwDj2^M67(hkbf9{=0&z%!NhyB^9#EVPC!rd9ds#dNYd z$(*bq7M)IdM42Z}SLe~w^YbcC{|mwDT1*?1bG&nJWT6?*>patHG0{U+LnBkNx~?Tm z&&iw7Y>hxGr_Bg1tTK{ks=qVO1Po1}3;Z4I#?D4c;g-G?-aJH8n0Ld|CE&Sptk`I1 zpF=pFY8kp#WDuicmBC6GKgb%mm56ObMKb`6D7S!HFNrihKN_f)fJ`0=VNXLE`y@4v z&7Y8Ahy$3JpA|(IZrT(5-C+m8?2~wsBpxB?$c!fltk^jHOE8W|)*c6-8EGC$%Mwa! zgdVDr>!^1lwWEQJr)cRxQU%CYWI|_Q+sv+*Wac4-cWH$ZA-_JvOywlJG)W&(@u}CL z5#=x~=V($T9ch{^9M{gS9pQF;+VEcH>!c~W{PQx0P1!~XLSkkX4K z-{fKdKEW{xAzfx4RULd!&^?jWYlVXG1IThMFC-KbMnwHD1VU^r6o!Y0mvE_v+#P^` zZKsGF!i$q1(ZH*zFCp~z|9kyQy||?KzrbJK?*A7hit@3tsoYG^N+KY@t^%Eai#Ab- zDd$gBD2tOfpmAU&>Qk`X8;~5B4ZThyAP@mq#4wErWGeuzF`1yTL!N*SkP;3_DtS-w z0X08_ebO}|KLH}9x!2MB2E4R^0)I3YR(&dNcQKn%_>nh1kYesfjUo(DHl#MCKXnC<<{P=j=x>j(qw>;05%Mjv!DkPzrPO;QC-!iC~c3Bfl9uU*cnGIP)va$c1Sep@FQu8dVhr$9;Y z;JhnZo%ZpE*d5PtBvFIqFbcRQFGzAyx)lA$*jg!$Lj3y|=;4X$oZ8}n~j0R=YNGrBlQ7>1V z)e8NV*;laqS{BXdFR_2?T0UnoCM=3GC806KF~Ma1CB<>YDCJqg&k}t`r9`zDmuleG z;TwlRR6$I_i03Y1gBv$kONSg zs9ga*W`vGJ{u(*rgNSar7~ZGHt3*{w=%Cq0W;LB0b{D|R)<3|q9i^u7&n-@SQjn%=irV`Z{lOj7P zOnyFs0ole(<5_Ag0ud&>4;PtoR29bI)LRV+ZT>3d5|V}cvyS(JnVNIcw~d*R8rsP*BQ9JT0%U`HO2TVA4QWRgUR9g2LhymM1VY7zx8mGORAc=v#qxY&7K44HScVPYMiwZ)6Pvt@Ci+gWXJ(ISe4d@0fc=T7Xz(oVLv zHWb<{^UW;;g(5>MfTKBkOMImk0z9((a$q~ zvX$X1j_m}bj^9ha#v+n9BK{(c<)UYR{=O`$$v!`Gi{c^D)}EH{nzMk?Bn7?v8d7-y zskn$%=c{UfdakL<*Wy!JgOoOlU|%m{(HD~20%@wx`RJW~(};t)Ud4q$(YrX;zgTQw z#jG~Bq2SRldVZF6Z8tz_>Ai@6$gksuBJF(cmq-c*UK)ZZ|G$;a)Zim zR276OK=$9H(pyw>lWN_9D0diGNyKmrR}6PRR0+luWetm8#p1fVTFtLPl5j(Jf93fL zRnNBn#`E8CIVSM@=O~@MJpVq*$ZI_RCingjVF#`@^I|s?MfuJ@Zg$R&tOREi)WPz{T(r80JFi7>8s&8mAN~l0cnr&5(_Hnpu8NI z0e?-e1Ij_c{Lr9ub}LC7`*1wjRw*vPT=X~Don8mdXDfv+Ic&d5oRsaLZyxRx>aq)Z(Llo(PBuzW5_Xwsz&aw(5)EcOg#Zhi z;?dj_#U$K{wNCM4hp<)N+FQo;qmMVRMHRFTQ49b2%**_?2g7OmjE0bUT+5RYB zkC=d1T($Gno#F!jqn8mxV4r6Lk82}V+_uL$7FyLLaHA7@iW9N>V(R7`k7YT?5$z}& zsw#akvUj{&A`(w0GI5x^fouxBEy`4&=9Ol=D&IYImnZH7Nv>+--{oM({EWxGLEx=4 zXm1vx+;SPb=*B*-DdbQ8y2y*$PIQYm?N(1WQxV&{ z1!*;n)gr$JBc5wj3CU^(*UTk!$|_h8_+_+jPL!A#eKoaHrePDWIA`M!c z*IoV-mqzk`-W!jP6u~I>Yb+>GWU1jhEz`U|{0{sZ&yTzt>9ys*?P5Y6^%)_A7 zUQD%G<$bCSq*Kk=PIVLqlIfW)Lo$}LVOOX}AOI+^Xr3c+kCN9$qkW%ez~sYC+vw;2 zkJT+SuSu2*toRf&V)ez;%{(66Tn-~yJ51#biOP5`Rh8_GkhlnJMj5!Q@@c$E=?2;$ zo`)|Jt#O;^6_jgB3$82W8n=TrT2Kx-aLc)J0WvnPFYS>IwipzYRlx>kFu$mDj%&zP zkwC+JiTN#e59Cvbsrh9DaW<99$gJh0J6hvlzosuE$>pR0^LuGk|LTFLAocQ_V2w3} zQ`QW)(g{eXHSQDi;uz-O&C(1WO}d==rbonCW^A zv^k`)k^cS`^%CzR7jUlob-dr{;Jh=+S9odte z2K!$g_Q4Az%5t?dePqzJ?M8k^ir_XsB=&TP1+S)0F}MXls62<%C^hUv<&SVN@~&cv z1_wZNPh8>t=Ln<+bO~KKJ;i(_5*htL_{;=YI zMkkXxqpz1{gMHG?^#Mg_Dn4A_lhFnb?f@t&FA#nKh4`=ag3Np#t&^$MgEL ztfN)13qhtqmw^v7r3OX-1SXHbbHzQ%$GM8#U7|`cSIYi>1N%pbM5SA>ptQmc<{v8| z*J=;g;Cr8J1&1i@G5ZF1Mb?lt_(q_?{XnXER6oZ;-@0OxbDD$d$dxE zfm1@nV#*MNP}RX~J%&-;k?t2A@4$c+s7k4KGf^A(;zZom-QK4> z%6v`Y5!MsmS!boUZ6orx{cmQEZ_OwSH(*TBX4p=jS&hi{r`UY9^zX`N445L)!(pmI ze=(BGq&G?n4Xm;m$vs+hAJIV|$D|i9*k$Lzq|`y@Ly=%f(j+Em6O4Af-5P4nbXow{ z$4f}C>yUVh?Z804M#oS9XHyS`J1;ii?P|~*OAUC+esHg?A%A9&!=hkJsj+XO&Ty6U>7(Ouo(n)O?C_fxVU(Eug{ zRKNfNii#KjK~NA8)2_NIU_jTf##Pt&KW|m_5EOU6bN>JQr%!dIo9gB_J+Dw|)Z4g% zQc$56DmN9KEEU}{84IYptW=8U{=xkc_^9S-UT@}r!dMZB0988{P4kE+ zv`%W`F(tKJiR_M+y%kM{p{Ws$Y>JjW8BJb;jeTMRtVh&qz}1hxV8nAGXGNk{MWeH$ zU7(5B*Oz*NPO?P?xbE*Sg=@l@2DX+$Ays^SBA1!pVZ^^)-8USs#_CTtZGycZVh znuK=%f^=3t-s zevhI&u94>g2r0{024q46Tf4rP3zGnXAzo5FbR;ISDE1@3jE%q_Zl0O31%< z(?cyA?7O!AIfW3`+FYQS4r=b)R0#EP#|rVC+F(Sd3&CqXQ?(et(TKVA8}xCaWl;EE zstx3RoFM=1g59u-%|?S7Wt~~UOLZ4pRkT7nZ71>bKW5HHP`GOA)|_oJo5|Md2prF| zrn8%!CMVRd8mkbStwsP11|2i8NcGLF>i03Xs`t#T7O>mZi1^Js)mfloOu0 zvW$wZKgL|%lFDPW; zjA4N+<2dw-$;1Q(+rjG;pK|qN>H`V&RY(r1R12j#j5WbA5@66J*`|(UT}7?dpfq9t zcL!Nt%Dr;{q%`HFqoHY;JFOOpQc=O<&e9qdxv!Y8i z@<{~w#@fH5%FAcp?=Np2uwPnx-yQfJe?XnJHm#zMpvtUkt_%`83@_}aOmnqYp*OOi zbal-gy@0a07{IUbIeSwmR{8z`ycDRO>Y9t?-9Nw$tho@B;s3WR1~k{>lM_KP{13@A zA0AXiRZ}nYt@8GIFMjCWeisL}GH)K<)QFiO(OmAOQ`LMVrj2k@3NXWCn)~DZ;HK`) zFDp%@q3x_xje$RxP+1p!3ApLNsPjxU-AT|wlCzcCH_5yg3fka0 z_m}yhP?^gBk}!jvPiu6EV(*RpAplhoyTXtC8J9yTHtY&YDfYj)JGi2kgb|(H2@aH0 zb_`tz|ePurz(rv{4HA)Wuk;Rh3<>$b?v7hJi zbc+2lJw@!7xm!_@l*8o+dpI9~*ca`e_i8SW-W&T-x~rx58|mtLrTPiZ{^Zq^L;01% zrtLq)*vL(lUGC-59_MZ@PuiQyD!TJ>SwmOI1&}D?7_v$2{jC2KWeql2z}ZDU$-R+o z|6045%d?PA)tgE= zA|Z)6WVSsTvCpDPzmvPMd`3dO3Vt6KP=<-UWxR?o5!(C8bzI)!#YK{rP~4ljTT;;- zGE0zz&|d(_qiJx-y?_31dyM(^MAj&j`zPK*B(a89!dp_!Rm9k@ggrlSDtX6@+{olI z78jWa@JjYi?qz@-#Fx@*`4+46KWZnFFH^x<--kf~vyr2a2!cv{o4H5l&+wCja64gd zBt8`9H5s{^$*ln8Ll*x!pk*GWEVj^VxtVqJ$H`+%e(7cLG=rTwu<4Nng5V3DVD5SO ziOf$gld*O)zQ@nu2PWV3bGU}@{}DG+4zSF6m%t-}k$4;YX>t096)e7z*>_S72trN7 z+*vGtE0bP=$l?daCqi+fb6(!U3+!a-=g^`Y{s#GstGhl-nmSE$K@_R?P-cv`Rz4RgS2Z;oyQg~v&oAVDN}006cbtz`Q0_XpRFM-Euhv&k+WXWAwJRVy zCW4|1>O`0KcxeOl-8PXn-Xd+&UCQ&@xt~(T316r1>mfyBkNIVFoQxSv_Ru_ulPb3n z)I%h*klWs@ZAde1WSIC#W@t4E1kySbO zd7huF#8<23cd7g~b@&oMeRk&Tr11TU0EWa-iJ|3w_dlv?jtbO>k)urD>8D0kjvDg~ z&p*sc-&Of;b?_T%rhoc&6=(~|=N0*avPPLo$mhf~>4FX3p5tM+I*sIeVB;@_ky~f} zwnFgcZz{?}roEvE7|gz{=ulC3Q=zT>8;UW7S#K-ml`MXzYTmD~`$Xae_&j3}Pi2uZ zRz_vVX#|t5lY$y^l{gTW%78dR7QUl#SEaZh1v-PKZlL#O+^V4WCJ@&6XxyO%02kF6 zs!U#d7v7ZUy$iD}J{osbu3MHb?OdS)(hBh_<5k}KN?C#TxT~sk>ndtHcMjrriFfth zcZqk#d)!rbVGTOynsVm$iZ^=idc_;?4tLePtN}#p;~h2+-n*vw0KCH;wu}Xx_n|yn z<3qf6t?>fh;jX$hJ|YUKF5ZodkMiD)jE}%O+*OZcM+J3pbo>_;YPI4Xoj3~ba94eF z>{mfK;hmrgWR!b?{1x8O-3jh#`BTe(qr+|&>7E`x!%O#c`5U~)UDfICA1lu6e0C5Y zBinlq%3?IGtF+3CR8g?UG5mFAQ)$3T@_24R@DAzGLmm*xp;@2}90Bv}F9dqZi{LOI8 zy$}(+s=kHQ-Rc+V7A6-`gj-nrR%YMAGPkm-TbO$X%ioS7-Bm2oQdYOjFA~<7yC}j^ z7GK8fr7W|IRV`)iz3>=?B9ZmFSETz{-2;A+?q~8oif})RKfvt!Sq9JVXYL~mL>uZ_`JEvDut~rHs zkEUpIA6z%UgGn5R+H@3lvs6sFJwYifNwo=eg;!Fsr(pX`uR-Dhc*8U&y}nO z%ou`$=>=@g6h=%BXxs{TR?dM-0WZWP`%;d=JeQA_8(H9BG{>{Cut)BL?@^9A+6(^D zq;ZvkT`e7TUhPDb}3v`a-Pvkfunph3Boo zCvO%cc~*Jt&8k?avIW%Mnr56Y&h)W`0DW^t>~tUcrbkk_IEHZRl>sM5PO@MD(gY`l zi&OxJoQ*;fR|X8NG(Q;<-q-~*tA3oKE!2^QCy&z}L$Y9U*?|3`LcPBkUbh~*wv=|vWN(Ico`c$rkybI@;p z2ai0zM*V``@j-k_{66b(l@_vJX=ggW35q_!XDH>M&d{+4;d6?5HoE}x>`6rkpRUR` z9)u6D3gNpbiusgyNj)&a7ZxFWh?g{*wao(KCQYm_yD8nAZYqJ!gasV2Ft=ai_8y*o zo2NhLS~+B9{b3wnkQB}WH}!mi-?!n8B@I54-?rmDCD|PDZETEE(bOq4H)ypA-hs(a zxcw;)f5OG5@LI1K;LQg7F^_Y50aiOa`YjU0sAio)H&Q1b>Gkmu*1&`Jy+&=QQ}E%1 z*29p5%q`qd+c<_oUqQd-D}W~#*hS^l? zzHc(rR*l-pgkD9t?bX~~i{72^Yo`&iUer!KY6nlMQ9GGXTWNEy$;Lpd-hZIIuBJJh zY|tzgw-q#2^-m8nT?;!JzU>6{{QU=0jWS*#JgibUKeaKKs((C~9;6~p<@SwG(@6M| zD1Nn=MS{JBJhOn-y9@Cx-3THNb9&C3?;5~q$^cKU0r!1y-91?I!Wcan@SPt*uaKDY z;;@aD)3`ky9*p2K96X|H6<`I-q4on$I%}x0yx)T0NY_NvR2AmIsy#~mDhNEdP*ZcL z9eZ}eo6g-kDL_{Ob~9RYz7mdSO7X=cQh9(NX)eMspIWn{-Qwg+Ju zbs?&|8zghkc!NkZ2N0t&)*#BE?NxzWnu5Uv2AU#f zx9Nqk}?G2qQmKho{y|DZoZ0L+fVzm79dYOw?VQF?%M*Pw#Za7Ygo!mZjM#c~h zL+A9!8P@6I3>rGSxHj4;DqTTBm;2Gs!PN8FK4WJB&^$&5V<(AK#__fgG4Z$_%r+kG{dJtZDX)?pjo*?Xcu-i^f7s!W)jG7kFfB=OgsWRFwKX;=D=F_ zR>YH_i--O(#xnyFtV5`+19oIuv++|4+FNjDZv8?1y>_l~PK1RoMhhKeIUC2ca~%Rn z>VU0}hB17QC2Bo=&Q;8w=QZI5+<9$q0~hl+yD4actC+Z+wYS2}EHa;2Cp%(i?N+S22V5b!rlyC zX0ccHX7B`yAuux7%_46w@TJ5XUIuS5Z7Xx0MF!g-I@ZTS>j8sm9JgokgO7|GxHg45 z(=Z#Yr%2G^p-3}m+B$fo#az3VJJ%u7Y={YMFhFQ9UQG!+;wSJhx1ao(1fJ*G2JUP^ z0^=#tHb2r++dJIw&@{ycvrGG&JKv!&-k#??h_8=8a=*jT?2ok3 zD(uzE{k>-gwVvy=j#1Gtcy2T zX=6tu#Aqyx+l#x;*O7JVV<1y=?F(-Ii>JS(y2RIXFA6omo%S&#ZwAZ)0y+OK79Sq@ zGQdwvlcc>JMe-c=kL*HhL4Q@;g7#Ow_O_s1yfJPoY41BmW1B}vlCU`N3*Oc>^noA? zwP4?qLVf7oblqbj^MsX#_a6nmM%yM9`dTE^YD^gdy4pN0fZQQF3fUdLccYc4-c!`0 zXvR7T3ul`rUR)V@Qmlwz9bO*^2j|5+xLD7Ei|7F%Hroe0C`SE%_00Dc>0s#=3--Kn zK!F}Ae#6G%#S}FNGAuYRD!$oOy!c!3Vr}u_+5^)q7UaxzFl%kADaaP1kZFk(l$O3Y z1{MakcoO4O;VRZ*7MvEhP|NmZNa)g}{d)--{7jFI>_han9rUB3?Kh zS=AuPT+3vRr1XMlN#U(1T+os!s4d}whAgy}IAVA5@*c-pE=9mbWT6#qV=dD-5*mu* zLssb79-sY0{H_RO;j6!8K_;wl5i*H-nT+%@agj+IO4PZ(h%K!Rn-6kmD;K1-%w3?s23gDczMEDNbL@aM0nZdLRqG1 zpQ!oI5u-}WtKst_=c#9Cr>p(6-cg2s?Dtal>+(UJt=7W;?T*WSIiZ1Nm3vZTpAh9+ z0iKaVS1ikAeGX^&GMXWDS{5<01=r?u)GT5e=& zf|j2Qdo}Zym@=wyJjT@Xk-~?1v6co*=3%YZt0Md-^?Rm$$J9HxmeVnd;;cG3c)WgA zuXsT(`#loX;25e!i!&jR8 zQj=43y<6%UJwI31H1mAtF>W*&zcI4L#l~=BJA+rv6O5ekTVpOW{v4eQ4>iUO91m|* ztg{5rH_K;*lL4f8j`=G*$zVi<$KalMG_E=G^>OOgnVyuwv zyf75|c*PZAp?Lh=ZVJ=3_F%bU4)O>@#Cwu!)6y#t%T_{Zd^<=e;rlQ2T& zQn+WyYbJOfW#snsEfogo*D35!bu=GKHmCqSJX-ygauk4(kK$J;u<#vjo*N$#Td5?T zRtOyQ9VU*^zF_(h@|XMtg`dj5W#T(#91|TQ>r$gKU-Ilpad=fbzH~lI9AAkqtHC@} zEn2i0{k&^fY-Ye4Q!{umsc>bvTm__{9Bpw|KRXzTT8ZcpU$4}O zXw(zJCu%3O;)tJ^Iib^O@>F)3|F-)nm$td5^!g3s6{l-|@Dn`jx6}9^^Jfk@oALZP zAF|)|{H=bzI4=dWV|HPX=6RX()$_vVYv;A%h@YQ1uj~KhFS0IH{`4)oR9uq!i~KYD z3k4m;@({>GF9~0&T{03!{8IOlPGcEdo$yu``CoonT+NMR&O|6AvkRe`#XDTV23{69 z9x$Kb62RhPRgZ zw{Muk7qis3YO`k-S-m`9i;0VBU$}EDm2NQVWDwDD(wj35)mwF=C0x zEEZyk&=(87M8p@1!|xF3+l9D8=(h`g2h;?_uw^2*RET9lUn=-AXmE%T%SGmHA(jjM zZo!v}_}$|0l_I@Dh?N4sSA3<2uMi_VL_q;W!Bv9aC*rHbum?rSY9SsJ`f35cgz?p4 z)Pq7<4csF7H^3QxScpf2{;=SWi1@=|)LM~#REV`ge^l_bBL1itzFwr)39(-2>jYmf z;_Jki^+H)E6z|`7T%1bDLgPaUiV^?;}VBwP}PF(=}H$h{uROFd8y>)9;2 znG6SMKH+)13g{mI3eZsizB7Rf0B8oq=mVgu;&p!xbX(}E9)aggIQrrE1&&@gj_`i| zvwr-!$QYD_EJLp?#~GgtgHIeB_C7}g%S9+~S_Rqu2&j|^fxVZAYa`$)Rsf|N3@drK zo&qYO4g3RHXv&6s0O&S<*pNL#4Vp z-eFX=(m}ytRHr+N8oeX0iFX`cldcoBdL6Hg*A1`5SSG#K9s0_CusZ?dn(hSWulY{! zS=&yAZfAK{yGb^a{vn-*;;4h9tTDK+3eF?E=h5avg8PGouK<^MZ#ssjZ+c+*wNL}i zg0I)~AJQV-&b?{Hn)?UgNu`sXQK7HF#8KlexmuBK=#L)yfea~^z@!4|Do0G(b(b$l>f;0i?4a)hlYj} z`H(4wKFkmO9`GF5Qa|;Wmhreh_V=3ncQJJkF86q;e@a=_{ZnIiACP)6G=vTI0ii#I z-4|6IzH%MTJ0B_yCR%@1Zb%Y@Q_OsYwtJA)#X)s@Wr!r zxy6fhr7oxHb(3|r>3}kMq4C8~l(Y{BeI=$3_EhnUgBrR~mveMq&&$46mrqmbht1UG z483-y?miLDz7z(+?#^PYpq`fN^3GzJ?$G6KuS~b<@)o`JR^9!3IQubxI@y=SSV3N! zb@^B^)_Pt3+l%#(F4yR_59#h_;q12*Yl7jmczYW@hf?XC{5IUC%Si^65J_#)Yd7oe z58>=gxO8Q64v6)ZE_W95dR>>-QLNUNbon>E_9flDDw3TSDM9Zl#tOdcQ(b;ojP-#o z7kjbx=<;p7c8~5Zh-8;VP{LKkSiyIVm-4$}tZ#LBzZdHZUH(h2{X%zFM6wT3taS&( znknT}8GP3iDIfE`3rUTWwd1Axa3uRAfK1sl#{NBezLYn}pf_AE<+EO1S4(-7ti4*g zPermXM6!_391v@*l(0_q>+nG-Kk;JSE9E`1ZoXu%`Js#I!}iaFeqV8CNBPv~$mvl} z&2FO%^z0s#v89v)+$*^cO7|NBGS)XA;KPKrT>D!fIp?;?qL`2hcf016m)E|2BRUGaj0L4xABDBD6ZzB8YC`=;D znGFMY(yqc8+~HQ-)xp$Dhbfxpt0-DU?_fv`8VclUodGaQPg%@{Et(fE3A;1iio3cb z%LVaDWWEA2J-Y z?rNbtmpwK8o8UdPioEzxoYNt>3Ud=-bc`~1s&goX_oUWSn#)dQKsOKS37T@g z&K$JlpfiW`yeGAuwp{iamYZ7)2^G2PnU}ApEQgTZle+5|n~yLJ)I%1KR-6|GSAf0c zt=^M5&4tSL5;k%%YrM->3xibaE-)u5mw{jaUx0g9HYE z2ZV-yz*co%=_`j}|K%%(1u9`s48s+vgyG*;4)ZLT$XJs<5D7%&0~Ua9(XJ9!(p-;) zzoE&2JhlRAL9)3ouImHwxY|^YjY_1sj~B+5-ICyj1U9WrYI7GnABqhRM1B1{ndg9} zY-paDdrHb}a0MLFNck@V!ncOa z#aEkT{k;+nPU4%TvPr5B0RAicO(Z+shGWJL z#X8x#UaC{0@Q$V};L0or7!}AbycM`!g?ls--oyTQt8)Gtu6z%Z`R+eNoGC_lryTIO z1cQeJ_TUJmJ)<{BVe-WKNn?MV=4atJ1IHK~C*y#yCPFH^lbQNFP-fBFbRK{%LodV*-Fq`(~GJ#pV^ zA}Z2R6ajBMWy(;kO4Os9ozE4w9~`=b)6@wZX!)!(u^Q}_o*uw1X+1CfPxm#S_IF>l zRce2i&PxCSzZH>G1SRR)3(|VxXCgf!HMHSYMEVw1mHOS%6WJ}7_AL~t`lr=D=1T2$ z=`2E|52BzZo`~4nVV9W*{gaYd;3u(A+SmL{5>uphgLLL12~syW_jP^_w)bP1b2&Ek zrOiFjFNffmUzEY^qLfz~VNY{Wh-gs@C#Zon3cAa=U+da5=}bYIp6KvmH0dZDC*lbF zw;jWmLT!MgUVtG~mU%+AQrOPcp`C`H9lD|o&V}%RhTRVOv|A$f9p0xsM+KPRf7(Q8 zf2kk5c0SOx?{w#DkS7}`(hdKi)UWCqxbyEJxUYBtlmloX_`r#%jI!n$3|6a4B?h-Y zfa%plix`p!!U+&sd+04~3p->sH+DPtd z@k(g?LGywtF_62G9QKev?wUe{-bc0Zw(b>hk8Z#GGgY`<*FfIAiqb5iNZ&+$zTww` zzpgvm5PUi{+G}C^gD`1z%)}k3L3lcKJHz&_aCm1}08brd$cC;)(rlyd4Xq8jbw8B{ zQr({#TFZ3pQQdh68GHpEy}c!DzYr!Zg|F%E#jyQqn7V&kU7+#d3z0{m13y>nz~35a zp150Am+RW?x^ah|zU3#f>lWxRLhy0B?kp-c##EZHegQ?=ebgAwfG5Ip_f=!;p?v9e z=ej^o#FrtHH^OdMmD*JqcTtHS4%-{N62E~`sn_VV-eI$b!|fok7ak4XHqmdSpvOXoFcZ)s)jsW15+nZpNmW%5<}@_fO(Z zvncM2YFC;2iaV88qnT^Wq9AX7apzbA@Lhk8LUxq6*ARb;%9o<{oFH~zNG9PkaaYv1 z&MZo7gysn4D;T~*uDQm@KVs}F*Mw+`rye$aF=4PUMqceJE>nFiw# zki$1%!pJGORbw|;D1rMifcZ<#1Y~A60J?HJmzovLUmY!XQ~x%qzBN*se-F5##|&kI zQL6Rpq8_HTAmksh{yt&(-`oc>sLJV<_!HjU5IpM*cf+0LnMy$nSAS)MBS)ye(zL`q zmb}kmtE@;M8V+lnJ~zcZ*52}W7Rp46gTV&izAsIPoD(x_V~k-yv~{A< z&Bz$=Eo2Nc#xvtO5?F2kmYeaYb@EH5C*#{hdFJOKPhZB@*XSXhGRbpt{kAAzyNR&b zD+`-Wh*GcX*tu*Y5m>u;>rAM|V1M$4s_x?O?`c4R+4!`FG?h1Ndn?`wY}_+6H<%W@5iJ<0u7dsR!6ejWBi2Vj+DgmIIrZ zO)}tCm`uWiOawl7zmCX9E$lM~d>)aXMM^)9xVM>b+34OH<2S_`=fyHN#Xz7sV@WTN zHl1l`{`@O2dbmJ+gz-PXg(BYN)Mn*Lt^z`MpsJxgJ7DkOlcEDaik2!ayj!@y_h<7 zq5^lJu<)veeF0lzfjMLByU(9!hzW+j6X}7S$OESSutgjFZzJNHNa5RveZOhL0&xj6 zFW55_8w<4-_m*YYsoZFY8-m!Rue;3@&w8=1HpEp%;cCNv%1j~leFm(LUn|CL*Y;gz zh@}*p2!^Dx)(~$}y3YY?VakxGHL)FPEqFl`4glWrVVgVmIdD>4o#E=#2xTK&8? z?ps|}rsHinYbX~LWbn~LDz%~vx!}IFJl;`Khko;y5(mg%{8>!4QCM| z?V(Y%+O#*Aw3B<6?lzkCR!?QKt#%*X-LkHSW8AbGqr8XA?3)aA9=y^R##|#gYrpKW z9u?ao*vU<#K+e_0rk+F%dJMQ#`|RXSQ_tLAhrV9<%G=4+20J;@_$_0HQ`PRflcULP z2fv#?LzCMs{)Qf0g#XKPGzgd3$s0p$RoJeO`r7XbqoK1!s%20_({M2qM`a=1lElVm z9jU0Ph0DE7&GFv#MYxtNrz2)#Xi2>4!jK917^UOn)p{N2{BVdc8w}; z#ln-U>=a83k^>>CYF2uCTa8I^TB=RifUQPHq3nohbFA$3Kt>B!Y2`5dsnS%tGIpDl zU1Gsle~p!X#L~F=zNvg*x>{d|wy8PiEbD5^utzVA z%jI$P?tO#69a9iQj<!K6p0*O&KE=0l&$K#VF+@1tJZ0I(%odwL(ggHTWNbUyk(=L0D8@FXh9 ztq4}ZLs)lRi)M|XFl?&?NOv-!!1@u2A8OiP_WFS3XeE!&Npkjz2!mKx@<-~P4rhUA z!b0dq+k(>yg(rk0d15J(p*AzL#1>qJ9HRanK!HQXXo-e#6AGTrCBhI`QF z_t=g1+L?Q7YPglA-*77dMY_T_a5w_yYh=PkM=mrok$_A#j7>lA)IN-*KaZvV5lep> zOMenekB@8BSW<{5uqIe&s-XV|>o#wpfffN^n2x|^hs@i6l`nDu8{_UG8^bqWtOejp zB-otnWn<8$q{zk~_^4YGX($G;Z{q&azugo}Y%<#|7B-u7=k4w z{)`M#ATKg9XpL%X2;Gq&XS_P>&2B`I)u&8v!P;h8>&#;BCf8Z}GwAL!H57jXigqnU z+T=&tY+7r6Cem_KTW30t1Z}tjex#nEjo&WzIu9*^ABqKqf82dAu0dH+Ta^$GB>4S_NPGTWUbW+Yx5Zy=Au-+z*}-_*?$gEX`iC2dD54%+ z#*XKkq)$fOq^eLxeTnfE%=ermptRRjyAqI!Fw*iS?~}X{+JF%XvKb?^595*$9^@MB`5waM@l0RH>%(dJ%1k^X-sXzYCmn#y*9 zrbwVnW0+)?Cw&S9zE7`6V4}hPZ?9wnfU7TB0fmxO-nDd84Q80_mU!A~-D;su_fiR9 z7J@3-CkE(>cP*;S_88lNILL0GT)<}Bn+rm{vp1KoEq#F(XO|^*TCJ~I?4}>(vQG@; z^0g)Qjj_wZ@_Gy9V(pvD2S7hA=7Q;RzOCQpW%HH=+NbcAW#4QQwKWsoFWLPRdp~Mx zY)t$R#3pL%UR$j8Vt-|cFRj8?mVJ*+)Yh#OdrL8PJGFIfOk5K~JywF+LhQ}9c#2~8 zo*om^Vuk53dy{RyVr%!rrm?@GlX=6@!~Y{f=p4+|rv-En32FWZ$Im_g5#h9$_GZW8 zI2Q*%XafT2O$W}{+9@P#47y>~rwu_ng@j#NkwR+qgu+Dk^fE*=kl-W%XU==#zSRJ( zu_rfZND3gAdUQ_-bgOtz+_!pyVJ~ip$Omz&1w_L=ao<`Jt%7SR%C}l{2q?2o(39dl zabKvmJA*RoW_n z2oS7qP*GOd_F9`ru(yINYadRCwF&lU0#Zld7R-)`sWHD_fi*ud7Ml=jr^)BWVh9ZI zf^V(JH#?U37YT+wu>P{_BO3Ns(F!kNkN_Z*qw z&>GILNsR@zJ_E4E#}Q4%^R)Nw*X{2H7RU~$9?Se(r{=Y!+?6zTCNsN|AmVl>m0jdq zOzr$ObOkw3ce_QE7n0!#33qaWFv&~5wB4_5Q6@`OaD9xNlC+6`{O_dC#|`Xa9#3jh z6Zz>05OonaC*pAhUP*XtK_Y)^BB7b4#+^PeTq%dONUzwMMDCFUz^N0d=M(wACSn8S ziOvzx9Lzq38|PZC2%E4zaEOVzE0NM}gEfO=bW(pvim?v-L9TMdgAQBmkS#+*cEe^N zHr9##kW|MyFpwDMXk(oLKP1Cr!2vhENxFNI>f1@NC#i+wH#lOx!)|Vm2`Ilk$=KUT zbx)GaK$6;?lY^5nYCx|&xx6LEloV+iS$Lf7)KTia^(nZ6WI~e?q$-}Ymb6R#lE(|437cytz zDQd#Sn-`+IG*+gThRZZ~Nz#++o=vjxT{Mp2M~pUg-eI50_Lh70L=H zmKNHfYSJ^!*We(fKR=Cwp(zZOV;y7B+D5;8aOa*T$BCp;kmUfA{f5zI@+g7#uDX%& zX$l)0+MM<_cAsI_dH`$rU0W_q(Z=o#Tkf_?->}`Q9NO5uo8r4ujc=qfyHm8W`zLU| zX|ma+T_tvEXp)b$^hZ#HYO4a$D_Q0G9Nc|5wuPqen5Wp0#>Qt`x)O7AD%cdtZ*B3B zjcK~dV_bercfqW8Cx^ocaSs)#=exFe$1c2UXTi9rgvvq+NCqjjn|0DE$GO7^Pfesh zC-`v^S&$#Y1$ht~9vBTBVI$P;k@YI3?qEp8)8}}e`>FBgiaz%A6=0`9zh;&a`YK()lM;>+ z`2WV?(HG~-oNza|p!O3U1}macXrC4ErF8D#_t94MX7VqIKsl%ptmkTFh(`gV&Cgzd zlmRYqBMV*crulCzK>1Tj9Ebr96cjr0q+drD11Se@(&|L!_3p9kPXItc%mplTqnp5{ zpgXf^2%(=MTpPv#Dg{s=gHwliKq-Af^W7ZkR3kVP0!Sgi5kP?Ce1H@SvInmYq3}Xq zn+Z*Ja}g86@>gBZD!a@(Y?ssW1)-`@e$Hux2kBxJc zv93!b&&WTkwb4&Rn?mZZSJ0v(@#y1Pdb!b472HA(|Au7r)|piaDL_MZ$8-Gf0! zd63pQQLR0U9tL=8OsFxX8WU=7m1r^IvxFf7MM?brG>EzrTdyqe`V}ss!GpzWa1lP> z{4P7-LDf3IIk)x2_Z^Bgn3$*Ud-l9^)fa?ys*q~whwC%JPTjyDP%aC-;-W%X%KJvr z2SOn+NhV%PGw6-oo6^>$vKvyGHV-8h#>v)j1xAHfTi3Zh!?YLHwi=;a>1xlUvdQ=5E9V8Q$b)X2t5aR1nR+#)pehY;MImbaES3Et6)ly6vz?3xxSfpxPIF^- zx>#7#W7C9-jvXtzOfk~Nn{FhXc`F^josTC6^F6_CdkKIgWZUk0HSC9d5A>&osHgFz z3VG8S$H<>4{Fr+khrbMBx-Yu>P;|ZeK!N*dRMc;%{50(}~b&HD$ zO**ugd=ZcXz4+x|{BuB5J|OVA=CQ_ z6truRg|f*3r3=Fz$66Dl|5K_i%N=c<<2-`ILRm;7El>DBY9s_jFs}$jKx6&f`N7H> z_7_;=@;;%qE*@v}6pVJ!qCmHzXTfOc6Izs|fh|7CwDU-JW%y^Ac)%l#5RdeQO!dDq z;;Rf_oIyuTda_k#^aeje*3K@^G$51uHb4D;FIvwRd>N&k^L?d>aq_H zm9|ZdEGx)0BW6pUFnZ$i`-C=R_cF=1XNfibdiFne9rTUgdVM44A9u3Q7g_2bX$+-C z>LYr4FBy%&5i9l*O!sqhUN700`cW@=FeSgqP%pVRCGSa<-kWlFyVOgTWch+@0q+_;x?`c2H}^`+!-GP1 z<{NA$jou(H%N=ZYkxMzA@1#BBEE(FC!?qB(M3P0Yl~N;c{EG>u5}sWvFy)zW z#VMlXUjb5aHOyct3}k+XC#(|e8Evlavzvss3v`SKo~O7YpoN6FEW_c66`~Z#|IwKw zc9d}p{0JRbG6)es0qKs;1gb)ym%vjpcAHXIO0d@~3HF*F>i#|M5JX9S~s=tz7%2WCZsY{=l$bT^kOqEUDlTQVD{WSNNpC zmxoi*0b|^bS43G0FO@=-h6OK=U?{@rYZfz#r*TiAqIEq5RqY6@? z`hsu*&N)pW-ysdoDO7in!V-c77Oe$+gs^l{*rmf=>Od(_*EA?yxDhdthMiKa}N9WUP{uloO&6bqhP-Mw;I}!_Xf~+?vDo0r>?xega*(Du6*Au{lIl^%FzINuY|u@ z()d(q32do4VCM|53~tA@ zNrhfVDb-mSPZBXZV@=2$e1`bS)uv{g$$+QxW{7RHl=5@C;J+y9%AM1jri_8ux)B%Q zG;jy(7MeO7@ELlC{+Y-0u{s}Us@;)?E6d07;_*D&n2!c5da0#n0u>OTJCpLn-+v`1 z=j4>Rxu_|BD9L?Q(mMpaA~*w22wb`9c5Kt&R17l;S;HF;o-i53T_08ke{Eo@!>5*F zI$93Fy+Xh1um7WI{ePW@t}eyy5c3MH|JWwNU<(ji5NJhsC#W`<-aY_s&V9m?%tCtc zr3}o!L$LusdVg-8-2Dmu-qNH`B?71+EE`oltkSPIA)baQKIu*IwDE@G6N^FC+AFlH zlv+v;y<18P3zhT8i;h68wpDunJ-z>9PXSZs9Uhulmf(YV626cy6T&l8B-sf?@0u2R zL~5xBK3773FG?KJq0*XjPy!{rPQD^7#EIQ<&_&U^3Z-}!OGX6gl1d$a` zTG%V=W3h$$fhMilJQAGM|8QPi4DjDZD2D&Za|$0cU8IIWaMBrm1qY_(|AsI7RcIn} z0XQMy?K{fTP*1b~O5$prU>q045~Jx+q4~egKJy}@B8H7+8OmI;`QaDtx%bD~!LK;=NR$2%89(#;^a zrVDU?1bhrTgr}*7m0x)cHCFwS|3K8nY&8~~w-z6aW5JU-T5$1~S)kYEvR`@jEQift z(U~kfgMrUiGlR9wWRsZpC^CZ`GLu~gkk&uWWJ|>icHT_ZD>NOegV*R<6!0hf`?UNn zEx87rAB?VTQT>T1dlKG}!hhw_=Xv-A447WG#e{1{lV7LXzD(O;yJHJ_oVYR;y&@Kw z60>;ENwL0Aq$EzCjY|8Y-XdzC`T@5BQH;<-boht(qn=j(ttdd< zJC7L(=xU6^vFbJ9pzR95xmR!=7@R+sbirq<&lTH!Sn#GTc<~U1vV&&76)hT@$?&hv zgp+mTJ(->A{o9k6IhneGIg`aFF?TW>uM~R+y24>KWgU}Vklr=r9l;trb0&Mm47~?q zZD|_VI>%)l=jkK3sz#NvTj6V1F0l9#ONE+^*Ct_p3hgZBakw?$>QSnHy@1;bxp@;0 ze;D;^yEuXG2r}6TcJh=fr-+rP8l%PBH47yX}!MoEcV>mQ}EIv#- zPK`&8(|Xs()DD`XB&1tq^C}2vqXz8=la6#FnvIt0kKOQ*@C=6CJC9l>>}$suoiqvZ z!2nOF3-oS?c8>iv0=KnBFZ3pwH+!-==#gajJ>+Y%4c+Zw75#Ak{utk{KbF8)xq#gd zfR!uwZq1)P`l=r?{yk@l74=B;$uUrwJ4Zc+zonRKm3SsRH2N;%CC1^_P@V<5_ekC~ znIq;8**0DYV(3<|(y>^o=puM>Dh?Z7=)$xOR$c5R$WbgT6R8s)5W^yw)j||RZf-@YuV(LE@J#(fAJ*n36syO&6;1b|a>(m(Bvl;j- z7*{5EP6g3-bUFDHb8@PiRzzOd*mm+rg>(e~49-^^_ZWXFy-Q_Xd8bh54 z&UC!0Rjcq(Eqtu%EvADPvO_R$9@%)rNhm?{3?^p6*(&{4&tTR})^7$Yo5?O99AmZf zL{m&Kh5sLqU^ZdnP3vz_wFC}0fw9L^Fcfz*8F?w1;^9eVBo2vu_#}V5eVwsxyhkW> zHouhN5plccV1v?3T^>g@w^%^a!{T1kDWh^6#PW;Jw~s8l|bG{*|I zR>iiqrv`&Ud|*eozH0_4lF~&a7Y;KslF}<#Hkt}of+C^`cD?=*TSssZJ9INRPvgOb zL1(^0_s$4#;Q5te%$3E9Vu+d`g+B)8?fWJ96G<7*=(H1gpXTO%?ASCW>VC1l=!-Am zi8hmAHik{=K+kK#E{3MYCTy!#3U`({MOqd)OvRRho51%S044$~3KEh>mxa|kH1=XF zy)qotln+?!eI{0gyF_x)44fNUNmDn=%_B2hhf-h}xE>`S#0)hYNwOGFSifh=cTD0R zEo%xT5(~p{vjm=>KgW^{YmfKkz?d-@?yjQbhSn75_1GbU?!z=!s>MFk%0AbUT7eJX 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

    lodoXmJWKirq#lU*c|~q_^&X{6gQ*>Ow}C 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 v9ny6{K2P#p(VTU`T_{>_ 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

    |7|Ly5OkjfyQ3IJ+h%>wsbUq`m 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�o{wnP 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