2017-07-19 17:56:24 -04:00
|
|
|
'use strict';
|
|
|
|
var Cesium = require('cesium');
|
|
|
|
var getJsonBufferPadded = require('./getJsonBufferPadded');
|
|
|
|
|
|
|
|
var isDataUri = Cesium.isDataUri;
|
|
|
|
|
|
|
|
module.exports = gltfToGlb;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert a glTF to binary glTF.
|
|
|
|
*
|
2017-07-27 11:23:12 -04:00
|
|
|
* The glTF is expected to have all resources embedded as bufferViews and a single buffer whose content is stored in a data uri.
|
|
|
|
*
|
2017-07-19 17:56:24 -04:00
|
|
|
* @param {Object} gltf A javascript object containing a glTF asset.
|
|
|
|
* @returns {Promise} A promise that resolves to a buffer containing the binary glTF.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
function gltfToGlb(gltf) {
|
|
|
|
var buffer = gltf.buffers[0];
|
|
|
|
var binaryBuffer;
|
|
|
|
if (isDataUri(buffer.uri)) {
|
|
|
|
binaryBuffer = dataUriToBuffer(buffer.uri);
|
|
|
|
delete buffer.uri;
|
|
|
|
} else {
|
|
|
|
binaryBuffer = Buffer.alloc(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create padded binary scene string
|
|
|
|
var jsonBuffer = getJsonBufferPadded(gltf);
|
|
|
|
|
|
|
|
// Allocate buffer (Global header) + (JSON chunk header) + (JSON chunk) + (Binary chunk header) + (Binary chunk)
|
|
|
|
var glbLength = 12 + 8 + jsonBuffer.length + 8 + binaryBuffer.length;
|
|
|
|
var glb = Buffer.alloc(glbLength);
|
|
|
|
|
|
|
|
// Write binary glTF header (magic, version, length)
|
|
|
|
var byteOffset = 0;
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
function dataUriToBuffer(dataUri) {
|
|
|
|
var data = dataUri.slice(dataUri.indexOf(','));
|
|
|
|
return Buffer.from(data, 'base64');
|
|
|
|
}
|