@@ -205,10 +205,11 @@ THREE.ThreeMFLoader.prototype = {
205205
206206 }
207207
208- function parseBasematerialsNode ( basematerialsNode ) {
208+ function parseBasematerialsNode ( /* basematerialsNode */ ) {
209+
209210 }
210211
211- function parseMeshNode ( meshNode , extensions ) {
212+ function parseMeshNode ( meshNode ) {
212213
213214 var meshData = { } ;
214215
@@ -300,6 +301,59 @@ THREE.ThreeMFLoader.prototype = {
300301
301302 function parseComponentsNode ( componentsNode ) {
302303
304+ var components = [ ] ;
305+
306+ var componentNodes = componentsNode . querySelectorAll ( 'component' ) ;
307+
308+ for ( var i = 0 ; i < componentNodes . length ; i ++ ) {
309+
310+ var componentNode = componentNodes [ i ] ;
311+ var componentData = parseComponentNode ( componentNode ) ;
312+ components . push ( componentData ) ;
313+
314+ }
315+
316+ return components ;
317+
318+ }
319+
320+ function parseComponentNode ( componentNode ) {
321+
322+ var componentData = { } ;
323+
324+ componentData [ 'objectId' ] = componentNode . getAttribute ( 'objectid' ) ; // required
325+
326+ var transform = componentNode . getAttribute ( 'transform' ) ;
327+
328+ if ( transform ) {
329+
330+ componentData [ 'transform' ] = parseTransform ( transform ) ;
331+
332+ }
333+
334+ return componentData ;
335+
336+ }
337+
338+ function parseTransform ( transform ) {
339+
340+ var t = [ ] ;
341+ transform . split ( ' ' ) . forEach ( function ( s ) {
342+
343+ t . push ( parseFloat ( s ) ) ;
344+
345+ } ) ;
346+
347+ var matrix = new THREE . Matrix4 ( ) ;
348+ matrix . set (
349+ t [ 0 ] , t [ 3 ] , t [ 6 ] , t [ 9 ] ,
350+ t [ 1 ] , t [ 4 ] , t [ 7 ] , t [ 10 ] ,
351+ t [ 2 ] , t [ 5 ] , t [ 8 ] , t [ 11 ] ,
352+ 0.0 , 0.0 , 0.0 , 1.0
353+ ) ;
354+
355+ return matrix ;
356+
303357 }
304358
305359 function parseObjectNode ( objectNode ) {
@@ -411,25 +465,13 @@ THREE.ThreeMFLoader.prototype = {
411465
412466 var itemNode = itemNodes [ i ] ;
413467 var buildItem = {
414- objectid : itemNode . getAttribute ( 'objectid' )
468+ objectId : itemNode . getAttribute ( 'objectid' )
415469 } ;
416470 var transform = itemNode . getAttribute ( 'transform' ) ;
417471
418472 if ( transform ) {
419473
420- var t = [ ] ;
421- transform . split ( ' ' ) . forEach ( function ( s ) {
422-
423- t . push ( parseFloat ( s ) ) ;
424-
425- } ) ;
426- var mat4 = new THREE . Matrix4 ( ) ;
427- buildItem [ 'transform' ] = mat4 . set (
428- t [ 0 ] , t [ 3 ] , t [ 6 ] , t [ 9 ] ,
429- t [ 1 ] , t [ 4 ] , t [ 7 ] , t [ 10 ] ,
430- t [ 2 ] , t [ 5 ] , t [ 8 ] , t [ 11 ] ,
431- 0.0 , 0.0 , 0.0 , 1.0
432- ) ;
474+ buildItem [ 'transform' ] = parseTransform ( transform ) ;
433475
434476 }
435477
@@ -472,7 +514,7 @@ THREE.ThreeMFLoader.prototype = {
472514
473515 }
474516
475- function buildMesh ( meshData , data3mf ) {
517+ function buildMesh ( meshData ) {
476518
477519 var geometry = new THREE . BufferGeometry ( ) ;
478520 geometry . setIndex ( new THREE . BufferAttribute ( meshData [ 'triangles' ] , 1 ) ) ;
@@ -505,7 +547,7 @@ THREE.ThreeMFLoader.prototype = {
505547
506548 }
507549
508- function applyExtensions ( extensions , meshData , modelXml , data3mf ) {
550+ function applyExtensions ( extensions , meshData , modelXml ) {
509551
510552 if ( ! extensions ) {
511553
@@ -543,10 +585,10 @@ THREE.ThreeMFLoader.prototype = {
543585
544586 }
545587
546- function buildMeshes ( data3mf ) {
588+ function buildObjects ( data3mf ) {
547589
548590 var modelsData = data3mf . model ;
549- var meshes = { } ;
591+ var objects = { } ;
550592 var modelsKeys = Object . keys ( modelsData ) ;
551593
552594 for ( var i = 0 ; i < modelsKeys . length ; i ++ ) {
@@ -563,34 +605,94 @@ THREE.ThreeMFLoader.prototype = {
563605 var objectId = objectIds [ j ] ;
564606 var objectData = modelData [ 'resources' ] [ 'object' ] [ objectId ] ;
565607 var meshData = objectData [ 'mesh' ] ;
566- applyExtensions ( extensions , meshData , modelXml , data3mf ) ;
567- meshes [ objectId ] = buildMesh ( meshData , data3mf ) ;
608+
609+ if ( meshData ) {
610+
611+ applyExtensions ( extensions , meshData , modelXml ) ;
612+
613+ objects [ objectId ] = {
614+ isMesh : true ,
615+ mesh : buildMesh ( meshData )
616+ } ;
617+
618+ } else {
619+
620+ objects [ objectId ] = {
621+ isComposite : true ,
622+ components : objectData [ 'components' ]
623+ } ;
624+
625+ }
568626
569627 }
570628
571629 }
572630
573- return meshes ;
631+ return objects ;
574632
575633 }
576634
577- function build ( meshes , refs , data3mf ) {
635+ function build ( objects , refs , data3mf ) {
578636
579637 var group = new THREE . Group ( ) ;
580638 var buildData = data3mf . model [ refs [ 'target' ] . substring ( 1 ) ] [ 'build' ] ;
581639
582640 for ( var i = 0 ; i < buildData . length ; i ++ ) {
583641
584642 var buildItem = buildData [ i ] ;
585- var mesh = meshes [ buildItem [ 'objectid ' ] ] ;
643+ var object = objects [ buildItem [ 'objectId ' ] ] ;
586644
587- if ( buildItem [ 'transform' ] ) {
645+ if ( object . isComposite ) {
588646
589- mesh . geometry . applyMatrix ( buildItem [ 'transform' ] ) ;
647+ var composite = new THREE . Group ( ) ;
648+ var components = object . components ;
590649
591- }
650+ // add meshes to composite object
651+
652+ for ( var j = 0 ; j < components . length ; j ++ ) {
653+
654+ var component = components [ j ] ;
655+ var mesh = objects [ component . objectId ] . mesh . clone ( ) ;
656+
657+ var transform = component . transform ;
658+
659+ if ( transform ) {
660+
661+ mesh . applyMatrix ( transform ) ;
662+
663+ }
664+
665+ composite . add ( mesh ) ;
666+
667+ }
668+
669+ // transform composite if necessary
592670
593- group . add ( mesh ) ;
671+ var transform = buildItem [ 'transform' ] ;
672+
673+ if ( transform ) {
674+
675+ composite . applyMatrix ( transform ) ;
676+
677+ }
678+
679+ group . add ( composite ) ;
680+
681+
682+ } else {
683+
684+ var mesh = object . mesh ;
685+ var transform = buildItem [ 'transform' ] ;
686+
687+ if ( transform ) {
688+
689+ mesh . applyMatrix ( transform ) ;
690+
691+ }
692+
693+ group . add ( mesh ) ;
694+
695+ }
594696
595697 }
596698
@@ -599,9 +701,9 @@ THREE.ThreeMFLoader.prototype = {
599701 }
600702
601703 var data3mf = loadDocument ( data ) ;
602- var meshes = buildMeshes ( data3mf ) ;
704+ var objects = buildObjects ( data3mf ) ;
603705
604- return build ( meshes , data3mf [ 'rels' ] , data3mf ) ;
706+ return build ( objects , data3mf [ 'rels' ] , data3mf ) ;
605707
606708 } ,
607709
0 commit comments