@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
51 lines • 4.18 kB
JavaScript
import { assertTgdFormatGltf } from "../../types/gltf.js";
/**
* @see https://www.khronos.org/files/gltf20-reference-guide.pdf
*/
export function parseGLB(data) {
const view = new DataView(data);
const magicNumber = view.getUint32(0, true);
if (magicNumber !== 0x46546c67) {
throw new Error("Invalid magic number for GLB file!");
}
const version = view.getUint32(4, true);
if (version !== 2) {
throw new Error(`We support only version 2, but this file is in version ${version}!`);
}
const length = view.getUint32(8, true);
let gltf = {};
const chunks = [];
let offset = 12;
while (offset < length) {
const chunkLength = view.getUint32(offset, true);
offset += 4;
const chunkType = view.getUint32(offset, true);
offset += 4;
const chunkData = data.slice(offset, offset + chunkLength);
offset += chunkLength;
if (chunkType === 0x4e4f534a) {
// This is the JSON part.
const json = new TextDecoder().decode(chunkData);
try {
const object = JSON.parse(json);
assertTgdFormatGltf(object);
gltf = object;
}
catch (error) {
console.error("Unable to parse this JSON file:", json);
console.error(error);
throw new Error("Invalid JSON data in the chunk!");
}
}
else if (chunkType === 0x004e4942) {
chunks.push(chunkData);
}
else {
throw new Error(`We got an invalid chunk type: 0x${chunkType
.toString(16)
.padStart(8, "0")}!`);
}
}
return { gltf, chunks };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhcnNlci9nbHRmL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFckU7O0dBRUc7QUFFSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQWlCO0lBSXRDLE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQy9CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzNDLElBQUksV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDdkMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDWCwwREFBMEQsT0FBTyxHQUFHLENBQ3ZFLENBQUE7SUFDTCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDdEMsSUFBSSxJQUFJLEdBQUcsRUFBbUIsQ0FBQTtJQUM5QixNQUFNLE1BQU0sR0FBa0IsRUFBRSxDQUFBO0lBQ2hDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQTtJQUNmLE9BQU8sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDO1FBQ3JCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ2hELE1BQU0sSUFBSSxDQUFDLENBQUE7UUFDWCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM5QyxNQUFNLElBQUksQ0FBQyxDQUFBO1FBQ1gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFBO1FBQzFELE1BQU0sSUFBSSxXQUFXLENBQUE7UUFDckIsSUFBSSxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDM0IseUJBQXlCO1lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ2hELElBQUksQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBWSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUN4QyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDM0IsSUFBSSxHQUFHLE1BQU0sQ0FBQTtZQUNqQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7WUFDdEQsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxJQUFJLEtBQUssQ0FDWCxtQ0FBbUMsU0FBUztpQkFDdkMsUUFBUSxDQUFDLEVBQUUsQ0FBQztpQkFDWixRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQzNCLENBQUE7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDM0IsQ0FBQyJ9