From 868ea5699d86dd2f14f8ecc0f209a9e498c5419a Mon Sep 17 00:00:00 2001 From: m3ultra Date: Thu, 16 Jul 2026 21:33:42 +1000 Subject: [PATCH] Correct PLAN3D asset inventory; log M0 contract additions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §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 --- PLAN3D.md | 73 +++++++++++++++++++++++++++++++++++++----------------- THREADS.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 23 deletions(-) diff --git a/PLAN3D.md b/PLAN3D.md index 688c66f..43724cd 100644 --- a/PLAN3D.md +++ b/PLAN3D.md @@ -18,10 +18,11 @@ canon; this file is the build canon.** then work on branch `lane/`. 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/.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 diff --git a/THREADS.md b/THREADS.md index b61f11b..423cadf 100644 --- a/THREADS.md +++ b/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/.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.