Browse Source

GLTFExporter: Fix padding in stringToArrayBuffer for multi-byte strings

Takahiro 7 years ago
parent
commit
0359d57168
1 changed files with 45 additions and 14 deletions
  1. 45 14
      examples/js/exporters/GLTFExporter.js

+ 45 - 14
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;
+
+			}
 
 		}