Commit Graph

9 Commits

Author SHA1 Message Date
type-two
d46025e887 fix(virtual): cyclorama extent for east/west coves + never frustum-cull the cove
east/west coves run only the cyclorama section (extent from the north wall) instead
of the full L-shaped depth; big static swept surface gets frustumCulled=false.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 23:07:28 +10:00
type-two
5551963ef4 feat(3d): procedural cyclorama / infinity cove (new — not in WowPlatter)
The hip-hop room's north section is a real cyclorama (white curved infinity wall). Added a data-driven cove:
virtual_space gains cyclorama (comma list of north/south/east/west) + cyclorama_radius + cyclorama_color.
buildCyclorama() sweeps a profile per wall — [flat wall down to R] → [quarter-circle fillet radius R] →
[white floor lead-in] — so the floor curves up into the wall with no hard seam (the seamless studio look).
Cyclorama walls skip their flat wall (the cove replaces it). Set on hiphop-room (space 3): cyclorama=north,
R=0.9. v1 = single-wall cove (back curve); 3-sided + rounded vertical corners + partial-wall extent for the
L-shape = next iteration, all tunable via the columns.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 12:47:11 +10:00
type-two
205967d506 feat(3d): crate-type + rack logo decals on object faces; verified bin slope
Backend (virtual.py) now also returns object_decals: crate_type decals (apply to every crate of that
type) + rack/crate decals for this space (was space-only). Frontend: makeDecalMesh() shared by wall/
crate/rack decals; snapToFace() ports WowPlatter snapToCrate/RackFaceAndOrient (preferred_face + face_offset
→ front/back/left/right/top/bottom, eps proud of the face, yaw outward, right-face mirror, rack east/west
readability flip). buildCrate(t,front,typeDecals) stamps crate_type logos on the front; rack loop stamps
rack decals using the rack yaw. Booth now shows 5 crate-type + 4 rack logos. SLOPE CONFIRMED CORRECT: the
custom column is front_height (back=height, front=front_height); slopedSide already builds the trapezoid
right (top edge slopes back→front). Space-decal loop refactored onto makeDecalMesh (DRY).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 12:33:30 +10:00
type-two
44517d4930 fix(3d): decals snap to their preferred_wall (ported WowPlatter snapToWallAndOrient)
The store renderer placed every decal at raw pos_x/y/z with raw rotation, ignoring preferred_wall/snap/
object_type — so wall art (pos with one in-plane axis, perpendicular=0, rotation 0) floated in mid-room on
the wrong axis. Ported WowPlatter public/js/virtual/decals.js snapToWallAndOrient: a space decal (rotation
all-zero or snap=wall) keeps its in-plane axis, the perpendicular axis is pushed flat to its named wall
(north z=-D/2 yaw0 · south z=D/2 yawpi · east x=W/2 yaw-pi/2 · west x=-W/2 yaw+pi/2 · floor/ceiling lie
flat), yawed to face into the room; non-zero rotation = free manual placement, respected. Wall conventions
already matched the room's walls. Fixes booth (31 decals) + entry-hall (6) automatically. Verified the snap
math against real data (all land on-axis, in-bounds, facing in). Still TODO: crate_type(5)/rack(4) logo
decals (backend only fetches object_type=space; need the face-snap port) + hiphop room has no decals authored.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 12:23:18 +10:00
type-two
0767778931 fix(store): WowPlatter coordinate convention in webstore renderer
- racks/portals/camera corner-relative (worldX = -W/2 + x); attach_wall snap + clamp
- crates parent to their rack_level (slot-grid or local pos offset), facing composed on rack
- free crates / decals / lights stay centered
- fixes the corner pile-up; booth-room overhead render verified

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 19:57:17 +10:00
type-two
19e3cb131f feat: clean stub URLs (/builder /shop /admin /dash) + store geometry + storefront 2026-06-21 23:16:57 +10:00
type-two
8c25b65d7e feat(virtual): finish the 3D store port — per-room scoping, decals, portals
Scene was dumping all 3 rooms' racks/crates/lights into one room, and the
served decals + portals were never rendered (trapped in booth-room).

- /virtual/scene scopes to ONE room (?space=, default = is_default space);
  filters racks/crates/lights/cameras/portals/decals/covers by space_id
- render decals (image + canvas-text planes) and portal doorways; walk into
  a portal -> loads the linked room
- portal links_to_id is the PAIRED portal's id, not a space — resolve through
  it to the destination room (to_space)
- copy the 29 referenced decal webp/svg into webstore/assets (self-contained,
  served /store/assets); rewrite WP /wp-content/uploads/ paths in the scene API
- skip the 17MB logo .glb mesh decal (flat logo-blue.webp covers branding)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 21:00:02 +10:00
3e3b08dc90 feat(virtual): spring-physics crate digging — riffle, hinge-flip, pull-to-inspect
dig.js: enter a crate → records stand packed in a bin; scroll/drag riffles a damped
cursor through them; each sleeve hinges forward at its bottom edge as you pass (smoothstep
wave); tap the front sleeve to pull it out and inspect (price/condition/add-to-cart panel).
Depth-LOD cover loading (±8 around cursor). Procedural fwip/thunk audio, no asset files.
Wired into index.html: click crate → dig scene; render loop branches on dig.active.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 18:35:56 +10:00
8b48010b50 feat(virtual): lift the 3D store out of WordPress — scene API + raw Three.js renderer
- migrate_virtual.py: all 15 wp_rmp_disc_virtual_* tables → Postgres (~700 rows).
- app/virtual.py (public): GET /virtual/scene (geometry + slim front covers enriched
  from discogs_full), /virtual/crate/{id}/records (digging), /virtual/locate (locate-stock).
  Replaces payload.php — no WordPress bootstrap.
- webstore/index.html: walkable raw Three.js store (room/racks/crates from the data,
  pointer-lock FPS, click-to-dig hook), served same-origin at /store.
- Proven: 51 racks, 346 crates, 277 covers; locate release→crate works.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 17:59:52 +10:00