# Product 3D sample asset provenance

Prepared 2026-10-08. **One openly licensed product model** is included: Water Bottle, created by Microsoft (2017), from Khronos glTF Sample Assets. The source metadata dedicates everything to **CC0 1.0 Universal**. Source geometry, textures and derived demo renders have the same provenance.

- [Pinned Khronos model directory](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/edc7c9e67c639d230715049ee31f9a96a6babbbe/Models/WaterBottle)
- [Pinned metadata and licence declaration](https://github.com/KhronosGroup/glTF-Sample-Assets/blob/edc7c9e67c639d230715049ee31f9a96a6babbbe/Models/WaterBottle/metadata.json)
- [CC0 1.0 legal code](https://creativecommons.org/publicdomain/zero/1.0/legalcode)
- Local preserved records: `WaterBottle.metadata.json`, `LICENSE-WaterBottle.md`, `LICENSE-CC0-1.0.txt`.

Suggested visible credit: **“Water Bottle by Microsoft, via Khronos glTF Sample Assets. CC0 1.0.”** This identifies the test asset; the demo does not claim the model is a Honeybloom client product.

| File | Bytes | Purpose |
| --- | ---: | --- |
| `WaterBottle.source.glb` | 8,966,700 | Unmodified upstream source; authoring/archive only, over the phone budget |
| `WaterBottle.glb` | 1,748,612 | Runtime demo; embedded textures resized from 2048² to 1024² |
| `WaterBottle.meshopt.glb` | 1,694,252 | Optional compressed fixture; same texture/material/node content and exact decoded geometry bytes |

The runtime model has **4,510 triangles, 2,549 vertices, one mesh primitive/material, one named node (`WaterBottle`), and four embedded 1024×1024 PNG images**. Those images provide base colour, metallic/roughness plus occlusion, normal, and emissive channels. No external URLs, animation, skinning or morph targets are present. The node rotates by π about Y; source position bounds are approximately x/z ±0.054450 and y ±0.130220. Author hotspot positions against the glTF scene, respecting that authored node transform.

The runtime asset is about **1.67 MiB**; the meshopt variant is about **1.62 MiB**. Byte and triangle limits alone do not establish phone performance. Four decoded RGBA textures use 16 MiB before mipmaps (about 21.33 MiB with a complete mip chain), independent of the much smaller compressed file size. Rendering and device evidence belong in the delivery handoff.

## Reproduce the prepared assets

The original GLB, metadata and README were verified byte for byte against commit `edc7c9e67c639d230715049ee31f9a96a6babbbe`. See `manifest.json` for source and delivered hashes.

The texture authoring tool uses Python 3.12.14, Pillow 12.3.0 and NumPy 2.3.5. On another authoring machine use an isolated Python environment with those versions; no Python dependency is shipped to a browser.

```powershell
python -m pip install Pillow==12.3.0 numpy==2.3.5
python tools/product-3d-asset-prep.py assets/product-3d/WaterBottle.source.glb assets/product-3d/WaterBottle.glb --edge 1024
node tools/product-3d-meshopt.mjs assets/product-3d/WaterBottle.glb assets/product-3d/WaterBottle.meshopt.glb
```

`product-3d-asset-prep.py` keeps geometry, materials and nodes intact. It downscales colour textures in linear light before returning to sRGB, renormalizes the downscaled normal map, and keeps data maps linear. This is an explicit texture-resolution tradeoff; it does not invent a new colour grade. The tool supports uncompressed embedded RGB/RGBA PNGs in this sample profile, not every possible client export. Its receipt is `WaterBottle.preparation.json`.

`product-3d-meshopt.mjs` uses the vendored MIT meshoptimizer 1.3 encoder. Four attribute views and one index view are compressed. The index mode is `INDICES` to preserve exact order; it verifies every decoded geometry view byte for byte before writing. `EXT_meshopt_compression` is required and its omitted fallback buffer is declared according to the extension. Receipt: `WaterBottle.meshopt-preparation.json`. It is a deliberately small fixture authoring tool, not a general-purpose glTF optimizer.

Run the product budget checker on the final file and generate the poster from that same prepared file and the same renderer/camera. Keep the original source for authoring; production pages should reference only the prepared GLB, matching poster and licence/attribution. Do not deploy the 8.55 MiB source asset as the phone default.
