Skip to content

Commit

Permalink
Merge pull request mrdoob#16418 from Mugen87/dev29
Browse files Browse the repository at this point in the history
3MFLoader: Add support for components.
  • Loading branch information
mrdoob authored May 12, 2019
2 parents e712baf + 075c3f4 commit 478f8cd
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 31 deletions.
164 changes: 133 additions & 31 deletions examples/js/loaders/3MFLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,11 @@ THREE.ThreeMFLoader.prototype = {

}

function parseBasematerialsNode( basematerialsNode ) {
function parseBasematerialsNode( /* basematerialsNode */ ) {

}

function parseMeshNode( meshNode, extensions ) {
function parseMeshNode( meshNode ) {

var meshData = {};

Expand Down Expand Up @@ -300,6 +301,59 @@ THREE.ThreeMFLoader.prototype = {

function parseComponentsNode( componentsNode ) {

var components = [];

var componentNodes = componentsNode.querySelectorAll( 'component' );

for ( var i = 0; i < componentNodes.length; i ++ ) {

var componentNode = componentNodes[ i ];
var componentData = parseComponentNode( componentNode );
components.push( componentData );

}

return components;

}

function parseComponentNode( componentNode ) {

var componentData = {};

componentData[ 'objectId' ] = componentNode.getAttribute( 'objectid' ); // required

var transform = componentNode.getAttribute( 'transform' );

if ( transform ) {

componentData[ 'transform' ] = parseTransform( transform );

}

return componentData;

}

function parseTransform( transform ) {

var t = [];
transform.split( ' ' ).forEach( function ( s ) {

t.push( parseFloat( s ) );

} );

var matrix = new THREE.Matrix4();
matrix.set(
t[ 0 ], t[ 3 ], t[ 6 ], t[ 9 ],
t[ 1 ], t[ 4 ], t[ 7 ], t[ 10 ],
t[ 2 ], t[ 5 ], t[ 8 ], t[ 11 ],
0.0, 0.0, 0.0, 1.0
);

return matrix;

}

function parseObjectNode( objectNode ) {
Expand Down Expand Up @@ -411,25 +465,13 @@ THREE.ThreeMFLoader.prototype = {

var itemNode = itemNodes[ i ];
var buildItem = {
objectid: itemNode.getAttribute( 'objectid' )
objectId: itemNode.getAttribute( 'objectid' )
};
var transform = itemNode.getAttribute( 'transform' );

if ( transform ) {

var t = [];
transform.split( ' ' ).forEach( function ( s ) {

t.push( parseFloat( s ) );

} );
var mat4 = new THREE.Matrix4();
buildItem[ 'transform' ] = mat4.set(
t[ 0 ], t[ 3 ], t[ 6 ], t[ 9 ],
t[ 1 ], t[ 4 ], t[ 7 ], t[ 10 ],
t[ 2 ], t[ 5 ], t[ 8 ], t[ 11 ],
0.0, 0.0, 0.0, 1.0
);
buildItem[ 'transform' ] = parseTransform( transform );

}

Expand Down Expand Up @@ -472,7 +514,7 @@ THREE.ThreeMFLoader.prototype = {

}

function buildMesh( meshData, data3mf ) {
function buildMesh( meshData ) {

var geometry = new THREE.BufferGeometry();
geometry.setIndex( new THREE.BufferAttribute( meshData[ 'triangles' ], 1 ) );
Expand Down Expand Up @@ -505,7 +547,7 @@ THREE.ThreeMFLoader.prototype = {

}

function applyExtensions( extensions, meshData, modelXml, data3mf ) {
function applyExtensions( extensions, meshData, modelXml ) {

if ( ! extensions ) {

Expand Down Expand Up @@ -543,10 +585,10 @@ THREE.ThreeMFLoader.prototype = {

}

function buildMeshes( data3mf ) {
function buildObjects( data3mf ) {

var modelsData = data3mf.model;
var meshes = {};
var objects = {};
var modelsKeys = Object.keys( modelsData );

for ( var i = 0; i < modelsKeys.length; i ++ ) {
Expand All @@ -563,34 +605,94 @@ THREE.ThreeMFLoader.prototype = {
var objectId = objectIds[ j ];
var objectData = modelData[ 'resources' ][ 'object' ][ objectId ];
var meshData = objectData[ 'mesh' ];
applyExtensions( extensions, meshData, modelXml, data3mf );
meshes[ objectId ] = buildMesh( meshData, data3mf );

if ( meshData ) {

applyExtensions( extensions, meshData, modelXml );

objects[ objectId ] = {
isMesh: true,
mesh: buildMesh( meshData )
};

} else {

objects[ objectId ] = {
isComposite: true,
components: objectData[ 'components' ]
};

}

}

}

return meshes;
return objects;

}

function build( meshes, refs, data3mf ) {
function build( objects, refs, data3mf ) {

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

for ( var i = 0; i < buildData.length; i ++ ) {

var buildItem = buildData[ i ];
var mesh = meshes[ buildItem[ 'objectid' ] ];
var object = objects[ buildItem[ 'objectId' ] ];

if ( buildItem[ 'transform' ] ) {
if ( object.isComposite ) {

mesh.geometry.applyMatrix( buildItem[ 'transform' ] );
var composite = new THREE.Group();
var components = object.components;

}
// add meshes to composite object

for ( var j = 0; j < components.length; j ++ ) {

var component = components[ j ];
var mesh = objects[ component.objectId ].mesh.clone();

var transform = component.transform;

if ( transform ) {

mesh.applyMatrix( transform );

}

composite.add( mesh );

}

// transform composite if necessary

group.add( mesh );
var transform = buildItem[ 'transform' ];

if ( transform ) {

composite.applyMatrix( transform );

}

group.add( composite );


} else {

var mesh = object.mesh;
var transform = buildItem[ 'transform' ];

if ( transform ) {

mesh.applyMatrix( transform );

}

group.add( mesh );

}

}

Expand All @@ -599,9 +701,9 @@ THREE.ThreeMFLoader.prototype = {
}

var data3mf = loadDocument( data );
var meshes = buildMeshes( data3mf );
var objects = buildObjects( data3mf );

return build( meshes, data3mf[ 'rels' ], data3mf );
return build( objects, data3mf[ 'rels' ], data3mf );

},

Expand Down
Binary file added examples/models/3mf/gear.3mf
Binary file not shown.

0 comments on commit 478f8cd

Please sign in to comment.