# Books reading room

Original Can You Name architecture and furniture, authored in Blender with
human-scale construction and materials. Decorative bindings carry no titles or
authors; identifiable volumes come only from the player's accepted answers.

## Current immutable artwork: v4

`v4/room.glb` contains 161,076 triangles and 12 materials. The chairs have
continuous rear legs and raked back stiles, joined seat rails, turned front
legs and arm supports, shaped padded arms, crowned cushions and sewn welts.
Arm rails seat into wooden shoulders. Seat height is 0.465 metres; the writing
table is 0.756 metres high. Grain follows the timber members and turned legs.
The wood and leather finishes retain broad highlights that describe their shape.

The garden photograph sits 4.89 metres beyond twelve individual panes, with
its original colour and detail. Its image bytes are unchanged. The earlier
extra blur, desaturation and haze are removed.

`v4/glass-reflection.webp` is an owned 1024 × 512 panorama rendered from inside
the window. It contains the library and a capture-only luminous surface for
the existing broad room-fill light. Thin glass blends this reflection using an
angle-dependent Fresnel response; it adds no continuous reflection or refraction
render pass. The probe depicts static architecture and lighting, so accepted
books do not appear in its reflection. The embedded glazing remains if the
reflection image fails to load. Late reflection loads release their texture
without reviving a disposed room.

Sunlight passes through the opening and casts frame, plant and book shadows
onto the desk in Rich quality. Reduced quality retains the clipped tabletop
light patch. Contact shading is baked into vertex colours; normal maps and
lighting remain active in Three.js.

The GLB is 7,349,664 bytes, SHA-256
`9330852be21be69f19a7a04f9124457ba018dfca6ba692b648296b2c6b304082`.
The reflection is 30,426 bytes, SHA-256
`203b14c4cdc399034c915ea93c3da54c9d416c8bfd190beb5d757999870b58e4`.
Standard quantized attributes preserve 16-bit positions/colours and 12-bit
normals. Meshopt uses Three.js's existing locally bundled decoder. The decoded
glTF passes Khronos Validator with zero errors and warnings; its one
informational notice concerns the original 1200 × 794 photograph's dimensions,
supported by WebGL2. The combined model and reflection limit is 7,500 KiB,
with 200,000 triangles and 12 materials.

`v4/preview.webp` is the browser-rendered empty room behind the accessible
no-WebGL collection (88,848 bytes). The owned primitive room still appears before the GLB
loads and remains usable on loading or decoding failure. WebGL failure retains
the accessible collection and game controls.

Previous immutable versions remain available: v2 is pinned by `b7970d6`, and
v3 by `352b059`. The original procedural room is pinned by `428cab9`.

Chair construction was studied against the visible frame and arm supports in
[this antique library-chair reference](https://www.rafaelosonaauction.com/antiques/2019/americana-fine-art-marine-2019/english-carved-mahogany-leather-upholstered-library-arm-chair/).
The reference photograph is not bundled; the geometry is authored here.

## Third-party materials and photography

All source assets below are provided by Poly Haven under
[CC0](https://polyhaven.com/license), with no attribution requirement; creators
are credited here and on `/credits`.

- [Wood Table 001](https://polyhaven.com/a/wood_table_001): Dimitrios Savva
  (photography), Rico Cilliers (processing). Embedded 1K colour and OpenGL normal
  maps. UV grain follows timber members; normal strength is reduced and the
  finish uses constant roughness.
- [Leather White](https://polyhaven.com/a/leather_white): Rob Tuytel. Embedded 1K
  OpenGL normal map, tinted for the writing surface, upholstery and bindings.
- [Autumn Park](https://polyhaven.com/a/autumn_park): Sergej Majboroda.
  `DSC_0088.jpg` backplate, 1200-pixel Poly Haven preview, mapped behind the
  recessed window. It is environmental photography, independent of answers.

Every build input has an exact URL and SHA-256 in
`scripts/artwork/books-reading-room-sources.json`. Timber and leather use restrained
fixed roughness values. There are no runtime Poly Haven calls,
external texture references, paid services or generated catalog content. The
existing Open Library cover policy and provider switch are unchanged.

## Rebuild and inspect

Use the sibling `blender-kit` after reading its agent and handoff instructions.
Run Blender in a separate background process; the build owns only its named
`Books_Reading_Room_v4` scene. It never changes a live Blender session.

1. Run `python3 scripts/artwork/fetch-books-reading-room-materials.py`.
2. Run Blender with `--background --factory-startup --python` and the absolute
   path to `scripts/artwork/build-books-reading-room.py`. With Windows Blender
   from WSL, convert that script path using `wslpath -w`.
3. Install build-only tools under ignored `tmp/`:
   `npm install --prefix tmp/books-reading-room/tools --no-audit --no-fund @gltf-transform/core@4.5.0 @gltf-transform/functions@4.5.0 @gltf-transform/extensions@4.5.0 meshoptimizer@1.2.0 gltf-validator@2.0.0-dev.3.10`.
4. Run `node scripts/artwork/pack-books-reading-room.mjs` from the repository
   root. It validates the decoded geometry and enforces the delivery budget
   before writing the versioned public assets. It also converts the owned
   reflection render to WebP.
5. Inspect `tmp/books-reading-room/blender-v4.png`, the saved `.blend`, and the
   actual browser scene in both room and close views before activation.

`scripts/artwork/styles/books-reading-room.toml` holds the look and limits;
`src/lib/reading-room-layout.json` shares construction dimensions with physics.
Build reports and raw export stay in ignored `tmp/`. Bump the version before
replacing any shipped asset. The renderer's explicit versioned path is the
activation boundary; source fetching and authoring never activate an asset.
