Skip to content

WIP: Dual rendering engines — SVG board track (#75) - #76

Draft
kursjan wants to merge 55 commits into
mainfrom
worker1
Draft

WIP: Dual rendering engines — SVG board track (#75)#76
kursjan wants to merge 55 commits into
mainfrom
worker1

Conversation

@kursjan

@kursjan kursjan commented Apr 7, 2026

Copy link
Copy Markdown
Owner

"## Track\n\nConductor: conductor/tracks/dual_rendering_engines_20260403/plan.mdGitHub #75\n\n## Status (high level)\n\n- Phase 1–2 done: SVG surface (SvgGameView, SvgBoard, SvgBoardCameraShell), shared pointer path (useSvgBoardPointerCamera, useSvgBoardInteraction, cameraInteraction), CameraSnapshot / cameraTransforms.\n- Phase 3 gate closed (maintainer review).\n- Phase 4 in progress: window-level input via useSvgWindowInput (from SvgBoardCameraShell), continuous camera rotation via rAF + world <g> transform, useSvgGameViewLayout. F3 overlay, extra tests, and phase gate remain in plan.md.\n- Phases 5–7 (settings, dual engine, E2E) still open.\n\nApproval pointer: approved/worker12579ca6 (pre-push: typecheck, test:unit:raw, test:ui:raw).\n\n## Review\n\nDraft for GitHub / Reviewable. E2E still assumes game-canvas in places while the app may use game-svg — expect CI e2e gaps until Phase 7.\n\n## Issue\n\nCloses / tracks: #75\n\nMade with Cursor\n"

Jan Kurs added 30 commits April 3, 2026 11:05
… API

- Add ContainerPoint/ContainerDelta, WorldPoint/WORLD_ORIGIN, ClientPoint
- Camera: pan getter, panBy, containerToWorld; constructor uses position config
- Extract applyCameraTransformToCanvas; hex/renderers use WorldPoint centers
- Share pointer pan session between canvas InputManager and SVG hooks
- Document rendering/canvas architecture; fix drift (pan vs position, panBy, apply helper)
- Rename PointerPanZoomSession methods (beginLeftButton, onClientMove, endLeftButton)
- Move cursor styling to session.cursorStyle(); internalize CAMERA_INTERACTION
- Add clientToContainerPoint helper; use mouse button constants
- Update tests; drop redundant ContainerToWorldFn JSDoc in useCameraControls
- Add factories/brands for ClientPoint/ClientDelta, ContainerPoint/ContainerDelta, WorldPoint
- PointerPanZoomSession: ClientDelta threshold and between(); bind maps to Container* for Camera
- HexUtils/Camera return WorldPoint.xy; stories and SvgGameView use typed constructors
- Sync rendering + canvas ARCHITECTURE; tidy useCameraControls import
…ransform

- Add common/camera/CameraSnapshot; drop svg/cameraSnapshot and applyCameraTransform.ts
- CanvasController applies center→rotate→scale→pan on Context2D; DebugStats.camera is CameraSnapshot
- DebugOverlay reads camera.position; update tests and common README
- Architecture: canvas hooks folder, CameraSnapshot in cross-links; components ARCHITECTURE note
- README: 2026-04-06 journal entry
- useCanvasControllerDebugStats: relative import for CameraSnapshot
- useGameSnapshotBridge: shorter interface and hook JSDoc
- PointerPanZoomSession: rename internal client fields to *Point; onZoom param zoomDelta
- canvas/ARCHITECTURE: align bridge + debug stats with CameraSnapshot and useCanvasControllerDebugStats
Jan Kurs added 25 commits April 6, 2026 19:25
- Remove DEV console.table from SvgBoard
- useCameraControls: satisfies CameraSnapshot/readTransform/containerToWorld
- useSvgBoardInteraction and tests: satisfies UseCameraControlsCallbacks
- Return CameraSnapshot as camera; rename ref model binding to cameraModel in listener setup
- SvgGameView: pass hook camera to SvgBoard; drop redundant useMemo snapshot
- Tests and rendering ARCHITECTURE hooks section updated
- Camera clones CameraSnapshot in ctor; pan/zoom/rotation getters; reset restores default
- Add DEFAULT_CAMERA_SNAPSHOT; CanvasController and tests use it for construction and debug defaults
- useCameraControls/useCanvasControllerDebugStats: DRY initial empty state
- Docs: rendering + canvas ARCHITECTURE, common README; JSDoc on Camera and default snapshot
- CameraSnapshot as Readonly<>; document replace-whole-object convention
- Camera panBy/zoomBy/rotateBy/reset assign new snapshot; reset clones default
- Sync rendering + canvas ARCHITECTURE and common README
- Extract world transform + Q/E rAF into SvgBoardCameraShell; SvgGameView composes it
- SvgBoard: board + ref only; shell sets world g transform via setAttribute
- Storybook uses shell (same surface as game); restore svgBoardWorldTransform helper
- Update architecture docs

Made-with: Cursor
…string (refs #75)

- SvgBoardCameraShell: cameraSnapshotRef + windowInputCallbacks required; drop svgBoardWorldTransform module
- SvgBoard: data-world-transform-group on world <g>
- Stories: sync camera ref in useLayoutEffect (eslint refs)
- Docs: architecture wording

Made-with: Cursor
Rotate snapshot position opposite the applied rotation delta so continuous Q/E rotation preserves the world point under the same screen pixel.

Made-with: Cursor
…cators

- Mark approved tasks with `[X]` to indicate completion and approval.
- Clarify movement of `approved/<branch>` tag only upon user approval of the specific commit.
- Ensure that if the latest commit is approved, all previous commits are also considered approved.
Eliminate the cross-hook containerToWorld ref bridge by wiring camera-first callbacks and passing containerToWorld into hover handling directly.

Made-with: Cursor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant