Skip to content

Commit

Permalink
3MFLoader: Support nested components.
Browse files Browse the repository at this point in the history
  • Loading branch information
Mugen87 committed May 12, 2019
1 parent 075c3f4 commit cfef70f
Showing 1 changed file with 70 additions and 60 deletions.
130 changes: 70 additions & 60 deletions examples/js/loaders/3MFLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ THREE.ThreeMFLoader.prototype = {

for ( file in zip.files ) {

if ( file.match( /\.rels$/ ) ) {
if ( file.match( /\_rels\/.rels$/ ) ) {

relsName = file;

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit cfef70f

Please sign in to comment.