@@ -72,7 +72,7 @@ THREE.ThreeMFLoader.prototype = {
7272
7373 for ( file in zip . files ) {
7474
75- if ( file . match ( / \. r e l s $ / ) ) {
75+ if ( file . match ( / \_ r e l s \/ .r e l s $ / ) ) {
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