diff --git a/examples/js/exporters/GLTFExporter.js b/examples/js/exporters/GLTFExporter.js index 3e5063df9ab94c94d218910c9edb164ee6cfea26..2c8a78f35334690fba3fab9ce0bd86bbfe2c5fd4 100644 --- a/examples/js/exporters/GLTFExporter.js +++ b/examples/js/exporters/GLTFExporter.js @@ -131,38 +131,69 @@ THREE.GLTFExporter.prototype = { /** * Converts a string to an ArrayBuffer. * @param {string} text + * @param {Boolean} padded * @return {ArrayBuffer} */ function stringToArrayBuffer( text, padded ) { - if ( padded ) { - var pad = getPaddedBufferSize( text.length ) - text.length; + var spaceCode = ' '.charCodeAt( 0 ); - for ( var i = 0; i < pad; i++ ) { + if ( window.TextEncoder !== undefined ) { + + var view = new TextEncoder().encode( text ); + + if ( ! padded || ( view.length % 4 ) === 0 ) return view.buffer; + + var view2 = new Uint8Array( new ArrayBuffer( getPaddedBufferSize( view.length ) ) ); - text += ' '; + for ( var i = 0, il = view.length; i < il; i ++ ) { + + view2[ i ] = view[ i ]; } - } + // pad with space + for ( var i = view.length, il = view2.length; i < il; i ++ ) { - if ( window.TextEncoder !== undefined ) { + view2[ i ] = spaceCode; - return new TextEncoder().encode( text ).buffer; + } - } + return view2.buffer; + + } else { - var buffer = new ArrayBuffer( text.length ); + var length = padded ? getPaddedBufferSize( text.length ) : text.length; - var bufferView = new Uint8Array( buffer ); + var view = new Uint8Array( new ArrayBuffer( length ) ); - for ( var i = 0; i < text.length; ++ i ) { + for ( var i = 0, il = text.length; i < il; i ++ ) { - bufferView[ i ] = text.charCodeAt( i ); + var value = text.charCodeAt( i ); - } + if ( value > 0xFF ) { + + // replace multi-byte string with space + view[ i ] = spaceCode; - return buffer; + } else { + + view[ i ] = value; + + } + + } + + // pad with space + for ( var i = text.length; i < length; i ++ ) { + + view[ i ] = spaceCode; + + } + + return view.buffer; + + } }