Ver código fonte

USDZExporter: store geometries in different files (#21775)

qeeqez 4 anos atrás
pai
commit
2dccc1fb6e

+ 18 - 25
examples/js/exporters/USDZExporter.js

@@ -5,10 +5,10 @@
 		async parse( scene ) {
 
 			const files = {};
-			const modelFileName = 'model.usda';
-			const geometryFileName = 'geometry.usd';
+			const modelFileName = 'model.usda'; // model file should be first in USDZ archive so we init it here
+
+			files[ modelFileName ] = null;
 			let output = buildHeader();
-			const geometries = {};
 			const materials = {};
 			const textures = {};
 			scene.traverse( object => {
@@ -17,10 +17,12 @@
 
 					const geometry = object.geometry;
 					const material = object.material;
+					const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd';
 
-					if ( ! ( geometry.uuid in geometries ) ) {
+					if ( ! ( geometryFileName in files ) ) {
 
-						geometries[ geometry.uuid ] = geometry;
+						const meshObject = buildMeshObject( geometry );
+						files[ geometryFileName ] = buildUSDFileAsString( meshObject );
 
 					}
 
@@ -36,7 +38,7 @@
 
 					}
 
-					const referencedMesh = `prepend references = @./${geometryFileName}@</Geometry_${geometry.id}>`;
+					const referencedMesh = `prepend references = @./${geometryFileName}@</Geometry>`;
 					const referencedMaterial = `rel material:binding = </Materials/Material_${material.id}>`;
 					output += buildXform( object, referencedMesh, referencedMaterial );
 
@@ -47,7 +49,6 @@
 			output += buildTextures( textures );
 			files[ modelFileName ] = fflate.strToU8( output );
 			output = null;
-			files[ geometryFileName ] = fflate.strToU8( buildMeshFileString( geometries ) );
 
 			for ( const uuid in textures ) {
 
@@ -124,6 +125,14 @@
 
 `;
 
+	}
+
+	function buildUSDFileAsString( dataToInsert ) {
+
+		let output = buildHeader();
+		output += dataToInsert;
+		return fflate.strToU8( output );
+
 	} // Xform
 
 
@@ -160,27 +169,11 @@
 	} // Mesh
 
 
-	function buildMeshFileString( geometries ) {
-
-		let output = buildHeader();
-
-		for ( const uuid in geometries ) {
-
-			const geometry = geometries[ uuid ];
-			output += buildMeshObject( geometry );
-
-		}
-
-		return output;
-
-	}
-
 	function buildMeshObject( geometry ) {
 
-		const name = 'Geometry_' + geometry.id;
 		const mesh = buildMesh( geometry );
 		return `
-def "${name}"
+def "Geometry"
 {
 	${mesh}
 }
@@ -190,7 +183,7 @@ def "${name}"
 
 	function buildMesh( geometry ) {
 
-		const name = 'Geometry_' + geometry.id;
+		const name = 'Geometry';
 		const attributes = geometry.attributes;
 		const count = attributes.position.count;
 

+ 20 - 25
examples/jsm/exporters/USDZExporter.js

@@ -6,11 +6,12 @@ class USDZExporter {
 
 		const files = {};
 		const modelFileName = 'model.usda';
-		const geometryFileName = 'geometry.usd';
+
+		// model file should be first in USDZ archive so we init it here
+		files[ modelFileName ] = null;
 
 		let output = buildHeader();
 
-		const geometries = {};
 		const materials = {};
 		const textures = {};
 
@@ -21,9 +22,12 @@ class USDZExporter {
 				const geometry = object.geometry;
 				const material = object.material;
 
-				if ( ! ( geometry.uuid in geometries ) ) {
+				const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usd';
+
+				if ( ! ( geometryFileName in files ) ) {
 
-					geometries[ geometry.uuid ] = geometry;
+					const meshObject = buildMeshObject( geometry );
+					files[ geometryFileName ] = buildUSDFileAsString( meshObject );
 
 				}
 
@@ -39,7 +43,8 @@ class USDZExporter {
 
 				}
 
-				const referencedMesh = `prepend references = @./${geometryFileName}@</Geometry_${ geometry.id }>`;
+
+				const referencedMesh = `prepend references = @./${ geometryFileName }@</Geometry>`;
 				const referencedMaterial = `rel material:binding = </Materials/Material_${ material.id }>`;
 				output += buildXform( object, referencedMesh, referencedMaterial );
 
@@ -53,8 +58,6 @@ class USDZExporter {
 		files[ modelFileName ] = fflate.strToU8( output );
 		output = null;
 
-		files[ geometryFileName ] = fflate.strToU8( buildMeshFileString( geometries ) );
-
 		for ( const uuid in textures ) {
 
 			const texture = textures[ uuid ];
@@ -137,6 +140,14 @@ function buildHeader() {
 
 }
 
+function buildUSDFileAsString( dataToInsert ) {
+
+	let output = buildHeader();
+	output += dataToInsert;
+	return fflate.strToU8( output );
+
+}
+
 // Xform
 
 function buildXform( object, referencedMesh, referencedMaterial ) {
@@ -175,27 +186,11 @@ function buildMatrixRow( array, offset ) {
 
 // Mesh
 
-function buildMeshFileString( geometries ) {
-
-	let output = buildHeader();
-
-	for ( const uuid in geometries ) {
-
-		const geometry = geometries[ uuid ];
-		output += buildMeshObject( geometry );
-
-	}
-
-	return output;
-
-}
-
 function buildMeshObject( geometry ) {
 
-	const name = 'Geometry_' + geometry.id;
 	const mesh = buildMesh( geometry );
 	return `
-def "${name}"
+def "Geometry"
 {
 	${mesh}
 }
@@ -205,7 +200,7 @@ def "${name}"
 
 function buildMesh( geometry ) {
 
-	const name = 'Geometry_' + geometry.id;
+	const name = 'Geometry';
 	const attributes = geometry.attributes;
 	const count = attributes.position.count;