diff --git a/examples/js/exporters/USDZExporter.js b/examples/js/exporters/USDZExporter.js index 1d00d88b3015d3bdf1adc97a2eb5e4f9beb4745f..d566f4610ec68126076b2ec1ada96a93329d9225 100644 --- a/examples/js/exporters/USDZExporter.js +++ b/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}@`; + const referencedMesh = `prepend references = @./${geometryFileName}@`; const referencedMaterial = `rel material:binding = `; 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; diff --git a/examples/jsm/exporters/USDZExporter.js b/examples/jsm/exporters/USDZExporter.js index 9c34de9081be260075294897b74d94173961f1b8..3602b2cc42fa7bb9a7360c31cbdffd5d12a966c5 100644 --- a/examples/jsm/exporters/USDZExporter.js +++ b/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}@`; + + const referencedMesh = `prepend references = @./${ geometryFileName }@`; const referencedMaterial = `rel material:binding = `; 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;