From cfef70f5e3ca45147aad3ee562d1696e571d4080 Mon Sep 17 00:00:00 2001 From: Mugen87 Date: Sun, 12 May 2019 20:33:30 +0200 Subject: [PATCH] 3MFLoader: Support nested components. --- examples/js/loaders/3MFLoader.js | 130 +++++++++++++++++-------------- 1 file changed, 70 insertions(+), 60 deletions(-) diff --git a/examples/js/loaders/3MFLoader.js b/examples/js/loaders/3MFLoader.js index b5fd494c4d2de2..1921fa515ee2ca 100644 --- a/examples/js/loaders/3MFLoader.js +++ b/examples/js/loaders/3MFLoader.js @@ -72,7 +72,7 @@ THREE.ThreeMFLoader.prototype = { for ( file in zip.files ) { - if ( file.match( /\.rels$/ ) ) { + if ( file.match( /\_rels\/.rels$/ ) ) { relsName = file; @@ -585,115 +585,125 @@ THREE.ThreeMFLoader.prototype = { } - function buildObjects( data3mf ) { + function getBuild( data, objects, modelData, builder ) { - var modelsData = data3mf.model; - var objects = {}; - var modelsKeys = Object.keys( modelsData ); + if ( data.build !== undefined ) return data.build; - for ( var i = 0; i < modelsKeys.length; i ++ ) { + data.build = builder( data, objects, modelData ); - var modelsKey = modelsKeys[ i ]; - var modelData = modelsData[ modelsKey ]; - var modelXml = modelData[ 'xml' ]; - var extensions = modelData[ 'extensions' ]; + return data.build; - var objectIds = Object.keys( modelData[ 'resources' ][ 'object' ] ); + } - for ( var j = 0; j < objectIds.length; j ++ ) { + function buildComposite( compositeData, objects, modelData ) { - var objectId = objectIds[ j ]; - var objectData = modelData[ 'resources' ][ 'object' ][ objectId ]; - var meshData = objectData[ 'mesh' ]; + var composite = new THREE.Group(); - if ( meshData ) { + for ( var j = 0; j < compositeData.length; j ++ ) { - applyExtensions( extensions, meshData, modelXml ); + var component = compositeData[ j ]; + var build = objects[ component.objectId ]; - objects[ objectId ] = { - isMesh: true, - mesh: buildMesh( meshData ) - }; + if ( build === undefined ) { - } else { + buildObject( component.objectId, objects, modelData ); + build = objects[ component.objectId ]; - objects[ objectId ] = { - isComposite: true, - components: objectData[ 'components' ] - }; + } - } + var object3D = build.clone(); + + // apply component transfrom + + var transform = component.transform; + + if ( transform ) { + + object3D.applyMatrix( transform ); } + composite.add( object3D ); + } - return objects; + return composite; } - function build( objects, refs, data3mf ) { + function buildObject( objectId, objects, modelData ) { - var group = new THREE.Group(); - var buildData = data3mf.model[ refs[ 'target' ].substring( 1 ) ][ 'build' ]; + var objectData = modelData[ 'resources' ][ 'object' ][ objectId ]; + var meshData = objectData[ 'mesh' ]; - for ( var i = 0; i < buildData.length; i ++ ) { + if ( meshData ) { - var buildItem = buildData[ i ]; - var object = objects[ buildItem[ 'objectId' ] ]; + var extensions = modelData[ 'extensions' ]; + var modelXml = modelData[ 'xml' ]; - if ( object.isComposite ) { + applyExtensions( extensions, meshData, modelXml ); - var composite = new THREE.Group(); - var components = object.components; + objects[ objectData.id ] = getBuild( meshData, objects, modelData, buildMesh ); - // add meshes to composite object + } else { - for ( var j = 0; j < components.length; j ++ ) { + var compositeData = objectData[ 'components' ]; - var component = components[ j ]; - var mesh = objects[ component.objectId ].mesh.clone(); + objects[ objectData.id ] = getBuild( compositeData, objects, modelData, buildComposite ); - var transform = component.transform; + } - if ( transform ) { + } - mesh.applyMatrix( transform ); + function buildObjects( data3mf ) { - } + var modelsData = data3mf.model; + var objects = {}; + var modelsKeys = Object.keys( modelsData ); - composite.add( mesh ); + for ( var i = 0; i < modelsKeys.length; i ++ ) { - } + var modelsKey = modelsKeys[ i ]; + var modelData = modelsData[ modelsKey ]; - // transform composite if necessary + var objectIds = Object.keys( modelData[ 'resources' ][ 'object' ] ); - var transform = buildItem[ 'transform' ]; + for ( var j = 0; j < objectIds.length; j ++ ) { - if ( transform ) { + var objectId = objectIds[ j ]; - composite.applyMatrix( transform ); + buildObject( objectId, objects, modelData ); - } + } - group.add( composite ); + } + + return objects; + + } + + function build( objects, refs, data3mf ) { + var group = new THREE.Group(); + var buildData = data3mf.model[ refs[ 'target' ].substring( 1 ) ][ 'build' ]; - } else { + for ( var i = 0; i < buildData.length; i ++ ) { - var mesh = object.mesh; - var transform = buildItem[ 'transform' ]; + var buildItem = buildData[ i ]; + var object3D = objects[ buildItem[ 'objectId' ] ]; - if ( transform ) { + // apply transform - mesh.applyMatrix( transform ); + var transform = buildItem[ 'transform' ]; - } + if ( transform ) { - group.add( mesh ); + object3D.applyMatrix( transform ); } + group.add( object3D ); + } return group;