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

USDZExporter: store geometries in different files (#21775)

上级 1ea001da
......@@ -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;
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册