Explorar o código

3MFLoader: Support nested components.

Mugen87 %!s(int64=6) %!d(string=hai) anos
pai
achega
cfef70f5e3
Modificáronse 1 ficheiros con 70 adicións e 60 borrados
  1. 70 60
      examples/js/loaders/3MFLoader.js

+ 70 - 60
examples/js/loaders/3MFLoader.js

@@ -72,7 +72,7 @@ THREE.ThreeMFLoader.prototype = {
 
 			for ( file in zip.files ) {
 
-				if ( file.match( /\.rels$/ ) ) {
+				if ( file.match( /\_rels\/.rels$/ ) ) {
 
 					relsName = file;
 
@@ -585,115 +585,125 @@ THREE.ThreeMFLoader.prototype = {
 
 		}
 
-		function buildObjects( data3mf ) {
+		function getBuild( data, objects, modelData, builder ) {
 
-			var modelsData = data3mf.model;
-			var objects = {};
-			var modelsKeys = Object.keys( modelsData );
+			if ( data.build !== undefined ) return data.build;
 
-			for ( var i = 0; i < modelsKeys.length; i ++ ) {
+			data.build = builder( data, objects, modelData );
 
-				var modelsKey = modelsKeys[ i ];
-				var modelData = modelsData[ modelsKey ];
-				var modelXml = modelData[ 'xml' ];
-				var extensions = modelData[ 'extensions' ];
+			return data.build;
 
-				var objectIds = Object.keys( modelData[ 'resources' ][ 'object' ] );
+		}
 
-				for ( var j = 0; j < objectIds.length; j ++ ) {
+		function buildComposite( compositeData, objects, modelData ) {
 
-					var objectId = objectIds[ j ];
-					var objectData = modelData[ 'resources' ][ 'object' ][ objectId ];
-					var meshData = objectData[ 'mesh' ];
+			var composite = new THREE.Group();
 
-					if ( meshData ) {
+			for ( var j = 0; j < compositeData.length; j ++ ) {
 
-						applyExtensions( extensions, meshData, modelXml );
+				var component = compositeData[ j ];
+				var build = objects[ component.objectId ];
 
-						objects[ objectId ] = {
-							isMesh: true,
-							mesh: buildMesh( meshData )
-						};
+				if ( build === undefined ) {
 
-					} else {
+					buildObject( component.objectId, objects, modelData );
+					build = objects[ component.objectId ];
 
-						objects[ objectId ] = {
-							isComposite: true,
-							components:	objectData[ 'components' ]
-						};
+				}
 
-					}
+				var object3D = build.clone();
+
+				// apply component transfrom
+
+				var transform = component.transform;
+
+				if ( transform ) {
+
+					object3D.applyMatrix( transform );
 
 				}
 
+				composite.add( object3D );
+
 			}
 
-			return objects;
+			return composite;
 
 		}
 
-		function build( objects, refs, data3mf ) {
+		function buildObject( objectId, objects, modelData ) {
 
-			var group = new THREE.Group();
-			var buildData = data3mf.model[ refs[ 'target' ].substring( 1 ) ][ 'build' ];
+			var objectData = modelData[ 'resources' ][ 'object' ][ objectId ];
+			var meshData = objectData[ 'mesh' ];
 
-			for ( var i = 0; i < buildData.length; i ++ ) {
+			if ( meshData ) {
 
-				var buildItem = buildData[ i ];
-				var object = objects[ buildItem[ 'objectId' ] ];
+				var extensions = modelData[ 'extensions' ];
+				var modelXml = modelData[ 'xml' ];
 
-				if ( object.isComposite ) {
+				applyExtensions( extensions, meshData, modelXml );
 
-					var composite = new THREE.Group();
-					var components = object.components;
+				objects[ objectData.id ] = getBuild( meshData, objects, modelData, buildMesh );
 
-					// add meshes to composite object
+			} else {
 
-					for ( var j = 0; j < components.length; j ++ ) {
+				var compositeData = objectData[ 'components' ];
 
-						var component = components[ j ];
-						var mesh = objects[ component.objectId ].mesh.clone();
+				objects[ objectData.id ] = getBuild( compositeData, objects, modelData, buildComposite );
 
-						var transform = component.transform;
+			}
 
-						if ( transform ) {
+		}
 
-							mesh.applyMatrix( transform );
+		function buildObjects( data3mf ) {
 
-						}
+			var modelsData = data3mf.model;
+			var objects = {};
+			var modelsKeys = Object.keys( modelsData );
 
-						composite.add( mesh );
+			for ( var i = 0; i < modelsKeys.length; i ++ ) {
 
-					}
+				var modelsKey = modelsKeys[ i ];
+				var modelData = modelsData[ modelsKey ];
 
-					// transform composite if necessary
+				var objectIds = Object.keys( modelData[ 'resources' ][ 'object' ] );
 
-					var transform = buildItem[ 'transform' ];
+				for ( var j = 0; j < objectIds.length; j ++ ) {
 
-					if ( transform ) {
+					var objectId = objectIds[ j ];
 
-						composite.applyMatrix( transform );
+					buildObject( objectId, objects, modelData );
 
-					}
+				}
 
-					group.add( composite );
+			}
+
+			return objects;
+
+		}
+
+		function build( objects, refs, data3mf ) {
 
+			var group = new THREE.Group();
+			var buildData = data3mf.model[ refs[ 'target' ].substring( 1 ) ][ 'build' ];
 
-				} else {
+			for ( var i = 0; i < buildData.length; i ++ ) {
 
-					var mesh = object.mesh;
-					var transform = buildItem[ 'transform' ];
+				var buildItem = buildData[ i ];
+				var object3D = objects[ buildItem[ 'objectId' ] ];
 
-					if ( transform ) {
+				// apply transform
 
-						mesh.applyMatrix( transform );
+				var transform = buildItem[ 'transform' ];
 
-					}
+				if ( transform ) {
 
-					group.add( mesh );
+					object3D.applyMatrix( transform );
 
 				}
 
+				group.add( object3D );
+
 			}
 
 			return group;