未验证 提交 2dccc1fb 编写于 作者: Q qeeqez 提交者: GitHub

USDZExporter: store geometries in different files (#21775)

上级 1ea001da
...@@ -5,10 +5,10 @@ ...@@ -5,10 +5,10 @@
async parse( scene ) { async parse( scene ) {
const files = {}; const files = {};
const modelFileName = 'model.usda'; const modelFileName = 'model.usda'; // model file should be first in USDZ archive so we init it here
const geometryFileName = 'geometry.usd';
files[ modelFileName ] = null;
let output = buildHeader(); let output = buildHeader();
const geometries = {};
const materials = {}; const materials = {};
const textures = {}; const textures = {};
scene.traverse( object => { scene.traverse( object => {
...@@ -17,10 +17,12 @@ ...@@ -17,10 +17,12 @@
const geometry = object.geometry; const geometry = object.geometry;
const material = object.material; 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 @@ ...@@ -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}>`; const referencedMaterial = `rel material:binding = </Materials/Material_${material.id}>`;
output += buildXform( object, referencedMesh, referencedMaterial ); output += buildXform( object, referencedMesh, referencedMaterial );
...@@ -47,7 +49,6 @@ ...@@ -47,7 +49,6 @@
output += buildTextures( textures ); output += buildTextures( textures );
files[ modelFileName ] = fflate.strToU8( output ); files[ modelFileName ] = fflate.strToU8( output );
output = null; output = null;
files[ geometryFileName ] = fflate.strToU8( buildMeshFileString( geometries ) );
for ( const uuid in textures ) { for ( const uuid in textures ) {
...@@ -124,6 +125,14 @@ ...@@ -124,6 +125,14 @@
`; `;
}
function buildUSDFileAsString( dataToInsert ) {
let output = buildHeader();
output += dataToInsert;
return fflate.strToU8( output );
} // Xform } // Xform
...@@ -160,27 +169,11 @@ ...@@ -160,27 +169,11 @@
} // Mesh } // Mesh
function buildMeshFileString( geometries ) {
let output = buildHeader();
for ( const uuid in geometries ) {
const geometry = geometries[ uuid ];
output += buildMeshObject( geometry );
}
return output;
}
function buildMeshObject( geometry ) { function buildMeshObject( geometry ) {
const name = 'Geometry_' + geometry.id;
const mesh = buildMesh( geometry ); const mesh = buildMesh( geometry );
return ` return `
def "${name}" def "Geometry"
{ {
${mesh} ${mesh}
} }
...@@ -190,7 +183,7 @@ def "${name}" ...@@ -190,7 +183,7 @@ def "${name}"
function buildMesh( geometry ) { function buildMesh( geometry ) {
const name = 'Geometry_' + geometry.id; const name = 'Geometry';
const attributes = geometry.attributes; const attributes = geometry.attributes;
const count = attributes.position.count; const count = attributes.position.count;
......
...@@ -6,11 +6,12 @@ class USDZExporter { ...@@ -6,11 +6,12 @@ class USDZExporter {
const files = {}; const files = {};
const modelFileName = 'model.usda'; 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(); let output = buildHeader();
const geometries = {};
const materials = {}; const materials = {};
const textures = {}; const textures = {};
...@@ -21,9 +22,12 @@ class USDZExporter { ...@@ -21,9 +22,12 @@ class USDZExporter {
const geometry = object.geometry; const geometry = object.geometry;
const material = object.material; 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 { ...@@ -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 }>`; const referencedMaterial = `rel material:binding = </Materials/Material_${ material.id }>`;
output += buildXform( object, referencedMesh, referencedMaterial ); output += buildXform( object, referencedMesh, referencedMaterial );
...@@ -53,8 +58,6 @@ class USDZExporter { ...@@ -53,8 +58,6 @@ class USDZExporter {
files[ modelFileName ] = fflate.strToU8( output ); files[ modelFileName ] = fflate.strToU8( output );
output = null; output = null;
files[ geometryFileName ] = fflate.strToU8( buildMeshFileString( geometries ) );
for ( const uuid in textures ) { for ( const uuid in textures ) {
const texture = textures[ uuid ]; const texture = textures[ uuid ];
...@@ -137,6 +140,14 @@ function buildHeader() { ...@@ -137,6 +140,14 @@ function buildHeader() {
} }
function buildUSDFileAsString( dataToInsert ) {
let output = buildHeader();
output += dataToInsert;
return fflate.strToU8( output );
}
// Xform // Xform
function buildXform( object, referencedMesh, referencedMaterial ) { function buildXform( object, referencedMesh, referencedMaterial ) {
...@@ -175,27 +186,11 @@ function buildMatrixRow( array, offset ) { ...@@ -175,27 +186,11 @@ function buildMatrixRow( array, offset ) {
// Mesh // Mesh
function buildMeshFileString( geometries ) {
let output = buildHeader();
for ( const uuid in geometries ) {
const geometry = geometries[ uuid ];
output += buildMeshObject( geometry );
}
return output;
}
function buildMeshObject( geometry ) { function buildMeshObject( geometry ) {
const name = 'Geometry_' + geometry.id;
const mesh = buildMesh( geometry ); const mesh = buildMesh( geometry );
return ` return `
def "${name}" def "Geometry"
{ {
${mesh} ${mesh}
} }
...@@ -205,7 +200,7 @@ def "${name}" ...@@ -205,7 +200,7 @@ def "${name}"
function buildMesh( geometry ) { function buildMesh( geometry ) {
const name = 'Geometry_' + geometry.id; const name = 'Geometry';
const attributes = geometry.attributes; const attributes = geometry.attributes;
const count = attributes.position.count; const count = attributes.position.count;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册