Skip to content

Commit 3d7f327

Browse files
authored
Merge pull request #16419 from Mugen87/dev29
3MFLoader: Support nested components.
2 parents 478f8cd + cfef70f commit 3d7f327

File tree

1 file changed

+70
-60
lines changed

1 file changed

+70
-60
lines changed

examples/js/loaders/3MFLoader.js

Lines changed: 70 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ THREE.ThreeMFLoader.prototype = {
7272

7373
for ( file in zip.files ) {
7474

75-
if ( file.match( /\.rels$/ ) ) {
75+
if ( file.match( /\_rels\/.rels$/ ) ) {
7676

7777
relsName = file;
7878

@@ -585,115 +585,125 @@ THREE.ThreeMFLoader.prototype = {
585585

586586
}
587587

588-
function buildObjects( data3mf ) {
588+
function getBuild( data, objects, modelData, builder ) {
589589

590-
var modelsData = data3mf.model;
591-
var objects = {};
592-
var modelsKeys = Object.keys( modelsData );
590+
if ( data.build !== undefined ) return data.build;
593591

594-
for ( var i = 0; i < modelsKeys.length; i ++ ) {
592+
data.build = builder( data, objects, modelData );
595593

596-
var modelsKey = modelsKeys[ i ];
597-
var modelData = modelsData[ modelsKey ];
598-
var modelXml = modelData[ 'xml' ];
599-
var extensions = modelData[ 'extensions' ];
594+
return data.build;
600595

601-
var objectIds = Object.keys( modelData[ 'resources' ][ 'object' ] );
596+
}
602597

603-
for ( var j = 0; j < objectIds.length; j ++ ) {
598+
function buildComposite( compositeData, objects, modelData ) {
604599

605-
var objectId = objectIds[ j ];
606-
var objectData = modelData[ 'resources' ][ 'object' ][ objectId ];
607-
var meshData = objectData[ 'mesh' ];
600+
var composite = new THREE.Group();
608601

609-
if ( meshData ) {
602+
for ( var j = 0; j < compositeData.length; j ++ ) {
610603

611-
applyExtensions( extensions, meshData, modelXml );
604+
var component = compositeData[ j ];
605+
var build = objects[ component.objectId ];
612606

613-
objects[ objectId ] = {
614-
isMesh: true,
615-
mesh: buildMesh( meshData )
616-
};
607+
if ( build === undefined ) {
617608

618-
} else {
609+
buildObject( component.objectId, objects, modelData );
610+
build = objects[ component.objectId ];
619611

620-
objects[ objectId ] = {
621-
isComposite: true,
622-
components: objectData[ 'components' ]
623-
};
612+
}
624613

625-
}
614+
var object3D = build.clone();
615+
616+
// apply component transfrom
617+
618+
var transform = component.transform;
619+
620+
if ( transform ) {
621+
622+
object3D.applyMatrix( transform );
626623

627624
}
628625

626+
composite.add( object3D );
627+
629628
}
630629

631-
return objects;
630+
return composite;
632631

633632
}
634633

635-
function build( objects, refs, data3mf ) {
634+
function buildObject( objectId, objects, modelData ) {
636635

637-
var group = new THREE.Group();
638-
var buildData = data3mf.model[ refs[ 'target' ].substring( 1 ) ][ 'build' ];
636+
var objectData = modelData[ 'resources' ][ 'object' ][ objectId ];
637+
var meshData = objectData[ 'mesh' ];
639638

640-
for ( var i = 0; i < buildData.length; i ++ ) {
639+
if ( meshData ) {
641640

642-
var buildItem = buildData[ i ];
643-
var object = objects[ buildItem[ 'objectId' ] ];
641+
var extensions = modelData[ 'extensions' ];
642+
var modelXml = modelData[ 'xml' ];
644643

645-
if ( object.isComposite ) {
644+
applyExtensions( extensions, meshData, modelXml );
646645

647-
var composite = new THREE.Group();
648-
var components = object.components;
646+
objects[ objectData.id ] = getBuild( meshData, objects, modelData, buildMesh );
649647

650-
// add meshes to composite object
648+
} else {
651649

652-
for ( var j = 0; j < components.length; j ++ ) {
650+
var compositeData = objectData[ 'components' ];
653651

654-
var component = components[ j ];
655-
var mesh = objects[ component.objectId ].mesh.clone();
652+
objects[ objectData.id ] = getBuild( compositeData, objects, modelData, buildComposite );
656653

657-
var transform = component.transform;
654+
}
658655

659-
if ( transform ) {
656+
}
660657

661-
mesh.applyMatrix( transform );
658+
function buildObjects( data3mf ) {
662659

663-
}
660+
var modelsData = data3mf.model;
661+
var objects = {};
662+
var modelsKeys = Object.keys( modelsData );
664663

665-
composite.add( mesh );
664+
for ( var i = 0; i < modelsKeys.length; i ++ ) {
666665

667-
}
666+
var modelsKey = modelsKeys[ i ];
667+
var modelData = modelsData[ modelsKey ];
668668

669-
// transform composite if necessary
669+
var objectIds = Object.keys( modelData[ 'resources' ][ 'object' ] );
670670

671-
var transform = buildItem[ 'transform' ];
671+
for ( var j = 0; j < objectIds.length; j ++ ) {
672672

673-
if ( transform ) {
673+
var objectId = objectIds[ j ];
674674

675-
composite.applyMatrix( transform );
675+
buildObject( objectId, objects, modelData );
676676

677-
}
677+
}
678678

679-
group.add( composite );
679+
}
680+
681+
return objects;
682+
683+
}
684+
685+
function build( objects, refs, data3mf ) {
680686

687+
var group = new THREE.Group();
688+
var buildData = data3mf.model[ refs[ 'target' ].substring( 1 ) ][ 'build' ];
681689

682-
} else {
690+
for ( var i = 0; i < buildData.length; i ++ ) {
683691

684-
var mesh = object.mesh;
685-
var transform = buildItem[ 'transform' ];
692+
var buildItem = buildData[ i ];
693+
var object3D = objects[ buildItem[ 'objectId' ] ];
686694

687-
if ( transform ) {
695+
// apply transform
688696

689-
mesh.applyMatrix( transform );
697+
var transform = buildItem[ 'transform' ];
690698

691-
}
699+
if ( transform ) {
692700

693-
group.add( mesh );
701+
object3D.applyMatrix( transform );
694702

695703
}
696704

705+
group.add( object3D );
706+
697707
}
698708

699709
return group;

0 commit comments

Comments
 (0)