Add interactive navmesh visualization and bake tuning to PRK.Client
Goal Add a developer-only PRK.Client mode for visualizing and iteratively tuning the shared navmesh bake against a real offline playfield. Build on tsk_sdukjehp7y / draft PR #2570 without expanding that PR; use a stacked branch until the dependency merges. Proposed behavior - Explicit launch option enables navmesh tooling only with the existing offline playfield mode. Normal online/offline client behavior is unchanged. - Load the current static indoor/outdoor playfield through the shared RDBLib2 world geometry source and bake through PRK.WorldNavigation. Do not introduce a third geometry/bake implementation. - Render enabled detail polygons as a translucent/wireframe overlay plus boundary edges, with visibility toggles for navmesh, boundaries and source collision/geometry where practical. - Add a dedicated diagnostics/tool window with validated fields for profile selection and cell size/height, agent height/radius/climb, slope, tile size and region thresholds. Rebuild is explicit, cancellable/bounded and transactional: failed/invalid/cancelled rebuild keeps the previous valid overlay and reports the refusal/timing/counts. - Support reset to the selected shared indoor/outdoor profile and export the current compatible tile set plus profile/provenance to an explicit user-selected path or configured tooling output; never write game assets or server databases implicitly. - Release GPU meshes/renderables, native owners and cancellation work on zone reload/tool disable/client shutdown; stale async results cannot publish into a newer playfield. Reuse - Existing ClientLaunchOptions/offline flow, Diagnostics/UiWindow patterns, CollisionVisualizer lifecycle, shared WorldGeometryLoader/WorldTileBaker/NavigationTileSet, and client engine mesh/material allocation APIs. - Factor reusable navmesh debug extraction out of the PlayfieldEngine-specific debug builder if needed; do not make PRK.Client reference PlayfieldEngine. Acceptance - Launch option validation prevents unsupported online/headless use and malformed output/profile values. - Real indoor and outdoor offline playfields bake and display; profile changes produce validated overlay/stat changes, and invalid/cancelled/failing rebuilds preserve prior display. - Overlay geometry respects enabled polygon flags, tile/world transforms, boundaries, negative origins and stacked layers; rendering is bounded and avoids per-frame rebuild/allocation. - Focused parser, presenter/controller, extraction, lifecycle/stale-result and real-asset tests pass; client build/publish includes the production native library. Browser/UI testing is not applicable to the Vulkan client, but a visible offline smoke is required when the graphical environment supports it. Dependency Stacked on feature/rebuild-world-navmesh-baking / draft PR #2570. Implementation branch: feature/client-navmesh-visualizer, created from PR #2570 head 25bc75e8f. Do not merge independently until the shared geometry/navigation dependency lands. Implemented milestone (uncommitted) - Added explicit offline-only --navmesh-tools and optional --navmesh-output launch flow, a dedicated Navmesh Tools window, editable bake profile, collision-policy cycle, transactional background rebuild/reset/export, stale-result cancellation and visibility toggles for polygons, boundaries and indexed source collision. - Added shared enabled-polygon/detail/boundary extraction and a tiled GPU overlay. New GPU resources are prepared before replacing the prior overlay; display/build/export failures retain the last valid result. Removed arbitrary global-world and visualizer triangle caps; large worlds remain spatially indexed. Remaining format/native handoff refusals now report the subsystem, actual dimensions/counts, limit and affected bounds. - Restored compatibility defaults exactly rather than changing AO movement behavior: indoor 0.08/0.08 cells, 0.2 height, 0.2 radius, 1.0 climb, 85-degree slope; outdoor 0.32/0.16, 2.0 height, 0.6 radius, 0.8 climb, 85-degree slope; static merge threshold 0 and runtime ACG threshold 1. Cave runtime radius remains 1.0. Added explicit contract tests. - One intentional behavior improvement requested by the user: shared indoor shell triangles carry client-authored normal classification, and indoor KD walkable slopes are filtered to Detour components reachable from those authored floor/ramp candidates. Ceiling-facing shell geometry and non-coincident upward KD ceiling components remain rasterized collision/headroom but lose navigation flags. Floors, connected ramps/decks and the legacy 85-degree Recast slope behavior remain. Focused duplicate and non-coincident KD ceiling regressions pass. - Direct indoor-span experiment was implemented and exposed for comparison, then rejected after user visual testing: output was worse and bake time was similar. The experiment and its native/managed/UI/test surface were removed completely. The maintained implementation uses legacy triangle rasterization only; no dormant alternate path remains. - Fixed run-client-dev.sh by adding a cached native-toolchain SDK image (CMake/g++/Make) and a container-only CMake build directory, preventing host/container cache path collisions. Build-only command now passes with zero source warnings/errors. - Fast validation: client and navigation projects build; shared-world/default/KD-ceiling and non-install controller/parser tests pass. Earlier real indoor/outdoor controller tests passed before restoring legacy defaults. User visually tested the tool, identified remaining KD ceilings, and rejected the direct-span experiment; final legacy-triangle KD ceiling filtering still needs user visual confirmation. No further slow sweeps or GUI launches will be run by the assistant without request. Commits - 391f1a07e: fix: Preserve AO navmesh behavior and filter KD ceilings - f320be358: feature: Add client navmesh visualization tools Working tree clean. Branch is stacked on draft PR #2570 and is not pushed. No deployment or production data changes.
Checklist
0 of 5 complete- Add and validate explicit offline navmesh-tool launch/configuration flow without affecting normal client modes.
- Implement transactional shared-pipeline bake controller with stale-result cancellation, profile reset and safe export.
- Render bounded navmesh polygon and boundary overlays with correct lifecycle and optional source geometry visibility.
- Add diagnostics tool controls and status/count/timing feedback using existing UI patterns.
- Pass focused/unit/real-asset validation, client build/publish native delivery, and available visible offline smoke.
- Area
- Project Rubi-Ka
- Project
- engines
- Kind
- Feature
- Task ID
tsk_yz9zr3r3g7- Updated