DOCS v0.1.13 github

@hatch:gltf v0.1.1

Pure-Wren glTF 2.0 / .glb loader. Parses the binary container into nodes / meshes / materials, resolves accessors into typed vertex + index arrays (Float32Array / Int32Array / ByteArray), decodes embedded images via @hatch:image, and spawns a Transform-rooted hierarchy into a @hatch:ecs World with fully-textured PBR Materials wired to every glTF slot (baseColor / metallicRoughness / normal / occlusion / emissive).

stable data updated Jun 4, 2026 source ↗
$ hatch add @hatch:gltf

MOD gltf

CL Gltf

FN Gltf.static parse(bytes: ByteArray|List<Num>) → GltfScene

FN Gltf.static load(device: Device, bytes: ByteArray|List<Num>) → GltfScene

FN Gltf.static fromAsset(device: Device, asset: Asset) → GltfScene

FN Gltf.static fromAssets(device: Device, db: Assets, relPath: String) → GltfScene

FN Gltf.static fromAssetsDir(device: Device, db: Assets, gltfPath: String) → GltfScene

FN Gltf.static openDir(db, gltfPath) → Map

FN Gltf.static loadBuffer(state, db, idx)

FN Gltf.static loadImage(state, db, idx)

FN Gltf.static assemble(state)

FN Gltf.static uploadImageAt(state, device, idx)

FN Gltf.static beginImageDecodeAt(state, idx)

FN Gltf.static finishImageUploadAt(state, device, idx, handle)

FN Gltf.static uploadDecodedImageAt(state, device, idx, image)

FN Gltf.static uploadMeshAt(state, device, idx)

FN Gltf.static finishUpload(state)

CL Bytes_

FN Bytes_.static u32LE(b, o)

FN Bytes_.static u16LE(b, o)

FN Bytes_.static f32LE(b, o)

FN Bytes_.static asciiString(b, off, len)

CL GltfScene

NEW GltfScene.new_(json: Map, buffers: List<ByteArray>, externalImageBytes: List<ByteArray|null>)

GET GltfScene.json

GET GltfScene.binBuffer

GET GltfScene.buffers

GET GltfScene.materials

GET GltfScene.meshes

GET GltfScene.nodes

GET GltfScene.rootIndices

GET GltfScene.animations

GET GltfScene.imageTextures

GET GltfScene.skins

GET GltfScene.nodeEntityMap

FN GltfScene.static parse_(bytes)

FN GltfScene.static fromJson_(json, buffers, externalImageBytes)

FN GltfScene.static dirname_(path)

FN GltfScene.static joinPath_(dir, uri)

FN GltfScene.static stripPad_(s)

FN GltfScene.static stripPadBytes_(b)

FN GltfScene.static textureToImageMap_(json)

FN GltfScene.static imageIndexOf_(json, t2i, slot)

FN GltfScene.static buildMaterials_(json)

FN GltfScene.static buildImageSources_(json, materials, externalImageBytes)

FN GltfScene.static buildMeshes_(json, buffers)

FN GltfScene.static extractPrimitive_(json, buffers, p)

FN GltfScene.static buildNodes_(json)

FN GltfScene.static pickRootIndices_(json)

FN GltfScene.static buildAnimations_(json, buffers)

FN GltfScene.static accessorAt_(json, idx)

FN GltfScene.static bufferViewAt_(json, idx)

FN GltfScene.static binFromBufferView_(buffers, bv)

FN GltfScene.static readVec3Accessor_(json, buffers, idx)

FN GltfScene.static readVec2Accessor_(json, buffers, idx)

FN GltfScene.static readFloatAccessor_(json, buffers, idx, components, expectedType)

FN GltfScene.static readIndexAccessor_(json, buffers, idx)

FN GltfScene.static readU16x4Accessor_(json, buffers, idx)

FN GltfScene.static readMat4Accessor_(json, buffers, idx)

FN GltfScene.static buildSkins_(json, buffers)

FN GltfScene.upload(device)

FN GltfScene.uploadImages_(device)

FN GltfScene.uploadImageAt_(device, idx)

FN GltfScene.sourceBytesAt_(idx)

FN GltfScene.beginImageDecodeAt_(idx)

FN GltfScene.finishImageUploadAt_(device, idx, handle)

FN GltfScene.uploadDecodedImageAt_(device, idx, image)

