Browse Source

Simplify FBXTree - remove empty fields

Lewy Blue 7 years ago
parent
commit
a8ef0ac6e8
1 changed files with 61 additions and 84 deletions
  1. 61 84
      examples/js/loaders/FBXLoader.js

+ 61 - 84
examples/js/loaders/FBXLoader.js

@@ -50,7 +50,10 @@
 
 				try {
 
-					var scene = self.parse( buffer, resourceDirectory );
+          console.time( 'p' );
+          var scene = self.parse( buffer, resourceDirectory );
+          console.timeEnd( 'p' );
+
 					onLoad( scene );
 
 				} catch ( error ) {
@@ -97,7 +100,7 @@
 
 			}
 
-			// console.log( FBXTree );
+			console.log( FBXTree );
 
 			var connections = parseConnections( FBXTree );
 			var images = parseImages( FBXTree );
@@ -639,16 +642,16 @@
 				index: i,
 				indices: [],
 				weights: [],
-				transform: new THREE.Matrix4().fromArray( subDeformerNode.subNodes.Transform.properties.a ),
-				transformLink: new THREE.Matrix4().fromArray( subDeformerNode.subNodes.TransformLink.properties.a ),
+				transform: new THREE.Matrix4().fromArray( subDeformerNode.subNodes.Transform.a ),
+				transformLink: new THREE.Matrix4().fromArray( subDeformerNode.subNodes.TransformLink.a ),
 				linkMode: subDeformerNode.properties.Mode,
 
 			};
 
 			if ( 'Indexes' in subDeformerNode.subNodes ) {
 
-				subDeformer.indices = subDeformerNode.subNodes.Indexes.properties.a;
-				subDeformer.weights = subDeformerNode.subNodes.Weights.properties.a;
+				subDeformer.indices = subDeformerNode.subNodes.Indexes.a;
+				subDeformer.weights = subDeformerNode.subNodes.Weights.a;
 
 			}
 
@@ -760,8 +763,8 @@
 
 		var subNodes = geometryNode.subNodes;
 
-		var vertexPositions = subNodes.Vertices.properties.a;
-		var vertexIndices = subNodes.PolygonVertexIndex.properties.a;
+		var vertexPositions = subNodes.Vertices.a;
+		var vertexIndices = subNodes.PolygonVertexIndex.a;
 
 		// create arrays to hold the final data used to build the buffergeometry
 		var vertexBuffer = [];
@@ -1212,17 +1215,17 @@
 
 		var mappingType = NormalNode.properties.MappingInformationType;
 		var referenceType = NormalNode.properties.ReferenceInformationType;
-		var buffer = NormalNode.subNodes.Normals.properties.a;
+		var buffer = NormalNode.subNodes.Normals.a;
 		var indexBuffer = [];
 		if ( referenceType === 'IndexToDirect' ) {
 
 			if ( 'NormalIndex' in NormalNode.subNodes ) {
 
-				indexBuffer = NormalNode.subNodes.NormalIndex.properties.a;
+				indexBuffer = NormalNode.subNodes.NormalIndex.a;
 
 			} else if ( 'NormalsIndex' in NormalNode.subNodes ) {
 
-				indexBuffer = NormalNode.subNodes.NormalsIndex.properties.a;
+				indexBuffer = NormalNode.subNodes.NormalsIndex.a;
 
 			}
 
@@ -1243,11 +1246,11 @@
 
 		var mappingType = UVNode.properties.MappingInformationType;
 		var referenceType = UVNode.properties.ReferenceInformationType;
-		var buffer = UVNode.subNodes.UV.properties.a;
+		var buffer = UVNode.subNodes.UV.a;
 		var indexBuffer = [];
 		if ( referenceType === 'IndexToDirect' ) {
 
-			indexBuffer = UVNode.subNodes.UVIndex.properties.a;
+			indexBuffer = UVNode.subNodes.UVIndex.a;
 
 		}
 
@@ -1266,11 +1269,11 @@
 
 		var mappingType = ColorNode.properties.MappingInformationType;
 		var referenceType = ColorNode.properties.ReferenceInformationType;
-		var buffer = ColorNode.subNodes.Colors.properties.a;
+		var buffer = ColorNode.subNodes.Colors.a;
 		var indexBuffer = [];
 		if ( referenceType === 'IndexToDirect' ) {
 
-			indexBuffer = ColorNode.subNodes.ColorIndex.properties.a;
+			indexBuffer = ColorNode.subNodes.ColorIndex.a;
 
 		}
 
@@ -1302,7 +1305,7 @@
 
 		}
 
