Correct PLAN3D asset inventory; log M0 contract additions
§2's paths were substantially wrong. Re-verified against the filesystem: 3D-STORE is at ~/Documents/Destroyulater/3D-STORE (its clean_glbs debris set is real, just relocated), while 3D=models/, character_kit/, mixamo-fetch/ and FBX/ do not exist on this box at all. That last group is Lane D's whole animation pipeline, so it's flagged loudly rather than quietly patched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
1049dece24
commit
868ea5699d
73
PLAN3D.md
73
PLAN3D.md
@ -18,10 +18,11 @@ canon; this file is the build canon.**
|
||||
then work on branch `lane/<x>`. Push your branch; never force-push main.
|
||||
- **Units:** meters, +Y up, world origin at yard center on the ground. Player height ~1.7 m. The yard is ~30×20 m. GLB exports: Y-up, meter scale, `*_v1.glb` naming into `web/world/models/`.
|
||||
- **Asset copies rule (house rule from DJsim):** runtime models in `web/world/models/`
|
||||
are COPIES. Canonical sources stay in the shared libraries
|
||||
(`~/Documents/3D=models/`, `~/Documents/character_kit/`, `~/Documents/3D-STORE/`,
|
||||
`~/Documents/FBX/`). Never hand-edit a game-local GLB; rebuild at source and re-copy.
|
||||
Raw `.fbx`/`.blend` are gitignored; runtime asset is always `.glb`.
|
||||
are COPIES. Canonical sources stay in the shared libraries — **see §2 for the
|
||||
verified paths, several of which are not what this plan originally claimed.**
|
||||
Never hand-edit a game-local GLB; rebuild at source and re-copy.
|
||||
Raw `.fbx`/`.blend` are gitignored (`.gitignore` enforces it); runtime asset is
|
||||
always `.glb`.
|
||||
- **Rigged characters:** follow 90sDJsim DEVMANUAL "rigged characters" rules —
|
||||
`SkeletonUtils.clone()` for instances, height-normalize by head-bone height,
|
||||
never blind `setScalar`. The Mixamo pipeline is `~/Documents/mixamo-fetch/`
|
||||
@ -70,18 +71,39 @@ wind-change event, repair hold. Port the *behavior*, retune the constants.
|
||||
|
||||
---
|
||||
|
||||
## 2. Asset inventory (M1 Ultra, verified 2026-07-16)
|
||||
## 2. Asset inventory (re-verified on `m3ultra` 2026-07-16 by Lane A)
|
||||
|
||||
**This table was wrong in the first draft and has been corrected against the
|
||||
actual filesystem.** Several libraries it promised are not on this box at all.
|
||||
Trust this table over any path you remember; if you find one of the missing
|
||||
libraries somewhere, say so in THREADS.md rather than fixing it locally.
|
||||
|
||||
| Need | Have | Path |
|
||||
|---|---|---|
|
||||
| three.js r175 + addons (GLTFLoader, SkeletonUtils…) | ✅ vendored | `~/Documents/90sDJsim/web/world/vendor/` |
|
||||
| Player character (small person) | ✅ rigged fleet | `~/Documents/90sDJsim/web/world/models/peds/` (man_casual_01-03, woman, elder…); canonical rigs `~/Documents/character_kit/` (hum_character.glb, female/); more in `~/Documents/3D=models/characters/` (53 people-normal + comical) |
|
||||
| Locomotion anims | ✅ | `~/Documents/FBX/` (Running, Falling, Crouch To Stand, Reaction…), `~/Documents/3D=models/animations/` (Walk, Start Walking, Happy Idle, Injured Walk…, 32 clips) |
|
||||
| Missing anims (climb ladder, crank/wrench, dig, hammer) | fetch | `~/Documents/mixamo-fetch/` — add to wishlist, run fetcher |
|
||||
| Debris + yard clutter | ✅ perfect fits | `~/Documents/3D-STORE/clean_glbs/` (BlueCrate, BlackTub, WhiteTub, WoodenBin, LibraryTrolley…) + `~/Documents/3D=models/street-furniture/` (benches, streetlight, market_stall, food_cart, building_shell_01) |
|
||||
| Furniture/props (granny-flat interiors later) | ✅ | `~/Documents/3D=models/furniture/`, `props-scenes/` |
|
||||
| Trees, fence, house exterior, shed, garden bed, grass, shade-sail hardware | ❌ **GAP** | Lane E builds these (Blender is installed; house style is scripted builds — see `~/Documents/3D-STORE/build_booth_room_v23.py` for the idiom) |
|
||||
| Blender / Godot / UE 5.7 | ✅ installed | `/Applications`, `/Users/Shared/Epic Games/UE_5.7` (UE/Godot NOT used for this — three.js only) |
|
||||
| three.js r175 + addons (GLTFLoader, SkeletonUtils…) | ✅ verified, now vendored in-repo | `web/world/vendor/` (copied from `~/Documents/90sDJsim/web/world/vendor/`) |
|
||||
| Player character (small person) | ✅ 21 rigged peds | `~/Documents/90sDJsim/web/world/models/peds/` (man_casual_01-03, woman_casual_01-02, elder, hivis worker…) |
|
||||
| Rigged-character loading rules | ✅ | `~/Documents/90sDJsim/DEVMANUAL.md` — Lane D: this is law |
|
||||
| Locomotion anims | ⚠️ **thin** | `~/Documents/90sDJsim/web/world/models/peds/idle.glb`, `walk.glb` are the only clips found. Run/Falling/Crouch-To-Stand are **not on this box** |
|
||||
| Debris + yard clutter | ✅ exactly as promised, **new path** | `~/Documents/Destroyulater/3D-STORE/clean_glbs/` — BlueCrate_v2, BlackTub_v2, WhiteTub_v2, WoodenBin_v2, LibraryTrolley_v1, AirCon_v1 |
|
||||
| Scripted-Blender build idiom | ✅ **new path** | `~/Documents/Destroyulater/3D-STORE/build_booth_room_v23.py` (also `~/Documents/3dstore/`) |
|
||||
| Trees, fence, house exterior, shed, garden bed, grass, shade-sail hardware | ❌ **GAP** | Lane E builds these. Lane A has graybox stand-ins at the right scale and positions in `world.js` — match those and they drop straight in |
|
||||
| Blender | ✅ installed | `/Applications/Blender.app` |
|
||||
| ~~`~/Documents/3D=models/`~~ (characters, 32 anim clips, street-furniture incl. `building_shell_01.glb`, furniture, props-scenes) | ❌ **DOES NOT EXIST** | searched `~` and `/Volumes` + Spotlight. Nothing at this path or any similar name |
|
||||
| ~~`~/Documents/character_kit/`~~ (hum_character.glb, retarget pipeline) | ❌ **DOES NOT EXIST** | — |
|
||||
| ~~`~/Documents/mixamo-fetch/`~~ (wishlist → fetch.cjs) | ❌ **DOES NOT EXIST** | closest is `~/Documents/mixamo_upload/` (`Hum_M_1_mixamo.fbx/.obj`) — an upload staging dir, not the fetcher |
|
||||
| ~~`~/Documents/FBX/`~~ (Running, Falling, Crouch To Stand…) | ❌ **DOES NOT EXIST** | only Unreal's own internal `FBX` dirs match the name |
|
||||
|
||||
**Consequences, unresolved — Lane D is the one this hurts.** §5-D assumes the
|
||||
`character_kit` retarget pipeline and a library of Mixamo clips. Neither is
|
||||
here. The ped fleet and DEVMANUAL are real, so a walking character is still
|
||||
reachable, but Run / Falling / Crouch-To-Stand / crank / dig have to come from
|
||||
somewhere. Post in THREADS.md before burning a day looking for them.
|
||||
|
||||
**Open question:** PLAN3D §0 says the work happens on "the M1 Ultra
|
||||
(`johnking@100.91.239.7`, Tailscale)", but this box is `m3ultra` and already has
|
||||
`~/Documents/shades-laneB/` and `shades-laneE/` checked out, so lanes are in
|
||||
fact running here. If the missing libraries live on that other machine, §0 needs
|
||||
a decision about where lanes run — not just a path fix.
|
||||
|
||||
---
|
||||
|
||||
@ -104,6 +126,9 @@ shades/
|
||||
├── main.js # boot + game loop + phase machine (A)
|
||||
├── world.js # terrain, yard, props, lighting, sky (A)
|
||||
├── camera.js # third-person rig (A)
|
||||
├── testkit.js # assert/fixedLoop harness (A)
|
||||
├── tests/<lane>.test.js # ONE PER LANE — you own yours, nobody
|
||||
│ # edits selftest.html (it just imports these)
|
||||
├── sail.js # cloth sim, anchors, hardware, loads (B)
|
||||
├── rigging.js # prep-phase UI + hardware economy (B)
|
||||
├── weather.js # wind field, storm timeline, rain (C)
|
||||
@ -161,8 +186,8 @@ Determinism rule: `sail.js`, `weather.js`, `debris.js` take `(dt, t)` — no
|
||||
`--selfcheck` flag runs a headless node-free check by printing the selftest
|
||||
URL; keep it dumb), launch.json, contracts.js, and a walkable graybox yard:
|
||||
30×20 m ground with gentle height variation, house shell along north edge
|
||||
(use `street-furniture/building_shell_01.glb` scaled, or graybox), 2 placeholder
|
||||
trees, 2 posts, garden bed rect, boundary fence graybox. Third-person follow
|
||||
(graybox — `building_shell_01.glb` does not exist on this box, see §2),
|
||||
2 placeholder trees, 2 posts, garden bed rect, boundary fence graybox. Third-person follow
|
||||
camera (orbit on RMB, shoulder-follow default). Directional sun + hemisphere
|
||||
light, calm sky. **Merge to main fast — everyone rebases on this.**
|
||||
2. HUD after M0: wind meter + arrow, corner load bars (world-anchored sprites),
|
||||
@ -224,10 +249,12 @@ through house; selftest green after every merge.
|
||||
|
||||
1. Character: pick a ped from `90sDJsim/web/world/models/peds/` (copy into
|
||||
`models/`, per copies-rule; man_casual_01 or woman — small relative to 4 m
|
||||
posts reads "small person"). Load with DEVMANUAL rig rules. Clips: Walk +
|
||||
Running + Happy Idle from the libraries; retarget/merge via character_kit
|
||||
pipeline. Fetch "Climbing Ladder", "Turning Key/crank", "Digging" via
|
||||
mixamo-fetch wishlist for M3.
|
||||
posts reads "small person"). Load with DEVMANUAL rig rules.
|
||||
⚠️ **Clips are a live problem — read §2 before you start.** `character_kit/`,
|
||||
`mixamo-fetch/`, `FBX/` and `3D=models/animations/` are NOT on this box. The
|
||||
only clips found are `peds/idle.glb` and `peds/walk.glb`. Walking is
|
||||
reachable from those; Running / Falling / Crouch-To-Stand / crank / dig are
|
||||
not sourced yet. Raise it in THREADS.md rather than hunting.
|
||||
2. Controls: WASD relative to camera, walk/run (shift), acceleration + turn
|
||||
smoothing, anim state machine (idle/walk/run + one-shot interact). Gamepad
|
||||
optional. Slope clamp to terrain height.
|
||||
@ -245,8 +272,8 @@ through house; selftest green after every merge.
|
||||
### Lane E — Nature & hardware assets (Blender, scripted; owns tools/blender/, models/)
|
||||
|
||||
The gap lane. House idiom: **scripted Blender builds** (see
|
||||
`~/Documents/3D-STORE/build_booth_room_v23.py` and `racks_to_glb.py` for the
|
||||
export pattern). One `tools/blender/build_yard_assets.py` that regenerates
|
||||
`~/Documents/Destroyulater/3D-STORE/build_booth_room_v23.py` and
|
||||
`racks_to_glb.py` for the export pattern — note the corrected path, §2). One `tools/blender/build_yard_assets.py` that regenerates
|
||||
everything → `clean/` GLBs; commit script + GLBs.
|
||||
|
||||
Deliverables (meters, Y-up, low-poly stylized to match ped fleet, baked or
|
||||
@ -265,8 +292,8 @@ flat colors, <15 k tris each):
|
||||
`turnbuckle.glb` — tiny, but they're the fetish objects of the game; make
|
||||
them read at 1 m distance.
|
||||
8. `models/debris/`: copy + sanity-scale BlueCrate_v2, BlackTub_v2, WhiteTub_v2,
|
||||
WoodenBin_v2 from `3D-STORE/clean_glbs/`; add `tramp_01.glb` (trampoline!)
|
||||
if time.
|
||||
WoodenBin_v2 from `~/Documents/Destroyulater/3D-STORE/clean_glbs/` (verified
|
||||
present, corrected path — §2); add `tramp_01.glb` (trampoline!) if time.
|
||||
9. Grass: NOT geometry — ship a 4-tuft billboard atlas texture; Lane A instances.
|
||||
|
||||
Acceptance: `blender -b -P tools/blender/build_yard_assets.py` regenerates all
|
||||
|
||||
72
THREADS.md
72
THREADS.md
@ -4,3 +4,75 @@ One line per landed feature, contract change, or open question.
|
||||
Format: `[lane letter] YYYY-MM-DD — note`
|
||||
|
||||
[.] 2026-07-16 — repo seeded: DESIGN.md (canon), PLAN3D.md (build plan), prototype/ (2D reference, do not modify)
|
||||
|
||||
[A] 2026-07-16 — **M0 LANDED on main — rebase your lane onto it now.** stdlib `server.py` on :8801
|
||||
(`--selfcheck` verifies the tree + prints URLs), `.claude/launch.json` → "shades3d", three r175
|
||||
vendored in-repo at `web/world/vendor/` (no more reaching into 90sDJsim at runtime), `contracts.js`,
|
||||
graybox 30×20 m yard, third-person camera, selftest harness. `python3 server.py` and it runs.
|
||||
Selftest green: 18 pass / 4 skip (your lanes) in ~90 ms.
|
||||
|
||||
[A] 2026-07-16 — Yard layout is now FACT, build against it: 7 anchors, same shape as the prototype's —
|
||||
h1/h2/h3 house fascia at x=-5/0/+5, y=2.6, z=-9.9 · t1 tree (-9, 3.2, 2) · t2 tree (8, 3.1, -2) ·
|
||||
p1 post (-6.4, 3.9, 7.4) · p2 post (5.3, 3.9, 8) — posts are raked 8° away from yard centre.
|
||||
Garden bed rect {x:1, z:2, w:6, d:4}. North (-Z) is the house edge. Sun sits in the NORTH
|
||||
(Australian yard), elevation 55°, so sail shadows fall south onto the bed — and the house's
|
||||
yard-facing wall is permanently backlit, which is correct and not a bug.
|
||||
|
||||
[A] 2026-07-16 — **CONTRACT ADDITIONS.** PLAN3D §4 didn't cover these and the code needs them. All are in
|
||||
`contracts.js` with JSDoc. Shout here if any of them fight your lane:
|
||||
· `world.heightAt(x,z) -> number` — ground height, closed-form, pure. Lane D clamps the player to
|
||||
it, Lane C bounces debris off it.
|
||||
· `world.gardenBed -> {x,z,w,d}` — the rect you pass to `sailRig.coverageOver()`.
|
||||
· `world.sunDir -> Vector3` — unit vector from the GROUND **toward** the sun. Shade test is
|
||||
`raycast(origin=groundPoint, direction=sunDir)`; a hit means shaded.
|
||||
· `world.solids -> Object3D[]` — obstacles ONLY. **The ground is deliberately not in it** — use
|
||||
`heightAt()`, it's exact and free. Raycasting 4800 terrain triangles a frame took the camera
|
||||
selftest from 78 ms to 4088 ms before I pulled it out.
|
||||
· `player.update(dt,t)` — main.js has to step the player from somewhere.
|
||||
· `camera.yaw -> number` — Lane D, your WASD is relative to this.
|
||||
· `game.on(type, fn)` with type `'phaseChange'` → `{from, to}`. §4 wrote it as
|
||||
`game.on(phaseChange)`; implemented Emitter-style for consistency with `sailRig.events`.
|
||||
· `checkContract(name, obj) -> string[]` — asserts a module matches its contract. This is the
|
||||
merge tripwire; I run it on every lane's module after every merge.
|
||||
|
||||
[A] 2026-07-16 — **CONTRACT CLARIFICATION — Lane B read this one.** `anchor.sway(t)` returns the
|
||||
**ABSOLUTE world position**, not an offset. It is exactly what you pin a cloth corner to:
|
||||
`node.copy(anchor.sway(t))`. (The prototype's `anchorPos()` is the precedent.) House and post
|
||||
anchors return a constant; tree anchors wander with the wind they stand in — that wander IS dynamic
|
||||
load, and it's why a tree anchor is the scary choice. Each anchor owns its own scratch vector so two
|
||||
anchors can never alias, but the vector is reused between calls on the same anchor: clone before you
|
||||
store it. Asserted both ways in `js/tests/a.test.js`.
|
||||
|
||||
[A] 2026-07-16 — selftest.html is **import-only and nobody edits it**. Each lane owns
|
||||
`web/world/js/tests/<letter>.test.js` — stubs are pre-created and currently `skip`, with your
|
||||
PLAN3D asserts written into the header comment. Five lanes sharing one selftest.html would be the
|
||||
single guaranteed merge conflict in this repo. Harness + assert helpers in `js/testkit.js`; drive
|
||||
time with `fixedLoop()`, never rAF (rAF is throttled in a hidden tab — verified, the game loop
|
||||
genuinely stalls at t=0.07 s there, so a rAF-driven selftest would be a lie).
|
||||
|
||||
[A] 2026-07-16 — main.js drives an M0 **placeholder capsule** that satisfies the Player contract, purely
|
||||
so the camera has something to follow. Lane D: when player.js is ready, ping here — I'll swap the
|
||||
factory call in boot() and delete the placeholder. You shouldn't need to touch main.js.
|
||||
|
||||
[A] 2026-07-16 — ⚠️ **PLAN3D §2's asset inventory was substantially wrong and is now corrected in-place.**
|
||||
Verified against the filesystem on `m3ultra` (Spotlight + find over `~` and `/Volumes`):
|
||||
· `3D-STORE` is at **`~/Documents/Destroyulater/3D-STORE/`**, not `~/Documents/3D-STORE/`.
|
||||
`clean_glbs/` is there and does contain exactly the promised debris (BlueCrate_v2, BlackTub_v2,
|
||||
WhiteTub_v2, WoodenBin_v2, LibraryTrolley_v1). `build_booth_room_v23.py` is there too, and also
|
||||
at `~/Documents/3dstore/`. **Lane E: your inputs are real, just relocated.**
|
||||
· **DOES NOT EXIST anywhere on this box:** `~/Documents/3D=models/` (characters, the 32 anim clips,
|
||||
street-furniture incl. `building_shell_01.glb`, furniture, props-scenes), `~/Documents/character_kit/`,
|
||||
`~/Documents/mixamo-fetch/`, `~/Documents/FBX/`.
|
||||
· Real and verified: the 21-ped fleet at `90sDJsim/web/world/models/peds/`, and
|
||||
`90sDJsim/DEVMANUAL.md`.
|
||||
**Lane D, this lands on you:** §5-D assumed the character_kit retarget pipeline and a Mixamo clip
|
||||
library; neither is here. The only clips I found are `peds/idle.glb` and `peds/walk.glb`. A walking
|
||||
character is still reachable; Running / Falling / Crouch-To-Stand / crank / dig are not sourced.
|
||||
Don't spend a day looking — answer is needed from whoever wrote §2.
|
||||
|
||||
[A] 2026-07-16 — ❓ **OPEN QUESTION, needs a human.** PLAN3D §0 says lanes run on "the M1 Ultra
|
||||
(`johnking@100.91.239.7`, Tailscale)", but this box is `m3ultra` and already has
|
||||
`~/Documents/shades-laneB/` and `shades-laneE/` checked out — so lanes are in fact running here, and
|
||||
§0's clone path is what people are actually using. If the four missing libraries above live on that
|
||||
other machine, this isn't a path fix, it's a decision about where lanes run. Flagging rather than
|
||||
guessing.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user