FN GltfScene.uploadMeshAt_(device, idx)

FN GltfScene.dropUploadSources_()

FN GltfScene.spawnInto(world)

FN GltfScene.spawnNode_(world, idx, parentEntity, spawned)

FN GltfScene.attachMesh_(world, parentEntity, gltfMesh)

CL GltfNode

NEW GltfNode.new_(name: String, transform: Transform, meshIndex: Num|Null, children: List<Num>)

GET GltfNode.name

GET GltfNode.transform

GET GltfNode.meshIndex

GET GltfNode.children

GET GltfNode.skinIndex → Num|Null

SET GltfNode.skinIndex=(v)

GET GltfNode.toString

CL GltfSkin

NEW GltfSkin.new_(name: String, joints: List<Num>, inverseBindMatrices: Float32Array, skeletonRoot: Num|Null)

GET GltfSkin.name

GET GltfSkin.joints

GET GltfSkin.inverseBindMatrices

GET GltfSkin.skeletonRoot

GET GltfSkin.jointCount

GET GltfSkin.toString

CL GltfAnimation

NEW GltfAnimation.new_(name, duration, channels)

GET GltfAnimation.name

GET GltfAnimation.duration → Num

GET GltfAnimation.channels

FN GltfAnimation.applyTo(scene: GltfScene, world: World, t: Num)

FN GltfAnimation.crossfade(other: GltfAnimation, scene: GltfScene, world: World, tSelf: Num, tOther: Num, blend: Num)

FN GltfAnimation.writeSample_(transform, path, v)

FN GltfAnimation.writeBlended_(transform, path, a, b, t)

CL GltfAnimChannel

NEW GltfAnimChannel.new_(nodeIndex, path, inputs, outputs, components, interpolation)

GET GltfAnimChannel.nodeIndex

GET GltfAnimChannel.path

GET GltfAnimChannel.interpolation

FN GltfAnimChannel.sample(t: Num) → List<Num>

FN GltfAnimChannel.static outputAt_(outputs, keyframeIdx, components)

CL GltfMesh

NEW GltfMesh.new_(name: String, primitives: List<GltfPrimitive>)

GET GltfMesh.name

GET GltfMesh.primitives

FN GltfMesh.upload_(device, materials, textures)

CL GltfPrimitive

NEW GltfPrimitive.new_(positions: Float32Array, normals: Float32Array|Null, uvs: Float32Array|Null, tangents, indices: Int32Array|Null, materialIndex: Num|Null)

GET GltfPrimitive.positions

GET GltfPrimitive.normals

GET GltfPrimitive.uvs

GET GltfPrimitive.tangents

GET GltfPrimitive.indices

GET GltfPrimitive.joints

SET GltfPrimitive.joints_=(v)

GET GltfPrimitive.weights

SET GltfPrimitive.weights_=(v)

GET GltfPrimitive.materialIndex

GET GltfPrimitive.mesh

GET GltfPrimitive.material

FN GltfPrimitive.upload_(device, materials, textures)

FN GltfPrimitive.pickMaterial_(materials, textures)

FN GltfPrimitive.defaultMaterial_()

CL GltfMaterial

NEW GltfMaterial.new_(name: String, baseColor: Vec4, metallic: Num, roughness: Num, albedoImageIndex: Num|Null, mrImageIndex: Num|Null, normalImageIndex: Num|Null, normalScale: Num, occlusionImageIndex: Num|Null, occlusionStrength: Num, emissiveImageIndex: Num|Null, emissiveColor: Vec4, alphaMode: String, alphaCutoff: Num, doubleSided: Bool)

GET GltfMaterial.name

GET GltfMaterial.baseColor

GET GltfMaterial.metallic

GET GltfMaterial.roughness

GET GltfMaterial.albedoImageIndex

GET GltfMaterial.mrImageIndex

GET GltfMaterial.normalImageIndex

GET GltfMaterial.normalScale

GET GltfMaterial.occlusionImageIndex

GET GltfMaterial.occlusionStrength

GET GltfMaterial.emissiveImageIndex

GET GltfMaterial.emissiveColor

GET GltfMaterial.alphaMode

GET GltfMaterial.alphaCutoff

GET GltfMaterial.doubleSided

FN GltfMaterial.toGpuMaterial(textures: List<Texture|Null>) → Material