| # tinygltf v3 C — Web/WASM demo (three.js) |
| |
| A minimal single-page demo that parses glTF/GLB in the browser using the |
| tinygltf v3 C runtime compiled to WebAssembly, then renders the result with |
| [three.js](https://threejs.org). |
| |
| ``` |
| web/ |
| loader.c — C bridge: parse bytes, flatten primitives/materials/textures/nodes for JS |
| index.html — demo page (file picker + drag & drop) |
| main.js — three.js viewer consuming the WASM exports |
| style.css |
| Makefile — Emscripten build |
| gen_sample.py — generates Cube.glb (small self-contained textured cube) |
| Cube.glb — sample model, generated with `make sample` |
| ``` |
| |
| ## Requirements |
| |
| * An Emscripten SDK. The Makefile defaults to `~/work/emsdk` |
| (override with `make EMSDK=/path/to/emsdk`). |
| |
| ## Build |
| |
| ```bash |
| $ cd web |
| $ make # produces tinygltf_v3.js + tinygltf_v3.wasm |
| $ make sample # generate Cube.glb (self-contained textured cube) |
| $ make serve # python3 -m http.server 8000 |
| ``` |
| |
| Then open http://localhost:8000 and drop a `.glb` / `.gltf` file onto the |
| page, or click **Load sample**. |
| |
| ## Notes |
| |
| * Assets must be **self-contained**: GLB binary chunk or embedded data-URI |
| buffers/images. External `.bin` / image file references are not resolved |
| (no filesystem is linked into the module: `-sFILESYSTEM=0`). |
| * Primitives must use `float` `VEC3` positions (the common case); sparse |
| accessors and `double` attributes are skipped with a warning message. |
| * Image decoding happens client-side: raw image bytes are passed to |
| `createImageBitmap()` and wrapped in a `THREE.CanvasTexture`. |
| |
| ## C exports (loader.c) |
| |
| All functions are exported as `_tg3w_*` on the Emscripten module: |
| |
| | Function | Description | |
| | --- | --- | |
| | `tg3w_parse(ptr, size)` | Parse GLB/glTF bytes (auto-detect), flatten model | |
| | `tg3w_clear()` | Free the current model and flattened buffers | |
| | `tg3w_last_error()` / `tg3w_error_message(i)` / `tg3w_error_count()` | Parse diagnostics | |
| | `tg3w_prim(i)` | Primitive record (material, mode, counts, buffer offsets; `nrm_offset`/`uv_offset` are -1 when absent) | |
| | `tg3w_positions()/normals()/uvs()/indices()` | Flattened vertex/index arrays | |
| | `tg3w_mesh_prim_start/count(m)` | Primitive range of a mesh | |
| | `tg3w_material_*` | PBR factors, alpha mode, base color texture | |
| | `tg3w_texture_source(i)`, `tg3w_image_bytes/size/mime(i)` | Texture image bytes | |
| | `tg3w_node_*`, `tg3w_scene_*`, `tg3w_default_scene()` | Scene graph | |