-		var materialIndexBuffer = MaterialNode.subNodes.Materials.properties.a;
+		var materialIndexBuffer = MaterialNode.subNodes.Materials.a;
 
 		// Since materials are stored as indices, there's a bit of a mismatch between FBX and what
 		// we expect.So we create an intermediate buffer that points to the index in the buffer,
@@ -1439,9 +1442,9 @@
 
 		var degree = order - 1;
 
-		var knots = geometryNode.subNodes.KnotVector.properties.a;
+		var knots = geometryNode.subNodes.KnotVector.a;
 		var controlPoints = [];
-		var pointsValues = geometryNode.subNodes.Points.properties.a;
+		var pointsValues = geometryNode.subNodes.Points.a;
 
 		for ( var i = 0, l = pointsValues.length; i < l; i += 4 ) {
 
@@ -2049,14 +2052,14 @@
 
 						poseNodes.forEach( function ( node ) {
 
-							var rawMatWrd = new THREE.Matrix4().fromArray( node.subNodes.Matrix.properties.a );
+							var rawMatWrd = new THREE.Matrix4().fromArray( node.subNodes.Matrix.a );
 							worldMatrices.set( parseInt( node.properties.Node ), rawMatWrd );
 
 						} );
 
 					} else {
 
-						var rawMatWrd = new THREE.Matrix4().fromArray( poseNodes.subNodes.Matrix.properties.a );
+						var rawMatWrd = new THREE.Matrix4().fromArray( poseNodes.subNodes.Matrix.a );
 						worldMatrices.set( parseInt( poseNodes.properties.Node ), rawMatWrd );
 
 					}
@@ -2164,9 +2167,9 @@
 
 				};
 
-			}
+				curveNodesMap.set( curveNode.id, curveNode );
 
-			curveNodesMap.set( curveNode.id, curveNode );
+			}
 
 		}
 
@@ -2174,7 +2177,7 @@
 
 	}
 
-	// parse nodes in  FBXTree.Objects.subNodes.AnimationCurve and connect them up to
+	// parse nodes in FBXTree.Objects.subNodes.AnimationCurve and connect them up to
 	// previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated
 	// axis ( e.g. times and values of x rotation)
 	function parseAnimationCurves( FBXTree, connections, curveNodesMap ) {
@@ -2186,8 +2189,8 @@
 			var animationCurve = {
 
 				id: rawCurves[ nodeID ].id,
-				times: rawCurves[ nodeID ].subNodes.KeyTime.properties.a.map( convertFBXTimeToSeconds ),
-				values: rawCurves[ nodeID ].subNodes.KeyValueFloat.properties.a,
+				times: rawCurves[ nodeID ].subNodes.KeyTime.a.map( convertFBXTimeToSeconds ),
+				values: rawCurves[ nodeID ].subNodes.KeyValueFloat.a,
 
 			};
 
@@ -2614,7 +2617,7 @@
 
 				} else if ( matchEnd ) {
 
-					self.nodeEnd();
+					self.popStack();
 
 				} else if ( line.match( /^[^\s\t}]/ ) ) {
 
@@ -2640,8 +2643,10 @@
 
 			} );
 
-			var node = { 'name': nodeName, properties: {}, 'subNodes': {} };
+
+			var node = { name: nodeName, properties: {}, subNodes: {} };
 			var attrs = this.parseNodeAttr( nodeAttrs );
+
 			var currentNode = this.getCurrentNode();
 
 			// a top node
@@ -2687,7 +2692,7 @@
 					currentNode.subNodes[ nodeName ] = {};
 					currentNode.subNodes[ nodeName ][ attrs.id ] = node;
 
-				} else {
+				} else if ( nodeName !== 'Properties70' ) {
 
 					currentNode.subNodes[ nodeName ] = node;
 
@@ -2696,15 +2701,12 @@
 			}
 
 
-			// for this	↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
-			// NodeAttribute: 1001463072, "NodeAttribute::", "LimbNode" {
-			if ( nodeAttrs ) {
+			if ( typeof attrs.id === 'number' ) node.id = attrs.id;
+			if ( attrs.name !== '' ) node.attrName = attrs.name;
+			if ( attrs.type !== '' ) node.attrType = attrs.type;
+
 
-				node.id = attrs.id;
-				node.attrName = attrs.name;
-				node.attrType = attrs.type;
 
-			}
 
 			this.pushStack( node );
 
