Przeglądaj źródła

USDZLoader: Reorder quaternion components in USDA quatf[] array parsing. (#33577)

Co-authored-by: Michael Herzog <michael.herzog@human-interactive.org>
bigbigbiglazycat 1 miesiąc temu
rodzic
commit
8320770f4e
1 zmienionych plików z 21 dodań i 8 usunięć
  1. 21 8
      examples/jsm/loaders/usd/USDAParser.js

+ 21 - 8
examples/jsm/loaders/usd/USDAParser.js

@@ -699,6 +699,8 @@ class USDAParser {
 		// Array types
 		if ( valueType.endsWith( '[]' ) ) {
 
+			let result;
+
 			// Parse JSON-like arrays
 			try {
 
@@ -709,19 +711,13 @@ class USDAParser {
 				const parsed = JSON.parse( cleaned );
 
 				// Flatten nested arrays for types like point3f[]
-				if ( Array.isArray( parsed ) && Array.isArray( parsed[ 0 ] ) ) {
-
-					return parsed.flat();
-
-				}
-
-				return parsed;
+				result = Array.isArray( parsed ) && Array.isArray( parsed[ 0 ] ) ? parsed.flat() : parsed;
 
 			} catch ( e ) {
 
 				// Try simple array parsing
 				const cleaned = str.replace( /[\[\]]/g, '' );
-				return cleaned.split( ',' ).map( s => {
+				result = cleaned.split( ',' ).map( s => {
 
 					const trimmed = s.trim();
 					const num = parseFloat( trimmed );
@@ -731,6 +727,23 @@ class USDAParser {
 
 			}
 
+			//reorder (w, x, y, z) to (x, y, z, w)
+			if ( valueType.startsWith( 'quat' ) ) {
+
+				for ( let i = 0; i < result.length; i += 4 ) {
+
+					const w = result[ i ];
+					result[ i ] = result[ i + 1 ];
+					result[ i + 1 ] = result[ i + 2 ];
+					result[ i + 2 ] = result[ i + 3 ];
+					result[ i + 3 ] = w;
+
+				}
+
+			}
+
+			return result;
+
 		}
 
 		// Vector types (double3, float3, point3f, etc.)

粤ICP备19079148号