Start CMake modernization scaffold
This commit is contained in:
83
docs/modernization/build-inventory.md
Normal file
83
docs/modernization/build-inventory.md
Normal file
@@ -0,0 +1,83 @@
|
||||
# Build And Platform Inventory
|
||||
|
||||
Status: live
|
||||
Last updated: 2026-05-31
|
||||
|
||||
This inventory records the known build surfaces during the CMake migration.
|
||||
Keep it updated as platform paths move to shared CMake targets.
|
||||
|
||||
## Existing Build Entrypoints
|
||||
|
||||
| Platform/Target | Current Entrypoint | Notes |
|
||||
| --- | --- | --- |
|
||||
| Windows desktop | Root `CMakeLists.txt`, preset `windows-msvc-default`; target preset `windows-vs2026-x64` retained for VS 2026 | Raw `.sln/.vcxproj` files removed on 2026-05-31; local machine currently uses Visual Studio 17 2022 |
|
||||
| Windows AppX | `PanoPainterPackage/Package.appxmanifest`, `.wapproj` referenced by solution | Distribution packaging |
|
||||
| macOS | `PanoPainter-OSX/` project files and `Info.plist` | Uses `NSOpenGLView` today |
|
||||
| iOS | `PanoPainter/Info.plist`, related Apple sources | Uses OpenGL ES today |
|
||||
| Android standard | `android/android/build.gradle`, `android/android/CMakeLists.txt` | Native library target `native-lib` |
|
||||
| Android Quest | `android/quest/build.gradle`, `android/quest/CMakeLists.txt` | OVR SDK imported libraries |
|
||||
| Android Focus/Wave | `android/focus/build.gradle`, `android/focus/CMakeLists.txt` | Wave SDK imported libraries |
|
||||
| Linux | `linux/CMakeLists.txt` | Old CMake 3.4, C++14 flag |
|
||||
| WebGL/Emscripten | `webgl/CMakeLists.txt` | Old CMake 3.4, WebGL2 flags |
|
||||
|
||||
## Existing Version Generation
|
||||
|
||||
- Script: `scripts/pre-build.py`
|
||||
- Output: `src/version.gen.h`
|
||||
- Current behavior: derives version from git branch, latest tag, short hash,
|
||||
commit count, and configuration argument.
|
||||
- Migration requirement: root CMake should call this script through a custom
|
||||
command and avoid unnecessary tracked-file churn where possible.
|
||||
|
||||
## Existing Dependency Sources
|
||||
|
||||
Hybrid policy: migrate reliable packages to vcpkg and retain SDK/patched
|
||||
dependencies until each platform triplet is proven.
|
||||
|
||||
| Dependency | Current Source | Initial Policy |
|
||||
| --- | --- | --- |
|
||||
| fmt | `libs/fmt` | Move to vcpkg |
|
||||
| GLM | `libs/glm` | Move to vcpkg |
|
||||
| tinyxml2 | `libs/tinyxml2` | Move to vcpkg |
|
||||
| stb | `libs/stb` | Move to vcpkg or interface target if package friction |
|
||||
| CURL | `libs/curl-win`, `libs/curl-android-ios` | Move to vcpkg where triplets work |
|
||||
| SQLite | `libs/sqlite3` | Move to vcpkg |
|
||||
| GLAD | `libs/glad` | Move to vcpkg or generated backend target |
|
||||
| Catch2 | none yet | Add through vcpkg |
|
||||
| OpenVR | `libs/openvr` | Retain initially |
|
||||
| OVR Platform/Mobile | `libs/ovr_platform`, `libs/ovr_mobile` | Retain initially |
|
||||
| Wave SDK | `libs/wave_sdk` | Retain initially |
|
||||
| Wacom WinTab | `libs/wacom` | Retain initially |
|
||||
| AppCenter Apple | `libs/appcenter-apple` | Retain initially |
|
||||
| openh264/mp4v2/libyuv | `libs/openh264`, `libs/mp4v2`, `libs/libyuv` | Retain initially |
|
||||
| jpeg helpers | `libs/jpeg` | Evaluate after image tests exist |
|
||||
| poly2tri/nanort/base64/hash-library | `libs/*` | Evaluate after component split |
|
||||
|
||||
## Current Validation Commands
|
||||
|
||||
These commands are the current local baseline.
|
||||
|
||||
```powershell
|
||||
cmake --preset windows-msvc-default
|
||||
cmake --build --preset windows-msvc-default --config Debug --target PanoPainter
|
||||
ctest --preset desktop-fast --build-config Debug
|
||||
powershell -ExecutionPolicy Bypass -File scripts\automation\test.ps1 -Preset desktop-fast -Configuration Debug
|
||||
powershell -ExecutionPolicy Bypass -File scripts\automation\build.ps1 -Preset windows-msvc-default -Configuration Debug -Target pano_cli
|
||||
```
|
||||
|
||||
Known local toolchain state:
|
||||
|
||||
- CMake: 4.0.0-rc4
|
||||
- Local Visual Studio generator selected by CMake: Visual Studio 17 2022
|
||||
- Android SDK: `C:\Users\omara\AppData\Local\Android\Sdk`
|
||||
- Android NDK: `C:\Users\omara\AppData\Local\Android\Sdk\ndk\29.0.14206865`
|
||||
- `vcpkg` is not on PATH yet; see DEBT-0007.
|
||||
|
||||
Known warnings after the current CMake app build:
|
||||
|
||||
- Legacy code/vendor warnings under `/W4`.
|
||||
- Visual Studio vcpkg manifest warning because manifest mode is not enabled.
|
||||
- `LNK4099` missing `yuv.pdb` for retained libyuv binaries.
|
||||
- `LNK4098` runtime library conflict from retained vendor binaries.
|
||||
|
||||
Platform-specific commands should be added here when verified locally.
|
||||
83
docs/modernization/capability-map.md
Normal file
83
docs/modernization/capability-map.md
Normal file
@@ -0,0 +1,83 @@
|
||||
# PanoPainter Capability Map
|
||||
|
||||
Status: live
|
||||
Last updated: 2026-05-31
|
||||
|
||||
This map is the preservation checklist for the modernization. When a component
|
||||
is extracted, update the relevant rows with the owning component, test label,
|
||||
and validation command.
|
||||
|
||||
## Project And Documents
|
||||
|
||||
| Capability | Current Area | Target Owner | Required Tests |
|
||||
| --- | --- | --- | --- |
|
||||
| PPI open/save | `Canvas`, serializer, dialogs | `pp_document`, `pp_assets`, `pano_cli` | Round-trip tiny project, old-version fixture, corrupt/truncated fixture |
|
||||
| Version metadata | `scripts/pre-build.py`, `version.*` | build system, `pp_foundation` | Generated header smoke test, missing-tag behavior |
|
||||
| Thumbnail generation/read | `Canvas`, `Image` | `pp_assets`, `pp_paint_renderer` | Golden thumbnail, corrupt input |
|
||||
| Save-as, overwrite prompts | App/dialogs | `pp_panopainter_ui`, `pp_platform_*` | UI automation and platform smoke |
|
||||
|
||||
## Image And Export
|
||||
|
||||
| Capability | Current Area | Target Owner | Required Tests |
|
||||
| --- | --- | --- | --- |
|
||||
| PNG/JPEG import | `Image`, `Canvas` import paths | `pp_assets`, `pp_document` | Fixture import, malformed file |
|
||||
| PNG/JPEG export | `Canvas`, `Image` | `pp_assets`, `pp_paint_renderer` | Golden output tolerance |
|
||||
| Equirectangular import/export | `Canvas`, shaders, RTT | `pp_paint_renderer` | Tiny cube/equirect golden |
|
||||
| Cube face export | `Canvas` | `pp_paint_renderer` | Six-face golden set |
|
||||
| Depth export | `Canvas`, grid tools | `pp_paint_renderer` | Float/readback validation |
|
||||
|
||||
## Brush And Painting
|
||||
|
||||
| Capability | Current Area | Target Owner | Required Tests |
|
||||
| --- | --- | --- | --- |
|
||||
| Brush settings serialization | `Brush`, `Serializer` | `pp_paint`, `pp_assets` | Round-trip and boundary values |
|
||||
| ABR import | `ABR`, `Brush` | `pp_assets`, `pp_paint` | Sample ABR and malformed ABR |
|
||||
| PPBR import/export | brush panel/dialog | `pp_assets`, `pp_panopainter_ui` | Round-trip fixture |
|
||||
| Stroke sampling | `Stroke`, `Canvas` | `pp_paint` | Property tests for spacing, pressure, jitter |
|
||||
| Dual brush/pattern behavior | `Brush`, shaders | `pp_paint`, `pp_paint_renderer` | CPU reference and GPU golden |
|
||||
| Blend modes | GLSL include files, layer rendering | `pp_paint`, `pp_paint_renderer` | CPU reference vectors and GPU parity |
|
||||
| Erase/flood fill/masks | `Canvas`, modes, shaders | `pp_document`, `pp_paint_renderer` | Edge masks, alpha lock, dirty rects |
|
||||
|
||||
## Layers And Animation
|
||||
|
||||
| Capability | Current Area | Target Owner | Required Tests |
|
||||
| --- | --- | --- | --- |
|
||||
| Layer add/remove/move/merge | `Canvas`, `Layer`, actions | `pp_document` | Undo/redo invariant tests |
|
||||
| Blend/opacity/visibility/alpha lock | `Layer`, UI panels, shaders | `pp_document`, `pp_paint_renderer` | CPU model and render golden |
|
||||
| Selection mask | `Canvas` mask layer | `pp_document`, `pp_paint_renderer` | Mask apply/clear edge cases |
|
||||
| Animation frames | `LayerFrame`, animation panel | `pp_document`, `pp_panopainter_ui` | Duration, duplicate, remove, seek |
|
||||
| MP4/timelapse export | `MP4Encoder`, recording thread | `pp_assets`, `pp_paint_renderer`, app | Smoke export and cancellation |
|
||||
|
||||
## UI And Workflow
|
||||
|
||||
| Capability | Current Area | Target Owner | Required Tests |
|
||||
| --- | --- | --- | --- |
|
||||
| XML layout parsing | `LayoutManager`, `Node` | `pp_ui_core` | Layout fixtures and malformed XML |
|
||||
| Yoga layout | `Node` | `pp_ui_core` | Deterministic geometry fixtures |
|
||||
| Generic controls | `NodeButton`, sliders, text, images | `pp_ui_core` | Event dispatch and layout tests |
|
||||
| PanoPainter panels/dialogs | `NodePanel*`, `NodeDialog*` | `pp_panopainter_ui` | UI automation scripts |
|
||||
| Canvas viewport UI | `NodeCanvas` | `pp_panopainter_ui`, `pp_paint_renderer` | Input-to-command automation |
|
||||
| Settings UI | `Settings`, `NodeSettings` | `pp_assets`, `pp_panopainter_ui` | Round-trip settings |
|
||||
|
||||
## Input, Platform, And Devices
|
||||
|
||||
| Capability | Current Area | Target Owner | Required Tests |
|
||||
| --- | --- | --- | --- |
|
||||
| Mouse/keyboard/touch/gestures | `App`, platform entrypoints | `pp_platform_*`, app | Synthetic event playback |
|
||||
| Wacom pressure | `WacomTablet` | `pp_platform_windows` | Adapter smoke with fallback |
|
||||
| Clipboard/file picker/share | `App` platform methods | `pp_platform_*` | Platform smoke or mocked service |
|
||||
| Virtual keyboard | platform entrypoints | `pp_platform_*` | Platform smoke |
|
||||
| OpenVR desktop | `HMD`, `Vive`, `app_vr` | `pp_platform_vr`, app | Compile gate and mocked pose tests |
|
||||
| Quest/OVR | Android Quest files | `pp_platform_android_quest` | Compile/package gate |
|
||||
| Focus/Wave | Android Focus files | `pp_platform_android_wave` | Compile/package gate |
|
||||
|
||||
## Cloud, Logging, And Automation
|
||||
|
||||
| Capability | Current Area | Target Owner | Required Tests |
|
||||
| --- | --- | --- | --- |
|
||||
| Upload/download/browse | `app_cloud`, CURL helpers | app service, `pp_platform_*` | Mocked HTTP and timeout tests |
|
||||
| License/check flows | app/cloud code | app service | Mocked response tests |
|
||||
| Logging/crash reporting | `log`, BugTrap/AppCenter | `pp_foundation`, platform wrappers | Log formatting and platform compile |
|
||||
| Headless automation | none yet | `tools/pano_cli` | JSON command fixtures |
|
||||
| Tracing | none yet | `pp_foundation` | Span nesting/timing tests |
|
||||
|
||||
34
docs/modernization/debt.md
Normal file
34
docs/modernization/debt.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Modernization Debt Log
|
||||
|
||||
Status: live
|
||||
Last updated: 2026-05-31
|
||||
|
||||
Every shortcut, temporary adapter, retained vendored dependency, skipped
|
||||
platform gate, compatibility shim, or incomplete automation path must be
|
||||
recorded here before it lands. Entries must be specific enough for a future
|
||||
agent or engineer to remove them without reconstructing context from chat.
|
||||
|
||||
## Entry Rules
|
||||
|
||||
- Add an entry before merging the shortcut.
|
||||
- Reference the debt id in code comments, TODOs, ADRs, or roadmap notes.
|
||||
- Include an owner, reason, validation command, and removal condition.
|
||||
- Do not close an entry until the removal condition is met and validated.
|
||||
- Prefer deleting shortcuts over expanding this log.
|
||||
|
||||
## Open Debt
|
||||
|
||||
| ID | Status | Owner | Item | Reason | Validation | Removal Condition |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| DEBT-0001 | Open | Modernization | Existing platform build files remain alongside new CMake | Required for incremental migration without losing platform coverage | Existing platform builds plus new CMake configure | Remove after all platform builds consume shared CMake targets |
|
||||
| DEBT-0002 | Open | Modernization | Vendored SDK and patched libraries retained initially | Some dependencies are SDK-only, patched, or have platform-specific binaries | Dependency inventory and platform build smoke tests | Replace with vcpkg packages or document permanent vendored status after triplet evaluation |
|
||||
| DEBT-0003 | Open | Modernization | Existing singletons remain during initial split | Avoid behavior changes while introducing component boundaries | App launch and component tests | Replace singleton reaches with context/service injection at component boundaries |
|
||||
| DEBT-0004 | Open | Modernization | Android, Linux, WebGL, Apple, and AppX build files remain platform-specific until root CMake alignment reaches them | Prevent platform regressions during incremental migration; raw Windows `.sln/.vcxproj` files were removed on 2026-05-31 by user decision | `cmake --preset windows-msvc-default`; platform-specific configure/build smoke checks as each platform is migrated | Root CMake owns every platform source list and package path |
|
||||
| DEBT-0005 | Open | Modernization | Temporary local CTest harness is used before Catch2 is wired through vcpkg | `vcpkg` is not currently on PATH, but headless tests need to run now | `ctest --preset desktop-fast --build-config Debug` | Replace `tests/test_harness.h` tests with Catch2 tests once vcpkg toolchain/presets are validated |
|
||||
| DEBT-0006 | Open | Modernization | `pano_cli create-document` validates and emits JSON command contracts but does not yet invoke the legacy document/app model | The document model has not been extracted from `Canvas`/`App` yet | `pano_cli create-document --width 64 --height 32 --layers 2`; CTest `pano_cli_create_document_smoke` | Replace command contract implementation with real `pp_document` creation once Phase 4 extracts the document model |
|
||||
| DEBT-0007 | Open | Modernization | `vcpkg.json` exists but CMake is not yet using a validated vcpkg toolchain on this machine | `vcpkg` is not available on PATH and Visual Studio reports manifest mode is disabled | `cmake --preset windows-msvc-default` currently configures with vendored dependencies | Add validated vcpkg toolchain/preset integration for desktop, Android, and Apple triplets |
|
||||
| DEBT-0008 | Open | Modernization | `windows-msvc-default` preset is used for local validation because the VS 2026 generator is not installed here | The target VS 2026 preset must remain, but this machine configures with Visual Studio 17 2022 | `cmake --preset windows-msvc-default`; `ctest --preset desktop-fast --build-config Debug` | Validate `windows-vs2026-x64` on a machine with Visual Studio 2026 installed and make it the default Windows validation preset |
|
||||
|
||||
## Closed Debt
|
||||
|
||||
None yet.
|
||||
553
docs/modernization/roadmap.md
Normal file
553
docs/modernization/roadmap.md
Normal file
@@ -0,0 +1,553 @@
|
||||
# PanoPainter Modernization Roadmap
|
||||
|
||||
Status: live
|
||||
Last updated: 2026-05-31
|
||||
|
||||
This is the living roadmap for modernizing PanoPainter into independently
|
||||
testable C++23 components while retaining all existing functionality. Keep this
|
||||
file current as phases are implemented. Do not let shortcuts, skipped platforms,
|
||||
or temporary adapters live only in chat history.
|
||||
|
||||
## How To Keep This Roadmap Live
|
||||
|
||||
- Update the phase status before and after each implementation pass.
|
||||
- When a shortcut is introduced, add it to the debt log section in this file
|
||||
until `docs/modernization/debt.md` exists, then move debt entries there.
|
||||
- When a major architectural decision is made, add an ADR under `docs/adr/`
|
||||
once that directory exists.
|
||||
- Every phase must preserve old behavior unless the roadmap explicitly says
|
||||
otherwise.
|
||||
- Each phase must leave the repo in a buildable and testable state.
|
||||
- Do not add stubs without a debt entry, validation command, and removal
|
||||
condition.
|
||||
|
||||
## Locked Decisions
|
||||
|
||||
- Graphics path: keep OpenGL working first; add Vulkan and Metal after the
|
||||
renderer boundary exists.
|
||||
- Required platforms at phase gates: Windows desktop/AppX, macOS, iOS,
|
||||
Android standard, Quest, Focus/Wave, Linux, and WebGL.
|
||||
- Dependency policy: use vcpkg where reliable; keep SDK, patched, or
|
||||
vendor-only dependencies with documented reasons.
|
||||
- Test stack: Catch2, golden/approval tests, and fuzz/property tests where
|
||||
useful.
|
||||
- Automation: local reproducible matrix first; hosted CI can be added later.
|
||||
- Documentation: ADRs, debt log, and this living roadmap.
|
||||
- "vkpkg" in older notes means `vcpkg`.
|
||||
- Target C++ standard: C++23.
|
||||
- Initial Windows CMake generator target: Visual Studio 2026 when available.
|
||||
|
||||
## Phase Status
|
||||
|
||||
| Phase | Name | Status | Gate |
|
||||
| --- | --- | --- | --- |
|
||||
| 0 | Inventory, Safety Rails, And Memory | Complete | No behavior changes; old builds still work |
|
||||
| 1 | Unified CMake Skeleton | In progress | Root CMake builds the Windows app and owns the source list |
|
||||
| 2 | Toolchain, Diagnostics, And Dependencies | In progress | Strict desktop library builds compile cleanly |
|
||||
| 3 | Test Harness And Agent-Ready Automation | In progress | `ctest --preset desktop-fast` runs headlessly |
|
||||
| 4 | Component Split Without Behavior Change | Started | Each extracted target builds and tests |
|
||||
| 5 | Renderer Boundary And OpenGL Parity | Not started | OpenGL output matches golden readbacks |
|
||||
| 6 | Platform Alignment | Not started | Every supported platform has named validation |
|
||||
| 7 | Hardening, Coverage, And Breaking-Point Tests | Not started | Each component has edge/failure tests |
|
||||
| 8 | Future Backend Readiness | Not started | Vulkan/Metal lab targets remain non-default |
|
||||
|
||||
## Target Component Architecture
|
||||
|
||||
The refactor should move toward one-way dependencies:
|
||||
|
||||
```text
|
||||
pp_foundation
|
||||
-> pp_assets
|
||||
-> pp_paint
|
||||
-> pp_document
|
||||
-> pp_renderer_api
|
||||
-> pp_renderer_gl
|
||||
-> pp_paint_renderer
|
||||
-> pp_ui_core
|
||||
-> pp_panopainter_ui
|
||||
-> pp_platform_*
|
||||
-> panopainter_app
|
||||
```
|
||||
|
||||
Intended responsibilities:
|
||||
|
||||
- `pp_foundation`: logging facade, math/util helpers, events, task queues,
|
||||
binary streams.
|
||||
- `pp_assets`: `Asset`, `Image`, `Settings`, serialization, ABR, PPBR, and PPI
|
||||
helpers.
|
||||
- `pp_paint`: pure `Brush`, `Stroke`, stroke sampling, and CPU reference blend
|
||||
math.
|
||||
- `pp_document`: canvas document model, layers, animation frames, and undo/redo
|
||||
model.
|
||||
- `pp_renderer_api`: renderer-neutral interfaces for textures, render targets,
|
||||
shaders, meshes, readback, frame capture, and tracing.
|
||||
- `pp_renderer_gl`: current OpenGL implementation behind renderer interfaces.
|
||||
- `pp_paint_renderer`: stroke rasterization, layer compositing, cube/equirect
|
||||
export using `pp_renderer_api`.
|
||||
- `pp_ui_core`: `Node`, layout, generic controls, text/image primitives.
|
||||
- `pp_panopainter_ui`: panels, dialogs, `NodeCanvas`, and app-specific
|
||||
workflows.
|
||||
- `pp_platform_*`: Windows, macOS/iOS, Android, Linux, and WebGL shells.
|
||||
- `panopainter_app`: composition root only.
|
||||
|
||||
Rules:
|
||||
|
||||
- Component headers must not include platform SDK or graphics API headers unless
|
||||
the component name includes that backend or platform.
|
||||
- Pure libraries must build and test without a window, GL context, network,
|
||||
tablet, VR headset, or filesystem outside test temp directories.
|
||||
- Public APIs should return explicit status/result objects. PanoPainter app
|
||||
code keeps exceptions disabled unless isolated SDK wrappers require them.
|
||||
- Singleton access should be replaced at component boundaries with context or
|
||||
service objects. Temporary facade shims require debt entries.
|
||||
|
||||
## Phase 0: Inventory, Safety Rails, And Memory
|
||||
|
||||
Status: complete on 2026-05-31. Created this roadmap,
|
||||
`docs/modernization/debt.md`, `docs/modernization/capability-map.md`,
|
||||
`docs/modernization/build-inventory.md`, and ADR 0001.
|
||||
|
||||
Goal: create durable project memory and prevent silent shortcuts before large
|
||||
refactors begin.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Add `docs/modernization/roadmap.md`, `docs/modernization/debt.md`, and
|
||||
`docs/adr/`.
|
||||
- Add a shortcut rule: every temporary adapter, fallback, skipped platform, or
|
||||
retained vendored dependency must have owner, reason, validation command, and
|
||||
removal condition.
|
||||
- Generate a current capability map covering:
|
||||
- project open/save and PPI compatibility
|
||||
- image import/export and thumbnails
|
||||
- brush presets, ABR import, PPBR export/import
|
||||
- layers, blend modes, alpha lock, selection mask
|
||||
- animation frames and MP4/timelapse recording
|
||||
- VR, tablet, touch, mouse, keyboard, gestures
|
||||
- cloud upload/download/browse
|
||||
- UI dialogs, panels, layout XML, settings
|
||||
- Windows/AppX, macOS, iOS, Android standard, Quest, Focus/Wave, Linux, WebGL
|
||||
- Record current build commands and known platform prerequisites.
|
||||
|
||||
Gate:
|
||||
|
||||
- No behavior changes.
|
||||
- Existing Visual Studio, platform CMake, Gradle, Apple, Linux, and WebGL paths
|
||||
are not removed.
|
||||
|
||||
## Phase 1: Unified CMake Skeleton
|
||||
|
||||
Goal: make CMake the canonical source list without breaking existing projects.
|
||||
|
||||
Status: in progress. Root `CMakeLists.txt`, `CMakePresets.json`, and project
|
||||
option targets exist. The Windows desktop app builds through CMake as
|
||||
`PanoPainter`; the raw Visual Studio solution/project files were removed on
|
||||
2026-05-31 by user decision. Non-Windows platform build files remain during
|
||||
Phase 6 alignment.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Add root `CMakeLists.txt` and shared CMake modules under `cmake/`.
|
||||
- Add `CMakePresets.json` with at least:
|
||||
- `windows-vs2026-x64`
|
||||
- `windows-clangcl-asan`
|
||||
- `linux-clang`
|
||||
- `android-arm64`
|
||||
- `android-x64`
|
||||
- `emscripten`
|
||||
- `macos`
|
||||
- `ios-device`
|
||||
- `ios-simulator`
|
||||
- Keep Android CMake, Linux CMake, WebGL CMake, Apple project files, and AppX
|
||||
packaging during the transition until each consumes shared component targets.
|
||||
- Move version generation into a CMake custom command using
|
||||
`scripts/pre-build.py`.
|
||||
- Fix `scripts/pre-build.py` only if required to avoid unnecessary rewrites or
|
||||
missing-tag failures.
|
||||
- Add CMake options:
|
||||
- `PP_BUILD_APP`
|
||||
- `PP_BUILD_TESTS`
|
||||
- `PP_BUILD_TOOLS`
|
||||
- `PP_ENABLE_OPENGL`
|
||||
- `PP_ENABLE_VULKAN_EXPERIMENTAL=OFF`
|
||||
- `PP_ENABLE_VR`
|
||||
- `PP_ENABLE_CLOUD`
|
||||
- `PP_ENABLE_VIDEO`
|
||||
- Define source-list helper targets so per-platform source duplication can be
|
||||
reduced incrementally.
|
||||
|
||||
Gate:
|
||||
|
||||
- Windows desktop app builds through CMake.
|
||||
- New CMake can configure on Windows.
|
||||
- Source list differences are understood and documented.
|
||||
- Non-Windows platform migration is debt-tracked until Phase 6.
|
||||
|
||||
## Phase 2: Toolchain, Diagnostics, And Dependencies
|
||||
|
||||
Goal: turn the build into an error-finding system before deep refactors.
|
||||
|
||||
Status: in progress. Initial warning/sanitizer option targets and `vcpkg.json`
|
||||
exist. Dependency migration is not complete until component targets consume
|
||||
vcpkg packages and platform triplets are validated.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Set C++23 through target features, not raw compiler flags.
|
||||
- Add warning profiles:
|
||||
- MSVC: `/W4 /permissive- /Zc:__cplusplus /Zc:preprocessor`.
|
||||
- Optional MSVC analysis preset: `/analyze`.
|
||||
- Clang/GCC: `-Wall -Wextra -Wpedantic -Wconversion -Wshadow
|
||||
-Wnull-dereference`.
|
||||
- Keep exceptions disabled for PanoPainter targets, except isolated SDK wrapper
|
||||
targets when unavoidable.
|
||||
- Add sanitizer presets:
|
||||
- Clang/GCC ASan and UBSan for headless libraries.
|
||||
- MSVC ASan where supported.
|
||||
- TSan only for pure/headless targets.
|
||||
- Add tooling hooks:
|
||||
- `clang-tidy`
|
||||
- `cppcheck`
|
||||
- shader validation or compile checks
|
||||
- CTest dashboard output
|
||||
- Add `vcpkg.json`.
|
||||
- Move reliable dependencies to vcpkg first:
|
||||
- `fmt`
|
||||
- `glm`
|
||||
- `tinyxml2`
|
||||
- `stb`
|
||||
- `curl`
|
||||
- `sqlite3`
|
||||
- `glad`
|
||||
- `Catch2`
|
||||
- Keep vendored until proven:
|
||||
- OpenVR
|
||||
- OVR/Wave SDKs
|
||||
- Wacom WinTab
|
||||
- AppCenter
|
||||
- openh264
|
||||
- mp4v2
|
||||
- libyuv
|
||||
- patched or SDK-specific libraries
|
||||
|
||||
Gate:
|
||||
|
||||
- Desktop library targets compile with strict diagnostics.
|
||||
- New warnings caused by refactor are fixed or locally justified.
|
||||
- No global blanket warning suppression for project code.
|
||||
|
||||
## Phase 3: Test Harness And Agent-Ready Automation
|
||||
|
||||
Goal: make each component reachable by automated tools and future agents.
|
||||
|
||||
Status: in progress. `tests/` exists, `desktop-fast` runs headlessly, and
|
||||
PowerShell/bash wrappers exist for configure/build/test/analyze. `pano_cli`
|
||||
exists with a first JSON automation command for validating create-document
|
||||
inputs; full document/app integration is debt-tracked as DEBT-0006.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Add `tests/` with one executable per component.
|
||||
- Register CTest labels:
|
||||
- `foundation`
|
||||
- `assets`
|
||||
- `paint`
|
||||
- `document`
|
||||
- `renderer`
|
||||
- `ui`
|
||||
- `platform`
|
||||
- `integration`
|
||||
- `fuzz`
|
||||
- `slow`
|
||||
- `gpu`
|
||||
- Add `tools/pano_cli` for headless automation.
|
||||
- `pano_cli` should support:
|
||||
- create document
|
||||
- load project
|
||||
- save project
|
||||
- apply scripted strokes
|
||||
- import/export images
|
||||
- inspect layers
|
||||
- run layout parse
|
||||
- emit JSON results
|
||||
- Add local automation wrappers under `scripts/automation/`:
|
||||
- configure
|
||||
- build
|
||||
- test
|
||||
- analyze
|
||||
- package smoke
|
||||
- All wrappers must return machine-readable logs or summaries.
|
||||
- Establish `tests/data/` fixtures:
|
||||
- tiny PPI files
|
||||
- corrupt/truncated PPI cases
|
||||
- PNG/JPEG fixtures
|
||||
- ABR/PPBR samples
|
||||
- layout XML
|
||||
- shader snippets
|
||||
- brush stroke scripts
|
||||
|
||||
Gate:
|
||||
|
||||
- `ctest --preset desktop-fast --build-config Debug` runs without a GL
|
||||
context.
|
||||
- Non-render components can be tested on a headless machine.
|
||||
|
||||
## Phase 4: Component Split Without Behavior Change
|
||||
|
||||
Goal: split libraries while keeping current app behavior.
|
||||
|
||||
Status: started. `pp_foundation` exists with binary stream utilities and
|
||||
boundary/overread tests. Continue extracting legacy-safe utilities before
|
||||
moving assets, paint, or document behavior.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Extract components in this order:
|
||||
1. `pp_foundation`
|
||||
2. `pp_assets`
|
||||
3. `pp_paint`
|
||||
4. `pp_document`
|
||||
5. `pp_renderer_api`
|
||||
6. `pp_renderer_gl`
|
||||
7. `pp_paint_renderer`
|
||||
8. `pp_ui_core`
|
||||
9. `pp_panopainter_ui`
|
||||
10. `pp_platform_*`
|
||||
11. `panopainter_app`
|
||||
- Remove renderer/platform dependencies from pure headers first, especially:
|
||||
- `Brush`
|
||||
- document/layer model
|
||||
- serializer
|
||||
- UI core headers
|
||||
- Keep facade shims where needed, but debt-track every shim.
|
||||
- Avoid large behavioral rewrites during extraction.
|
||||
- Each extracted component gets a focused test suite before moving to the next.
|
||||
|
||||
Gate:
|
||||
|
||||
- Old app still launches.
|
||||
- Component tests pass after every extraction.
|
||||
- No undocumented stubs or shortcuts.
|
||||
|
||||
## Phase 5: Renderer Boundary And OpenGL Parity
|
||||
|
||||
Goal: make OpenGL an implementation detail and establish parity tests before
|
||||
adding new backends.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Introduce renderer interfaces:
|
||||
- `IRenderDevice`
|
||||
- `ITexture2D`
|
||||
- `IRenderTarget`
|
||||
- `IShaderProgram`
|
||||
- `IMesh`
|
||||
- `ICommandContext`
|
||||
- `IReadbackBuffer`
|
||||
- `IRenderTrace`
|
||||
- Port current renderer classes behind OpenGL backend types:
|
||||
- `RTT`
|
||||
- `Texture2D`
|
||||
- `Sampler`
|
||||
- `ShaderManager`
|
||||
- `Shape`
|
||||
- Preserve current shader behavior and asset paths.
|
||||
- Add deterministic GPU tests:
|
||||
- clear
|
||||
- blit
|
||||
- texture upload/download
|
||||
- stroke composite
|
||||
- erase
|
||||
- layer blend
|
||||
- equirect export
|
||||
- readback bounds
|
||||
- Add CPU reference tests for blend modes.
|
||||
- Compare GPU output to golden/reference data with explicit tolerances.
|
||||
|
||||
Gate:
|
||||
|
||||
- OpenGL readbacks match golden data on Windows and Linux.
|
||||
- Mobile/WebGL compile gates remain green.
|
||||
|
||||
## Phase 6: Platform Alignment
|
||||
|
||||
Goal: every supported platform consumes the same component targets.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Convert these builds to shared component targets:
|
||||
- Windows desktop
|
||||
- Windows AppX
|
||||
- macOS
|
||||
- iOS
|
||||
- Android standard
|
||||
- Android Quest
|
||||
- Android Focus/Wave
|
||||
- Linux
|
||||
- WebGL/Emscripten
|
||||
- Keep platform entrypoints thin:
|
||||
- window lifecycle
|
||||
- input dispatch
|
||||
- clipboard
|
||||
- file picker/share
|
||||
- GL context creation
|
||||
- VR SDK bridge
|
||||
- packaging only
|
||||
- Add or refine CMake toolchain/preset support for:
|
||||
- Android NDK ABIs
|
||||
- iOS device
|
||||
- iOS simulator
|
||||
- macOS
|
||||
- Emscripten
|
||||
- Keep SDK-only imported libraries documented until vcpkg triplets are proven.
|
||||
|
||||
Gate:
|
||||
|
||||
- Every platform has a named configure/build command.
|
||||
- Missing local prerequisites are documented.
|
||||
- Each platform has at least compile or package validation.
|
||||
|
||||
## Phase 7: Hardening, Coverage, And Breaking-Point Tests
|
||||
|
||||
Goal: tests should try to break components, not only confirm current happy
|
||||
paths.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Add property/fuzz tests for:
|
||||
- binary streams
|
||||
- serializers
|
||||
- PPI parsing
|
||||
- ABR parsing
|
||||
- layout XML parsing
|
||||
- image metadata parsing
|
||||
- brush parameter extremes
|
||||
- layer/frame operations
|
||||
- undo/redo invariants
|
||||
- Add stress tests for:
|
||||
- thousands of stroke samples
|
||||
- extreme resolutions guarded by memory limits
|
||||
- rapid layer/frame edits
|
||||
- corrupt assets
|
||||
- cancellation during export
|
||||
- concurrent render/UI task scheduling
|
||||
- Add coverage for headless libraries on Clang/GCC.
|
||||
- Require coverage reports for changed components first; do not set a global
|
||||
threshold until the baseline is meaningful.
|
||||
- Add tracing spans around:
|
||||
- project load/save
|
||||
- render passes
|
||||
- stroke commit
|
||||
- readback
|
||||
- export
|
||||
- UI layout
|
||||
- platform I/O
|
||||
- Logs must include component, thread, frame/stroke id, and timing.
|
||||
|
||||
Gate:
|
||||
|
||||
- No shortcut remains undocumented.
|
||||
- Every component has unit tests and at least one failure or edge test.
|
||||
|
||||
## Phase 8: Future Backend Readiness
|
||||
|
||||
Goal: prepare Vulkan and Metal without destabilizing the OpenGL parity path.
|
||||
|
||||
Implementation tasks:
|
||||
|
||||
- Create non-default targets only after OpenGL backend parity:
|
||||
- `pp_renderer_vulkan_lab`
|
||||
- `pp_renderer_metal_lab`
|
||||
- Use `D:\Dev\vkpaint` as reference material for Vulkan painting experiments,
|
||||
not as direct production code.
|
||||
- Before integration, prove:
|
||||
- ping-pong compositing path
|
||||
- input-attachment/subpass path where applicable
|
||||
- feedback-loop or framebuffer-fetch-style path where supported
|
||||
- synchronization and layout correctness under validation layers
|
||||
- Keep WebGPU as an optional future portability backend, not the core renderer
|
||||
contract.
|
||||
|
||||
Gate:
|
||||
|
||||
- Vulkan/Metal lab targets are opt-in.
|
||||
- OpenGL production backend remains stable.
|
||||
|
||||
## Test Matrix
|
||||
|
||||
| Preset/Label | Purpose | Requires |
|
||||
| --- | --- | --- |
|
||||
| `desktop-fast` | Pure component unit tests | No GPU/window |
|
||||
| `desktop-gpu` | OpenGL backend golden/readback tests | GPU/GL context |
|
||||
| `fuzz` | Parser and serializer fuzzing | Fuzzer-capable compiler |
|
||||
| `stress` | Large and adversarial scenarios | Longer runtime |
|
||||
| `platform-build` | Configure/build each supported platform | Local toolchains |
|
||||
| `package-smoke` | AppX/APK/Apple/WebGL package smoke | Platform SDKs |
|
||||
|
||||
Acceptance for each phase:
|
||||
|
||||
- Previous phase tests still pass.
|
||||
- New component has its own tests.
|
||||
- No undocumented stubs.
|
||||
- No skipped platform without a debt entry.
|
||||
- Automation command is recorded in this roadmap or linked docs.
|
||||
|
||||
## Verified Commands
|
||||
|
||||
Last verified on 2026-05-31:
|
||||
|
||||
```powershell
|
||||
cmake --preset windows-msvc-default
|
||||
cmake --build --preset windows-msvc-default --config Debug --target pp_foundation_tests pano_cli PanoPainter
|
||||
ctest --preset desktop-fast --build-config Debug
|
||||
powershell -ExecutionPolicy Bypass -File scripts\automation\test.ps1 -Preset desktop-fast -Configuration Debug
|
||||
powershell -ExecutionPolicy Bypass -File scripts\automation\build.ps1 -Preset windows-msvc-default -Configuration Debug -Target pano_cli
|
||||
```
|
||||
|
||||
Results:
|
||||
|
||||
- `pp_foundation_tests` passed.
|
||||
- `pano_cli_create_document_smoke` passed.
|
||||
- `PanoPainter.exe` built through CMake at
|
||||
`out/build/windows-msvc-default/Debug/PanoPainter.exe`.
|
||||
- PowerShell build/test automation wrappers return JSON summaries and passed
|
||||
local smoke checks.
|
||||
- Known remaining warnings: legacy project/vendor diagnostics, Visual Studio
|
||||
vcpkg-manifest warning, `LNK4099` missing libyuv PDBs, and `LNK4098` runtime
|
||||
library conflict from retained vendor binaries.
|
||||
|
||||
## Current Debt Log
|
||||
|
||||
The canonical debt log is now `docs/modernization/debt.md`. Keep this section
|
||||
as a reminder only; do not add new debt entries here.
|
||||
|
||||
| ID | Status | Owner | Item | Reason | Validation | Removal Condition |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| DEBT-0001 | Open | TBD | Existing platform build files remain alongside new CMake | Required for incremental migration | Existing platform builds plus new CMake configure | Remove after all platform builds consume shared CMake targets |
|
||||
| DEBT-0002 | Open | TBD | Vendored SDK and patched libraries retained initially | Some dependencies are SDK-only or have platform-specific binaries | Dependency inventory and platform build smoke tests | Replace or document permanent vendored status after vcpkg triplet evaluation |
|
||||
| DEBT-0003 | Open | TBD | Existing singletons remain during initial split | Avoid behavior changes while introducing boundaries | App launch and component tests | Replace singleton reaches with context/service injection at component boundaries |
|
||||
|
||||
## Current Capability Map Seed
|
||||
|
||||
Use this as the starting checklist for Phase 0 inventory.
|
||||
|
||||
- Project I/O: PPI open/save, thumbnails, version metadata, autosave/save-as
|
||||
flows.
|
||||
- Image I/O: JPEG/PNG import/export, cube faces, equirectangular export,
|
||||
depth export.
|
||||
- Brush system: ABR import, PPBR import/export, presets, tip/pattern/dual brush,
|
||||
pressure, jitter, blend modes.
|
||||
- Painting: six cube faces, temporary stroke buffers, erase, flood fill, masks,
|
||||
alpha lock, layer compositing.
|
||||
- Layers and animation: layer add/remove/move/merge, blend/opacity/visibility,
|
||||
frame add/remove/duplicate/duration, MP4/timelapse export.
|
||||
- UI: XML layout, Yoga layout, panels, dialogs, color tools, brush tools,
|
||||
layers, animation timeline, settings, shortcuts, manual/changelog/about.
|
||||
- Input: mouse, keyboard, touch, gestures, Wacom tablet, stylus pressure,
|
||||
VR controllers.
|
||||
- Platform services: clipboard, file picker, save picker, directory picker,
|
||||
share/display file, keyboard show/hide.
|
||||
- VR/platform variants: OpenVR desktop, Quest, Focus/Wave, Android standard,
|
||||
iOS/macOS, Linux, WebGL.
|
||||
- Cloud/network: upload, download, browse, license/check flows.
|
||||
- Recording/export: PBO readbacks, MP4 encoder, timelapse frames.
|
||||
Reference in New Issue
Block a user