Files
webeditor3d/CHAT_CONTEXT.md
Victor Giers 3d1dd3fe63 auto-git:
[add] src/geometry/model-instance-collider-generation.ts
 [add] src/runtime-three/rapier-collision-world.ts
 [change] AGENTS.md
 [change] CHAT_CONTEXT.md
 [change] architecture.md
 [change] package.json
 [change] prompts-lite.txt
 [change] prompts.txt
 [change] roadmap.md
 [change] src/assets/model-instances.ts
 [change] src/document/migrate-scene-document.ts
 [change] src/document/scene-document-validation.ts
 [change] src/document/scene-document.ts
 [change] src/runtime-three/first-person-navigation-controller.ts
 [change] src/runtime-three/navigation-controller.ts
 [change] src/runtime-three/runtime-host.ts
 [change] src/runtime-three/runtime-scene-build.ts
 [change] src/runtime-three/runtime-scene-validation.ts
 [change] src/viewport-three/viewport-host.ts
 [change] testing.md
2026-04-04 07:55:41 +02:00

189 lines
5.6 KiB
Markdown

# CHAT_CONTEXT.md
This file is the lightweight startup context for new Codex chats.
Read this after `AGENTS.md`.
Then inspect only the relevant sections of `architecture.md`, `roadmap.md`, and `testing.md` for the active slice.
This file does not replace the full docs.
It exists to keep new chats focused and to reduce repeated context load.
---
## Product summary
This repo is a browser-based 3D scene authoring tool with a built-in runner.
Core loop:
1. author a scene
2. save/load it reliably
3. run it in-browser immediately
The product prioritizes:
- brush-first spatial authoring
- imported assets as first-class additions
- typed entities and simple interactions
- browser-native delivery
It is not:
- a full game engine
- a Blender replacement
- a general CAD tool
- an R3F showcase
---
## Hard architectural rules
- The canonical `SceneDocument` is the source of truth.
- The document must stay independent from three.js objects.
- Editor-authored mutations should flow through commands.
- The editor viewport is derived from the document.
- The runner is a sibling system, not an editor hack.
- Canonical document format is project JSON, not glTF/GLB.
- Portable save/load for asset-bearing scenes should use a project package built around that JSON.
- Runner/deployment output is downstream from the document/runtime build and is separate from editable project save/load.
- Model instances are separate from typed entities.
---
## Early binding decisions
These are fixed for the early milestones unless a later slice explicitly changes them.
### Coordinates and units
- world is right-handed and **Y-up**
- `+X` is right
- `+Y` is up
- units are meter-like
### Repo shape
- keep the repo as a single Vite app
- keep domain folders under `src/`
- do not split into a monorepo early
### State ownership
- do not use the React tree as the canonical state container
- keep canonical state in a thin external editor store/service
### Persistence
- version the document from day one
- keep migrations explicit
- early project persistence can be local draft storage plus JSON import/export
- once binary assets exist, portable save/load should use a project package such as `scene.json` plus bundled assets
- canonical JSON stays the source document format underneath that project package
- runner package output is a separate deployable artifact
- binary assets must survive reload via embedded or project-scoped persistent storage
- never rely on Blob URLs as the only persisted asset reference
### Early box brushes
- first brush kind is an axis-aligned box
- arbitrary brush rotation is deferred
- stable box face IDs are:
- `posX`
- `negX`
- `posY`
- `negY`
- `posZ`
- `negZ`
- `posY` is top and `negY` is bottom
### Early UV data
Per face, keep explicit UV transform values such as:
- `offset`
- `scale`
- `rotationQuarterTurns`
- `flipU`
- `flipV`
“Fit to face” should rewrite explicit values, not add a magical persistent flag.
### Model placement
- imported assets live in the asset registry
- placed imported models live in `modelInstances`
- typed scene objects like `PlayerStart`, `TriggerVolume`, or lights live in `entities`
- collision authoring for imported models belongs on `modelInstances`, not asset records
- generated imported-model collider data should be derived from asset geometry + instance transform + authored settings
- for imported-model collider types beyond simple boxes, prefer a Rapier-backed collision/query layer over extending the handcrafted collision code indefinitely
- broad-phase and narrow-phase pruning should come from that collision/query layer, not custom app code
### Interaction scope
- keep `Trigger -> Action -> Target` typed and explicit
- do not add actions for systems that do not exist yet
### World environment vs local lights
- global background / ambient / sun / fog belong in `world` settings
- local authored lights belong in typed entity schemas
- true skyboxes or environment textures belong after persistent asset storage exists
---
## What a good slice looks like
Each slice should land the smallest coherent end-to-end version of the feature across the layers it touches:
- document data
- commands
- viewport behavior
- runner behavior if relevant
- persistence
- UI
- tests
Do not land speculative scaffolding with no immediate slice use.
If a roadmap item is too large, split it into smaller vertical slices.
---
## Required habits for implementation
- Inspect the current repo first.
- Extend the current implementation instead of restarting architecture.
- If persisted schema changes, update versioning/migrations and add a compatibility test.
- Run the narrowest relevant checks you can.
- Report what was actually verified.
---
## Early slice ordering to keep in mind
- M0: foundation, document, commands, persistence, test setup
- M1: axis-aligned box brushes, face materials/UVs, runner, first-room polish, world lighting basics
- M2: typed entities, simple trigger/action/target interactions, click interactions
- M3: GLB/GLTF import, local lights + skyboxes, animation, spatial audio
That ordering matters because:
- world settings do not need entity or asset pipelines
- local lights need the entity system
- skyboxes need persistent asset storage
- animation and audio actions should land only with those runtime systems
---
## When to open the full docs
Open the relevant full sections when:
- persistence schema changes
- runtime/editor boundaries are being touched
- a slice adds new tests or new failure modes
- geometry semantics are non-trivial
- import/export behavior changes
Otherwise, stay focused on the active slice and keep the implementation small.