UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

54 lines 4.67 kB
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 = []; const chunkTypes = []; 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; chunkTypes.push({ type: "JSON", size: chunkData.byteLength }); } 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); chunkTypes.push({ type: "BIN", size: chunkData.byteLength }); } else { throw new Error(`We got an invalid chunk type: 0x${chunkType .toString(16) .padStart(8, "0")}!`); } } return { gltf, chunks, chunkTypes }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhcnNlci9nbHRmL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFFckU7O0dBRUc7QUFFSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQWlCO0lBS3RDLE1BQU0sSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQy9CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzNDLElBQUksV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDdkMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDWCwwREFBMEQsT0FBTyxHQUFHLENBQ3ZFLENBQUE7SUFDTCxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDdEMsSUFBSSxJQUFJLEdBQUcsRUFBbUIsQ0FBQTtJQUM5QixNQUFNLE1BQU0sR0FBa0IsRUFBRSxDQUFBO0lBQ2hDLE1BQU0sVUFBVSxHQUFrRCxFQUFFLENBQUE7SUFDcEUsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBQ2YsT0FBTyxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDckIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDaEQsTUFBTSxJQUFJLENBQUMsQ0FBQTtRQUNYLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzlDLE1BQU0sSUFBSSxDQUFDLENBQUE7UUFDWCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUE7UUFDMUQsTUFBTSxJQUFJLFdBQVcsQ0FBQTtRQUNyQixJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMzQix5QkFBeUI7WUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDaEQsSUFBSSxDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3hDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUMzQixJQUFJLEdBQUcsTUFBTSxDQUFBO2dCQUNiLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtZQUNqRSxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7WUFDdEQsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3RCLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNoRSxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxLQUFLLENBQ1gsbUNBQW1DLFNBQVM7aUJBQ3ZDLFFBQVEsQ0FBQyxFQUFFLENBQUM7aUJBQ1osUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUMzQixDQUFBO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQTtBQUN2QyxDQUFDIn0=