|
@@ -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;
|