obj2gltf/lib/gltfToGlb.js

62 lines
1.8 KiB
JavaScript
Raw Normal View History

2017-07-19 17:56:24 -04:00
'use strict';
2019-02-05 20:59:09 -05:00
const Cesium = require('cesium');
const getJsonBufferPadded = require('./getJsonBufferPadded');
2017-07-19 17:56:24 -04:00
2019-02-05 20:59:09 -05:00
const defined = Cesium.defined;
2017-07-19 17:56:24 -04:00
module.exports = gltfToGlb;
/**
* Convert a glTF to binary glTF.
*
* The glTF is expected to have a single buffer and all embedded resources stored in bufferViews.
*
* @param {Object} gltf The glTF asset.
* @param {Buffer} binaryBuffer The binary buffer.
* @returns {Buffer} The glb buffer.
2017-07-19 17:56:24 -04:00
*
* @private
*/
function gltfToGlb(gltf, binaryBuffer) {
2019-02-05 20:59:09 -05:00
const buffer = gltf.buffers[0];
if (defined(buffer.uri)) {
2017-07-19 17:56:24 -04:00
binaryBuffer = Buffer.alloc(0);
}
// Create padded binary scene string
2019-02-05 20:59:09 -05:00
const jsonBuffer = getJsonBufferPadded(gltf);
2017-07-19 17:56:24 -04:00
// Allocate buffer (Global header) + (JSON chunk header) + (JSON chunk) + (Binary chunk header) + (Binary chunk)
2019-02-05 20:59:09 -05:00
const glbLength = 12 + 8 + jsonBuffer.length + 8 + binaryBuffer.length;
const glb = Buffer.alloc(glbLength);
2017-07-19 17:56:24 -04:00
// Write binary glTF header (magic, version, length)
2019-02-05 20:59:09 -05:00
let byteOffset = 0;
2017-07-19 17:56:24 -04:00
glb.writeUInt32LE(0x46546C67, byteOffset);
byteOffset += 4;
glb.writeUInt32LE(2, byteOffset);
byteOffset += 4;
glb.writeUInt32LE(glbLength, byteOffset);
byteOffset += 4;
// Write JSON Chunk header (length, type)
glb.writeUInt32LE(jsonBuffer.length, byteOffset);
byteOffset += 4;
glb.writeUInt32LE(0x4E4F534A, byteOffset); // JSON
byteOffset += 4;
// Write JSON Chunk
jsonBuffer.copy(glb, byteOffset);
byteOffset += jsonBuffer.length;
// Write Binary Chunk header (length, type)
glb.writeUInt32LE(binaryBuffer.length, byteOffset);
byteOffset += 4;
glb.writeUInt32LE(0x004E4942, byteOffset); // BIN
byteOffset += 4;
// Write Binary Chunk
binaryBuffer.copy(glb, byteOffset);
return glb;
}