提交 dad80588 编写于 作者: M Mugen87

3MFLoader: Add support for components.

上级 e712bafd
......@@ -205,10 +205,11 @@ THREE.ThreeMFLoader.prototype = {
}
function parseBasematerialsNode( basematerialsNode ) {
function parseBasematerialsNode( /* basematerialsNode */ ) {
}
function parseMeshNode( meshNode, extensions ) {
function parseMeshNode( meshNode ) {
var meshData = {};
......@@ -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 ) {
......@@ -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 );
}
......@@ -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 ) );
......@@ -505,7 +547,7 @@ THREE.ThreeMFLoader.prototype = {
}
function applyExtensions( extensions, meshData, modelXml, data3mf ) {
function applyExtensions( extensions, meshData, modelXml ) {
if ( ! extensions ) {
......@@ -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 ++ ) {
......@@ -563,18 +605,34 @@ 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' ];
......@@ -582,15 +640,57 @@ THREE.ThreeMFLoader.prototype = {
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 );
}
group.add( mesh );
// transform composite if necessary
if ( buildItem[ 'transform' ] ) {
composite.applyMatrix( buildItem[ 'transform' ] );
}
group.add( composite );
} else {
var mesh = object.mesh;
var transform = buildItem[ 'transform' ];
if ( transform ) {
mesh.applyMatrix( transform );
}
group.add( mesh );
}
}
......@@ -599,9 +699,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 );
},
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册