tree: eb709aec387983c4ebf8a611087e8fd91452ed38
  1. gen_sample.py
  2. index.html
  3. loader.c
  4. main.js
  5. Makefile
  6. README.md
  7. style.css
web/README.md

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.

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

$ 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:

FunctionDescription
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