提交 f5f5a559 编写于 作者: F Fernando Serrano 提交者: Mr.doob

Add padding to glb chunks

上级 cb9f5ca1
...@@ -128,7 +128,18 @@ THREE.GLTFExporter.prototype = { ...@@ -128,7 +128,18 @@ THREE.GLTFExporter.prototype = {
* @param {string} text * @param {string} text
* @return {ArrayBuffer} * @return {ArrayBuffer}
*/ */
function stringToArrayBuffer( text ) { function stringToArrayBuffer( text, padded ) {
if ( padded ) {
var pad = getPaddedBufferSize( text.length ) - text.length;
for ( var i = 0; i < pad; i++ ) {
text += ' ';
}
}
if ( window.TextEncoder !== undefined ) { if ( window.TextEncoder !== undefined ) {
...@@ -194,6 +205,28 @@ THREE.GLTFExporter.prototype = { ...@@ -194,6 +205,28 @@ THREE.GLTFExporter.prototype = {
} }
/**
* Returns a buffer aligned to 4-byte boundary.
*
* @param {ArrayBuffer} arrayBuffer Buffer to pad
* @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer
*/
function getPaddedArrayBuffer( arrayBuffer ) {
var paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );
if (paddedLength !== arrayBuffer.byteLength ) {
var paddedBuffer = new ArrayBuffer( paddedLength );
new Uint8Array( paddedBuffer ).set(new Uint8Array(arrayBuffer));
return paddedBuffer;
}
return arrayBuffer;
}
/** /**
* Process a buffer to append to the default one. * Process a buffer to append to the default one.
* @param {THREE.BufferAttribute} attribute Attribute to store * @param {THREE.BufferAttribute} attribute Attribute to store
...@@ -1308,14 +1341,14 @@ THREE.GLTFExporter.prototype = { ...@@ -1308,14 +1341,14 @@ THREE.GLTFExporter.prototype = {
reader.onloadend = function () { reader.onloadend = function () {
// Binary chunk. // Binary chunk.
var binaryChunk = reader.result; var binaryChunk = getPaddedArrayBuffer( reader.result );
var binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) ); var binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
binaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true ); binaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );
binaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true ); binaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );
// JSON chunk. // JSON chunk.
delete outputJSON.buffers[ 0 ].uri; // Omitted URI indicates use of binary chunk. delete outputJSON.buffers[ 0 ].uri; // Omitted URI indicates use of binary chunk.
var jsonChunk = stringToArrayBuffer( JSON.stringify( outputJSON ) ); var jsonChunk = stringToArrayBuffer( JSON.stringify( outputJSON ), true );
var jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) ); var jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
jsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true ); jsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );
jsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true ); jsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册