# Curated interior models

These are repackaged upstream assets, with their original mesh geometry and
physically based materials. Attribution was checked against the upstream asset
pages and Poly Haven's `/info/{asset}` API on 29 September 2026.

| Local model | Original asset | Author | License |
| --- | --- | --- | --- |
| `chair.glb` | [Modern Arm Chair 01](https://polyhaven.com/a/modern_arm_chair_01) | Vibrant Nordic | CC0 1.0 |
| `coffee-table.glb` | [Modern Coffee Table 01](https://polyhaven.com/a/modern_coffee_table_01) | Amin | CC0 1.0 |
| `cabinet.glb` | [Modern Wooden Cabinet](https://polyhaven.com/a/modern_wooden_cabinet) | Patrik Pangerl | CC0 1.0 |
| `plant.glb` | [Potted Plant 04](https://polyhaven.com/a/potted_plant_04) | James Ray Cock | CC0 1.0 |
| `side-table.glb` | [Side Table 01](https://polyhaven.com/a/side_table_01) | James Ray Cock | CC0 1.0 |
| `vase.glb` | [Ceramic Vase 03](https://polyhaven.com/a/ceramic_vase_03) | James Ray Cock | CC0 1.0 |
| `wooden-table.glb` | [Wooden Table 02](https://polyhaven.com/a/wooden_table_02) | Serhii Khromov | CC0 1.0 |
| `sofa.glb` | [GlamVelvetSofa](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/GlamVelvetSofa) | Eric Chadwick; © 2021 Wayfair, LLC | CC BY 4.0 |

The Poly Haven models use the site's 1K glTF downloads and are covered by
[Poly Haven's CC0 license](https://polyhaven.com/license)
([CC0 1.0 legal text](https://creativecommons.org/publicdomain/zero/1.0/legalcode)).
Their source URLs and checked input hashes are retained in
[`source-files.json`](source-files.json). The downloaded files matched all 38
upstream MD5 checksums before repackaging.

## Sofa attribution and source

GlamVelvetSofa, by Eric Chadwick, © 2021 Wayfair, LLC, is licensed under
[Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/)
([legal text](https://creativecommons.org/licenses/by/4.0/legalcode)).
The original attribution wording is retained in
[`GlamVelvetSofa-NOTICE.md`](GlamVelvetSofa-NOTICE.md).
This sofa is a Wayfair model distributed by Khronos; it is not Poly Haven's
Sofa 03. The separately bundled, unused `../sofa_03/` asset has its own notice.

The original GLB is pinned to Khronos glTF Sample Assets commit
[`5bad5aaa0bbb5d0f9cdc934e626f27d0df1e79b8`](https://github.com/KhronosGroup/glTF-Sample-Assets/commit/5bad5aaa0bbb5d0f9cdc934e626f27d0df1e79b8):

- [Exact upstream GLB](https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/5bad5aaa0bbb5d0f9cdc934e626f27d0df1e79b8/Models/GlamVelvetSofa/glTF-Binary/GlamVelvetSofa.glb)
- Input length: 3,149,844 bytes.
- Input SHA-256: `67202c74a1a33377771f162dc7fad612a6c9bd51ee15124c488e9851d9ac5266`.

The pinned download was compared byte for byte with the packaging input.

## Changes made for EmbodiAtlas

1. Repacked each source model into a self-contained GLB. Geometry, UVs, source
   node transforms and material parameters are preserved.
2. Resized embedded texture images proportionally to a maximum of 512 × 512
   pixels with Pillow's LANCZOS resampling. Encoded them as WebP using quality
   88 and method 6, retaining RGB or RGBA channels. Texture compression and
   downsampling are lossy; the original normal, roughness, metalness and color
   map assignments remain attached to their materials.
3. Declared `EXT_texture_webp` as required, replaced image buffer views, and
   combined the source buffers into a single GLB buffer with four-byte
   alignment. No external textures are needed for these models.
4. For the sofa only, selected the authored **Gray** material variant (variant
   index 2), removed variant switching, and removed its punctual light
   references and extension declarations. The room supplies its lighting.
   Its original copyright field, fabric sheen and specular material settings
   remain in the derivative.
5. Created `.glb.gz` transfer copies using Python's
   `gzip.compress(glb_bytes, mtime=0)` (default compression level 9). Gzip is
   lossless relative to each repackaged GLB.

[`provenance.json`](provenance.json) records the output SHA-256, geometry counts,
GLB lengths and gzip lengths. [`source-files.json`](source-files.json) records
the corresponding input URLs and hashes so that upstream changes can be
detected before rebuilding. Output bytes can vary across Pillow/libwebp and
zlib versions; compare the resulting geometry, materials and decoded textures
as well as hashes when rebuilding with a different toolchain.

At runtime, `interior-assets.js` caches downloads, preserves model proportions,
and positions repeated instances. It adds shadow flags and texture anisotropy;
these are scene settings rather than changes to the packaged files.

The browser fetches `.gz` files and decompresses them with `DecompressionStream`,
with the matching `.glb` as fallback. Serve the `.gz` path as file bytes; do not
also send `Content-Encoding: gzip`, which would cause double decompression.

The matching wood floor uses a separate
[`Laminate Floor 02 source record`](../surfaces/SOURCE.md).
