Finish the editor: F2/F3/I/H/G, water-river-light gizmos, streaming catalog, any-game CLI#6
Closed
proggeramlug wants to merge 9 commits into
Closed
Finish the editor: F2/F3/I/H/G, water-river-light gizmos, streaming catalog, any-game CLI#6proggeramlug wants to merge 9 commits into
proggeramlug wants to merge 9 commits into
Conversation
added 4 commits
July 16, 2026 03:49
…ef, undoable environment (PLAN F2/F3-part/I) - Outliner: the list is a scroll region (wheel + scrollbar) with a filter box pinned above it, matching name OR id across all four sections. A 500-entity world is now navigable; before, the panel could not scroll at all. - Widgets: clip window (clipTop/clipBottom) + beginScrollRegion/endScrollRegion; clipped widgets skip draw/hit-test but still advance layout, so content height measures true. - Inspector: entity name is editable (rename coalesces per entity), tint can be added/dragged/removed (add and remove stay DISCRETE undo entries — only value->value drags merge), tags have add/remove rows, and modelRef edits via a draft + Apply button (no per-keystroke rebuild into a magenta placeholder). Tint/tags/modelRef changes destroy+rebuild the scene node — sync only updates transform+tint on existing nodes, so a swap would not show otherwise. - Environment panel: full schema coverage (sunColor, ambientColor, fogColor added) and every edit goes through SetEnvironmentCommand — the last mutation path that bypassed undo. Merge is scoped per FIELD, so Ctrl+Z steps back field by field, not the whole tweaking session. - 148 self-tests pass (entity-edit + environment command tests added). Claude-Session: https://claude.ai/code/session_01PmL9WgNMkAgvpYSHEZga8K
…set catalog (PLAN §C-tail/H/P5) - point-gizmo.ts: axis-drag movement for the non-entity selectables the entity gizmos bail on. Water: move center, scale mode drags size out symmetrically. Rivers: per-control-point wire-sphere handles — click to pick the active point, drag axes to move it. Lights: move position. Commits through the existing Edit*Commands on release: one drag, one undo entry. A handle-pick click is consumed so it cannot fall through to handleSelectClick and deselect the river it just touched. - Recent projects (H): toolbar Recent button opens the read UI that never existed for recent.json; clicking an entry switches project wholesale (openProject: project file -> catalog relist -> default world -> title). - Asset catalog streams (P5): loadAssetCatalog only LISTS models now; pumpAssetCatalog loads one GLB per frame in the main loop. The ~20 s black window at startup is gone — the world appears immediately as placeholder boxes and meshes pop in as they arrive. Unreadable GLBs mark failed and are never retried. Catalog reset on reload makes project switching sound. - --project/--world CLI args + dxcompiler.dll/dxil.dll beside the exe (see README): the editor now starts from ANY directory pointed at ANY world — it previously crashed at surface creation unless launched from a directory that happened to carry the DX12 compiler DLLs (the shooter root). - 148 self-tests pass; 45 s live smoke against the shooter project. Claude-Session: https://claude.ai/code/session_01PmL9WgNMkAgvpYSHEZga8K
pumpThumbnails renders each loaded GLB once into a 128x128 render texture —
one per frame, inside the normal frame, and only after the streaming catalog
finishes so the two pumps never fight. The Models tab is now a 64px thumbnail
grid (scroll region, hover/selection borders, name below each cell); cells
show a placeholder until their model streams in. Falls back to text-free
placeholder cells permanently if render targets are unavailable.
Requires the engine-side getRenderTextureTexture fix (returned { id } after
the v0.5 rename to Texture.handle — drawing any render texture fed undefined
into a native f64 param).
Prefab-tab thumbnails remain text rows — noted in PLAN.
Claude-Session: https://claude.ai/code/session_01PmL9WgNMkAgvpYSHEZga8K
…README truth pass syncEnvironment now delegates to applyWorldEnvironment — the same call the world-viewer example and any instantiateWorld consumer makes — keeping only the shadow-pass toggle behind the explicit dirty flag. PLAN.md Part 4 marks P2/P3a/P4/P5 done with what was learned; README rewritten to match reality (feature-complete, streaming startup, game-agnostic CLI). Claude-Session: https://claude.ai/code/session_01PmL9WgNMkAgvpYSHEZga8K
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
added 5 commits
July 16, 2026 10:32
…project; visible asset cells
Screenshot-diagnosed (2026-07-16): with --project ../shooter/editor.project.json
the catalog was keyed by LOAD path ('../shooter/assets/models/x.glb') while
worlds reference 'assets/models/x.glb' — every lookup missed and the whole
arena rendered as placeholder boxes. The exact identity bug joinPath's comment
documents, reintroduced one level up by the --project flag. ModelEntry now
carries relPath (project-relative KEY, byte-equal to modelRef) and filePath
(resolved load path); texture listing and the playtest --world argument get
the same projectRelative treatment (the game's cwd is the project root).
Pinned by four new path-identity asserts (152 self-tests pass).
Also: the thumbnail render pass is DISABLED — the engine's begin_texture_mode
is a per-frame override consumed at end_frame, not the mid-frame raylib idiom,
so the thumbnails stayed empty and drew as invisible images (also screenshot-
verified). The grid now draws clearly visible category-colored cells with the
model's initial (dimmed while its GLB streams in); the drawTexturePro path
stays wired for the day the engine grows a real render-mesh-to-texture call.
Claude-Session: https://claude.ai/code/session_01PmL9WgNMkAgvpYSHEZga8K
…jection (load from absolute address 8) Clicking to place (or grabbing a gizmo) died with 0xc0000005 at mouseToWorldRay. Disassembly of the faulting instruction shows 'vmovq 0x8, %xmm6' — an element load whose BASE REGISTER was dropped, i.e. a read from absolute address 8. Layout-sensitive: adding console.error lines made it vanish, which is why every earlier build and smoke test (none of which ever clicked in the viewport) was green over a binary that crashed on the first placement click. Repro pair kept: main-repro.exe + crash_main_10580_6a59eadc.dmp + main-repro.pdb. Dodge, same family as shooter perry-quirks #8: hoist all 16 elements of the inverse view-projection into named scalars first, then do only scalar arithmetic — the idiom mat4Invert itself uses, which has always compiled correctly. The inlined unprojectPoint helper (two 16-element indexed mega-expressions) is gone. Pinned by testMouseRay, which EXECUTES mouseToWorldRay headless — in the broken binary it takes the --test run down with the same AV, which is exactly the alarm we want. Verified live: 13 injected placement clicks + camera drags + move/rotate/scale gizmo drags, no crash; 158 self-tests pass. Claude-Session: https://claude.ai/code/session_01PmL9WgNMkAgvpYSHEZga8K
…ry, ui-smoke script (PLAN Part 5) - Scroll-wheel zoom dollies toward the point under the CURSOR (min distance 0.2, multi-notch aware) instead of forever approaching the world center — 'get close to that house' no longer requires discovering middle-drag pan first. Gated on the viewport so scrolling a panel no longer also zooms. cameraEyePosition moved to editor-state to break the orbit-camera<->ray import cycle this created. - Text fields have a real caret: click places it, Left/Right/Home/End move it, Backspace/Delete work on both sides, typing inserts in place. (Paste and selection remain engine-blocked: no clipboard FFI, no key repeat.) - Closing the window with unsaved changes parks them in <world>.recover — never silently lost, never silently overwriting — and opening that world later announces the recovery file. - tools/ui-smoke.ps1: the interaction test. Launches the real binary on a scratch fixture, injects placements/orbit/gizmo-drag/Ctrl+S, asserts alive + entity delta + safe-save siblings. First run: PASS (8 -> 13). --test cannot see input-path miscompiles; this can, and would have caught both of yesterday's shipped bugs. 158 self-tests pass. Companion engine PR: safe saves (engine#120). Claude-Session: https://claude.ai/code/session_01PmL9WgNMkAgvpYSHEZga8K
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Completes the editor against PLAN.md's definition of done (based on
feat/world-file-trust— merge #5 first; diff shown against it). Companion engine PR: Bloom-Engine/engine#104.SetEnvironmentCommand— the last undo bypass is gone. Preview lighting now runs the engine's sharedapplyWorldEnvironment.openProject).--project/--worldCLI args;gameId+kindColorsproject keys; and the discovery that the editor could only ever start from the shooter's directory (dxcompiler.dll/dxil.dll — see README).148 self-tests green; repeated 45–60 s live smokes against the shooter project.
https://claude.ai/code/session_01PmL9WgNMkAgvpYSHEZga8K