Skip to content

Commit 478f8cd

Browse files
authored
Merge pull request #16418 from Mugen87/dev29
3MFLoader: Add support for components.
2 parents e712baf + 075c3f4 commit 478f8cd

File tree

2 files changed

+133
-31
lines changed

2 files changed

+133
-31
lines changed

examples/js/loaders/3MFLoader.js

Lines changed: 133 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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

examples/models/3mf/gear.3mf

127 KB
Binary file not shown.

0 commit comments

Comments
 (0)