@@ -2809,27 +2811,18 @@
 			// already exists in properties, then append this
 			if ( propName in currentNode.properties ) {
 
+				// connections
 				if ( Array.isArray( currentNode.properties[ propName ] ) ) {
 
 					currentNode.properties[ propName ].push( propValue );
 
-				} else {
-
-					currentNode.properties[ propName ] += propValue;
-
-				}
+			  }
 
 			} else {
 
-				if ( Array.isArray( currentNode.properties[ propName ] ) ) {
-
-					currentNode.properties[ propName ].push( propValue );
-
-				} else {
 
-					currentNode.properties[ propName ] = propValue;
-
-				}
+				if ( propName !== 'a' ) currentNode.properties[ propName ] = propValue;
+				else currentNode.a = propValue;
 
 			}
 
@@ -2838,7 +2831,7 @@
 			// convert string to array, unless it ends in ',' in which case more will be added to it
 			if ( propName === 'a' && propValue.slice( - 1 ) !== ',' ) {
 
-				currentNode.properties.a = parseNumberArray( propValue );
+				currentNode.a = parseNumberArray( propValue );
 
 			}
 
@@ -2846,14 +2839,15 @@
 
 		parseNodePropertyContinued: function ( line ) {
 
-			this.currentProp[ this.currentPropName ] += line;
+			var currentNode = this.getCurrentNode();
+
+			currentNode.a += line;
 
 			// if the line doesn't end in ',' we have reached the end of the property value
 			// so convert the string to an array
 			if ( line.slice( - 1 ) !== ',' ) {
 
-				var currentNode = this.getCurrentNode();
-				currentNode.properties.a = parseNumberArray( currentNode.properties.a );
+				currentNode.a = parseNumberArray( currentNode.a );
 
 			}
 
@@ -2917,12 +2911,6 @@
 
 		},
 
-		nodeEnd: function () {
-
-			this.popStack();
-
-		},
-
 		isFlattenNode: function ( node ) {
 
 			return ( 'subNodes' in node && 'properties' in node ) ? true : false;
@@ -3037,7 +3025,7 @@
 
 						subNodes[ node.name ] = node;
 
-						node.properties.a = value;
+						node.a = value;
 
 					} else {
 
@@ -3056,7 +3044,8 @@
 
 					node.propertyList.forEach( function ( property, i ) {
 
-						array[ i - 1 ] = property;
+						// first Connection is FBX type (OO, OP, etc.). We'll discard these
+						if ( i !== 0 ) array.push( property );
 
 					} );
 
@@ -3143,7 +3132,7 @@
 
 				} else {
 
-					if ( node.id === '' ) {
+					if ( node.id === undefined ) {
 
 						if ( ! Array.isArray( subNodes[ node.name ] ) ) {
 
@@ -3153,24 +3142,9 @@
 
 						subNodes[ node.name ].push( node );
 
-					} else {
-
-						if ( subNodes[ node.name ][ node.id ] === undefined ) {
-
-							subNodes[ node.name ][ node.id ] = node;
-
-						} else {
-
-							// conflict id. irregular?
-							if ( ! Array.isArray( subNodes[ node.name ][ node.id ] ) ) {
-
-								subNodes[ node.name ][ node.id ] = [ subNodes[ node.name ][ node.id ] ];
-
-							}
-
-							subNodes[ node.name ][ node.id ].push( node );
+					} else if ( subNodes[ node.name ][ node.id ] === undefined ) {
 
-						}
+						subNodes[ node.name ][ node.id ] = node;
 
 					}
 
@@ -3178,19 +3152,22 @@
 
 			}
 
-			return {
+			var node = {
 
 				singleProperty: isSingleProperty,
-				id: id,
-				attrName: attrName,
-				attrType: attrType,
-				name: name,
-				properties: properties,
 				propertyList: propertyList, // raw property list used by parent
 				subNodes: subNodes
 
 			};
 
+			if ( Object.keys( properties ).length !== 0 ) node.properties = properties;
+			if ( typeof id === 'number' ) node.id = id;
+			if ( attrName !== '' ) node.attrName = attrName;
+			if ( attrType !== '' ) node.attrType = attrType;
+			if ( name !== '' ) node.name = name;
+
+			return node;
+
 		},
 
 		parseProperty: function ( reader ) {